JyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCicgIAonICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCicgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQonICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgonICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCicgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKJyAgIkxpY2Vuc2UiKScgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQonICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CicgIAonICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAonICAKJyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAonICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgonICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKJyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCicgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKJyAgdW5kZXIgdGhlIExpY2Vuc2UuCicgIAonICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKClN1YiBNYWluCgkJJyBPZWZmbmVuIGRlciBMT0ctRGF0ZWkKCQknIEVzIGdpYnQgMiBNb2VnbGljaGdrZWl0ZW4sIGRpZXNlbiBUZXN0IHp1IGFic29sdmllcmVuLgoJCScgMSkgQXVzZ2FiZSB2b24gSW5mb3JtYXRpb25lbiBpbiBNZXNzYWdlQm94ZW4KCQknIDIpIEF1c2dhYmUgdm9uIEluZm9ybWF0aW9uZW4gaW4gZWluZXIgTE9HLURhdGVpCgkJJwoJCScgRGllIE1ldGhvZGVuIE9wZW5MT0csIENsb3NlTE9HLCBNZXNzYWdlLCBFcnJvck1lc3NhZ2UgdW5kIEluZm9NZXNzYWdlIGJlcnVlY2tzaWNodGlnZW4gZGFzIGF1dG9tYXRpc2NoIQoJCScgWnVtIFVtc2NoYWx0ZW4gendpc2NoZW4gZGVuIGJlaWRlbiBadXN0YWVuZGVuIGdlbnVlZ3QgZXMsIGVpbmUgZGVyIGZvbGdlbmRlbgoJCScgendlaSBQcm9ncmFtbXplaWxlbiB6dSBha3RpdmllcmVuIC4uLgoKCQknYkxPR09uCT0gY09uCgkJYkxPR09uCT0gY09mZgoKCQknYlNob3dFcnJvcnNPbmx5CQk9IGNPbgoJCWJTaG93RXJyb3JzT25seQkJPSBjT2ZmCgoJCU9wZW5MT0cJCSggY1Rlc3RQYXRoICsgIlRlc3REb2N1bWVudFByb3BlcnRpZXMubG9nIiApCgkJSW5mb01lc3NhZ2UJKCAiVGVzdCBEb2N1bWVudFByb3BlcnRpZXMgLi4uIFtzdGFydF0iICkKCgkJJyBTZXJ2aWNlIGJlc29yZ2VuCgkJSW5mb01lc3NhZ2UgKCAiU2VydmljZSBiZXNvcmdlbiAuLi4gW3N0YXJ0XSIgKQoJCWFEb2N1bWVudFByb3BlcnRpZXMgPSBjcmVhdGVVbm9TZXJ2aWNlICggImNvbS5zdW4uc3Rhci5kb2N1bWVudC5Eb2N1bWVudFByb3BlcnRpZXMiICkKCgkJJyBFcmZvbGcgYWJ0ZXN0ZW4KCQlpZiAoIGlzbnVsbCAoIGFEb2N1bWVudFByb3BlcnRpZXMgKSApIHRoZW4KCQkJRXJyb3JNZXNzYWdlICggIlNlcnZpY2Uga29ubnRlIG5pY2h0IGluc3RhbnppaWVydCB3ZXJkZW4hIgkpCgkJCWV4aXQgc3ViCgkJZWxzZQoJCQlJbmZvTWVzc2FnZSAoICJTZXJ2aWNlIGVyZm9sZ3JlaWNoIGluc3RhbnppaWVydCAuLi4iCSkKCQkJSW5mb01lc3NhZ2UgKCAiU2VydmljZSBiZXNvcmdlbiAuLi4gW2VuZGVdIgkJCQkpCgkJZW5kIGlmCgoJCScgVW50ZXJzdHVldHp0ZSBTY2huaXR0c3RlbGxlbiwgTWV0aG9kZW4gdW5kIFByb3BlcnRpZXMgYW56ZWlnZW4KCQknIEFjaHR1bmc6IE1ldGhvZGVuIHVuZCBQcm9wZXJ0aWVzIGtvZW5uZW4gbmljaHQgYW5nZXplaWd0IHdlcmRlbiAuLi4KCQknIG5ldWVzIFVubyA8LT4gQmFzaWMgIT8KCQltc2dib3gJYURvY3VtZW50UHJvcGVydGllcy5kYmdfc3VwcG9ydGVkSW50ZXJmYWNlcwoJCSdtc2dib3gJYURvY3VtZW50UHJvcGVydGllcy5kYmdfbWV0aG9kcwoJCSdtc2dib3gJYURvY3VtZW50UHJvcGVydGllcy5kYmdfcHJvcGVydGllcwoKCQknIFRlc3RlbiBkZXMgU2VydmljZXMgdW50ZXIgbm9ybWFsZW4gQmVkaW5ndW5nZW4gKGFsc28gd2llIHZvcmdlc2VoZW4pCgkJYlN0YXRlID0gVGVzdF9Ob3JtYWxVc2UJKCBhRG9jdW1lbnRQcm9wZXJ0aWVzICkKCQknIEZlaGxlcnN0YXR1cyBhYmZyYWdlbgoJCWlmICggYlN0YXRlID0gY0Vycm9yICkgdGhlbgoJCQlFcnJvck1lc3NhZ2UgKCAiRGVyIFNlcnZpY2UgYXJiZWl0ZXQgdW50ZXIgbm9ybWFsZW4gQmVkaW5ndW5nZW4gbmljaHQga29ycmVrdCEiICkKCQllbmQgaWYKCgkJYlN0YXRlID0gVGVzdF9FcnJvclVzZQkoIGFEb2N1bWVudFByb3BlcnRpZXMgKQoJCScgRmVobGVyc3RhdHVzIGFiZnJhZ2VuCgkJaWYgKCBiU3RhdGUgPSBjRXJyb3IgKSB0aGVuCgkJCUVycm9yTWVzc2FnZSAoICJEZXIgU2VydmljZSB2ZXJoYWVsdCBzaWNoIGluIEZlaGxlcnNpdHVhdGlvbmVuIG5pY2h0IGtvcnJla3QhIiApCgkJZW5kIGlmCgoJCScgU2NobGllc3NlbiBkZXIgRXJyb3ItTG9nZGF0ZWkKCQlJbmZvTWVzc2FnZSAoICJUZXN0IERvY3VtZW50UHJvcGVydGllcyAuLi4gW2VuZGVdIiApCgkJQ2xvc2VMT0cKRW5kIFN1YgoKJyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCicgVGVzdGZ1bmt0aW9uZW4KJyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQonIFRlc3RtZXRob2RlOiBUZXN0ZXQgZGVuIFNlcnZpY2UgdW50ZXIgbm9ybWFsZW4gQmVkaW5ndW5nZW4KJwonIFJldHVybndlcnQgY09LIGJlZGV1dGV0LCBkYXNzIHNpY2ggZGFzIE9iamVrdCBub3JtYWwgdmVyaGFlbHQgLi4uCicgUmV0dXJud2VydCBjRXJyb3IgYmVkZXV0ZXQsIGRhc3Mgc2ljaCBkYXMgZWluIEZlaGxlciBhdWZnZXRyZXRlbiBpc3QgLi4uCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkZ1bmN0aW9uIFRlc3RfTm9ybWFsVXNlICggYURvY3VtZW50UHJvcGVydGllcyApIGFzIEJvb2xlYW4KCgkJJyBadW5hZWNoc3Qgd2lyZCB2b20gRXJmb2xnIGRlcyBUZXN0IGF1c2dlZ2FuZ2VuLgoJCScgU29sbHRlIGVpbmVyIGRlciBEZXRhaWwtVGVzdHMgZmVobHNjaGxhZ2VuLCBkYW5uIHdpcmQgZGllc2VyIFdlcnQKCQknIHp1cnVlY2tnZXNldHp0LiBEYW1pdCB3aXJkIGRhbm4gYW5nZXplaWd0LCBkYXNzIG1pbmRlc3RlbnMgZWluCgkJJyBFaW56ZWx0ZXN0IG5pY2h0IGtvcnJla3QgZnVua3Rpb25pZXJ0ZS4KCgkJVGVzdF9Ob3JtYWxVc2UgPSBjT0sKCgkJYlN0YXRlID0gVGVzdF9Ob3JtYWxVc2VfWFByb3BlcnR5U2V0CSggYURvY3VtZW50UHJvcGVydGllcyApCgkJaWYgKCBiU3RhdGUgPSBjRXJyb3IgKSB0aGVuCgkJCVRlc3RfTm9ybWFsVXNlID0gY0Vycm9yCgkJZW5kIGlmCgoJCWJTdGF0ZSA9IFRlc3RfTm9ybWFsVXNlX1hOYW1lQ29udGFpbmVyCSggYURvY3VtZW50UHJvcGVydGllcyApCgkJaWYgKCBiU3RhdGUgPSBjRXJyb3IgKSB0aGVuCgkJCVRlc3RfTm9ybWFsVXNlID0gY0Vycm9yCgkJZW5kIGlmCgoJCWJTdGF0ZSA9IFRlc3RfTm9ybWFsVXNlX1hQZXJzaXN0CQkoIGFEb2N1bWVudFByb3BlcnRpZXMgKQoJCWlmICggYlN0YXRlID0gY0Vycm9yICkgdGhlbgoJCQlUZXN0X05vcm1hbFVzZSA9IGNFcnJvcgoJCWVuZCBpZgoKRW5kIEZ1bmN0aW9uCgonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQonIFRlc3RtZXRob2RlOiBUZXN0ZXQgZGVuIFNlcnZpY2UgdW50ZXIgUmFuZGJlZGluZ3VuZ2VuIHVuZCBwcm92b3ppZXJ0IEZlaGxlcnp1c3RhZW5kZQonCicgUmV0dXJud2VydCBjT0sgYmVkZXV0ZXQsIGRhc3MgZGFzIE9iamVrdCBkYW1pdCBrZWluZSBQcm9ibGVtZSBoYXQgLi4uCicgUmV0dXJud2VydCBjRXJyb3IgYmVkZXV0ZXQsIGRhc3MgZGFzIE9iamVrdCBub2NoIG5pY2h0IHJvYnVzdCBnZW51ZyBpc3QgLi4uCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkZ1bmN0aW9uIFRlc3RfRXJyb3JVc2UgKCBhRG9jdW1lbnRQcm9wZXJ0aWVzICkgYXMgQm9vbGVhbgoKCQlUZXN0X0Vycm9yVXNlID0gY09LCgpFbmQgRnVuY3Rpb24KCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCicgVGVzdG1ldGhvZGU6IFRlc3RlbiBkZXMgdW50ZXJzdHVldHp0ZW4gSW50ZXJmYWNlcyAiWFByb3BlcnR5U2V0IiB1bnRlciBub3JtYWxlbiBCZWRpbmd1bmdlbgonCicgUmV0dXJud2VydCA9IGNPSwkJOyB3ZW5uIGRlciBUZXN0IGVyZm9sZ3JlaWNoIHdhcgonIFJldHVybndlcnQgPSBjRXJyb3IJOyB3ZW5uIHNpY2ggZGFzIE9iamVrdCBuaWNodCBrb3JyZWt0IHZlcmhhbHRlbiBoYXQKJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KRnVuY3Rpb24gVGVzdF9Ob3JtYWxVc2VfWFByb3BlcnR5U2V0ICggYURvY3VtZW50UHJvcGVydGllcyApIGFzIEJvb2xlYW4KCgkJJyBFaW5zY2hhbHRlbiBkZXIgRmVobGVyYmVoYW5kbHVuZywgdW0gRXhjZXB0aW9ucyBvZGVyIGFlaG5saWNoZXMgYWJ6dWZhbmdlbiEKCQlvbiBFcnJvciBnb3RvIFRlc3RfTm9ybWFsVXNlX1hQcm9wZXJ0eVNldF9FcnJvcgoKCQlJbmZvTWVzc2FnZSAoICJUZXN0X05vcm1hbFVzZV9YUHJvcGVydHlTZXQgLi4uIFtzdGFydF0iICkKCgkJJyAxKSBUZXN0IGRlciBGdW5rdGlvbiAiZ2V0UHJvcGVydHlTZXRJbmZvKCkiCgkJJwkJRGEgZGllc2UgRnVua3Rpb24ga2VpbmUgUGFyYW1ldGVyIGJlc2l0enQgdW5kIHp1ZGVtIGVpbmUgImdldCItTWV0aG9kZQoJCScJCWRhcnN0ZWxsdCwgd2lyZCBzaWUgZHVyY2ggQmFzaWMgYXV0b21hdGlzY2ggYWxzICJQcm9wZXJ0eSIgYmVoYW5kZWx0IQoJCScJCURhaGVyIHNjaHJlaWJ0IG1hbiBuaWNodCAiZ2V0UHJvcGVydHlTZXRJbmZvKCkiIHNvbmRlcm4gbnVyICJQcm9wZXJ0eVNldEluZm8iLgoKCQknIEJlc29yZ2VuIGRlciBJbmZvCgkJUHJvcGVydHlTZXRJbmZvID0gYURvY3VtZW50UHJvcGVydGllcy5Qcm9wZXJ0eVNldEluZm8KCQknIFVuZCBhYnRlc3RlbiBhdWYgR3VlbHRpZ2tlaXQKCQlpZiAoIGlzbnVsbCAoUHJvcGVydHlTZXRJbmZvKSApIHRoZW4KCQkJRXJyb3JNZXNzYWdlICggImdldFByb3BlcnR5U2V0SW5mbygpIC4uLiBFcnJvciAoS2VpbmUgSW5mbyBiZXN0aW1tYmFyISkiICkKCQkJZ290byBUZXN0X05vcm1hbFVzZV9YUHJvcGVydHlTZXRfRXJyb3IKCQllbmQgaWYKCgkJJyBIaWVyIGZlaGx0IG5vY2ggZGVyIFRlc3QgZGVyIEluZm9TdHJ1a3R1ciEgKExhZXNzdCBzaWNoIHVudGVyIEJhc2ljIGlyZ2VuZHdpZSBOSUNIVCB0ZXN0ZW4hISE/Pz8pCgkJJyAuLi4KCgkJSW5mb01lc3NhZ2UgKCAiZ2V0UHJvcGVydHlTZXRJbmZvKCkgLi4uIE9LIiApCgoJCScgMikgZ2V0UHJvcGVydHlWYWx1ZSgpICYgc2V0UHJvcGVydHlWYWx1ZSAoKQoJCScJCUluIGRpZXNlbSBTZXJ2aWNlIHNpbmQgbWVocmVyZSBQcm9wZXJ0aWVzIGJlcmVpdHMgZGVmaW5pZXJ0IHVuZCB2b3JiZWxlZ3QuCgkJJwkJWnVtIFRlc3Qgd2VyZGVuIHJlcHJhZXNlbnRhdGl2IGVpbmlnZSBkYXZvbiB2ZXJ3ZW5kZXQuIE5hZW1saWNoIGplIGVpbmUKCQknCQlkZXIgdmVyc2NoaWVkZW5lbiBEYXRlbnR5cGVuIQoJCScJCURhcyBzaW5kIGltIGZvbGdlbmRlbjoJCU9XU3RyaW5nLCBzYWxfQm9vbCwgc2FsX0ludDE2LCBzYWxfdUludDE2LCBzYWxfSW50MzIsIERhdGVUaW1lLCBTZXF1ZW5jZTwgc2FsX0ludDggPgoJCScJCQkJCQkJCQlBY2h0dW5nISBzYWxfdUludDE2IGthbm4gaW4gQmFzaWMgc28gbmljaHQgZGFyZ2VzdGVsbHQgd2VyZGVuLiBEYWhlciB3aXJkIGVpbiBub3JtYWxlcgoJCScJCQkJCQkJCQlJbnRlZ2VyLVdlcnQgYW5nZW5vbW1lbiAtIEJlZGluZ3VuZyBpc3QsIGRhcyBoaWVyIGltIFRlc3QgZGVyIFdlcnRlYmVyZWljaCBuaWNodAoJCScJCQkJCQkJCQl1ZWJlcnNjaHJpdHRlbiB3aXJkIQoJCScJCUVzIHdpcmQgdmVyc3VjaHQgZGVuIFN0YW5kYXJkd2VydCBkaWVzZXIgenUgZXJtaXR0ZWxuIHVuZCB6dSBtZXJrZW47CgkJJwkJZGFubiBlaW5lbiBuZXVlbiBXZXJ0IHp1IHNldHplbjsgc293aWUgZGllc2VuIHdpZWRlcnVtIHp1IGxlc2VuIHVuZCBtaXQgZGVuCgkJJwkJdm9yaGVyaWdlbiBXZXJ0ZW4genUgdmVyZ2xlaWNoZW4hCgoJCScgWnVuYWVjaHN0IHdlcmRlbiBkaWUgU3RhbmRhcmR3ZXJ0ZSBkaWVzZXIgUHJvcGVydGllcyBiZXNvcmd0IC4uLgoJCXNEZWZhdWx0VmFsdWVfT1dTdHJpbmckCQk9IGFEb2N1bWVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHlWYWx1ZSAoICJBdXRob3IiCQkJKQoJCWJEZWZhdWx0VmFsdWVfc2FsX0Jvb2wJCT0gYURvY3VtZW50UHJvcGVydGllcy5nZXRQcm9wZXJ0eVZhbHVlICggIkF1dG9sb2FkRW5hYmxlZCIJKQoJCW5EZWZhdWx0VmFsdWVfc2FsX0ludDE2JQk9IGFEb2N1bWVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHlWYWx1ZSAoICJFZGl0aW5nQ3ljbGVzIgkpCgkJbkRlZmF1bHRWYWx1ZV9zYWxfdUludDE2JQk9IGFEb2N1bWVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHlWYWx1ZSAoICJQcmlvcml0eSIJCQkpCgkJbkRlZmF1bHRWYWx1ZV9zYWxfSW50MzImCT0gYURvY3VtZW50UHJvcGVydGllcy5nZXRQcm9wZXJ0eVZhbHVlICggIkVkaXRpbmdEdXJhdGlvbiIJKQoJCWFEZWZhdWx0VmFsdWVfRGF0ZVRpbWUJCT0gYURvY3VtZW50UHJvcGVydGllcy5nZXRQcm9wZXJ0eVZhbHVlICggIk1vZGlmeURhdGUiCQkpCicJCWFEZWZhdWx0VmFsdWVfQnl0ZVNlcXVlbmNlCT0gYURvY3VtZW50UHJvcGVydGllcy5nZXRQcm9wZXJ0eVZhbHVlICggIkV4dHJhRGF0YSIJCSkKCQlhRGVmYXVsdFZhbHVlX0J5dGVTZXF1ZW5jZQk9IGFEb2N1bWVudFByb3BlcnRpZXMuRXh0cmFEYXRhCgoJCScgLi4uIGRhbm4gZGllIFdlcnRlIHp1ciBLb250cm9sbGUgYXVzZ2ViZW4uCgkJU2hvd1Byb3BlcnRpZXMgKCBhRG9jdW1lbnRQcm9wZXJ0aWVzICkKCgkJSW5mb01lc3NhZ2UgKCAiZ2V0UHJvcGVydHlWYWx1ZSgpIC4uLiBPSyIgKQoKCQknIEpldHp0IHdlcmRlbiBuZXVlIFdlcnRlIHZlcmVpbmJhcnQgLi4uCgkJJyBEaWVzZSB3ZXJkZW4gc28gZ2V3YWVobHQsIGRhcyBzaWUgZ2FyYW50aWVydCB2b24gZGVuIFN0YW5kYXJkd2VydGVuIHZlcnNjaGllZGVuIHNpbmQhCgkJJyBEYXp1IHdlcmRlbiBkaWUgYWx0ZW4gYXVmIFdlcnQgYWJnZWZyYWd0IHVuZCBlbnRzcHJlY2hlbmQgZGllIG5ldWVuIGdlc2V0enQuCgkJc05ld1ZhbHVlX09XU3RyaW5nJAkJPSBzRGVmYXVsdFZhbHVlX09XU3RyaW5nJAkrICJOZXVlcldlcnQiCgkJYk5ld1ZhbHVlX3NhbF9Cb29sCQk9IG5vdCBiRGVmYXVsdFZhbHVlX3NhbF9Cb29sCgkJbk5ld1ZhbHVlX3NhbF9JbnQxNiUJPSBuRGVmYXVsdFZhbHVlX3NhbF9JbnQxNiUJKyAxCgkJaWYgKCBuRGVmYXVsdFZhbHVlX3NhbF91SW50MTYlID0gMSApIHRoZW4KCQkJbk5ld1ZhbHVlX3NhbF91SW50MTYlID0gMgoJCWVsc2UKCQkJbk5ld1ZhbHVlX3NhbF91SW50MTYlID0gMQoJCWVuZCBpZgoJCW5OZXdWYWx1ZV9zYWxfSW50MzImCT0gbkRlZmF1bHRWYWx1ZV9zYWxfSW50MzImICArIDEKCgkJYU5ld1ZhbHVlX0RhdGVUaW1lCQkJCQk9IGFEZWZhdWx0VmFsdWVfRGF0ZVRpbWUKCQlhTmV3VmFsdWVfRGF0ZVRpbWUuSHVuZHJlZHRoU2Vjb25kcwk9IGFEZWZhdWx0VmFsdWVfRGF0ZVRpbWUuSHVuZHJlZHRoU2Vjb25kcwkrIDEKCQlhTmV3VmFsdWVfRGF0ZVRpbWUuU2Vjb25kcwkJCT0gYURlZmF1bHRWYWx1ZV9EYXRlVGltZS5TZWNvbmRzICAgICAgICAgCSsgMQoJCWFOZXdWYWx1ZV9EYXRlVGltZS5NaW51dGVzCQkJPSBhRGVmYXVsdFZhbHVlX0RhdGVUaW1lLk1pbnV0ZXMgICAgICAgICAJKyAxCgkJYU5ld1ZhbHVlX0RhdGVUaW1lLkhvdXJzCQkJPSBhRGVmYXVsdFZhbHVlX0RhdGVUaW1lLkhvdXJzICAgICAgICAgICAJKyAxCgkJYU5ld1ZhbHVlX0RhdGVUaW1lLkRheQkJCQk9IGFEZWZhdWx0VmFsdWVfRGF0ZVRpbWUuRGF5ICAgICAgICAgICAgIAkrIDEKCQlhTmV3VmFsdWVfRGF0ZVRpbWUuTW9udGgJCQk9IGFEZWZhdWx0VmFsdWVfRGF0ZVRpbWUuTW9udGggICAgICAgICAgIAkrIDEKCQlhTmV3VmFsdWVfRGF0ZVRpbWUuWWVhcgkJCQk9IGFEZWZhdWx0VmFsdWVfRGF0ZVRpbWUuWWVhciAgICAgICAgICAgIAkrIDEKCgkJYU5ld1ZhbHVlX0J5dGVTZXF1ZW5jZSA9IGFEZWZhdWx0VmFsdWVfQnl0ZVNlcXVlbmNlCgkJbkVsZW1lbnRDb3VudCUgPSBVQm91bmQgKCBhRGVmYXVsdFZhbHVlX0J5dGVTZXF1ZW5jZSApCicJCWZvciBuQ291bnRlciU9MCB0byBuRWxlbWVudENvdW50JSBzdGVwIDEKJwkJCWFOZXdWYWx1ZV9CeXRlU2VxdWVuY2UobkNvdW50ZXIlKSA9ICggYURlZmF1bHRWYWx1ZV9CeXRlU2VxdWVuY2UobkNvdW50ZXIlKSArIDEgKQonCQluZXh0IG5Db3VudGVyJQoKCQknIEFuc2NobGllc3NlbmQgbXVlc3NlbiBkaWVzZSBuZXVlbiBXZXJ0ZSBnZXNldHp0IHdlcmRlbi4KCQlhRG9jdW1lbnRQcm9wZXJ0aWVzLnNldFByb3BlcnR5VmFsdWUgKCAiQXV0aG9yIgkJCSwgc05ld1ZhbHVlX09XU3RyaW5nJAkJKQoJCWFEb2N1bWVudFByb3BlcnRpZXMuc2V0UHJvcGVydHlWYWx1ZSAoICJBdXRvbG9hZEVuYWJsZWQiLCBiTmV3VmFsdWVfc2FsX0Jvb2wJCSkKCQlhRG9jdW1lbnRQcm9wZXJ0aWVzLnNldFByb3BlcnR5VmFsdWUgKCAiRWRpdGluZ0N5Y2xlcyIJLCBuTmV3VmFsdWVfc2FsX0ludDE2JQkJKQoJCWFEb2N1bWVudFByb3BlcnRpZXMuc2V0UHJvcGVydHlWYWx1ZSAoICJQcmlvcml0eSIJCSwgbk5ld1ZhbHVlX3NhbF91SW50MTYlCQkpCgkJYURvY3VtZW50UHJvcGVydGllcy5zZXRQcm9wZXJ0eVZhbHVlICggIkVkaXRpbmdEdXJhdGlvbiIsIG5OZXdWYWx1ZV9zYWxfSW50MzImCQkpCgkJYURvY3VtZW50UHJvcGVydGllcy5zZXRQcm9wZXJ0eVZhbHVlICggIk1vZGlmeURhdGUiCQksIGFOZXdWYWx1ZV9EYXRlVGltZQkJKQonCQlhRG9jdW1lbnRQcm9wZXJ0aWVzLnNldFByb3BlcnR5VmFsdWUgKCAiRXh0cmFEYXRhIgkJLCBhTmV3VmFsdWVfQnl0ZVNlcXVlbmNlCSkKCQlhRG9jdW1lbnRQcm9wZXJ0aWVzLkV4dHJhRGF0YSA9IGFOZXdWYWx1ZV9CeXRlU2VxdWVuY2UKCgkJJyBEYW5uIGxhc3NlbiB3aXIgc2llIHVucyBhdXNnZWJlbiwgdW0gc2llIG1pdCBkZW4gdm9yaGVyaWdlbiB2ZXJnbGVpY2hlbiB6dSBrb2VubmVuLgoJCScgKERhcyBnZWh0IG5hdHVlcmxpY2ggbnVyLCB3ZW5uICJiTE9HT249Y09uIiBpc3QgLSBhbHNvIGVpbmUgTE9HLURhdGVpIGdlc2NocmllYmVuIHdpcmQhKQoJCVNob3dQcm9wZXJ0aWVzICggYURvY3VtZW50UHJvcGVydGllcyApCgoJCScgTnVuIHdlcmRlbiBkaWUgUHJvcGVydGllcyB3aWVkZXIgZ2VsZXNlbiAuLi4KCQlzTGFzdFZhbHVlX09XU3RyaW5nJAk9IGFEb2N1bWVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHlWYWx1ZSAoICJBdXRob3IiCQkJKQoJCWJMYXN0VmFsdWVfc2FsX0Jvb2wJCT0gYURvY3VtZW50UHJvcGVydGllcy5nZXRQcm9wZXJ0eVZhbHVlICggIkF1dG9sb2FkRW5hYmxlZCIJKQoJCW5MYXN0VmFsdWVfc2FsX0ludDE2JQk9IGFEb2N1bWVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHlWYWx1ZSAoICJFZGl0aW5nQ3ljbGVzIgkpCgkJbkxhc3RWYWx1ZV9zYWxfdUludDE2JQk9IGFEb2N1bWVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHlWYWx1ZSAoICJQcmlvcml0eSIJCQkpCgkJbkxhc3RWYWx1ZV9zYWxfSW50MzImCT0gYURvY3VtZW50UHJvcGVydGllcy5nZXRQcm9wZXJ0eVZhbHVlICggIkVkaXRpbmdEdXJhdGlvbiIJKQoJCWFMYXN0VmFsdWVfRGF0ZVRpbWUJCT0gYURvY3VtZW50UHJvcGVydGllcy5nZXRQcm9wZXJ0eVZhbHVlICggIk1vZGlmeURhdGUiCQkpCgkJYUxhc3RWYWx1ZV9CeXRlU2VxdWVuY2UJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzLmdldFByb3BlcnR5VmFsdWUgKCAiRXh0cmFEYXRhIgkJKQoKCQknIC4uLiB1bmQgbWl0IGRlbiB2b3JoZXIgYWxzIHp1IHNldHplbmQgYmVzdGltbXRlIFdlcnRlIHZlcmdsZWljaGVuIQoJCScgRXMgZHVlcmZlbiBLRUlORSBVbnRlcnNjaGllZGUgYXVmdHJldGVuLCBkYSBzb25zdCAic2V0UHJvcGVydHlWYWx1ZSgpIiBuaWNodCBrb3JyZWt0IGZ1bmt0aW9uaWVydCBoYXQhCgoJCWlmICggQ29tcGFyZU9XU3RyaW5nCQkJKCBzTmV3VmFsdWVfT1dTdHJpbmckLAkJc0xhc3RWYWx1ZV9PV1N0cmluZyQJKSA9IGNEaWZmZXJlbnQgKSB0aGVuCgkJCUVycm9yTWVzc2FnZQkoICJzZXRQcm9wZXJ0eVZhbHVlKCkgLi4uIEZlaGxlciBbT1dTdHJpbmcgZmVobGVyaGFmdF0iCQkpCgkJCWdvdG8gVGVzdF9Ob3JtYWxVc2VfWFByb3BlcnR5U2V0X0Vycm9yCgkJZWxzZWlmICggQ29tcGFyZUJvb2wJCQkoIGJOZXdWYWx1ZV9zYWxfQm9vbCwJCWJMYXN0VmFsdWVfc2FsX0Jvb2wJCSkgPSBjRGlmZmVyZW50ICkgdGhlbgoJCQlFcnJvck1lc3NhZ2UJKCAic2V0UHJvcGVydHlWYWx1ZSgpIC4uLiBGZWhsZXIgW3NhbF9Cb29sIGZlaGxlcmhhZnRdIgkJKQoJCQlnb3RvIFRlc3RfTm9ybWFsVXNlX1hQcm9wZXJ0eVNldF9FcnJvcgoJCWVsc2VpZiAoIENvbXBhcmVJbnQxNgkJCSggbk5ld1ZhbHVlX3NhbF9JbnQxNiUsCQluTGFzdFZhbHVlX3NhbF9JbnQxNiUJKSA9IGNEaWZmZXJlbnQgKSB0aGVuCgkJCUVycm9yTWVzc2FnZQkoICJzZXRQcm9wZXJ0eVZhbHVlKCkgLi4uIEZlaGxlciBbc2FsX0ludDE2IGZlaGxlcmhhZnRdIgkpCgkJCWdvdG8gVGVzdF9Ob3JtYWxVc2VfWFByb3BlcnR5U2V0X0Vycm9yCgkJZWxzZWlmICggQ29tcGFyZUludDE2CQkJKCBuTmV3VmFsdWVfc2FsX3VJbnQxNiUsCW5MYXN0VmFsdWVfc2FsX3VJbnQxNiUJKSA9IGNEaWZmZXJlbnQgKSB0aGVuCgkJCUVycm9yTWVzc2FnZQkoICJzZXRQcm9wZXJ0eVZhbHVlKCkgLi4uIEZlaGxlciBbc2FsX3VJbnQxNiBmZWhsZXJoYWZ0XSIJKQoJCQlnb3RvIFRlc3RfTm9ybWFsVXNlX1hQcm9wZXJ0eVNldF9FcnJvcgoJCWVsc2VpZiAoIENvbXBhcmVJbnQzMgkJCSggbk5ld1ZhbHVlX3NhbF9JbnQzMiYsCQluTGFzdFZhbHVlX3NhbF9JbnQzMiYJKSA9IGNEaWZmZXJlbnQgKSB0aGVuCgkJCUVycm9yTWVzc2FnZQkoICJzZXRQcm9wZXJ0eVZhbHVlKCkgLi4uIEZlaGxlciBbc2FsX0ludDMyIGZlaGxlcmhhZnRdIgkpCgkJCWdvdG8gVGVzdF9Ob3JtYWxVc2VfWFByb3BlcnR5U2V0X0Vycm9yCgkJZWxzZWlmICggQ29tcGFyZURhdGVUaW1lCQkoIGFOZXdWYWx1ZV9EYXRlVGltZSwJCWFMYXN0VmFsdWVfRGF0ZVRpbWUJCSkgPSBjRGlmZmVyZW50ICkgdGhlbgoJCQlFcnJvck1lc3NhZ2UJKCAic2V0UHJvcGVydHlWYWx1ZSgpIC4uLiBGZWhsZXIgW0RhdGVUaW1lIGZlaGxlcmhhZnRdIgkJKQoJCQlnb3RvIFRlc3RfTm9ybWFsVXNlX1hQcm9wZXJ0eVNldF9FcnJvcgoJCWVsc2VpZiAoIENvbXBhcmVCeXRlU2VxdWVuY2UJKCBhTmV3VmFsdWVfQnl0ZVNlcXVlbmNlLAlhTGFzdFZhbHVlX0J5dGVTZXF1ZW5jZQkpID0gY0RpZmZlcmVudCApIHRoZW4KCQkJRXJyb3JNZXNzYWdlCSggInNldFByb3BlcnR5VmFsdWUoKSAuLi4gRmVobGVyIFtCeXRlU2VxdWVuY2UgZmVobGVyaGFmdF0iCSkKCQkJZ290byBUZXN0X05vcm1hbFVzZV9YUHJvcGVydHlTZXRfRXJyb3IKCQllbmQgaWYKCgkJSW5mb01lc3NhZ2UgKCAic2V0UHJvcGVydHlWYWx1ZSgpIC4uLiBPSyIgKQoKCQknIE51biB3aXJkIG5vY2ggbWl0IGRlbiB6dWVyc3QgZXJtaXR0ZWx0ZW4gRGVmYXVsdC1XZXJ0ZW4gdmVyZ2xpY2hlbiEKCQknIEhpZXIgTVVFU1NFTiBVbnRlcnNjaGllZGUgYXVmdHJldGVuLCBkYSBzb25zdCAiZ2V0LSIgVU5EICJzZXRQcm9wZXJ0eVZhbHVlKCkiIG5pY2h0IGtvcnJla3QgZnVua3Rpb25pZXJ0IGhhYmVuIQoKCQlpZiAoIENvbXBhcmVPV1N0cmluZwkJCSggc0RlZmF1bHRWYWx1ZV9PV1N0cmluZyQsCQlzTGFzdFZhbHVlX09XU3RyaW5nJAkpID0gY0VxdWFsICkgdGhlbgoJCQlFcnJvck1lc3NhZ2UJKCAiWnVzYW1tZW5zcGllbCBzZXQgJiBnZXRQcm9wZXJ0eVZhbHVlKCkgLi4uIEZlaGxlciBbT1dTdHJpbmcgZmVobGVyaGFmdF0iCQkpCgkJCWdvdG8gVGVzdF9Ob3JtYWxVc2VfWFByb3BlcnR5U2V0X0Vycm9yCgkJZWxzZWlmICggQ29tcGFyZUJvb2wJCQkoIGJEZWZhdWx0VmFsdWVfc2FsX0Jvb2wsCQliTGFzdFZhbHVlX3NhbF9Cb29sCQkpID0gY0VxdWFsICkgdGhlbgoJCQlFcnJvck1lc3NhZ2UJKCAiWnVzYW1tZW5zcGllbCBzZXQgJiBnZXRQcm9wZXJ0eVZhbHVlKCkgLi4uIEZlaGxlciBbc2FsX0Jvb2wgZmVobGVyaGFmdF0iCQkpCgkJCWdvdG8gVGVzdF9Ob3JtYWxVc2VfWFByb3BlcnR5U2V0X0Vycm9yCgkJZWxzZWlmICggQ29tcGFyZUludDE2CQkJKCBuRGVmYXVsdFZhbHVlX3NhbF9JbnQxNiUsCQluTGFzdFZhbHVlX3NhbF9JbnQxNiUJKSA9IGNFcXVhbCApIHRoZW4KCQkJRXJyb3JNZXNzYWdlCSggIlp1c2FtbWVuc3BpZWwgc2V0ICYgZ2V0UHJvcGVydHlWYWx1ZSgpIC4uLiBGZWhsZXIgW3NhbF9JbnQxNiBmZWhsZXJoYWZ0XSIJKQoJCQlnb3RvIFRlc3RfTm9ybWFsVXNlX1hQcm9wZXJ0eVNldF9FcnJvcgoJCWVsc2VpZiAoIENvbXBhcmVJbnQxNgkJCSggbkRlZmF1bHRWYWx1ZV9zYWxfdUludDE2JSwJbkxhc3RWYWx1ZV9zYWxfdUludDE2JQkpID0gY0VxdWFsICkgdGhlbgoJCQlFcnJvck1lc3NhZ2UJKCAiWnVzYW1tZW5zcGllbCBzZXQgJiBnZXRQcm9wZXJ0eVZhbHVlKCkgLi4uIEZlaGxlciBbc2FsX3VJbnQxNiBmZWhsZXJoYWZ0XSIJKQoJCQlnb3RvIFRlc3RfTm9ybWFsVXNlX1hQcm9wZXJ0eVNldF9FcnJvcgoJCWVsc2VpZiAoIENvbXBhcmVJbnQzMgkJCSggbkRlZmF1bHRWYWx1ZV9zYWxfSW50MzImLAkJbkxhc3RWYWx1ZV9zYWxfSW50MzImCSkgPSBjRXF1YWwgKSB0aGVuCgkJCUVycm9yTWVzc2FnZQkoICJadXNhbW1lbnNwaWVsIHNldCAmIGdldFByb3BlcnR5VmFsdWUoKSAuLi4gRmVobGVyIFtzYWxfSW50MzIgZmVobGVyaGFmdF0iCSkKCQkJZ290byBUZXN0X05vcm1hbFVzZV9YUHJvcGVydHlTZXRfRXJyb3IKCQllbHNlaWYgKCBDb21wYXJlRGF0ZVRpbWUJCSggYURlZmF1bHRWYWx1ZV9EYXRlVGltZSwJCWFMYXN0VmFsdWVfRGF0ZVRpbWUJCSkgPSBjRXF1YWwgKSB0aGVuCgkJCUVycm9yTWVzc2FnZQkoICJadXNhbW1lbnNwaWVsIHNldCAmIGdldFByb3BlcnR5VmFsdWUoKSAuLi4gRmVobGVyIFtEYXRlVGltZSBmZWhsZXJoYWZ0XSIJCSkKCQkJZ290byBUZXN0X05vcm1hbFVzZV9YUHJvcGVydHlTZXRfRXJyb3IKJwkJZWxzZWlmICggQ29tcGFyZUJ5dGVTZXF1ZW5jZQkoIGFEZWZhdWx0VmFsdWVfQnl0ZVNlcXVlbmNlLAlhTGFzdFZhbHVlX0J5dGVTZXF1ZW5jZQkpID0gY0VxdWFsICkgdGhlbgonCQkJRXJyb3JNZXNzYWdlCSggIlp1c2FtbWVuc3BpZWwgc2V0ICYgZ2V0UHJvcGVydHlWYWx1ZSgpIC4uLiBGZWhsZXIgW0J5dGVTZXF1ZW5jZSBmZWhsZXJoYWZ0XSIJKQonCQkJZ290byBUZXN0X05vcm1hbFVzZV9YUHJvcGVydHlTZXRfRXJyb3IKCQllbmQgaWYKCgkJSW5mb01lc3NhZ2UgKCAiWnVzYW1tZW5zcGllbCBzZXQgJiBnZXRQcm9wZXJ0eVZhbHVlKCkgLi4uIE9LIiApCgoJCScgRGVyIFRlc3Qgd2FyIGVyZm9sZ3JlaWNoISBNZWxkdW5nIGF1c2dlYmVuIHVuZCB6dXJ1ZWNrIHptIEF1ZnJ1ZmVyLgoJCScgQXVzc2NoYWx0ZW4gZGVyIEZlaGxlcmJlaGFuZGx1bmcKCQlvbiBFcnJvciBnb3RvIDAKCQknIE1lbGR1bmcgYXVzZ2ViZW4KCQlJbmZvTWVzc2FnZSAoICJUZXN0X05vcm1hbFVzZV9YUHJvcGVydHlTZXQgLi4uIFtlbmRlXSIgKQoJCScgU3RhdHVzIHNldHplbgoJCVRlc3RfTm9ybWFsVXNlX1hQcm9wZXJ0eVNldCA9IGNPSwoJCScgVW5kIEZ1bmt0aW9uIGJlZW5kZW4KCQlFeGl0IEZ1bmN0aW9uCgonIEVzIGlzdCBlaW4gdW5lcndhcnRldGUgRmVobGVyIGF1ZmdldHJldGVuISAoRXhjZXB0aW9uIC4uLikKJyBNZWxkdW5nIGF1c2dlYmVuIHVuZCBtaXQgRmVobGVyIHp1cnVlY2trZWhyZW4uClRlc3RfTm9ybWFsVXNlX1hQcm9wZXJ0eVNldF9FcnJvcjoKCQknIEF1c3NjaGFsdGVuIGRlciBGZWhsZXJiZWhhbmRsdW5nCgkJb24gRXJyb3IgZ290byAwCgkJJyBNZWxkdW5nIGF1c2dlYmVuCgkJRXJyb3JNZXNzYWdlICggIlRlc3RfTm9ybWFsVXNlX1hQcm9wZXJ0eVNldCAuLi4gW0Vycm9yXSIgKQoJCScgdW5kIEZlaGxlcnN0YXR1cyBzZXR6ZW4KCQlUZXN0X05vcm1hbFVzZV9YUHJvcGVydHlTZXQgPSBjRXJyb3IKCQknIEFiYnJ1Y2ggZGVyIEZ1bmt0aW9uIGVyendpbmdlbiEKCQlFeGl0IEZ1bmN0aW9uCgpFbmQgRnVuY3Rpb24KCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCicgVGVzdG1ldGhvZGU6IFRlc3RlbiBkZXMgdW50ZXJzdHVldHp0ZW4gSW50ZXJmYWNlcyAiWE5hbWVDb250YWluZXIiIHVudGVyIG5vcm1hbGVuIEJlZGluZ3VuZ2VuCicKJyBSZXR1cm53ZXJ0ID0gY09LCQk7IHdlbm4gc2ljaCBkYXMgT2JqZWt0IGtvcnJla3QgdmVyaGFsdGVuIGhhdAonIFJldHVybndlcnQgPSBjRXJyb3IJOyB3ZW5uIGRhcyBPYmpla3Qgbm9jaCBuaWNodCByb2J1c3QgZ2VudWcgaXN0CictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkZ1bmN0aW9uIFRlc3RfTm9ybWFsVXNlX1hOYW1lQ29udGFpbmVyICggYURvY3VtZW50UHJvcGVydGllcyApIGFzIEJvb2xlYW4KCgkJJyBFaW5zY2hhbHRlbiBkZXIgRmVobGVyYmVoYW5kbHVuZywgdW0gRXhjZXB0aW9ucyBvZGVyIGFlaG5saWNoZXMgYWJ6dWZhbmdlbiEKCQlvbiBFcnJvciBnb3RvIFRlc3RfTm9ybWFsVXNlX1hOYW1lQ29udGFpbmVyX0Vycm9yCgoJCUluZm9NZXNzYWdlICggIlRlc3RfTm9ybWFsVXNlX1hOYW1lQ29udGFpbmVyIC4uLiBbc3RhcnRdIiApCgoJCScgRGEgZGFzIEluaXRpYWxpc2llcmVuIGltIEtvbnN0cnVrdG9yIGRlcyBPYmpla3RlcyB1bmQgZGFzIEF1ZnJhZXVtZW4gaW0gRGVzdHJ1a3RvcgoJCScgYXV0b21hdGlzY2ggZ2VzY2hpZWh0IHVuZCBkaWVzZSBNZXRob2RlIHBybyBQcm9ncmFtbWFibGF1ZiBudXIgZWlubWFsIHZlcndlbmRldCB3aXJkLAoJCScgZGFyZiBzaWNoIGtlaW4gRWxlbWVudCBzY2hvbiBpbSBOYW1lQ29udGFpbmVyIGJlZmluZGVuIQoJCScgV2VubiBkb2NoLCBpc3QgZGFzIGVpbiBGZWhsZXIhCgkJaWYgKCBhRG9jdW1lbnRQcm9wZXJ0aWVzLmhhc0VsZW1lbnRzICgpID0gVFJVRSApIHRoZW4KCQkJRXJyb3JNZXNzYWdlICggIkRlciBOYW1lQ29uYXRpbmVyIHNvbGx0ZSBlaWdlbnRsaWNoIGxlZXIgc2VpbiwgZW50aGFlbHQgaW5pdGlhbCBhYmVyIHNjaG9uIEVsZW1lbnRlIT8iICkKCQkJZ290byBUZXN0X05vcm1hbFVzZV9YTmFtZUNvbnRhaW5lcl9FcnJvcgoJCWVuZCBpZgoKCQknIFp1bmFlY2hzdCB3ZXJkZW4gbWVocmVyZSBFbGVtZW50ZSBpbiBkZW4gTmFtZUNvbnRhaW5lciBlaW5nZWZ1ZWd0LgoJCXNJdGVtTmFtZV8xJAk9ICJJdGVtIDEiCgkJc0l0ZW1OYW1lXzIkCT0gIkl0ZW0gMiIKCQlzSXRlbU5hbWVfMyQJPSAiSXRlbSAzIgoJCXNJdGVtTmFtZV80JAk9ICJJdGVtIDQiCgkJc0l0ZW1OYW1lXzUkCT0gIkl0ZW0gNSIKCgkJc0ZpcnN0VmFsdWVfMSQJPSAiVmFsdWUgMSIKCQlzRmlyc3RWYWx1ZV8yJAk9ICJWYWx1ZSAyIgoJCXNGaXJzdFZhbHVlXzMkCT0gIlZhbHVlIDMiCgkJc0ZpcnN0VmFsdWVfNCQJPSAiVmFsdWUgNCIKCQlzRmlyc3RWYWx1ZV81JAk9ICJWYWx1ZSA1IgoKCQlhRG9jdW1lbnRQcm9wZXJ0aWVzLmluc2VydEJ5TmFtZSAoIHNJdGVtTmFtZV8xJCwgc0ZpcnN0VmFsdWVfMSQgKQoJCWFEb2N1bWVudFByb3BlcnRpZXMuaW5zZXJ0QnlOYW1lICggc0l0ZW1OYW1lXzIkLCBzRmlyc3RWYWx1ZV8yJCApCgkJYURvY3VtZW50UHJvcGVydGllcy5pbnNlcnRCeU5hbWUgKCBzSXRlbU5hbWVfMyQsIHNGaXJzdFZhbHVlXzMkICkKCQlhRG9jdW1lbnRQcm9wZXJ0aWVzLmluc2VydEJ5TmFtZSAoIHNJdGVtTmFtZV80JCwgc0ZpcnN0VmFsdWVfNCQgKQoJCWFEb2N1bWVudFByb3BlcnRpZXMuaW5zZXJ0QnlOYW1lICggc0l0ZW1OYW1lXzUkLCBzRmlyc3RWYWx1ZV81JCApCgoJCScgWnVyIEtvbnRyb2xsZSBkaWUgV2VydGUgYXVzZ2ViZW4uIChOdXIgd2ljaHRpZywgd2VubiBnZWxvZ2d0IHdpcmQhKQoJCScgRGFiZWkgd2lyZCBkaWUgTWV0aG9kZSAiZ2V0RWxlbWVudE5hbWVzKCkiIGdsZWljaCBpbXBsaXppdCBtaXRnZXRlc3RldCEKCQlTaG93TmFtZUNvbnRhaW5lciAoIGFEb2N1bWVudFByb3BlcnRpZXMgKQoKCQknIEFiZXIgYXVjaCBkaWUgQW56YWhsIGtvbnRyb2xsaWVyZW4uCgkJJyAoSGllciB3aXJkIGVpbmUgZWlnZW5lIEJBU0lDLUhpbGZzZnVua3Rpb24gdmVyd2VuZGV0ISBrZWluZSBJbnRlcmZhY2UtTWV0aG9kZSkKCQlpZiAoIGdldE5hbWVDb250YWluZXJDb3VudCAoIGFEb2N1bWVudFByb3BlcnRpZXMgKSA8PiA1ICkgdGhlbgoJCQlFcnJvck1lc3NhZ2UgKCAiaW5zZXJ0QnlOYW1lKCkgLi4uIEZlaGxlciAoRGVyIE5hbWVDb25hdGluZXIgZW50aGFlbHQgbmljaHQgZGllIGVpbmdlZnVlZ3RlbiA1IEVsZW1lbnRlISkiICkKCQkJZ290byBUZXN0X05vcm1hbFVzZV9YTmFtZUNvbnRhaW5lcl9FcnJvcgoJCWVuZCBpZgoKCQknIE51biBub2NoIGZlc3RzdGVsbGVuLCBvYiBkaWUgNSBkZW5uIGF1Y2ggdGF0c2FlY2hsaWNoIHZvcmhhbmRlbiBzaW5kLgoJCWlmICggYURvY3VtZW50UHJvcGVydGllcy5oYXNCeU5hbWUgKCBzSXRlbU5hbWVfMSQgKSA9IEZBTFNFICkgdGhlbgoJCQlFcnJvck1lc3NhZ2UJKCAiaGFzQnlOYW1lKCkgLi4uIEZlaGxlciBbRWxlbWVudCAxIG5pY2h0IHZvcmhhbmRlbiE/XSIgKQoJCQlnb3RvIFRlc3RfTm9ybWFsVXNlX1hOYW1lQ29udGFpbmVyX0Vycm9yCgkJZWxzZWlmICggYURvY3VtZW50UHJvcGVydGllcy5oYXNCeU5hbWUgKCBzSXRlbU5hbWVfMiQgKSA9IEZBTFNFICkgdGhlbgoJCQlFcnJvck1lc3NhZ2UJKCAiaGFzQnlOYW1lKCkgLi4uIEZlaGxlciBbRWxlbWVudCAyIG5pY2h0IHZvcmhhbmRlbiE/XSIgKQoJCQlnb3RvIFRlc3RfTm9ybWFsVXNlX1hOYW1lQ29udGFpbmVyX0Vycm9yCgkJZWxzZWlmICggYURvY3VtZW50UHJvcGVydGllcy5oYXNCeU5hbWUgKCBzSXRlbU5hbWVfMyQgKSA9IEZBTFNFICkgdGhlbgoJCQlFcnJvck1lc3NhZ2UJKCAiaGFzQnlOYW1lKCkgLi4uIEZlaGxlciBbRWxlbWVudCAzIG5pY2h0IHZvcmhhbmRlbiE/XSIgKQoJCQlnb3RvIFRlc3RfTm9ybWFsVXNlX1hOYW1lQ29udGFpbmVyX0Vycm9yCgkJZWxzZWlmICggYURvY3VtZW50UHJvcGVydGllcy5oYXNCeU5hbWUgKCBzSXRlbU5hbWVfNCQgKSA9IEZBTFNFICkgdGhlbgoJCQlFcnJvck1lc3NhZ2UJKCAiaGFzQnlOYW1lKCkgLi4uIEZlaGxlciBbRWxlbWVudCA0IG5pY2h0IHZvcmhhbmRlbiE/XSIgKQoJCQlnb3RvIFRlc3RfTm9ybWFsVXNlX1hOYW1lQ29udGFpbmVyX0Vycm9yCgkJZWxzZWlmICggYURvY3VtZW50UHJvcGVydGllcy5oYXNCeU5hbWUgKCBzSXRlbU5hbWVfNSQgKSA9IEZBTFNFICkgdGhlbgoJCQlFcnJvck1lc3NhZ2UJKCAiaGFzQnlOYW1lKCkgLi4uIEZlaGxlciBbRWxlbWVudCA1IG5pY2h0IHZvcmhhbmRlbiE/XSIgKQoJCQlnb3RvIFRlc3RfTm9ybWFsVXNlX1hOYW1lQ29udGFpbmVyX0Vycm9yCgkJZW5kIGlmCgoJCScgRGFubiBkaWUgV2VydGUgd2llZGVyIGF1c2xlc2VuLgoJCXNDb21wYXJlVmFsdWVfMSQgPSBhRG9jdW1lbnRQcm9wZXJ0aWVzLmdldEJ5TmFtZSAoIHNJdGVtTmFtZV8xJCApCgkJc0NvbXBhcmVWYWx1ZV8yJCA9IGFEb2N1bWVudFByb3BlcnRpZXMuZ2V0QnlOYW1lICggc0l0ZW1OYW1lXzIkICkKCQlzQ29tcGFyZVZhbHVlXzMkID0gYURvY3VtZW50UHJvcGVydGllcy5nZXRCeU5hbWUgKCBzSXRlbU5hbWVfMyQgKQoJCXNDb21wYXJlVmFsdWVfNCQgPSBhRG9jdW1lbnRQcm9wZXJ0aWVzLmdldEJ5TmFtZSAoIHNJdGVtTmFtZV80JCApCgkJc0NvbXBhcmVWYWx1ZV81JCA9IGFEb2N1bWVudFByb3BlcnRpZXMuZ2V0QnlOYW1lICggc0l0ZW1OYW1lXzUkICkKCgkJJyBadW0gVmVyZ2xlaWNoIGRpZSBXZXJ0ZSBhdXNnZWJlbi4gKE51ciB3aWNodGlnLCB3ZW5uIGdlbG9nZ3Qgd2lyZCEpCgkJU2hvd05hbWVDb250YWluZXIgKCBhRG9jdW1lbnRQcm9wZXJ0aWVzICkKCgkJJyBEYW5uIGRpZSBXZXJ0ZSBhdXRvbWF0aXNjaCB2ZXJnbGVpY2hlbiEKCQlpZiAoIENvbXBhcmVPV1N0cmluZwkJKCBzRmlyc3RWYWx1ZV8xJCwgc0NvbXBhcmVWYWx1ZV8xJCApID0gY0RpZmZlcmVudCApIHRoZW4KCQkJRXJyb3JNZXNzYWdlCSggImdldEJ5TmFtZSgpIC4uLiBGZWhsZXIgW0VsZW1lbnQgMSBmZWhsZXJoYWZ0XSIgKQoJCQlnb3RvIFRlc3RfTm9ybWFsVXNlX1hOYW1lQ29udGFpbmVyX0Vycm9yCgkJZWxzZWlmICggQ29tcGFyZU9XU3RyaW5nCSggc0ZpcnN0VmFsdWVfMiQsIHNDb21wYXJlVmFsdWVfMiQgKSA9IGNEaWZmZXJlbnQgKSB0aGVuCgkJCUVycm9yTWVzc2FnZQkoICJnZXRCeU5hbWUoKSAuLi4gRmVobGVyIFtFbGVtZW50IDIgZmVobGVyaGFmdF0iICkKCQkJZ290byBUZXN0X05vcm1hbFVzZV9YTmFtZUNvbnRhaW5lcl9FcnJvcgoJCWVsc2VpZiAoIENvbXBhcmVPV1N0cmluZwkoIHNGaXJzdFZhbHVlXzMkLCBzQ29tcGFyZVZhbHVlXzMkICkgPSBjRGlmZmVyZW50ICkgdGhlbgoJCQlFcnJvck1lc3NhZ2UJKCAiZ2V0QnlOYW1lKCkgLi4uIEZlaGxlciBbRWxlbWVudCAzIGZlaGxlcmhhZnRdIiApCgkJCWdvdG8gVGVzdF9Ob3JtYWxVc2VfWE5hbWVDb250YWluZXJfRXJyb3IKCQllbHNlaWYgKCBDb21wYXJlT1dTdHJpbmcJKCBzRmlyc3RWYWx1ZV80JCwgc0NvbXBhcmVWYWx1ZV80JCApID0gY0RpZmZlcmVudCApIHRoZW4KCQkJRXJyb3JNZXNzYWdlCSggImdldEJ5TmFtZSgpIC4uLiBGZWhsZXIgW0VsZW1lbnQgNCBmZWhsZXJoYWZ0XSIgKQoJCQlnb3RvIFRlc3RfTm9ybWFsVXNlX1hOYW1lQ29udGFpbmVyX0Vycm9yCgkJZWxzZWlmICggQ29tcGFyZU9XU3RyaW5nCSggc0ZpcnN0VmFsdWVfNSQsIHNDb21wYXJlVmFsdWVfNSQgKSA9IGNEaWZmZXJlbnQgKSB0aGVuCgkJCUVycm9yTWVzc2FnZQkoICJnZXRCeU5hbWUoKSAuLi4gRmVobGVyIFtFbGVtZW50IDUgZmVobGVyaGFmdF0iICkKCQkJZ290byBUZXN0X05vcm1hbFVzZV9YTmFtZUNvbnRhaW5lcl9FcnJvcgoJCWVuZCBpZgoKCQlJbmZvTWVzc2FnZQkoICJnZXRCeU5hbWUoKSAuLi4gT0siICkKCgkJJyBKZXR6dCB3aXJkIHZlcnN1Y2h0IGVpbmlnZSBkZXIgRWxlbWVudGUgaW4gaWhyZW0gV2VydCB6dSB2ZXJhZW5kZXJuLgoJCXNOZXdWYWx1ZV8xJAk9ICJOZXdWYWx1ZSAxIgoJCXNOZXdWYWx1ZV8yJAk9ICJOZXdWYWx1ZSAyIgoJCXNOZXdWYWx1ZV8zJAk9ICJOZXdWYWx1ZSAzIgoJCXNOZXdWYWx1ZV80JAk9ICJOZXdWYWx1ZSA0IgoJCXNOZXdWYWx1ZV81JAk9ICJOZXdWYWx1ZSA1IgoKCQlhRG9jdW1lbnRQcm9wZXJ0aWVzLnJlcGxhY2VCeU5hbWUgKCBzSXRlbU5hbWVfMSQsIHNOZXdWYWx1ZV8xJCApCgkJYURvY3VtZW50UHJvcGVydGllcy5yZXBsYWNlQnlOYW1lICggc0l0ZW1OYW1lXzIkLCBzTmV3VmFsdWVfMiQgKQoJCWFEb2N1bWVudFByb3BlcnRpZXMucmVwbGFjZUJ5TmFtZSAoIHNJdGVtTmFtZV8zJCwgc05ld1ZhbHVlXzMkICkKCQlhRG9jdW1lbnRQcm9wZXJ0aWVzLnJlcGxhY2VCeU5hbWUgKCBzSXRlbU5hbWVfNCQsIHNOZXdWYWx1ZV80JCApCgkJYURvY3VtZW50UHJvcGVydGllcy5yZXBsYWNlQnlOYW1lICggc0l0ZW1OYW1lXzUkLCBzTmV3VmFsdWVfNSQgKQoKCQknIFp1ciBLb250cm9sbGUgZGllIFdlcnRlIGF1c2dlYmVuLiAoTnVyIHdpY2h0aWcsIHdlbm4gZ2Vsb2dndCB3aXJkISkKCQlTaG93TmFtZUNvbnRhaW5lciAoIGFEb2N1bWVudFByb3BlcnRpZXMgKQoKCQknIERhbm4gZGllIFdlcnRlIHdpZWRlciBhdXNsZXNlbi4KCQlzQ29tcGFyZVZhbHVlXzEkID0gYURvY3VtZW50UHJvcGVydGllcy5nZXRCeU5hbWUgKCBzSXRlbU5hbWVfMSQgKQoJCXNDb21wYXJlVmFsdWVfMiQgPSBhRG9jdW1lbnRQcm9wZXJ0aWVzLmdldEJ5TmFtZSAoIHNJdGVtTmFtZV8yJCApCgkJc0NvbXBhcmVWYWx1ZV8zJCA9IGFEb2N1bWVudFByb3BlcnRpZXMuZ2V0QnlOYW1lICggc0l0ZW1OYW1lXzMkICkKCQlzQ29tcGFyZVZhbHVlXzQkID0gYURvY3VtZW50UHJvcGVydGllcy5nZXRCeU5hbWUgKCBzSXRlbU5hbWVfNCQgKQoJCXNDb21wYXJlVmFsdWVfNSQgPSBhRG9jdW1lbnRQcm9wZXJ0aWVzLmdldEJ5TmFtZSAoIHNJdGVtTmFtZV81JCApCgoJCScgWnVtIFZlcmdsZWljaCBkaWUgV2VydGUgYXVzZ2ViZW4uIChOdXIgd2ljaHRpZywgd2VubiBnZWxvZ2d0IHdpcmQhKQoJCVNob3dOYW1lQ29udGFpbmVyICggYURvY3VtZW50UHJvcGVydGllcyApCgoJCScgRGFubiBkaWUgV2VydGUgYXV0b21hdGlzY2ggdmVyZ2xlaWNoZW4hCgkJaWYgKCBDb21wYXJlT1dTdHJpbmcJCSggc05ld1ZhbHVlXzEkLCBzQ29tcGFyZVZhbHVlXzEkICkgPSBjRGlmZmVyZW50ICkgdGhlbgoJCQlFcnJvck1lc3NhZ2UJKCAicmVwbGFjZUJ5TmFtZSgpIC4uLiBGZWhsZXIgW0VsZW1lbnQgMSBmZWhsZXJoYWZ0XSIgKQoJCQlnb3RvIFRlc3RfTm9ybWFsVXNlX1hOYW1lQ29udGFpbmVyX0Vycm9yCgkJZWxzZWlmICggQ29tcGFyZU9XU3RyaW5nCSggc05ld1ZhbHVlXzIkLCBzQ29tcGFyZVZhbHVlXzIkICkgPSBjRGlmZmVyZW50ICkgdGhlbgoJCQlFcnJvck1lc3NhZ2UJKCAicmVwbGFjZUJ5TmFtZSgpIC4uLiBGZWhsZXIgW0VsZW1lbnQgMiBmZWhsZXJoYWZ0XSIgKQoJCQlnb3RvIFRlc3RfTm9ybWFsVXNlX1hOYW1lQ29udGFpbmVyX0Vycm9yCgkJZWxzZWlmICggQ29tcGFyZU9XU3RyaW5nCSggc05ld1ZhbHVlXzMkLCBzQ29tcGFyZVZhbHVlXzMkICkgPSBjRGlmZmVyZW50ICkgdGhlbgoJCQlFcnJvck1lc3NhZ2UJKCAicmVwbGFjZUJ5TmFtZSgpIC4uLiBGZWhsZXIgW0VsZW1lbnQgMyBmZWhsZXJoYWZ0XSIgKQoJCQlnb3RvIFRlc3RfTm9ybWFsVXNlX1hOYW1lQ29udGFpbmVyX0Vycm9yCgkJZWxzZWlmICggQ29tcGFyZU9XU3RyaW5nCSggc05ld1ZhbHVlXzQkLCBzQ29tcGFyZVZhbHVlXzQkICkgPSBjRGlmZmVyZW50ICkgdGhlbgoJCQlFcnJvck1lc3NhZ2UJKCAicmVwbGFjZUJ5TmFtZSgpIC4uLiBGZWhsZXIgW0VsZW1lbnQgNCBmZWhsZXJoYWZ0XSIgKQoJCQlnb3RvIFRlc3RfTm9ybWFsVXNlX1hOYW1lQ29udGFpbmVyX0Vycm9yCgkJZWxzZWlmICggQ29tcGFyZU9XU3RyaW5nCSggc05ld1ZhbHVlXzUkLCBzQ29tcGFyZVZhbHVlXzUkICkgPSBjRGlmZmVyZW50ICkgdGhlbgoJCQlFcnJvck1lc3NhZ2UJKCAicmVwbGFjZUJ5TmFtZSgpIC4uLiBGZWhsZXIgW0VsZW1lbnQgNSBmZWhsZXJoYWZ0XSIgKQoJCQlnb3RvIFRlc3RfTm9ybWFsVXNlX1hOYW1lQ29udGFpbmVyX0Vycm9yCgkJZW5kIGlmCgoJCUluZm9NZXNzYWdlCSggInJlcGxhY2VCeU5hbWUoKSAuLi4gT0siICkKCgkJJyBIaWVyIHNvbGxlbiBlaW5pZ2UgZGVyIDUgRWludHJhZWdlIGdlbG9lc2NodCB3ZXJkZW4uCgkJYURvY3VtZW50UHJvcGVydGllcy5yZW1vdmVCeU5hbWUgKCBzSXRlbU5hbWVfMSQgKQoJCWFEb2N1bWVudFByb3BlcnRpZXMucmVtb3ZlQnlOYW1lICggc0l0ZW1OYW1lXzMkICkKCgkJJyBEYW5uIHdpZWRlciBkaWUgQW56YWhsIGtvbnRyb2xsaWVyZW4uCgkJJyAoSGllciB3aXJkIGVpbmUgZWlnZW5lIEJBU0lDLUhpbGZzZnVua3Rpb24gdmVyd2VuZGV0ISBrZWluZSBJbnRlcmZhY2UtTWV0aG9kZSkKCQlpZiAoIGdldE5hbWVDb250YWluZXJDb3VudCAoIGFEb2N1bWVudFByb3BlcnRpZXMgKSA8PiAzICkgdGhlbgoJCQlFcnJvck1lc3NhZ2UgKCAicmVtb3ZlQnlOYW1lKCkgLi4uIEZlaGxlciAoRGVyIE5hbWVDb25hdGluZXIgZW50aGFlbHQgbmljaHQgZGllIGVyd2FydGV0ZW4gMyBFbGVtZW50ZSEpIiApCgkJCWdvdG8gVGVzdF9Ob3JtYWxVc2VfWE5hbWVDb250YWluZXJfRXJyb3IKCQllbmQgaWYKCgkJJyBOdW4gbm9jaCBmZXN0c3RlbGxlbiwgb2IgZGllIHJlc3RsaWNoZW4gMyBkZW5uIGF1Y2ggdGF0c2FlY2hsaWNoIGRpZSByaWNodGlnZW4gc2luZC4KCQlpZiAoIGFEb2N1bWVudFByb3BlcnRpZXMuaGFzQnlOYW1lICggc0l0ZW1OYW1lXzIkICkgPSBGQUxTRSApIHRoZW4KCQkJRXJyb3JNZXNzYWdlCSggInJlbW92ZUJ5TmFtZSgpIC4uLiBGZWhsZXIgW0VsZW1lbnQgMiBuaWNodCB2b3JoYW5kZW4hP10iICkKCQkJZ290byBUZXN0X05vcm1hbFVzZV9YTmFtZUNvbnRhaW5lcl9FcnJvcgoJCWVsc2VpZiAoIGFEb2N1bWVudFByb3BlcnRpZXMuaGFzQnlOYW1lICggc0l0ZW1OYW1lXzQkICkgPSBGQUxTRSApIHRoZW4KCQkJRXJyb3JNZXNzYWdlCSggInJlbW92ZUJ5TmFtZSgpIC4uLiBGZWhsZXIgW0VsZW1lbnQgNCBuaWNodCB2b3JoYW5kZW4hP10iICkKCQkJZ290byBUZXN0X05vcm1hbFVzZV9YTmFtZUNvbnRhaW5lcl9FcnJvcgoJCWVsc2VpZiAoIGFEb2N1bWVudFByb3BlcnRpZXMuaGFzQnlOYW1lICggc0l0ZW1OYW1lXzUkICkgPSBGQUxTRSApIHRoZW4KCQkJRXJyb3JNZXNzYWdlCSggInJlbW92ZUJ5TmFtZSgpIC4uLiBGZWhsZXIgW0VsZW1lbnQgNSBuaWNodCB2b3JoYW5kZW4hP10iICkKCQkJZ290byBUZXN0X05vcm1hbFVzZV9YTmFtZUNvbnRhaW5lcl9FcnJvcgoJCWVuZCBpZgoKCQknIFp1ciBLb250cm9sbGUgZGllIFdlcnRlIG5vY2htYWxzIGF1c2dlYmVuLiAoTnVyIHdpY2h0aWcsIHdlbm4gZ2Vsb2dndCB3aXJkISkKCQlTaG93TmFtZUNvbnRhaW5lciAoIGFEb2N1bWVudFByb3BlcnRpZXMgKQoKCQlJbmZvTWVzc2FnZQkoICJyZW1vdmVCeU5hbWUoKSAuLi4gT0siICkKCgkJJyBEZXIgVGVzdCB3YXIgZXJmb2xncmVpY2ghIE1lbGR1bmcgYXVzZ2ViZW4gdW5kIHp1cnVlY2sgem0gQXVmcnVmZXIuCgkJJyBBdXNzY2hhbHRlbiBkZXIgRmVobGVyYmVoYW5kbHVuZwoJCW9uIEVycm9yIGdvdG8gMAoJCScgTWVsZHVuZyBhdXNnZWJlbgoJCUluZm9NZXNzYWdlICggIlRlc3RfTm9ybWFsVXNlX1hOYW1lQ29udGFpbmVyIC4uLiBbZW5kZV0iICkKCQknIFN0YXR1cyBzZXR6ZW4KCQlUZXN0X05vcm1hbFVzZV9YTmFtZUNvbnRhaW5lciA9IGNPSwoJCScgVW5kIEZ1bmt0aW9uIGJlZW5kZW4KCQlFeGl0IEZ1bmN0aW9uCgonIEVzIGlzdCBlaW4gdW5lcndhcnRldGUgRmVobGVyIGF1ZmdldHJldGVuISAoRXhjZXB0aW9uIC4uLikKJyBNZWxkdW5nIGF1c2dlYmVuIHVuZCBtaXQgRmVobGVyIHp1cnVlY2trZWhyZW4uClRlc3RfTm9ybWFsVXNlX1hOYW1lQ29udGFpbmVyX0Vycm9yOgoJCScgQXVzc2NoYWx0ZW4gZGVyIEZlaGxlcmJlaGFuZGx1bmcKCQlvbiBFcnJvciBnb3RvIDAKCQknIE1lbGR1bmcgYXVzZ2ViZW4KCQlFcnJvck1lc3NhZ2UgKCAiVGVzdF9Ob3JtYWxVc2VfWE5hbWVDb250YWluZXIgLi4uIFtFcnJvcl0iICkKCQknIHVuZCBGZWhsZXJzdGF0dXMgc2V0emVuCgkJVGVzdF9Ob3JtYWxVc2VfWE5hbWVDb250YWluZXIgPSBjRXJyb3IKCQknIEFiYnJ1Y2ggZGVyIEZ1bmt0aW9uIGVyendpbmdlbiEKCQlFeGl0IEZ1bmN0aW9uCgpFbmQgRnVuY3Rpb24KCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCicgVGVzdG1ldGhvZGU6IFRlc3RlbiBkZXMgdW50ZXJzdHVldHp0ZW4gSW50ZXJmYWNlcyAiWFBlcnNpc3QiIHVudGVyIG5vcm1hbGVuIEJlZGluZ3VuZ2VuCicKJyBSZXR1cm53ZXJ0ID0gY09LCQk7IHdlbm4gZGVyIFRlc3QgZXJmb2xncmVpY2ggd2FyCicgUmV0dXJud2VydCA9IGNFcnJvcgk7IHdlbm4gc2ljaCBkYXMgT2JqZWt0IG5pY2h0IGtvcnJla3QgdmVyaGFsdGVuIGhhdAonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpGdW5jdGlvbiBUZXN0X05vcm1hbFVzZV9YUGVyc2lzdCAoIGFEb2N1bWVudFByb3BlcnRpZXMgKSBhcyBCb29sZWFuCgoJCScgRWluc2NoYWx0ZW4gZGVyIEZlaGxlcmJlaGFuZGx1bmcsIHVtIEV4Y2VwdGlvbnMgb2RlciBhZWhubGljaGVzIGFienVmYW5nZW4hCgkJb24gRXJyb3IgZ290byBUZXN0X05vcm1hbFVzZV9YUGVyc2lzdF9FcnJvcgoKCQlJbmZvTWVzc2FnZSAoICJUZXN0X05vcm1hbFVzZV9YUGVyc2lzdCAuLi4gW3N0YXJ0XSIgKQoKCQknIExhZGVuIGRlciBQcm9wZXJ0aWVzIGF1cyBlaW5lciBEYXRlaQoJCWFEb2N1bWVudFByb3BlcnRpZXMucmVhZCAoIGNUZXN0UGF0aCArICJUZXN0RGVidWdfaW4uc2R3IiApCgoJCScgWnVyIEtvbnRyb2xsZSBhbnplaWdlbgoJCVNob3dQcm9wZXJ0aWVzICggYURvY3VtZW50UHJvcGVydGllcyApCgoJCScgU3BlaWNoZXJuIGRlciBQcm9wZXJ0aWVzIGluIGVpbmVyIG5ldWVuIERhdGVpCgkJYURvY3VtZW50UHJvcGVydGllcy53cml0ZQkoIGNUZXN0UGF0aCArICJUZXN0RGVidWdfT3V0LnNkdyIgKQoJCWFEb2N1bWVudFByb3BlcnRpZXMucmVhZAkoIGNUZXN0UGF0aCArICJUZXN0RGVidWdfT3V0LnNkdyIgKQoKCQknIFp1ciBLb250cm9sbGUgYW56ZWlnZW4KCQlTaG93UHJvcGVydGllcyAoIGFEb2N1bWVudFByb3BlcnRpZXMgKQoJCQoJCScgRGVyIFRlc3Qgd2FyIGVyZm9sZ3JlaWNoISBNZWxkdW5nIGF1c2dlYmVuIHVuZCB6dXJ1ZWNrIHptIEF1ZnJ1ZmVyLgoJCScgQXVzc2NoYWx0ZW4gZGVyIEZlaGxlcmJlaGFuZGx1bmcKCQlvbiBFcnJvciBnb3RvIDAKCQknIE1lbGR1bmcgYXVzZ2ViZW4KCQlJbmZvTWVzc2FnZSAoICJUZXN0X05vcm1hbFVzZV9YUGVyc2lzdCAuLi4gW2VuZGVdIiApCgkJJyBTdGF0dXMgc2V0emVuCgkJVGVzdF9Ob3JtYWxVc2VfWFBlcnNpc3QgPSBjT0sKCQknIFVuZCBGdW5rdGlvbiBiZWVuZGVuCgkJRXhpdCBGdW5jdGlvbgoKJyBFcyBpc3QgZWluIHVuZXJ3YXJ0ZXRlIEZlaGxlciBhdWZnZXRyZXRlbiEgKEV4Y2VwdGlvbiAuLi4pCicgTWVsZHVuZyBhdXNnZWJlbiB1bmQgbWl0IEZlaGxlciB6dXJ1ZWNra2VocmVuLgpUZXN0X05vcm1hbFVzZV9YUGVyc2lzdF9FcnJvcjoKCQknIEF1c3NjaGFsdGVuIGRlciBGZWhsZXJiZWhhbmRsdW5nCgkJb24gRXJyb3IgZ290byAwCgkJJyBNZWxkdW5nIGF1c2dlYmVuCgkJRXJyb3JNZXNzYWdlICggIlRlc3RfTm9ybWFsVXNlX1hQZXJzaXN0IC4uLiBbRXJyb3JdIiApCgkJJyB1bmQgRmVobGVyc3RhdHVzIHNldHplbgoJCVRlc3RfTm9ybWFsVXNlX1hQZXJzaXN0ID0gY0Vycm9yCgkJJyBBYmJydWNoIGRlciBGdW5rdGlvbiBlcnp3aW5nZW4hCgkJRXhpdCBGdW5jdGlvbgoKRW5kIEZ1bmN0aW9uCgonKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKJyBIaWxmc2Z1bmt0aW9uZW4gdW5kIC1tZXRob2RlbgonKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCicgSGlsZnNtZXRob2RlOiBPZWZmbmV0IGRpZSBMT0ctRGF0ZWkuCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClN1YiBPcGVuTE9HICggc0ZpbGVOYW1lJCApCgkJaWYgKCBiTE9HT24gPSBjT24gKSB0aGVuCgkJCXNMT0dGaWxlTmFtZSQJPSBzRmlsZU5hbWUkCgkJCW5MT0dGaWxlSGFuZGxlJQk9IEZyZWVGaWxlCgkJCW9wZW4gc0xPR0ZpbGVOYW1lJCBmb3Igb3V0cHV0IGFzIG5MT0dGaWxlSGFuZGxlJQoJCWVuZCBpZgpFbmQgU3ViCgonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQonIEhpbGZzbWV0aG9kZTogU2NobGllc3N0IGRpZSBMT0ctRGF0ZWkuCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClN1YiBDbG9zZUxPRwoJCWlmICggYkxPR09uID0gY09uICkgdGhlbgoJCQljbG9zZSAjbkxPR0ZpbGVIYW5kbGUlCgkJZW5kIGlmCkVuZCBTdWIKCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCicgSGlsZnNtZXRob2RlOiBHaWJ0IGVpbmVuIFRleHQgaW4gZWluZXIgTE9HLURhdGVpIGF1cy4KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KU3ViIFdyaXRlTE9HICggc01lc3NhZ2UkICkKCQlpZiAoIGJMT0dPbiA9IGNPbiApIHRoZW4KCQkJV3JpdGUgI25MT0dGaWxlSGFuZGxlJSBzTWVzc2FnZSQKCQllbmQgaWYKRW5kIFN1YgoKJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KJyBIaWxmc21ldGhvZGU6IEdpYnQgZWluZSBNZXNzYWdlQm94IG1pdCBGZWhsZXJ0ZXh0LCBaZWlsZW5udW1tZXIgdW5kIFdhcm5zY2hpbGQgYXVzLgonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpTdWIgRXJyb3JNZXNzYWdlICggc01lc3NhZ2UkICkKCQknIEVudHdlZGVyIGluIGRpZSBMT0ctRGF0ZWkgc2NocmVpYmVuIG9kZXIgZWluZSBNZXNzYWdlQm94IGFuemVpZ2VuLgoJCWlmICggYkxPR09uID0gY09uICkgdGhlbgoJCQlXcml0ZUxPRyAoIHNNZXNzYWdlJCApCgkJZWxzZQoJCQlNc2dCb3ggKCBzTWVzc2FnZSQsIDE2ICkKCQllbmQgaWYKRW5kIFN1YgoKJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KJyBIaWxmc21ldGhvZGU6IEdpYnQgZWluZSBIaW53ZWlzYm94IGF1cy4KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KU3ViIEluZm9NZXNzYWdlICggc01lc3NhZ2UkICkKCQknIE51ciB3YXMgYW56ZWlnZW4sIHdlbm4gTnV0emVyIGVzIHd1ZW5zY2h0IQoJCWlmICggYlNob3dFcnJvcnNPbmx5ID0gY09mZiApIHRoZW4KCQkJJyBBbnNvbnN0ZW4gd2lyZCBlbnR3ZWRlciBpbiBkaWUgTE9HLURhdGVpIGdlc2NocmllYmVuIG9kZXIgZWluZSBNZXNzYWdlQm94IGFuZ2V6ZWlndC4KCQkJaWYgKCBiTE9HT24gPSBjT24gKSB0aGVuCgkJCQlXcml0ZUxPRyAoIHNNZXNzYWdlJCApCgkJCWVsc2UKCQkJCU1zZ0JveCAoIHNNZXNzYWdlJCwgNjQgKQoJCQllbmQgaWYKCQllbmQgaWYKRW5kIFN1YgoKJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KJyBIaWxmc2Z1bmt0aW9uOiBWZXJnbGVpY2h0IHp3ZWkgT1dTdHJpbmctV2VydGUKJwonIFJldHVybndlcnQgPSBjRXF1YWwJCTsgd2VubiBXZXJ0ZSBpZGVudGlzY2ggc2luZAonIFJldHVybndlcnQgPSBjRGlmZmVyZW50CTsgd2VubiBXZXJ0ZSB2ZXJzY2hpZWRlbiBzaW5kCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkZ1bmN0aW9uIENvbXBhcmVPV1N0cmluZyAoIHNPV1N0cmluZ18xJCwgc09XU3RyaW5nXzIkICkgYXMgQm9vbGVhbgoKCQlpZiAoIHNPV1N0cmluZ18xJCA9IHNPV1N0cmluZ18yJCApIHRoZW4KCQkJQ29tcGFyZU9XU3RyaW5nID0gY0VxdWFsCgkJZWxzZQoJCQlDb21wYXJlT1dTdHJpbmcgPSBjRGlmZmVyZW50CgkJZW5kIGlmCgpFbmQgRnVuY3Rpb24KCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCicgSGlsZnNmdW5rdGlvbjogVmVyZ2xlaWNodCB6d2VpIERhdGVUaW1lLVN0cnVrdHVyZW4KJwonIFJldHVybndlcnQgPSBjRXF1YWwJCTsgd2VubiBXZXJ0ZSBpZGVudGlzY2ggc2luZAonIFJldHVybndlcnQgPSBjRGlmZmVyZW50CTsgd2VubiBXZXJ0ZSB2ZXJzY2hpZWRlbiBzaW5kCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkZ1bmN0aW9uIENvbXBhcmVEYXRlVGltZSAoIGFEYXRlVGltZV8xLCBhRGF0ZVRpbWVfMiApIGFzIEJvb2xlYW4KCgkJaWYgKCBhRGF0ZVRpbWVfMS5EYXkgPSBhRGF0ZVRpbWVfMi5EYXkgYW5kIGFEYXRlVGltZV8xLk1vbnRoID0gYURhdGVUaW1lXzIuTW9udGggYW5kIGFEYXRlVGltZV8xLlllYXIgPSBhRGF0ZVRpbWVfMi5ZZWFyIGFuZCBhRGF0ZVRpbWVfMS5Ib3VycyA9IGFEYXRlVGltZV8xLkhvdXJzIGFuZCBhRGF0ZVRpbWVfMS5NaW51dGVzID0gYURhdGVUaW1lXzEuTWludXRlcyBhbmQgYURhdGVUaW1lXzEuU2Vjb25kcyA9IGFEYXRlVGltZV8xLlNlY29uZHMgYW5kIGFEYXRlVGltZV8xLkh1bmRyZWR0aFNlY29uZHMgPSBhRGF0ZVRpbWVfMS5IdW5kcmVkdGhTZWNvbmRzICkgdGhlbgoJCQlDb21wYXJlRGF0ZVRpbWUgPSBjRXF1YWwKCQllbHNlCgkJCUNvbXBhcmVEYXRlVGltZSA9IGNEaWZmZXJlbnQKCQllbmQgaWYKCkVuZCBGdW5jdGlvbgoKJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KJyBIaWxmc2Z1bmt0aW9uOiBWZXJnbGVpY2h0IHp3ZWkgQnl0ZVNlcXVlbmNlJ3MKJwonIFJldHVybndlcnQgPSBjRXF1YWwJCTsgd2VubiBXZXJ0ZSBpZGVudGlzY2ggc2luZAonIFJldHVybndlcnQgPSBjRGlmZmVyZW50CTsgd2VubiBXZXJ0ZSB2ZXJzY2hpZWRlbiBzaW5kCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkZ1bmN0aW9uIENvbXBhcmVCeXRlU2VxdWVuY2UgKCBzZXFCeXRlU2VxdWVuY2VfMSwgc2VxQnl0ZVNlcXVlbmNlXzIgKSBhcyBCb29sZWFuCgoJCScgV2VubiBiZWlkZSBsZWVyIHNpbmQsIHNpbmQgc2llIGF1Y2ggaWRlbnRpc2NoICEKCQknIERpZXNlciBUZXN0IG1pdCAiSXNBcnJheSIgaXN0IG5vZXRpZywgZGEgYmVpIGVpbmVtIGxlZXJlbiBBcnJheSBkaWUKCQknIEZ1bmt0aW9uICJVQm91bmQiIGVpbmVuIEZlaGxlciBwcm9kdXppZXJ0IQoJCWlmICggSXNBcnJheSAoIHNlcUJ5dGVTZXF1ZW5jZV8xICkgPSBGQUxTRSBhbmQgSXNBcnJheSAoIHNlcUJ5dGVTZXF1ZW5jZV8yICkgPSBGQUxTRSApIHRoZW4KCQkJQ29tcGFyZUJ5dGVTZXF1ZW5jZSA9IGNFcXVhbAoJCQlFeGl0IEZ1bmN0aW9uCgkJZW5kIGlmCgoJCScgV2VubiBqZWRvY2ggbnVyIGVpbmUgbGVlciBpc3QsIGRhbm4gc2luZCBzaWUgbmljaHQgaWRlbnRpc2NoLgoJCWlmICggSXNBcnJheSAoIHNlcUJ5dGVTZXF1ZW5jZV8xICkgPSBGQUxTRSApIG9yICggSXNBcnJheSAoIHNlcUJ5dGVTZXF1ZW5jZV8yICkgPSBGQUxTRSApIHRoZW4KCQkJQ29tcGFyZUJ5dGVTZXF1ZW5jZSA9IGNEaWZmZXJlbnQKCQkJRXhpdCBGdW5jdGlvbgoJCWVuZCBpZgoKCQknIEJlc29yZ2VuIGRlciBBbnphaGwgZGVyIEVsZW1lbnRlIGRlciBTZXF1ZW5jZXMKCQluRWxlbWVudENvdW50XzElCT0JVUJvdW5kICggc2VxQnl0ZVNlcXVlbmNlXzEgKQoJCW5FbGVtZW50Q291bnRfMiUJPQlVQm91bmQgKCBzZXFCeXRlU2VxdWVuY2VfMiApCgoJCScgV2VubiBkaWVzZSBBbnphaGwgc2Nob24gdmVyc2NoaWVkZW4gaXN0LCBkYW5uIC4uLgoJCWlmICggbkVsZW1lbnRDb3VudF8xJSA8PiBuRWxlbWVudENvdW50XzIlICkgdGhlbgoJCQknIC4uLiBzaW5kIGRpZSBTZXF1ZW5jZXMgd29obCB2ZXJzY2hpZWRlbi4KCQkJQ29tcGFyZUJ5dGVTZXF1ZW5jZSA9IGNEaWZmZXJlbnQKCQkJJyBEaWUgRWxlbWVudCBicmF1Y2hlbiBkYW5uIG5pY2h0IG1laHIgdmVyZ2xpY2hlbiB6dSB3ZXJkZW4uCgkJCUV4aXQgRnVuY3Rpb24KCQllbmQgaWYKCgkJJyBBbnNvbnN0ZW4gd2VyZGVuIGRpZSBFbGVtZW50ZSBlaW56ZWxuIG1pdGVpbmFuZGVyIHZlcmdsaWNoZW4uCgkJZm9yIG5Db3VudGVyJT0wIHRvIG5FbGVtZW50Q291bnRfMSUgc3RlcCAxCgkJCScgV2VubiBhdWNoIG51ciBlaW4gcGFhciBkYXZvbiB2ZXJzY2hpZWRlbiBpc3QsIGRhbm4gLi4uCgkJCWlmICggbkVsZW1lbnRDb3VudF8xJShuQ291bnRlciUpIDw+IG5FbGVtZW50Q291bnRfMiUobkNvdW50ZXIlKSApIHRoZW4KCQkJCScgLi4uIGthbm4gZGVyIFZlcmdsZWljaCBhYmdlYnJvY2hlbiB3ZXJkZW4hCgkJCQlDb21wYXJlQnl0ZVNlcXVlbmNlID0gY0RpZmZlcmVudAoJCQkJRXhpdCBGdW5jdGlvbgoJCQllbmQgaWYKCQluZXh0IG5Db3VudGVyJQoKCQknIFdlbm4gbWFuIGJpcyBoaWVyIGdla29tbWVuIGlzdCwgZGFubiBzaW5kIGRpZSBTZXF1ZW5jZXMgaWRlbnRpc2NoLgoJCUNvbXBhcmVCeXRlU2VxdWVuY2UgPSBjRXF1YWwKCkVuZCBGdW5jdGlvbgoKJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KJyBIaWxmc2Z1bmt0aW9uOiBWZXJnbGVpY2h0IHp3ZWkgSW50MTYtV2VydGUKJwonIFJldHVybndlcnQgPSBjRXF1YWwJCTsgd2VubiBXZXJ0ZSBpZGVudGlzY2ggc2luZAonIFJldHVybndlcnQgPSBjRGlmZmVyZW50CTsgd2VubiBXZXJ0ZSB2ZXJzY2hpZWRlbiBzaW5kCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkZ1bmN0aW9uIENvbXBhcmVJbnQxNiAoIG5JbnQxNl8xJSwgbkludDE2XzIlICkgYXMgQm9vbGVhbgoKCQlpZiAoIG5JbnQxNl8xJSA9IG5JbnQxNl8yJSApIHRoZW4KCQkJQ29tcGFyZUludDE2ID0gY0VxdWFsCgkJZWxzZQoJCQlDb21wYXJlSW50MTYgPSBjRGlmZmVyZW50CgkJZW5kIGlmCgpFbmQgRnVuY3Rpb24KCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCicgSGlsZnNmdW5rdGlvbjogVmVyZ2xlaWNodCB6d2VpIEludDMyLVdlcnRlCicKJyBSZXR1cm53ZXJ0ID0gY0VxdWFsCQk7IHdlbm4gV2VydGUgaWRlbnRpc2NoIHNpbmQKJyBSZXR1cm53ZXJ0ID0gY0RpZmZlcmVudAk7IHdlbm4gV2VydGUgdmVyc2NoaWVkZW4gc2luZAonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpGdW5jdGlvbiBDb21wYXJlSW50MzIgKCBuSW50MzJfMSYsIG5JbnQzMl8yJiApIGFzIEJvb2xlYW4KCgkJaWYgKCBuSW50MzJfMSYgPSBuSW50MzJfMiYgKSB0aGVuCgkJCUNvbXBhcmVJbnQzMiA9IGNFcXVhbAoJCWVsc2UKCQkJQ29tcGFyZUludDMyID0gY0RpZmZlcmVudAoJCWVuZCBpZgoKRW5kIEZ1bmN0aW9uCgonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQonIEhpbGZzZnVua3Rpb246IFZlcmdsZWljaHQgendlaSBCb29sLVdlcnRlCicKJyBSZXR1cm53ZXJ0ID0gY0VxdWFsCQk7IHdlbm4gV2VydGUgaWRlbnRpc2NoIHNpbmQKJyBSZXR1cm53ZXJ0ID0gY0RpZmZlcmVudAk7IHdlbm4gV2VydGUgdmVyc2NoaWVkZW4gc2luZAonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpGdW5jdGlvbiBDb21wYXJlQm9vbCAoIGJCb29sXzEsIGJCb29sXzIgKSBhcyBCb29sZWFuCgoJCWlmICggYkJvb2xfMSA9IGJCb29sXzIgKSB0aGVuCgkJCUNvbXBhcmVCb29sID0gY0VxdWFsCgkJZWxzZQoJCQlDb21wYXJlQm9vbCA9IGNEaWZmZXJlbnQKCQllbmQgaWYKCkVuZCBGdW5jdGlvbgoKJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KJyBIaWxmc2Z1bmt0aW9uOiBWZXJnbGVpY2h0IGRpZSBQcm9wZXJ0aWVzIHp3ZWllciBPYmpla3RlIHVtIFVudGVyc2NoaWVkZSBmZXN0enVzdGVsbGVuLgonCicgUmV0dXJud2VydCA9IGNFcXVhbAkJOyB3ZW5uIE9iamVrdGUgdm9uIGRlbiBQcm9wZXJ0aWVzIGhlciBpZGVudGlzY2ggc2luZAonIFJldHVybndlcnQgPSBjRGlmZmVyZW50CTsgd2VubiBPYmpla3RlIHZvbiBkZW4gUHJvcGVydGllcyBoZXIgdmVyc2NoaWVkZW4gc2luZAonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpGdW5jdGlvbiBDb21wYXJlRG9jdW1lbnRQcm9wZXJ0aWVzICggYURvY3VtZW50UHJvcGVydGllc18xLCBhRG9jdW1lbnRQcm9wZXJ0aWVzXzIgKSBhcyBCb29sZWFuCgoJCScgQmVzb3JnZW4gZGVyIFdlcnRlIHVuZCB6d2lzY2hlbnNwZWljaGVybiAoYmV6b2dlbiBhdWYgT2JqZWt0IDEpCgkJc0F1dGhvcl8xJAkJCQkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzXzEuZ2V0UHJvcGVydHlWYWx1ZSAoICJBdXRob3IiCQkJCQkJKQoJCWJBdXRvbG9hZEVuYWJsZWRfMQkJCT0gYURvY3VtZW50UHJvcGVydGllc18xLmdldFByb3BlcnR5VmFsdWUgKCAiQXV0b2xvYWRFbmFibGVkIgkJCSkKCQluQXV0b2xvYWRTZWNzXzElCQkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzXzEuZ2V0UHJvcGVydHlWYWx1ZSAoICJBdXRvbG9hZFNlY3MiCQkJCSkKCQlzQXV0b0xvYWRVUkxfMSQJCQkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzXzEuZ2V0UHJvcGVydHlWYWx1ZSAoICJBdXRvbG9hZFVSTCIJCQkJKQoJCXNCbGllbmRDb3BpZXNUb18xJAkJCT0gYURvY3VtZW50UHJvcGVydGllc18xLmdldFByb3BlcnR5VmFsdWUgKCAiQmxpbmRDb3BpZXNUbyIJCQkJKQoJCXNDb3BpZXNUb18xJAkJCQk9IGFEb2N1bWVudFByb3BlcnRpZXNfMS5nZXRQcm9wZXJ0eVZhbHVlICggIkNvcGllc1RvIgkJCQkJKQoJCWFDcmVhdGlvbkRhdGVfMQkJCQk9IGFEb2N1bWVudFByb3BlcnRpZXNfMS5nZXRQcm9wZXJ0eVZhbHVlICggIkNyZWF0aW9uRGF0ZSIJCQkJKQoJCXNEZWZhdWx0VGFyZ2V0XzEkCQkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzXzEuZ2V0UHJvcGVydHlWYWx1ZSAoICJEZWZhdWx0VGFyZ2V0IgkJCQkpCgkJc0Rlc2NyaXB0aW9uXzEkCQkJCT0gYURvY3VtZW50UHJvcGVydGllc18xLmdldFByb3BlcnR5VmFsdWUgKCAiRGVzY3JpcHRpb24iCQkJCSkKCQluRWRpdGluZ0N5Y2xlc18xJQkJCT0gYURvY3VtZW50UHJvcGVydGllc18xLmdldFByb3BlcnR5VmFsdWUgKCAiRWRpdGluZ0N5Y2xlcyIJCQkJKQoJCW5FZGl0aW5nRHVyYXRpb25fMSYJCQk9IGFEb2N1bWVudFByb3BlcnRpZXNfMS5nZXRQcm9wZXJ0eVZhbHVlICggIkVkaXRpbmdEdXJhdGlvbiIJCQkpCgkJc2VxRXh0cmFEYXRhXzEJCQkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzXzEuZ2V0UHJvcGVydHlWYWx1ZSAoICJFeHRyYURhdGEiCQkJCQkpCgkJc0luUmVwbHlUb18xJAkJCQk9IGFEb2N1bWVudFByb3BlcnRpZXNfMS5nZXRQcm9wZXJ0eVZhbHVlICggIkluUmVwbHlUbyIJCQkJCSkKCQliSXNFbmNyeXB0ZWRfMQkJCQk9IGFEb2N1bWVudFByb3BlcnRpZXNfMS5nZXRQcm9wZXJ0eVZhbHVlICggIklzRW5jcnlwdGVkIgkJCQkpCgkJc0tleXdvcmRzXzEkCQkJCT0gYURvY3VtZW50UHJvcGVydGllc18xLmdldFByb3BlcnR5VmFsdWUgKCAiS2V5d29yZHMiCQkJCQkpCgkJc01JTUVUeXBlXzEkCQkJCT0gYURvY3VtZW50UHJvcGVydGllc18xLmdldFByb3BlcnR5VmFsdWUgKCAiTUlNRVR5cGUiCQkJCQkpCgkJc01vZGlmaWVkQnlfMSQJCQkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzXzEuZ2V0UHJvcGVydHlWYWx1ZSAoICJNb2RpZmllZEJ5IgkJCQkJKQoJCWFNb2RpZnlEYXRlXzEJCQkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzXzEuZ2V0UHJvcGVydHlWYWx1ZSAoICJNb2RpZnlEYXRlIgkJCQkJKQoJCXNOZXdzZ3JvdXBzXzEkCQkJCT0gYURvY3VtZW50UHJvcGVydGllc18xLmdldFByb3BlcnR5VmFsdWUgKCAiTmV3c2dyb3VwcyIJCQkJCSkKCQlzT3JpZ2luYWxfMSQJCQkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzXzEuZ2V0UHJvcGVydHlWYWx1ZSAoICJPcmlnaW5hbCIJCQkJCSkKCQliUG9ydGFibGVHcmFwaGljc18xCQkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzXzEuZ2V0UHJvcGVydHlWYWx1ZSAoICJQb3J0YWJsZUdyYXBoaWNzIgkJCSkKCQlhUHJpbnREYXRlXzEJCQkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzXzEuZ2V0UHJvcGVydHlWYWx1ZSAoICJQcmludERhdGUiCQkJCQkpCgkJc1ByaW50ZWRCeV8xJAkJCQk9IGFEb2N1bWVudFByb3BlcnRpZXNfMS5nZXRQcm9wZXJ0eVZhbHVlICggIlByaW50ZWRCeSIJCQkJCSkKCQluUHJpb3JpdHlfMSUJCQkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzXzEuZ2V0UHJvcGVydHlWYWx1ZSAoICJQcmlvcml0eSIJCQkJCSkKCQliUXVlcnlUZW1wbGF0ZV8xCQkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzXzEuZ2V0UHJvcGVydHlWYWx1ZSAoICJRdWVyeVRlbXBsYXRlIgkJCQkpCgkJc1JlY2lwaWVudF8xJAkJCQk9IGFEb2N1bWVudFByb3BlcnRpZXNfMS5nZXRQcm9wZXJ0eVZhbHVlICggIlJlY2lwaWVudCIJCQkJCSkKCQlzUmVmZXJlbmNlc18xJAkJCQk9IGFEb2N1bWVudFByb3BlcnRpZXNfMS5nZXRQcm9wZXJ0eVZhbHVlICggIlJlZmVyZW5jZXMiCQkJCQkpCgkJc1JlcGx5VG9fMSQJCQkJCT0gYURvY3VtZW50UHJvcGVydGllc18xLmdldFByb3BlcnR5VmFsdWUgKCAiUmVwbHlUbyIJCQkJCSkKCQliU2F2ZUdyYXBoaWNzQ29tcHJlc3NlZF8xCT0gYURvY3VtZW50UHJvcGVydGllc18xLmdldFByb3BlcnR5VmFsdWUgKCAiU2F2ZUdyYXBoaWNzQ29tcHJlc3NlZCIJCSkKCQliU2F2ZU9yaWdpbmFsR3JhcGhpY3NfMQkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzXzEuZ2V0UHJvcGVydHlWYWx1ZSAoICJTYXZlT3JpZ2luYWxHcmFwaGljcyIJCSkKCQliU2F2ZVZlcnNpb25PbkNsb3NlXzEJCT0gYURvY3VtZW50UHJvcGVydGllc18xLmdldFByb3BlcnR5VmFsdWUgKCAiU2F2ZVZlcnNpb25PbkNsb3NlIgkJCSkKCQlzVGVtcGxhdGVfMSQJCQkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzXzEuZ2V0UHJvcGVydHlWYWx1ZSAoICJUZW1wbGF0ZSIJCQkJCSkKCQliVGVtcGxhdGVDb25maWdfMQkJCT0gYURvY3VtZW50UHJvcGVydGllc18xLmdldFByb3BlcnR5VmFsdWUgKCAiVGVtcGxhdGVDb25maWciCQkJCSkKCQlhVGVtcGxhdGVEYXRlXzEJCQkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzXzEuZ2V0UHJvcGVydHlWYWx1ZSAoICJUZW1wbGF0ZURhdGUiCQkJCSkKCQlzVGVtcGxhdGVGaWxlTmFtZV8xJAkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzXzEuZ2V0UHJvcGVydHlWYWx1ZSAoICJUZW1wbGF0ZUZpbGVOYW1lIgkJCSkKCQlzVGhlbWVfMSQJCQkJCT0gYURvY3VtZW50UHJvcGVydGllc18xLmdldFByb3BlcnR5VmFsdWUgKCAiVGhlbWUiCQkJCQkJKQoJCXNUaXRsZV8xJAkJCQkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzXzEuZ2V0UHJvcGVydHlWYWx1ZSAoICJUaXRsZSIJCQkJCQkpCgkJYlVzZXJEYXRhXzEJCQkJCT0gYURvY3VtZW50UHJvcGVydGllc18xLmdldFByb3BlcnR5VmFsdWUgKCAiVXNlckRhdGEiCQkJCQkpCgoJCScgQmVzb3JnZW4gZGVyIFdlcnRlIHVuZCB6d2lzY2hlbnNwZWljaGVybiAoYmV6b2dlbiBhdWYgT2JqZWt0IDIpCgkJc0F1dGhvcl8yJAkJCQkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzXzIuZ2V0UHJvcGVydHlWYWx1ZSAoICJBdXRob3IiCQkJCQkJKQoJCWJBdXRvbG9hZEVuYWJsZWRfMgkJCT0gYURvY3VtZW50UHJvcGVydGllc18yLmdldFByb3BlcnR5VmFsdWUgKCAiQXV0b2xvYWRFbmFibGVkIgkJCSkKCQluQXV0b2xvYWRTZWNzXzIlCQkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzXzIuZ2V0UHJvcGVydHlWYWx1ZSAoICJBdXRvbG9hZFNlY3MiCQkJCSkKCQlzQXV0b0xvYWRVUkxfMiQJCQkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzXzIuZ2V0UHJvcGVydHlWYWx1ZSAoICJBdXRvbG9hZFVSTCIJCQkJKQoJCXNCbGllbmRDb3BpZXNUb18yJAkJCT0gYURvY3VtZW50UHJvcGVydGllc18yLmdldFByb3BlcnR5VmFsdWUgKCAiQmxpbmRDb3BpZXNUbyIJCQkJKQoJCXNDb3BpZXNUb18yJAkJCQk9IGFEb2N1bWVudFByb3BlcnRpZXNfMi5nZXRQcm9wZXJ0eVZhbHVlICggIkNvcGllc1RvIgkJCQkJKQoJCWFDcmVhdGlvbkRhdGVfMgkJCQk9IGFEb2N1bWVudFByb3BlcnRpZXNfMi5nZXRQcm9wZXJ0eVZhbHVlICggIkNyZWF0aW9uRGF0ZSIJCQkJKQoJCXNEZWZhdWx0VGFyZ2V0XzIkCQkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzXzIuZ2V0UHJvcGVydHlWYWx1ZSAoICJEZWZhdWx0VGFyZ2V0IgkJCQkpCgkJc0Rlc2NyaXB0aW9uXzIkCQkJCT0gYURvY3VtZW50UHJvcGVydGllc18yLmdldFByb3BlcnR5VmFsdWUgKCAiRGVzY3JpcHRpb24iCQkJCSkKCQluRWRpdGluZ0N5Y2xlc18yJQkJCT0gYURvY3VtZW50UHJvcGVydGllc18yLmdldFByb3BlcnR5VmFsdWUgKCAiRWRpdGluZ0N5Y2xlcyIJCQkJKQoJCW5FZGl0aW5nRHVyYXRpb25fMiYJCQk9IGFEb2N1bWVudFByb3BlcnRpZXNfMi5nZXRQcm9wZXJ0eVZhbHVlICggIkVkaXRpbmdEdXJhdGlvbiIJCQkpCgkJc2VxRXh0cmFEYXRhXzIJCQkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzXzIuZ2V0UHJvcGVydHlWYWx1ZSAoICJFeHRyYURhdGEiCQkJCQkpCgkJc0luUmVwbHlUb18yJAkJCQk9IGFEb2N1bWVudFByb3BlcnRpZXNfMi5nZXRQcm9wZXJ0eVZhbHVlICggIkluUmVwbHlUbyIJCQkJCSkKCQliSXNFbmNyeXB0ZWRfMgkJCQk9IGFEb2N1bWVudFByb3BlcnRpZXNfMi5nZXRQcm9wZXJ0eVZhbHVlICggIklzRW5jcnlwdGVkIgkJCQkpCgkJc0tleXdvcmRzXzIkCQkJCT0gYURvY3VtZW50UHJvcGVydGllc18yLmdldFByb3BlcnR5VmFsdWUgKCAiS2V5d29yZHMiCQkJCQkpCgkJc01JTUVUeXBlXzIkCQkJCT0gYURvY3VtZW50UHJvcGVydGllc18yLmdldFByb3BlcnR5VmFsdWUgKCAiTUlNRVR5cGUiCQkJCQkpCgkJc01vZGlmaWVkQnlfMiQJCQkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzXzIuZ2V0UHJvcGVydHlWYWx1ZSAoICJNb2RpZmllZEJ5IgkJCQkJKQoJCWFNb2RpZnlEYXRlXzIJCQkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzXzIuZ2V0UHJvcGVydHlWYWx1ZSAoICJNb2RpZnlEYXRlIgkJCQkJKQoJCXNOZXdzZ3JvdXBzXzIkCQkJCT0gYURvY3VtZW50UHJvcGVydGllc18yLmdldFByb3BlcnR5VmFsdWUgKCAiTmV3c2dyb3VwcyIJCQkJCSkKCQlzT3JpZ2luYWxfMiQJCQkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzXzIuZ2V0UHJvcGVydHlWYWx1ZSAoICJPcmlnaW5hbCIJCQkJCSkKCQliUG9ydGFibGVHcmFwaGljc18yCQkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzXzIuZ2V0UHJvcGVydHlWYWx1ZSAoICJQb3J0YWJsZUdyYXBoaWNzIgkJCSkKCQlhUHJpbnREYXRlXzIJCQkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzXzIuZ2V0UHJvcGVydHlWYWx1ZSAoICJQcmludERhdGUiCQkJCQkpCgkJc1ByaW50ZWRCeV8yJAkJCQk9IGFEb2N1bWVudFByb3BlcnRpZXNfMi5nZXRQcm9wZXJ0eVZhbHVlICggIlByaW50ZWRCeSIJCQkJCSkKCQluUHJpb3JpdHlfMiUJCQkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzXzIuZ2V0UHJvcGVydHlWYWx1ZSAoICJQcmlvcml0eSIJCQkJCSkKCQliUXVlcnlUZW1wbGF0ZV8yCQkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzXzIuZ2V0UHJvcGVydHlWYWx1ZSAoICJRdWVyeVRlbXBsYXRlIgkJCQkpCgkJc1JlY2lwaWVudF8yJAkJCQk9IGFEb2N1bWVudFByb3BlcnRpZXNfMi5nZXRQcm9wZXJ0eVZhbHVlICggIlJlY2lwaWVudCIJCQkJCSkKCQlzUmVmZXJlbmNlc18yJAkJCQk9IGFEb2N1bWVudFByb3BlcnRpZXNfMi5nZXRQcm9wZXJ0eVZhbHVlICggIlJlZmVyZW5jZXMiCQkJCQkpCgkJc1JlcGx5VG9fMiQJCQkJCT0gYURvY3VtZW50UHJvcGVydGllc18yLmdldFByb3BlcnR5VmFsdWUgKCAiUmVwbHlUbyIJCQkJCSkKCQliU2F2ZUdyYXBoaWNzQ29tcHJlc3NlZF8yCT0gYURvY3VtZW50UHJvcGVydGllc18yLmdldFByb3BlcnR5VmFsdWUgKCAiU2F2ZUdyYXBoaWNzQ29tcHJlc3NlZCIJCSkKCQliU2F2ZU9yaWdpbmFsR3JhcGhpY3NfMgkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzXzIuZ2V0UHJvcGVydHlWYWx1ZSAoICJTYXZlT3JpZ2luYWxHcmFwaGljcyIJCSkKCQliU2F2ZVZlcnNpb25PbkNsb3NlXzIJCT0gYURvY3VtZW50UHJvcGVydGllc18yLmdldFByb3BlcnR5VmFsdWUgKCAiU2F2ZVZlcnNpb25PbkNsb3NlIgkJCSkKCQlzVGVtcGxhdGVfMiQJCQkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzXzIuZ2V0UHJvcGVydHlWYWx1ZSAoICJUZW1wbGF0ZSIJCQkJCSkKCQliVGVtcGxhdGVDb25maWdfMgkJCT0gYURvY3VtZW50UHJvcGVydGllc18yLmdldFByb3BlcnR5VmFsdWUgKCAiVGVtcGxhdGVDb25maWciCQkJCSkKCQlhVGVtcGxhdGVEYXRlXzIJCQkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzXzIuZ2V0UHJvcGVydHlWYWx1ZSAoICJUZW1wbGF0ZURhdGUiCQkJCSkKCQlzVGVtcGxhdGVGaWxlTmFtZV8yJAkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzXzIuZ2V0UHJvcGVydHlWYWx1ZSAoICJUZW1wbGF0ZUZpbGVOYW1lIgkJCSkKCQlzVGhlbWVfMiQJCQkJCT0gYURvY3VtZW50UHJvcGVydGllc18yLmdldFByb3BlcnR5VmFsdWUgKCAiVGhlbWUiCQkJCQkJKQoJCXNUaXRsZV8yJAkJCQkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzXzIuZ2V0UHJvcGVydHlWYWx1ZSAoICJUaXRsZSIJCQkJCQkpCgkJYlVzZXJEYXRhXzIJCQkJCT0gYURvY3VtZW50UHJvcGVydGllc18yLmdldFByb3BlcnR5VmFsdWUgKCAiVXNlckRhdGEiCQkJCQkpCgoJCScgQWxzIGVyd2FydGV0ZW4gWmllbHdlcnQgc2Nob24gbWFsICJQcm9wZXJ0aWVzIGlkZW50aXNjaCIgYW5uZWhtZW4hISEKCQknIEb8ciBkZW4gRmFsbCwgZGFzIG51ciBlaW5lIGRpZXNlbiBBbnNwcnVjaCBuaWNodCBlcmb8bGx0LCB3aXJkIGRlciBXZXJ0IGVpbmZhY2ggenVy/GNrZ2VzZXR6dC4KCQknIFZvbiBkYSBibGVpYnQgZGVyIG5ldWUgV2VydCBiZXN0ZWhlbiB1bmQgemVpZ3QgYW4sIGRh3yBzaWNoIG1pbmRlc3RlbnMgZWluZSBQcm9wZXJ0eSBnZeRuZGVydCBoYXQhCgkJQ29tcGFyZURvY3VtZW50UHJvcGVydGllcyA9IGNFcXVhbAoKCQknIERhbm4gZGllIFdlcnRlIHZlcmdsZWljaGVuCgkJaWYgKCBDb21wYXJlT1dTdHJpbmcJCSggc0F1dGhvcl8xJCwJCQkJCXNBdXRob3JfMiQJCQkJCSkgPSBjRGlmZmVyZW50ICkgdGhlbgoJCQlDb21wYXJlRG9jdW1lbnRQcm9wZXJ0aWVzID0gY0RpZmZlcmVudAoJCWVsc2VpZiAoIENvbXBhcmVCb29sCQkoIGJBdXRvbG9hZEVuYWJsZWRfMSwJCQliQXV0b2xvYWRFbmFibGVkXzIJCQkpID0gY0RpZmZlcmVudCApIHRoZW4KCQkJQ29tcGFyZURvY3VtZW50UHJvcGVydGllcyA9IGNEaWZmZXJlbnQKCQllbHNlaWYgKCBDb21wYXJlSW50MTYJCSggbkF1dG9sb2FkU2Vjc18xJSwJCQkJbkF1dG9sb2FkU2Vjc18yJQkJCSkgPSBjRGlmZmVyZW50ICkgdGhlbgoJCQlDb21wYXJlRG9jdW1lbnRQcm9wZXJ0aWVzID0gY0RpZmZlcmVudAoJCWVsc2VpZiAoIENvbXBhcmVPV1N0cmluZwkoIHNBdXRvTG9hZFVSTF8xJCwJCQkJc0F1dG9Mb2FkVVJMXzIkCQkJCSkgPSBjRGlmZmVyZW50ICkgdGhlbgoJCQlDb21wYXJlRG9jdW1lbnRQcm9wZXJ0aWVzID0gY0RpZmZlcmVudAoJCWVsc2VpZiAoIENvbXBhcmVPV1N0cmluZwkoIHNCbGllbmRDb3BpZXNUb18xJCwJCQlzQmxpZW5kQ29waWVzVG9fMiQJCQkpID0gY0RpZmZlcmVudCApIHRoZW4KCQkJQ29tcGFyZURvY3VtZW50UHJvcGVydGllcyA9IGNEaWZmZXJlbnQKCQllbHNlaWYgKCBDb21wYXJlT1dTdHJpbmcJKCBzQ29waWVzVG9fMSQsCQkJCQlzQ29waWVzVG9fMiQJCQkJKSA9IGNEaWZmZXJlbnQgKSB0aGVuCgkJCUNvbXBhcmVEb2N1bWVudFByb3BlcnRpZXMgPSBjRGlmZmVyZW50CgkJZWxzZWlmICggQ29tcGFyZURhdGVUaW1lCSggYUNyZWF0aW9uRGF0ZV8xLAkJCQlhQ3JlYXRpb25EYXRlXzIJCQkJKSA9IGNEaWZmZXJlbnQgKSB0aGVuCgkJCUNvbXBhcmVEb2N1bWVudFByb3BlcnRpZXMgPSBjRGlmZmVyZW50CgkJZWxzZWlmICggQ29tcGFyZU9XU3RyaW5nCSggc0RlZmF1bHRUYXJnZXRfMSQsCQkJc0RlZmF1bHRUYXJnZXRfMiQJCQkpID0gY0RpZmZlcmVudCApIHRoZW4KCQkJQ29tcGFyZURvY3VtZW50UHJvcGVydGllcyA9IGNEaWZmZXJlbnQKCQllbHNlaWYgKCBDb21wYXJlT1dTdHJpbmcJKCBzRGVzY3JpcHRpb25fMSQsCQkJCXNEZXNjcmlwdGlvbl8yJAkJCQkpID0gY0RpZmZlcmVudCApIHRoZW4KCQkJQ29tcGFyZURvY3VtZW50UHJvcGVydGllcyA9IGNEaWZmZXJlbnQKCQllbHNlaWYgKCBDb21wYXJlSW50MTYJCSggbkVkaXRpbmdDeWNsZXNfMSUsCQkJbkVkaXRpbmdDeWNsZXNfMiUJCQkpID0gY0RpZmZlcmVudCApIHRoZW4KCQkJQ29tcGFyZURvY3VtZW50UHJvcGVydGllcyA9IGNEaWZmZXJlbnQKCQllbHNlaWYgKCBDb21wYXJlSW50MzIJCSggbkVkaXRpbmdEdXJhdGlvbl8xJiwJCQluRWRpdGluZ0R1cmF0aW9uXzImCQkJKSA9IGNEaWZmZXJlbnQgKSB0aGVuCgkJCUNvbXBhcmVEb2N1bWVudFByb3BlcnRpZXMgPSBjRGlmZmVyZW50CgkJZWxzZWlmICggQ29tcGFyZUJ5dGVTZXF1ZW5jZSggc2VxRXh0cmFEYXRhXzEsCQkJCXNlcUV4dHJhRGF0YV8yCQkJCSkgPSBjRGlmZmVyZW50ICkgdGhlbgoJCQlDb21wYXJlRG9jdW1lbnRQcm9wZXJ0aWVzID0gY0RpZmZlcmVudAoJCWVsc2VpZiAoIENvbXBhcmVPV1N0cmluZwkoIHNJblJlcGx5VG9fMSQsCQkJCXNJblJlcGx5VG9fMiQJCQkJKSA9IGNEaWZmZXJlbnQgKSB0aGVuCgkJCUNvbXBhcmVEb2N1bWVudFByb3BlcnRpZXMgPSBjRGlmZmVyZW50CgkJZWxzZWlmICggQ29tcGFyZUJvb2wJCSggYklzRW5jcnlwdGVkXzEsCQkJCWJJc0VuY3J5cHRlZF8yCQkJCSkgPSBjRGlmZmVyZW50ICkgdGhlbgoJCQlDb21wYXJlRG9jdW1lbnRQcm9wZXJ0aWVzID0gY0RpZmZlcmVudAoJCWVsc2VpZiAoIENvbXBhcmVPV1N0cmluZwkoIHNLZXl3b3Jkc18xJCwJCQkJCXNLZXl3b3Jkc18yJAkJCQkpID0gY0RpZmZlcmVudCApIHRoZW4KCQkJQ29tcGFyZURvY3VtZW50UHJvcGVydGllcyA9IGNEaWZmZXJlbnQKCQllbHNlaWYgKCBDb21wYXJlT1dTdHJpbmcJKCBzTUlNRVR5cGVfMSQsCQkJCQlzTUlNRVR5cGVfMiQJCQkJKSA9IGNEaWZmZXJlbnQgKSB0aGVuCgkJCUNvbXBhcmVEb2N1bWVudFByb3BlcnRpZXMgPSBjRGlmZmVyZW50CgkJZWxzZWlmICggQ29tcGFyZU9XU3RyaW5nCSggc01vZGlmaWVkQnlfMSQsCQkJCXNNb2RpZmllZEJ5XzIkCQkJCSkgPSBjRGlmZmVyZW50ICkgdGhlbgoJCQlDb21wYXJlRG9jdW1lbnRQcm9wZXJ0aWVzID0gY0RpZmZlcmVudAoJCWVsc2VpZiAoIENvbXBhcmVEYXRlVGltZQkoIGFNb2RpZnlEYXRlXzEsCQkJCWFNb2RpZnlEYXRlXzIJCQkJKSA9IGNEaWZmZXJlbnQgKSB0aGVuCgkJCUNvbXBhcmVEb2N1bWVudFByb3BlcnRpZXMgPSBjRGlmZmVyZW50CgkJZWxzZWlmICggQ29tcGFyZU9XU3RyaW5nCSggc05ld3Nncm91cHNfMSQsCQkJCXNOZXdzZ3JvdXBzXzIkCQkJCSkgPSBjRGlmZmVyZW50ICkgdGhlbgoJCQlDb21wYXJlRG9jdW1lbnRQcm9wZXJ0aWVzID0gY0RpZmZlcmVudAoJCWVsc2VpZiAoIENvbXBhcmVPV1N0cmluZwkoIHNPcmlnaW5hbF8xJCwJCQkJCXNPcmlnaW5hbF8yJAkJCQkpID0gY0RpZmZlcmVudCApIHRoZW4KCQkJQ29tcGFyZURvY3VtZW50UHJvcGVydGllcyA9IGNEaWZmZXJlbnQKCQllbHNlaWYgKCBDb21wYXJlQm9vbAkJKCBiUG9ydGFibGVHcmFwaGljc18xLAkJCWJQb3J0YWJsZUdyYXBoaWNzXzIJCQkpID0gY0RpZmZlcmVudCApIHRoZW4KCQkJQ29tcGFyZURvY3VtZW50UHJvcGVydGllcyA9IGNEaWZmZXJlbnQKCQllbHNlaWYgKCBDb21wYXJlRGF0ZVRpbWUJKCBhUHJpbnREYXRlXzEsCQkJCQlhUHJpbnREYXRlXzIJCQkJKSA9IGNEaWZmZXJlbnQgKSB0aGVuCgkJCUNvbXBhcmVEb2N1bWVudFByb3BlcnRpZXMgPSBjRGlmZmVyZW50CgkJZWxzZWlmICggQ29tcGFyZU9XU3RyaW5nCSggc1ByaW50ZWRCeV8xJCwJCQkJc1ByaW50ZWRCeV8yJAkJCQkpID0gY0RpZmZlcmVudCApIHRoZW4KCQkJQ29tcGFyZURvY3VtZW50UHJvcGVydGllcyA9IGNEaWZmZXJlbnQKCQllbHNlaWYgKCBDb21wYXJlSW50MTYJCSggblByaW9yaXR5XzElLAkJCQkJblByaW9yaXR5XzIlCQkJCSkgPSBjRGlmZmVyZW50ICkgdGhlbgoJCQlDb21wYXJlRG9jdW1lbnRQcm9wZXJ0aWVzID0gY0RpZmZlcmVudAoJCWVsc2VpZiAoIENvbXBhcmVCb29sCQkoIGJRdWVyeVRlbXBsYXRlXzEsCQkJCWJRdWVyeVRlbXBsYXRlXzIJCQkpID0gY0RpZmZlcmVudCApIHRoZW4KCQkJQ29tcGFyZURvY3VtZW50UHJvcGVydGllcyA9IGNEaWZmZXJlbnQKCQllbHNlaWYgKCBDb21wYXJlT1dTdHJpbmcJKCBzUmVjaXBpZW50XzEkLAkJCQlzUmVjaXBpZW50XzIkCQkJCSkgPSBjRGlmZmVyZW50ICkgdGhlbgoJCQlDb21wYXJlRG9jdW1lbnRQcm9wZXJ0aWVzID0gY0RpZmZlcmVudAoJCWVsc2VpZiAoIENvbXBhcmVPV1N0cmluZwkoIHNSZWZlcmVuY2VzXzEkLAkJCQlzUmVmZXJlbmNlc18yJAkJCQkpID0gY0RpZmZlcmVudCApIHRoZW4KCQkJQ29tcGFyZURvY3VtZW50UHJvcGVydGllcyA9IGNEaWZmZXJlbnQKCQllbHNlaWYgKCBDb21wYXJlT1dTdHJpbmcJKCBzUmVwbHlUb18xJCwJCQkJCXNSZXBseVRvXzIkCQkJCQkpID0gY0RpZmZlcmVudCApIHRoZW4KCQkJQ29tcGFyZURvY3VtZW50UHJvcGVydGllcyA9IGNEaWZmZXJlbnQKCQllbHNlaWYgKCBDb21wYXJlQm9vbAkJKCBiU2F2ZUdyYXBoaWNzQ29tcHJlc3NlZF8xLAliU2F2ZUdyYXBoaWNzQ29tcHJlc3NlZF8yCSkgPSBjRGlmZmVyZW50ICkgdGhlbgoJCQlDb21wYXJlRG9jdW1lbnRQcm9wZXJ0aWVzID0gY0RpZmZlcmVudAoJCWVsc2VpZiAoIENvbXBhcmVCb29sCQkoIGJTYXZlT3JpZ2luYWxHcmFwaGljc18xLAkJYlNhdmVPcmlnaW5hbEdyYXBoaWNzXzIJCSkgPSBjRGlmZmVyZW50ICkgdGhlbgoJCQlDb21wYXJlRG9jdW1lbnRQcm9wZXJ0aWVzID0gY0RpZmZlcmVudAoJCWVsc2VpZiAoIENvbXBhcmVCb29sCQkoIGJTYXZlVmVyc2lvbk9uQ2xvc2VfMSwJCWJTYXZlVmVyc2lvbk9uQ2xvc2VfMgkJKSA9IGNEaWZmZXJlbnQgKSB0aGVuCgkJCUNvbXBhcmVEb2N1bWVudFByb3BlcnRpZXMgPSBjRGlmZmVyZW50CgkJZWxzZWlmICggQ29tcGFyZU9XU3RyaW5nCSggc1RlbXBsYXRlXzEkLAkJCQkJc1RlbXBsYXRlXzIkCQkJCSkgPSBjRGlmZmVyZW50ICkgdGhlbgoJCQlDb21wYXJlRG9jdW1lbnRQcm9wZXJ0aWVzID0gY0RpZmZlcmVudAoJCWVsc2VpZiAoIENvbXBhcmVCb29sCQkoIGJUZW1wbGF0ZUNvbmZpZ18xLAkJCWJUZW1wbGF0ZUNvbmZpZ18yCQkJKSA9IGNEaWZmZXJlbnQgKSB0aGVuCgkJCUNvbXBhcmVEb2N1bWVudFByb3BlcnRpZXMgPSBjRGlmZmVyZW50CgkJZWxzZWlmICggQ29tcGFyZURhdGVUaW1lCSggYVRlbXBsYXRlRGF0ZV8xLAkJCQlhVGVtcGxhdGVEYXRlXzIJCQkJKSA9IGNEaWZmZXJlbnQgKSB0aGVuCgkJCUNvbXBhcmVEb2N1bWVudFByb3BlcnRpZXMgPSBjRGlmZmVyZW50CgkJZWxzZWlmICggQ29tcGFyZU9XU3RyaW5nCSggc1RlbXBsYXRlRmlsZU5hbWVfMSQsCQkJc1RlbXBsYXRlRmlsZU5hbWVfMiQJCSkgPSBjRGlmZmVyZW50ICkgdGhlbgoJCQlDb21wYXJlRG9jdW1lbnRQcm9wZXJ0aWVzID0gY0RpZmZlcmVudAoJCWVsc2VpZiAoIENvbXBhcmVPV1N0cmluZwkoIHNUaGVtZV8xJCwJCQkJCXNUaGVtZV8yJAkJCQkJKSA9IGNEaWZmZXJlbnQgKSB0aGVuCgkJCUNvbXBhcmVEb2N1bWVudFByb3BlcnRpZXMgPSBjRGlmZmVyZW50CgkJZWxzZWlmICggQ29tcGFyZU9XU3RyaW5nCSggc1RpdGxlXzEkLAkJCQkJc1RpdGxlXzIkCQkJCQkpID0gY0RpZmZlcmVudCApIHRoZW4KCQkJQ29tcGFyZURvY3VtZW50UHJvcGVydGllcyA9IGNEaWZmZXJlbnQKCQllbHNlaWYgKCBDb21wYXJlQm9vbAkJKCBiVXNlckRhdGFfMSwJCQkJCWJVc2VyRGF0YV8yCQkJCQkpID0gY0RpZmZlcmVudCApIHRoZW4KCQkJQ29tcGFyZURvY3VtZW50UHJvcGVydGllcyA9IGNEaWZmZXJlbnQKCQllbmQgaWYKCkVuZCBGdW5jdGlvbgoKJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KJyBIaWxmc2Z1bmt0aW9uOiBXYW5kZWx0IGVpbmUgU3RydWt0dXIgZGVzIFR5cGVzIERhdGVUaW1lIGluIGVpbmVuIGZvcm1hdGllcnRlbiBTdHJpbmcgdW0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KRnVuY3Rpb24gRGF0ZVRpbWUyU3RyaW5nICggYURhdGVUaW1lICkgYXMgU3RyaW5nCgoJCXN0ZW1wU3RyaW5nJCA9ICIiCgkJc3RlbXBTdHJpbmckID0gc3RlbXBTdHJpbmckICsgYURhdGVUaW1lLkRheQkJCQkJKyAiLiIKCQlzdGVtcFN0cmluZyQgPSBzdGVtcFN0cmluZyQgKyBhRGF0ZVRpbWUuTW9udGgJCQkJKyAiLiIKCQlzdGVtcFN0cmluZyQgPSBzdGVtcFN0cmluZyQgKyBhRGF0ZVRpbWUuWWVhcgkJCQkrICIgLSAiCgkJc3RlbXBTdHJpbmckID0gc3RlbXBTdHJpbmckICsgYURhdGVUaW1lLkhvdXJzCQkJCSsgIjoiCgkJc3RlbXBTdHJpbmckID0gc3RlbXBTdHJpbmckICsgYURhdGVUaW1lLk1pbnV0ZXMJCQkJKyAiOiIKCQlzdGVtcFN0cmluZyQgPSBzdGVtcFN0cmluZyQgKyBhRGF0ZVRpbWUuU2Vjb25kcwkJCQkrICI6IgoJCXN0ZW1wU3RyaW5nJCA9IHN0ZW1wU3RyaW5nJCArIGFEYXRlVGltZS5IdW5kcmVkdGhTZWNvbmRzCSsgIiBVaHIiCgoJCURhdGVUaW1lMlN0cmluZyA9IHN0ZW1wU3RyaW5nJAoKRW5kIEZ1bmN0aW9uCgonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQonIEhpbGZzZnVua3Rpb246IFdhbmRlbHQgZWluZSBTZXF1ZW5jZSB2b24gQnl0ZXMgaW4gZWluZW4gZm9ybWF0aWVydGVuIFN0cmluZyB1bQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpGdW5jdGlvbiBCeXRlU2VxdWVuY2UyU3RyaW5nICggc2VxQnl0ZVNlcXVlbmNlICkgYXMgU3RyaW5nCgoJCW5FbGVtZW50Q291bnQlID0gVUJvdW5kICggc2VxQnl0ZVNlcXVlbmNlKCkgKQoKCQlpZiAoIG5FbGVtZW50Q291bnQlIDwgMSApIHRoZW4KCQkJc3RlbXBTdHJpbmckID0gImxlZXIiCgkJZWxzZQoJCQlzdGVtcFN0cmluZyQgPSAieyIKCQkJZm9yIG5Db3VudGVyJT0wIHRvIG5FbGVtZW50Q291bnQlIHN0ZXAgMQoJCQkJc3RlbXBTdHJpbmckID0gc3RlbXBTdHJpbmckICsgc2VxQnl0ZVNlcXVlbmNlKG5Db3VudGVyJSkKCQkJbmV4dCBuQ291bnRlciUKCQkJc3RlbXBTdHJpbmckID0gc3RlbXBTdHJpbmckICsgIn0iCgkJZW5kIGlmCgoJCUJ5dGVTZXF1ZW5jZTJTdHJpbmcgPSBzdGVtcFN0cmluZyQKCkVuZCBGdW5jdGlvbgoKJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KJyBIaWxmc21ldGhvZGU6IFplaWd0IGRpZSBha3R1ZWxsZW4gV2VydGUgQUxMRVIgUHJvcGVydGllcyBhbgonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpTdWIgU2hvd1Byb3BlcnRpZXMgKCBhRG9jdW1lbnRQcm9wZXJ0aWVzICkKCgkJJyBCZXNvcmdlbiBkZXIgV2VydGUgdW5kIHp3aXNjaGVuc3BlaWNoZXJuCgkJc0F1dGhvciQJCQkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzLmdldFByb3BlcnR5VmFsdWUgKCAiQXV0aG9yIgkJCQkJKQoJCWJBdXRvbG9hZEVuYWJsZWQJCT0gYURvY3VtZW50UHJvcGVydGllcy5nZXRQcm9wZXJ0eVZhbHVlICggIkF1dG9sb2FkRW5hYmxlZCIJCQkpCgkJbkF1dG9sb2FkU2VjcyUJCQk9IGFEb2N1bWVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHlWYWx1ZSAoICJBdXRvbG9hZFNlY3MiCQkJCSkKCQlzQXV0b0xvYWRVUkwkCQkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzLmdldFByb3BlcnR5VmFsdWUgKCAiQXV0b2xvYWRVUkwiCQkJCSkKCQlzQmxpZW5kQ29waWVzVG8kCQk9IGFEb2N1bWVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHlWYWx1ZSAoICJCbGluZENvcGllc1RvIgkJCSkKCQlzQ29waWVzVG8kCQkJCT0gYURvY3VtZW50UHJvcGVydGllcy5nZXRQcm9wZXJ0eVZhbHVlICggIkNvcGllc1RvIgkJCQkJKQoJCWRDcmVhdGlvbkRhdGUJCQk9IGFEb2N1bWVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHlWYWx1ZSAoICJDcmVhdGlvbkRhdGUiCQkJCSkKCQlzRGVmYXVsdFRhcmdldCQJCQk9IGFEb2N1bWVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHlWYWx1ZSAoICJEZWZhdWx0VGFyZ2V0IgkJCSkKCQlzRGVzY3JpcHRpb24kCQkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzLmdldFByb3BlcnR5VmFsdWUgKCAiRGVzY3JpcHRpb24iCQkJCSkKCQluRWRpdGluZ0N5Y2xlcyUJCQk9IGFEb2N1bWVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHlWYWx1ZSAoICJFZGl0aW5nQ3ljbGVzIgkJCSkKCQluRWRpdGluZ0R1cmF0aW9uJgkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzLmdldFByb3BlcnR5VmFsdWUgKCAiRWRpdGluZ0R1cmF0aW9uIgkJCSkKCQlzZXFFeHRyYURhdGEJCQk9IGFEb2N1bWVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHlWYWx1ZSAoICJFeHRyYURhdGEiCQkJCSkKCQlzSW5SZXBseVRvJAkJCQk9IGFEb2N1bWVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHlWYWx1ZSAoICJJblJlcGx5VG8iCQkJCSkKCQliSXNFbmNyeXB0ZWQJCQk9IGFEb2N1bWVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHlWYWx1ZSAoICJJc0VuY3J5cHRlZCIJCQkJKQoJCXNLZXl3b3JkcyQJCQkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzLmdldFByb3BlcnR5VmFsdWUgKCAiS2V5d29yZHMiCQkJCQkpCgkJc01JTUVUeXBlJAkJCQk9IGFEb2N1bWVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHlWYWx1ZSAoICJNSU1FVHlwZSIJCQkJCSkKCQlzTW9kaWZpZWRCeSQJCQk9IGFEb2N1bWVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHlWYWx1ZSAoICJNb2RpZmllZEJ5IgkJCQkpCgkJZE1vZGlmeURhdGUJCQkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzLmdldFByb3BlcnR5VmFsdWUgKCAiTW9kaWZ5RGF0ZSIJCQkJKQoJCXNOZXdzZ3JvdXBzJAkJCT0gYURvY3VtZW50UHJvcGVydGllcy5nZXRQcm9wZXJ0eVZhbHVlICggIk5ld3Nncm91cHMiCQkJCSkKCQlzT3JpZ2luYWwkCQkJCT0gYURvY3VtZW50UHJvcGVydGllcy5nZXRQcm9wZXJ0eVZhbHVlICggIk9yaWdpbmFsIgkJCQkJKQoJCWJQb3J0YWJsZUdyYXBoaWNzCQk9IGFEb2N1bWVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHlWYWx1ZSAoICJQb3J0YWJsZUdyYXBoaWNzIgkJCSkKCQlkUHJpbnREYXRlCQkJCT0gYURvY3VtZW50UHJvcGVydGllcy5nZXRQcm9wZXJ0eVZhbHVlICggIlByaW50RGF0ZSIJCQkJKQoJCXNQcmludGVkQnkkCQkJCT0gYURvY3VtZW50UHJvcGVydGllcy5nZXRQcm9wZXJ0eVZhbHVlICggIlByaW50ZWRCeSIJCQkJKQoJCW5Qcmlvcml0eSUJCQkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzLmdldFByb3BlcnR5VmFsdWUgKCAiUHJpb3JpdHkiCQkJCQkpCgkJYlF1ZXJ5VGVtcGxhdGUJCQk9IGFEb2N1bWVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHlWYWx1ZSAoICJRdWVyeVRlbXBsYXRlIgkJCSkKCQlzUmVjaXBpZW50JAkJCQk9IGFEb2N1bWVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHlWYWx1ZSAoICJSZWNpcGllbnQiCQkJCSkKCQlzUmVmZXJlbmNlcyQJCQk9IGFEb2N1bWVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHlWYWx1ZSAoICJSZWZlcmVuY2VzIgkJCQkpCgkJc1JlcGx5VG8kCQkJCT0gYURvY3VtZW50UHJvcGVydGllcy5nZXRQcm9wZXJ0eVZhbHVlICggIlJlcGx5VG8iCQkJCQkpCgkJYlNhdmVHcmFwaGljc0NvbXByZXNzZWQJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzLmdldFByb3BlcnR5VmFsdWUgKCAiU2F2ZUdyYXBoaWNzQ29tcHJlc3NlZCIJKQoJCWJTYXZlT3JpZ2luYWxHcmFwaGljcwk9IGFEb2N1bWVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHlWYWx1ZSAoICJTYXZlT3JpZ2luYWxHcmFwaGljcyIJCSkKCQliU2F2ZVZlcnNpb25PbkNsb3NlCQk9IGFEb2N1bWVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHlWYWx1ZSAoICJTYXZlVmVyc2lvbk9uQ2xvc2UiCQkpCgkJc1RlbXBsYXRlJAkJCQk9IGFEb2N1bWVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHlWYWx1ZSAoICJUZW1wbGF0ZSIJCQkJCSkKCQliVGVtcGxhdGVDb25maWcJCQk9IGFEb2N1bWVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHlWYWx1ZSAoICJUZW1wbGF0ZUNvbmZpZyIJCQkpCgkJZFRlbXBsYXRlRGF0ZQkJCT0gYURvY3VtZW50UHJvcGVydGllcy5nZXRQcm9wZXJ0eVZhbHVlICggIlRlbXBsYXRlRGF0ZSIJCQkJKQoJCXNUZW1wbGF0ZUZpbGVOYW1lJAkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzLmdldFByb3BlcnR5VmFsdWUgKCAiVGVtcGxhdGVGaWxlTmFtZSIJCQkpCgkJc1RoZW1lJAkJCQkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzLmdldFByb3BlcnR5VmFsdWUgKCAiVGhlbWUiCQkJCQkpCgkJc1RpdGxlJAkJCQkJPSBhRG9jdW1lbnRQcm9wZXJ0aWVzLmdldFByb3BlcnR5VmFsdWUgKCAiVGl0bGUiCQkJCQkpCgkJYlVzZXJEYXRhCQkJCT0gYURvY3VtZW50UHJvcGVydGllcy5nZXRQcm9wZXJ0eVZhbHVlICggIlVzZXJEYXRhIgkJCQkJKQoKCQknIEVpbmUgWmVpY2hlbmtldHRlIHp1c2FtbWVuYmFzdGVsbiwgd2VsY2hlIGRpZSBXZXJ0ZSBmb3JtYXRpZXJ0IGRhcnN0ZWxsdC4KCQlzT3V0TGluZSQgPSAJCQkiW09XU3RyaW5nXSIJCSsgY2hyJCg5KSArICJBdXRob3IiICAJCQkJCSsgY2hyJCg5KSArICI9IHsiICsgY2hyJCg5KSArIHNBdXRob3IkCQkJCQkJCSsgIn0iICsgY2hyJCgxMykKCQlzT3V0TGluZSQgPSBzT3V0TGluZSQgKyAiW3NhbF9Cb29sXSIJCSsgY2hyJCg5KSArICJBdXRvbG9hZEVuYWJsZWQiCQkJKyBjaHIkKDkpICsgIj0geyIgKyBjaHIkKDkpICsgYkF1dG9sb2FkRW5hYmxlZAkJCQkJKyAifSIgKyBjaHIkKDEzKQoJCXNPdXRMaW5lJCA9IHNPdXRMaW5lJCArICJbc2FsX0ludDE2XSIJCSsgY2hyJCg5KSArICJBdXRvbG9hZFNlY3MiCQkJCSsgY2hyJCg5KSArICI9IHsiICsgY2hyJCg5KSArIG5BdXRvbG9hZFNlY3MlCQkJCQkrICJ9IiArIGNociQoMTMpCgkJc091dExpbmUkID0gc091dExpbmUkICsgIltPV1N0cmluZ10iCQkrIGNociQoOSkgKyAiQXV0b0xvYWRVUkwiCQkJCSsgY2hyJCg5KSArICI9IHsiICsgY2hyJCg5KSArIHNBdXRvTG9hZFVSTCQJCQkJCQkrICJ9IiArIGNociQoMTMpCgkJc091dExpbmUkID0gc091dExpbmUkICsgIltPV1N0cmluZ10iCQkrIGNociQoOSkgKyAiQmxpZW5kQ29waWVzVG8iCQkJKyBjaHIkKDkpICsgIj0geyIgKyBjaHIkKDkpICsgc0JsaWVuZENvcGllc1RvJAkJCQkJKyAifSIgKyBjaHIkKDEzKQoJCXNPdXRMaW5lJCA9IHNPdXRMaW5lJCArICJbT1dTdHJpbmddIgkJKyBjaHIkKDkpICsgIkNvcGllc1RvIgkJCQkJKyBjaHIkKDkpICsgIj0geyIgKyBjaHIkKDkpICsgc0NvcGllc1RvJAkJCQkJCSsgIn0iICsgY2hyJCgxMykKCQlzT3V0TGluZSQgPSBzT3V0TGluZSQgKyAiW0RhdGVUaW1lXSIJCSsgY2hyJCg5KSArICJDcmVhdGlvbkRhdGUiCQkJCSsgY2hyJCg5KSArICI9IHsiICsgY2hyJCg5KSArIERhdGVUaW1lMlN0cmluZyhkQ3JlYXRpb25EYXRlKQkrICJ9IiArIGNociQoMTMpCgkJc091dExpbmUkID0gc091dExpbmUkICsgIltPV1N0cmluZ10iCQkrIGNociQoOSkgKyAiRGVmYXVsdFRhcmdldCIJCQkJKyBjaHIkKDkpICsgIj0geyIgKyBjaHIkKDkpICsgc0RlZmF1bHRUYXJnZXQkCQkJCQkrICJ9IiArIGNociQoMTMpCgkJc091dExpbmUkID0gc091dExpbmUkICsgIltPV1N0cmluZ10iCQkrIGNociQoOSkgKyAiRGVzY3JpcHRpb24iCQkJCSsgY2hyJCg5KSArICI9IHsiICsgY2hyJCg5KSArIHNEZXNjcmlwdGlvbiQJCQkJCQkrICJ9IiArIGNociQoMTMpCgkJc091dExpbmUkID0gc091dExpbmUkICsgIltzYWxfSW50MTZdIgkJKyBjaHIkKDkpICsgIkVkaXRpbmdDeWNsZXMiCQkJCSsgY2hyJCg5KSArICI9IHsiICsgY2hyJCg5KSArIG5FZGl0aW5nQ3ljbGVzJQkJCQkJKyAifSIgKyBjaHIkKDEzKQoJCXNPdXRMaW5lJCA9IHNPdXRMaW5lJCArICJbc2FsX0ludDMyXSIJCSsgY2hyJCg5KSArICJFZGl0aW5nRHVyYXRpb24iCQkJKyBjaHIkKDkpICsgIj0geyIgKyBjaHIkKDkpICsgbkVkaXRpbmdEdXJhdGlvbiYJCQkJCSsgIn0iICsgY2hyJCgxMykKCQlzT3V0TGluZSQgPSBzT3V0TGluZSQgKyAiW1NlcXVlbmNlPEJ5dGU+XSIJKyBjaHIkKDkpICsgIkV4dHJhRGF0YSIJCQkJCSsgY2hyJCg5KSArICI9IHsiICsgY2hyJCg5KSArIEJ5dGVTZXF1ZW5jZTJTdHJpbmcoc2VxRXh0cmFEYXRhKQkrICJ9IiArIGNociQoMTMpCgkJc091dExpbmUkID0gc091dExpbmUkICsgIltPV1N0cmluZ10iCQkrIGNociQoOSkgKyAiSW5SZXBseVRvIgkJCQkJKyBjaHIkKDkpICsgIj0geyIgKyBjaHIkKDkpICsgc0luUmVwbHlUbyQJCQkJCQkrICJ9IiArIGNociQoMTMpCgkJc091dExpbmUkID0gc091dExpbmUkICsgIltzYWxfQm9vbF0iCQkrIGNociQoOSkgKyAiSXNFbmNyeXB0ZWQiCQkJCSsgY2hyJCg5KSArICI9IHsiICsgY2hyJCg5KSArIGJJc0VuY3J5cHRlZAkJCQkJCSsgIn0iICsgY2hyJCgxMykKCQlzT3V0TGluZSQgPSBzT3V0TGluZSQgKyAiW09XU3RyaW5nXSIJCSsgY2hyJCg5KSArICJLZXl3b3JkcyIJCQkJCSsgY2hyJCg5KSArICI9IHsiICsgY2hyJCg5KSArIHNLZXl3b3JkcyQJCQkJCQkrICJ9IiArIGNociQoMTMpCgkJc091dExpbmUkID0gc091dExpbmUkICsgIltPV1N0cmluZ10iCQkrIGNociQoOSkgKyAiTUlNRVR5cGUiCQkJCQkrIGNociQoOSkgKyAiPSB7IiArIGNociQoOSkgKyBzTUlNRVR5cGUkCQkJCQkJKyAifSIgKyBjaHIkKDEzKQoJCXNPdXRMaW5lJCA9IHNPdXRMaW5lJCArICJbT1dTdHJpbmddIgkJKyBjaHIkKDkpICsgIk1vZGlmaWVkQnkiCQkJCSsgY2hyJCg5KSArICI9IHsiICsgY2hyJCg5KSArIHNNb2RpZmllZEJ5JAkJCQkJCSsgIn0iICsgY2hyJCgxMykKCQlzT3V0TGluZSQgPSBzT3V0TGluZSQgKyAiW0RhdGVUaW1lXSIJCSsgY2hyJCg5KSArICJNb2RpZnlEYXRlIgkJCQkrIGNociQoOSkgKyAiPSB7IiArIGNociQoOSkgKyBEYXRlVGltZTJTdHJpbmcoZE1vZGlmeURhdGUpCQkrICJ9IiArIGNociQoMTMpCgkJc091dExpbmUkID0gc091dExpbmUkICsgIltPV1N0cmluZ10iCQkrIGNociQoOSkgKyAiTmV3c2dyb3VwcyIJCQkJKyBjaHIkKDkpICsgIj0geyIgKyBjaHIkKDkpICsgc05ld3Nncm91cHMkCQkJCQkJKyAifSIgKyBjaHIkKDEzKQoJCXNPdXRMaW5lJCA9IHNPdXRMaW5lJCArICJbT1dTdHJpbmddIgkJKyBjaHIkKDkpICsgIk9yaWdpbmFsIgkJCQkJKyBjaHIkKDkpICsgIj0geyIgKyBjaHIkKDkpICsgc09yaWdpbmFsJAkJCQkJCSsgIn0iICsgY2hyJCgxMykKCQlzT3V0TGluZSQgPSBzT3V0TGluZSQgKyAiW3NhbF9Cb29sXSIJCSsgY2hyJCg5KSArICJQb3J0YWJsZUdyYXBoaWNzIgkJCSsgY2hyJCg5KSArICI9IHsiICsgY2hyJCg5KSArIGJQb3J0YWJsZUdyYXBoaWNzCQkJCQkrICJ9IiArIGNociQoMTMpCgkJc091dExpbmUkID0gc091dExpbmUkICsgIltEYXRlVGltZV0iCQkrIGNociQoOSkgKyAiUHJpbnREYXRlIgkJCQkJKyBjaHIkKDkpICsgIj0geyIgKyBjaHIkKDkpICsgRGF0ZVRpbWUyU3RyaW5nKGRQcmludERhdGUpCQkrICJ9IiArIGNociQoMTMpCgkJc091dExpbmUkID0gc091dExpbmUkICsgIltPV1N0cmluZ10iCQkrIGNociQoOSkgKyAiUHJpbnRlZEJ5IgkJCQkJKyBjaHIkKDkpICsgIj0geyIgKyBjaHIkKDkpICsgc1ByaW50ZWRCeSQJCQkJCQkrICJ9IiArIGNociQoMTMpCgkJc091dExpbmUkID0gc091dExpbmUkICsgIltzYWxfSW50MTZdIgkJKyBjaHIkKDkpICsgIlByaW9yaXR5IgkJCQkJKyBjaHIkKDkpICsgIj0geyIgKyBjaHIkKDkpICsgblByaW9yaXR5JQkJCQkJCSsgIn0iICsgY2hyJCgxMykKCQlzT3V0TGluZSQgPSBzT3V0TGluZSQgKyAiW3NhbF9Cb29sXSIJCSsgY2hyJCg5KSArICJRdWVyeVRlbXBsYXRlIgkJCQkrIGNociQoOSkgKyAiPSB7IiArIGNociQoOSkgKyBiUXVlcnlUZW1wbGF0ZQkJCQkJKyAifSIgKyBjaHIkKDEzKQoJCXNPdXRMaW5lJCA9IHNPdXRMaW5lJCArICJbT1dTdHJpbmddIgkJKyBjaHIkKDkpICsgIlJlY2lwaWVudCIJCQkJCSsgY2hyJCg5KSArICI9IHsiICsgY2hyJCg5KSArIHNSZWNpcGllbnQkCQkJCQkJKyAifSIgKyBjaHIkKDEzKQoJCXNPdXRMaW5lJCA9IHNPdXRMaW5lJCArICJbT1dTdHJpbmddIgkJKyBjaHIkKDkpICsgIlJlZmVyZW5jZXMiCQkJCSsgY2hyJCg5KSArICI9IHsiICsgY2hyJCg5KSArIHNSZWZlcmVuY2VzJAkJCQkJCSsgIn0iICsgY2hyJCgxMykKCQlzT3V0TGluZSQgPSBzT3V0TGluZSQgKyAiW09XU3RyaW5nXSIJCSsgY2hyJCg5KSArICJSZXBseVRvIgkJCQkJKyBjaHIkKDkpICsgIj0geyIgKyBjaHIkKDkpICsgc1JlcGx5VG8kCQkJCQkJCSsgIn0iICsgY2hyJCgxMykKCQlzT3V0TGluZSQgPSBzT3V0TGluZSQgKyAiW3NhbF9Cb29sXSIJCSsgY2hyJCg5KSArICJTYXZlR3JhcGhpY3NDb21wcmVzc2VkIgkrIGNociQoOSkgKyAiPSB7IiArIGNociQoOSkgKyBiU2F2ZUdyYXBoaWNzQ29tcHJlc3NlZAkJCSsgIn0iICsgY2hyJCgxMykKCQlzT3V0TGluZSQgPSBzT3V0TGluZSQgKyAiW3NhbF9Cb29sXSIJCSsgY2hyJCg5KSArICJTYXZlT3JpZ2luYWxHcmFwaGljcyIJCSsgY2hyJCg5KSArICI9IHsiICsgY2hyJCg5KSArIGJTYXZlT3JpZ2luYWxHcmFwaGljcwkJCQkrICJ9IiArIGNociQoMTMpCgkJc091dExpbmUkID0gc091dExpbmUkICsgIltzYWxfQm9vbF0iCQkrIGNociQoOSkgKyAiU2F2ZVZlcnNpb25PbkNsb3NlIgkJKyBjaHIkKDkpICsgIj0geyIgKyBjaHIkKDkpICsgYlNhdmVWZXJzaW9uT25DbG9zZQkJCQkrICJ9IiArIGNociQoMTMpCgkJc091dExpbmUkID0gc091dExpbmUkICsgIltPV1N0cmluZ10iCQkrIGNociQoOSkgKyAiVGVtcGxhdGUiCQkJCQkrIGNociQoOSkgKyAiPSB7IiArIGNociQoOSkgKyBzVGVtcGxhdGUkCQkJCQkJKyAifSIgKyBjaHIkKDEzKQoJCXNPdXRMaW5lJCA9IHNPdXRMaW5lJCArICJbc2FsX0Jvb2xdIgkJKyBjaHIkKDkpICsgIlRlbXBsYXRlQ29uZmlnIgkJCSsgY2hyJCg5KSArICI9IHsiICsgY2hyJCg5KSArIGJUZW1wbGF0ZUNvbmZpZwkJCQkJKyAifSIgKyBjaHIkKDEzKQoJCXNPdXRMaW5lJCA9IHNPdXRMaW5lJCArICJbRGF0ZVRpbWVdIgkJKyBjaHIkKDkpICsgIlRlbXBsYXRlRGF0ZSIJCQkJKyBjaHIkKDkpICsgIj0geyIgKyBjaHIkKDkpICsgRGF0ZVRpbWUyU3RyaW5nKGRUZW1wbGF0ZURhdGUpCSsgIn0iICsgY2hyJCgxMykKCQlzT3V0TGluZSQgPSBzT3V0TGluZSQgKyAiW09XU3RyaW5nXSIJCSsgY2hyJCg5KSArICJUZW1wbGF0ZUZpbGVOYW1lIgkJCSsgY2hyJCg5KSArICI9IHsiICsgY2hyJCg5KSArIHNUZW1wbGF0ZUZpbGVOYW1lJAkJCQkrICJ9IiArIGNociQoMTMpCgkJc091dExpbmUkID0gc091dExpbmUkICsgIltPV1N0cmluZ10iCQkrIGNociQoOSkgKyAiVGhlbWUiCQkJCQkJKyBjaHIkKDkpICsgIj0geyIgKyBjaHIkKDkpICsgc1RoZW1lJAkJCQkJCQkrICJ9IiArIGNociQoMTMpCgkJc091dExpbmUkID0gc091dExpbmUkICsgIltPV1N0cmluZ10iCQkrIGNociQoOSkgKyAiVGl0bGUiCQkJCQkJKyBjaHIkKDkpICsgIj0geyIgKyBjaHIkKDkpICsgc1RpdGxlJAkJCQkJCQkrICJ9IiArIGNociQoMTMpCgkJc091dExpbmUkID0gc091dExpbmUkICsgIltzYWxfQm9vbF0iCQkrIGNociQoOSkgKyAiVXNlckRhdGEiCQkJCQkrIGNociQoOSkgKyAiPSB7IiArIGNociQoOSkgKyBiVXNlckRhdGEJCQkJCQkJKyAifSIKCgkJJyBBdXNnYWJlIGRlciBmb3JtYXRpZXJ0ZW4gWmVpY2hlbmtldHRlCgkJSW5mb01lc3NhZ2UgKCBzT3V0TGluZSQgKQpFbmQgU3ViCgonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQonIEhpbGZzbWV0aG9kZTogWmVpZ3QgZGllIGFrdHVlbGxlbiBFbGVtZW50ZSBkZXMgTmFtZUNvbnRhaW5lcnMgYW4uCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClN1YiBTaG93TmFtZUNvbnRhaW5lciAoIGFEb2N1bWVudFByb3BlcnRpZXMgKQoKCQlpZiAoIGFEb2N1bWVudFByb3BlcnRpZXMuaGFzRWxlbWVudHMgKCkgPSBGQUxTRSApIHRoZW4KCQkJSW5mb01lc3NhZ2UgKCAiS2VpbmUgRWxlbWVudGUgaW0gTmFtZUNvbnRhaW5lciBlbnRoYWx0ZW4uIiApCgkJCUV4aXQgU3ViCgkJZW5kIGlmCgoJCWFOYW1lRmllbGQJCT0gYURvY3VtZW50UHJvcGVydGllcy5nZXRFbGVtZW50TmFtZXMgKCkKCQlpZiAoIElzQXJyYXkgKCBhTmFtZUZpZWxkICkgPSBGQUxTRSApIHRoZW4KCQkJRXJyb3JNZXNzYWdlICggImdldEVsZW1lbnROYW1lcygpIC4uLi4gRmVobGVyIChFcyBrb25udGUga2VpbmUgU2VxdWVuY2UgYmVzdGltbXQgd2VyZGVuISkiICkKCQkJRXhpdCBTdWIKCQllbmQgaWYKCQluRWxlbWVudENvdW50JQk9IFVCb3VuZCAoIGFOYW1lRmllbGQgKCkgKQoKCQlzdGVtcFN0cmluZyQgPSAiIgoJCWZvciBuQ291bnRlciU9MCB0byBuRWxlbWVudENvdW50JSBzdGVwIDEKCQkJc3RlbXBTdHJpbmckID0gIlsiICsgbkNvdW50ZXIlICsgIl0iCgkJCXN0ZW1wU3RyaW5nJCA9IHN0ZW1wU3RyaW5nJCArIGNociQoOSkgKyBhTmFtZUZpZWxkKG5Db3VudGVyJSkKCQkJc3RlbXBTdHJpbmckID0gc3RlbXBTdHJpbmckICsgY2hyJCg5KSArICI9IgoJCQlzdGVtcFN0cmluZyQgPSBzdGVtcFN0cmluZyQgKyBjaHIkKDkpICsgYURvY3VtZW50UHJvcGVydGllcy5nZXRCeU5hbWUgKCBhTmFtZUZpZWxkKG5Db3VudGVyJSkgKQoJCQlzdGVtcFN0cmluZyQgPSBzdGVtcFN0cmluZyQgKyBjaHIkKDEzKQoJCW5leHQgbkNvdW50ZXIlCgoJCUluZm9NZXNzYWdlICggc3RlbXBTdHJpbmckICkKCkVuZCBTdWIKCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCicgSGlsZnNmdW5rdGlvbjogRXJtaXR0ZWx0IGRpZSBBbnphaGwgZGVyIGltIE5hbWVDb250YWluZXIgZW50aGFsdGVuZW4gRWxlbWVudGUuCicKJyBSZXR1cm53ZXJ0ID0gQW56YWhsIGRlciBFbGVtZW50ZQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpGdW5jdGlvbiBnZXROYW1lQ29udGFpbmVyQ291bnQgKCBhRG9jdW1lbnRQcm9wZXJ0aWVzICkgYXMgTG9uZwoKCQlpZiAoIGFEb2N1bWVudFByb3BlcnRpZXMuaGFzRWxlbWVudHMgKCkgPSBGQUxTRSApIHRoZW4KCQkJZ2V0TmFtZUNvbnRhaW5lckNvdW50ID0gMAoJCQlFeGl0IEZ1bmN0aW9uCgkJZW5kIGlmCgoJCWFOYW1lRmllbGQJCT0gYURvY3VtZW50UHJvcGVydGllcy5nZXRFbGVtZW50TmFtZXMgKCkKCQluRWxlbWVudENvdW50JQk9IFVCb3VuZCAoIGFOYW1lRmllbGQgKCkgKQoJCQoJCScgRGEgZGllIFphZWhsdW5nIGJlaSAwIGJlZ2lubnQsIHVuZCBkZXIgZXJtaXR0ZWx0ZSBXZXJ0IGRpZSBvYmVyZSBHcmVuemUgZGFyc3RlbGx0LAoJCScgbXVzcyBoaWVyIGVpbmUgMSBkcmF1Zmdlc2NobGFnZW4gd2VyZGVuLgoJCWdldE5hbWVDb250YWluZXJDb3VudCA9IG5FbGVtZW50Q291bnQlICsgMQoKRW5kIEZ1bmN0aW9uCg==