PGhlYWQ+DQo8IS0tIFNUQVJUOiAiUGFkZGluZyBDb21tZW50IHNlY3Rpb24iIC0tPg0KICAgIDxzdHlsZT4NCiAgICAgICAgLnRleHQtY2VudGVyLnAtMi5mdy1ib2xkIHsNCiAgICAgICAgICAgIHBhZGRpbmc6IDAuMTVyZW0gIWltcG9ydGFudDsgLyogQm9vdHN0cmFwIHAtMSBlcXVpdmFsZW50ICovDQogICAgICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0ICFpbXBvcnRhbnQ7DQogICAgICAgIH0NCiAgICA8L3N0eWxlPg0KICAgIA0KICAgIDxzdHlsZT4NCi5hcnRpY2xlLWxpc3QtaXRlbS1jYXB0aW9uIHsNCiAgICBwYWRkaW5nOiAwLjI1cmVtICFpbXBvcnRhbnQ7IC8qIEVxdWl2YWxlbnQgdG8gQm9vdHN0cmFwJ3MgcC0xICovDQp9DQo8L3N0eWxlPg0KPCEtLSBFTkQ6ICJQYWRkaW5nIENvbW1lbnQgc2VjdGlvbiIgLS0+DQoNCjwhLS0gU1RBUlQ6ICJXaW5rZWx3YWdlbiIgLS0+DQo8c3R5bGU+DQouaW5wdXQtZ3JvdXAgew0KCWRpc3BsYXk6IG5vbmU7DQoJb3BhY2l0eTogMDsNCgl0cmFuc2l0aW9uOiBvcGFjaXR5IDAuNXMgZWFzZS1pbi1vdXQsIHRyYW5zZm9ybSAwLjVzIGVhc2UtaW4tb3V0Ow0KCXRyYW5zZm9ybTogdHJhbnNsYXRlWSgxMHB4KTsNCn0NCi5pbnB1dC1ncm91cC52aXNpYmxlIHsNCglkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7DQoJb3BhY2l0eTogMTsNCgl0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7DQp9DQo8L3N0eWxlPg0KDQo8c2NyaXB0Pg0KKGZ1bmN0aW9uKCkgew0KCWNvbnN0IENPTkZJRyA9IHsNCgkJdGFiSWQ6ICd0YWJBY2Nlc3NvcnlkNzhhYzgzOS01YzBiLTQxYTAtOWZiMS1lNDFiNDdjZjNmYzEnLA0KCQlpbnB1dEdyb3VwU2VsZWN0b3I6ICcuaW5wdXQtZ3JvdXAnLA0KCQl2aXNpYmlsaXR5RGlzcGxheTogJ2ZsZXgnDQoJfTsNCg0KCWZ1bmN0aW9uIGlzTW9udGFnZVRhYkFjdGl2ZSgpIHsNCgkJY29uc3QgdGFiID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoQ09ORklHLnRhYklkKTsNCgkJcmV0dXJuIHRhYiAmJiBnZXRDb21wdXRlZFN0eWxlKHRhYikuZGlzcGxheSAhPT0gJ25vbmUnICYmIHRhYi5jbGFzc0xpc3QuY29udGFpbnMoJ2FjdGl2ZScpOw0KCX0NCg0KCWZ1bmN0aW9uIHRvZ2dsZUlucHV0R3JvdXBWaXNpYmlsaXR5KCkgew0KCQljb25zdCBpbnB1dEdyb3VwID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihDT05GSUcuaW5wdXRHcm91cFNlbGVjdG9yKTsNCgkJaWYgKCFpbnB1dEdyb3VwKSByZXR1cm47DQoNCgkJaWYgKGlzTW9udGFnZVRhYkFjdGl2ZSgpKSB7DQoJCQlpbnB1dEdyb3VwLmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTsNCgkJfSBlbHNlIHsNCgkJCWlucHV0R3JvdXAuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpOw0KCQkJaW5wdXRHcm91cC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOyAvLyBmYWxsYmFjaw0KCQl9DQoJfQ0KDQoJZnVuY3Rpb24gb2JzZXJ2ZVRhYkNoYW5nZXMoKSB7DQoJCWNvbnN0IHRhYiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKENPTkZJRy50YWJJZCk7DQoJCWlmICghdGFiKSByZXR1cm47DQoNCgkJbmV3IE11dGF0aW9uT2JzZXJ2ZXIodG9nZ2xlSW5wdXRHcm91cFZpc2liaWxpdHkpLm9ic2VydmUodGFiLCB7DQoJCQlhdHRyaWJ1dGVzOiB0cnVlLA0KCQkJYXR0cmlidXRlRmlsdGVyOiBbJ2NsYXNzJywgJ3N0eWxlJ10NCgkJfSk7DQoJfQ0KDQoJZnVuY3Rpb24gb2JzZXJ2ZUlucHV0R3JvdXBJbmplY3Rpb24oKSB7DQoJCWNvbnN0IG9ic2VydmVyVGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNpdGUtYm9keS1pbm5lcicpIHx8IGRvY3VtZW50LmJvZHk7DQoNCgkJbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gew0KCQkJY29uc3QgaW5wdXRHcm91cCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoQ09ORklHLmlucHV0R3JvdXBTZWxlY3Rvcik7DQoJCQlpZiAoaW5wdXRHcm91cCkgew0KCQkJCXRvZ2dsZUlucHV0R3JvdXBWaXNpYmlsaXR5KCk7DQoJCQl9DQoJCX0pLm9ic2VydmUob2JzZXJ2ZXJUYXJnZXQsIHsNCgkJCWNoaWxkTGlzdDogdHJ1ZSwNCgkJCXN1YnRyZWU6IHRydWUNCgkJfSk7DQoJfQ0KDQoJZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uICgpIHsNCgkJb2JzZXJ2ZVRhYkNoYW5nZXMoKTsNCgkJb2JzZXJ2ZUlucHV0R3JvdXBJbmplY3Rpb24oKTsNCgkJdG9nZ2xlSW5wdXRHcm91cFZpc2liaWxpdHkoKTsNCgl9KTsNCn0pKCk7DQo8L3NjcmlwdD4NCjwhLS0gRU5EOiAiV2lua2Vsd2FnZW4iIC0tPg0KDQo8IS0tIFNUQVJUOiAiT3ZlcnppY2h0LWtub3AiIC0tPg0KPHN0eWxlPg0KLmJ0bi1vdXRsaW5lLXNlY29uZGFyeS5jb25maWd1cmF0b3ItYnRuLW92ZXJ2aWV3IHsNCglib3JkZXI6IDJweCBzb2xpZCBibGFjayAhaW1wb3J0YW50Ow0KCWNvbG9yOiBibGFjayAhaW1wb3J0YW50Ow0KCWJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7DQoJdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjNzIGVhc2UsIGNvbG9yIDAuM3MgZWFzZSwgYm9yZGVyLWNvbG9yIDAuM3MgZWFzZTsNCn0NCi5idG4tb3V0bGluZS1zZWNvbmRhcnkuY29uZmlndXJhdG9yLWJ0bi1vdmVydmlldyAuZmFzLA0KLmJ0bi1vdXRsaW5lLXNlY29uZGFyeS5jb25maWd1cmF0b3ItYnRuLW92ZXJ2aWV3IHNwYW4gew0KCWNvbG9yOiBibGFjayAhaW1wb3J0YW50Ow0KCXRyYW5zaXRpb246IGNvbG9yIDAuM3MgZWFzZTsNCn0NCi5idG4tb3V0bGluZS1zZWNvbmRhcnkuY29uZmlndXJhdG9yLWJ0bi1vdmVydmlldzpob3ZlciB7DQoJYmFja2dyb3VuZC1jb2xvcjogYmxhY2sgIWltcG9ydGFudDsNCgljb2xvcjogd2hpdGUgIWltcG9ydGFudDsNCglib3JkZXItY29sb3I6IGJsYWNrICFpbXBvcnRhbnQ7DQp9DQouYnRuLW91dGxpbmUtc2Vjb25kYXJ5LmNvbmZpZ3VyYXRvci1idG4tb3ZlcnZpZXc6aG92ZXIgLmZhcywNCi5idG4tb3V0bGluZS1zZWNvbmRhcnkuY29uZmlndXJhdG9yLWJ0bi1vdmVydmlldzpob3ZlciBzcGFuIHsNCgljb2xvcjogd2hpdGUgIWltcG9ydGFudDsNCn0NCjwvc3R5bGU+DQo8IS0tIEVORDogIk92ZXJ6aWNodC1rbm9wIiAtLT4NCg0KPCEtLSBTVEFSVDogIkluZm8ta25vcCIgLS0+DQo8c3R5bGU+DQouYnRuLW91dGxpbmUtc2Vjb25kYXJ5LmQtaW5saW5lW2RhdGEtYnMtdGFyZ2V0PSIjbW9kYWwtaGVscCJdIHsNCglib3JkZXI6IDJweCBzb2xpZCBibGFjayAhaW1wb3J0YW50Ow0KCWNvbG9yOiBibGFjayAhaW1wb3J0YW50Ow0KCWJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7DQoJdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjNzIGVhc2UsIGNvbG9yIDAuM3MgZWFzZSwgYm9yZGVyLWNvbG9yIDAuM3MgZWFzZTsNCn0NCi5idG4tb3V0bGluZS1zZWNvbmRhcnkuZC1pbmxpbmVbZGF0YS1icy10YXJnZXQ9IiNtb2RhbC1oZWxwIl0gLmZhcywNCi5idG4tb3V0bGluZS1zZWNvbmRhcnkuZC1pbmxpbmVbZGF0YS1icy10YXJnZXQ9IiNtb2RhbC1oZWxwIl0gc3BhbiB7DQoJY29sb3I6IGJsYWNrICFpbXBvcnRhbnQ7DQoJdHJhbnNpdGlvbjogY29sb3IgMC4zcyBlYXNlOw0KfQ0KLmJ0bi1vdXRsaW5lLXNlY29uZGFyeS5kLWlubGluZVtkYXRhLWJzLXRhcmdldD0iI21vZGFsLWhlbHAiXTpob3ZlciB7DQoJYmFja2dyb3VuZC1jb2xvcjogYmxhY2sgIWltcG9ydGFudDsNCgljb2xvcjogd2hpdGUgIWltcG9ydGFudDsNCglib3JkZXItY29sb3I6IGJsYWNrICFpbXBvcnRhbnQ7DQp9DQouYnRuLW91dGxpbmUtc2Vjb25kYXJ5LmQtaW5saW5lW2RhdGEtYnMtdGFyZ2V0PSIjbW9kYWwtaGVscCJdOmhvdmVyIC5mYXMsDQouYnRuLW91dGxpbmUtc2Vjb25kYXJ5LmQtaW5saW5lW2RhdGEtYnMtdGFyZ2V0PSIjbW9kYWwtaGVscCJdOmhvdmVyIHNwYW4gew0KCWNvbG9yOiB3aGl0ZSAhaW1wb3J0YW50Ow0KfQ0KPC9zdHlsZT4NCjwhLS0gRU5EOiAiSW5mby1rbm9wIiAtLT4NCg0KPCEtLSBTVEFSVDogIlRlcnVnLWtub3AiIC0tPg0KPHN0eWxlPg0KLmJ0bi1vdXRsaW5lLXNlY29uZGFyeS5jb25maWd1cmF0b3ItYnRuLWdvdG8gew0KCWJvcmRlcjogMnB4IHNvbGlkIGJsYWNrICFpbXBvcnRhbnQ7DQoJY29sb3I6IGJsYWNrICFpbXBvcnRhbnQ7DQoJYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsNCgl0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuM3MgZWFzZSwgY29sb3IgMC4zcyBlYXNlLCBib3JkZXItY29sb3IgMC4zcyBlYXNlOw0KfQ0KLmJ0bi1vdXRsaW5lLXNlY29uZGFyeS5jb25maWd1cmF0b3ItYnRuLWdvdG8gLmZhcywNCi5idG4tb3V0bGluZS1zZWNvbmRhcnkuY29uZmlndXJhdG9yLWJ0bi1nb3RvIHNwYW4gew0KCWNvbG9yOiBibGFjayAhaW1wb3J0YW50Ow0KCXRyYW5zaXRpb246IGNvbG9yIDAuM3MgZWFzZTsNCn0NCi5idG4tb3V0bGluZS1zZWNvbmRhcnkuY29uZmlndXJhdG9yLWJ0bi1nb3RvOmhvdmVyIHsNCgliYWNrZ3JvdW5kLWNvbG9yOiBibGFjayAhaW1wb3J0YW50Ow0KCWNvbG9yOiB3aGl0ZSAhaW1wb3J0YW50Ow0KCWJvcmRlci1jb2xvcjogYmxhY2sgIWltcG9ydGFudDsNCn0NCi5idG4tb3V0bGluZS1zZWNvbmRhcnkuY29uZmlndXJhdG9yLWJ0bi1nb3RvOmhvdmVyIC5mYXMsDQouYnRuLW91dGxpbmUtc2Vjb25kYXJ5LmNvbmZpZ3VyYXRvci1idG4tZ290bzpob3ZlciBzcGFuIHsNCgljb2xvcjogd2hpdGUgIWltcG9ydGFudDsNCn0NCjwvc3R5bGU+DQo8IS0tIEVORDogIlRlcnVnLWtub3AiIC0tPg0KDQo8IS0tIFNUQVJUOiAiUmVmcmVzaC1rbm9wIiAtLT4NCjxzdHlsZT4NCi5idG4tb3V0bGluZS1zZWNvbmRhcnlbZGF0YS1icy10YXJnZXQ9IiNtb2RhbFN3aXRjaGVkU2tldGNoIl0gew0KCWJvcmRlcjogMnB4IHNvbGlkIGJsYWNrICFpbXBvcnRhbnQ7DQoJY29sb3I6IGJsYWNrICFpbXBvcnRhbnQ7DQoJYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsNCgl0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuM3MgZWFzZSwgY29sb3IgMC4zcyBlYXNlLCBib3JkZXItY29sb3IgMC4zcyBlYXNlOw0KfQ0KLmJ0bi1vdXRsaW5lLXNlY29uZGFyeVtkYXRhLWJzLXRhcmdldD0iI21vZGFsU3dpdGNoZWRTa2V0Y2giXSAuZmFzLA0KLmJ0bi1vdXRsaW5lLXNlY29uZGFyeVtkYXRhLWJzLXRhcmdldD0iI21vZGFsU3dpdGNoZWRTa2V0Y2giXSBzcGFuIHsNCgljb2xvcjogYmxhY2sgIWltcG9ydGFudDsNCgl0cmFuc2l0aW9uOiBjb2xvciAwLjNzIGVhc2U7DQp9DQouYnRuLW91dGxpbmUtc2Vjb25kYXJ5W2RhdGEtYnMtdGFyZ2V0PSIjbW9kYWxTd2l0Y2hlZFNrZXRjaCJdOmhvdmVyIHsNCgliYWNrZ3JvdW5kLWNvbG9yOiBibGFjayAhaW1wb3J0YW50Ow0KCWNvbG9yOiB3aGl0ZSAhaW1wb3J0YW50Ow0KCWJvcmRlci1jb2xvcjogYmxhY2sgIWltcG9ydGFudDsNCn0NCi5idG4tb3V0bGluZS1zZWNvbmRhcnlbZGF0YS1icy10YXJnZXQ9IiNtb2RhbFN3aXRjaGVkU2tldGNoIl06aG92ZXIgLmZhcywNCi5idG4tb3V0bGluZS1zZWNvbmRhcnlbZGF0YS1icy10YXJnZXQ9IiNtb2RhbFN3aXRjaGVkU2tldGNoIl06aG92ZXIgc3BhbiB7DQoJY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7DQp9DQo8L3N0eWxlPg0KPCEtLSBFTkQ6ICJSZWZyZXNoLWtub3AiIC0tPg0KDQo8IS0tIFNUQVJUOiAiR3JvZXBza25vcHBlbiIgLS0+DQo8c3R5bGU+DQovKiBBbGdlbWVuZSBvdXRsaW5lLXN0aWpsIHZvb3IgLmdyb3VwQnV0dG9uIGtub3BwZW4gKi8NCi5ncm91cEJ1dHRvbi5idG4tb3V0bGluZS1zZWNvbmRhcnkgew0KCWJvcmRlcjogMnB4IHNvbGlkIGJsYWNrICFpbXBvcnRhbnQ7DQoJY29sb3I6IGJsYWNrICFpbXBvcnRhbnQ7DQoJYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsNCgl0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuM3MgZWFzZSwgY29sb3IgMC4zcyBlYXNlLCBib3JkZXItY29sb3IgMC4zcyBlYXNlOw0KfQ0KDQovKiBIb3Zlci1lZmZlY3Q6IHp3YXJ0IG1ldCB3aXR0ZSB0ZWtzdCAqLw0KLmdyb3VwQnV0dG9uLmJ0bi1vdXRsaW5lLXNlY29uZGFyeTpob3ZlciB7DQoJYmFja2dyb3VuZC1jb2xvcjogYmxhY2sgIWltcG9ydGFudDsNCgljb2xvcjogd2hpdGUgIWltcG9ydGFudDsNCglib3JkZXItY29sb3I6IGJsYWNrICFpbXBvcnRhbnQ7DQp9DQoNCi8qIFpvcmcgZGF0IHRla3N0IGJpbm5lbiBkZSBrbm9wIG9vayBrbGV1cnQgKHNvbXMgc3Bhbi1sb29zKSAqLw0KLmdyb3VwQnV0dG9uLmJ0bi1vdXRsaW5lLXNlY29uZGFyeTpob3ZlciAqIHsNCgljb2xvcjogd2hpdGUgIWltcG9ydGFudDsNCn0NCg0KLyogQWxzIHUgb29pdCBpY29uZW4gem91IHRvZXZvZWdlbiBiaW5uZW4gLmdyb3VwQnV0dG9uICovDQouZ3JvdXBCdXR0b24gLmZhcywNCi5ncm91cEJ1dHRvbiBzcGFuIHsNCgl0cmFuc2l0aW9uOiBjb2xvciAwLjNzIGVhc2U7DQoJY29sb3I6IGJsYWNrICFpbXBvcnRhbnQ7DQp9DQoNCi5ncm91cEJ1dHRvbjpob3ZlciAuZmFzLA0KLmdyb3VwQnV0dG9uOmhvdmVyIHNwYW4gew0KCWNvbG9yOiB3aGl0ZSAhaW1wb3J0YW50Ow0KfQ0KDQovKiBPcHRpb25lZWw6IC5idG4tc2Vjb25kYXJ5ICh6b2FscyBkZSAnV2l0JyBrbm9wKSBzdGlqbCBvb2sgdXBkYXRlbiAqLw0KLmdyb3VwQnV0dG9uLmJ0bi1zZWNvbmRhcnkgew0KCWJvcmRlcjogMnB4IHNvbGlkIGJsYWNrICFpbXBvcnRhbnQ7DQoJYmFja2dyb3VuZC1jb2xvcjogYmxhY2sgIWltcG9ydGFudDsNCgljb2xvcjogd2hpdGUgIWltcG9ydGFudDsNCn0NCg0KLmdyb3VwQnV0dG9uLmJ0bi1zZWNvbmRhcnk6aG92ZXIgew0KCWJhY2tncm91bmQtY29sb3I6ICMyMjIgIWltcG9ydGFudDsNCglib3JkZXItY29sb3I6IGJsYWNrICFpbXBvcnRhbnQ7DQoJY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7DQp9DQo8L3N0eWxlPg0KPCEtLSBFTkQ6ICJHcm9lcHNrbm9wcGVuIiAtLT4NCg0KPCEtLSBTVEFSVDogIldhY2h0d29vcmQgdmVyZ2V0ZW4/IiAtLT4NCjxzY3JpcHQ+DQpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24gKCkgew0KICBjb25zdCBoMSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2gxJyk7DQogIGlmIChoMSAmJiBoMS50ZXh0Q29udGVudC50cmltKCkgPT09ICJQYXNzd29ydCB2ZXJnZXNzZW4/Iikgew0KICAgIGgxLnRleHRDb250ZW50ID0gIldhY2h0d29vcmQgd2lqemlnZW4iOw0KICB9DQp9KTsNCjwvc2NyaXB0Pg0KPCEtLSBFTkQ6ICJXYWNodHdvb3JkIHZlcmdldGVuPyIgLS0+DQoNCjwhLS0gU1RBUlQ6ICJPcHRpb25lbGUgZGllbnN0ZW4gZW4gYWNjZXNzb2lyZXMiIC0tPg0KPHNjcmlwdD4NCmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbiAoKSB7DQogIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gew0KICAgIGNvbnN0IGhlYWRlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2gyLmh5cGhlbmF0ZS5kLWlubGluZScpOw0KICAgIA0KICAgIGlmIChoZWFkZXIgJiYgaGVhZGVyLnRleHRDb250ZW50LnRyaW0oKSA9PT0gIk9wdGlvbmVsZSBkaWVuc3RlbiBlbiBhY2Nlc3NvaXJlcyIpIHsNCiAgICAgIGNvbnN0IGFscmVhZHlFeGlzdHMgPSBoZWFkZXIubmV4dEVsZW1lbnRTaWJsaW5nPy5jbGFzc0xpc3Q/LmNvbnRhaW5zKCdzdWJ0aXRsZS1pbmZvJyk7DQogICAgICBpZiAoIWFscmVhZHlFeGlzdHMpIHsNCiAgICAgICAgY29uc3QgaW5mbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInAiKTsNCiAgICAgICAgaW5mby50ZXh0Q29udGVudCA9ICJIaWVyIHppZXQgdSBlZW4gb3ZlcnppY2h0IHZhbiBhbGxlIGFhbnZ1bGxlbmRlIGRpZW5zdGVuLCBhY2Nlc3NvaXJlcyBlbiBvcHRpb25lbGUgb25kZXJkZWxlbiBkaWUgdSBoZWVmdCBnZXNlbGVjdGVlcmQgdm9vciB1dyBodWlkaWdlIGNvbmZpZ3VyYXRpZS4gRGV6ZSBrZXV6ZXMgemlqbiBhYW52dWxsZW5kIG9wIHV3IGJhc2lzcHJvZHVjdCBlbiB2b3JtZW4gc2FtZW4gZGUgY29tcGxldGUgc2FtZW5zdGVsbGluZyB2YW4gdXcgYmVzdGVsbGluZy4gVSBrdW50IGhpZXIgbm9nIHdpanppZ2luZ2VuIGFhbmJyZW5nZW4gb2YgYWFudnVsbGVuZGUgb3B0aWVzIHRvZXZvZWdlbiBlbiB2ZXJ3aWpkZXJlbi4iOw0KICAgICAgICBpbmZvLmNsYXNzTmFtZSA9ICJzdWJ0aXRsZS1pbmZvIjsNCiAgICAgICAgaW5mby5zdHlsZS5tYXJnaW5Ub3AgPSAiMC4yNXJlbSI7DQogICAgICAgIGluZm8uc3R5bGUuZm9udFNpemUgPSAiMC45NXJlbSI7DQogICAgICAgIGluZm8uc3R5bGUuY29sb3IgPSAiIzY2NiI7DQogICAgICAgIGhlYWRlci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShpbmZvLCBoZWFkZXIubmV4dFNpYmxpbmcpOw0KICAgICAgfQ0KICAgIH0NCiAgfSk7DQoNCiAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7DQogICAgY2hpbGRMaXN0OiB0cnVlLA0KICAgIHN1YnRyZWU6IHRydWUNCiAgfSk7DQp9KTsNCjwvc2NyaXB0Pg0KPCEtLSBFTkQ6ICJPcHRpb25lbGUgZGllbnN0ZW4gZW4gYWNjZXNzb2lyZXMiIC0tPg0KDQo8IS0tIFNUQVJUOiAiTW9udGFnZSBkZXNjcmlwdGlvbiIgLS0+DQo8c2NyaXB0Pg0KZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uICgpIHsNCiAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7DQogICAgY29uc3QgYWxsUGFyYWdyYXBocyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3AnKTsNCiAgICBmb3IgKGNvbnN0IHAgb2YgYWxsUGFyYWdyYXBocykgew0KICAgICAgaWYgKHAudGV4dENvbnRlbnQudHJpbSgpID09PSAiTW9udGFnZSIpIHsNCiAgICAgICAgLy8gVmVybWlqZCBkdWJiZWxlIHdpanppZ2luZw0KICAgICAgICBpZiAoIXAuY2xhc3NMaXN0LmNvbnRhaW5zKCJtb250YWdlLXAtcmVwbGFjZWQiKSkgew0KICAgICAgICAgIHAudGV4dENvbnRlbnQgPSAiU2VsZWN0ZWVyIG9mIHUgZGUgbW9udGFnZSBkb29yIG9ucyB3aWx0IGxhdGVuIHVpdHZvZXJlbiBvZiBkZXplIGxpZXZlciB6ZWxmIHJlZ2VsdC4gVSBrdW50IGhpZXJpbiB2b2xsZWRpZyB2cmlqIGtpZXplbiwgZXZlbnR1ZWxlIGtvc3RlbiB3b3JkZW4gdm9vcmFmIGR1aWRlbGlqayB3ZWVyZ2VnZXZlbi4iOw0KICAgICAgICAgIHAuY2xhc3NMaXN0LmFkZCgibW9udGFnZS1wLXJlcGxhY2VkIik7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogIH0pOw0KDQogIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSwgew0KICAgIGNoaWxkTGlzdDogdHJ1ZSwNCiAgICBzdWJ0cmVlOiB0cnVlDQogIH0pOw0KfSk7DQo8L3NjcmlwdD4NCjwhLS0gRU5EOiAiTW9udGFnZSBkZXNjcmlwdGlvbiIgLS0+DQoNCjwhLS0gU1RBUlQ6ICJNb250YWdlIHRpdGxlIiAtLT4NCjxzY3JpcHQ+DQpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24gKCkgew0KICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsNCiAgICBjb25zdCBtb250YWdlSGVhZGVycyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2gzJyk7DQoNCiAgICBtb250YWdlSGVhZGVycy5mb3JFYWNoKGgzID0+IHsNCiAgICAgIGlmIChoMy50ZXh0Q29udGVudC50cmltKCkgPT09ICJNb250YWdlIiAmJiAhaDMuY2xhc3NMaXN0LmNvbnRhaW5zKCJtb250YWdlLWgzLXJlcGxhY2VkIikpIHsNCiAgICAgICAgaDMudGV4dENvbnRlbnQgPSAiWmVsZiBtb250ZXJlbiBvZiBsYXRlbiBkb2VuPyI7DQogICAgICAgIGgzLmNsYXNzTGlzdC5hZGQoIm1vbnRhZ2UtaDMtcmVwbGFjZWQiKTsNCiAgICAgIH0NCiAgICB9KTsNCiAgfSk7DQoNCiAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7DQogICAgY2hpbGRMaXN0OiB0cnVlLA0KICAgIHN1YnRyZWU6IHRydWUNCiAgfSk7DQp9KTsNCjwvc2NyaXB0Pg0KPCEtLSBFTkQ6ICJNb250YWdlIHRpdGxlIiAtLT4NCg0KPCEtLSBTVEFSVDogIlByb2R1Y3R2YXJpYW50IGRlc2NyaXB0aW9uIiAtLT4NCjxzY3JpcHQ+DQpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24gKCkgew0KICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsNCiAgICBjb25zdCBoZWFkZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdoMi5oeXBoZW5hdGUuZC1pbmxpbmUnKTsNCg0KICAgIGlmIChoZWFkZXIgJiYgaGVhZGVyLnRleHRDb250ZW50LnRyaW0oKSA9PT0gIlByb2R1Y3R2YXJpYW50Iikgew0KICAgICAgY29uc3QgYWxyZWFkeUV4aXN0cyA9IGhlYWRlci5uZXh0RWxlbWVudFNpYmxpbmc/LmNsYXNzTGlzdD8uY29udGFpbnMoJ3N1YnRpdGxlLXByb2R1Y3R2YXJpYW50Jyk7DQogICAgICBpZiAoIWFscmVhZHlFeGlzdHMpIHsNCiAgICAgICAgY29uc3QgaW5mbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInAiKTsNCiAgICAgICAgaW5mby50ZXh0Q29udGVudCA9ICJTZWxlY3RlZXIgaGllciBoZXQgdHlwZSByYWFtIG9mIGRldXIgZGF0IHUgd2lsdCBzYW1lbnN0ZWxsZW4uIFUga3VudCBraWV6ZW4gdWl0IHZlcnNjaGlsbGVuZGUgdmFyaWFudGVuLCB6b2FscyBlZW4gc3RhbmRhYXJkIHJhYW0sIHZvb3JkZXVyLCBhY2h0ZXJkZXVyIG9mIHNjaHVpZmRldXIuIERlemUga2V1emUgdm9ybXQgZGUgYmFzaXMgdm9vciBkZSB2ZXJkZXJlIGNvbmZpZ3VyYXRpZSB2YW4gdXcgcHJvZHVjdCwgd2FhcmJpaiBhZm1ldGluZ2VuLCBmdW5jdGllcyBlbiBlc3RoZXRpc2NoZSBvcHRpZXMgd29yZGVuIGFmZ2VzdGVtZCBvcCB1dyB2b29ya2V1cmVuIGVuIHdvb25zaXR1YXRpZS4iOw0KICAgICAgICBpbmZvLmNsYXNzTmFtZSA9ICJzdWJ0aXRsZS1wcm9kdWN0dmFyaWFudCI7DQogICAgICAgIGluZm8uc3R5bGUubWFyZ2luVG9wID0gIjAuMjVyZW0iOw0KICAgICAgICBpbmZvLnN0eWxlLmZvbnRTaXplID0gIjAuOTVyZW0iOw0KICAgICAgICBpbmZvLnN0eWxlLmNvbG9yID0gIiM2NjYiOw0KICAgICAgICBoZWFkZXIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaW5mbywgaGVhZGVyLm5leHRTaWJsaW5nKTsNCiAgICAgIH0NCiAgICB9DQogIH0pOw0KDQogIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSwgew0KICAgIGNoaWxkTGlzdDogdHJ1ZSwNCiAgICBzdWJ0cmVlOiB0cnVlDQogIH0pOw0KfSk7DQo8L3NjcmlwdD4NCjwhLS0gRU5EOiAiUHJvZHVjdHZhcmlhbnQgZGVzY3JpcHRpb24iIC0tPg0KDQo8IS0tIFNUQVJUOiAiUHJvZHVjdHZhcmlhbnQgSW5mby1Cb3ggKEhJREUpIiAtLT4NCjxzY3JpcHQ+DQpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24gKCkgew0KICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsNCiAgICBjb25zdCBoZWFkZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdoMi5oeXBoZW5hdGUuZC1pbmxpbmUnKTsNCg0KICAgIGlmIChoZWFkZXIgJiYgaGVhZGVyLnRleHRDb250ZW50LnRyaW0oKSA9PT0gIlByb2R1Y3R2YXJpYW50Iikgew0KICAgICAgY29uc3QgY29udGFpbmVyID0gaGVhZGVyLmNsb3Nlc3QoJy5jb2wtYXV0by5tYi0yJyk7DQogICAgICBpZiAoY29udGFpbmVyKSB7DQogICAgICAgIGNvbnN0IGJ1dHRvbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdidXR0b25bZGF0YS1icy10YXJnZXQ9IiNtb2RhbC1oZWxwIl0nKTsNCiAgICAgICAgaWYgKGJ1dHRvbiAmJiBidXR0b24uZ2V0QXR0cmlidXRlKCdkYXRhLWJzLWNvbnRlbnQnKSA9PT0gIlByb2R1Y3QlMjB2YXJpYW50Iikgew0KICAgICAgICAgIGJ1dHRvbi5yZW1vdmUoKTsgLy8gVkVSV0lKREVSVCBkZSBrbm9wIHZvbGxlZGlnIHVpdCBkZSBET00NCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgfSk7DQoNCiAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7DQogICAgY2hpbGRMaXN0OiB0cnVlLA0KICAgIHN1YnRyZWU6IHRydWUNCiAgfSk7DQp9KTsNCjwvc2NyaXB0Pg0KPHN0eWxlPg0KLm1iLTIgew0KICBtYXJnaW4tYm90dG9tOiAwLjAxcmVtICFpbXBvcnRhbnQ7DQp9DQo8L3N0eWxlPg0KPCEtLSAiRU5EOiBQcm9kdWN0dmFyaWFudCBJbmZvLUJveCAoSElERSkiIC0tPg0KDQo8IS0tIFNUQVJUOiAiTWF0ZXJpYWFsc29vcnQgZGVzY3JpcHRpb24iIC0tPg0KPHN0eWxlPg0KLnN1YnRpdGxlLW1hdGVyaWFhbHNvb3J0IHsNCiAgbWFyZ2luLXRvcDogMC4yNXJlbTsNCiAgZm9udC1zaXplOiAwLjk1cmVtOw0KICBjb2xvcjogIzY2NjsNCiAgbWF4LXdpZHRoOiA3MjBweDsNCn0NCjwvc3R5bGU+DQoNCjxzY3JpcHQ+DQpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24gKCkgew0KICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsNCiAgICBjb25zdCBoZWFkZXJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaDIuaHlwaGVuYXRlLmQtaW5saW5lJyk7DQoNCiAgICBoZWFkZXJzLmZvckVhY2goaGVhZGVyID0+IHsNCiAgICAgIGlmIChoZWFkZXIudGV4dENvbnRlbnQudHJpbSgpID09PSAiTWF0ZXJpYWFsc29vcnQiKSB7DQogICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGhlYWRlci5jbG9zZXN0KCcuY29sLWF1dG8ubWItMicpOw0KICAgICAgICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuOw0KDQogICAgICAgIGNvbnN0IGFscmVhZHlFeGlzdHMgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignLnN1YnRpdGxlLW1hdGVyaWFhbHNvb3J0Jyk7DQogICAgICAgIGlmICghYWxyZWFkeUV4aXN0cykgew0KICAgICAgICAgIC8vIEVlcnN0ZSBwYXJhZ3JhYWYgbWV0IHVpdGxlZw0KICAgICAgICAgIGNvbnN0IHBhcmFncmFwaCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInAiKTsNCiAgICAgICAgICBwYXJhZ3JhcGguY2xhc3NOYW1lID0gInN1YnRpdGxlLW1hdGVyaWFhbHNvb3J0IjsNCiAgICAgICAgICBwYXJhZ3JhcGgudGV4dENvbnRlbnQgPSAiR2VlZiBoaWVyIGFhbiB3ZWxrIG1hdGVyaWFhbHR5cGUgdXcgdm9vcmtldXIgaGVlZnQgdm9vciB1dyByYWFtIG9mIGRldXIuIFUgaGVlZnQgZGUga2V1emUgdWl0IGhvb2d3YWFyZGlnZSBrdW5zdHN0b2Ygb2Ygcm9idXVzdCBhbHVtaW5pdW0uIEt1bnN0c3RvZiBzdGFhdCBiZWtlbmQgb20gemlqbiB1aXRzdGVrZW5kZSBpc29sYXRpZXdhYXJkZSwgb25kZXJob3Vkc3ZyaWVuZGVsaWpraGVpZCBlbiBndW5zdGlnZSBwcmlqcy1rd2FsaXRlaXR2ZXJob3VkaW5nLiBBbHVtaW5pdW0gZGFhcmVudGVnZW4gYmllZHQgZWVuIG1vZGVybmUgdWl0c3RyYWxpbmcsIHNsYW5rZSBwcm9maWVsZW4gZW4gdWl0em9uZGVybGlqa2UgZHV1cnphYW1oZWlkLiBCZWlkZSBvcHRpZXMgaGViYmVuIHVuaWVrZSB2b29yZGVsZW4sIGFmaGFua2VsaWprIHZhbiB1dyBlc3RoZXRpc2NoZSB2b29ya2V1cmVuIGVuIGZ1bmN0aW9uZWxlIHdlbnNlbi4iOw0KICAgICAgICAgIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUocGFyYWdyYXBoLCBoZWFkZXIubmV4dFNpYmxpbmcpOw0KDQogICAgICAgICAgLy8gVHdlZWRlIHBhcmFncmFhZiBtZXQgSW5mb3JtYXRpZSwgaW4gZGV6ZWxmZGUgc3RpamwNCiAgICAgICAgICBjb25zdCBpbmZvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicCIpOw0KICAgICAgICAgIGluZm8uY2xhc3NOYW1lID0gInN1YnRpdGxlLW1hdGVyaWFhbHNvb3J0IjsNCiAgICAgICAgICBpbmZvLmlubmVySFRNTCA9ICI8Yj5JbmZvcm1hdGllOjwvYj48YnI+T3AgZGl0IG1vbWVudCBpcyBhbGxlZW4ga3Vuc3RzdG9mIGJlc2NoaWtiYWFyIGFscyBtYXRlcmlhYWxzb29ydC48YnI+QWx1bWluaXVtIHphbCBvcCBlZW4gbGF0ZXIgbW9tZW50IHdvcmRlbiB0b2VnZXZvZWdkLiI7DQogICAgICAgICAgY29udGFpbmVyLmluc2VydEJlZm9yZShpbmZvLCBwYXJhZ3JhcGgubmV4dFNpYmxpbmcpOw0KICAgICAgICB9DQogICAgICB9DQogICAgfSk7DQogIH0pOw0KDQogIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSwgew0KICAgIGNoaWxkTGlzdDogdHJ1ZSwNCiAgICBzdWJ0cmVlOiB0cnVlDQogIH0pOw0KfSk7DQo8L3NjcmlwdD4NCjwhLS0gRU5EOiAiTWF0ZXJpYWFsc29vcnQgZGVzY3JpcHRpb24iIC0tPg0KDQoNCjwhLS0gU1RBUlQ6ICJEZWxldGUgaW5mby1ib3giIC0tPg0KPHN0eWxlPg0KLnN1YnRpdGxlLW1hdGVyaWFhbHNvb3J0IHsNCiAgbWFyZ2luLXRvcDogMC4yNXJlbTsNCiAgZm9udC1zaXplOiAwLjk1cmVtOw0KICBjb2xvcjogIzY2NjsNCiAgbWF4LXdpZHRoOiA3MjBweDsNCn0NCjwvc3R5bGU+DQoNCjxzY3JpcHQ+DQpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24gKCkgew0KICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsNCiAgICBjb25zdCBoZWFkZXJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaDIuaHlwaGVuYXRlLmQtaW5saW5lJyk7DQoNCiAgICBoZWFkZXJzLmZvckVhY2goaGVhZGVyID0+IHsNCiAgICAgIGlmIChoZWFkZXIudGV4dENvbnRlbnQudHJpbSgpID09PSAiTWF0ZXJpYWFsc29vcnQiKSB7DQogICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGhlYWRlci5jbG9zZXN0KCcuY29sLWF1dG8ubWItMicpOw0KICAgICAgICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuOw0KDQogICAgICAgIC8vIFZlcndpamRlciBkZSBrbm9wIGFscyBoaWogYWFud2V6aWcgaXMNCiAgICAgICAgY29uc3QgaW5mb0J1dHRvbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdidXR0b25bZGF0YS1icy10YXJnZXQ9IiNtb2RhbC1oZWxwIl1bZGF0YS1icy1jb250ZW50PSJNYXRlcmlhbCJdJyk7DQogICAgICAgIGlmIChpbmZvQnV0dG9uKSB7DQogICAgICAgICAgaW5mb0J1dHRvbi5yZW1vdmUoKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIFZvZWcgdWl0bGVncGFyYWdyYWFmIHRvZSBhbHMgZGllIG5vZyBuaWV0IGJlc3RhYXQNCiAgICAgICAgY29uc3QgYWxyZWFkeUV4aXN0cyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcuc3VidGl0bGUtbWF0ZXJpYWFsc29vcnQnKTsNCiAgICAgICAgaWYgKCFhbHJlYWR5RXhpc3RzKSB7DQogICAgICAgICAgY29uc3QgcGFyYWdyYXBoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicCIpOw0KICAgICAgICAgIHBhcmFncmFwaC5jbGFzc05hbWUgPSAic3VidGl0bGUtbWF0ZXJpYWFsc29vcnQiOw0KICAgICAgICAgIHBhcmFncmFwaC50ZXh0Q29udGVudCA9ICJHZWVmIGhpZXIgYWFuIHdlbGsgbWF0ZXJpYWFsdHlwZSB1dyB2b29ya2V1ciBoZWVmdCB2b29yIHV3IHJhYW0gb2YgZGV1ci4gVSBoZWVmdCBkZSBrZXV6ZSB1aXQgaG9vZ3dhYXJkaWdlIGt1bnN0c3RvZiBvZiByb2J1dXN0IGFsdW1pbml1bS4gS3Vuc3RzdG9mIHN0YWF0IGJla2VuZCBvbSB6aWpuIHVpdHN0ZWtlbmRlIGlzb2xhdGlld2FhcmRlLCBvbmRlcmhvdWRzdnJpZW5kZWxpamtoZWlkIGVuIGd1bnN0aWdlIHByaWpzLWt3YWxpdGVpdHZlcmhvdWRpbmcuIEFsdW1pbml1bSBkYWFyZW50ZWdlbiBiaWVkdCBlZW4gbW9kZXJuZSB1aXRzdHJhbGluZywgc2xhbmtlIHByb2ZpZWxlbiBlbiB1aXR6b25kZXJsaWprZSBkdXVyemFhbWhlaWQuIEJlaWRlIG9wdGllcyBoZWJiZW4gdW5pZWtlIHZvb3JkZWxlbiwgYWZoYW5rZWxpamsgdmFuIHV3IGVzdGhldGlzY2hlIHZvb3JrZXVyZW4gZW4gZnVuY3Rpb25lbGUgd2Vuc2VuLiI7DQogICAgICAgICAgY29udGFpbmVyLmluc2VydEJlZm9yZShwYXJhZ3JhcGgsIGhlYWRlci5uZXh0U2libGluZyk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9KTsNCiAgfSk7DQoNCiAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7DQogICAgY2hpbGRMaXN0OiB0cnVlLA0KICAgIHN1YnRyZWU6IHRydWUNCiAgfSk7DQp9KTsNCjwvc2NyaXB0Pg0KPCEtLSBFTkQ6ICJEZWxldGUgaW5mby1ib3giIC0tPg0KDQo8IS0tIFNUQVJUOiAiU3lzdGVlbXZhcmlhbnQgZGVzY3JpcHRpb24iIC0tPg0KPHN0eWxlPg0KLnN1YnRpdGxlLXN5c3RlZW12YXJpYW50IHsNCiAgbWFyZ2luLXRvcDogMC4yNXJlbTsNCiAgZm9udC1zaXplOiAwLjk1cmVtOw0KICBjb2xvcjogIzY2NjsNCiAgbWF4LXdpZHRoOiA3MjBweDsNCn0NCjwvc3R5bGU+DQoNCjxzY3JpcHQ+DQpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24gKCkgew0KICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsNCiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdoMi5oeXBoZW5hdGUuZC1pbmxpbmUnKS5mb3JFYWNoKGhlYWRlciA9PiB7DQogICAgICBpZiAoaGVhZGVyLnRleHRDb250ZW50LnRyaW0oKSA9PT0gIlN5c3RlZW12YXJpYW50Iikgew0KICAgICAgICBjb25zdCBjb250YWluZXIgPSBoZWFkZXIuY2xvc2VzdCgnLmNvbC1hdXRvLm1iLTInKTsNCiAgICAgICAgaWYgKCFjb250YWluZXIpIHJldHVybjsNCg0KICAgICAgICAvLyBWZXJ3aWpkZXIgZGUgaW5mb2tub3ANCiAgICAgICAgY29uc3QgaW5mb0J0biA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdidXR0b25bZGF0YS1icy10YXJnZXQ9IiNtb2RhbC1oZWxwIl1bZGF0YS1icy1jb250ZW50PSJTeXN0ZW0lMjB2YXJpYW50Il0nKTsNCiAgICAgICAgaWYgKGluZm9CdG4pIHsNCiAgICAgICAgICBpbmZvQnRuLnJlbW92ZSgpOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8gVm9lZyB1aXRsZWcgdG9lIGFscyBkaWUgbm9nIG5pZXQgYmVzdGFhdA0KICAgICAgICBjb25zdCBhbHJlYWR5RXhpc3RzID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5zdWJ0aXRsZS1zeXN0ZWVtdmFyaWFudCcpOw0KICAgICAgICBpZiAoIWFscmVhZHlFeGlzdHMpIHsNCiAgICAgICAgICBjb25zdCBwYXJhZ3JhcGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwIik7DQogICAgICAgICAgcGFyYWdyYXBoLmNsYXNzTmFtZSA9ICJzdWJ0aXRsZS1zeXN0ZWVtdmFyaWFudCI7DQogICAgICAgICAgcGFyYWdyYXBoLnRleHRDb250ZW50ID0gIktpZXMgaGllciBkZSBzeXN0ZWVtdmFyaWFudCBkaWUgcGFzdCBiaWogdXcgZ2V3ZW5zdGUga296aWpub3Bsb3NzaW5nLiBBZmhhbmtlbGlqayB2YW4gaGV0IGdla296ZW4gbWF0ZXJpYWFsdHlwZSwga3Vuc3RzdG9mIG9mIGFsdW1pbml1bSBiaWVkZW4gd2lqIHZlcnNjaGlsbGVuZGUgcHJvZmllbHN5c3RlbWVuIGFhbiBtZXQgZWxrIGh1biBlaWdlbiBmdW5jdGlvbmVsZSBlbiBlc3RoZXRpc2NoZSBrZW5tZXJrZW4uIFV3IGtldXplIGhlZWZ0IGludmxvZWQgb3AgZGUgdm9ybWdldmluZywgZGUgdGVjaG5pc2NoZSBzcGVjaWZpY2F0aWVzIGVuIGhldCBjb21mb3J0bml2ZWF1IHZhbiB1dyBlaW5kcHJvZHVjdC4gV2UgYWR2aXNlcmVuIHUgZWVuIHN5c3RlZW0gdGUgc2VsZWN0ZXJlbiBkYXQgem93ZWwgYWFuc2x1aXQgYmlqIHV3IGJvdXdzaXR1YXRpZSBhbHMgdXcgcGVyc29vbmxpamtlIHZvb3JrZXVyZW4gb3AgaGV0IGdlYmllZCB2YW4gZGVzaWduLCBwcmVzdGF0aWVzIGVuIGdlYnJ1aWtzZ2VtYWsuIjsNCiAgICAgICAgICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKHBhcmFncmFwaCwgaGVhZGVyLm5leHRTaWJsaW5nKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0pOw0KICB9KTsNCg0KICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHsNCiAgICBjaGlsZExpc3Q6IHRydWUsDQogICAgc3VidHJlZTogdHJ1ZQ0KICB9KTsNCn0pOw0KPC9zY3JpcHQ+DQo8IS0tIEVORDogIlN5c3RlZW12YXJpYW50IGRlc2NyaXB0aW9uIiAtLT4NCg0KPCEtLSBTVEFSVDogUHJvZmllbHN5c3RlZW0gKyBTdGFuZGFhcmQgKyBIVkwgcG9wdXBzIC0tPg0KPCEtLSBGb250IEF3ZXNvbWUgKHZvb3IgaW5mby1pY29vbikgLS0+DQo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2ZvbnQtYXdlc29tZS82LjUuMC9jc3MvYWxsLm1pbi5jc3MiIGludGVncml0eT0ic2hhNTEyLVpKVUZrVDV5UDNuVTZOMW1ZMXRybllKeFh2K0VqUGxIdFZ0TEQ5VU9aRFkyTFVWM09rNUNVK3Q4UEs4UGZzVHg3d24zajdmVUkzRkc5WThTNkNLSTdBPT0iIGNyb3Nzb3JpZ2luPSJhbm9ueW1vdXMiIHJlZmVycmVycG9saWN5PSJuby1yZWZlcnJlciIgLz4NCg0KPHN0eWxlPg0KLnN1YnRpdGxlLXByb2ZpZWxzeXN0ZWVtIHsNCiAgbWFyZ2luLXRvcDogMC4yNXJlbTsNCiAgZm9udC1zaXplOiAwLjk1cmVtOw0KICBjb2xvcjogIzY2NjsNCiAgbWF4LXdpZHRoOiA3MjBweDsNCn0NCg0KLmluZm8td2l0aC1sYWJlbCB7DQogIGRpc3BsYXk6IGlubGluZS1mbGV4Ow0KICBhbGlnbi1pdGVtczogY2VudGVyOw0KICBnYXA6IDZweDsNCiAgbWFyZ2luLXRvcDogMTBweDsNCiAgbWFyZ2luLXJpZ2h0OiAxMnB4Ow0KICBmb250LXNpemU6IDE0cHg7DQogIGNvbG9yOiAjMzMzOw0KfQ0KDQovKiBWaWVya2FudGUgaW5mby1rbm9wcGVuICovDQouc2hvdy1wb3B1cC1zdGQsDQouc2hvdy1wb3B1cC1odmwgew0KICBkaXNwbGF5OiBpbmxpbmUtZmxleDsNCiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQogIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQogIHdpZHRoOiAyNHB4Ow0KICBoZWlnaHQ6IDI0cHg7DQogIGJhY2tncm91bmQtY29sb3I6ICMwMDA7DQogIGNvbG9yOiAjZmZmOw0KICBjdXJzb3I6IHBvaW50ZXI7DQogIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4zcyBlYXNlOw0KICB1c2VyLXNlbGVjdDogbm9uZTsNCiAgZm9udC1zaXplOiAxNHB4Ow0KICBib3JkZXItcmFkaXVzOiA0cHg7IC8qIGxpY2h0IGFmZ2Vyb25kIHZvb3IgbW9kZXJuZSBsb29rICovDQogIGJveC1zaGFkb3c6IDAgMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMyk7DQp9DQouc2hvdy1wb3B1cC1zdGQgaSwNCi5zaG93LXBvcHVwLWh2bCBpIHsNCiAgZm9udC1zaXplOiAxMnB4Ow0KfQ0KLnNob3ctcG9wdXAtc3RkOmhvdmVyLA0KLnNob3ctcG9wdXAtaHZsOmhvdmVyIHsNCiAgYmFja2dyb3VuZC1jb2xvcjogIzIyMjsNCn0NCg0KLyogUG9wdXAtb3ZlcmxheSAqLw0KLnF3LXBvcHVwLW92ZXJsYXkgew0KICBwb3NpdGlvbjogZml4ZWQ7DQogIHRvcDogMDsNCiAgbGVmdDogMDsNCiAgd2lkdGg6IDEwMHZ3Ow0KICBoZWlnaHQ6IDEwMHZoOw0KICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsMCwwLDAuNik7DQogIHotaW5kZXg6IDk5OTk7DQogIGRpc3BsYXk6IG5vbmU7DQogIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KICBhbGlnbi1pdGVtczogY2VudGVyOw0KfQ0KDQovKiBQb3B1cC1jb250YWluZXIgKi8NCi5xdy1wb3B1cCB7DQogIGJhY2tncm91bmQtY29sb3I6ICNmZmY7DQogIHBhZGRpbmc6IDI0cHg7DQogIGJvcmRlci1yYWRpdXM6IDhweDsNCiAgbWF4LXdpZHRoOiA2MDBweDsNCiAgd2lkdGg6IDkwJTsNCiAgYm94LXNoYWRvdzogMCAxMHB4IDI1cHggcmdiYSgwLCAwLCAwLCAwLjMpOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogIHBvc2l0aW9uOiByZWxhdGl2ZTsNCn0NCi5xdy1wb3B1cCBpbWcgew0KICBtYXgtd2lkdGg6IDEwMCU7DQogIGhlaWdodDogYXV0bzsNCiAgYm9yZGVyLXJhZGl1czogNnB4Ow0KICBtYXJnaW4tYm90dG9tOiAxNnB4Ow0KfQ0KLnF3LXBvcHVwLWNsb3NlIHsNCiAgcG9zaXRpb246IGFic29sdXRlOw0KICB0b3A6IDEwcHg7DQogIHJpZ2h0OiAxNHB4Ow0KICBiYWNrZ3JvdW5kOiAjMDAwOw0KICBjb2xvcjogI2ZmZjsNCiAgYm9yZGVyOiBub25lOw0KICBmb250LXNpemU6IDE4cHg7DQogIHdpZHRoOiAzMHB4Ow0KICBoZWlnaHQ6IDMwcHg7DQogIGJvcmRlci1yYWRpdXM6IDRweDsNCiAgY3Vyc29yOiBwb2ludGVyOw0KfQ0KPC9zdHlsZT4NCg0KPHNjcmlwdD4NCmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbiAoKSB7DQogIC8vIFZvZWcgcG9wdXBzIHRvZQ0KICBpZiAoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJxdy1wb3B1cC1zdGQiKSkgew0KICAgIGNvbnN0IHBvcHVwc0hUTUwgPSBgDQogICAgICA8ZGl2IGNsYXNzPSJxdy1wb3B1cC1vdmVybGF5IiBpZD0icXctcG9wdXAtc3RkIj4NCiAgICAgICAgPGRpdiBjbGFzcz0icXctcG9wdXAiPg0KICAgICAgICAgIDxidXR0b24gY2xhc3M9InF3LXBvcHVwLWNsb3NlIj4mdGltZXM7PC9idXR0b24+DQogICAgICAgICAgPGltZyBzcmM9Imh0dHBzOi8vd3d3LnF3aW5kb29ycy5jb20vd2ViL2ltYWdlLzI1MDMyLTZkOTc5YjRiL1NURC53ZWJwIiBhbHQ9IlN0YW5kYWFyZCB2ZXJiaW5kaW5nIj4NCiAgICAgICAgICA8aDU+U3RhbmRhYXJkIHZlcmJpbmRpbmc8L2g1Pg0KICAgICAgICAgIDxwPkJpaiBlZW4gNDXCsCB2ZXJzdGVrIGhvZWt2ZXJiaW5kaW5nIHdvcmRlbiBkZSBwcm9maWVsdWl0ZWluZGVuIGluIGVlbiBob2VrIHZhbiA0NSBncmFkZW4gbWV0IGVsa2FhciB2ZXJib25kZW4uIERpdCByZXN1bHRlZXJ0IGluIGVlbiBzeW1tZXRyaXNjaGUgZW4gc3RyYWtrZSBhZndlcmtpbmcsIHdhYXJiaWogZGUgaG9la2VuIG5ldGplcyBpbiBlbGthYXIgb3ZlcmxvcGVuLjwvcD4NCiAgICAgICAgPC9kaXY+DQogICAgICA8L2Rpdj4NCg0KICAgICAgPGRpdiBjbGFzcz0icXctcG9wdXAtb3ZlcmxheSIgaWQ9InF3LXBvcHVwLWh2bCI+DQogICAgICAgIDxkaXYgY2xhc3M9InF3LXBvcHVwIj4NCiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJxdy1wb3B1cC1jbG9zZSI+JnRpbWVzOzwvYnV0dG9uPg0KICAgICAgICAgIDxpbWcgc3JjPSJodHRwczovL3d3dy5xd2luZG9vcnMuY29tL3dlYi9pbWFnZS8yNTAzMS0zY2NmZTQzOS9IVkwud2VicCIgYWx0PSJIVkwgdmVyYmluZGluZyI+DQogICAgICAgICAgPGg1PkhWTCB2ZXJiaW5kaW5nPC9oNT4NCiAgICAgICAgICA8cD5Ib3V0bG9va3ZlcmJpbmRpbmcgKEhWTCk6IGFhbiBkZSBidWl0ZW56aWpkZSB2YW4gaGV0IGtvemlqbnByb2ZpZWwgd29yZHQgZWVuIHJlY2h0ZSB2ZXJiaW5kaW5nIHRvZWdlcGFzdCwgd2FhcmRvb3IgaGV0IHVpdGVybGlqayBzdGVyayBkb2V0IGRlbmtlbiBhYW4gZWVuIHRyYWRpdGlvbmVsZSBob3V0ZW4ga296aWpudmVyYmluZGluZy4gRGUgYmlubmVuemlqZGUgdmFuIGhldCBwcm9maWVsIHdvcmR0IHN0YW5kYWFyZCB2ZXJib25kZW4gbWV0IGVlbiBob2VrIHZhbiA0NSBncmFkZW4uPC9wPg0KICAgICAgICA8L2Rpdj4NCiAgICAgIDwvZGl2Pg0KICAgIGA7DQogICAgZG9jdW1lbnQuYm9keS5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsIHBvcHVwc0hUTUwpOw0KICB9DQoNCiAgLy8gUG9wdXAgb3BlbmVuDQogIGZ1bmN0aW9uIG9wZW5Qb3B1cChpZCkgew0KICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5xdy1wb3B1cC1vdmVybGF5JykuZm9yRWFjaChwID0+IHAuc3R5bGUuZGlzcGxheSA9ICdub25lJyk7DQogICAgY29uc3QgcG9wdXAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7DQogICAgaWYgKHBvcHVwKSBwb3B1cC5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnOw0KICB9DQoNCiAgLy8gUG9wdXAgc2x1aXRlbiBiaWoga2xpayBidWl0ZW4gZGUgYm94IG9mIG9wIHNsdWl0a25vcA0KICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7DQogICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnF3LXBvcHVwLW92ZXJsYXknKS5mb3JFYWNoKHBvcHVwID0+IHsNCiAgICAgIGlmIChwb3B1cC5zdHlsZS5kaXNwbGF5ID09PSAnZmxleCcpIHsNCiAgICAgICAgY29uc3QgcG9wdXBCb3ggPSBwb3B1cC5xdWVyeVNlbGVjdG9yKCcucXctcG9wdXAnKTsNCiAgICAgICAgY29uc3QgY2xvc2VCdG4gPSBwb3B1cC5xdWVyeVNlbGVjdG9yKCcucXctcG9wdXAtY2xvc2UnKTsNCiAgICAgICAgaWYgKA0KICAgICAgICAgICFwb3B1cEJveC5jb250YWlucyhlLnRhcmdldCkgfHwgZS50YXJnZXQgPT09IGNsb3NlQnRuDQogICAgICAgICkgew0KICAgICAgICAgIHBvcHVwLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9KTsNCiAgfSk7DQoNCiAgLy8gT2JzZXJ2ZXIgaW5qZWN0aWUgYmlqICJQcm9maWVsc3lzdGVlbSINCiAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7DQogICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaDIuaHlwaGVuYXRlLmQtaW5saW5lJykuZm9yRWFjaChoZWFkZXIgPT4gew0KICAgICAgaWYgKGhlYWRlci50ZXh0Q29udGVudC50cmltKCkgPT09ICJQcm9maWVsc3lzdGVlbSIpIHsNCiAgICAgICAgY29uc3QgY29udGFpbmVyID0gaGVhZGVyLmNsb3Nlc3QoJy5jb2wtYXV0by5tYi0yJyk7DQogICAgICAgIGlmICghY29udGFpbmVyKSByZXR1cm47DQoNCiAgICAgICAgY29uc3QgaW5mb0J0biA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdidXR0b25bZGF0YS1icy10YXJnZXQ9IiNtb2RhbC1oZWxwIl1bZGF0YS1icy1jb250ZW50PSJQcm9maWxlJTIwc3lzdGVtIl0nKTsNCiAgICAgICAgaWYgKGluZm9CdG4pIGluZm9CdG4ucmVtb3ZlKCk7DQoNCiAgICAgICAgY29uc3QgYWxyZWFkeUV4aXN0cyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcuc3VidGl0bGUtcHJvZmllbHN5c3RlZW0nKTsNCiAgICAgICAgaWYgKCFhbHJlYWR5RXhpc3RzKSB7DQogICAgICAgICAgY29uc3QgcGFyYWdyYXBoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQogICAgICAgICAgcGFyYWdyYXBoLmNsYXNzTmFtZSA9ICJzdWJ0aXRsZS1wcm9maWVsc3lzdGVlbSI7DQogICAgICAgICAgcGFyYWdyYXBoLmlubmVySFRNTCA9IGANCiAgICAgICAgICAgIDxwPktpZXMgaGllciBoZXQgZ2V3ZW5zdGUgcHJvZmllbHN5c3RlZW0gdm9vciB1dyByYWFtIG9mIGRldXIuIEhldCBwcm9maWVsc3lzdGVlbSBiZXBhYWx0IGRlIG9wYm91dywgdWl0c3RyYWxpbmcgZW4gYWZ3ZXJraW5nIHZhbiBoZXQga296aWpuLCBlbiB2b3JtdCBkZSBiYXNpcyB2b29yIHZlcmRlcmUga2V1emVzIGluIGtsZXVyLCBpc29sYXRpZSBlbiB2b3JtZ2V2aW5nLjwvcD4NCiAgICAgICAgICAgIDxwPjxzdHJvbmc+TWV0IGFkYXB0ZXIgKFVpdHNsdWl0ZW5kIHZvb3IgYWNodGVyZGV1cmVuKTo8L3N0cm9uZz4gd2FubmVlciBlciBuYWFzdCBvZiBib3ZlbiBkZSBkZXVyIGVlbiByYWFtdmxhayBpcy48L3A+DQogICAgICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBnYXA6IDIwcHg7IG1hcmdpbi10b3A6IDhweDsiPg0KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbmZvLXdpdGgtbGFiZWwiPg0KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzaG93LXBvcHVwLXN0ZCI+PGkgY2xhc3M9ImZhcyBmYS1pbmZvIj48L2k+PC9zcGFuPg0KICAgICAgICAgICAgICAgIDxzcGFuPlN0YW5kYWFyZCB2ZXJiaW5kaW5nPC9zcGFuPg0KICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5mby13aXRoLWxhYmVsIj4NCiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic2hvdy1wb3B1cC1odmwiPjxpIGNsYXNzPSJmYXMgZmEtaW5mbyI+PC9pPjwvc3Bhbj4NCiAgICAgICAgICAgICAgICA8c3Bhbj5IVkwgdmVyYmluZGluZzwvc3Bhbj4NCiAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICBgOw0KICAgICAgICAgIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUocGFyYWdyYXBoLCBoZWFkZXIubmV4dFNpYmxpbmcpOw0KDQogICAgICAgICAgLy8gRXZlbnRsaXN0ZW5lcnMga29wcGVsZW4NCiAgICAgICAgICBwYXJhZ3JhcGgucXVlcnlTZWxlY3RvcignLnNob3ctcG9wdXAtc3RkJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gb3BlblBvcHVwKCdxdy1wb3B1cC1zdGQnKSk7DQogICAgICAgICAgcGFyYWdyYXBoLnF1ZXJ5U2VsZWN0b3IoJy5zaG93LXBvcHVwLWh2bCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IG9wZW5Qb3B1cCgncXctcG9wdXAtaHZsJykpOw0KDQogICAgICAgICAgcGFyYWdyYXBoLnF1ZXJ5U2VsZWN0b3IoJy5zaG93LXBvcHVwLXN0ZCcpPy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCAoKSA9PiBvcGVuUG9wdXAoJ3F3LXBvcHVwLXN0ZCcpKTsNCiAgICAgICAgICBwYXJhZ3JhcGgucXVlcnlTZWxlY3RvcignLnNob3ctcG9wdXAtaHZsJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsICgpID0+IG9wZW5Qb3B1cCgncXctcG9wdXAtaHZsJykpOw0KICAgICAgICB9DQogICAgICB9DQogICAgfSk7DQogIH0pOw0KDQogIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSwgew0KICAgIGNoaWxkTGlzdDogdHJ1ZSwNCiAgICBzdWJ0cmVlOiB0cnVlDQogIH0pOw0KfSk7DQo8L3NjcmlwdD4NCjwhLS0gRU5EOiBQcm9maWVsc3lzdGVlbSArIFN0YW5kYWFyZCArIEhWTCBwb3B1cHMgLS0+DQoNCjwhLS0gU1RBUlQ6ICJUeXBlIGRlc2NyaXB0aW9uIiAtLT4NCjxzdHlsZT4NCiAgLnN1YnRpdGxlLXR5cGUgew0KICAgIG1hcmdpbi10b3A6IDAuMjVyZW07DQogICAgZm9udC1zaXplOiAwLjk1cmVtOw0KICAgIGNvbG9yOiAjNjY2NjY2Ow0KICB9DQo8L3N0eWxlPg0KDQo8c2NyaXB0Pg0KICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24gKCkgew0KICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gew0KICAgICAgY29uc3QgaGVhZGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaDIuaHlwaGVuYXRlLmQtaW5saW5lJyk7DQogICAgICBpZiAoIWhlYWRlciB8fCBoZWFkZXIudGV4dENvbnRlbnQudHJpbSgpICE9PSAiVHlwZSIpIHJldHVybjsNCg0KICAgICAgLy8gVmVyd2lqZGVyIGRlIGluZm8ta25vcA0KICAgICAgY29uc3QgYnV0dG9uID0gaGVhZGVyLnBhcmVudEVsZW1lbnQucXVlcnlTZWxlY3RvcignYnV0dG9uW2RhdGEtYnMtdGFyZ2V0PSIjbW9kYWwtaGVscCJdW2RhdGEtYnMtY29udGVudD0iVHlwZSJdJyk7DQogICAgICBpZiAoYnV0dG9uKSB7DQogICAgICAgIGJ1dHRvbi5yZW1vdmUoKTsNCiAgICAgIH0NCg0KICAgICAgLy8gVm9lZyBkZSBvbmRlcnRpdGVsIHRvZSBhbHMgZGllIG5vZyBuaWV0IGJlc3RhYXQNCiAgICAgIGNvbnN0IGV4aXN0aW5nU3VidGl0bGUgPSBoZWFkZXIucGFyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuc3VidGl0bGUtdHlwZScpOw0KICAgICAgaWYgKCFleGlzdGluZ1N1YnRpdGxlKSB7DQogICAgICAgIGNvbnN0IHAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7DQogICAgICAgIHAuY2xhc3NOYW1lID0gJ3N1YnRpdGxlLXR5cGUnOw0KICAgICAgICBwLmlubmVyVGV4dCA9ICdCZXBhYWwgaGllciBkZSB2ZXJkZWxpbmcgdmFuIHV3IGtvemlqbiBkb29yIGhldCBhYW50YWwgdmFra2VuIChyYWFtLSBvZiBkZXVyc2VnbWVudGVuKSB0ZSBzZWxlY3RlcmVuLiBVIGt1bnQga2llemVuIHVpdCB2ZXJzY2hpbGxlbmRlIGluZGVsaW5nZW4sIHpvYWxzIDEtdmFrICjDqcOpbiBncm9vdCBzZWdtZW50KSwgMi12YWtrZW4sIDMtdmFra2VuIG9mIDQtdmFra2VuLCBhZmhhbmtlbGlqayB2YW4gdXcgZ2V3ZW5zdGUgdWl0c3RyYWxpbmcsIGxpY2h0aW52YWwgZW4gZnVuY3Rpb25lbGUgZWlzZW4uIE5hIGhldCBzZWxlY3RlcmVuIHZhbiBlZW4gdmVyZGVsaW5nIGt1bnQgdSBwZXIgdmFrIGJlcGFsZW4gd2VsayB0eXBlIGVsZW1lbnQgZGFhcmluIGtvbXQ6IGJpanZvb3JiZWVsZCBlZW4gdmFzdCByYWFtLCBkcmFhaWtpZXByYWFtIG9mIHZhbHJhYW0uIERlemUgc3RhcCB2b3JtdCBkZSBiYXNpcyB2YW4gdXcgaW5kZWxpbmcgZW4gYmVwYWFsdCBtZWRlIGRlIHZvcm1nZXZpbmcsIGRvb3JraWprIGVuIHZlbnRpbGF0aWVtb2dlbGlqa2hlZGVuIHZhbiBoZXQgZ2VoZWVsLiBLaWVzIGRlIG9wYm91dyBkaWUgaGV0IGJlc3RlIGFhbnNsdWl0IGJpaiB1dyB3b25pbmcgZW4gZ2VicnVpa3Nkb2VsLic7DQogICAgICAgIGhlYWRlci5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgcCk7DQogICAgICB9DQogICAgfSk7DQoNCiAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHsNCiAgICAgIGNoaWxkTGlzdDogdHJ1ZSwNCiAgICAgIHN1YnRyZWU6IHRydWUNCiAgICB9KTsNCiAgfSk7DQo8L3NjcmlwdD4NCjwhLS0gRU5EOiAiVHlwZSBkZXNjcmlwdGlvbiIgLS0+DQoNCjwhLS0gU1RBUlQ6ICJBZm1ldGluZ2VuIGRlc2NyaXB0aW9uIiAtLT4NCjxzdHlsZT4NCiAgLnN1YnRpdGxlLWFmbWV0aW5nZW4gew0KICAgIG1hcmdpbi10b3A6IDAuMjVyZW07DQogICAgZm9udC1zaXplOiAwLjk1cmVtOw0KICAgIGNvbG9yOiAjNjY2NjY2Ow0KICB9DQo8L3N0eWxlPg0KDQo8c2NyaXB0Pg0KICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24gKCkgew0KICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gew0KICAgICAgY29uc3QgaGVhZGVycyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2gyLmh5cGhlbmF0ZS5kLWlubGluZScpOw0KICAgICAgaGVhZGVycy5mb3JFYWNoKGhlYWRlciA9PiB7DQogICAgICAgIGlmIChoZWFkZXIudGV4dENvbnRlbnQudHJpbSgpID09PSAiQWZtZXRpbmdlbiIpIHsNCiAgICAgICAgICAvLyBWZXJ3aWpkZXIgaW5mb2tub3ANCiAgICAgICAgICBjb25zdCBpbmZvQnRuID0gaGVhZGVyLnBhcmVudEVsZW1lbnQucXVlcnlTZWxlY3RvcignYnV0dG9uW2RhdGEtYnMtY29udGVudD0iRGltZW5zaW9ucyJdJyk7DQogICAgICAgICAgaWYgKGluZm9CdG4pIGluZm9CdG4ucmVtb3ZlKCk7DQoNCiAgICAgICAgICAvLyBWb2VnIG9tc2NocmlqdmluZyB0b2UgaW5kaWVuIG5vZyBuaWV0IGFhbndlemlnDQogICAgICAgICAgaWYgKCFoZWFkZXIucGFyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuc3VidGl0bGUtYWZtZXRpbmdlbicpKSB7DQogICAgICAgICAgICBjb25zdCBwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpOw0KICAgICAgICAgICAgcC5jbGFzc05hbWUgPSAnc3VidGl0bGUtYWZtZXRpbmdlbic7DQogICAgICAgICAgICBwLmlubmVyVGV4dCA9DQogICAgICAgICAgICAgICJHZWVmIGhpZXIgZGUgZ2V3ZW5zdGUgYnJlZWR0ZSBlbiBob29ndGUgdmFuIHV3IHJhYW0gb2YgZGV1ciBvcC4gTGV0IGVyb3AgZGF0IHUgYmlubmVuIGRlIHRvZWdlc3RhbmUgbWluaW1hbGUgZW4gbWF4aW1hbGUgbWF0ZW4gYmxpamZ0IHpvYWxzIGFhbmdlZ2V2ZW4gb3AgZGV6ZSBwYWdpbmEuIERlIG9wZ2VnZXZlbiBhZm1ldGluZ2VuIHZvcm1lbiBkZSBiYXNpcyB2b29yIGRlIHByb2R1Y3RpZSB2YW4gdXcga296aWpuIGVuIHppam4gZXNzZW50aWVlbCB2b29yIGVlbiBqdWlzdGUgcGFzc2luZyBpbiB1dyBwcm9qZWN0LiI7DQogICAgICAgICAgICBoZWFkZXIuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmVuZCcsIHApOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfSk7DQogICAgfSk7DQoNCiAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH0pOw0KICB9KTsNCjwvc2NyaXB0Pg0KPCEtLSBFTkQ6ICJBZm1ldGluZ2VuIGRlc2NyaXB0aW9uIiAtLT4NCg0KPCEtLSBTVEFSVDogIktsZXVyIGRlc2NyaXB0aW9uIiAtLT4NCjxzY3JpcHQ+DQpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24gKCkgew0KCWNvbnN0IHRhcmdldFRleHQgPSAiS2xldXIiOw0KCWNvbnN0IGRlc2NyaXB0aW9uVGV4dCA9ICJLaWVzIGhpZXIgZGUgZ2V3ZW5zdGUga2xldXJzdGVsbGluZyB2YW4gdXcga296aWpuLiBVIGt1bnQgYWZ6b25kZXJsaWprIGRlIGtsZXVyIHZhbiBkZSBiaW5uZW56aWpkZSwgYnVpdGVuemlqZGUgb2YgYmVpZGUgemlqZGVuIGJlcGFsZW4uIE1hYWsgZWVuIGtldXplIHVpdCBlZW4gYnJlZWQgc2NhbGEgYWFuIFJBTC1rbGV1cmVuIGVuIGZvbGllZGVjb3JzLCB2YXJpw6tyZW5kIHZhbiBzdHJhayB3aXQgdG90IGhvdXRuZXJmc3RydWN0dXJlbiBvZiBtb2Rlcm5lIGFudHJhY2lldHRpbnRlbi4gVXcga2xldXJrZXV6ZSBiZXBhYWx0IGluIGdyb3RlIG1hdGUgZGUgdWl0c3RyYWxpbmcgdmFuIHV3IHdvbmluZywgZHVzIGtpZXMgZWVuIGNvbWJpbmF0aWUgZGllIHBhc3QgYmlqIHpvd2VsIHV3IGludGVyaWV1ciBhbHMgZXh0ZXJpZXVyLiBEZSBrbGV1cmVuIHppam4gZHV1cnphYW0sIG9uZGVyaG91ZHN2cmllbmRlbGlqayBlbiBhZmdlc3RlbWQgb3AgbGFuZ2R1cmlnIGdlYnJ1aWsgb25kZXIgdmVyc2NoaWxsZW5kZSB3ZWVyc29tc3RhbmRpZ2hlZGVuLiI7DQoNCgljb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsNCgkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiaDIuaHlwaGVuYXRlLmQtaW5saW5lIikuZm9yRWFjaChoMiA9PiB7DQoJCQlpZiAoaDIudGV4dENvbnRlbnQudHJpbSgpID09PSB0YXJnZXRUZXh0ICYmICFoMi5jbG9zZXN0KCIuY29sLWF1dG8iKS5xdWVyeVNlbGVjdG9yKCIuc3VidGl0bGUta2xldXIiKSkgew0KCQkJCWNvbnN0IHAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwIik7DQoJCQkJcC5jbGFzc05hbWUgPSAic3VidGl0bGUta2xldXIiOw0KCQkJCXAudGV4dENvbnRlbnQgPSBkZXNjcmlwdGlvblRleHQ7DQoJCQkJcC5zdHlsZS5tYXJnaW5Ub3AgPSAiMC4yNXJlbSI7DQoJCQkJcC5zdHlsZS5mb250U2l6ZSA9ICIwLjk1cmVtIjsNCgkJCQlwLnN0eWxlLmNvbG9yID0gIiM2NjYiOw0KDQoJCQkJaDIuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJhZnRlcmVuZCIsIHApOw0KDQoJCQkJLy8gVmVyd2lqZGVyIG9wdGlvbmVsZSBpbmZva25vcCBhbHMgYWFud2V6aWcNCgkJCQljb25zdCBpbmZvQnV0dG9uID0gaDIucGFyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKCdidXR0b25bZGF0YS1icy10YXJnZXQ9IiNtb2RhbC1oZWxwIl0nKTsNCgkJCQlpZiAoaW5mb0J1dHRvbikgaW5mb0J1dHRvbi5yZW1vdmUoKTsNCgkJCX0NCgkJfSk7DQoJfSk7DQoNCglvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHsNCgkJY2hpbGRMaXN0OiB0cnVlLA0KCQlzdWJ0cmVlOiB0cnVlDQoJfSk7DQp9KTsNCjwvc2NyaXB0Pg0KPCEtLSBFTkQ6ICJLbGV1ciBkZXNjcmlwdGlvbiIgLS0+DQoNCjwhLS0gU1RBUlQ6ICJHbGFzL1BhbmVlbCBkZXNjcmlwdGlvbiIgLS0+DQo8c2NyaXB0Pg0KZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uICgpIHsNCgljb25zdCB0YXJnZXRUZXh0ID0gIkdsYXMgLyBQYW5lZWwiOw0KCWNvbnN0IGRlc2NyaXB0aW9uVGV4dCA9ICJTZWxlY3RlZXIgaGllciB1dyBnZXdlbnN0ZSBnbGFzLSBvZiBwYW5lZWx2dWxsaW5nIHZvb3IgZGUgZ2Vrb3plbiB2ZWxkZW4uIFUgaGVlZnQga2V1emUgdWl0IHZlcnNjaGlsbGVuZGUgc29vcnRlbiBnbGFzIHpvYWxzIGR1YmJlbGdsYXMsIEhSKysgZ2xhcywgdHJpcGxlIGdsYXMgb2YgZGVjb3JhdGllZiBnbGFzLCBlbiBkaXZlcnNlIHBhbmVsZW4gYWZoYW5rZWxpamsgdmFuIGhldCBnZWJydWlrLiBVdyBrZXV6ZSBiZcOvbnZsb2VkdCB6b3dlbCBkZSBpc29sYXRpZXdhYXJkZSBhbHMgZGUgdWl0c3RyYWxpbmcgdmFuIGhldCBlaW5kcHJvZHVjdC4iOw0KDQoJY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7DQoJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImgyLmh5cGhlbmF0ZS5kLWlubGluZSIpLmZvckVhY2goaDIgPT4gew0KCQkJaWYgKGgyLnRleHRDb250ZW50LnRyaW0oKSA9PT0gdGFyZ2V0VGV4dCAmJiAhaDIuY2xvc2VzdCgiLmNvbC1hdXRvIikucXVlcnlTZWxlY3RvcigiLnN1YnRpdGxlLWdsYXMtcGFuZWVsIikpIHsNCgkJCQljb25zdCBwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicCIpOw0KCQkJCXAuY2xhc3NOYW1lID0gInN1YnRpdGxlLWdsYXMtcGFuZWVsIjsNCgkJCQlwLnRleHRDb250ZW50ID0gZGVzY3JpcHRpb25UZXh0Ow0KCQkJCXAuc3R5bGUubWFyZ2luVG9wID0gIjAuMjVyZW0iOw0KCQkJCXAuc3R5bGUuZm9udFNpemUgPSAiMC45NXJlbSI7DQoJCQkJcC5zdHlsZS5jb2xvciA9ICIjNjY2IjsNCg0KCQkJCWgyLmluc2VydEFkamFjZW50RWxlbWVudCgiYWZ0ZXJlbmQiLCBwKTsNCg0KCQkJCS8vIE9wdGlvbmVlbDogdmVyd2lqZGVyIGRlIGluZm8ta25vcA0KCQkJCWNvbnN0IGluZm9CdXR0b24gPSBoMi5wYXJlbnRFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbltkYXRhLWJzLXRhcmdldD0iI21vZGFsLWhlbHAiXScpOw0KCQkJCWlmIChpbmZvQnV0dG9uKSBpbmZvQnV0dG9uLnJlbW92ZSgpOw0KCQkJfQ0KCQl9KTsNCgl9KTsNCg0KCW9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSwgew0KCQljaGlsZExpc3Q6IHRydWUsDQoJCXN1YnRyZWU6IHRydWUNCgl9KTsNCn0pOw0KPC9zY3JpcHQ+DQo8IS0tIEVORDogIkdsYXMvUGFuZWVsIGRlc2NyaXB0aW9uIiAtLT4NCg0KPCEtLSBTVEFSVDogIkRyYWFyaWNodGluZyBkZXNjcmlwdGlvbiIgLS0+DQo8c2NyaXB0Pg0KZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uICgpIHsNCgljb25zdCB0YXJnZXRUZXh0ID0gIkRyYWFpcmljaHRpbmciOw0KCWNvbnN0IGRlc2NyaXB0aW9uVGV4dCA9ICJHZWVmIGhpZXIgYWFuIG5hYXIgd2Vsa2UgemlqZGUgdXcgcmFhbSBvZiBkZXVyIG1vZXQgb3BlbmVuLiBBZmhhbmtlbGlqayB2YW4gZGUgc2l0dWVyaW5nIHZhbiB1dyBrb3ppam4gZW4gdXcgcGVyc29vbmxpamtlIHZvb3JrZXVyZW4ga2llc3QgdSB2b29yIGVlbiBsaW5rcy0gb2YgcmVjaHRzZHJhYWllbmRlIHZhcmlhbnQuIERpdCBpcyB2YW4gYmVsYW5nIHZvb3IgZGUgZnVuY3Rpb25hbGl0ZWl0IGVuIGhldCBnZWJydWlrc2dlbWFrIGluIHV3IHJ1aW10ZS4iOw0KDQoJY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7DQoJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImgyLmh5cGhlbmF0ZS5kLWlubGluZSIpLmZvckVhY2goaDIgPT4gew0KCQkJaWYgKGgyLnRleHRDb250ZW50LnRyaW0oKSA9PT0gdGFyZ2V0VGV4dCAmJiAhaDIuY2xvc2VzdCgiLmNvbC1hdXRvIikucXVlcnlTZWxlY3RvcigiLnN1YnRpdGxlLWRyYWFpcmljaHRpbmciKSkgew0KCQkJCWNvbnN0IHAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwIik7DQoJCQkJcC5jbGFzc05hbWUgPSAic3VidGl0bGUtZHJhYWlyaWNodGluZyI7DQoJCQkJcC50ZXh0Q29udGVudCA9IGRlc2NyaXB0aW9uVGV4dDsNCgkJCQlwLnN0eWxlLm1hcmdpblRvcCA9ICIwLjI1cmVtIjsNCgkJCQlwLnN0eWxlLmZvbnRTaXplID0gIjAuOTVyZW0iOw0KCQkJCXAuc3R5bGUuY29sb3IgPSAiIzY2NiI7DQoNCgkJCQloMi5pbnNlcnRBZGphY2VudEVsZW1lbnQoImFmdGVyZW5kIiwgcCk7DQoJCQl9DQoJCX0pOw0KCX0pOw0KDQoJb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7DQoJCWNoaWxkTGlzdDogdHJ1ZSwNCgkJc3VidHJlZTogdHJ1ZQ0KCX0pOw0KfSk7DQo8L3NjcmlwdD4NCjwhLS0gRU5EOiAiRHJhYXJpY2h0aW5nIGRlc2NyaXB0aW9uIiAtLT4NCg0KPCEtLSBTVEFSVDogIlZlbnRpbGF0aWVyb29zdGVyIGRlc2NyaXB0aW9uIiAtLT4NCjxzY3JpcHQ+DQpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24gKCkgew0KCWNvbnN0IHRhcmdldFRleHQgPSAiVmVudGlsYXRpZXJvb3N0ZXIiOw0KCWNvbnN0IGRlc2NyaXB0aW9uVGV4dCA9ICJHZWVmIGhpZXIgYWFuIG9mIHUgZWVuIHZlbnRpbGF0aWVyb29zdGVyIHdlbnN0IG9wIHZlbGQgMSBvZiB2ZWxkIDIgdmFuIGhldCBrb3ppam4uIFUga3VudCBwZXIgdmVsZCBhZnpvbmRlcmxpamsgYmVwYWxlbiBvZiB1IHZlbnRpbGF0aWUgd2lsdCBlbiBkYWFyYmlqIG9vayBkZSBnZXdlbnN0ZSBrbGV1ciBzZWxlY3RlcmVuLiBEaXQgZHJhYWd0IGJpaiBhYW4gZWVuIGdlem9uZCBiaW5uZW5rbGltYWF0IHpvbmRlciBjb25jZXNzaWVzIHRlIGRvZW4gYWFuIGhldCBkZXNpZ24uIjsNCg0KCWNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gew0KCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJoMi5oeXBoZW5hdGUuZC1pbmxpbmUiKS5mb3JFYWNoKGgyID0+IHsNCgkJCWlmIChoMi50ZXh0Q29udGVudC50cmltKCkgPT09IHRhcmdldFRleHQpIHsNCgkJCQkvLyBWb2VnIGRlIG9tc2NocmlqdmluZyB0b2UgaW5kaWVuIGRpZSBub2cgbmlldCBiZXN0YWF0DQoJCQkJaWYgKCFoMi5jbG9zZXN0KCIuY29sLWF1dG8iKS5xdWVyeVNlbGVjdG9yKCIuc3VidGl0bGUtdmVudGlsYXRpZXJvb3N0ZXIiKSkgew0KCQkJCQljb25zdCBwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicCIpOw0KCQkJCQlwLmNsYXNzTmFtZSA9ICJzdWJ0aXRsZS12ZW50aWxhdGllcm9vc3RlciI7DQoJCQkJCXAudGV4dENvbnRlbnQgPSBkZXNjcmlwdGlvblRleHQ7DQoJCQkJCXAuc3R5bGUubWFyZ2luVG9wID0gIjAuMjVyZW0iOw0KCQkJCQlwLnN0eWxlLmZvbnRTaXplID0gIjAuOTVyZW0iOw0KCQkJCQlwLnN0eWxlLmNvbG9yID0gIiM2NjYiOw0KCQkJCQloMi5pbnNlcnRBZGphY2VudEVsZW1lbnQoImFmdGVyZW5kIiwgcCk7DQoJCQkJfQ0KCQkJfQ0KCQl9KTsNCg0KCQkvLyBWZXJiZXJnIGluZm8ta25vcCBiaWogdmVudGlsYXRpZXJvb3N0ZXINCgkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnYnV0dG9uW2RhdGEtYnMtdG9nZ2xlPSJtb2RhbCJdW2RhdGEtYnMtdGFyZ2V0PSIjbW9kYWwtaGVscCJdJykuZm9yRWFjaChidXR0b24gPT4gew0KCQkJaWYgKGJ1dHRvbi5nZXRBdHRyaWJ1dGUoImRhdGEtYnMtY29udGVudCIpID09PSAiU2FzaCUyMGZpbGxlciIpIHsNCgkJCQlidXR0b24uc3R5bGUuZGlzcGxheSA9ICJub25lIjsNCgkJCX0NCgkJfSk7DQoJfSk7DQoNCglvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHsNCgkJY2hpbGRMaXN0OiB0cnVlLA0KCQlzdWJ0cmVlOiB0cnVlDQoJfSk7DQp9KTsNCjwvc2NyaXB0Pg0KPHNjcmlwdD4NCmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbiAoKSB7DQogIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gew0KICAgIGNvbnN0IGJ1dHRvbnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdidXR0b25bZGF0YS1icy10b2dnbGU9Im1vZGFsIl1bZGF0YS1icy10YXJnZXQ9IiNtb2RhbC1oZWxwIl0nKTsNCg0KICAgIGJ1dHRvbnMuZm9yRWFjaChidXR0b24gPT4gew0KICAgICAgY29uc3QgY29udGVudCA9IGJ1dHRvbi5nZXRBdHRyaWJ1dGUoImRhdGEtYnMtY29udGVudCIpOw0KICAgICAgaWYgKGNvbnRlbnQgPT09ICJTYXNoJTIwZmlsbGVyIikgew0KICAgICAgICBidXR0b24ucmVtb3ZlKCk7IC8vIFZlcndpamRlciBkZSBrbm9wIGNvbXBsZWV0IHVpdCBkZSBET00NCiAgICAgIH0NCiAgICB9KTsNCiAgfSk7DQoNCiAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7DQogICAgY2hpbGRMaXN0OiB0cnVlLA0KICAgIHN1YnRyZWU6IHRydWUNCiAgfSk7DQp9KTsNCjwvc2NyaXB0Pg0KPCEtLSBFTkQ6ICJWZW50aWxhdGllcm9vc3RlciBkZXNjcmlwdGlvbiIgLS0+DQoNCjwhLS0gU1RBUlQ6ICJWZW50aWxhdGllcm9vc3RlciA8YnI+IiAtLT4NCjxzdHlsZT4NCi8qIFpvcmd0IHZvb3IgZWVuIHdpdHJ1aW10ZSBvbmRlciBkZSB2ZW50aWxhdGllcm9vc3Rlci10ZWdlbHJpaiAqLw0KLnNhc2hGaWxsZXJzU3dpdGNoZXIgLmNhcm91c2VsLWlubmVyIHsNCiAgICBtYXJnaW4tYm90dG9tOiAxcmVtOyAvKiBzaW11bGVlcnQgZWVuIDxicj4gKi8NCn0NCjwvc3R5bGU+DQo8IS0tIEVORDogIlZlbnRpbGF0aWVyb29zdGVyIDxicj4iIC0tPg0KDQo8IS0tIFNUQVJUOiAiVmVudGlsYXRpZXJvb3N0ZXIgKEhJREUgTEVGVC9SSUdIVC9CT1RUT00pIiAtLT4NCjxzdHlsZT4NCi8qIFZlcmJlcmcgZGUgcmFkaW9rbm9wcGVuICdPbmRlcicsICdMaW5rcycgZW4gJ1JlY2h0cycgdm9sbGVkaWcgKi8NCmxhYmVsLmZvcm0tY2hlY2stbGFiZWwgaW5wdXQjc2FzaEZpbGxlcnNfc2lkZV9iZWxvdywNCmxhYmVsLmZvcm0tY2hlY2stbGFiZWwgaW5wdXQjc2FzaEZpbGxlcnNfc2lkZV9sZWZ0LA0KbGFiZWwuZm9ybS1jaGVjay1sYWJlbCBpbnB1dCNzYXNoRmlsbGVyc19zaWRlX3JpZ2h0IHsNCiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7DQp9DQoNCmxhYmVsLmZvcm0tY2hlY2stbGFiZWwgaW5wdXQjc2FzaEZpbGxlcnNfc2lkZV9iZWxvdyArICosDQpsYWJlbC5mb3JtLWNoZWNrLWxhYmVsIGlucHV0I3Nhc2hGaWxsZXJzX3NpZGVfbGVmdCArICosDQpsYWJlbC5mb3JtLWNoZWNrLWxhYmVsIGlucHV0I3Nhc2hGaWxsZXJzX3NpZGVfcmlnaHQgKyAqIHsNCiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7DQp9DQoNCi8qIEFscyBlciBnZWVuIGFuZGVyZSBzdHlsaW5nIGlzLCBkYW4gdm9sc3RhYXQgZGl0IG9vazogKi8NCmxhYmVsLmZvcm0tY2hlY2stbGFiZWw6aGFzKCNzYXNoRmlsbGVyc19zaWRlX2JlbG93KSwNCmxhYmVsLmZvcm0tY2hlY2stbGFiZWw6aGFzKCNzYXNoRmlsbGVyc19zaWRlX2xlZnQpLA0KbGFiZWwuZm9ybS1jaGVjay1sYWJlbDpoYXMoI3Nhc2hGaWxsZXJzX3NpZGVfcmlnaHQpIHsNCiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7DQp9DQo8L3N0eWxlPg0KPCEtLSBFTkQ6ICJWZW50aWxhdGllcm9vc3RlciAoSElERSBMRUZUL1JJR0hUL0JPVFRPTSkiIC0tPg0KDQo8IS0tIFNUQVJUOiAiUm9lZGVudmVsZGVuIGRlc2NyaXB0aW9uIiAtLT4NCjxzdHlsZT4NCiAgLnN1YnRpdGxlLXJvZWRlbnZlbGRlbiB7DQogICAgbWFyZ2luLXRvcDogMC4yNXJlbTsNCiAgICBmb250LXNpemU6IDAuOTVyZW07DQogICAgY29sb3I6ICM2NjY7DQogICAgbWF4LXdpZHRoOiA3MjBweDsNCiAgfQ0KPC9zdHlsZT4NCg0KPHNjcmlwdD4NCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uICgpIHsNCiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsNCiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImgyLmh5cGhlbmF0ZS5kLWlubGluZSIpLmZvckVhY2goaDIgPT4gew0KICAgICAgICBpZiAoaDIudGV4dENvbnRlbnQudHJpbSgpID09PSAiUm9lZGVudmVsZGVuIikgew0KICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGgyLmNsb3Nlc3QoIi5jb2wtYXV0by5tYi0yIik7DQogICAgICAgICAgaWYgKCFjb250YWluZXIpIHJldHVybjsNCg0KICAgICAgICAgIC8vIHZlcndpamRlciBkZSBpbmZvLWtub3ANCiAgICAgICAgICBjb25zdCBpbmZvQnRuID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbltkYXRhLWJzLWNvbnRlbnQ9IldpbmRvdyUyMGJhciUyMGltYWdlIl0nKTsNCiAgICAgICAgICBpZiAoaW5mb0J0bikgew0KICAgICAgICAgICAgaW5mb0J0bi5yZW1vdmUoKTsNCiAgICAgICAgICB9DQoNCiAgICAgICAgICAvLyB2b2VnIGJlc2NocmlqdmluZyB0b2UgaW5kaWVuIG5vZyBuaWV0IGFhbndlemlnDQogICAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcigiLnN1YnRpdGxlLXJvZWRlbnZlbGRlbiIpKSB7DQogICAgICAgICAgICBjb25zdCBwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicCIpOw0KICAgICAgICAgICAgcC5jbGFzc05hbWUgPSAic3VidGl0bGUtcm9lZGVudmVsZGVuIjsNCiAgICAgICAgICAgIHAudGV4dENvbnRlbnQgPSAiU2VsZWN0ZWVyIGhpZXIgaGV0IGdld2Vuc3RlIHJvZWRlbnBhdHJvb24gdm9vciB1dyByYWFtIG9mIGRldXIuIFJvZWRlbnZlbGRlbiB2b2VnZW4gZWVuIGtsYXNzaWVrIG9mIGp1aXN0IG1vZGVybiBhY2NlbnQgdG9lIGFhbiB1dyBrb3ppam4uIFUga3VudCBraWV6ZW4gdWl0IGhvcml6b250YWxlLCB2ZXJ0aWNhbGUgb2Yga3J1aXN2ZXJkZWxpbmdlbiBtZXQgdmVyc2NoaWxsZW5kZSByYXN0ZXJ2b3JtZW4uIFV3IGtldXplIGhlZWZ0IGludmxvZWQgb3AgaGV0IGVzdGhldGlzY2ggYmVlbGQsIHppY2h0bGlqbmVuIGVuIGxpY2h0aW52YWwuIjsNCiAgICAgICAgICAgIGgyLmluc2VydEFkamFjZW50RWxlbWVudCgiYWZ0ZXJlbmQiLCBwKTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0pOw0KICAgIH0pOw0KDQogICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7DQogICAgICBjaGlsZExpc3Q6IHRydWUsDQogICAgICBzdWJ0cmVlOiB0cnVlDQogICAgfSk7DQogIH0pOw0KPC9zY3JpcHQ+DQo8IS0tIEVORDogIlJvZWRlbnZlbGRlbiBkZXNjcmlwdGlvbiIgLS0+DQoNCjwhLS0gU1RBUlQ6ICJSb2VkZW5zb29ydCBkZXNjcmlwdGlvbiIgLS0+DQo8c3R5bGU+DQogIC5zdWJ0aXRsZS1yb2VkZW5zb29ydCB7DQogICAgbWFyZ2luLXRvcDogMC4yNXJlbTsNCiAgICBmb250LXNpemU6IDAuOTVyZW07DQogICAgY29sb3I6ICM2NjY7DQogICAgbWF4LXdpZHRoOiA3MjBweDsNCiAgfQ0KPC9zdHlsZT4NCg0KPHNjcmlwdD4NCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uICgpIHsNCiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsNCiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImgyLmh5cGhlbmF0ZS5kLWlubGluZSIpLmZvckVhY2goaDIgPT4gew0KICAgICAgICBpZiAoaDIudGV4dENvbnRlbnQudHJpbSgpID09PSAiUm9lZGVuc29vcnQiKSB7DQogICAgICAgICAgY29uc3QgY29udGFpbmVyID0gaDIuY2xvc2VzdCgiLmNvbC1hdXRvLm1iLTIiKTsNCiAgICAgICAgICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuOw0KDQogICAgICAgICAgLy8gVmVyd2lqZGVyIGRlIGluZm8ta25vcA0KICAgICAgICAgIGNvbnN0IGluZm9CdG4gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignYnV0dG9uW2RhdGEtYnMtY29udGVudD0iV2luZG93JTIwYmFyJTIwdmFyaWFudCJdJyk7DQogICAgICAgICAgaWYgKGluZm9CdG4pIGluZm9CdG4ucmVtb3ZlKCk7DQoNCiAgICAgICAgICAvLyBWb2VnIGJlc2NocmlqdmluZyB0b2UgaW5kaWVuIG5vZyBuaWV0IGFhbndlemlnDQogICAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcigiLnN1YnRpdGxlLXJvZWRlbnNvb3J0IikpIHsNCiAgICAgICAgICAgIGNvbnN0IHAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwIik7DQogICAgICAgICAgICBwLmNsYXNzTmFtZSA9ICJzdWJ0aXRsZS1yb2VkZW5zb29ydCI7DQogICAgICAgICAgICBwLnRleHRDb250ZW50ID0gIktpZXMgaGllciBoZXQgdHlwZSByb2VkZW5zb29ydCBkYXQgdSB3aWx0IHRvZXBhc3Nlbi4gVSBoZWVmdCBvbmRlciBhbmRlcmUgZGUga2V1emUgdWl0IHJvZWRlcyBpbiBoZXQgZ2xhcyBvZiBjb25zdHJ1Y3RpZXZlIHR1c3NlbnN0aWpsZW4gem9hbHMgYnJpZXZlbmJ1c3Byb2ZpZWxlbi4gRGUgZ2Vrb3plbiB2YXJpYW50IGJlcGFhbHQgem93ZWwgaGV0IHVpdGVybGlqayBhbHMgZGUgZnVuY3Rpb25hbGl0ZWl0IHZhbiB1dyBrb3ppam4uIjsNCiAgICAgICAgICAgIGgyLmluc2VydEFkamFjZW50RWxlbWVudCgiYWZ0ZXJlbmQiLCBwKTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0pOw0KICAgIH0pOw0KDQogICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7DQogICAgICBjaGlsZExpc3Q6IHRydWUsDQogICAgICBzdWJ0cmVlOiB0cnVlDQogICAgfSk7DQogIH0pOw0KPC9zY3JpcHQ+DQo8IS0tIEVORDogIlJvZWRlbnNvb3J0IGRlc2NyaXB0aW9uIiAtLT4NCg0KPCEtLSBTVEFSVDogIlZlcmRlbGluZyB2YW4gaGV0IHJhYW13ZXJrIGRlc2NyaXB0aW9uIiAtLT4NCjxzdHlsZT4NCiAgLnN1YnRpdGxlLXJhYW12ZXJkZWxpbmcgew0KICAgIG1hcmdpbi10b3A6IDAuMjVyZW07DQogICAgZm9udC1zaXplOiAwLjk1cmVtOw0KICAgIGNvbG9yOiAjNjY2Ow0KICAgIG1heC13aWR0aDogNzIwcHg7DQogIH0NCjwvc3R5bGU+DQoNCjxzY3JpcHQ+DQogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbiAoKSB7DQogICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7DQogICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJoMi5oeXBoZW5hdGUuZC1pbmxpbmUiKS5mb3JFYWNoKGgyID0+IHsNCiAgICAgICAgaWYgKGgyLnRleHRDb250ZW50LnRyaW0oKSA9PT0gIlZlcmRlbGluZyB2YW4gaGV0IHJhYW13ZXJrIikgew0KICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGgyLmNsb3Nlc3QoIi5jb2wtYXV0by5tYi0yIik7DQogICAgICAgICAgaWYgKCFjb250YWluZXIpIHJldHVybjsNCg0KICAgICAgICAgIC8vIFZvZWcgYmVzY2hyaWp2aW5nIHRvZSBpbmRpZW4gbm9nIG5pZXQgYWFud2V6aWcNCiAgICAgICAgICBpZiAoIWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIuc3VidGl0bGUtcmFhbXZlcmRlbGluZyIpKSB7DQogICAgICAgICAgICBjb25zdCBwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicCIpOw0KICAgICAgICAgICAgcC5jbGFzc05hbWUgPSAic3VidGl0bGUtcmFhbXZlcmRlbGluZyI7DQogICAgICAgICAgICBwLnRleHRDb250ZW50ID0gIlN0ZWwgaGllciBkZSB2ZXJkZWxpbmcgdmFuIGhldCByYWFtd2VyayBpbi4gVSBrdW50IGFhbmdldmVuIG9mIHUgZWVuIGhvcml6b250YWxlIG9mIHZlcnRpY2FsZSB2ZXJkZWxpbmcgd2Vuc3QsIGVuIG9wIHdlbGtlIGhvb2d0ZSBvZiBwb3NpdGllIGRlemUgbW9ldCBrb21lbi4gRGl0IGhlZWZ0IGludmxvZWQgb3AgaGV0IGFhbnppY2h0IGVuIGRlIHByYWt0aXNjaGUgdG9lcGFzc2luZyB2YW4gaGV0IGtvemlqbiwgem9hbHMgdm9vciB2ZW50aWxhdGllLSBvZiBnbGFzaW5kZWxpbmdlbi4iOw0KICAgICAgICAgICAgaDIuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJhZnRlcmVuZCIsIHApOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfSk7DQogICAgfSk7DQoNCiAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHsNCiAgICAgIGNoaWxkTGlzdDogdHJ1ZSwNCiAgICAgIHN1YnRyZWU6IHRydWUNCiAgICB9KTsNCiAgfSk7DQo8L3NjcmlwdD4NCjwhLS0gRU5EOiAiVmVyZGVsaW5nIHZhbiBoZXQgcmFhbXdlcmsgZGVzY3JpcHRpb24iIC0tPg0KDQo8IS0tIFNUQVJUOiAiTGVrZG9ycGVsIGRlc2NyaXB0aW9uIiAtLT4NCjxzdHlsZT4NCiAgLnN1YnRpdGxlLWxla2RvcnBlbCB7DQogICAgbWFyZ2luLXRvcDogMC4yNXJlbTsNCiAgICBmb250LXNpemU6IDAuOTVyZW07DQogICAgY29sb3I6ICM2NjY7DQogICAgbWF4LXdpZHRoOiA3MjBweDsNCiAgfQ0KPC9zdHlsZT4NCg0KPHNjcmlwdD4NCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uICgpIHsNCiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsNCiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImgyLmh5cGhlbmF0ZS5kLWlubGluZSIpLmZvckVhY2goaDIgPT4gew0KICAgICAgICBpZiAoaDIudGV4dENvbnRlbnQudHJpbSgpID09PSAiTGVrZG9ycGVsIikgew0KICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGgyLmNsb3Nlc3QoIi5jb2wtYXV0by5tYi0yIik7DQogICAgICAgICAgaWYgKCFjb250YWluZXIpIHJldHVybjsNCg0KICAgICAgICAgIC8vIE9tc2NocmlqdmluZyBhbGxlZW4gdG9ldm9lZ2VuIGFscyBkZXplIG5vZyBuaWV0IGJlc3RhYXQNCiAgICAgICAgICBpZiAoIWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIuc3VidGl0bGUtbGVrZG9ycGVsIikpIHsNCiAgICAgICAgICAgIGNvbnN0IHAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwIik7DQogICAgICAgICAgICBwLmNsYXNzTmFtZSA9ICJzdWJ0aXRsZS1sZWtkb3JwZWwiOw0KICAgICAgICAgICAgcC50ZXh0Q29udGVudCA9DQogICAgICAgICAgICAgICJLaWVzIGhpZXIgaGV0IHR5cGUgbGVrZG9ycGVsIGRhdCBvbmRlciB1dyBrb3ppam4gZ2VwbGFhdHN0IHdvcmR0LiBFZW4gbGVrZG9ycGVsIHpvcmd0IHZvb3IgZ2Vjb250cm9sZWVyZGUgd2F0ZXJhZnZvZXIgZW4gdm9vcmtvbXQgaW53YXRlcmluZyBpbiBkZSBnZXZlbC4gVSBrdW50IGtpZXplbiB1aXQgYWx1bWluaXVtIG9mIG5hdHV1cnN0ZWVuLCBhZmhhbmtlbGlqayB2YW4gZGUgZ2V3ZW5zdGUgdWl0c3RyYWxpbmcsIGR1dXJ6YWFtaGVpZCBlbiBidWRnZXQuIEVlbiBnb2VkZSBsZWtkb3JwZWwgZHJhYWd0IGJpaiBhYW4gZGUgbGV2ZW5zZHV1ciB2YW4gdXcgZ2V2ZWwgZW4ga296aWpuLiI7DQogICAgICAgICAgICBoMi5pbnNlcnRBZGphY2VudEVsZW1lbnQoImFmdGVyZW5kIiwgcCk7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9KTsNCiAgICB9KTsNCg0KICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSwgew0KICAgICAgY2hpbGRMaXN0OiB0cnVlLA0KICAgICAgc3VidHJlZTogdHJ1ZQ0KICAgIH0pOw0KICB9KTsNCjwvc2NyaXB0Pg0KPCEtLSBFTkQ6ICJMZWtkb3JwZWwgZGVzY3JpcHRpb24iIC0tPg0KDQo8IS0tIFNUQVJUOiAiVmVuc3RlcmJhbmsgZGVzY3JpcHRpb24iIC0tPg0KPHN0eWxlPg0KICAuc3VidGl0bGUtdmVuc3RlcmJhbmsgew0KICAgIG1hcmdpbi10b3A6IDAuMjVyZW07DQogICAgZm9udC1zaXplOiAwLjk1cmVtOw0KICAgIGNvbG9yOiAjNjY2Ow0KICAgIG1heC13aWR0aDogNzIwcHg7DQogIH0NCjwvc3R5bGU+DQoNCjxzY3JpcHQ+DQogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbiAoKSB7DQogICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7DQogICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJoMi5oeXBoZW5hdGUuZC1pbmxpbmUiKS5mb3JFYWNoKGgyID0+IHsNCiAgICAgICAgaWYgKGgyLnRleHRDb250ZW50LnRyaW0oKSA9PT0gIlZlbnN0ZXJiYW5rIikgew0KICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGgyLmNsb3Nlc3QoIi5jb2wtYXV0by5tYi0yIik7DQogICAgICAgICAgaWYgKCFjb250YWluZXIpIHJldHVybjsNCg0KICAgICAgICAgIC8vIOKchSBWZXJ3aWpkZXIgaW5mby1rbm9wIGluZGllbiBhYW53ZXppZw0KICAgICAgICAgIGNvbnN0IGluZm9CdXR0b24gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignYnV0dG9uW2RhdGEtYnMtdGFyZ2V0PSIjbW9kYWwtaGVscCJdJyk7DQogICAgICAgICAgaWYgKGluZm9CdXR0b24pIHsNCiAgICAgICAgICAgIGluZm9CdXR0b24ucmVtb3ZlKCk7DQogICAgICAgICAgfQ0KDQogICAgICAgICAgLy8g4pyFIFZvZWcgb21zY2hyaWp2aW5nIHRvZSBpbmRpZW4gbmlldCBhYW53ZXppZw0KICAgICAgICAgIGlmICghY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIi5zdWJ0aXRsZS12ZW5zdGVyYmFuayIpKSB7DQogICAgICAgICAgICBjb25zdCBwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicCIpOw0KICAgICAgICAgICAgcC5jbGFzc05hbWUgPSAic3VidGl0bGUtdmVuc3RlcmJhbmsiOw0KICAgICAgICAgICAgcC50ZXh0Q29udGVudCA9ICJTZWxlY3RlZXIgaGllciBkZSBnZXdlbnN0ZSBkaWVwdGUgdmFuIHV3IHZlbnN0ZXJiYW5rLiBVIGt1bnQga2llemVuIHR1c3NlbiAyNTAgbW0gZW4gMzAwIG1tLiBEZSB2ZW5zdGVyYmFua2VuIHppam4gYmVzY2hpa2JhYXIgaW4gdmVyc2NoaWxsZW5kZSBrbGV1cmVuOiBXaXQsIENyw6htZSwgQW50cmFjaWV0IGVuIFp3YXJ0LiBWZXJnZWV0IG5pZXQgdXcgZ2V3ZW5zdGUga2xldXIoZW4pIGluIHRlIHZ1bGxlbiBpbiBoZXQgdmVsZCBvbmRlciBkZSBwcmlqcyBiaWogJ0V2ZW50dWVsZSBzcGVjaWZpZWtlIHZvb3JrZXVyZW4nLiBabyBrdW5uZW4gd2lqIHV3IGtldXplIGNvcnJlY3QgdmVyd2Vya2VuIGluIGRlIG9mZmVydGUuIjsNCiAgICAgICAgICAgIGgyLmluc2VydEFkamFjZW50RWxlbWVudCgiYWZ0ZXJlbmQiLCBwKTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0pOw0KICAgIH0pOw0KDQogICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7DQogICAgICBjaGlsZExpc3Q6IHRydWUsDQogICAgICBzdWJ0cmVlOiB0cnVlDQogICAgfSk7DQogIH0pOw0KPC9zY3JpcHQ+DQo8IS0tIEVORDogIlZlbnN0ZXJiYW5rIGRlc2NyaXB0aW9uIiAtLT4NCg0KPCEtLSBTVEFSVDogIk9wdGlvbmVsZSBjb21wb25lbnRlbiBkZXNjcmlwdGlvbiIgLS0+DQo8c3R5bGU+DQogIC5zdWJ0aXRsZS1vcHRpZXMgew0KICAgIG1hcmdpbi10b3A6IDAuMjVyZW07DQogICAgZm9udC1zaXplOiAwLjk1cmVtOw0KICAgIGNvbG9yOiAjNjY2Ow0KICAgIG1heC13aWR0aDogNzIwcHg7DQogIH0NCjwvc3R5bGU+DQoNCjxzY3JpcHQ+DQogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbiAoKSB7DQogICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7DQogICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJoMi5oeXBoZW5hdGUuZC1pbmxpbmUiKS5mb3JFYWNoKGgyID0+IHsNCiAgICAgICAgaWYgKGgyLnRleHRDb250ZW50LnRyaW0oKSA9PT0gIk9wdGlvbmVsZSBjb21wb25lbnRlbiIpIHsNCiAgICAgICAgICBjb25zdCBjb250YWluZXIgPSBoMi5jbG9zZXN0KCIuY29sLWF1dG8ubWItMiIpOw0KICAgICAgICAgIGlmICghY29udGFpbmVyKSByZXR1cm47DQoNCiAgICAgICAgICAvLyBJbmZvLWtub3AgdmVyd2lqZGVyZW4NCiAgICAgICAgICBjb25zdCBpbmZvQnV0dG9uID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbltkYXRhLWJzLXRhcmdldD0iI21vZGFsLWhlbHAiXScpOw0KICAgICAgICAgIGlmIChpbmZvQnV0dG9uICYmIGluZm9CdXR0b24uZ2V0QXR0cmlidXRlKCdkYXRhLWJzLWNvbnRlbnQnKSA9PT0gIk9wdGlvbnMiKSB7DQogICAgICAgICAgICBpbmZvQnV0dG9uLnJlbW92ZSgpOw0KICAgICAgICAgIH0NCg0KICAgICAgICAgIC8vIE9tc2NocmlqdmluZyB0b2V2b2VnZW4gKGluZGllbiBub2cgbmlldCBhYW53ZXppZykNCiAgICAgICAgICBpZiAoIWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIuc3VidGl0bGUtb3B0aWVzIikpIHsNCiAgICAgICAgICAgIGNvbnN0IHAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwIik7DQogICAgICAgICAgICBwLmNsYXNzTmFtZSA9ICJzdWJ0aXRsZS1vcHRpZXMiOw0KICAgICAgICAgICAgcC50ZXh0Q29udGVudCA9ICJPcCBkZXplIHBhZ2luYSBrdW50IHUgZXh0cmEgb3B0aWVzIHRvZXZvZWdlbiBhYW4gdXcgcmFhbSBvZiBkZXVyLiBEZW5rIGFhbiBrbGV1ciwgZ2xhcywgdmVudGlsYXRpZXJvb3N0ZXIgb2Ygcm9lZGV2ZXJkZWxpbmdlbi4gVSBrdW50IGNvbXBvbmVudGVuIHRvZXZvZWdlbiBkb29yIG9wIGhldCBwbHVzLWljb29uIHRlIGtsaWtrZW4gb2YgYmVzdGFhbmRlIGtldXplcyBiZXdlcmtlbiBtZXQgaGV0IHBvdGxvb2RwaWN0b2dyYW0uIjsNCiAgICAgICAgICAgIGgyLmluc2VydEFkamFjZW50RWxlbWVudCgiYWZ0ZXJlbmQiLCBwKTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0pOw0KICAgIH0pOw0KDQogICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7DQogICAgICBjaGlsZExpc3Q6IHRydWUsDQogICAgICBzdWJ0cmVlOiB0cnVlDQogICAgfSk7DQogIH0pOw0KPC9zY3JpcHQ+DQo8IS0tIEVORDogIk9wdGlvbmVsZSBjb21wb25lbnRlbiBkZXNjcmlwdGlvbiIgLS0+DQoNCjwhLS0gU1RBUlQ6ICJXYXJlbmtvcmIgdG8gV2lua2Vsd2FnZW4iIC0tPg0KPHNjcmlwdD4NCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uICgpIHsNCiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsNCiAgICAgIGNvbnN0IGgxID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiaDEiKTsNCiAgICAgIGlmIChoMSAmJiBoMS50ZXh0Q29udGVudC50cmltKCkgPT09ICJXYXJlbmtvcmIiKSB7DQogICAgICAgIGgxLnRleHRDb250ZW50ID0gIldpbmtlbHdhZ2VuIjsNCiAgICAgIH0NCiAgICB9KTsNCg0KICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSwgew0KICAgICAgY2hpbGRMaXN0OiB0cnVlLA0KICAgICAgc3VidHJlZTogdHJ1ZQ0KICAgIH0pOw0KICB9KTsNCjwvc2NyaXB0Pg0KPCEtLSBFTkQ6ICJXYXJlbmtvcmIgdG8gV2lua2Vsd2FnZW4iIC0tPg0KDQo8IS0tIFNUQVJUOiAiQWRyZXNzZSBiZWFyYmVpdGVuIHRvIEFkcmVzIGJld2Vya2VuIiAtLT4NCjxzY3JpcHQ+DQogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbiAoKSB7DQogICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7DQogICAgICBjb25zdCBoMSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImgxIik7DQogICAgICBpZiAoaDEgJiYgaDEudGV4dENvbnRlbnQudHJpbSgpID09PSAiQWRyZXNzZSBiZWFyYmVpdGVuIikgew0KICAgICAgICBoMS50ZXh0Q29udGVudCA9ICJBZHJlcyBiZXdlcmtlbiI7DQogICAgICB9DQogICAgfSk7DQoNCiAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHsNCiAgICAgIGNoaWxkTGlzdDogdHJ1ZSwNCiAgICAgIHN1YnRyZWU6IHRydWUNCiAgICB9KTsNCiAgfSk7DQo8L3NjcmlwdD4NCjwhLS0gRU5EOiAiQWRyZXNzZSBiZWFyYmVpdGVuIHRvIEFkcmVzIGJld2Vya2VuIiAtLT4NCg0KPCEtLSBTVEFSVDogIk5vdyBvbmx5IiBlbiAiWW91IHNhdmUiIHZlcnRhbGVuIG5hYXIgTkwgLS0+DQo8c2NyaXB0Pg0KICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24gKCkgew0KICAgIGNvbnN0IHJlcGxhY2VtZW50cyA9IHsNCiAgICAgICJOb3cgb25seSI6ICJBY3RpZXByaWpzIiwNCiAgICAgICJZb3Ugc2F2ZSI6ICJVIGJlc3BhYXJ0Ig0KICAgIH07DQoNCiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsNCiAgICAgIGNvbnN0IGFsbFRleHROb2RlcyA9IFtdOw0KICAgICAgY29uc3QgdHJlZVdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoDQogICAgICAgIGRvY3VtZW50LmJvZHksDQogICAgICAgIE5vZGVGaWx0ZXIuU0hPV19URVhULA0KICAgICAgICBudWxsLA0KICAgICAgICBmYWxzZQ0KICAgICAgKTsNCg0KICAgICAgd2hpbGUgKHRyZWVXYWxrZXIubmV4dE5vZGUoKSkgew0KICAgICAgICBhbGxUZXh0Tm9kZXMucHVzaCh0cmVlV2Fsa2VyLmN1cnJlbnROb2RlKTsNCiAgICAgIH0NCg0KICAgICAgYWxsVGV4dE5vZGVzLmZvckVhY2gobm9kZSA9PiB7DQogICAgICAgIE9iamVjdC5lbnRyaWVzKHJlcGxhY2VtZW50cykuZm9yRWFjaCgoW2VuZ2xpc2gsIGR1dGNoXSkgPT4gew0KICAgICAgICAgIGlmIChub2RlLm5vZGVWYWx1ZS5pbmNsdWRlcyhlbmdsaXNoKSkgew0KICAgICAgICAgICAgbm9kZS5ub2RlVmFsdWUgPSBub2RlLm5vZGVWYWx1ZS5yZXBsYWNlKGVuZ2xpc2gsIGR1dGNoKTsNCiAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgICAgfSk7DQogICAgfSk7DQoNCiAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHsNCiAgICAgIGNoaWxkTGlzdDogdHJ1ZSwNCiAgICAgIHN1YnRyZWU6IHRydWUNCiAgICB9KTsNCiAgfSk7DQo8L3NjcmlwdD4NCjwhLS0gRU5EOiAiTm93IG9ubHkiIGVuICJZb3Ugc2F2ZSIgdmVydGFsZW4gbmFhciBOTCAtLT4NCg0KPCEtLSBTVEFSVCAiVmVyYmVyZyBleHRyYSBwcmlqc29wZ2F2ZSBiaWogd2lua2Vsd2FnZW4iLS0+DQo8c2NyaXB0Pg0KICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24gKCkgew0KICAgIGNvbnN0IHRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jb2wtNi5jb2wtbWQtNCAuY2FydC1pdGVtLXVuaXRQcmljZScpOw0KICAgIGlmICh0YXJnZXQpIHsNCiAgICAgIHRhcmdldC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KICAgIH0NCiAgfSk7DQo8L3NjcmlwdD4NCjxzdHlsZT4NCiAgLmNvbC02LmNvbC1tZC00IC5jYXJ0LWl0ZW0tdW5pdFByaWNlIHsNCiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7DQogIH0NCjwvc3R5bGU+DQo8IS0tIEVORCAiVmVyYmVyZyBleHRyYSBwcmlqc29wZ2F2ZSBvcCB3aW5rZWx3YWdlbiItLT4NCg0KPCEtLSBTVEFSVCAiWW91ciBwcmljZSB0b2RheSB2ZXJhbmRlcmVuIG5hYXIgYWN0aWVwcmlqcyItLT4NCjxzY3JpcHQ+DQogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbiAoKSB7DQogICAgY29uc3QgZWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIqIik7DQoNCiAgICBlbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChlbCkgew0KICAgICAgaWYgKGVsLmNoaWxkTm9kZXMubGVuZ3RoKSB7DQogICAgICAgIGVsLmNoaWxkTm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkgew0KICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAzICYmIG5vZGUubm9kZVZhbHVlLmluY2x1ZGVzKCJZb3VyIHByaWNlIHRvZGF5IikpIHsNCiAgICAgICAgICAgIG5vZGUubm9kZVZhbHVlID0gbm9kZS5ub2RlVmFsdWUucmVwbGFjZSgiWW91ciBwcmljZSB0b2RheSIsICJBY3RpZXByaWpzIik7DQogICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICAgIH0NCiAgICB9KTsNCiAgfSk7DQo8L3NjcmlwdD4NCjwhLS0gRU5EICJZb3VyIHByaWNlIHRvZGF5IHZlcmFuZGVyZW4gbmFhciBhY3RpZXByaWpzIi0tPg0KDQo8IS0tIFNUQVJUOiAiV2lua2Vsd2FnZW4sIExldmVyaW5nc2FkcmVzLCBCZXRhYWxtZXRob2RlbiwgZXRjIiAtLT4NCjxzY3JpcHQ+DQogIGZ1bmN0aW9uIHJlcGxhY2VUZXh0KG5vZGUpIHsNCiAgICBjb25zdCByZXBsYWNlbWVudHMgPSB7DQogICAgICAiQWRyZXNzZSI6ICJMZXZlcmluZ3NhZHJlcyIsDQogICAgICAiQmVzdGVsbC0gYnp3LiBaYWhsdW5nc2FydGVuIjogIkJldGFhbG1ldGhvZGVuIiwNCiAgICAgICJMaWVmZXJhcnRlbiI6ICJWZXJ6ZW5kbWV0aG9kZW4iLA0KICAgICAgIkJlc3RlbGzDvGJlcnNpY2h0IjogIkJlc3RlbG92ZXJ6aWNodCINCiAgICB9Ow0KDQogICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMpIHsNCiAgICAgIGxldCB0ZXh0ID0gbm9kZS5ub2RlVmFsdWU7DQogICAgICBPYmplY3Qua2V5cyhyZXBsYWNlbWVudHMpLmZvckVhY2goKGtleSkgPT4gew0KICAgICAgICBpZiAodGV4dC5pbmNsdWRlcyhrZXkpKSB7DQogICAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZShrZXksIHJlcGxhY2VtZW50c1trZXldKTsNCiAgICAgICAgfQ0KICAgICAgfSk7DQogICAgICBub2RlLm5vZGVWYWx1ZSA9IHRleHQ7DQogICAgfSBlbHNlIGlmIChub2RlLm5vZGVUeXBlID09PSAxICYmIG5vZGUuY2hpbGROb2Rlcykgew0KICAgICAgbm9kZS5jaGlsZE5vZGVzLmZvckVhY2gocmVwbGFjZVRleHQpOw0KICAgIH0NCiAgfQ0KDQogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCAoKSA9PiB7DQogICAgcmVwbGFjZVRleHQoZG9jdW1lbnQuYm9keSk7DQoNCiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnMpID0+IHsNCiAgICAgIG11dGF0aW9ucy5mb3JFYWNoKChtdXRhdGlvbikgPT4gew0KICAgICAgICBtdXRhdGlvbi5hZGRlZE5vZGVzLmZvckVhY2gocmVwbGFjZVRleHQpOw0KICAgICAgfSk7DQogICAgfSk7DQoNCiAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH0pOw0KICB9KTsNCjwvc2NyaXB0Pg0KPCEtLSBFTkQ6ICJXaW5rZWx3YWdlbiwgTGV2ZXJpbmdzYWRyZXMsIEJldGFhbG1ldGhvZGVuLCBldGMiIC0tPg0KDQo8IS0tIFNUQVJUOiAiRHViYmVsZSBwcmlqc29wZ2F2ZSB3aW5rZWx3YWdlbiIgLS0+DQo8c3R5bGU+DQogIC5jb2wtbWQtNiAuY2FydC1pdGVtLXVuaXRQcmljZSB7DQogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Ow0KICB9DQo8L3N0eWxlPg0KPCEtLSBFTkQ6ICJEdWJiZWxlIHByaWpzb3BnYXZlIHdpbmtlbHdhZ2VuIiAtLT4NCg0KPCEtLSBTVEFSVDogIkZvb3RlciIgLS0+DQo8c2NyaXB0Pg0KZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uICgpIHsNCiAgY29uc3QgZm9vdGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiZm9vdGVyLnNpdGUtZm9vdGVyIC5jb250YWluZXIiKTsNCg0KICBpZiAoZm9vdGVyKSB7DQogICAgY29uc3QgY29weXJpZ2h0RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQogICAgY29weXJpZ2h0RGl2LnN0eWxlLnRleHRBbGlnbiA9ICJjZW50ZXIiOw0KICAgIGNvcHlyaWdodERpdi5zdHlsZS5mb250U2l6ZSA9ICIwLjg1cmVtIjsNCiAgICBjb3B5cmlnaHREaXYuc3R5bGUuY29sb3IgPSAiIzg4OCI7DQogICAgY29weXJpZ2h0RGl2LnN0eWxlLnBhZGRpbmdUb3AgPSAiMTBweCI7DQogICAgY29weXJpZ2h0RGl2LmlubmVySFRNTCA9IGDCqSAke25ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKX0gUVdpbmRvb3JzIEIuVi4gfCBEZSBpbmhvdWQgdmFuIGRlemUgd2Vic2l0ZSBpcyBhdXRldXJzcmVjaHRlbGlqayBiZXNjaGVybWQgZW4gZWlnZW5kb20gdmFuIFFXaW5kb29ycyBCLlYuIEFsbGUgcmVjaHRlbiB6aWpuIHZvb3JiZWhvdWRlbi48YnI+T250d29ycGVuIGRvb3IgDQogICAgICA8YSBocmVmPSJodHRwczovL3d3dy5leG9zaWFuLmNvbSIgdGFyZ2V0PSJfYmxhbmsiIHN0eWxlPSJjb2xvcjogIzg4ODsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyI+RVhPU0lBTjwvYT4uYDsNCg0KICAgIGZvb3Rlci5hcHBlbmRDaGlsZChjb3B5cmlnaHREaXYpOw0KICB9DQp9KTsNCjwvc2NyaXB0Pg0KPCEtLSBFTkQ6ICJGb290ZXIiIC0tPg0KDQo8IS0tIFNUQVJUOiBQcm9kdWN0IG9tc2NocmlqdmluZyAiQWx1bWluaXVtICYgTmF0dXVyc3RlZW4gbGVrZG9ycGVsKSAtLT4NCjxzY3JpcHQ+DQogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbiAoKSB7DQogICAgY29uc3QgcHJvZHVjdE9tc2NocmlqdmluZ2VuID0gew0KICAgICAgIkxla2RvcnBlbCAoQWx1bWluaXVtKSI6ICJEZXplIGFsdW1pbml1bSBsZWtkb3JwZWwgem9yZ3Qgdm9vciBlZW4gZHV1cnphbWUgZW4gZWZmaWNpw6tudGUgYWZ3YXRlcmluZyBhYW4gZGUgb25kZXJ6aWpkZSB2YW4gdXcga296aWpuLiBIZXQgYmVzY2hlcm10IHRlZ2VuIGlud2F0ZXJlbiBlbiB2ZXJsZW5ndCBkZSBsZXZlbnNkdXVyIHZhbiB1dyBnZXZlbCBlbiBrb3ppam5jb25zdHJ1Y3RpZS4gRWVuIGZ1bmN0aW9uZWxlIMOpbiBlc3RoZXRpc2NoZSB0b2V2b2VnaW5nIHZvb3IgZWVuIG5ldHRlIGFmd2Vya2luZy4iLA0KICAgICAgIkxla2RvcnBlbCAoTmF0dXVyc3RlZW4pIjogIkRlIG5hdHV1cnN0ZW5lbiBsZWtkb3JwZWwgYmllZHQgZWVuIHJvYnV1c3RlIGVuIHN0aWpsdm9sbGUgb3Bsb3NzaW5nIHZvb3IgZWVuIGdlY29udHJvbGVlcmRlIHdhdGVyYWZ2b2VyLiBEYW5remlqIHppam4gbmF0dXVybGlqa2UgdWl0c3RyYWxpbmcgZW4gaG9nZSBkdXVyemFhbWhlaWQgaXMgZGl0IGVlbiBpZGVhbGUga2V1emUgdm9vciB6b3dlbCBtb2Rlcm5lIGFscyBrbGFzc2lla2UgZ2V2ZWxzLiBIZXQgdm9vcmtvbXQgaW53YXRlcmluZyBlbiBkcmFhZ3QgYmlqIGFhbiBlZW4gbGFuZ2UgbGV2ZW5zZHV1ciB2YW4gdXcga296aWpuIGVuIGdldmVsYmVrbGVkaW5nLiINCiAgICB9Ow0KDQogICAgZnVuY3Rpb24gcGFzT21zY2hyaWp2aW5nZW5BYW4oKSB7DQogICAgICBjb25zdCByb3dzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJvdy5vcHRpb24taXRlbSIpOw0KDQogICAgICByb3dzLmZvckVhY2goZnVuY3Rpb24gKHJvdykgew0KICAgICAgICBjb25zdCBoMyA9IHJvdy5xdWVyeVNlbGVjdG9yKCJoMyIpOw0KICAgICAgICBjb25zdCBwID0gcm93LnF1ZXJ5U2VsZWN0b3IoInAiKTsNCg0KICAgICAgICBpZiAoaDMgJiYgcCkgew0KICAgICAgICAgIGNvbnN0IHRpdGxlID0gaDMudGV4dENvbnRlbnQudHJpbSgpOw0KICAgICAgICAgIGNvbnN0IGh1aWRpZ2VUZWtzdCA9IHAudGV4dENvbnRlbnQudHJpbSgpOw0KICAgICAgICAgIGNvbnN0IG5pZXV3ZVRla3N0ID0gcHJvZHVjdE9tc2NocmlqdmluZ2VuW3RpdGxlXTsNCg0KICAgICAgICAgIGlmIChuaWV1d2VUZWtzdCAmJiBodWlkaWdlVGVrc3QgIT09IG5pZXV3ZVRla3N0KSB7DQogICAgICAgICAgICBwLnRleHRDb250ZW50ID0gbmlldXdlVGVrc3Q7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9KTsNCiAgICB9DQoNCiAgICAvLyBJbml0aWVlbCB1aXR2b2VyZW4NCiAgICBwYXNPbXNjaHJpanZpbmdlbkFhbigpOw0KDQogICAgLy8gQmxpanZlbiBvYnNlcnZlcmVuIHZvb3IgdmVyYW5kZXJpbmdlbg0KICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gew0KICAgICAgcGFzT21zY2hyaWp2aW5nZW5BYW4oKTsNCiAgICB9KTsNCg0KICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSwgew0KICAgICAgY2hpbGRMaXN0OiB0cnVlLA0KICAgICAgc3VidHJlZTogdHJ1ZQ0KICAgIH0pOw0KICB9KTsNCjwvc2NyaXB0Pg0KPCEtLSBFTkQ6IFByb2R1Y3Qgb21zY2hyaWp2aW5nICJBbHVtaW5pdW0gJiBOYXR1dXJzdGVlbiBsZWtkb3JwZWwpIC0tPg0KDQo8IS0tIFNUQVJUOiBQcm9kdWN0IG9tc2NocmlqdmluZyAiVmVuc3RlcmJhbmtlbiIgLS0+DQo8c2NyaXB0Pg0KICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24gKCkgew0KICAgIGNvbnN0IHByb2R1Y3RPbXNjaHJpanZpbmdlbiA9IHsNCiAgICAgICJWZW5zdGVyYmFuayAoMDc2MikgMjUwIG1tIC0gS2xldXJlbjogV2l0LCBDcsOobWUsIEFudHJhY2lldCwgWndhcnQiOiANCiAgICAgICAgIkRlemUgMjUwIG1tIGRpZXBlIHZlbnN0ZXJiYW5rIGlzIHZlcnZhYXJkaWdkIHVpdCBob29nd2FhcmRpZyBtYXRlcmlhYWwgZW4gYmVzY2hpa2JhYXIgaW4gdmllciBzdGlqbHZvbGxlIGtsZXVyZW46IFdpdCwgQ3LDqG1lLCBBbnRyYWNpZXQgZW4gWndhcnQuIElkZWFhbCB2b29yIHpvd2VsIHJlbm92YXRpZSBhbHMgbmlldXdib3V3IGVuIHBlcmZlY3QgYWZnZXN0ZW1kIG9wIGVsayBpbnRlcmlldXIuIiwNCiAgICAgIA0KICAgICAgIlZlbnN0ZXJiYW5rICgwNzYzKSAzMDAgbW0gLSBLbGV1cmVuOiBXaXQsIENyw6htZSwgQW50cmFjaWV0LCBad2FydCI6IA0KICAgICAgICAiRGV6ZSAzMDAgbW0gZGllcGUgdmVuc3RlcmJhbmsgYmllZHQgZXh0cmEgcnVpbXRlIGVuIHVpdHN0cmFsaW5nLiBEYW5remlqIGRlIGJyZWRlIG1hYXR2b2VyaW5nIGVuIGRlIGtldXplIHVpdCB2aWVyIGtsZXVyZW4gaXMgZGV6ZSB2ZW5zdGVyYmFuayBlZW4gZWxlZ2FudGUgb3Bsb3NzaW5nIHZvb3IgZ3JvdGVyZSByYW1lbiBvZiB2ZW5zdGVyb3BlbmluZ2VuLiINCiAgICB9Ow0KDQogICAgZnVuY3Rpb24gcGFzT21zY2hyaWp2aW5nZW5BYW4oKSB7DQogICAgICBjb25zdCByb3dzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJvdy5vcHRpb24taXRlbSIpOw0KDQogICAgICByb3dzLmZvckVhY2goZnVuY3Rpb24gKHJvdykgew0KICAgICAgICBjb25zdCBoMyA9IHJvdy5xdWVyeVNlbGVjdG9yKCJoMyIpOw0KICAgICAgICBjb25zdCBwID0gcm93LnF1ZXJ5U2VsZWN0b3IoInAiKTsNCg0KICAgICAgICBpZiAoaDMgJiYgcCkgew0KICAgICAgICAgIGNvbnN0IHRpdGxlID0gaDMudGV4dENvbnRlbnQudHJpbSgpOw0KICAgICAgICAgIGNvbnN0IGh1aWRpZ2VUZWtzdCA9IHAudGV4dENvbnRlbnQudHJpbSgpOw0KICAgICAgICAgIGNvbnN0IG5pZXV3ZVRla3N0ID0gcHJvZHVjdE9tc2NocmlqdmluZ2VuW3RpdGxlXTsNCg0KICAgICAgICAgIGlmIChuaWV1d2VUZWtzdCAmJiBodWlkaWdlVGVrc3QgIT09IG5pZXV3ZVRla3N0KSB7DQogICAgICAgICAgICBwLnRleHRDb250ZW50ID0gbmlldXdlVGVrc3Q7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9KTsNCiAgICB9DQoNCiAgICBwYXNPbXNjaHJpanZpbmdlbkFhbigpOw0KDQogICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7DQogICAgICBwYXNPbXNjaHJpanZpbmdlbkFhbigpOw0KICAgIH0pOw0KDQogICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7DQogICAgICBjaGlsZExpc3Q6IHRydWUsDQogICAgICBzdWJ0cmVlOiB0cnVlDQogICAgfSk7DQogIH0pOw0KPC9zY3JpcHQ+DQo8IS0tIEVORDogUHJvZHVjdCBvbXNjaHJpanZpbmcgIlZlbnN0ZXJiYW5rZW4iIC0tPg0KDQo8IS0tIFNUQVJUOiBad2FydGUga25vcHN0aWpsIHZvb3IgcmVzZXRrbm9wIChwZXJzaXN0ZW50KSAtLT4NCjxzdHlsZT4NCiAgLmJ0bi16d2FydCB7DQogICAgYmFja2dyb3VuZC1jb2xvcjogIzAwMCAhaW1wb3J0YW50Ow0KICAgIGNvbG9yOiAjZmZmICFpbXBvcnRhbnQ7DQogICAgcGFkZGluZzogMC42cmVtIDEuMnJlbSAhaW1wb3J0YW50Ow0KICAgIGJvcmRlcjogbm9uZSAhaW1wb3J0YW50Ow0KICAgIGJvcmRlci1yYWRpdXM6IDBweCAhaW1wb3J0YW50Ow0KICAgIGZvbnQtd2VpZ2h0OiA1MDAgIWltcG9ydGFudDsNCiAgICBmb250LXNpemU6IDFyZW0gIWltcG9ydGFudDsNCiAgICBjdXJzb3I6IHBvaW50ZXIgIWltcG9ydGFudDsNCiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMnMgZWFzZSwgY29sb3IgMC4ycyBlYXNlICFpbXBvcnRhbnQ7DQogICAgZGlzcGxheTogaW5saW5lLWZsZXggIWltcG9ydGFudDsNCiAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KICAgIGdhcDogMC40cmVtOw0KICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZSAhaW1wb3J0YW50Ow0KICB9DQoNCiAgLmJ0bi16d2FydDpob3ZlciB7DQogICAgYmFja2dyb3VuZC1jb2xvcjogIzFhMWExYSAhaW1wb3J0YW50Ow0KICAgIGNvbG9yOiAjZmZmICFpbXBvcnRhbnQ7DQogIH0NCjwvc3R5bGU+DQoNCjxzY3JpcHQ+DQogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbiAoKSB7DQogICAgZnVuY3Rpb24gdmVydmFuZ1Jlc2V0S25vcCgpIHsNCiAgICAgIGNvbnN0IHJlc2V0S25vcCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImZvcm0jcmVzZXRGb3JtIGJ1dHRvblt0eXBlPSdzdWJtaXQnXSIpOw0KDQogICAgICBpZiAocmVzZXRLbm9wICYmICFyZXNldEtub3AuY2xhc3NMaXN0LmNvbnRhaW5zKCJidG4tendhcnQiKSkgew0KICAgICAgICByZXNldEtub3AuY2xhc3NOYW1lID0gImJ0bi16d2FydCI7DQogICAgICB9DQogICAgfQ0KDQogICAgLy8gSW5pdGllZWwgdWl0dm9lcmVuDQogICAgdmVydmFuZ1Jlc2V0S25vcCgpOw0KDQogICAgLy8gQmxpanZlbmQgb2JzZXJ2ZXJlbg0KICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gew0KICAgICAgdmVydmFuZ1Jlc2V0S25vcCgpOw0KICAgIH0pOw0KDQogICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7DQogICAgICBjaGlsZExpc3Q6IHRydWUsDQogICAgICBzdWJ0cmVlOiB0cnVlDQogICAgfSk7DQogIH0pOw0KPC9zY3JpcHQ+DQo8IS0tIEVORDogWndhcnRlIGtub3BzdGlqbCB2b29yIHJlc2V0a25vcCAtLT4NCg0KPCEtLSBTVEFSVDogWndhcnRlIGtub3BzdGlqbCB2b29yIHZlbnRpbGF0aWVyb29zdGVyIHZlcndpamRlcmVuIC0tPg0KPHN0eWxlPg0KYnV0dG9uLmJ0bi1vdXRsaW5lLXNlY29uZGFyeS5yZW1vdmUtYWxsLXNhc2hGaWxsZXJzIHsNCiAgYmFja2dyb3VuZC1jb2xvcjogIzAwMCAhaW1wb3J0YW50Ow0KICBjb2xvcjogI2ZmZiAhaW1wb3J0YW50Ow0KICBib3JkZXItY29sb3I6ICMwMDAgIWltcG9ydGFudDsNCiAgcGFkZGluZzogMC41cmVtIDEuMnJlbTsNCiAgZm9udC1zaXplOiAxcmVtOw0KICBib3JkZXItcmFkaXVzOiAwLjByZW07DQogIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4zcyBlYXNlLCBib3gtc2hhZG93IDAuM3MgZWFzZTsNCn0NCg0KYnV0dG9uLmJ0bi1vdXRsaW5lLXNlY29uZGFyeS5yZW1vdmUtYWxsLXNhc2hGaWxsZXJzOmhvdmVyIHsNCiAgYmFja2dyb3VuZC1jb2xvcjogIzFhMWExYSAhaW1wb3J0YW50Ow0KICBjb2xvcjogI2ZmZiAhaW1wb3J0YW50Ow0KICBib3JkZXItY29sb3I6ICMxYTFhMWEgIWltcG9ydGFudDsNCiAgYm94LXNoYWRvdzogMCAycHggNnB4IHJnYmEoMCwgMCwgMCwgMC4zKTsNCiAgY3Vyc29yOiBwb2ludGVyOw0KfQ0KPC9zdHlsZT4NCjwhLS0gRU5EOiBad2FydGUga25vcHN0aWpsIHZvb3IgdmVudGlsYXRpZXJvb3N0ZXIgdmVyd2lqZGVyZW4gLS0+DQoNCjwhLS0gU1RBUlQ6IFByb2R1Y3Qgb21zY2hyaWp2aW5nIHZvb3IgQnJpZXZlbmJ1cyAtLT4NCjxzdHlsZT4NCi5zdWJ0aXRsZS1wcm9kdWN0b21zY2hyaWp2aW5nIHsNCiAgbWFyZ2luLXRvcDogMC4yNXJlbTsNCiAgZm9udC1zaXplOiAwLjk1cmVtOw0KICBjb2xvcjogIzY2NjsNCiAgbWF4LXdpZHRoOiA3MjBweDsNCn0NCjwvc3R5bGU+DQoNCjxzY3JpcHQ+DQpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24gKCkgew0KICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsNCiAgICBjb25zdCBoZWFkZXJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaDMnKTsNCg0KICAgIGhlYWRlcnMuZm9yRWFjaChoZWFkZXIgPT4gew0KICAgICAgaWYgKGhlYWRlci50ZXh0Q29udGVudC50cmltKCkgPT09ICJFQ08gQnJpZXZlbmJ1cyAtIDYwIG1pbnV0ZW4gYnJhbmQtIGVuIHJvb2t3ZXJlbmQgLSBFZmVjdGlzIENlcnRpZmljZXJpbmciKSB7DQogICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGhlYWRlci5jbG9zZXN0KCcuY29sLXNtLTgnKTsNCiAgICAgICAgY29uc3QgYWxyZWFkeUV4aXN0cyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcuc3VidGl0bGUtcHJvZHVjdG9tc2NocmlqdmluZycpOw0KDQogICAgICAgIC8vIFZlcndpamRlciBkdWJiZWxlIDxwPiBtZXQgemVsZmRlIGluaG91ZCBhbHMgPGgzPg0KICAgICAgICBjb25zdCBuZXh0UCA9IGhlYWRlci5uZXh0RWxlbWVudFNpYmxpbmc7DQogICAgICAgIGlmIChuZXh0UCAmJiBuZXh0UC50YWdOYW1lID09PSAiUCIgJiYgbmV4dFAudGV4dENvbnRlbnQudHJpbSgpID09PSBoZWFkZXIudGV4dENvbnRlbnQudHJpbSgpKSB7DQogICAgICAgICAgbmV4dFAucmVtb3ZlKCk7DQogICAgICAgIH0NCg0KICAgICAgICAvLyBWb2VnIG9uZGVydGl0ZWwgdG9lIGFscyBkaWUgbm9nIG5pZXQgYmVzdGFhdA0KICAgICAgICBpZiAoIWFscmVhZHlFeGlzdHMpIHsNCiAgICAgICAgICBjb25zdCBwYXJhZ3JhcGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwIik7DQogICAgICAgICAgcGFyYWdyYXBoLmNsYXNzTmFtZSA9ICJzdWJ0aXRsZS1wcm9kdWN0b21zY2hyaWp2aW5nIjsNCiAgICAgICAgICBwYXJhZ3JhcGguaW5uZXJIVE1MID0gIjxiPk9tc2NocmlqdmluZzo8L2I+PGJyPkRlemUgRUNPIGJyaWV2ZW5idXMgaXMgNjAgbWludXRlbiBicmFuZC0gZW4gcm9va3dlcmVuZCBnZXRlc3QgZW4gZ2VjZXJ0aWZpY2VlcmQgdm9sZ2VucyBkZSBFZmVjdGlzLW5vcm1lbi4gSWRlYWFsIHZvb3IgYnJhbmR2ZWlsaWdlIHRvZXBhc3NpbmdlbiBpbiB3b25pbmdlbiBvZiBhcHBhcnRlbWVudGVuLiI7DQogICAgICAgICAgaGVhZGVyLmluc2VydEFkamFjZW50RWxlbWVudCgiYWZ0ZXJlbmQiLCBwYXJhZ3JhcGgpOw0KICAgICAgICB9DQogICAgICB9DQogICAgfSk7DQogIH0pOw0KDQogIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7DQp9KTsNCjwvc2NyaXB0Pg0KPCEtLSBFTkQ6IFByb2R1Y3Qgb21zY2hyaWp2aW5nIHZvb3IgQnJpZXZlbmJ1cyAtLT4NCg0KPCEtLSBTVEFSVDogUHJvZHVjdCBvbXNjaHJpanZpbmcgdm9vciBDaWxpbmRlcnMgLS0+DQo8c3R5bGU+DQouc3VidGl0bGUtY2lsaW5kZXJzbG90IHsNCiAgbWFyZ2luLXRvcDogMC4yNXJlbTsNCiAgZm9udC1zaXplOiAwLjk1cmVtOw0KICBjb2xvcjogIzY2NjsNCiAgbWF4LXdpZHRoOiA3MjBweDsNCn0NCi5zdWJ0aXRsZS1jaWxpbmRlcnNsb3QgYiB7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KfQ0KPC9zdHlsZT4NCg0KPHNjcmlwdD4NCmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbiAoKSB7DQogIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gew0KICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2gzJykuZm9yRWFjaChoZWFkZXIgPT4gew0KICAgICAgY29uc3QgY29udGFpbmVyID0gaGVhZGVyLnBhcmVudEVsZW1lbnQ7DQogICAgICBjb25zdCB0aXRsZVRleHQgPSBoZWFkZXIudGV4dENvbnRlbnQudHJpbSgpOw0KICAgICAgY29uc3QgZHVwbGljYXRlUCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdwJyk7DQoNCiAgICAgIC8vIFZlcndpamRlciBkdWJiZWxlIDxwPiBpbmRpZW4gZGV6ZSBleGFjdCBnZWxpamsgaXMgYWFuIGRlIDxoMz4NCiAgICAgIGlmIChkdXBsaWNhdGVQICYmIGR1cGxpY2F0ZVAudGV4dENvbnRlbnQudHJpbSgpID09PSB0aXRsZVRleHQpIHsNCiAgICAgICAgZHVwbGljYXRlUC5yZW1vdmUoKTsNCiAgICAgIH0NCg0KICAgICAgLy8gVm9lZyBiZXNjaHJpanZpbmcgdG9lIGluZGllbiBub2cgbmlldCBhYW53ZXppZw0KICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcignLnN1YnRpdGxlLWNpbGluZGVyc2xvdCcpKSB7DQogICAgICAgIGxldCBpbmZvVGV4dCA9ICcnOw0KDQogICAgICAgIGlmICh0aXRsZVRleHQgPT09ICJDaWxpbmRlcnNsb3QgKERvb3JnYWFuZCkgLSBHcmVlbnRlUSBDaWxpbmRlciAyNTAwIFNLRyoqIDQwLzYwIikgew0KICAgICAgICAgIGluZm9UZXh0ID0gIjxiPk9tc2NocmlqdmluZzo8L2I+PGJyPlZvb3Igc2l0dWF0aWVzIHdhYXJpbiBoZXQgY2lsaW5kZXJzbG90IHZvbGxlZGlnIGRvb3IgaGV0IHByb2ZpZWwgaGVlbiBtb2V0IHdvcmRlbiBnZXBsYWF0c3QuIEluY2x1c2llZiBTS0cqKiBjZXJ0aWZpY2VyaW5nIHZvb3Igb3B0aW1hbGUgaW5icmFha3ZlaWxpZ2hlaWQuIjsNCiAgICAgICAgfSBlbHNlIGlmICh0aXRsZVRleHQgPT09ICJDaWxpbmRlcnNsb3QgKEdlbGlqa3NsdWl0ZW5kKSAtIEdyZWVudGVRIENpbGluZGVyIDI1MDAgU0tHKiogNDAvNjAiKSB7DQogICAgICAgICAgaW5mb1RleHQgPSAiPGI+T21zY2hyaWp2aW5nOjwvYj48YnI+RGV6ZSBnZWxpamtzbHVpdGVuZGUgY2lsaW5kZXIgYmllZHQgZ2VtYWsgZG9vcmRhdCBtZWVyZGVyZSBzbG90ZW4gbWV0IMOpw6luIHNsZXV0ZWwgdGUgb3BlbmVuIHppam4uIFVpdGdlcnVzdCBtZXQgU0tHKioga2V1cm1lcmsuIjsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChpbmZvVGV4dCAhPT0gJycpIHsNCiAgICAgICAgICBjb25zdCBwYXJhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicCIpOw0KICAgICAgICAgIHBhcmEuY2xhc3NOYW1lID0gInN1YnRpdGxlLWNpbGluZGVyc2xvdCI7DQogICAgICAgICAgcGFyYS5pbm5lckhUTUwgPSBpbmZvVGV4dDsNCiAgICAgICAgICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKHBhcmEsIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCJkaXYiKSk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9KTsNCiAgfSk7DQoNCiAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTsNCn0pOw0KPC9zY3JpcHQ+DQoNCjxzdHlsZT4NCi8qIFByb2R1Y3Qgb21zY2hyaWp2aW5nIHN0aWpsICovDQoucHJvZHVjdC1vbXNjaHJpanZpbmcgew0KICBtYXJnaW4tdG9wOiAwLjI1cmVtOw0KICBmb250LXNpemU6IDAuOTVyZW07DQogIGNvbG9yOiAjNjY2Ow0KICBtYXgtd2lkdGg6IDcyMHB4Ow0KfQ0KLnByb2R1Y3Qtb21zY2hyaWp2aW5nIHN0cm9uZyB7DQogIGRpc3BsYXk6IGJsb2NrOw0KICBmb250LXdlaWdodDogYm9sZDsNCiAgbWFyZ2luLWJvdHRvbTogMC4yNXJlbTsNCn0NCjwvc3R5bGU+DQoNCjxzY3JpcHQ+DQpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24gKCkgew0KICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsNCiAgICBjb25zdCB0aXRsZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdoMycpOw0KDQogICAgdGl0bGVzLmZvckVhY2godGl0bGUgPT4gew0KICAgICAgY29uc3QgdGV4dCA9IHRpdGxlLnRleHRDb250ZW50LnRyaW0oKTsNCg0KICAgICAgbGV0IG9tc2NocmlqdmluZyA9ICIiOw0KICAgICAgc3dpdGNoICh0ZXh0KSB7DQogICAgICAgIGNhc2UgIkNpbGluZGVyIChEb29yZ2FhbmQpIC0gSzU1L1M1NSI6DQogICAgICAgICAgb21zY2hyaWp2aW5nID0gIlN0YW5kYWFyZCBjaWxpbmRlciB2b29yIGRvb3JnYWFuZCBnZWJydWlrIG1ldCBTS0cqKiBrZXVybWVyay4gR2VzY2hpa3Qgdm9vciBkYWdlbGlqa3MgZ2VicnVpay4iOw0KICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlICJDaWxpbmRlcnNsb3QgKEtub3BjaWxpbmRlcikgLSA0NTAwIFNLRyoqIEs1NS9TNTUiOg0KICAgICAgICAgIG9tc2NocmlqdmluZyA9ICJDaWxpbmRlcnNsb3Qgdm9vcnppZW4gdmFuIGRyYWFpa25vcCB2b29yIGVlbnppamRpZ2UgYmVkaWVuaW5nLiBTS0cqKiBiZXZlaWxpZ2luZ3NuaXZlYXUuIjsNCiAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAiQ2lsaW5kZXJzbG90IChIYWx2ZSBrbm9wKSAtIEswL1M1NSI6DQogICAgICAgICAgb21zY2hyaWp2aW5nID0gIkNvbXBhY3RlIGNpbGluZGVyIG1ldCBkcmFhaWtub3AgYWFuIMOpw6luIHppamRlLiBJZGVhYWwgdm9vciBiZXJnaW5nZW4gb2YgdGVjaG5pc2NoZSBydWltdGVzLiI7DQogICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgIkNpbGluZGVyc2xvdCAoSGFsdmUgY2lsaW5kZXIpIC0gU0tHKiogSzAvUzU1IjoNCiAgICAgICAgICBvbXNjaHJpanZpbmcgPSAiSGFsdmUgY2lsaW5kZXIgbWV0IFNLRyoqIGNlcnRpZmljZXJpbmcuIEJldmVpbGlnZGUgb3Bsb3NzaW5nIHZvb3IgcnVpbXRlcyBtZXQgYmVwZXJrdGUgdG9lZ2FuZy4iOw0KICAgICAgICAgIGJyZWFrOw0KICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgIHJldHVybjsNCiAgICAgIH0NCg0KICAgICAgY29uc3QgcGFyZW50ID0gdGl0bGUuY2xvc2VzdCgnLmNvbC1zbS04Jyk7DQogICAgICBpZiAocGFyZW50ICYmICFwYXJlbnQucXVlcnlTZWxlY3RvcignLnByb2R1Y3Qtb21zY2hyaWp2aW5nJykpIHsNCiAgICAgICAgY29uc3QgcGFyYWdyYXBoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicCIpOw0KICAgICAgICBwYXJhZ3JhcGguY2xhc3NOYW1lID0gInByb2R1Y3Qtb21zY2hyaWp2aW5nIjsNCiAgICAgICAgcGFyYWdyYXBoLmlubmVySFRNTCA9ICI8c3Ryb25nPk9tc2NocmlqdmluZzo8L3N0cm9uZz4iICsgb21zY2hyaWp2aW5nOw0KICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQocGFyYWdyYXBoKTsNCiAgICAgIH0NCiAgICB9KTsNCiAgfSk7DQoNCiAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTsNCn0pOw0KPC9zY3JpcHQ+DQo8IS0tIEVORDogUHJvZHVjdCBvbXNjaHJpanZpbmcgdm9vciBDaWxpbmRlcnMgLS0+DQoNCjwhLS0gU1RBUlQ6IFByb2R1Y3Qgb21zY2hyaWp2aW5nIEhTVCBob3IgLS0tPg0KPHNjcmlwdD4NCmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbiAoKSB7DQogIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gew0KICAgIGNvbnN0IGhlYWRlcnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdoMycpOw0KDQogICAgaGVhZGVycy5mb3JFYWNoKGhlYWRlciA9PiB7DQogICAgICBpZiAoaGVhZGVyLnRleHRDb250ZW50LnRyaW0oKSA9PT0gIlZsaWVnZW5ob3Igdm9vciBzY2h1aWZkZXVyZW4iKSB7DQogICAgICAgIGhlYWRlci50ZXh0Q29udGVudCA9ICJQbGlzc8OpIGhvcmRldXIgdm9vciBzY2h1aWZkZXVyZW4iOw0KDQogICAgICAgIGNvbnN0IHBhcmVudCA9IGhlYWRlci5jbG9zZXN0KCcuY29sLXNtLTgnKTsNCiAgICAgICAgY29uc3QgYWxyZWFkeUV4aXN0cyA9IHBhcmVudC5xdWVyeVNlbGVjdG9yKCcucHJvZHVjdC1vbXNjaHJpanZpbmcnKTsNCg0KICAgICAgICBpZiAoIWFscmVhZHlFeGlzdHMpIHsNCiAgICAgICAgICBjb25zdCBwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpOw0KICAgICAgICAgIHAuY2xhc3NOYW1lID0gInByb2R1Y3Qtb21zY2hyaWp2aW5nIjsNCiAgICAgICAgICBwLmlubmVySFRNTCA9ICI8c3Ryb25nPk9tc2NocmlqdmluZzo8L3N0cm9uZz4gRGV6ZSBwbGlzc8OpIGhvcmRldXIgd29yZHQgc3Rpamx2b2wgPHU+b3AgaGV0IGtvemlqbjwvdT4gZ2VwbGFhdHN0IGVuIGJpZWR0IGVlbiBwcmFrdGlzY2hlIG9wbG9zc2luZyB2b29yIHNjaHVpZmRldXJlbi4gRWVuIGVsZWdhbnRlIGVuIGZ1bmN0aW9uZWxlIHRvZXZvZWdpbmcgZGllIGVlbnZvdWRpZyB0ZSBtb250ZXJlbiBpcy4iOw0KICAgICAgICAgIGhlYWRlci5pbnNlcnRBZGphY2VudEVsZW1lbnQoImFmdGVyZW5kIiwgcCk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9KTsNCiAgfSk7DQoNCiAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTsNCn0pOw0KPC9zY3JpcHQ+DQo8IS0tIEVORDogUHJvZHVjdCBvbXNjaHJpanZpbmcgSFNUIGhvciAtLS0+DQoNCjwhLS0gU1RBUlQ6IFByb2R1Y3Qgb21zY2hyaWp2aW5nIGhvciBlbmtlbCBkZXVyIC0tLT4NCjxzY3JpcHQ+DQpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24gKCkgew0KICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsNCiAgICBjb25zdCBjb25maWdzID0gWw0KICAgICAgew0KICAgICAgICB0aXRsZTogIkluemV0aG9yIiwNCiAgICAgICAgZGVzY3JpcHRpb246ICJFZW4gcHJha3Rpc2NoZSBlbiBlbGVnYW50ZSBob3IgZGllIHpvbmRlciBib3JlbiBvZiBzY2hyb2V2ZW4gaW4gaGV0IGtvemlqbiBnZXBsYWF0c3Qgd29yZHQuIElkZWFhbCB2b29yIGRyYWFpa2llcHJhbWVuLiINCiAgICAgIH0sDQogICAgICB7DQogICAgICAgIHRpdGxlOiAiUGxpc3PDqWhvciB2b29yIGVua2VsIGRldXIiLA0KICAgICAgICBkZXNjcmlwdGlvbjogIkRlemUgcGxpc3PDqWhvciBpcyBvbnR3b3JwZW4gdm9vciBlbmtlbGRldXJlbiBlbiB3b3JkdCBzdGlqbHZvbCBvcCBoZXQga296aWpuIGdlcGxhYXRzdC4gRWVuIGR1dXJ6YW1lIGVuIHJ1aW10ZWJlc3BhcmVuZGUgb3Bsb3NzaW5nIG1ldCBlZW4gc29lcGVsZSBiZWRpZW5pbmcuIg0KICAgICAgfQ0KICAgIF07DQoNCiAgICBjb25maWdzLmZvckVhY2goKHsgdGl0bGUsIGRlc2NyaXB0aW9uIH0pID0+IHsNCiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5vcHRpb24taXRlbSIpLmZvckVhY2goKGl0ZW0pID0+IHsNCiAgICAgICAgY29uc3QgaGVhZGVyID0gaXRlbS5xdWVyeVNlbGVjdG9yKCJoMyIpOw0KICAgICAgICBpZiAoaGVhZGVyICYmIGhlYWRlci50ZXh0Q29udGVudC50cmltKCkgPT09IHRpdGxlKSB7DQogICAgICAgICAgY29uc3QgZXhpc3RzID0gaXRlbS5xdWVyeVNlbGVjdG9yKCIuc3VidGl0bGUtcHJvZHVjdG9tc2NocmlqdmluZyIpOw0KICAgICAgICAgIGlmICghZXhpc3RzKSB7DQogICAgICAgICAgICBjb25zdCBwYXJhZ3JhcGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwIik7DQogICAgICAgICAgICBwYXJhZ3JhcGguY2xhc3NOYW1lID0gInN1YnRpdGxlLXByb2R1Y3RvbXNjaHJpanZpbmciOw0KICAgICAgICAgICAgcGFyYWdyYXBoLmlubmVySFRNTCA9ICI8c3Ryb25nPkluZm9ybWF0aWU6PC9zdHJvbmc+PGJyPiIgKyBkZXNjcmlwdGlvbjsNCiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGl0ZW0ucXVlcnlTZWxlY3RvcigiLmNvbC1zbS04Iik7DQogICAgICAgICAgICBpZiAoY29udGFpbmVyKSBjb250YWluZXIuaW5zZXJ0QmVmb3JlKHBhcmFncmFwaCwgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoImRpdiIpKTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0pOw0KICAgIH0pOw0KICB9KTsNCg0KICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHsNCiAgICBjaGlsZExpc3Q6IHRydWUsDQogICAgc3VidHJlZTogdHJ1ZQ0KICB9KTsNCn0pOw0KPC9zY3JpcHQ+DQo8c3R5bGU+DQouc3VidGl0bGUtcHJvZHVjdG9tc2NocmlqdmluZyB7DQogIG1hcmdpbi10b3A6IDAuMjVyZW07DQogIGZvbnQtc2l6ZTogMC45NXJlbTsNCiAgY29sb3I6ICM2NjY7DQogIG1heC13aWR0aDogNzIwcHg7DQp9DQo8L3N0eWxlPg0KPCEtLSBFTkQ6IFByb2R1Y3Qgb21zY2hyaWp2aW5nIGhvciBlbmtlbCBkZXVyIC0tLT4NCg0KPCEtLSBTVEFSVDogUHJvZHVjdCBvbXNjaHJpanZpbmcgaG9yIGR1YmJlbGUgZGV1ciAtLS0+DQo8c2NyaXB0Pg0KZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uICgpIHsNCiAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7DQogICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLm9wdGlvbi1pdGVtIikuZm9yRWFjaCgoaXRlbSkgPT4gew0KICAgICAgY29uc3QgaGVhZGVyID0gaXRlbS5xdWVyeVNlbGVjdG9yKCJoMyIpOw0KICAgICAgaWYgKGhlYWRlciAmJiBoZWFkZXIudGV4dENvbnRlbnQudHJpbSgpID09PSAiUGxpc3PDqWhvciB2b29yIGR1YmJlbGUgZGV1cmVuIikgew0KICAgICAgICBjb25zdCBleGlzdHMgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoIi5zdWJ0aXRsZS1wcm9kdWN0b21zY2hyaWp2aW5nIik7DQogICAgICAgIGlmICghZXhpc3RzKSB7DQogICAgICAgICAgY29uc3QgcGFyYWdyYXBoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicCIpOw0KICAgICAgICAgIHBhcmFncmFwaC5jbGFzc05hbWUgPSAic3VidGl0bGUtcHJvZHVjdG9tc2NocmlqdmluZyI7DQogICAgICAgICAgcGFyYWdyYXBoLmlubmVySFRNTCA9ICI8c3Ryb25nPkluZm9ybWF0aWU6PC9zdHJvbmc+PGJyPkRlemUgcGxpc3PDqWhvciB2b29yIGR1YmJlbGUgZGV1cmVuIHdvcmR0IG9wIGhldCBrb3ppam4gZ2Vtb250ZWVyZC4gSWRlYWFsIHZvb3IgYnJlZGUgZGV1cm9wZW5pbmdlbiBlbiBlZW52b3VkaWcgdGUgYmVkaWVuZW4gZGFua3ppaiBkZSBzb2VwZWxlIHZvdXd0ZWNobmllay4iOw0KICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGl0ZW0ucXVlcnlTZWxlY3RvcigiLmNvbC1zbS04Iik7DQogICAgICAgICAgaWYgKGNvbnRhaW5lcikgY29udGFpbmVyLmluc2VydEJlZm9yZShwYXJhZ3JhcGgsIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCJkaXYiKSk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9KTsNCiAgfSk7DQoNCiAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7DQogICAgY2hpbGRMaXN0OiB0cnVlLA0KICAgIHN1YnRyZWU6IHRydWUNCiAgfSk7DQp9KTsNCjwvc2NyaXB0Pg0KDQo8c3R5bGU+DQouc3VidGl0bGUtcHJvZHVjdG9tc2NocmlqdmluZyB7DQogIG1hcmdpbi10b3A6IDAuMjVyZW07DQogIGZvbnQtc2l6ZTogMC45NXJlbTsNCiAgY29sb3I6ICM2NjY7DQogIG1heC13aWR0aDogNzIwcHg7DQp9DQo8L3N0eWxlPg0KPCEtLSBFTkQ6IFByb2R1Y3Qgb21zY2hyaWp2aW5nIGhvciBkdWJiZWxlIGRldXIgLS0tPg0KDQo8IS0tIFNUQVJUOiBFeHRyYSBrbm9wcGVuIHp3YXJ0IG1ha2VuIGluIFdpbmtlbHdhZ2VuIC0tLT4NCjxzdHlsZT4NCi8qIFp3YXJ0ZSBrbm9wcGVuIG1ldCB3aXR0ZSB0ZWtzdCAqLw0KI2FkZE5ld0NvbmZpZ3VyYXRpb24uYnRuLW91dGxpbmUtc2Vjb25kYXJ5LA0KI2R1cGxpY2F0ZUxhc3RDb25maWd1cmF0aW9uIC5idG4tb3V0bGluZS1zZWNvbmRhcnksDQojYWRkTmV3QXJ0aWNsZS5idG4tb3V0bGluZS1zZWNvbmRhcnkgew0KICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDAgIWltcG9ydGFudDsNCiAgICBib3JkZXItY29sb3I6ICMwMDAgIWltcG9ydGFudDsNCiAgICBjb2xvcjogI2ZmZiAhaW1wb3J0YW50Ow0KfQ0KDQovKiBIb3Zlci1lZmZlY3Qgdm9vciBrbm9wcGVuICovDQojYWRkTmV3Q29uZmlndXJhdGlvbi5idG4tb3V0bGluZS1zZWNvbmRhcnk6aG92ZXIsDQojZHVwbGljYXRlTGFzdENvbmZpZ3VyYXRpb24gLmJ0bi1vdXRsaW5lLXNlY29uZGFyeTpob3ZlciwNCiNhZGROZXdBcnRpY2xlLmJ0bi1vdXRsaW5lLXNlY29uZGFyeTpob3ZlciB7DQogICAgYmFja2dyb3VuZC1jb2xvcjogIzIyMiAhaW1wb3J0YW50Ow0KICAgIGJvcmRlci1jb2xvcjogIzIyMiAhaW1wb3J0YW50Ow0KICAgIGNvbG9yOiAjZmZmICFpbXBvcnRhbnQ7DQp9DQoNCi8qIFpvcmcgZXJ2b29yIGRhdCBpY29uZW4gb29rIHdpdCBibGlqdmVuICovDQojYWRkTmV3Q29uZmlndXJhdGlvbiAuZmFzLA0KI2R1cGxpY2F0ZUxhc3RDb25maWd1cmF0aW9uIC5mYXIsDQojYWRkTmV3QXJ0aWNsZSAuZmFzIHsNCiAgICBjb2xvcjogI2ZmZiAhaW1wb3J0YW50Ow0KfQ0KPC9zdHlsZT4NCjxzdHlsZT4NCi8qIFp3YXJ0ZSBzdGlqbCB2b29yIGRlIE9wc2xhYW4ta25vcCAqLw0KYnV0dG9uLmJ0bi1vdXRsaW5lLXNlY29uZGFyeS5idG4tc21bZm9ybV49ImZvcm0tcXVhbnRpdHktIl0gew0KICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDAgIWltcG9ydGFudDsNCiAgICBib3JkZXItY29sb3I6ICMwMDAgIWltcG9ydGFudDsNCiAgICBjb2xvcjogI2ZmZiAhaW1wb3J0YW50Ow0KfQ0KDQovKiBIb3Zlci1lZmZlY3QgKi8NCmJ1dHRvbi5idG4tb3V0bGluZS1zZWNvbmRhcnkuYnRuLXNtW2Zvcm1ePSJmb3JtLXF1YW50aXR5LSJdOmhvdmVyIHsNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjIyICFpbXBvcnRhbnQ7DQogICAgYm9yZGVyLWNvbG9yOiAjMjIyICFpbXBvcnRhbnQ7DQogICAgY29sb3I6ICNmZmYgIWltcG9ydGFudDsNCn0NCjwvc3R5bGU+DQo8IS0tIEVORDogRXh0cmEga25vcHBlbiB6d2FydCBtYWtlbiBpbiBXaW5rZWx3YWdlbiAtLS0+DQoNCjwhLS0gU1RBUlQ6IE9tc2NocmlqdmluZyBkaWVuc3RlbiAtLS0+DQo8c3R5bGU+DQouZGllbnN0ZW4tb21zY2hyaWp2aW5nIHsNCiAgZm9udC1zaXplOiAwLjk1cmVtOw0KICBjb2xvcjogIzY2NjsNCiAgbWF4LXdpZHRoOiA3MjBweDsNCiAgbWFyZ2luLXRvcDogMC4yNXJlbTsNCiAgbWFyZ2luLWJvdHRvbTogMXJlbTsNCn0NCjwvc3R5bGU+DQoNCjxzY3JpcHQ+DQpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24gKCkgew0KICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsNCiAgICBjb25zdCBoZWFkZXJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaDIuaHlwaGVuYXRlLmQtaW5saW5lJyk7DQoNCiAgICBoZWFkZXJzLmZvckVhY2goaGVhZGVyID0+IHsNCiAgICAgIGlmIChoZWFkZXIudGV4dENvbnRlbnQudHJpbSgpID09PSAiRGllbnN0ZW4iKSB7DQogICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGhlYWRlci5jbG9zZXN0KCcuY29sLWF1dG8ubWItMicpOw0KICAgICAgICBpZiAoIWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcuZGllbnN0ZW4tb21zY2hyaWp2aW5nJykpIHsNCiAgICAgICAgICBjb25zdCBwYXJhZ3JhcGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwIik7DQogICAgICAgICAgcGFyYWdyYXBoLmNsYXNzTmFtZSA9ICJkaWVuc3Rlbi1vbXNjaHJpanZpbmciOw0KICAgICAgICAgIHBhcmFncmFwaC5pbm5lckhUTUwgPSAiQmlubmVuIGRlemUgaG9vZmRjYXRlZ29yaWUgdmFsbGVuIGFhbnZ1bGxlbmRlIHNlcnZpY2VzLCB3YWFyb25kZXIgbW9udGFnZS4gU2VsZWN0ZWVyIGFsc3R1YmxpZWZ0IMOpw6luIHZhbiBkZSBiZXNjaGlrYmFyZSBzdWJjYXRlZ29yaWXDq24gb20gdmVyZGVyIHRlIGdhYW4gbWV0IHV3IGNvbmZpZ3VyYXRpZS4iOw0KICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChwYXJhZ3JhcGgpOw0KICAgICAgICB9DQogICAgICB9DQogICAgfSk7DQogIH0pOw0KDQogIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7DQp9KTsNCjwvc2NyaXB0Pg0KPCEtLS0gRU5EOiBPbXNjaHJpanZpbmcgZGllbnN0ZW4gLS0tPg0KDQo8IS0tLSBTVEFSVDogT21zY2hyaWp2aW5nIHZvb3IgIlByb2R1Y3RlbiItLS0+DQo8c3R5bGU+DQoucHJvZHVjdGVuLW9tc2NocmlqdmluZyB7DQogIGZvbnQtc2l6ZTogMC45NXJlbTsNCiAgY29sb3I6ICM2NjY7DQogIG1heC13aWR0aDogNzIwcHg7DQogIG1hcmdpbi10b3A6IDAuMjVyZW07DQogIG1hcmdpbi1ib3R0b206IDFyZW07DQp9DQo8L3N0eWxlPg0KDQo8c2NyaXB0Pg0KZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uICgpIHsNCiAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7DQogICAgY29uc3QgaGVhZGVycyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2gyLmh5cGhlbmF0ZS5kLWlubGluZScpOw0KDQogICAgaGVhZGVycy5mb3JFYWNoKGhlYWRlciA9PiB7DQogICAgICBpZiAoaGVhZGVyLnRleHRDb250ZW50LnRyaW0oKSA9PT0gIlByb2R1Y3RlbiIpIHsNCiAgICAgICAgY29uc3QgY29udGFpbmVyID0gaGVhZGVyLmNsb3Nlc3QoJy5jb2wtYXV0by5tYi0yJyk7DQogICAgICAgIGlmICghY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5wcm9kdWN0ZW4tb21zY2hyaWp2aW5nJykpIHsNCiAgICAgICAgICBjb25zdCBwYXJhZ3JhcGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwIik7DQogICAgICAgICAgcGFyYWdyYXBoLmNsYXNzTmFtZSA9ICJwcm9kdWN0ZW4tb21zY2hyaWp2aW5nIjsNCiAgICAgICAgICBwYXJhZ3JhcGguaW5uZXJIVE1MID0gIkJpbm5lbiBkZXplIGhvb2ZkY2F0ZWdvcmllIHZhbGxlbiBhYW52dWxsZW5kZSBhY2Nlc3NvaXJlcyBlbiBvcHRpZXMuIFNlbGVjdGVlciBhbHN0dWJsaWVmdCDDqcOpbiB2YW4gZGUgYmVzY2hpa2JhcmUgc3ViY2F0ZWdvcmllw6tuIG9tIHZlcmRlciB0ZSBnYWFuIG1ldCB1dyBjb25maWd1cmF0aWUuIjsNCiAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQocGFyYWdyYXBoKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0pOw0KICB9KTsNCg0KICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH0pOw0KfSk7DQo8L3NjcmlwdD4NCjwhLS0tIEVORDogT21zY2hyaWp2aW5nIHZvb3IgIlByb2R1Y3RlbiItLS0+DQoNCjwhLS0tIFNUQVJUOiBWZXJ3aWpkZXIgIlJlbW92ZSBhbGwgZmlsbGVycyItLS0+DQo8c3R5bGU+DQovKiBWZXJiZXJnIHZpc3VlZWwgZGUgY29udGFpbmVyIHZhbiBkZSBrbm9wICovDQpkaXYuY29sLW1kLTEyID4gLnJlbW92ZS1hbGwtc2FzaEZpbGxlcnMgew0KICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7DQp9DQo8L3N0eWxlPg0KDQo8c2NyaXB0Pg0KZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uICgpIHsNCiAgLy8gWm9layBoZXQgZGl2LWVsZW1lbnQgbWV0IGRlIGtub3AgIkFsbGUgdmVudGlsYXRpZXJvb3N0ZXJzIHZlcndpamRlcmVuIg0KICBjb25zdCByZW1vdmVBbGxEaXYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdkaXYuY29sLW1kLTEyID4gLnJlbW92ZS1hbGwtc2FzaEZpbGxlcnMnKTsNCiAgaWYgKHJlbW92ZUFsbERpdikgew0KICAgIGNvbnN0IHBhcmVudERpdiA9IHJlbW92ZUFsbERpdi5jbG9zZXN0KCcuY29sLW1kLTEyJyk7DQogICAgaWYgKHBhcmVudERpdikgew0KICAgICAgcGFyZW50RGl2LnJlbW92ZSgpOyAvLyBWZXJ3aWpkZXIgaGV0IHZvbGxlZGlnZSBibG9rIHVpdCBkZSBET00NCiAgICB9IGVsc2Ugew0KICAgICAgcmVtb3ZlQWxsRGl2LnJlbW92ZSgpOyAvLyBGYWxsYmFjazogdmVyd2lqZGVyIGFsbGVlbiBkZSBrbm9wDQogICAgfQ0KICB9DQp9KTsNCjwvc2NyaXB0Pg0KPCEtLS0gRU5EOiBWZXJ3aWpkZXIgIlJlbW92ZSBhbGwgZmlsbGVycyItLS0+DQoNCjwhLS0tIFNUQVJUOiBWZW50aWxhdGllcm9vc3RlciB8IEFsbGVlbiBibG9ra2VyZW4gYWxzIGluaG91ZCBpcyAiRmlsbGVyXzE5NDkxIikgLS0tPg0KPHNjcmlwdD4NCmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbiAoKSB7DQogIGZ1bmN0aW9uIGNoZWNrQW5kUmVtb3ZlRmlsbGVyQnV0dG9ucygpIHsNCiAgICBjb25zdCByb3dzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgidGFibGUgdHIiKTsNCg0KICAgIHJvd3MuZm9yRWFjaCgocm93KSA9PiB7DQogICAgICBjb25zdCBjZWxscyA9IHJvdy5xdWVyeVNlbGVjdG9yQWxsKCJ0ZCIpOw0KICAgICAgaWYgKGNlbGxzLmxlbmd0aCA+IDEpIHsNCiAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBjZWxsc1sxXS50ZXh0Q29udGVudC50cmltKCk7DQoNCiAgICAgICAgaWYgKGRlc2NyaXB0aW9uID09PSAiRmlsbGVyXzE5NDkxIikgew0KICAgICAgICAgIC8vIFpvZWsgZGUgdmVyd2lqZGVya25vcA0KICAgICAgICAgIGNvbnN0IGRlbGV0ZUJ1dHRvbiA9IHJvdy5xdWVyeVNlbGVjdG9yKCIucmVtb3ZlLUJ1dHRvbiIpOw0KICAgICAgICAgIGlmIChkZWxldGVCdXR0b24pIHsNCiAgICAgICAgICAgIC8vIFZlcndpamRlciBkZSBrbm9wIHZvbGxlZGlnIHVpdCBkZSBET00NCiAgICAgICAgICAgIGRlbGV0ZUJ1dHRvbi5yZW1vdmUoKTsNCiAgICAgICAgICAgIGNvbnNvbGUubG9nKCIgRmlsbGVyXzE5NDkxIHZlcndpamRlcmtub3AgaXMgdmVyd2lqZGVyZCB1aXQgZGUgRE9NLiIpOw0KICAgICAgICAgIH0NCg0KICAgICAgICAgIC8vIE9wdGlvbmVlbDogbWFya2VlciByaWogdmlzdWVlbA0KICAgICAgICAgIHJvdy5zdHlsZS5vcGFjaXR5ID0gIjAuNiI7DQogICAgICAgICAgcm93LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAibm9uZSI7DQogICAgICAgICAgcm93LnN0eWxlLmN1cnNvciA9ICJub3QtYWxsb3dlZCI7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9KTsNCiAgfQ0KDQogIC8vIERpcmVjdCB1aXR2b2VyZW4gYmlqIHBhZ2luYWxhYWQNCiAgY2hlY2tBbmRSZW1vdmVGaWxsZXJCdXR0b25zKCk7DQoNCiAgLy8gSGVyaGFhbCBhdXRvbWF0aXNjaCBiaWogZHluYW1pc2NoZSB3aWp6aWdpbmdlbiAoU1BBLCByZWxvYWRzLCBBSkFYKQ0KICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsNCiAgICBjaGVja0FuZFJlbW92ZUZpbGxlckJ1dHRvbnMoKTsNCiAgfSk7DQoNCiAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7DQogICAgY2hpbGRMaXN0OiB0cnVlLA0KICAgIHN1YnRyZWU6IHRydWUsDQogIH0pOw0KfSk7DQo8L3NjcmlwdD4NCjwhLS0tIEVORDogVmVudGlsYXRpZXJvb3N0ZXIgfCBBbGxlZW4gYmxva2tlcmVuIGFscyBpbmhvdWQgaXMgIkZpbGxlcl8xOTQ5MSIpIC0tLT4NCg0KPCEtLS0gU1RBUlQ6IEtsYW50ZW5zZXJ2aWNlIEljb29uIC0tLT4NCjxzdHlsZT4NCi8qIEtsYW50ZW5zZXJ2aWNlIGtub3Agc3R5bGluZyAqLw0KLnNpdGUtaGVhZGVyLWFjdGlvbi5rbGFudGVuc2VydmljZS1saW5rIHsNCiAgbWFyZ2luLXJpZ2h0OiAxcmVtOw0KICBkaXNwbGF5OiBmbGV4Ow0KICBhbGlnbi1pdGVtczogY2VudGVyOw0KICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQogIGNvbG9yOiBpbmhlcml0Ow0KfQ0KDQouc2l0ZS1oZWFkZXItYWN0aW9uLmtsYW50ZW5zZXJ2aWNlLWxpbmsgLmZhLWhlYWRzZXQgew0KICBtYXJnaW4tcmlnaHQ6IDZweDsNCn0NCjwvc3R5bGU+DQoNCjxzY3JpcHQ+DQpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24gKCkgew0KICBjb25zdCBhY3Rpb25Db250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIuc2l0ZS1oZWFkZXItYWN0aW9ucyIpOw0KDQogIGlmIChhY3Rpb25Db250YWluZXIpIHsNCiAgICBjb25zdCBrbGFudGVuc2VydmljZUxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7DQogICAga2xhbnRlbnNlcnZpY2VMaW5rLmhyZWYgPSAiaHR0cHM6Ly93d3cucXdpbmRvb3JzLmNvbS9rbGFudGVuc2VydmljZSI7DQogICAga2xhbnRlbnNlcnZpY2VMaW5rLmNsYXNzTmFtZSA9ICJzaXRlLWhlYWRlci1hY3Rpb24ga2xhbnRlbnNlcnZpY2UtbGluayI7DQogICAga2xhbnRlbnNlcnZpY2VMaW5rLnRpdGxlID0gIk5lZW0gY29udGFjdCBvcCBtZXQgb256ZSBrbGFudGVuc2VydmljZSI7DQogICAga2xhbnRlbnNlcnZpY2VMaW5rLnRhcmdldCA9ICJfYmxhbmsiOw0KDQogICAga2xhbnRlbnNlcnZpY2VMaW5rLmlubmVySFRNTCA9IGANCiAgICAgIDxzcGFuIGNsYXNzPSJmYXMgZmEtaGVhZHNldCBzaXRlLWhlYWRlci1hY3Rpb24taWNvbiI+PC9zcGFuPg0KICAgICAgPHNwYW4gY2xhc3M9ImQtbm9uZSBkLXNtLWJsb2NrIj5LbGFudGVuc2VydmljZTwvc3Bhbj4NCiAgICBgOw0KDQogICAgLy8gVm9lZyBkZSBrbm9wIHRvZSB2w7PDs3IgZGUgIldlYnNpdGUiLWtub3AgYWxzIGRpZSBiZXN0YWF0DQogICAgY29uc3Qgd2Vic2l0ZUxpbmsgPSBhY3Rpb25Db250YWluZXIucXVlcnlTZWxlY3RvcigiLndlYnNpdGUtbGluayIpOw0KICAgIGlmICh3ZWJzaXRlTGluaykgew0KICAgICAgYWN0aW9uQ29udGFpbmVyLmluc2VydEJlZm9yZShrbGFudGVuc2VydmljZUxpbmssIHdlYnNpdGVMaW5rKTsNCiAgICB9IGVsc2Ugew0KICAgICAgYWN0aW9uQ29udGFpbmVyLmluc2VydEJlZm9yZShrbGFudGVuc2VydmljZUxpbmssIGFjdGlvbkNvbnRhaW5lci5maXJzdENoaWxkKTsNCiAgICB9DQogIH0NCn0pOw0KPC9zY3JpcHQ+DQo8IS0tLSBFTkQ6IEtsYW50ZW5zZXJ2aWNlIEljb29uIC0tLT4NCg0KPCEtLS0gU1RBUlQ6IFZlcmxhdGVuIHZhbiBkZSB0YWIgLS0tPg0KPHNjcmlwdD4NCmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbiAoKSB7DQogIGNvbnN0IG9yaWdpbmFsVGl0bGUgPSBkb2N1bWVudC50aXRsZTsNCg0KICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIiwgZnVuY3Rpb24gKCkgew0KICAgIGlmIChkb2N1bWVudC5oaWRkZW4pIHsNCiAgICAgIC8vIFdhbm5lZXIgZ2VicnVpa2VyIGRlIHRhYiB2ZXJsYWF0DQogICAgICBkb2N1bWVudC50aXRsZSA9ICLimqDvuI8gVmVyZ2VldCBuaWV0IHV3IGNvbmZpZ3VyYXRpZSBhZiB0ZSByb25kZW4sIGluZGllbiB1IGRpdCBub2cgbmlldCBoZWVmdCBnZWRhYW4uIjsNCiAgICB9IGVsc2Ugew0KICAgICAgLy8gV2FubmVlciBnZWJydWlrZXIgdGVydWdrb210DQogICAgICBkb2N1bWVudC50aXRsZSA9IG9yaWdpbmFsVGl0bGU7DQogICAgfQ0KICB9KTsNCn0pOw0KPC9zY3JpcHQ+DQo8IS0tLSBFTkQ6IFZlcmxhdGVuIHZhbiBkZSB0YWIgLS0tPg0KDQo8IS0tIFNUQVJUOiBSZW1vdmUgZGlzY291bnQgaW1hZ2UgLS0tPg0KPHNjcmlwdD4NCmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbiAoKSB7DQogIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gew0KICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2ltZy5wcmljaW5nLWRpc2NvdW50LWltYWdlJykuZm9yRWFjaChpbWcgPT4gew0KICAgICAgaWYgKGltZy5zcmMuaW5jbHVkZXMoImRpc2NvdW50LjE3NDI4MjExNDgucG5nIikpIHsNCiAgICAgICAgaW1nLnJlbW92ZSgpOw0KICAgICAgfQ0KICAgIH0pOw0KICB9KTsNCg0KICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHsNCiAgICBjaGlsZExpc3Q6IHRydWUsDQogICAgc3VidHJlZTogdHJ1ZQ0KICB9KTsNCn0pOw0KPC9zY3JpcHQ+DQo8IS0tIEVORDogUmVtb3ZlIGRpc2NvdW50IGltYWdlIC0tLT4NCg0KPCEtLSBTVEFSVDogQmxhY2sgdGV4dCBuYXYtd2lua2Vsd2FnZW4gLS0tPg0KPHN0eWxlPg0KICAuY2hlY2tvdXQtcHJvZ3Jlc3NCYXIgLm5hdi1saW5rLmRpc2FibGVkIHsNCiAgICBjb2xvcjogIzAwMDAwMCAhaW1wb3J0YW50OyAvKiBad2FydGUgdGVrc3Qgdm9vciBuaWV0LWdlc2VsZWN0ZWVyZGUgKi8NCiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsgICAgICAgLyogQmxva2tlZXIga2xpa2tlbiAqLw0KICAgIGN1cnNvcjogZGVmYXVsdDsNCiAgICBvcGFjaXR5OiAxOyAgICAgICAgICAgICAgICAgLyogWm9yZyBkYXQgendhcnQgbmlldCB2ZXJ2YWFnZCBpcyAqLw0KICB9DQoNCiAgLmNoZWNrb3V0LXByb2dyZXNzQmFyIC5uYXYtbGluay5hY3RpdmUgew0KICAgIC8qIEhvdWQgaHVpZGlnZSBhY3RpZXZlIHN0eWxpbmcgaW50YWN0OyANCiAgICAgICBnZWVuIHdpanppZ2luZyB0ZW56aWogdSBpZXRzIGV4dHJh4oCZcyB3aWx0ICovDQogIH0NCjwvc3R5bGU+DQo8IS0tIEVORDogQmxhY2sgdGV4dCBuYXYtd2lua2Vsd2FnZW4gLS0tPg0KDQo8IS0tIFNUQVJUOiBWb2xnZW5kZSBrbm9wIC0tLT4NCjxzY3JpcHQ+DQogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbiAoKSB7DQogICAgY29uc3QgYnV0dG9ucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W3R5cGU9InN1Ym1pdCJdW3ZhbHVlPSJ2b2xnZW5kZSJdJyk7DQogICAgYnV0dG9ucy5mb3JFYWNoKGZ1bmN0aW9uIChidXR0b24pIHsNCiAgICAgIGJ1dHRvbi52YWx1ZSA9ICJWb2xnZW5kZSI7DQogICAgfSk7DQogIH0pOw0KPC9zY3JpcHQ+DQoNCjxzY3JpcHQ+DQogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbiAoKSB7DQogICAgLy8gUGFzIGFsbGUgaW5wdXRbdHlwZT1zdWJtaXRdIGtub3BwZW4gYWFuIG1ldCB2YWx1ZT0idm9sZ2VuZGUiDQogICAgY29uc3QgaW5wdXRCdXR0b25zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbdHlwZT0ic3VibWl0Il1bdmFsdWU9InZvbGdlbmRlIl0nKTsNCiAgICBpbnB1dEJ1dHRvbnMuZm9yRWFjaChmdW5jdGlvbiAoYnV0dG9uKSB7DQogICAgICBidXR0b24udmFsdWUgPSAiVm9sZ2VuZGUiOw0KICAgIH0pOw0KDQogICAgLy8gUGFzIGFsbGUgPGJ1dHRvbj4ga25vcHBlbiBhYW4gd2FhcnZhbiBkZSB0ZWtzdCBleGFjdCAidm9sZ2VuZGUiIGlzDQogICAgY29uc3QgdGV4dEJ1dHRvbnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdidXR0b25bdHlwZT0ic3VibWl0Il0nKTsNCiAgICB0ZXh0QnV0dG9ucy5mb3JFYWNoKGZ1bmN0aW9uIChidXR0b24pIHsNCiAgICAgIGlmIChidXR0b24udGV4dENvbnRlbnQudHJpbSgpLnRvTG93ZXJDYXNlKCkgPT09ICJ2b2xnZW5kZSIpIHsNCiAgICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gIlZvbGdlbmRlIjsNCiAgICAgIH0NCiAgICB9KTsNCiAgfSk7DQo8L3NjcmlwdD4NCjwhLS0tIEVORDogVm9sZ2VuZGUga25vcCAtLS0+DQoNCjwhLS0tIFNUQVJUOiBPZmZlcnRlYWFudnJhYWcgdGl0ZWwgLS0tPg0KPHNjcmlwdD4NCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uICgpIHsNCiAgICBjb25zdCBlbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIioiKTsNCiAgICBlbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChlbCkgew0KICAgICAgaWYgKGVsLmNoaWxkTm9kZXMubGVuZ3RoID09PSAxICYmIGVsLmNoaWxkTm9kZXNbMF0ubm9kZVR5cGUgPT09IDMpIHsNCiAgICAgICAgaWYgKGVsLnRleHRDb250ZW50LnRyaW0oKSA9PT0gIkJlc3RlbGxiZXN0w6R0aWd1bmciKSB7DQogICAgICAgICAgZWwudGV4dENvbnRlbnQgPSAiV2lqIGhlYmJlbiB1dyBvZmZlcnRlYWFudnJhYWcgaW4gZ29lZGUgb3JkZSBvbnR2YW5nZW4hIjsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0pOw0KICB9KTsNCjwvc2NyaXB0Pg0KPCEtLS0gRU5EOiBPZmZlcnRlYWFudnJhYWcgdGl0ZWwgLS0tPg0KDQo8IS0tLSBTVEFSVDogT2ZmZXJ0ZSBiZXZlc3RpZ2luZyB0ZWtzdCAtLS0+DQo8c3R5bGU+DQogIC5jaGVja291dC1ib2R5IC5jdXN0b20tb2ZmZXJ0ZS10ZWtzdCB7DQogICAgZm9udC1zaXplOiAxcmVtOw0KICAgIGxpbmUtaGVpZ2h0OiAxLjY7DQogICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsNCiAgICBjb2xvcjogIzMzMzMzMzsNCiAgICBtYXJnaW4tdG9wOiAxMHB4Ow0KICAgIG1hcmdpbi1ib3R0b206IDEwcHg7DQogIH0NCg0KICAuY2hlY2tvdXQtYm9keSBoMiB7DQogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Ow0KICB9DQoNCiAgLmNoZWNrb3V0LWJvZHkgaDEsDQogIC5jb2x1bW4gPiBoMSB7DQogICAgZm9udC1zaXplOiAxLjRyZW07DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgbWFyZ2luLWJvdHRvbTogMTVweDsNCiAgfQ0KPC9zdHlsZT4NCg0KPHNjcmlwdD4NCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uICgpIHsNCiAgICBjb25zdCBoZWFkZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJoMSIpOw0KICAgIGNvbnN0IGlzT2ZmZXJ0ZUJldmVzdGlnaW5nID0NCiAgICAgIGhlYWRlciAmJiBoZWFkZXIudGV4dENvbnRlbnQudHJpbSgpID09PSAiV2lqIGhlYmJlbiB1dyBvZmZlcnRlYWFudnJhYWcgaW4gZ29lZGUgb3JkZSBvbnR2YW5nZW4hIjsNCg0KICAgIGlmIChpc09mZmVydGVCZXZlc3RpZ2luZykgew0KICAgICAgY29uc3QgY2hlY2tvdXRCb2R5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLmNoZWNrb3V0LWJvZHkiKTsNCg0KICAgICAgaWYgKGNoZWNrb3V0Qm9keSkgew0KICAgICAgICAvLyBWZXJ3aWpkZXIgYmVzdGFhbmRlIEgyIGluZGllbiBhYW53ZXppZw0KICAgICAgICBjb25zdCBvbGRIMiA9IGNoZWNrb3V0Qm9keS5xdWVyeVNlbGVjdG9yKCJoMiIpOw0KICAgICAgICBpZiAob2xkSDIpIG9sZEgyLnJlbW92ZSgpOw0KDQogICAgICAgIC8vIFZvZXIgaW5qZWN0aWUgdWl0DQogICAgICAgIGNvbnN0IG5ld1RleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCiAgICAgICAgbmV3VGV4dC5jbGFzc05hbWUgPSAiY3VzdG9tLW9mZmVydGUtdGVrc3QiOw0KICAgICAgICBuZXdUZXh0LmlubmVySFRNTCA9IGANCiAgICAgICAgICA8c3Ryb25nPkhhcnRlbGlqayBkYW5rIHZvb3IgdXcgb2ZmZXJ0ZWFhbnZyYWFnITwvc3Ryb25nPjxicj4NCiAgICAgICAgICBXaWogYmV2ZXN0aWdlbiBoaWVyYmlqIGRhdCB3aWogdXcgb2ZmZXJ0ZWFhbnZyYWFnIG1ldCBkZSBncm9vdHN0ZSB6b3JndnVsZGlnaGVpZCBoZWJiZW4gb250dmFuZ2VuLjxicj4NCiAgICAgICAgICBPbnplIG1lZGV3ZXJrZXJzIHp1bGxlbiB1dyBhYW52cmFhZyBncm9uZGlnIGJlb29yZGVsZW4gZW4gbmVtZW4gem8gc3BvZWRpZyBtb2dlbGlqayBjb250YWN0IG1ldCB1IG9wIG9tIGRlIHZlcnZvbGdzdGFwcGVuIG1ldCB1IHRlIGJlc3ByZWtlbi48YnI+PGJyPg0KICAgICAgICAgIFpvIGt1bm5lbiB3aWogdSBvcCBlZW4gcGVyc29vbmxpamtlIGVuIGVmZmljacOrbnRlIG1hbmllciBiZWdlbGVpZGVuIGJpaiBoZXQgcmVhbGlzZXJlbiB2YW4gdXcgd2Vuc2VuLjxicj4NCiAgICAgICAgICBXaWogd2FhcmRlcmVuIHV3IGdlZHVsZCBnZWR1cmVuZGUgZGl0IHByb2Nlcy4gVSBtYWcgdmFuIG9ucyBlZW4gcHJvZmVzc2lvbmVsZSBlbiBiZXRyb2trZW4gYmVuYWRlcmluZyB2ZXJ3YWNodGVuLCBhZmdlc3RlbWQgb3AgdXcgc3BlY2lmaWVrZSBzaXR1YXRpZS48YnI+PGJyPg0KICAgICAgICAgIE1vY2h0IHUgaW4gZGUgdHVzc2VudGlqZCB2cmFnZW4gaGViYmVuLCBhYW52dWxsZW5kZSBpbmZvcm1hdGllIHdpbGxlbiBkZWxlbiBvZiBlcmdlbnMgb256ZWtlciBvdmVyIHppam4sIGRhbiBub2RpZ2VuIHdpaiB1IHZhbiBoYXJ0ZSB1aXQgb20gY29udGFjdCBvcCB0ZSBuZW1lbiBtZXQgb256ZSBLbGFudGVuc2VydmljZS48YnI+DQogICAgICAgICAgV2lqIHN0YWFuIGtsYWFyIG9tIHUgdGUgaGVscGVuIGVuIHUgdmVyZGVyIHRlIG9uZGVyc3RldW5lbiB3YWFyIG5vZGlnLjxicj48YnI+DQogICAgICAgICAgPHVsIGNsYXNzPSJsaXN0LXVuc3R5bGVkIG1iLTAgcHMtMiI+DQogICAgICAgICAgICA8bGk+PHN0cm9uZz5RV2luZG9vcnMgQi5WLjwvc3Ryb25nPjwvbGk+DQogICAgICAgICAgICA8bGk+PGkgY2xhc3M9ImZhIGZhLW1hcC1tYXJrZXIgZmEtZncgbWUtMiI+PC9pPiBEaXN0cmlidXRpZXdlZyAxMkEsIDQ5MDYgQUQgT29zdGVyaG91dCwgTmVkZXJsYW5kPC9saT4NCiAgICAgICAgICAgIDxsaT48aSBjbGFzcz0iZmEgZmEtcGhvbmUgZmEtZncgbWUtMiI+PC9pPiAwODUgNDAxIDExNjg8L2xpPg0KICAgICAgICAgICAgPGxpPjxpIGNsYXNzPSJmYSBmYS1lbnZlbG9wZSBmYS1mdyBtZS0yIj48L2k+IHNlcnZpY2VkZXNrQHF3aW5kb29ycy5jb208L2xpPg0KICAgICAgICAgICAgPGxpIGNsYXNzPSJtdC0yIj5LdkstbnI6IDg4MDEzMjk0PC9saT4NCiAgICAgICAgICAgIDxsaT5CdHctbnI6IE5MODY0NDc2OTU0QjAxPC9saT4NCiAgICAgICAgICAgIDxsaT5JQkFOLW5yOiBOTDQxIElOR0IgMDEwNiA2MTAzIDMzPGJyPih0Lm4udi4gUVdpbmRvb3JzIEIuVi4pPC9saT4NCiAgICAgICAgICA8L3VsPg0KICAgICAgICBgOw0KICAgICAgICBjaGVja291dEJvZHkuYXBwZW5kQ2hpbGQobmV3VGV4dCk7DQogICAgICB9DQogICAgfQ0KICB9KTsNCjwvc2NyaXB0Pg0KPCEtLS0gRU5EOiBPZmZlcnRlIGJldmVzdGlnaW5nIHRla3N0IC0tLT4NCg0KPCEtLS0gU1RBUlQ6IExldmVyaW5nc2FkcmVzIGJld2Vya2VuIC0tLT4NCjxzY3JpcHQ+DQogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbiAoKSB7DQogICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7DQogICAgICBjb25zdCBhbGxFbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIioiKTsNCiAgICAgIGFsbEVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7DQogICAgICAgIGVsLmNoaWxkTm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkgew0KICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAzICYmIG5vZGUubm9kZVZhbHVlLmluY2x1ZGVzKCJMZXZlcmluZ3NhZHJlcyBiZWFyYmVpdGVuIikpIHsNCiAgICAgICAgICAgIG5vZGUubm9kZVZhbHVlID0gbm9kZS5ub2RlVmFsdWUucmVwbGFjZSgiTGV2ZXJpbmdzYWRyZXMgYmVhcmJlaXRlbiIsICJMZXZlcmluZ3NhZHJlcyBiZXdlcmtlbiIpOw0KICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgICB9KTsNCiAgICB9KTsNCg0KICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSwgew0KICAgICAgY2hpbGRMaXN0OiB0cnVlLA0KICAgICAgc3VidHJlZTogdHJ1ZQ0KICAgIH0pOw0KICB9KTsNCjwvc2NyaXB0Pg0KPCEtLS0gRU5EOiBMZXZlcmluZ3NhZHJlcyBiZXdlcmtlbiAtLS0+DQoNCjwhLS0tIFNUQVJUOiBNb250YWdlID0gSmEgLS0+DQo8c2NyaXB0Pg0KZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uICgpIHsNCiAgY29uc3QgdGRFbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoInRkIik7DQogIHRkRWxlbWVudHMuZm9yRWFjaCh0ZCA9PiB7DQogICAgaWYgKHRkLnRleHRDb250ZW50LmluY2x1ZGVzKCJNb250YWdlIikgJiYgdGQudGV4dENvbnRlbnQuaW5jbHVkZXMoIkFhbnRhbCIpKSB7DQogICAgICB0ZC50ZXh0Q29udGVudCA9ICJJbmNsdXNpZWYgbW9udGFnZSI7DQogICAgfQ0KICB9KTsNCn0pOw0KPC9zY3JpcHQ+DQo8IS0tLSBFTkQ6IE1vbnRhZ2UgPSBKYSAtLS0+DQoNCjwhLS0tIFNUQVJUOiBCZXdlcmtlbiwgRHVwbGljZXJlbiwgVmVyd2lqZGVyZW4gLS0tPg0KPHNjcmlwdD4NCmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbiAoKSB7DQogIGNvbnN0IHdvb3JkZW4gPSB7DQogICAgImJld2Vya2VuIjogIkNvbmZpZ3VyYXRpZSBiZXdlcmtlbiIsDQogICAgImR1cGxpY2VyZW4iOiAiQ29uZmlndXJhdGllIGR1cGxpY2VyZW4iLA0KICAgICJ2ZXJ3aWpkZXJlbiI6ICJDb25maWd1cmF0aWUgdmVyd2lqZGVyZW4iLA0KICB9Ow0KDQogIGNvbnN0IHdhbGtOb2RlcyA9IChub2RlKSA9PiB7DQogICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMpIHsgLy8gdGVrc3Rub2RlDQogICAgICBsZXQgdGVrc3QgPSBub2RlLm5vZGVWYWx1ZTsNCiAgICAgIE9iamVjdC5rZXlzKHdvb3JkZW4pLmZvckVhY2gob3JpZyA9PiB7DQogICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cCgiXFxiIiArIG9yaWcgKyAiXFxiIiwgImdpIik7DQogICAgICAgIHRla3N0ID0gdGVrc3QucmVwbGFjZShyZWdleCwgd29vcmRlbltvcmlnXSk7DQogICAgICB9KTsNCiAgICAgIG5vZGUubm9kZVZhbHVlID0gdGVrc3Q7DQogICAgfSBlbHNlIGlmIChub2RlLm5vZGVUeXBlID09PSAxICYmIG5vZGUubm9kZU5hbWUgIT09ICJTQ1JJUFQiICYmIG5vZGUubm9kZU5hbWUgIT09ICJTVFlMRSIpIHsNCiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgIHdhbGtOb2Rlcyhub2RlLmNoaWxkTm9kZXNbaV0pOw0KICAgICAgfQ0KICAgIH0NCiAgfTsNCg0KICB3YWxrTm9kZXMoZG9jdW1lbnQuYm9keSk7DQp9KTsNCjwvc2NyaXB0Pg0KPCEtLS0gRU5EOiBCZXdlcmtlbiwgRHVwbGljZXJlbiwgVmVyd2lqZGVyZW4gLS0tPg0KDQo8IS0tLSBTVEFSVDogVmVyd2lqZGVyZW4gdmFuICJLb3N0ZW4iIGluIFZlcnplbmRtZXRob2RlbiAtLS0+DQo8c3R5bGU+DQogIC8qIFZlcmJlcmcga29zdGVuIGJpaiBsZXZlcmluZyBlbiB6ZWxmIGFmaGFsZW4gKi8NCiAgI2RlbGl2ZXJ5LXByaWNlLA0KICAjc2VsZkNvbGxlY3Rpb24tcHJpY2Ugew0KICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsNCiAgfQ0KPC9zdHlsZT4NCjwhLS0tIEVORDogVmVyd2lqZGVyZW4gdmFuICJLb3N0ZW4iIGluIFZlcnplbmRtZXRob2RlbiAtLS0+DQoNCjwhLS0tIFNUQVJUOiBNZWRlZGVsaW5nIGtub3Agdm9vciBtZWVyIGluZm8gaW4gYmVzdGVsb3ZlcnppY2h0IC0tLT4NCjxzdHlsZT4NCi5xdy1ibGFjay1idXR0b24gew0KICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7DQogIGJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7DQogIGNvbG9yOiAjZmZmZmZmOw0KICBib3JkZXI6IDFweCBzb2xpZCAjMDAwMDAwOw0KICBwYWRkaW5nOiAxMHB4IDIwcHg7DQogIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCiAgZm9udC1zaXplOiAxNHB4Ow0KICBmb250LXdlaWdodDogNTAwOw0KICBib3JkZXItcmFkaXVzOiA0cHg7DQogIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4zcyBlYXNlLCBjb2xvciAwLjNzIGVhc2U7DQogIG1hcmdpbi10b3A6IDEycHg7DQp9DQoucXctYmxhY2stYnV0dG9uOmhvdmVyIHsNCiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsNCiAgY29sb3I6ICMwMDAwMDA7DQp9DQo8L3N0eWxlPg0KDQo8c2NyaXB0Pg0KZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uICgpIHsNCiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNvbC0xMiAuY2FsbG91dC5jYWxsb3V0LXNvbGlkJyk7DQogIGlmIChjb250YWluZXIgJiYgIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5xdy1ibGFjay1idXR0b24nKSkgew0KICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsNCiAgICBidG4uaHJlZiA9ICdodHRwczovL2NvbmZpZ3VyYXRvci5xd2luZG9vcnMuY29tL25sL2luZm9ybWF0aWUnOw0KICAgIGJ0bi50YXJnZXQgPSAnX2JsYW5rJzsNCiAgICBidG4ucmVsID0gJ25vb3BlbmVyIG5vcmVmZXJyZXInOw0KICAgIGJ0bi5jbGFzc05hbWUgPSAncXctYmxhY2stYnV0dG9uJzsNCiAgICBidG4udGV4dENvbnRlbnQgPSAnTWVlciBpbmZvJzsNCiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoYnRuKTsNCiAgfQ0KfSk7DQo8L3NjcmlwdD4NCjwhLS0tIEVORDogTWVkZWRlbGluZyBrbm9wIHZvb3IgbWVlciBpbmZvIGluIGJlc3RlbG92ZXJ6aWNodCAtLS0+DQoNCjwhLS0tIFNUQVJUOiBDb29raWUgdXNlcmNlbnRyaWNzIC0tLT4NCjxzY3JpcHQgaWQ9InVzZXJjZW50cmljcy1jbXAiIHNyYz0iaHR0cHM6Ly93ZWIuY21wLnVzZXJjZW50cmljcy5ldS91aS9sb2FkZXIuanMiIGRhdGEtc2V0dGluZ3MtaWQ9InZEUVZvR2wtU0JNbWFJIiBhc3luYz48L3NjcmlwdD4NCjwhLS0tIEVORDogQ29va2llIHVzZXJjZW50cmljcyAtLS0+DQoNCjwhLS0tIFNUQVJUOiBJbmxvZ2dlbiBtZXQgaG9vZmRsZXR0ZXIgLS0tPg0KPHNjcmlwdD4NCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uICgpIHsNCiAgICBjb25zdCBsb2dpbkJ1dHRvbnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdidXR0b24uYnRuLmJ0bi1wcmltYXJ5Jyk7DQoNCiAgICBsb2dpbkJ1dHRvbnMuZm9yRWFjaChmdW5jdGlvbiAoYnRuKSB7DQogICAgICBpZiAoYnRuLnRleHRDb250ZW50LnRyaW0oKS50b0xvd2VyQ2FzZSgpID09PSAnaW5sb2dnZW4nKSB7DQogICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdJbmxvZ2dlbic7DQogICAgICB9DQogICAgfSk7DQogIH0pOw0KPC9zY3JpcHQ+DQo8IS0tLSBFTkQ6IElubG9nZ2VuIG1ldCBob29mZGxldHRlciAtLS0+DQoNCjwhLS0tIFNUQVJUOiBGYXgvbW9iaWVsL1RpdGVsIHZlbGQgdmVyd2lqZGVyZW4gLS0tPg0KPHNjcmlwdD4NCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uICgpIHsNCiAgICAvLyBWZXJ3aWpkZXIgaGV0IGZvcm11bGllcmJsb2sgdm9vciAnRmF4Jw0KICAgIGNvbnN0IGZheElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZheCcpOw0KICAgIGlmIChmYXhJbnB1dCkgew0KICAgICAgY29uc3QgZmF4R3JvdXAgPSBmYXhJbnB1dC5jbG9zZXN0KCcubWItMy5wYXBlci1pbnB1dC5jdXN0b20tZm9ybS1ncm91cCcpOw0KICAgICAgaWYgKGZheEdyb3VwKSBmYXhHcm91cC5yZW1vdmUoKTsNCiAgICB9DQoNCiAgICAvLyBWZXJ3aWpkZXIgaGV0IGZvcm11bGllcmJsb2sgdm9vciAnTW9iaWVsJw0KICAgIGNvbnN0IG1vYmllbElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vYmlsJyk7DQogICAgaWYgKG1vYmllbElucHV0KSB7DQogICAgICBjb25zdCBtb2JpZWxHcm91cCA9IG1vYmllbElucHV0LmNsb3Nlc3QoJy5tYi0zLnBhcGVyLWlucHV0LmN1c3RvbS1mb3JtLWdyb3VwJyk7DQogICAgICBpZiAobW9iaWVsR3JvdXApIG1vYmllbEdyb3VwLnJlbW92ZSgpOw0KICAgIH0NCg0KICAgIC8vIFZlcndpamRlciBoZXQgZm9ybXVsaWVyYmxvayB2b29yICdUaXRlbCcgKGlucHV0IHZlbGQpDQogICAgY29uc3QgdGl0ZWxJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aXRlbCcpOw0KICAgIGlmICh0aXRlbElucHV0KSB7DQogICAgICBjb25zdCB0aXRlbEdyb3VwID0gdGl0ZWxJbnB1dC5jbG9zZXN0KCcubWItMy5wYXBlci1pbnB1dC5jdXN0b20tZm9ybS1ncm91cCcpOw0KICAgICAgaWYgKHRpdGVsR3JvdXApIHRpdGVsR3JvdXAucmVtb3ZlKCk7DQogICAgfQ0KICB9KTsNCjwvc2NyaXB0Pg0KPCEtLS0gRU5EOiBGYXgvbW9iaWVsL1RpdGVsIHZlbGQgdmVyd2lqZGVyZW4gLS0tPg0KDQo8IS0tLSBTVEFSVDogUmVnaXN0cmllcmVuLVJlZ2lzdHJlcmVuIC0tLT4NCjxzY3JpcHQ+DQogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbiAoKSB7DQogICAgLy8gWm9layBuYWFyIGFsbGUgZWxlbWVudGVuIGRpZSBkZSB0ZWtzdCAnUmVnaXN0cmllcmVuJyBiZXZhdHRlbg0KICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyonKS5mb3JFYWNoKGZ1bmN0aW9uIChlbCkgew0KICAgICAgaWYgKGVsLmNoaWxkTm9kZXMubGVuZ3RoID09PSAxICYmIGVsLmNoaWxkTm9kZXNbMF0ubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7DQogICAgICAgIGlmIChlbC50ZXh0Q29udGVudC50cmltKCkgPT09ICdSZWdpc3RyaWVyZW4nKSB7DQogICAgICAgICAgZWwudGV4dENvbnRlbnQgPSAnTG9nIGluIG9mIHJlZ2lzdHJlZXIgb20gZG9vciB0ZSBnYWFuJzsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0pOw0KICB9KTsNCjwvc2NyaXB0Pg0KPCEtLS0gRU5EOiBSZWdpc3RyaWVyZW4tUmVnaXN0cmVyZW4gLS0tPg0KDQo8IS0tLSBTVEFSVDogR2VlbiBTdGlja3kgZGVzY3JpcHRpb24gLS0tPg0KPHN0eWxlPg0KICAvKiBCbG9ra2VlciBzcGFjZXItZGl2IGRpZSBoZXQgd2l0dGUgdmxhayB2ZXJvb3J6YWFrdCAqLw0KICBoZWFkZXIudGFiLXBhbmUtaGVhZGVyICsgZGl2W3N0eWxlKj0iaGVpZ2h0Il1bc3R5bGUqPSJkaXNwbGF5OiBmbGV4Il0gew0KICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsNCiAgICBoZWlnaHQ6IDAgIWltcG9ydGFudDsNCiAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7DQogICAgbWFyZ2luOiAwICFpbXBvcnRhbnQ7DQogIH0NCg0KICAvKiBBbHMgZGllIGRpdiBlbGRlcnMgc3RhYXQgKHZlaWxpZ2hlaWRzaGFsdmUgY2hlY2spICovDQogIC50YWItcGFuZS1oZWFkZXIgfiBkaXZbc3R5bGUqPSJoZWlnaHQiXVtzdHlsZSo9ImRpc3BsYXk6IGZsZXgiXSB7DQogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Ow0KICAgIGhlaWdodDogMCAhaW1wb3J0YW50Ow0KICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDsNCiAgICBtYXJnaW46IDAgIWltcG9ydGFudDsNCiAgfQ0KDQogIC8qIEJlaG91ZCBub3JtYWxlIHdlZXJnYXZlIGhlYWRlciB6b25kZXIgc3RpY2t5ICovDQogIGhlYWRlci50YWItcGFuZS1oZWFkZXIsDQogIGhlYWRlci50YWItcGFuZS1oZWFkZXIuc3RpY2t5LA0KICBoZWFkZXIudGFiLXBhbmUtaGVhZGVyLmlzX3N0dWNrIHsNCiAgICBwb3NpdGlvbjogc3RhdGljICFpbXBvcnRhbnQ7DQogICAgdG9wOiBhdXRvICFpbXBvcnRhbnQ7DQogICAgd2lkdGg6IGF1dG8gIWltcG9ydGFudDsNCiAgICB6LWluZGV4OiBhdXRvICFpbXBvcnRhbnQ7DQogIH0NCjwvc3R5bGU+DQo8IS0tLSBFTkQ6IEdlZW4gU3RpY2t5IGRlc2NyaXB0aW9uIC0tLT4NCg0KPCEtLSBTVEFSVDogIldlZXJzdGFuZHNuaXZlYXUgdWl0bGVnICsgdmVyd2lqZGVyIGluZm8ta25vcCIgLS0+DQo8c3R5bGU+DQouc3VidGl0bGUtYmV2ZWlsaWdpbmdzbml2ZWF1IHsNCiAgbWFyZ2luLXRvcDogMC4yNXJlbTsNCiAgZm9udC1zaXplOiAwLjk1cmVtOw0KICBjb2xvcjogIzY2NjsNCiAgbWF4LXdpZHRoOiA3MjBweDsNCn0NCjwvc3R5bGU+DQoNCjxzY3JpcHQ+DQpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24gKCkgew0KICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsNCiAgICBjb25zdCBoZWFkZXJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaDIuaHlwaGVuYXRlLmQtaW5saW5lJyk7DQoNCiAgICBoZWFkZXJzLmZvckVhY2goaGVhZGVyID0+IHsNCiAgICAgIGlmIChoZWFkZXIudGV4dENvbnRlbnQudHJpbSgpID09PSAiQmV2ZWlsaWdpbmdzbml2ZWF1Iikgew0KICAgICAgICBjb25zdCBjb250YWluZXIgPSBoZWFkZXIuY2xvc2VzdCgnLmNvbC1hdXRvLm1iLTInKTsNCiAgICAgICAgaWYgKCFjb250YWluZXIpIHJldHVybjsNCg0KICAgICAgICAvLyBWZXJ3aWpkZXIgaW5mby1rbm9wIHNwZWNpZmllayBtZXQgZGF0YS1icy1jb250ZW50DQogICAgICAgIGNvbnN0IGluZm9CdXR0b24gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignYnV0dG9uW2RhdGEtYnMtY29udGVudD0iU2VjdXJpdHklMjBsZXZlbCJdJyk7DQogICAgICAgIGlmIChpbmZvQnV0dG9uKSB7DQogICAgICAgICAgaW5mb0J1dHRvbi5yZW1vdmUoKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGNvbnN0IGFscmVhZHlFeGlzdHMgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignLnN1YnRpdGxlLWJldmVpbGlnaW5nc25pdmVhdScpOw0KICAgICAgICBpZiAoIWFscmVhZHlFeGlzdHMpIHsNCiAgICAgICAgICBjb25zdCBwYXJhZ3JhcGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwIik7DQogICAgICAgICAgcGFyYWdyYXBoLmNsYXNzTmFtZSA9ICJzdWJ0aXRsZS1iZXZlaWxpZ2luZ3NuaXZlYXUiOw0KICAgICAgICAgIHBhcmFncmFwaC50ZXh0Q29udGVudCA9ICJLaWVzIGhldCBnZXdlbnN0ZSBiZXZlaWxpZ2luZ3NuaXZlYXUgdm9vciB1dyByYWFtIG9mIGRldXIuIERpdCBiZXBhYWx0IGluIGhvZXZlcnJlIGhldCBwcm9kdWN0IGJlc3RhbmQgaXMgdGVnZW4gaW5icmFhay4gUkMxIGJpZWR0IGJhc2lzYmVzY2hlcm1pbmcsIFJDMiBiaWVkdCB2ZXJob29nZGUgdmVpbGlnaGVpZCBlbiB3b3JkdCBhYW5iZXZvbGVuIHZvb3Igd29uaW5nZW4uIjsNCg0KICAgICAgICAgIGNvbnN0IGluZm8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwIik7DQogICAgICAgICAgaW5mby5jbGFzc05hbWUgPSAic3VidGl0bGUtYmV2ZWlsaWdpbmdzbml2ZWF1IjsNCiAgICAgICAgICBpbmZvLmlubmVySFRNTCA9ICI8Yj5Ub2VsaWNodGluZzo8L2I+PGJyPlJDIHN0YWF0IHZvb3IgJ1Jlc2lzdGFuY2UgQ2xhc3MnLiBSQzIgdm9sZG9ldCBhYW4gZGUgZWlzZW4gdmFuIHBvbGl0aWUgZW4gdmVyemVrZXJpbmcgZW4gaXMgZ2VzY2hpa3Qgdm9vciBkZSBtZWVzdGUgd29uaW5nZW4uIjsNCg0KICAgICAgICAgIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUocGFyYWdyYXBoLCBoZWFkZXIubmV4dFNpYmxpbmcpOw0KICAgICAgICAgIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUoaW5mbywgcGFyYWdyYXBoLm5leHRTaWJsaW5nKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0pOw0KICB9KTsNCg0KICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHsNCiAgICBjaGlsZExpc3Q6IHRydWUsDQogICAgc3VidHJlZTogdHJ1ZQ0KICB9KTsNCn0pOw0KPC9zY3JpcHQ+DQoNCjxzY3JpcHQ+DQpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24gKCkgew0KICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsNCiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdoMi5oeXBoZW5hdGUuZC1pbmxpbmUnKS5mb3JFYWNoKGhlYWRlciA9PiB7DQogICAgICBpZiAoaGVhZGVyLnRleHRDb250ZW50LnRyaW0oKSA9PT0gIldlZXJzdGFuZHNuaXZlYXUiKSB7DQogICAgICAgIGhlYWRlci50ZXh0Q29udGVudCA9ICJCZXZlaWxpZ2luZ3NuaXZlYXUiOw0KICAgICAgfQ0KICAgIH0pOw0KICB9KTsNCiAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTsNCn0pOw0KPC9zY3JpcHQ+DQo8IS0tIEVORDogIldlZXJzdGFuZHNuaXZlYXUgdWl0bGVnICsgdmVyd2lqZGVyIGluZm8ta25vcCIgLS0+DQoNCjwhLS0tIFNUQVJUOiBBY2NvdW50IGdlZ2V2ZW5zIGJld2Vya2VuIGtub3AgLS0tPg0KPHNjcmlwdD4NCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uICgpIHsNCiAgICBjb25zdCBidXR0b25zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnYS5idG4uYnRuLXByaW1hcnkubWItMltocmVmPSIvbmwvYWNjb3VudC1iZXdlcmtlbiJdJyk7DQogICAgYnV0dG9ucy5mb3JFYWNoKGZ1bmN0aW9uIChidG4pIHsNCiAgICAgIGlmIChidG4udGV4dENvbnRlbnQudHJpbSgpID09PSAiQ29uZmlndXJhdGllIGJld2Vya2VuIikgew0KICAgICAgICBidG4udGV4dENvbnRlbnQgPSAiR2VnZXZlbnMgYmV3ZXJrZW4iOw0KICAgICAgfQ0KICAgIH0pOw0KICB9KTsNCjwvc2NyaXB0Pg0KPHNjcmlwdD4NCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uICgpIHsNCiAgICAvLyBQYXMgPGE+LWtub3AgYWFuIChlZXJzdGUgdmVyem9laykNCiAgICBjb25zdCBjb25maWdCdG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdhLmJ0bi5idG4tcHJpbWFyeS5tYi0yW2hyZWY9Ii9ubC9hY2NvdW50LWJld2Vya2VuIl0nKTsNCiAgICBpZiAoY29uZmlnQnRuICYmIGNvbmZpZ0J0bi50ZXh0Q29udGVudC50cmltKCkgPT09ICJDb25maWd1cmF0aWUgYmV3ZXJrZW4iKSB7DQogICAgICBjb25maWdCdG4udGV4dENvbnRlbnQgPSAiR2VnZXZlbnMgYmV3ZXJrZW4iOw0KICAgIH0NCg0KICAgIC8vIFBhcyA8aDE+LXRpdGVsIGFhbiAodHdlZWRlIHZlcnpvZWspDQogICAgY29uc3QgaDFIZWFkZXJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiaDEiKTsNCiAgICBoMUhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbiAoaDEpIHsNCiAgICAgIGlmIChoMS50ZXh0Q29udGVudC50cmltKCkgPT09ICJBY2NvdW50IENvbmZpZ3VyYXRpZSBiZXdlcmtlbiIpIHsNCiAgICAgICAgaDEudGV4dENvbnRlbnQgPSAiQWNjb3VudGdlZ2V2ZW5zIGJld2Vya2VuIjsNCiAgICAgIH0NCiAgICB9KTsNCiAgfSk7DQo8L3NjcmlwdD4NCjwhLS0tIEVORDogQWNjb3VudCBnZWdldmVucyBiZXdlcmtlbiBrbm9wIC0tLT4NCg0KPCEtLS0gU1RBUlQ6IEZheCBlbiBNb2JpZWwgdmVyd2lqZGVyZW4gaW4gYWNjb3VudHBhZ2luYSAtLS0+DQo8c2NyaXB0Pg0KICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24gKCkgew0KICAgIGNvbnN0IHJvd3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudGFibGUgdGJvZHkgdHIiKTsNCg0KICAgIHJvd3MuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7DQogICAgICBjb25zdCBoZWFkZXJDZWxsID0gcm93LnF1ZXJ5U2VsZWN0b3IoInRoIik7DQogICAgICBpZiAoIWhlYWRlckNlbGwpIHJldHVybjsNCg0KICAgICAgY29uc3QgaGVhZGVyVGV4dCA9IGhlYWRlckNlbGwudGV4dENvbnRlbnQudHJpbSgpOw0KICAgICAgaWYgKGhlYWRlclRleHQgPT09ICJGYXg6IiB8fCBoZWFkZXJUZXh0ID09PSAiTW9iaWVsOiIpIHsNCiAgICAgICAgcm93LnJlbW92ZSgpOw0KICAgICAgfQ0KICAgIH0pOw0KICB9KTsNCjwvc2NyaXB0Pg0KPCEtLS0gRU5EOiBGYXggZW4gTW9iaWVsIHZlcndpamRlcmVuIGluIGFjY291bnRwYWdpbmEgLS0tPg0KDQo8IS0tLSBTVEFSVDogRHVwbGljYXRlIGtub3AgendhcnQgLS0tPg0KPHN0eWxlPg0KICAjZHVwbGljYXRlTGFzdENvbmZpZ3VyYXRpb24gew0KICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDAwMDAgIWltcG9ydGFudDsNCiAgICBib3JkZXItY29sb3I6ICMwMDAwMDAgIWltcG9ydGFudDsNCiAgICBjb2xvcjogI2ZmZmZmZiAhaW1wb3J0YW50Ow0KICB9DQoNCiAgI2R1cGxpY2F0ZUxhc3RDb25maWd1cmF0aW9uIGkgew0KICAgIGNvbG9yOiAjZmZmZmZmICFpbXBvcnRhbnQ7DQogIH0NCg0KICAjZHVwbGljYXRlTGFzdENvbmZpZ3VyYXRpb246aG92ZXIgew0KICAgIGJhY2tncm91bmQtY29sb3I6ICMyMjIyMjIgIWltcG9ydGFudDsNCiAgICBib3JkZXItY29sb3I6ICMyMjIyMjIgIWltcG9ydGFudDsNCiAgfQ0KPC9zdHlsZT4NCjwhLS0tIEVORDogRHVwbGljYXRlIGtub3AgendhcnQgLS0tPg0KDQo8IS0tLSBTVEFSVDogV2lua2Vsd2FnZW4gbmF2YmFyIHp3YXJ0IC0tLT4NCjxzdHlsZT4NCiAgLmNoZWNrb3V0LXByb2dyZXNzQmFyIC5uYXYtbGluayB7DQogICAgY29sb3I6ICMwMDAwMDAgIWltcG9ydGFudDsNCiAgfQ0KDQogIC5jaGVja291dC1wcm9ncmVzc0JhciAubmF2LWxpbmsuYWN0aXZlIHsNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwICFpbXBvcnRhbnQ7DQogICAgY29sb3I6ICNmZmZmZmYgIWltcG9ydGFudDsNCiAgfQ0KDQogIC5jaGVja291dC1wcm9ncmVzc0JhciAubmF2LWxpbmtbZGlzYWJsZWRdIHsNCiAgICBjb2xvcjogIzAwMDAwMCAhaW1wb3J0YW50Ow0KICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7DQogICAgYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7DQogICAgY3Vyc29yOiBkZWZhdWx0Ow0KICB9DQoNCiAgLmNoZWNrb3V0LXByb2dyZXNzQmFyIC5mYXMsDQogIC5jaGVja291dC1wcm9ncmVzc0JhciAuZmFyIHsNCiAgICBjb2xvcjogIzAwMDAwMCAhaW1wb3J0YW50Ow0KICB9DQoNCiAgLmNoZWNrb3V0LXByb2dyZXNzQmFyIC5uYXYtbGluay5hY3RpdmUgLmZhcywNCiAgLmNoZWNrb3V0LXByb2dyZXNzQmFyIC5uYXYtbGluay5hY3RpdmUgLmZhciB7DQogICAgY29sb3I6ICNmZmZmZmYgIWltcG9ydGFudDsNCiAgfQ0KDQogIC5jaGVja291dC1wcm9ncmVzc0JhciAuZmFzLmZhLWFuZ2xlLXJpZ2h0IHsNCiAgICBjb2xvcjogIzAwMDAwMCAhaW1wb3J0YW50Ow0KICAgIG1hcmdpbjogMCA4cHg7DQogIH0NCjwvc3R5bGU+DQo8IS0tLSBFTkQ6IFdpbmtlbHdhZ2VuIG5hdmJhciB6d2FydCAtLS0+DQoNCjwhLS0tIFNUQVJUOiBWZWxkYmVuYW1pbmdlbiAtLS0+DQo8c2NyaXB0Pg0KKGZ1bmN0aW9uICgpIHsNCiAgY29uc3QgcmVwbGFjZW1lbnRzID0gew0KICAgICJWZWxkIDFfMSI6ICJWZWxkIDEiLA0KICAgICJWZWxkIDJfMSI6ICJWZWxkIDIiLA0KICAgICJWZWxkIDNfMSI6ICJWZWxkIDMiLA0KICAgICJWZWxkIDRfMSI6ICJWZWxkIDQiLA0KICAgICJWZWxkIDVfMSI6ICJWZWxkIDUiDQogIH07DQoNCiAgZnVuY3Rpb24gbm9ybWFsaXplKHRleHQpIHsNCiAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC9ccysvZywgJyAnKS50cmltKCk7DQogIH0NCg0KICBmdW5jdGlvbiByZXBsYWNlQWxsRmllbGRzKCkgew0KICAgIGNvbnN0IHdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoZG9jdW1lbnQuYm9keSwgTm9kZUZpbHRlci5TSE9XX1RFWFQsIG51bGwsIGZhbHNlKTsNCiAgICB3aGlsZSAod2Fsa2VyLm5leHROb2RlKCkpIHsNCiAgICAgIGNvbnN0IG5vZGUgPSB3YWxrZXIuY3VycmVudE5vZGU7DQogICAgICBjb25zdCBjbGVhbmVkID0gbm9ybWFsaXplKG5vZGUubm9kZVZhbHVlKTsNCiAgICAgIGlmIChyZXBsYWNlbWVudHNbY2xlYW5lZF0pIHsNCiAgICAgICAgbm9kZS5ub2RlVmFsdWUgPSByZXBsYWNlbWVudHNbY2xlYW5lZF07DQogICAgICB9DQogICAgfQ0KICB9DQoNCiAgLy8gU3RhcnQgZGlyZWN0IGJpaiBsYWRlbg0KICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgKCkgPT4gew0KICAgIHJlcGxhY2VBbGxGaWVsZHMoKTsNCg0KICAgIC8vIEJsaWpmIG9ic2VydmVyZW4gb3AgdmVyYW5kZXJpbmdlbg0KICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gew0KICAgICAgcmVwbGFjZUFsbEZpZWxkcygpOw0KICAgIH0pOw0KDQogICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7DQogICAgICBjaGlsZExpc3Q6IHRydWUsDQogICAgICBzdWJ0cmVlOiB0cnVlDQogICAgfSk7DQogIH0pOw0KfSkoKTsNCjwvc2NyaXB0Pg0KPCEtLS0gRU5EOiBWZWxkYmVuYW1pbmdlbiAtLS0+DQoNCjwhLS0gR29vZ2xlIFRhZyBNYW5hZ2VyIC0tPg0KPHNjcmlwdD4oZnVuY3Rpb24odyxkLHMsbCxpKXt3W2xdPXdbbF18fFtdO3dbbF0ucHVzaCh7J2d0bS5zdGFydCc6DQpuZXcgRGF0ZSgpLmdldFRpbWUoKSxldmVudDonZ3RtLmpzJ30pO3ZhciBmPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUocylbMF0sDQpqPWQuY3JlYXRlRWxlbWVudChzKSxkbD1sIT0nZGF0YUxheWVyJz8nJmw9JytsOicnO2ouYXN5bmM9dHJ1ZTtqLnNyYz0NCidodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndG0uanM/aWQ9JytpK2RsO2YucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaixmKTsNCn0pKHdpbmRvdyxkb2N1bWVudCwnc2NyaXB0JywnZGF0YUxheWVyJywnR1RNLTVISkZTSjlQJyk7PC9zY3JpcHQ+DQo8IS0tIEVuZCBHb29nbGUgVGFnIE1hbmFnZXIgLS0+DQoNCjwhLS0tIFNUQVJUOiBDaGFuZ2UgamUgbmFhciB1IGluIENvbmZpZ3VyYXRvciB2b29yIGFjdGl2ZXJlbiB2YW4gYWNjb3VudCAtLS0+DQo8c2NyaXB0Pg0KZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uKCkgew0KICAgIGNvbnN0IHRleHROb2RlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImJvZHkgKjpub3Qoc2NyaXB0KTpub3Qoc3R5bGUpIik7DQogICAgdGV4dE5vZGVzLmZvckVhY2goZnVuY3Rpb24obm9kZSkgew0KICAgICAgICBpZiAobm9kZS5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSAmJiBub2RlLmNoaWxkTm9kZXNbMF0ubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7DQogICAgICAgICAgICBjb25zdCBvcmlnaW5hbFRleHQgPSBub2RlLnRleHRDb250ZW50LnRyaW0oKTsNCiAgICAgICAgICAgIGNvbnN0IG9sZFRleHQgPSAiVm9vcmRhdCB1IGVlbiBiZXN0ZWxsaW5nIGt1bnQgcGxhYXRzZW4sIG1vZXQgdSBlZXJzdCB1dyBlLW1haWxhZHJlcyB2ZXJpZmnDq3Jlbi4gSGllcnZvb3IgaGViYmVuIHdlIGVlbiBiZXZlc3RpZ2luZ3NsaW5rIGdlc3R1dXJkIG5hYXIgaGV0IGUtbWFpbGFkcmVzIGRhdCBqZSBoZWJ0IGdlYnJ1aWt0IG9tIGRlIGFjY291bnQgYWFuIHRlIG1ha2VuLiI7DQogICAgICAgICAgICBjb25zdCBuZXdUZXh0ID0gIlZvb3JkYXQgdSBlZW4gYmVzdGVsbGluZyBrdW50IHBsYWF0c2VuLCBtb2V0IHUgZWVyc3QgdXcgZS1tYWlsYWRyZXMgdmVyaWZpw6tyZW4uIEhpZXJ2b29yIGhlYmJlbiB3ZSBlZW4gYmV2ZXN0aWdpbmdzbGluayBnZXN0dXVyZCBuYWFyIGhldCBlLW1haWxhZHJlcyBkYXQgdSBoZWVmdCBnZWJydWlrdCBvbSBkZSBhY2NvdW50IGFhbiB0ZSBtYWtlbi4iOw0KICAgICAgICAgICAgDQogICAgICAgICAgICBpZiAob3JpZ2luYWxUZXh0ID09PSBvbGRUZXh0KSB7DQogICAgICAgICAgICAgICAgbm9kZS50ZXh0Q29udGVudCA9IG5ld1RleHQ7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCn0pOw0KPC9zY3JpcHQ+DQo8IS0tLSBFTkQ6IENoYW5nZSBqZSBuYWFyIHUgaW4gQ29uZmlndXJhdG9yIHZvb3IgYWN0aXZlcmVuIHZhbiBhY2NvdW50IC0tLT4NCg0KPCEtLSBTVEFSVDogVmlzdWVsZSB3YWFyc2NodXdpbmcgbWV0IGFuaW1hdGllLCByZWdlbGJyZWtpbmcgZW4gendhcnRlIHRla3N0IC0tPg0KPHN0eWxlPg0KLmFnLWFsZXJ0LWJveCB7DQogIGJhY2tncm91bmQtY29sb3I6ICNmZmNjY2MgIWltcG9ydGFudDsNCiAgY29sb3I6ICMwMDAwMDAgIWltcG9ydGFudDsgLyogendhcnRlIHRla3N0ICovDQogIHBhZGRpbmc6IDE1cHggMjBweCAhaW1wb3J0YW50Ow0KICBib3JkZXItbGVmdDogNnB4IHNvbGlkICNjYzAwMDAgIWltcG9ydGFudDsNCiAgYm9yZGVyLXJhZGl1czogNXB4ICFpbXBvcnRhbnQ7DQogIG1hcmdpbjogMTBweCAwICFpbXBvcnRhbnQ7DQogIGFuaW1hdGlvbjogYWctcHVsc2UtYm9yZGVyIDJzIGluZmluaXRlICFpbXBvcnRhbnQ7DQogIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDsNCiAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQgIWltcG9ydGFudDsNCiAgZm9udC1zaXplOiAxNXB4ICFpbXBvcnRhbnQ7DQp9DQoNCi5hZy1hbGVydC1pY29uIHsNCiAgbWFyZ2luLXJpZ2h0OiAxMHB4ICFpbXBvcnRhbnQ7DQogIGZvbnQtc2l6ZTogMjBweCAhaW1wb3J0YW50Ow0KICBmbGV4LXNocmluazogMDsNCiAgY29sb3I6ICNjYzAwMDAgIWltcG9ydGFudDsNCn0NCg0KLmFnLWFsZXJ0LXRleHQgew0KICBsaW5lLWhlaWdodDogMS41ZW07DQp9DQoNCkBrZXlmcmFtZXMgYWctcHVsc2UtYm9yZGVyIHsNCiAgMCUgew0KICAgIGJveC1zaGFkb3c6IDAgMCAwIDAgcmdiYSgyNTUsIDc3LCA3NywgMC4zKTsNCiAgfQ0KICA3MCUgew0KICAgIGJveC1zaGFkb3c6IDAgMCAwIDEwcHggcmdiYSgyNTUsIDc3LCA3NywgMCk7DQogIH0NCiAgMTAwJSB7DQogICAgYm94LXNoYWRvdzogMCAwIDAgMCByZ2JhKDI1NSwgNzcsIDc3LCAwKTsNCiAgfQ0KfQ0KPC9zdHlsZT4NCg0KPHNjcmlwdD4NCmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbiAoKSB7DQogIGNvbnN0IHdhcm5pbmdMaW5lMSA9ICJWb29yZGF0IHUgZWVuIGJlc3RlbGxpbmcga3VudCBwbGFhdHNlbiwgbW9ldCB1IGVlcnN0IHV3IGUtbWFpbGFkcmVzIHZlcmlmacOrcmVuLiI7DQogIGNvbnN0IHdhcm5pbmdMaW5lMiA9ICJIaWVydm9vciBoZWJiZW4gd2UgZWVuIGJldmVzdGlnaW5nc2xpbmsgZ2VzdHV1cmQgbmFhciBoZXQgZS1tYWlsYWRyZXMgZGF0IHUgaGVlZnQgZ2VicnVpa3Qgb20gZGUgYWNjb3VudCBhYW4gdGUgbWFrZW4uIjsNCg0KICAvLyAxLiBWZXJ2YW5nIGJpbm5lbiA8bGFiZWw+DQogIGNvbnN0IGxhYmVscyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImxhYmVsLmZvcm0tbGFiZWwiKTsNCiAgbGFiZWxzLmZvckVhY2goZnVuY3Rpb24gKGxhYmVsKSB7DQogICAgY29uc3QgZnVsbFRleHQgPSB3YXJuaW5nTGluZTEgKyAiICIgKyB3YXJuaW5nTGluZTI7DQogICAgaWYgKGxhYmVsLnRleHRDb250ZW50LnRyaW0oKSA9PT0gZnVsbFRleHQpIHsNCiAgICAgIGNvbnN0IHdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCiAgICAgIHdyYXBwZXIuY2xhc3NOYW1lID0gImFnLWFsZXJ0LWJveCI7DQoNCiAgICAgIGNvbnN0IGljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7DQogICAgICBpY29uLmNsYXNzTmFtZSA9ICJhZy1hbGVydC1pY29uIjsNCiAgICAgIGljb24udGV4dENvbnRlbnQgPSAi4pqg77iPIjsNCg0KICAgICAgY29uc3QgYWxlcnRUZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOw0KICAgICAgYWxlcnRUZXh0LmNsYXNzTmFtZSA9ICJhZy1hbGVydC10ZXh0IjsNCiAgICAgIGFsZXJ0VGV4dC5pbm5lckhUTUwgPSB3YXJuaW5nTGluZTEgKyAiPGJyPiIgKyB3YXJuaW5nTGluZTI7DQoNCiAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoaWNvbik7DQogICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKGFsZXJ0VGV4dCk7DQoNCiAgICAgIGxhYmVsLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHdyYXBwZXIsIGxhYmVsKTsNCiAgICB9DQogIH0pOw0KDQogIC8vIDIuIFZlcnZhbmcgYmlubmVuIDxkaXYgY2xhc3M9ImFsZXJ0LWRhbmdlciI+DQogIGNvbnN0IGFsZXJ0cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImRpdi5hbGVydC1kYW5nZXIiKTsNCiAgY29uc3Qgb3JpZ2luYWxUZXh0ID0gIlZvb3JkYXQgdSBlZW4gYmVzdGVsbGluZyBrdW50IHBsYWF0c2VuLCBtb2V0IHUgZWVyc3QgdXcgZS1tYWlsYWRyZXMgdmVyaWZpw6tyZW4uIEhpZXJ2b29yIGhlYmJlbiB3ZSBlZW4gYmV2ZXN0aWdpbmdzbGluayBnZXN0dXVyZCBuYWFyIGhldCBlLW1haWxhZHJlcyBkYXQgamUgaGVidCBnZWJydWlrdCBvbSBkZSBhY2NvdW50IGFhbiB0ZSBtYWtlbi4iOw0KDQogIGFsZXJ0cy5mb3JFYWNoKGZ1bmN0aW9uIChhbGVydCkgew0KICAgIGNvbnN0IHRleHROb2RlID0gQXJyYXkuZnJvbShhbGVydC5jaGlsZE5vZGVzKS5maW5kKG5vZGUgPT4NCiAgICAgIG5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFICYmIG5vZGUudGV4dENvbnRlbnQuaW5jbHVkZXMoImUtbWFpbGFkcmVzIikNCiAgICApOw0KICAgIGlmICh0ZXh0Tm9kZSAmJiB0ZXh0Tm9kZS50ZXh0Q29udGVudC50cmltKCkgPT09IG9yaWdpbmFsVGV4dC50cmltKCkpIHsNCiAgICAgIGNvbnN0IG5ld0JveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KICAgICAgbmV3Qm94LmNsYXNzTmFtZSA9ICJhZy1hbGVydC1ib3giOw0KDQogICAgICBjb25zdCBpY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOw0KICAgICAgaWNvbi5jbGFzc05hbWUgPSAiYWctYWxlcnQtaWNvbiI7DQogICAgICBpY29uLnRleHRDb250ZW50ID0gIuKaoO+4jyI7DQoNCiAgICAgIGNvbnN0IGFsZXJ0VGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTsNCiAgICAgIGFsZXJ0VGV4dC5jbGFzc05hbWUgPSAiYWctYWxlcnQtdGV4dCI7DQogICAgICBhbGVydFRleHQuaW5uZXJIVE1MID0gd2FybmluZ0xpbmUxICsgIjxicj4iICsgd2FybmluZ0xpbmUyOw0KDQogICAgICBuZXdCb3guYXBwZW5kQ2hpbGQoaWNvbik7DQogICAgICBuZXdCb3guYXBwZW5kQ2hpbGQoYWxlcnRUZXh0KTsNCg0KICAgICAgYWxlcnQucmVwbGFjZVdpdGgobmV3Qm94KTsNCiAgICB9DQogIH0pOw0KfSk7DQo8L3NjcmlwdD4NCjwhLS0gRU5EOiBWaXN1ZWxlIHdhYXJzY2h1d2luZyBtZXQgYW5pbWF0aWUsIHJlZ2VsYnJla2luZyBlbiB6d2FydGUgdGVrc3QgLS0+DQoNCjwvaGVhZD4=

Aankondigingen en systeemberichten

Winkelwagen
Het toevoegen van producten aan de winkelwagen is pas mogelijk zodra u zich in de fase "Diensten -> Montage" bevindt.
Deze maatregel voorkomt dat incomplete configuraties met mogelijk ontbrekende onderdelen per ongeluk worden toegevoegd aan uw bestelling.

Materiaalsoort
De materiaalsoort ‘Aluminium’ is momenteel niet beschikbaar. Deze optie zal op een later moment worden toegevoegd.

QWindoors B.V. Configurator - Uw kozijnen, volledig op maat.

Bij QWindoors B.V. begrijpen wij dat ieder project uniek is. Daarom bieden wij onze klanten een gebruiksvriendelijke en krachtige configurator aan, waarmee u uw gewenste kozijnen volledig op maat kunt samenstellen. Overzichtelijk en volledig afgestemd op uw wensen.

Met behulp van onze configurator behoudt u als particuliere klant volledige controle over uw bestelling. Of het nu gaat om renovatie of een nieuwe situatie: onze online tool begeleidt u stapsgewijs door het configuratieproces, op een overzichtelijke en efficiënte wijze zonder onnodige vertragingen.

Wat kunt u configureren?

Onze configurator biedt een breed scala aan opties, zodat u precies datgene kunt samenstellen wat u nodig heeft:

  • Materiaalkeuze: kies tussen hoogwaardige kunststof of aluminium kozijnen
  • Kleur en afwerking: bepaal de exacte uitstraling met onze kleurenpaletten en structuuropties
  • Afmetingen: geef de exacte breedte en hoogte van elk kozijn op
  • Glasopties: selecteer het gewenste type glas, zoals HR++, veiligheidsglas, zonwerend of matglas
  • Type kozijn of raam: zoals draaikiep, vast raam, schuifpui, etc.
  • Extra opties: zoals ventilatieroosters, horren, dorpels, beslag en meer

Heldere samenvatting vóór afronding

Voordat u uw bestelling definitief plaatst, krijgt u een overzichtelijke samenvatting van alle door u gekozen specificaties. Zo kunt u alles rustig controleren voordat u doorgaat naar het afronden van de bestelling.

Gebruiksgemak en ondersteuning

Onze configurator is ontwikkeld met oog voor gebruiksgemak. Toch begrijpen wij dat u tijdens het samenstellen vragen kunt hebben of hulp nodig heeft.

Direct aan de slag

Bent u klaar om uw kozijnen samen te stellen? Klik dan hieronder om direct gebruik te maken van onze configurator en ontdek hoe eenvoudig het is om hoogwaardige maatwerkkozijnen samen te stellen, helemaal naar uw wensen. Start uw configuratie vandaag nog – op uw gemak, waar en wanneer het u uitkomt.

Servicedesk

Heeft u problemen met het gebruik van de configurator, of komt u ergens niet uit? Dan staat onze Servicedesk voor u klaar.
In het formulier selecteert u de categorie 'Technisch' en vervolgens 'Configurator'.

Ticket indienen