IyEgL3Vzci9iaW4vZW52IHB5dGhvbg0KIyAtKi0gY29kaW5nOiBpc28tODg1OS0xIC0qLQ0KIyBXcml0dGVuIGJ5IE1hcnRpbiB2LiBM9ndpcyA8bG9ld2lzQGluZm9ybWF0aWsuaHUtYmVybGluLmRlPg0KDQoiIiJHZW5lcmF0ZSBiaW5hcnkgbWVzc2FnZSBjYXRhbG9nIGZyb20gdGV4dHVhbCB0cmFuc2xhdGlvbiBkZXNjcmlwdGlvbi4NCg0KVGhpcyBwcm9ncmFtIGNvbnZlcnRzIGEgdGV4dHVhbCBVbmlmb3J1bS1zdHlsZSBtZXNzYWdlIGNhdGFsb2cgKC5wbyBmaWxlKSBpbnRvDQphIGJpbmFyeSBHTlUgY2F0YWxvZyAoLm1vIGZpbGUpLiAgVGhpcyBpcyBlc3NlbnRpYWxseSB0aGUgc2FtZSBmdW5jdGlvbiBhcyB0aGUNCkdOVSBtc2dmbXQgcHJvZ3JhbSwgaG93ZXZlciwgaXQgaXMgYSBzaW1wbGVyIGltcGxlbWVudGF0aW9uLg0KDQpVc2FnZTogbXNnZm10LnB5IFtPUFRJT05TXSBmaWxlbmFtZS5wbw0KDQpPcHRpb25zOg0KICAgIC1vIGZpbGUNCiAgICAtLW91dHB1dC1maWxlPWZpbGUNCiAgICAgICAgU3BlY2lmeSB0aGUgb3V0cHV0IGZpbGUgdG8gd3JpdGUgdG8uICBJZiBvbWl0dGVkLCBvdXRwdXQgd2lsbCBnbyB0byBhDQogICAgICAgIGZpbGUgbmFtZWQgZmlsZW5hbWUubW8gKGJhc2VkIG9mZiB0aGUgaW5wdXQgZmlsZSBuYW1lKS4NCg0KICAgIC1oDQogICAgLS1oZWxwDQogICAgICAgIFByaW50IHRoaXMgbWVzc2FnZSBhbmQgZXhpdC4NCg0KICAgIC1WDQogICAgLS12ZXJzaW9uDQogICAgICAgIERpc3BsYXkgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdC4NCiIiIg0KDQppbXBvcnQgc3lzDQppbXBvcnQgb3MNCmltcG9ydCBnZXRvcHQNCmltcG9ydCBzdHJ1Y3QNCmltcG9ydCBhcnJheQ0KDQpfX3ZlcnNpb25fXyA9ICIxLjEiDQoNCk1FU1NBR0VTID0ge30NCg0KDQoMDQpkZWYgdXNhZ2UoY29kZSwgbXNnPScnKToNCiAgICBwcmludCA+PiBzeXMuc3RkZXJyLCBfX2RvY19fDQogICAgaWYgbXNnOg0KICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCBtc2cNCiAgICBzeXMuZXhpdChjb2RlKQ0KDQoNCgwNCmRlZiBhZGQoaWQsIHN0ciwgZnV6enkpOg0KICAgICJBZGQgYSBub24tZnV6enkgdHJhbnNsYXRpb24gdG8gdGhlIGRpY3Rpb25hcnkuIg0KICAgIGdsb2JhbCBNRVNTQUdFUw0KICAgIGlmIG5vdCBmdXp6eSBhbmQgc3RyOg0KICAgICAgICBNRVNTQUdFU1tpZF0gPSBzdHINCg0KDQoMDQpkZWYgZ2VuZXJhdGUoKToNCiAgICAiUmV0dXJuIHRoZSBnZW5lcmF0ZWQgb3V0cHV0LiINCiAgICBnbG9iYWwgTUVTU0FHRVMNCiAgICBrZXlzID0gTUVTU0FHRVMua2V5cygpDQogICAgIyB0aGUga2V5cyBhcmUgc29ydGVkIGluIHRoZSAubW8gZmlsZQ0KICAgIGtleXMuc29ydCgpDQogICAgb2Zmc2V0cyA9IFtdDQogICAgaWRzID0gc3RycyA9ICcnDQogICAgZm9yIGlkIGluIGtleXM6DQogICAgICAgICMgRm9yIGVhY2ggc3RyaW5nLCB3ZSBuZWVkIHNpemUgYW5kIGZpbGUgb2Zmc2V0LiAgRWFjaCBzdHJpbmcgaXMgTlVMDQogICAgICAgICMgdGVybWluYXRlZDsgdGhlIE5VTCBkb2VzIG5vdCBjb3VudCBpbnRvIHRoZSBzaXplLg0KICAgICAgICBvZmZzZXRzLmFwcGVuZCgobGVuKGlkcyksIGxlbihpZCksIGxlbihzdHJzKSwgbGVuKE1FU1NBR0VTW2lkXSkpKQ0KICAgICAgICBpZHMgKz0gaWQgKyAnXDAnDQogICAgICAgIHN0cnMgKz0gTUVTU0FHRVNbaWRdICsgJ1wwJw0KICAgIG91dHB1dCA9ICcnDQogICAgIyBUaGUgaGVhZGVyIGlzIDcgMzItYml0IHVuc2lnbmVkIGludGVnZXJzLiAgV2UgZG9uJ3QgdXNlIGhhc2ggdGFibGVzLCBzbw0KICAgICMgdGhlIGtleXMgc3RhcnQgcmlnaHQgYWZ0ZXIgdGhlIGluZGV4IHRhYmxlcy4NCiAgICAjIHRyYW5zbGF0ZWQgc3RyaW5nLg0KICAgIGtleXN0YXJ0ID0gNyo0KzE2KmxlbihrZXlzKQ0KICAgICMgYW5kIHRoZSB2YWx1ZXMgc3RhcnQgYWZ0ZXIgdGhlIGtleXMNCiAgICB2YWx1ZXN0YXJ0ID0ga2V5c3RhcnQgKyBsZW4oaWRzKQ0KICAgIGtvZmZzZXRzID0gW10NCiAgICB2b2Zmc2V0cyA9IFtdDQogICAgIyBUaGUgc3RyaW5nIHRhYmxlIGZpcnN0IGhhcyB0aGUgbGlzdCBvZiBrZXlzLCB0aGVuIHRoZSBsaXN0IG9mIHZhbHVlcy4NCiAgICAjIEVhY2ggZW50cnkgaGFzIGZpcnN0IHRoZSBzaXplIG9mIHRoZSBzdHJpbmcsIHRoZW4gdGhlIGZpbGUgb2Zmc2V0Lg0KICAgIGZvciBvMSwgbDEsIG8yLCBsMiBpbiBvZmZzZXRzOg0KICAgICAgICBrb2Zmc2V0cyArPSBbbDEsIG8xK2tleXN0YXJ0XQ0KICAgICAgICB2b2Zmc2V0cyArPSBbbDIsIG8yK3ZhbHVlc3RhcnRdDQogICAgb2Zmc2V0cyA9IGtvZmZzZXRzICsgdm9mZnNldHMNCiAgICBvdXRwdXQgPSBzdHJ1Y3QucGFjaygiSWlpaWlpaSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgMHg5NTA0MTJkZUwsICAgICAgICMgTWFnaWMNCiAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgIyBWZXJzaW9uDQogICAgICAgICAgICAgICAgICAgICAgICAgbGVuKGtleXMpLCAgICAgICAgICMgIyBvZiBlbnRyaWVzDQogICAgICAgICAgICAgICAgICAgICAgICAgNyo0LCAgICAgICAgICAgICAgICMgc3RhcnQgb2Yga2V5IGluZGV4DQogICAgICAgICAgICAgICAgICAgICAgICAgNyo0K2xlbihrZXlzKSo4LCAgICMgc3RhcnQgb2YgdmFsdWUgaW5kZXgNCiAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwKSAgICAgICAgICAgICAgIyBzaXplIGFuZCBvZmZzZXQgb2YgaGFzaCB0YWJsZQ0KICAgIG91dHB1dCArPSBhcnJheS5hcnJheSgiaSIsIG9mZnNldHMpLnRvc3RyaW5nKCkNCiAgICBvdXRwdXQgKz0gaWRzDQogICAgb3V0cHV0ICs9IHN0cnMNCiAgICByZXR1cm4gb3V0cHV0DQoNCg0KDA0KZGVmIG1ha2UoZmlsZW5hbWUsIG91dGZpbGUpOg0KICAgIElEID0gMQ0KICAgIFNUUiA9IDINCg0KICAgICMgQ29tcHV0ZSAubW8gbmFtZSBmcm9tIC5wbyBuYW1lIGFuZCBhcmd1bWVudHMNCiAgICBpZiBmaWxlbmFtZS5lbmRzd2l0aCgnLnBvJyk6DQogICAgICAgIGluZmlsZSA9IGZpbGVuYW1lDQogICAgZWxzZToNCiAgICAgICAgaW5maWxlID0gZmlsZW5hbWUgKyAnLnBvJw0KICAgIGlmIG91dGZpbGUgaXMgTm9uZToNCiAgICAgICAgb3V0ZmlsZSA9IG9zLnBhdGguc3BsaXRleHQoaW5maWxlKVswXSArICcubW8nDQoNCiAgICB0cnk6DQogICAgICAgIGxpbmVzID0gb3BlbihpbmZpbGUpLnJlYWRsaW5lcygpDQogICAgZXhjZXB0IElPRXJyb3IsIG1zZzoNCiAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgbXNnDQogICAgICAgIHN5cy5leGl0KDEpDQoNCiAgICBzZWN0aW9uID0gTm9uZQ0KICAgIGZ1enp5ID0gMA0KDQogICAgIyBQYXJzZSB0aGUgY2F0YWxvZw0KICAgIGxubyA9IDANCiAgICBmb3IgbCBpbiBsaW5lczoNCiAgICAgICAgbG5vICs9IDENCiAgICAgICAgIyBJZiB3ZSBnZXQgYSBjb21tZW50IGxpbmUgYWZ0ZXIgYSBtc2dzdHIsIHRoaXMgaXMgYSBuZXcgZW50cnkNCiAgICAgICAgaWYgbFswXSA9PSAnIycgYW5kIHNlY3Rpb24gPT0gU1RSOg0KICAgICAgICAgICAgYWRkKG1zZ2lkLCBtc2dzdHIsIGZ1enp5KQ0KICAgICAgICAgICAgc2VjdGlvbiA9IE5vbmUNCiAgICAgICAgICAgIGZ1enp5ID0gMA0KICAgICAgICAjIFJlY29yZCBhIGZ1enp5IG1hcmsNCiAgICAgICAgaWYgbFs6Ml0gPT0gJyMsJyBhbmQgJ2Z1enp5JyBpbiBsOg0KICAgICAgICAgICAgZnV6enkgPSAxDQogICAgICAgICMgU2tpcCBjb21tZW50cw0KICAgICAgICBpZiBsWzBdID09ICcjJzoNCiAgICAgICAgICAgIGNvbnRpbnVlDQogICAgICAgICMgTm93IHdlIGFyZSBpbiBhIG1zZ2lkIHNlY3Rpb24sIG91dHB1dCBwcmV2aW91cyBzZWN0aW9uDQogICAgICAgIGlmIGwuc3RhcnRzd2l0aCgnbXNnaWQnKSBhbmQgbm90IGwuc3RhcnRzd2l0aCgnbXNnaWRfcGx1cmFsJyk6DQogICAgICAgICAgICBpZiBzZWN0aW9uID09IFNUUjoNCiAgICAgICAgICAgICAgICBhZGQobXNnaWQsIG1zZ3N0ciwgZnV6enkpDQogICAgICAgICAgICBzZWN0aW9uID0gSUQNCiAgICAgICAgICAgIGwgPSBsWzU6XQ0KICAgICAgICAgICAgbXNnaWQgPSBtc2dzdHIgPSAnJw0KICAgICAgICAgICAgaXNfcGx1cmFsID0gRmFsc2UNCiAgICAgICAgIyBUaGlzIGlzIGEgbWVzc2FnZSB3aXRoIHBsdXJhbCBmb3Jtcw0KICAgICAgICBlbGlmIGwuc3RhcnRzd2l0aCgnbXNnaWRfcGx1cmFsJyk6DQogICAgICAgICAgICBpZiBzZWN0aW9uICE9IElEOg0KICAgICAgICAgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsICdtc2dpZF9wbHVyYWwgbm90IHByZWNlZWRlZCBieSBtc2dpZCBvbiAlczolZCcgJVwNCiAgICAgICAgICAgICAgICAgICAgKGluZmlsZSwgbG5vKQ0KICAgICAgICAgICAgICAgIHN5cy5leGl0KDEpDQogICAgICAgICAgICBsID0gbFsxMjpdDQogICAgICAgICAgICBtc2dpZCArPSAnXDAnICMgc2VwYXJhdG9yIG9mIHNpbmd1bGFyIGFuZCBwbHVyYWwNCiAgICAgICAgICAgIGlzX3BsdXJhbCA9IFRydWUNCiAgICAgICAgIyBOb3cgd2UgYXJlIGluIGEgbXNnc3RyIHNlY3Rpb24NCiAgICAgICAgZWxpZiBsLnN0YXJ0c3dpdGgoJ21zZ3N0cicpOg0KICAgICAgICAgICAgc2VjdGlvbiA9IFNUUg0KICAgICAgICAgICAgaWYgbC5zdGFydHN3aXRoKCdtc2dzdHJbJyk6DQogICAgICAgICAgICAgICAgaWYgbm90IGlzX3BsdXJhbDoNCiAgICAgICAgICAgICAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgJ3BsdXJhbCB3aXRob3V0IG1zZ2lkX3BsdXJhbCBvbiAlczolZCcgJVwNCiAgICAgICAgICAgICAgICAgICAgICAgIChpbmZpbGUsIGxubykNCiAgICAgICAgICAgICAgICAgICAgc3lzLmV4aXQoMSkNCiAgICAgICAgICAgICAgICBsID0gbC5zcGxpdCgnXScsIDEpWzFdDQogICAgICAgICAgICAgICAgaWYgbXNnc3RyOg0KICAgICAgICAgICAgICAgICAgICBtc2dzdHIgKz0gJ1wwJyAjIFNlcGFyYXRvciBvZiB0aGUgdmFyaW91cyBwbHVyYWwgZm9ybXMNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgaWYgaXNfcGx1cmFsOg0KICAgICAgICAgICAgICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAnaW5kZXhlZCBtc2dzdHIgcmVxdWlyZWQgZm9yIHBsdXJhbCBvbiAgJXM6JWQnICVcDQogICAgICAgICAgICAgICAgICAgICAgICAoaW5maWxlLCBsbm8pDQogICAgICAgICAgICAgICAgICAgIHN5cy5leGl0KDEpDQogICAgICAgICAgICAgICAgbCA9IGxbNjpdDQogICAgICAgICMgU2tpcCBlbXB0eSBsaW5lcw0KICAgICAgICBsID0gbC5zdHJpcCgpDQogICAgICAgIGlmIG5vdCBsOg0KICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgIyBYWFg6IERvZXMgdGhpcyBhbHdheXMgZm9sbG93IFB5dGhvbiBlc2NhcGUgc2VtYW50aWNzPw0KICAgICAgICBsID0gZXZhbChsKQ0KICAgICAgICBpZiBzZWN0aW9uID09IElEOg0KICAgICAgICAgICAgbXNnaWQgKz0gbA0KICAgICAgICBlbGlmIHNlY3Rpb24gPT0gU1RSOg0KICAgICAgICAgICAgbXNnc3RyICs9IGwNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsICdTeW50YXggZXJyb3Igb24gJXM6JWQnICUgKGluZmlsZSwgbG5vKSwgXA0KICAgICAgICAgICAgICAgICAgJ2JlZm9yZTonDQogICAgICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCBsDQogICAgICAgICAgICBzeXMuZXhpdCgxKQ0KICAgICMgQWRkIGxhc3QgZW50cnkNCiAgICBpZiBzZWN0aW9uID09IFNUUjoNCiAgICAgICAgYWRkKG1zZ2lkLCBtc2dzdHIsIGZ1enp5KQ0KDQogICAgIyBDb21wdXRlIG91dHB1dA0KICAgIG91dHB1dCA9IGdlbmVyYXRlKCkNCg0KICAgIHRyeToNCiAgICAgICAgb3BlbihvdXRmaWxlLCJ3YiIpLndyaXRlKG91dHB1dCkNCiAgICBleGNlcHQgSU9FcnJvcixtc2c6DQogICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsIG1zZw0KDQoNCgwNCmRlZiBtYWluKCk6DQogICAgdHJ5Og0KICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICdoVm86JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWydoZWxwJywgJ3ZlcnNpb24nLCAnb3V0cHV0LWZpbGU9J10pDQogICAgZXhjZXB0IGdldG9wdC5lcnJvciwgbXNnOg0KICAgICAgICB1c2FnZSgxLCBtc2cpDQoNCiAgICBvdXRmaWxlID0gTm9uZQ0KICAgICMgcGFyc2Ugb3B0aW9ucw0KICAgIGZvciBvcHQsIGFyZyBpbiBvcHRzOg0KICAgICAgICBpZiBvcHQgaW4gKCctaCcsICctLWhlbHAnKToNCiAgICAgICAgICAgIHVzYWdlKDApDQogICAgICAgIGVsaWYgb3B0IGluICgnLVYnLCAnLS12ZXJzaW9uJyk6DQogICAgICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAibXNnZm10LnB5IiwgX192ZXJzaW9uX18NCiAgICAgICAgICAgIHN5cy5leGl0KDApDQogICAgICAgIGVsaWYgb3B0IGluICgnLW8nLCAnLS1vdXRwdXQtZmlsZScpOg0KICAgICAgICAgICAgb3V0ZmlsZSA9IGFyZw0KICAgICMgZG8gaXQNCiAgICBpZiBub3QgYXJnczoNCiAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgJ05vIGlucHV0IGZpbGUgZ2l2ZW4nDQogICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsICJUcnkgYG1zZ2ZtdCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiINCiAgICAgICAgcmV0dXJuDQoNCiAgICBmb3IgZmlsZW5hbWUgaW4gYXJnczoNCiAgICAgICAgbWFrZShmaWxlbmFtZSwgb3V0ZmlsZSkNCg0KDQppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOg0KICAgIG1haW4oKQ0K