Ly8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KIA0KLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCg0KI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KYXZhU2NyaXB0LmgiDQojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0lKYXZhU2NyaXB0LmgiDQojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0RlZmluZS5oIg0KI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19PYmplY3QuaCINCiNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfVmFsdWUuaCINCiNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvUHVibGljTWV0aG9kcy5oIg0KI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19FdmVudEhhbmRsZXIuaCINCiNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvcmVzb3VyY2UuaCINCiNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfQ29udGV4dC5oIg0KI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19WYWx1ZS5oIg0KI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC91dGlsLmgiDQojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0ZpZWxkLmgiDQojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L2NvbG9yLmgiDQojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX1J1bnRpbWUuaCINCg0Kc3RhdGljIHY4OjpJc29sYXRlKiBHZXRJc29sYXRlKElGWEpTX0NvbnRleHQqIGNjKQ0Kew0KCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOw0KCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsNCg0KCUNKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsNCglBU1NFUlQocFJ1bnRpbWUgIT0gTlVMTCk7DQoNCglyZXR1cm4gcFJ1bnRpbWUtPkdldElzb2xhdGUoKTsNCn0NCg0KDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDSlNfUHVibGljTWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KDQojZGVmaW5lIERPVUJMRV9DT1JSRUNUCTAuMDAwMDAwMDAwMDAwMDAxDQoNCkJFR0lOX0pTX1NUQVRJQ19HTE9CQUxfRlVOKENKU19QdWJsaWNNZXRob2RzKQ0KCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGTnVtYmVyX0Zvcm1hdCw2KQ0KCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGTnVtYmVyX0tleXN0cm9rZSw2KQ0KCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGUGVyY2VudF9Gb3JtYXQsMikNCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlBlcmNlbnRfS2V5c3Ryb2tlLDIpDQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZEYXRlX0Zvcm1hdEV4LDEpDQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZEYXRlX0tleXN0cm9rZUV4LDEpDQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZEYXRlX0Zvcm1hdCwxKQ0KCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGRGF0ZV9LZXlzdHJva2UsMSkNCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlRpbWVfRm9ybWF0RXgsMSkNCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlRpbWVfS2V5c3Ryb2tlRXgsMSkNCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlRpbWVfRm9ybWF0LDEpDQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZUaW1lX0tleXN0cm9rZSwxKQ0KCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGU3BlY2lhbF9Gb3JtYXQsMSkNCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlNwZWNpYWxfS2V5c3Ryb2tlLDEpDQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZTcGVjaWFsX0tleXN0cm9rZUV4LDEpDQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZTaW1wbGUsMykNCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRk1ha2VOdW1iZXIsMSkNCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlNpbXBsZV9DYWxjdWxhdGUsMikNCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlJhbmdlX1ZhbGlkYXRlLDQpDQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZNZXJnZUNoYW5nZSwxKQ0KCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGUGFyc2VEYXRlRXgsMikNCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRkV4dHJhY3ROdW1zLDEpDQpFTkRfSlNfU1RBVElDX0dMT0JBTF9GVU4oKQ0KDQpJTVBMRU1FTlRfSlNfU1RBVElDX0dMT0JBTF9GVU4oQ0pTX1B1YmxpY01ldGhvZHMpDQoNCnN0cnVjdCBzdHJ1X1RiQ29udmVydA0Kew0KCUZYX0xQQ1NUUiBscHN6SlNNYXJrOw0KCUZYX0xQQ1NUUiBscHN6Q3BwTWFyazsNCn07DQoNCnN0YXRpYyBjb25zdCBzdHJ1X1RiQ29udmVydCBmY1RhYmxlW10gPSB7Im1tbW0iLCIlQiIsDQoJIm1tbSIsICIlYiIsDQoJIm1tIiwgICIlbSIsDQoJLy8ibSINCgkiZGRkZCIsIiVBIiwNCgkiZGRkIiwgIiVhIiwNCgkiZGQiLCAgIiVkIiwNCgkvLyJkIiwgICAiJXciLA0KCSJ5eXl5IiwiJVkiLA0KCSJ5eSIsICAiJXkiLA0KCSJISCIsICAiJUgiLA0KCS8vIkgiDQoJImhoIiwgICIlSSIsDQoJLy8iaCINCgkiTU0iLCAgIiVNIiwNCgkvLyJNIg0KCSJzcyIsICAiJVMiLA0KCS8vInMNCgkidHQiLCAgIiVwIg0KCS8vInQiDQp9Ow0KDQpzdGF0aWMgRlhfTFBDV1NUUiBtb250aHNbXSA9DQp7DQoJKEZYX0xQQ1dTVFIpTCJKYW4iLCAoRlhfTFBDV1NUUilMIkZlYiIsIChGWF9MUENXU1RSKUwiTWFyIiwgKEZYX0xQQ1dTVFIpTCJBcHIiLCAoRlhfTFBDV1NUUilMIk1heSIsIChGWF9MUENXU1RSKUwiSnVuIiwgKEZYX0xQQ1dTVFIpTCJKdWwiLCAoRlhfTFBDV1NUUilMIkF1ZyIsIChGWF9MUENXU1RSKUwiU2VwIiwgKEZYX0xQQ1dTVFIpTCJPY3QiLCAoRlhfTFBDV1NUUilMIk5vdiIsIChGWF9MUENXU1RSKUwiRGVjIg0KfTsNCg0Kc3RhdGljIEZYX0xQQ1dTVFIgZnVsbG1vbnRoc1tdID0gDQp7IA0KCShGWF9MUENXU1RSKUwiSmFudWFyeSIsIChGWF9MUENXU1RSKUwiRmVicnVhcnkiLCAoRlhfTFBDV1NUUilMIk1hcmNoIiwgKEZYX0xQQ1dTVFIpTCJBcHJpbCIsIChGWF9MUENXU1RSKUwiTWF5IiwgKEZYX0xQQ1dTVFIpTCJKdW5lIiwgKEZYX0xQQ1dTVFIpTCJKdWx5IiwgKEZYX0xQQ1dTVFIpTCJBdWd1c3QiLCAoRlhfTFBDV1NUUilMIlNlcHRlbWJlciIsIChGWF9MUENXU1RSKUwiT2N0b2JlciIsIChGWF9MUENXU1RSKUwiTm92ZW1iZXIiLCAoRlhfTFBDV1NUUilMIkRlY2VtYmVyIiANCn07DQoNCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OklzTnVtYmVyKEZYX0xQQ1dTVFIgc3RyaW5nKQ0Kew0KCUNGWF9XaWRlU3RyaW5nIHNUcmltID0gU3RyVHJpbShzdHJpbmcpOw0KCUZYX0xQQ1dTVFIgcFRyaW0gPSBzVHJpbTsNCglGWF9MUENXU1RSIHAgPSBwVHJpbTsNCg0KDQoJRlhfQk9PTCBiRG90ID0gRkFMU0U7DQoJRlhfQk9PTCBiS1hKUyA9IEZBTFNFOw0KDQoJd2NoYXJfdCBjOw0KCXdoaWxlICgoYyA9ICpwKSkNCgl7DQoJCWlmIChjID09ICcuJyB8fCBjID09ICcsJykNCgkJew0KCQkJaWYgKGJEb3QpIHJldHVybiBGQUxTRTsNCgkJCWJEb3QgPSBUUlVFOw0KCQl9DQoJCWVsc2UgaWYgKGMgPT0gJy0nIHx8IGMgPT0gJysnKQ0KCQl7DQoJCQlpZiAocCAhPSBwVHJpbSkNCgkJCQlyZXR1cm4gRkFMU0U7DQoJCX0NCgkJZWxzZSBpZiAoYyA9PSAnZScgfHwgYyA9PSAnRScpDQoJCXsNCgkJCWlmIChiS1hKUykgcmV0dXJuIEZBTFNFOw0KDQoJCQlwKys7DQoJCQljID0gKnA7DQoJCQlpZiAoYyA9PSAnKycgfHwgYyA9PSAnLScpDQoJCQl7DQoJCQkJYktYSlMgPSBUUlVFOw0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCXJldHVybiBGQUxTRTsNCgkJCX0NCgkJfQ0KCQllbHNlIGlmICghSXNEaWdpdChjKSkNCgkJew0KCQkJcmV0dXJuIEZBTFNFOw0KCQl9DQoJCXArKzsNCgl9DQoNCglyZXR1cm4gVFJVRTsNCn0NCg0KRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6SXNEaWdpdCh3Y2hhcl90IGNoKQ0Kew0KCXJldHVybiAoY2ggPj0gTCcwJyAmJiBjaCA8PSBMJzknKTsNCn0NCg0KRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6SXNEaWdpdChjaGFyIGNoKQ0Kew0KCXJldHVybiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5Jyk7DQp9DQoNCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OklzQWxwaGFiZXRpYyh3Y2hhcl90IGNoKQ0Kew0KCXJldHVybiAoKGNoID49IEwnYScgJiYgY2ggPD0gTCd6JykgfHwgKGNoID49IEwnQScgJiYgY2ggPD0gTCdaJykpOw0KfQ0KDQpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpJc0FscGhhTnVtZXJpYyh3Y2hhcl90IGNoKQ0Kew0KCXJldHVybiAoSXNEaWdpdChjaCkgfHwgSXNBbHBoYWJldGljKGNoKSk7DQp9DQoNCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6Om1hc2tTYXRpc2ZpZWQod2NoYXJfdCBjX0NoYW5nZSx3Y2hhcl90IGNfTWFzaykNCnsNCglzd2l0Y2ggKGNfTWFzaykNCgl7DQoJY2FzZSBMJzknOg0KICAgICAgICByZXR1cm4gSXNEaWdpdChjX0NoYW5nZSk7CQkNCiAgICBjYXNlIEwnQSc6DQogICAgICAgIHJldHVybiBJc0FscGhhYmV0aWMoY19DaGFuZ2UpOwkJDQogICAgY2FzZSBMJ08nOg0KICAgICAgICByZXR1cm4gSXNBbHBoYU51bWVyaWMoY19DaGFuZ2UpOwkJDQogICAgY2FzZSBMJ1gnOg0KICAgICAgICByZXR1cm4gVFJVRTsJCQ0KCWRlZmF1bHQ6DQogICAgICAgIHJldHVybiAoY19DaGFuZ2UgPT0gY19NYXNrKTsNCgl9DQp9DQoNCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OmlzUmVzZXJ2ZWRNYXNrQ2hhcih3Y2hhcl90IGNoKQ0Kew0KCXJldHVybiBjaCA9PSBMJzknIHx8IGNoID09IEwnQScgfHwgY2ggPT0gTCdPJyB8fCBjaCA9PSBMJ1gnOw0KfQ0KDQpkb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6OkFGX1NpbXBsZShGWF9MUENXU1RSIHNGdWN0aW9uLCBkb3VibGUgZFZhbHVlMSwgZG91YmxlIGRWYWx1ZTIpDQp7DQoJaWYgKEZYU1lTX3djc2ljbXAoc0Z1Y3Rpb24sKEZYX0xQQ1dTVFIpTCJBVkciKSA9PSAwIHx8IEZYU1lTX3djc2ljbXAoc0Z1Y3Rpb24sKEZYX0xQQ1dTVFIpTCJTVU0iKSA9PSAwKQ0KCXsNCgkJcmV0dXJuIGRWYWx1ZTEgKyBkVmFsdWUyOw0KCX0NCgllbHNlIGlmIChGWFNZU193Y3NpY21wKHNGdWN0aW9uLCAoRlhfTFBDV1NUUilMIlBSRCIpID09IDApDQoJew0KCQlyZXR1cm4gZFZhbHVlMSAqIGRWYWx1ZTI7DQoJfQ0KCWVsc2UgaWYgKEZYU1lTX3djc2ljbXAoc0Z1Y3Rpb24sKEZYX0xQQ1dTVFIpTCJNSU4iKSA9PSAwKQ0KCXsNCgkJcmV0dXJuIEZYX01JTihkVmFsdWUxLCBkVmFsdWUyKTsNCgl9DQoJZWxzZSBpZiAoRlhTWVNfd2NzaWNtcChzRnVjdGlvbiwoRlhfTFBDV1NUUilMIk1BWCIpID09IDApDQoJew0KCQlyZXR1cm4gRlhfTUFYKGRWYWx1ZTEsIGRWYWx1ZTIpOw0KCX0NCg0KCXJldHVybiBkVmFsdWUxOw0KfQ0KDQpDRlhfV2lkZVN0cmluZyBDSlNfUHVibGljTWV0aG9kczo6U3RyTFRyaW0oRlhfTFBDV1NUUiBwU3RyKQ0Kew0KCXdoaWxlICgqcFN0ciAmJiAqcFN0ciA9PSBMJyAnKSBwU3RyKys7DQoNCglyZXR1cm4gcFN0cjsNCn0NCg0KQ0ZYX1dpZGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6OlN0clJUcmltKEZYX0xQQ1dTVFIgcFN0cikNCnsNCglGWF9MUENXU1RSIHAgPSBwU3RyOw0KDQoJd2hpbGUgKCpwKSBwKys7DQoJcC0tOw0KCWlmIChwID49IHBTdHIpDQoJewkJDQoJCXdoaWxlICgqcCAmJiAqcCA9PSBMJyAnKSBwLS07DQoJCXArKzsNCgkJcmV0dXJuIENGWF9XaWRlU3RyaW5nKHBTdHIscC1wU3RyKTsNCgl9DQoJcmV0dXJuIEwiIjsNCn0NCg0KQ0ZYX1dpZGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6OlN0clRyaW0oRlhfTFBDV1NUUiBwU3RyKQ0Kew0KCXJldHVybiBTdHJSVHJpbShTdHJMVHJpbShwU3RyKSk7DQp9DQoNCkNGWF9CeXRlU3RyaW5nIENKU19QdWJsaWNNZXRob2RzOjpTdHJMVHJpbShGWF9MUENTVFIgcFN0cikNCnsNCgl3aGlsZSAoKnBTdHIgJiYgKnBTdHIgPT0gJyAnKSBwU3RyKys7DQoNCiAgICByZXR1cm4gcFN0cjsNCn0NCg0KQ0ZYX0J5dGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6OlN0clJUcmltKEZYX0xQQ1NUUiBwU3RyKQ0Kew0KCUZYX0xQQ1NUUiBwID0gcFN0cjsNCg0KCXdoaWxlICgqcCkgcCsrOw0KCXAtLTsNCglpZiAocCA+PSBwU3RyKQ0KCXsJCQ0KCQl3aGlsZSAoKnAgJiYgKnAgPT0gJyAnKSBwLS07DQoJCXArKzsNCgkJcmV0dXJuIENGWF9CeXRlU3RyaW5nKHBTdHIscC1wU3RyKTsNCgl9DQoJcmV0dXJuICIiOw0KfQ0KDQpDRlhfQnl0ZVN0cmluZyBDSlNfUHVibGljTWV0aG9kczo6U3RyVHJpbShGWF9MUENTVFIgcFN0cikNCnsNCglyZXR1cm4gU3RyUlRyaW0oU3RyTFRyaW0ocFN0cikpOw0KfQ0KDQpkb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6OlBhcnNlTnVtYmVyKEZYX0xQQ1dTVFIgc3dTb3VyY2UsIEZYX0JPT0wmIGJBbGxEaWdpdHMsIEZYX0JPT0wmIGJEb3QsIEZYX0JPT0wmIGJTaWduLCBGWF9CT09MJiBiS1hKUykNCnsNCgliRG90ID0gRkFMU0U7DQoJYlNpZ24gPSBGQUxTRTsNCgliS1hKUyA9IEZBTFNFOw0KDQoJRlhfQk9PTCBiRGlnaXRFeGlzdCA9IEZBTFNFOw0KDQoJRlhfTFBDV1NUUiBwID0gc3dTb3VyY2U7DQoJd2NoYXJfdCBjOw0KDQoJRlhfTFBDV1NUUiBwU3RhcnQgPSBOVUxMOw0KCUZYX0xQQ1dTVFIgcEVuZCA9IE5VTEw7DQoNCgl3aGlsZSAoKGMgPSAqcCkpDQoJew0KCQlpZiAoIXBTdGFydCAmJiBjICE9IEwnICcpDQoJCXsNCgkJCXBTdGFydCA9IHA7DQoJCX0NCg0KCQlwRW5kID0gcDsNCgkJcCsrOw0KCX0NCg0KCWlmICghcFN0YXJ0KQ0KCXsNCgkJYkFsbERpZ2l0cyA9IEZBTFNFOw0KCQlyZXR1cm4gMDsNCgl9DQoNCgl3aGlsZSAocEVuZCAhPSBwU3RhcnQpDQoJew0KCQlpZiAoKnBFbmQgPT0gTCcgJykNCgkJCXBFbmQgLS07DQoJCWVsc2UNCgkJCWJyZWFrOw0KCX0NCg0KCWRvdWJsZSBkUmV0ID0gMDsNCglwID0gcFN0YXJ0Ow0KCWJBbGxEaWdpdHMgPSBUUlVFOw0KCUNGWF9XaWRlU3RyaW5nIHN3RGlnaXRzOw0KDQoJd2hpbGUgKHAgPD0gcEVuZCkNCgl7CQ0KCQljID0gKnA7DQoNCgkJaWYgKElzRGlnaXQoYykpDQoJCXsNCgkJCXN3RGlnaXRzICs9IGM7DQoJCQliRGlnaXRFeGlzdCA9IFRSVUU7DQoJCX0NCgkJZWxzZSANCgkJew0KCQkJc3dpdGNoIChjKQ0KCQkJew0KCQkJY2FzZSBMJyAnOg0KCQkJCWJBbGxEaWdpdHMgPSBGQUxTRTsNCgkJCQlicmVhazsNCgkJCWNhc2UgTCcuJzoNCgkJCWNhc2UgTCcsJzoNCgkJCQlpZiAoIWJEb3QpDQoJCQkJew0KCQkJCQlpZiAoYkRpZ2l0RXhpc3QpDQoJCQkJCXsNCgkJCQkJCXN3RGlnaXRzICs9IEwnLic7DQoJCQkJCX0NCgkJCQkJZWxzZQ0KCQkJCQl7DQoJCQkJCQlzd0RpZ2l0cyArPSBMJzAnOw0KCQkJCQkJc3dEaWdpdHMgKz0gTCcuJzsNCgkJCQkJCWJEaWdpdEV4aXN0ID0gVFJVRTsNCgkJCQkJfQ0KDQoJCQkJCWJEb3QgPSBUUlVFOw0KCQkJCQlicmVhazsNCgkJCQl9DQoJCQljYXNlICdlJzoNCgkJCWNhc2UgJ0UnOg0KCQkJCWlmICghYktYSlMpDQoJCQkJew0KCQkJCQlwKys7DQoJCQkJCWMgPSAqcDsNCgkJCQkJaWYgKGMgPT0gJysnIHx8IGMgPT0gJy0nKQ0KCQkJCQl7DQoJCQkJCQliS1hKUyA9IFRSVUU7DQoJCQkJCQlzd0RpZ2l0cyArPSAnZSc7DQoJCQkJCQlzd0RpZ2l0cyArPSBjOw0KCQkJCQl9DQoJCQkJCWJyZWFrOw0KCQkJCX0NCgkJCWNhc2UgTCctJzoNCgkJCQlpZiAoIWJEaWdpdEV4aXN0ICYmICFiU2lnbikNCgkJCQl7DQoJCQkJCXN3RGlnaXRzICs9IGM7DQoJCQkJCWJTaWduID0gVFJVRTsNCgkJCQkJYnJlYWs7DQoJCQkJfQ0KCQkJZGVmYXVsdDoNCgkJCQliQWxsRGlnaXRzID0gRkFMU0U7DQoNCgkJCQlpZiAocCAhPSBwU3RhcnQgJiYgIWJEb3QgJiYgYkRpZ2l0RXhpc3QpDQoJCQkJew0KCQkJCQlzd0RpZ2l0cyArPSBMJy4nOw0KCQkJCQliRG90ID0gVFJVRTsNCgkJCQl9DQoJCQkJZWxzZQ0KCQkJCXsNCgkJCQkJYkRvdCA9IEZBTFNFOw0KCQkJCQliRGlnaXRFeGlzdCA9IEZBTFNFOw0KCQkJCQlzd0RpZ2l0cyA9IEwiIjsNCgkJCQl9DQoJCQkJYnJlYWs7DQoJCQl9DQoJCX0NCg0KCQlwKys7DQoJfQ0KDQoJaWYgKHN3RGlnaXRzLkdldExlbmd0aCgpID4gMCAmJiBzd0RpZ2l0cy5HZXRMZW5ndGgoKSA8IDE3KQ0KCXsNCgkJQ0ZYX0J5dGVTdHJpbmcgc0RpZ2l0cyA9IHN3RGlnaXRzLlVURjhFbmNvZGUoKTsNCg0KCQlpZiAoYktYSlMpDQoJCXsNCgkJCWRSZXQgPSBhdG9mKHNEaWdpdHMpOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJaWYgKGJEb3QpDQoJCQl7DQoJCQkJY2hhciogcFN0b3BTdHJpbmc7DQoJCQkJZFJldCA9IDo6c3RydG9kKHNEaWdpdHMsICZwU3RvcFN0cmluZyk7DQoJCQl9DQoJCQllbHNlDQoJCQl7DQoJCQkJZFJldCA9IGF0b2woc0RpZ2l0cyk7DQoJCQl9DQoJCX0NCg0KCX0NCg0KCXJldHVybiBkUmV0Ow0KfQ0KDQpkb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6OlBhcnNlU3RyaW5nVG9OdW1iZXIoRlhfTFBDV1NUUiBzd1NvdXJjZSkNCnsNCglGWF9CT09MIGJBbGxEaWdpdHMgPSBGQUxTRTsNCglGWF9CT09MIGJEb3QgPSBGQUxTRTsNCglGWF9CT09MIGJTaWduID0gRkFMU0U7DQoJRlhfQk9PTCBiS1hKUyA9IEZBTFNFOw0KDQoJcmV0dXJuIFBhcnNlTnVtYmVyKHN3U291cmNlLCBiQWxsRGlnaXRzLCBiRG90LCBiU2lnbiwgYktYSlMpOw0KfQ0KDQpGWF9CT09MCUNKU19QdWJsaWNNZXRob2RzOjpDb252ZXJ0U3RyaW5nVG9OdW1iZXIoRlhfTFBDV1NUUiBzd1NvdXJjZSwgZG91YmxlICYgZFJldCwgRlhfQk9PTCAmIGJEb3QpDQp7DQoJRlhfQk9PTCBiQWxsRGlnaXRzID0gRkFMU0U7DQoJRlhfQk9PTCBiU2lnbiA9IEZBTFNFOw0KCUZYX0JPT0wgYktYSlMgPSBGQUxTRTsNCg0KCWRSZXQgPSBQYXJzZU51bWJlcihzd1NvdXJjZSwgYkFsbERpZ2l0cywgYkRvdCwgYlNpZ24sIGJLWEpTKTsNCg0KCXJldHVybiBiQWxsRGlnaXRzOw0KfQ0KDQpDSlNfQXJyYXkgQ0pTX1B1YmxpY01ldGhvZHM6OkFGX01ha2VBcnJheUZyb21MaXN0KHY4OjpJc29sYXRlKiBpc29sYXRlLCBDSlNfVmFsdWUgdmFsKQ0Kew0KCUNKU19BcnJheSBTdHJBcnJheShpc29sYXRlKTsNCglpZih2YWwuSXNBcnJheU9iamVjdCgpKQ0KCXsNCgkJdmFsLkNvbnZlcnRUb0FycmF5KFN0ckFycmF5KTsNCgkJcmV0dXJuIFN0ckFycmF5Ow0KCX0NCglDRlhfV2lkZVN0cmluZyB3c1N0ciA9IHZhbC5vcGVyYXRvciBDRlhfV2lkZVN0cmluZygpOw0KCUNGWF9CeXRlU3RyaW5nIHQgPSBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUod3NTdHIpOw0KCWNvbnN0IGNoYXIgKiBwID0gKGNvbnN0IGNoYXIgKil0Ow0KDQoNCglpbnQgY2ggPSAnLCcgOw0KCWludCBuSW5kZXggPSAwOw0KDQoJd2hpbGUgKCpwKQ0KCXsNCgkJY29uc3QgY2hhciAqIHBUZW1wID0gc3RyY2hyKHAsIGNoKTsNCgkJaWYgKHBUZW1wID09IE5VTEwpDQoJCXsNCgkJCVN0ckFycmF5LlNldEVsZW1lbnQobkluZGV4LCBDSlNfVmFsdWUoaXNvbGF0ZSwoRlhfTFBDU1RSKVN0clRyaW0ocCkpKTsNCgkJCWJyZWFrOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJY2hhciAqIHBTdWIgPSBuZXcgY2hhcltwVGVtcCAtIHAgKyAxXTsNCgkJCXN0cm5jcHkocFN1YiwgcCwgcFRlbXAgLSBwKTsNCgkJCSoocFN1YiArIChwVGVtcCAtIHApKSA9ICdcMCc7DQoNCgkJCVN0ckFycmF5LlNldEVsZW1lbnQobkluZGV4LCBDSlNfVmFsdWUoaXNvbGF0ZSwoRlhfTFBDU1RSKVN0clRyaW0ocFN1YikpKTsNCgkJCWRlbGV0ZSBbXXBTdWI7DQoJCQkNCgkJCW5JbmRleCArKzsNCgkJCXAgPSArK3BUZW1wOw0KCQl9DQoJCQ0KCX0NCglyZXR1cm4gU3RyQXJyYXk7DQp9DQoNCmludCBDSlNfUHVibGljTWV0aG9kczo6UGFyc2VTdHJpbmdJbnRlZ2VyKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJpbmcsaW50IG5TdGFydCxpbnQmIG5Ta2lwLCBpbnQgbk1heFN0ZXApDQp7DQoJaW50IG5SZXQgPSAwOw0KCW5Ta2lwID0gMDsNCglmb3IgKGludCBpPW5TdGFydCwgc3o9c3RyaW5nLkdldExlbmd0aCgpOyBpIDwgc3o7IGkrKykNCgl7DQoJCWlmIChpLW5TdGFydCA+IDEwKQ0KCQkJYnJlYWs7DQoNCgkJRlhfV0NIQVIgYyA9IHN0cmluZy5HZXRBdChpKTsNCgkJaWYgKElzRGlnaXQoKHdjaGFyX3QpYykpDQoJCXsNCgkJCW5SZXQgPSBuUmV0ICogMTAgKyAoYyAtICcwJyk7DQoJCQluU2tpcCA9IGkgLSBuU3RhcnQgKyAxOw0KCQkJaWYgKG5Ta2lwID49IG5NYXhTdGVwKSANCgkJCQlicmVhazsNCgkJfQ0KCQllbHNlDQoJCQlicmVhazsNCgl9DQoNCglyZXR1cm4gblJldDsNCn0NCg0KQ0ZYX1dpZGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6OlBhcnNlU3RyaW5nU3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJpbmcsIGludCBuU3RhcnQsIGludCYgblNraXApDQp7DQoJQ0ZYX1dpZGVTdHJpbmcgc3dSZXQ7DQoJblNraXAgPSAwOw0KCWZvciAoaW50IGk9blN0YXJ0LCBzej1zdHJpbmcuR2V0TGVuZ3RoKCk7IGkgPCBzejsgaSsrKQ0KCXsNCgkJRlhfV0NIQVIgYyA9IHN0cmluZy5HZXRBdChpKTsNCgkJaWYgKChjID49IEwnYScgJiYgYyA8PSBMJ3onKSB8fCAoYyA+PSBMJ0EnICYmIGMgPD0gTCdaJykpDQoJCXsNCgkJCXN3UmV0ICs9IGM7DQoJCQluU2tpcCA9IGkgLSBuU3RhcnQgKyAxOw0KCQl9DQoJCWVsc2UNCgkJCWJyZWFrOw0KCX0NCg0KCXJldHVybiBzd1JldDsNCn0NCg0KZG91YmxlIENKU19QdWJsaWNNZXRob2RzOjpQYXJzZU5vcm1hbERhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiB2YWx1ZSwgRlhfQk9PTCYgYldyb25nRm9ybWF0KQ0Kew0KCWRvdWJsZSBkdCA9IEpTX0dldERhdGVUaW1lKCk7DQoNCglpbnQgblllYXIgPSBKU19HZXRZZWFyRnJvbVRpbWUoZHQpOw0KCWludCBuTW9udGggPSBKU19HZXRNb250aEZyb21UaW1lKGR0KSArIDE7DQoJaW50IG5EYXkgPSBKU19HZXREYXlGcm9tVGltZShkdCk7DQoJaW50IG5Ib3VyID0gSlNfR2V0SG91ckZyb21UaW1lKGR0KTsNCglpbnQgbk1pbiA9IEpTX0dldE1pbkZyb21UaW1lKGR0KTsNCglpbnQgblNlYyA9IEpTX0dldFNlY0Zyb21UaW1lKGR0KTsNCg0KCWludCBudW1iZXJbM107DQoNCglpbnQgblNraXAgPSAwOw0KCWludCBuTGVuID0gdmFsdWUuR2V0TGVuZ3RoKCk7DQoJaW50IG5JbmRleCA9IDA7DQoJaW50IGkgPSAwOw0KCXdoaWxlIChpIDwgbkxlbikNCgl7DQoJCWlmIChuSW5kZXggPiAyKSBicmVhazsNCg0KCQlGWF9XQ0hBUiBjID0gdmFsdWUuR2V0QXQoaSk7DQoJCWlmIChJc0RpZ2l0KCh3Y2hhcl90KWMpKQ0KCQl7DQoJCQludW1iZXJbbkluZGV4KytdID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBpLCBuU2tpcCwgNCk7DQoJCQlpICs9IG5Ta2lwOwkJCQ0KCQl9DQoJCWVsc2UNCgkJew0KCQkJaSArKzsNCgkJfQ0KCX0NCg0KCWlmIChuSW5kZXggPT0gMikNCgl7DQoJCS8vIGNhc2UyOiBtb250aC9kYXkNCgkJLy8gY2FzZTM6IGRheS9tb250aA0KCQlpZiAoKG51bWJlclswXSA+PSAxICYmIG51bWJlclswXSA8PSAxMikgJiYgKG51bWJlclsxXSA+PSAxICYmIG51bWJlclsxXSA8PSAzMSkpDQoJCXsNCgkJCW5Nb250aCA9IG51bWJlclswXTsNCgkJCW5EYXkgPSBudW1iZXJbMV07DQoJCX0NCgkJZWxzZSBpZiAoKG51bWJlclswXSA+PSAxICYmIG51bWJlclswXSA8PSAzMSkgJiYgKG51bWJlclsxXSA+PSAxICYmIG51bWJlclsxXSA8PSAxMikpDQoJCXsNCgkJCW5EYXkgPSBudW1iZXJbMF07DQoJCQluTW9udGggPSBudW1iZXJbMV07DQoJCX0NCg0KCQliV3JvbmdGb3JtYXQgPSBGQUxTRTsNCgl9DQoJZWxzZSBpZiAobkluZGV4ID09IDMpDQoJew0KCQkvLyBjYXNlMTogeWVhci9tb250aC9kYXkNCgkJLy8gY2FzZTI6IG1vbnRoL2RheS95ZWFyDQoJCS8vIGNhc2UzOiBkYXkvbW9udGgveWVhcg0KDQoJCWlmIChudW1iZXJbMF0gPiAxMiAmJiAobnVtYmVyWzFdID49IDEgJiYgbnVtYmVyWzFdIDw9IDEyKSAmJiAobnVtYmVyWzJdID49IDEgJiYgbnVtYmVyWzJdIDw9IDMxKSkNCgkJew0KCQkJblllYXIgPSBudW1iZXJbMF07DQoJCQluTW9udGggPSBudW1iZXJbMV07DQoJCQluRGF5ID0gbnVtYmVyWzJdOw0KCQl9DQoJCWVsc2UgaWYgKChudW1iZXJbMF0gPj0gMSAmJiBudW1iZXJbMF0gPD0gMTIpICYmIChudW1iZXJbMV0gPj0gMSAmJiBudW1iZXJbMV0gPD0gMzEpICYmIG51bWJlclsyXSA+IDMxKQ0KCQl7DQoJCQluTW9udGggPSBudW1iZXJbMF07DQoJCQluRGF5ID0gbnVtYmVyWzFdOw0KCQkJblllYXIgPSBudW1iZXJbMl07DQoJCX0NCgkJZWxzZSBpZiAoKG51bWJlclswXSA+PSAxICYmIG51bWJlclswXSA8PSAzMSkgJiYgKG51bWJlclsxXSA+PSAxICYmIG51bWJlclsxXSA8PSAxMikgJiYgbnVtYmVyWzJdID4gMzEpDQoJCXsNCgkJCW5EYXkgPSBudW1iZXJbMF07DQoJCQluTW9udGggPSBudW1iZXJbMV07DQoJCQluWWVhciA9IG51bWJlclsyXTsNCgkJfQ0KDQoJCWJXcm9uZ0Zvcm1hdCA9IEZBTFNFOw0KCX0NCgllbHNlDQoJew0KCQliV3JvbmdGb3JtYXQgPSBUUlVFOw0KCQlyZXR1cm4gZHQ7DQoJfQ0KDQoJQ0ZYX1dpZGVTdHJpbmcgc3dUZW1wOw0KCXN3VGVtcC5Gb3JtYXQoKEZYX0xQQ1dTVFIpTCIlZC8lZC8lZCAlZDolZDolZCIsbk1vbnRoLG5EYXksblllYXIsbkhvdXIsbk1pbixuU2VjKTsNCglyZXR1cm4gSlNfRGF0ZVBhcnNlKHN3VGVtcCk7DQp9DQoNCmRvdWJsZSBDSlNfUHVibGljTWV0aG9kczo6TWFrZVJlZ3VsYXJEYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nICYgdmFsdWUsIGNvbnN0IENGWF9XaWRlU3RyaW5nICYgZm9ybWF0LCBGWF9CT09MJiBiV3JvbmdGb3JtYXQpDQp7DQoJZG91YmxlIGR0ID0gSlNfR2V0RGF0ZVRpbWUoKTsNCg0KCWlmIChmb3JtYXQuSXNFbXB0eSgpIHx8IHZhbHVlLklzRW1wdHkoKSkNCgkJcmV0dXJuIGR0Ow0KDQoJaW50IG5ZZWFyID0gSlNfR2V0WWVhckZyb21UaW1lKGR0KTsNCglpbnQgbk1vbnRoID0gSlNfR2V0TW9udGhGcm9tVGltZShkdCkgKyAxOw0KCWludCBuRGF5ID0gSlNfR2V0RGF5RnJvbVRpbWUoZHQpOw0KCWludCBuSG91ciA9IEpTX0dldEhvdXJGcm9tVGltZShkdCk7DQoJaW50IG5NaW4gPSBKU19HZXRNaW5Gcm9tVGltZShkdCk7DQoJaW50IG5TZWMgPSBKU19HZXRTZWNGcm9tVGltZShkdCk7DQoNCglpbnQgblllYXJTdWIgPSA5OTsgLy9uWWVhciAtIDIwMDA7DQoNCglGWF9CT09MIGJQbSA9IEZBTFNFOw0KCUZYX0JPT0wgYkV4aXQgPSBGQUxTRTsNCgliV3JvbmdGb3JtYXQgPSBGQUxTRTsNCgkNCglpbnQgaT0wOw0KCWludCBqPTA7DQoNCgl3aGlsZSAoaSA8IGZvcm1hdC5HZXRMZW5ndGgoKSkNCgl7DQoJCWlmIChiRXhpdCkgYnJlYWs7DQoNCgkJRlhfV0NIQVIgYyA9IGZvcm1hdC5HZXRBdChpKTsJCQ0KCQlzd2l0Y2ggKGMpDQoJCXsNCgkJCWNhc2UgJzonOg0KCQkJY2FzZSAnLic6DQoJCQljYXNlICctJzoNCgkJCWNhc2UgJ1xcJzoNCgkJCWNhc2UgJy8nOg0KCQkJCWkrKzsNCgkJCQlqKys7DQoJCQkJYnJlYWs7DQoJCQkJDQoJCQljYXNlICd5JzoNCgkJCWNhc2UgJ20nOg0KCQkJY2FzZSAnZCc6DQoJCQljYXNlICdIJzoNCgkJCWNhc2UgJ2gnOg0KCQkJY2FzZSAnTSc6DQoJCQljYXNlICdzJzoNCgkJCWNhc2UgJ3QnOg0KCQkJCXsNCgkJCQkJaW50IG9sZGogPSBqOw0KCQkJCQlpbnQgblNraXAgPSAwOw0KDQoJCQkJCWlmIChmb3JtYXQuR2V0QXQoaSsxKSAhPSBjKQ0KCQkJCQl7DQoJCQkJCQlzd2l0Y2ggKGMpDQoJCQkJCQl7DQoJCQkJCQkJY2FzZSAneSc6DQoJCQkJCQkJCWkrKzsNCgkJCQkJCQkJaisrOw0KCQkJCQkJCQlicmVhazsNCgkJCQkJCQljYXNlICdtJzoNCgkJCQkJCQkJbk1vbnRoID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7DQoJCQkJCQkJCWkrKzsNCgkJCQkJCQkJaiArPSBuU2tpcDsNCgkJCQkJCQkJYnJlYWs7DQoJCQkJCQkJY2FzZSAnZCc6DQoJCQkJCQkJCW5EYXkgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsNCgkJCQkJCQkJaSsrOw0KCQkJCQkJCQlqICs9IG5Ta2lwOw0KCQkJCQkJCQlicmVhazsNCgkJCQkJCQljYXNlICdIJzoNCgkJCQkJCQkJbkhvdXIgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsNCgkJCQkJCQkJaSsrOw0KCQkJCQkJCQlqICs9IG5Ta2lwOw0KCQkJCQkJCQlicmVhazsNCgkJCQkJCQljYXNlICdoJzoNCgkJCQkJCQkJbkhvdXIgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsNCgkJCQkJCQkJaSsrOw0KCQkJCQkJCQlqICs9IG5Ta2lwOw0KCQkJCQkJCQlicmVhazsNCgkJCQkJCQljYXNlICdNJzoNCgkJCQkJCQkJbk1pbiA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOw0KCQkJCQkJCQlpKys7DQoJCQkJCQkJCWogKz0gblNraXA7DQoJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCWNhc2UgJ3MnOg0KCQkJCQkJCQluU2VjID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7DQoJCQkJCQkJCWkrKzsNCgkJCQkJCQkJaiArPSBuU2tpcDsNCgkJCQkJCQkJYnJlYWs7DQoJCQkJCQkJY2FzZSAndCc6DQoJCQkJCQkJCWJQbSA9IHZhbHVlLkdldEF0KGkpID09ICdwJzsNCgkJCQkJCQkJaSsrOw0KCQkJCQkJCQlqKys7DQoJCQkJCQkJCWJyZWFrOw0KCQkJCQkJfQkJCQkJDQoJCQkJCX0NCgkJCQkJZWxzZSBpZiAoZm9ybWF0LkdldEF0KGkrMSkgPT0gYyAmJiBmb3JtYXQuR2V0QXQoaSsyKSAhPSBjKQ0KCQkJCQl7DQoJCQkJCQlzd2l0Y2ggKGMpDQoJCQkJCQl7DQoJCQkJCQkJY2FzZSAneSc6DQoJCQkJCQkJCW5ZZWFyID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgNCk7DQoJCQkJCQkJCWkgKz0gMjsNCgkJCQkJCQkJaiArPSBuU2tpcDsNCgkJCQkJCQkJYnJlYWs7DQoJCQkJCQkJY2FzZSAnbSc6DQoJCQkJCQkJCW5Nb250aCA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOw0KCQkJCQkJCQlpICs9IDI7DQoJCQkJCQkJCWogKz0gblNraXA7DQoJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCWNhc2UgJ2QnOg0KCQkJCQkJCQluRGF5ID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7DQoJCQkJCQkJCWkgKz0gMjsNCgkJCQkJCQkJaiArPSBuU2tpcDsNCgkJCQkJCQkJYnJlYWs7DQoJCQkJCQkJY2FzZSAnSCc6DQoJCQkJCQkJCW5Ib3VyID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7DQoJCQkJCQkJCWkgKz0gMjsNCgkJCQkJCQkJaiArPSBuU2tpcDsNCgkJCQkJCQkJYnJlYWs7DQoJCQkJCQkJY2FzZSAnaCc6DQoJCQkJCQkJCW5Ib3VyID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7DQoJCQkJCQkJCWkgKz0gMjsNCgkJCQkJCQkJaiArPSBuU2tpcDsNCgkJCQkJCQkJYnJlYWs7DQoJCQkJCQkJY2FzZSAnTSc6DQoJCQkJCQkJCW5NaW4gPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsNCgkJCQkJCQkJaSArPSAyOw0KCQkJCQkJCQlqICs9IG5Ta2lwOw0KCQkJCQkJCQlicmVhazsNCgkJCQkJCQljYXNlICdzJzoNCgkJCQkJCQkJblNlYyA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOw0KCQkJCQkJCQlpICs9IDI7DQoJCQkJCQkJCWogKz0gblNraXA7DQoJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCWNhc2UgJ3QnOg0KCQkJCQkJCQliUG0gPSAodmFsdWUuR2V0QXQoaikgPT0gJ3AnICYmIHZhbHVlLkdldEF0KGorMSkgPT0gJ20nKTsNCgkJCQkJCQkJaSArPSAyOw0KCQkJCQkJCQlqICs9IDI7DQoJCQkJCQkJCWJyZWFrOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJCWVsc2UgaWYgKGZvcm1hdC5HZXRBdChpKzEpID09IGMgJiYgZm9ybWF0LkdldEF0KGkrMikgPT0gYyAmJiBmb3JtYXQuR2V0QXQoaSszKSAhPSBjKQ0KCQkJCQl7DQoJCQkJCQlzd2l0Y2ggKGMpDQoJCQkJCQl7DQoJCQkJCQkJY2FzZSAnbSc6DQoJCQkJCQkJCXsNCgkJCQkJCQkJCUNGWF9XaWRlU3RyaW5nIHNNb250aCA9IFBhcnNlU3RyaW5nU3RyaW5nKHZhbHVlLCBqLCBuU2tpcCk7DQoJCQkJCQkJCQlGWF9CT09MIGJGaW5kID0gRkFMU0U7DQoJCQkJCQkJCQlmb3IgKGludCBtID0gMDsgbSA8IDEyOyBtKyspDQoJCQkJCQkJCQl7DQoJCQkJCQkJCQkJaWYgKHNNb250aC5Db21wYXJlTm9DYXNlKG1vbnRoc1ttXSkgPT0gMCkNCgkJCQkJCQkJCQl7DQoJCQkJCQkJCQkJCW5Nb250aCA9IG0gKyAxOw0KCQkJCQkJCQkJCQlpKz0zOw0KCQkJCQkJCQkJCQlqKz1uU2tpcDsNCgkJCQkJCQkJCQkJYkZpbmQgPSBUUlVFOw0KCQkJCQkJCQkJCQlicmVhazsNCgkJCQkJCQkJCQl9DQoJCQkJCQkJCQl9DQoJCQkJCQkJCQkNCgkJCQkJCQkJCWlmICghYkZpbmQpDQoJCQkJCQkJCQl7DQoJCQkJCQkJCQkJbk1vbnRoID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMyk7DQoJCQkJCQkJCQkJaSs9MzsNCgkJCQkJCQkJCQlqICs9IG5Ta2lwOw0KCQkJCQkJCQkJfQ0KCQkJCQkJCQl9DQoJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCWNhc2UgJ3knOg0KCQkJCQkJCQlicmVhazsNCgkJCQkJCQlkZWZhdWx0Og0KCQkJCQkJCQlpKz0zOw0KCQkJCQkJCQlqKz0zOw0KCQkJCQkJCQlicmVhazsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCQllbHNlIGlmIChmb3JtYXQuR2V0QXQoaSsxKSA9PSBjICYmIGZvcm1hdC5HZXRBdChpKzIpID09IGMgJiYgZm9ybWF0LkdldEF0KGkrMykgPT0gYyAmJiBmb3JtYXQuR2V0QXQoaSs0KSAhPSBjKQ0KCQkJCQl7DQoJCQkJCQlzd2l0Y2ggKGMpDQoJCQkJCQl7DQoNCg0KCQkJCQkJCWNhc2UgJ3knOg0KCQkJCQkJCQluWWVhciA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDQpOw0KCQkJCQkJCQlqICs9IG5Ta2lwOw0KCQkJCQkJCQlpICs9IDQ7DQoJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCWNhc2UgJ20nOg0KCQkJCQkJCQl7DQoJCQkJCQkJCQlGWF9CT09MIGJGaW5kID0gRkFMU0U7DQoNCgkJCQkJCQkJCUNGWF9XaWRlU3RyaW5nIHNNb250aCA9IFBhcnNlU3RyaW5nU3RyaW5nKHZhbHVlLCBqLCBuU2tpcCk7DQoJCQkJCQkJCQlzTW9udGguTWFrZUxvd2VyKCk7DQoNCgkJCQkJCQkJCWZvciAoaW50IG0gPSAwOyBtIDwgMTI7IG0rKykNCgkJCQkJCQkJCXsNCgkJCQkJCQkJCQlDRlhfV2lkZVN0cmluZyBzRnVsbE1vbnRocyA9IGZ1bGxtb250aHNbbV07DQoJCQkJCQkJCQkJc0Z1bGxNb250aHMuTWFrZUxvd2VyKCk7DQoNCgkJCQkJCQkJCQlpZiAoc0Z1bGxNb250aHMuRmluZChzTW9udGgsIDApICE9IC0xKQ0KCQkJCQkJCQkJCXsNCgkJCQkJCQkJCQkJbk1vbnRoID0gbSArIDE7DQoJCQkJCQkJCQkJCWkgKz0gNDsNCgkJCQkJCQkJCQkJaiArPSBuU2tpcDsNCgkJCQkJCQkJCQkJYkZpbmQgPSBUUlVFOw0KCQkJCQkJCQkJCQlicmVhazsNCgkJCQkJCQkJCQl9DQoJCQkJCQkJCQl9DQoJCQkJCQkJCQkNCgkJCQkJCQkJCWlmICghYkZpbmQpDQoJCQkJCQkJCQl7DQoJCQkJCQkJCQkJbk1vbnRoID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgNCk7DQoJCQkJCQkJCQkJaSs9NDsNCgkJCQkJCQkJCQlqICs9IG5Ta2lwOw0KCQkJCQkJCQkJfQ0KCQkJCQkJCQl9DQoJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCWRlZmF1bHQ6DQoJCQkJCQkJCWkgKz0gNDsNCgkJCQkJCQkJaiArPSA0Ow0KCQkJCQkJCQlicmVhazsNCgkJCQkJCX0JCQkJCQ0KCQkJCQl9DQoJCQkJCWVsc2UNCgkJCQkJew0KCQkJCQkJaWYgKGZvcm1hdC5HZXRBdChpKSAhPSB2YWx1ZS5HZXRBdChqKSkNCgkJCQkJCXsNCgkJCQkJCQliV3JvbmdGb3JtYXQgPSBUUlVFOw0KCQkJCQkJCWJFeGl0ID0gVFJVRTsNCgkJCQkJCX0NCgkJCQkJCWkrKzsNCgkJCQkJCWorKzsNCgkJCQkJfQ0KCQkJCQkNCgkJCQkJaWYgKG9sZGogPT0gaikNCgkJCQkJew0KCQkJCQkJYldyb25nRm9ybWF0ID0gVFJVRTsNCgkJCQkJCWJFeGl0ID0gVFJVRTsNCgkJCQkJfQ0KCQkJCX0NCg0KCQkJCWJyZWFrOwkJCQ0KCQkJZGVmYXVsdDoNCgkJCQlpZiAodmFsdWUuR2V0TGVuZ3RoKCkgPD0gaikNCgkJCQl7DQoJCQkJCWJFeGl0ID0gVFJVRTsNCgkJCQl9DQoJCQkJZWxzZSBpZiAoZm9ybWF0LkdldEF0KGkpICE9IHZhbHVlLkdldEF0KGopKQ0KCQkJCXsNCgkJCQkJYldyb25nRm9ybWF0ID0gVFJVRTsNCgkJCQkJYkV4aXQgPSBUUlVFOw0KCQkJCX0NCg0KCQkJCWkrKzsNCgkJCQlqKys7DQoJCQkJYnJlYWs7DQoJCX0JCQ0KCX0NCg0KCWlmIChiUG0pIG5Ib3VyICs9IDEyOw0KDQoJaWYgKG5ZZWFyID49IDAgJiYgblllYXIgPD0gblllYXJTdWIpDQoJCW5ZZWFyICs9IDIwMDA7DQoNCglpZiAobk1vbnRoIDwgMSB8fCBuTW9udGggPiAxMikNCgkJYldyb25nRm9ybWF0ID0gVFJVRTsNCg0KCWlmIChuRGF5IDwgMSB8fCBuRGF5ID4gMzEpDQoJCWJXcm9uZ0Zvcm1hdCA9IFRSVUU7DQoNCglpZiAobkhvdXIgPCAwIHx8IG5Ib3VyID4gMjQpDQoJCWJXcm9uZ0Zvcm1hdCA9IFRSVUU7DQoNCglpZiAobk1pbiA8IDAgfHwgbk1pbiA+IDYwKQ0KCQliV3JvbmdGb3JtYXQgPSBUUlVFOw0KDQoJaWYgKG5TZWMgPCAwIHx8IG5TZWMgPiA2MCkNCgkJYldyb25nRm9ybWF0ID0gVFJVRTsNCg0KCWRvdWJsZSBkUmV0ID0gMDsNCg0KCWlmIChiV3JvbmdGb3JtYXQpDQoJew0KCQlkUmV0ID0gUGFyc2VOb3JtYWxEYXRlKHZhbHVlLCBiV3JvbmdGb3JtYXQpOw0KCX0NCgllbHNlDQoJew0KCQlkUmV0ID0gSlNfTWFrZURhdGUoSlNfTWFrZURheShuWWVhcixuTW9udGggLSAxLG5EYXkpLEpTX01ha2VUaW1lKG5Ib3VyLCBuTWluLCBuU2VjLCAwKSk7DQoNCgkJaWYgKEpTX1BvcnRJc05hbihkUmV0KSkNCgkJew0KCQkJZFJldCA9IEpTX0RhdGVQYXJzZSh2YWx1ZSk7DQoJCX0NCgl9DQoNCglpZiAoSlNfUG9ydElzTmFuKGRSZXQpKQ0KCXsNCgkJZFJldCA9IFBhcnNlTm9ybWFsRGF0ZSh2YWx1ZSwgYldyb25nRm9ybWF0KTsNCgl9DQoNCglyZXR1cm4gZFJldDsNCg0KfQ0KDQpDRlhfV2lkZVN0cmluZyBDSlNfUHVibGljTWV0aG9kczo6TWFrZUZvcm1hdERhdGUoZG91YmxlIGREYXRlLCBjb25zdCBDRlhfV2lkZVN0cmluZyAmIGZvcm1hdCkNCnsNCglDRlhfV2lkZVN0cmluZyBzUmV0ID0gTCIiLHNQYXJ0ID0gTCIiOw0KDQoJaW50IG5ZZWFyID0gSlNfR2V0WWVhckZyb21UaW1lKGREYXRlKTsNCglpbnQgbk1vbnRoID0gSlNfR2V0TW9udGhGcm9tVGltZShkRGF0ZSkgKyAxOw0KCWludCBuRGF5ID0gSlNfR2V0RGF5RnJvbVRpbWUoZERhdGUpOw0KCWludCBuSG91ciA9IEpTX0dldEhvdXJGcm9tVGltZShkRGF0ZSk7DQoJaW50IG5NaW4gPSBKU19HZXRNaW5Gcm9tVGltZShkRGF0ZSk7DQoJaW50IG5TZWMgPSBKU19HZXRTZWNGcm9tVGltZShkRGF0ZSk7DQoNCglpbnQgaSA9IDA7DQoJRlhfV0NIQVIgYzsNCgl3aGlsZSAoaSA8IGZvcm1hdC5HZXRMZW5ndGgoKSkNCgl7DQoJCWMgPSBmb3JtYXQuR2V0QXQoaSk7DQoJCXNQYXJ0ID0gTCIiOw0KCQlzd2l0Y2ggKGMpDQoJCXsNCgkJCWNhc2UgJ3knOg0KCQkJY2FzZSAnbSc6DQoJCQljYXNlICdkJzoNCgkJCWNhc2UgJ0gnOg0KCQkJY2FzZSAnaCc6DQoJCQljYXNlICdNJzoNCgkJCWNhc2UgJ3MnOg0KCQkJY2FzZSAndCc6DQoJCQkJaWYgKGZvcm1hdC5HZXRBdChpKzEpICE9IGMpDQoJCQkJew0KCQkJCQlzd2l0Y2ggKGMpDQoJCQkJCXsNCgkJCQkJCWNhc2UgJ3knOg0KCQkJCQkJCXNQYXJ0ICs9IGM7DQoJCQkJCQkJYnJlYWs7DQoJCQkJCQljYXNlICdtJzoNCgkJCQkJCQlzUGFydC5Gb3JtYXQoKEZYX0xQQ1dTVFIpTCIlZCIsbk1vbnRoKTsNCgkJCQkJCQlicmVhazsNCgkJCQkJCWNhc2UgJ2QnOg0KCQkJCQkJCXNQYXJ0LkZvcm1hdCgoRlhfTFBDV1NUUilMIiVkIixuRGF5KTsNCgkJCQkJCQlicmVhazsNCgkJCQkJCWNhc2UgJ0gnOg0KCQkJCQkJCXNQYXJ0LkZvcm1hdCgoRlhfTFBDV1NUUilMIiVkIixuSG91cik7DQoJCQkJCQkJYnJlYWs7DQoJCQkJCQljYXNlICdoJzoNCgkJCQkJCQlzUGFydC5Gb3JtYXQoKEZYX0xQQ1dTVFIpTCIlZCIsbkhvdXI+MTI/bkhvdXIgLSAxMjpuSG91cik7DQoJCQkJCQkJYnJlYWs7DQoJCQkJCQljYXNlICdNJzoNCgkJCQkJCQlzUGFydC5Gb3JtYXQoKEZYX0xQQ1dTVFIpTCIlZCIsbk1pbik7DQoJCQkJCQkJYnJlYWs7DQoJCQkJCQljYXNlICdzJzoNCgkJCQkJCQlzUGFydC5Gb3JtYXQoKEZYX0xQQ1dTVFIpTCIlZCIsblNlYyk7DQoJCQkJCQkJYnJlYWs7DQoJCQkJCQljYXNlICd0JzoJCQkJDQoJCQkJCQkJc1BhcnQgKz0gbkhvdXI+MTI/J3AnOidhJzsNCgkJCQkJCQlicmVhazsNCgkJCQkJfQkJCQkJDQoJCQkJCWkrKzsNCgkJCQl9DQoJCQkJZWxzZSBpZiAoZm9ybWF0LkdldEF0KGkrMSkgPT0gYyAmJiBmb3JtYXQuR2V0QXQoaSsyKSAhPSBjKQ0KCQkJCXsNCgkJCQkJc3dpdGNoIChjKQ0KCQkJCQl7DQoJCQkJCQljYXNlICd5JzoNCgkJCQkJCQlzUGFydC5Gb3JtYXQoKEZYX0xQQ1dTVFIpTCIlMDJkIixuWWVhciAtIChuWWVhciAvIDEwMCkgKiAxMDApOw0KCQkJCQkJCWJyZWFrOw0KCQkJCQkJY2FzZSAnbSc6DQoJCQkJCQkJc1BhcnQuRm9ybWF0KChGWF9MUENXU1RSKUwiJTAyZCIsbk1vbnRoKTsNCgkJCQkJCQlicmVhazsNCgkJCQkJCWNhc2UgJ2QnOg0KCQkJCQkJCXNQYXJ0LkZvcm1hdCgoRlhfTFBDV1NUUilMIiUwMmQiLG5EYXkpOw0KCQkJCQkJCWJyZWFrOw0KCQkJCQkJY2FzZSAnSCc6DQoJCQkJCQkJc1BhcnQuRm9ybWF0KChGWF9MUENXU1RSKUwiJTAyZCIsbkhvdXIpOw0KCQkJCQkJCWJyZWFrOw0KCQkJCQkJY2FzZSAnaCc6DQoJCQkJCQkJc1BhcnQuRm9ybWF0KChGWF9MUENXU1RSKUwiJTAyZCIsbkhvdXI+MTI/bkhvdXIgLSAxMjpuSG91cik7DQoJCQkJCQkJYnJlYWs7DQoJCQkJCQljYXNlICdNJzoNCgkJCQkJCQlzUGFydC5Gb3JtYXQoKEZYX0xQQ1dTVFIpTCIlMDJkIixuTWluKTsNCgkJCQkJCQlicmVhazsNCgkJCQkJCWNhc2UgJ3MnOg0KCQkJCQkJCXNQYXJ0LkZvcm1hdCgoRlhfTFBDV1NUUilMIiUwMmQiLG5TZWMpOw0KCQkJCQkJCWJyZWFrOw0KCQkJCQkJY2FzZSAndCc6CQkJCQkJCQ0KCQkJCQkJCXNQYXJ0ID0gbkhvdXI+MTI/IChGWF9MUENXU1RSKUwicG0iOiAoRlhfTFBDV1NUUilMImFtIjsNCgkJCQkJCQlicmVhazsNCgkJCQkJfQkJCQ0KCQkJCQlpKz0yOw0KCQkJCX0NCgkJCQllbHNlIGlmIChmb3JtYXQuR2V0QXQoaSsxKSA9PSBjICYmIGZvcm1hdC5HZXRBdChpKzIpID09IGMgJiYgZm9ybWF0LkdldEF0KGkrMykgIT0gYykNCgkJCQl7CQkNCgkJCQkJc3dpdGNoIChjKQ0KCQkJCQl7DQoJCQkJCQljYXNlICdtJzoNCgkJCQkJCQlpKz0zOw0KCQkJCQkJCWlmIChuTW9udGggPiAwJiZuTW9udGggPD0gMTIpDQoJCQkJCQkJCXNQYXJ0ICs9IG1vbnRoc1tuTW9udGggLSAxXTsNCgkJCQkJCQlicmVhazsNCgkJCQkJCWRlZmF1bHQ6DQoJCQkJCQkJaSs9MzsNCgkJCQkJCQlzUGFydCArPSBjOw0KCQkJCQkJCXNQYXJ0ICs9IGM7DQoJCQkJCQkJc1BhcnQgKz0gYzsNCgkJCQkJCQlicmVhazsNCgkJCQkJfQkJCQkJDQoJCQkJfQ0KCQkJCWVsc2UgaWYgKGZvcm1hdC5HZXRBdChpKzEpID09IGMgJiYgZm9ybWF0LkdldEF0KGkrMikgPT0gYyAmJiBmb3JtYXQuR2V0QXQoaSszKSA9PSBjICYmIGZvcm1hdC5HZXRBdChpKzQpICE9IGMpDQoJCQkJew0KCQkJCQlzd2l0Y2ggKGMpDQoJCQkJCXsNCgkJCQkJCWNhc2UgJ3knOg0KCQkJCQkJCXNQYXJ0LkZvcm1hdCgoRlhfTFBDV1NUUilMIiUwNGQiLG5ZZWFyKTsNCgkJCQkJCQlpICs9IDQ7DQoJCQkJCQkJYnJlYWs7CQ0KCQkJCQkJY2FzZSAnbSc6DQoJCQkJCQkJaSs9NDsNCgkJCQkJCQlpZiAobk1vbnRoID4gMCYmbk1vbnRoIDw9IDEyKQ0KCQkJCQkJCQlzUGFydCArPSBmdWxsbW9udGhzW25Nb250aCAtIDFdOw0KCQkJCQkJCWJyZWFrOw0KCQkJCQkJZGVmYXVsdDoNCgkJCQkJCQlpICs9IDQ7DQoJCQkJCQkJc1BhcnQgKz0gYzsNCgkJCQkJCQlzUGFydCArPSBjOw0KCQkJCQkJCXNQYXJ0ICs9IGM7DQoJCQkJCQkJc1BhcnQgKz0gYzsNCgkJCQkJCQlicmVhazsNCgkJCQkJfQkJCQkJDQoJCQkJfQ0KCQkJCWVsc2UNCgkJCQl7DQoJCQkJCWkrKzsNCgkJCQkJc1BhcnQgKz0gYzsNCgkJCQl9DQoJCQkJYnJlYWs7CQkJDQoJCQlkZWZhdWx0Og0KCQkJCWkrKzsNCgkJCQlzUGFydCArPSBjOw0KCQkJCWJyZWFrOw0KCQl9DQoJCQ0KCQlzUmV0ICs9IHNQYXJ0Ow0KCX0NCg0KCXJldHVybiBzUmV0Ow0KfQ0KDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KDQovL2Z1bmN0aW9uIEFGTnVtYmVyX0Zvcm1hdChuRGVjLCBzZXBTdHlsZSwgbmVnU3R5bGUsIGN1cnJTdHlsZSwgc3RyQ3VycmVuY3ksIGJDdXJyZW5jeVByZXBlbmQpDQpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRk51bWJlcl9Gb3JtYXQoT0JKX01FVEhPRF9QQVJBTVMpDQp7DQojaWYgX0ZYX09TXyAhPSBfRlhfQU5EUk9JRF8NCgl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7DQoJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7DQoJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOw0KCUNKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsNCglBU1NFUlQocEV2ZW50ICE9IE5VTEwpOw0KDQoJaWYgKHBhcmFtcy5zaXplKCkgIT0gNikNCgl7DQoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7DQoJCXJldHVybiBGQUxTRTsNCgl9DQoJaWYoIXBFdmVudC0+bV9wVmFsdWUpDQoJCXJldHVybiBGQUxTRTsNCglDRlhfV2lkZVN0cmluZyYgVmFsdWUgPSBwRXZlbnQtPlZhbHVlKCk7CQ0KCUNGWF9CeXRlU3RyaW5nIHN0clZhbHVlID0gU3RyVHJpbShDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoVmFsdWUpKTsNCgkNCglpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKSByZXR1cm4gVFJVRTsNCgkNCglpbnQgaURlYyA9IHBhcmFtc1swXTsNCglpbnQgaVNlcFN0eWxlID0gcGFyYW1zWzFdOw0KCWludCBpTmVnU3R5bGUgPSBwYXJhbXNbMl07DQoJaW50IGljdXJyU3R5bGUgPSBwYXJhbXNbM107IC8vaXQncyBubyB1c2UhDQoJc3RkOjp3c3RyaW5nIHdzdHJDdXJyZW5jeShwYXJhbXNbNF0ub3BlcmF0b3IgQ0ZYX1dpZGVTdHJpbmcoKSk7DQoJRlhfQk9PTCBiQ3VycmVuY3lQcmVwZW5kID0gcGFyYW1zWzVdOw0KCQ0KCWlmIChpRGVjIDwgMCkgaURlYyA9IC1pRGVjOw0KCQ0KCWlmIChpU2VwU3R5bGUgPCAwIHx8IGlTZXBTdHlsZSA+IDMpDQoJCWlTZXBTdHlsZSA9IDA7DQoJDQoJaWYgKGlOZWdTdHlsZSA8IDAgfHwgaU5lZ1N0eWxlID4gMykNCgkJaU5lZ1N0eWxlID0gMDsNCgkNCgkNCgkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCgkvL2ZvciBwcm9jZXNzaW5nIGRlY2ltYWwgcGxhY2VzDQoJc3RyVmFsdWUuUmVwbGFjZSgiLCIsICIuIik7DQoJZG91YmxlIGRWYWx1ZSA9IGF0b2Yoc3RyVmFsdWUpOw0KCWlmIChpRGVjID4gMCkNCgkJZFZhbHVlICs9IERPVUJMRV9DT1JSRUNUOy8vDQoJCSAgICANCglpbnQgaURlYzI7DQoJRlhfQk9PTCBiTmFnYXRpdmUgPSBGQUxTRTsNCg0KCXN0clZhbHVlID0gZmN2dChkVmFsdWUsaURlYywmaURlYzIsJmJOYWdhdGl2ZSk7DQoJaWYgKHN0clZhbHVlLklzRW1wdHkoKSkNCgl7DQoJCWRWYWx1ZSA9IDA7DQoJCXN0clZhbHVlID0gZmN2dChkVmFsdWUsaURlYywmaURlYzIsJmJOYWdhdGl2ZSk7DQoJCWlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpDQoJCXsNCgkJCXN0clZhbHVlID0gIjAiOw0KCQkJaURlYzIgPSAxOw0KCQl9DQoNCgl9DQoNCglpZiAoaURlYzIgPCAwKQ0KCXsNCgkJZm9yIChpbnQgaU51bSA9IDA7aU51bSA8IGFicyhpRGVjMik7aU51bSsrKQ0KCQl7DQoJCQlzdHJWYWx1ZSA9ICIwIiArIHN0clZhbHVlOw0KCQl9DQoJCWlEZWMyID0gMDsNCgkJDQoJfQ0KCWludCBpTWF4ID0gc3RyVmFsdWUuR2V0TGVuZ3RoKCk7DQoJaWYgKGlEZWMyID4gaU1heCkNCgl7DQoJCWZvciAoaW50IGlOdW0gPSAwO2lOdW0gPD0gaURlYzIgLSBpTWF4IDtpTnVtKyspDQoJCXsNCgkJCXN0clZhbHVlICs9ICIwIjsNCgkJfQ0KCQlpTWF4ID0gaURlYzIrMTsJCQkNCgl9DQoJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KICAgIC8vZm9yIHByb2Nlc3Npbmcgc2VwZXJhdG9yIHN0eWxlDQoJaWYgKGlEZWMyIDwgaU1heCkNCgl7DQoJCWlmIChpU2VwU3R5bGUgPT0gMCB8fCBpU2VwU3R5bGUgPT0gMSkNCgkJew0KCQkJc3RyVmFsdWUuSW5zZXJ0KGlEZWMyLCAnLicpOw0KCQkJaU1heCsrOw0KCQl9DQoJCWVsc2UgaWYgKGlTZXBTdHlsZSA9PSAyIHx8IGlTZXBTdHlsZSA9PSAzKQ0KCQl7DQoJCQlzdHJWYWx1ZS5JbnNlcnQoaURlYzIsICcsJyk7DQoJCQlpTWF4Kys7DQoJCX0NCgkJDQoJCWlmIChpRGVjMiA9PSAwKQ0KCQkJc3RyVmFsdWUuSW5zZXJ0KGlEZWMyLCAnMCcpOw0KCX0NCglpZiAoaVNlcFN0eWxlID09IDAgfHwgaVNlcFN0eWxlID09IDIpDQoJew0KCQljaGFyIGNTZXBlcmF0b3I7DQoJCWlmIChpU2VwU3R5bGUgPT0gMCkNCgkJCWNTZXBlcmF0b3IgPSAnLCc7DQoJCWVsc2UNCgkJCWNTZXBlcmF0b3IgPSAnLic7DQoJCQ0KCQlpbnQgaURlY1Bvc2l0aXZlLGlEZWNOYWdhdGl2ZTsNCgkJaURlY1Bvc2l0aXZlID0gaURlYzI7DQoJCWlEZWNOYWdhdGl2ZSA9IGlEZWMyOwkJDQoJCQ0KCQlmb3IgKGlEZWNQb3NpdGl2ZSA9IGlEZWMyIC0zOyBpRGVjUG9zaXRpdmUgPiAwO2lEZWNQb3NpdGl2ZSAtPSAzKQ0KCQl7DQoJCQlzdHJWYWx1ZS5JbnNlcnQoaURlY1Bvc2l0aXZlLCBjU2VwZXJhdG9yKTsNCgkJCWlNYXgrKzsNCgkJfQ0KCX0NCgkNCgkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQogICAgLy9mb3IgcHJvY2Vzc2luZyBjdXJyZW5jeSBzdHJpbmcNCg0KCVZhbHVlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChzdHJWYWx1ZSk7DQoJDQoJc3RkOjp3c3RyaW5nIHN0clZhbHVlMihWYWx1ZSk7DQoNCglpZiAoYkN1cnJlbmN5UHJlcGVuZCkNCgkJc3RyVmFsdWUyID0gd3N0ckN1cnJlbmN5ICsgc3RyVmFsdWUyOw0KCWVsc2UNCgkJc3RyVmFsdWUyID0gc3RyVmFsdWUyICsgd3N0ckN1cnJlbmN5Ow0KCQ0KCQ0KCQ0KCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCgkvL2ZvciBwcm9jZXNzaW5nIG5lZ2F0aXZlIHN0eWxlDQoJaWYgKGJOYWdhdGl2ZSkNCgl7DQoJCWlmIChpTmVnU3R5bGUgPT0gMCkNCgkJew0KCQkJc3RyVmFsdWUyLmluc2VydCgwLEwiLSIpOw0KCQl9DQoJCWlmIChpTmVnU3R5bGUgPT0gMiB8fCBpTmVnU3R5bGUgPT0gMykNCgkJew0KCQkJc3RyVmFsdWUyLmluc2VydCgwLEwiKCIpOw0KCQkJc3RyVmFsdWUyLmluc2VydChzdHJWYWx1ZTIubGVuZ3RoKCksTCIpIik7DQoJCX0NCgkJaWYgKGlOZWdTdHlsZSA9PSAxIHx8IGlOZWdTdHlsZSA9PSAzKQ0KCQl7DQoJCQlpZiAoRmllbGQgKiBmVGFyZ2V0ID0gcEV2ZW50LT5UYXJnZXRfRmllbGQoKSkNCgkJCXsNCgkJCQlDSlNfQXJyYXkgYXJDb2xvcihpc29sYXRlKTsNCgkJCQlDSlNfVmFsdWUgdkNvbEVsbShpc29sYXRlKTsNCgkJCQl2Q29sRWxtID0gTCJSR0IiOw0KCQkJCWFyQ29sb3IuU2V0RWxlbWVudCgwLHZDb2xFbG0pOw0KCQkJCXZDb2xFbG0gPSAxOw0KCQkJCWFyQ29sb3IuU2V0RWxlbWVudCgxLHZDb2xFbG0pOw0KCQkJCXZDb2xFbG0gPSAwOw0KCQkJCWFyQ29sb3IuU2V0RWxlbWVudCgyLHZDb2xFbG0pOw0KCQkJCQ0KCQkJCWFyQ29sb3IuU2V0RWxlbWVudCgzLHZDb2xFbG0pOw0KCQkJCQ0KCQkJCUNKU19Qcm9wVmFsdWUgdlByb3AoaXNvbGF0ZSk7DQoJCQkJdlByb3AuU3RhcnRHZXR0aW5nKCk7DQoJCQkJdlByb3A8PGFyQ29sb3I7DQoJCQkJdlByb3AuU3RhcnRTZXR0aW5nKCk7DQoJCQkJZlRhcmdldC0+dGV4dENvbG9yKGNjLHZQcm9wLHNFcnJvcik7Ly8gcmVkDQoJCQl9DQoJCX0NCgl9DQoJZWxzZQ0KCXsNCgkJaWYgKGlOZWdTdHlsZSA9PSAxIHx8IGlOZWdTdHlsZSA9PSAzKQ0KCQl7DQoJCQlpZiAoRmllbGQgKmZUYXJnZXQgPSBwRXZlbnQtPlRhcmdldF9GaWVsZCgpKQ0KCQkJew0KCQkJCUNKU19BcnJheSBhckNvbG9yKGlzb2xhdGUpOw0KCQkJCUNKU19WYWx1ZSB2Q29sRWxtKGlzb2xhdGUpOw0KCQkJCXZDb2xFbG0gPSBMIlJHQiI7DQoJCQkJYXJDb2xvci5TZXRFbGVtZW50KDAsdkNvbEVsbSk7DQoJCQkJdkNvbEVsbSA9IDA7DQoJCQkJYXJDb2xvci5TZXRFbGVtZW50KDEsdkNvbEVsbSk7DQoJCQkJYXJDb2xvci5TZXRFbGVtZW50KDIsdkNvbEVsbSk7DQoJCQkJYXJDb2xvci5TZXRFbGVtZW50KDMsdkNvbEVsbSk7DQoJCQkJDQoJCQkJQ0pTX1Byb3BWYWx1ZSB2UHJvcChpc29sYXRlKTsNCgkJCQl2UHJvcC5TdGFydEdldHRpbmcoKTsNCgkJCQlmVGFyZ2V0LT50ZXh0Q29sb3IoY2MsdlByb3Asc0Vycm9yKTsNCgkJCQkNCgkJCQlDSlNfQXJyYXkgYVByb3AoaXNvbGF0ZSk7DQoJCQkJdlByb3AuQ29udmVydFRvQXJyYXkoYVByb3ApOw0KDQoJCQkJQ1BXTF9Db2xvciBjclByb3A7DQoJCQkJQ1BXTF9Db2xvciBjckNvbG9yOw0KCQkJCWNvbG9yOjpDb252ZXJ0QXJyYXlUb1BXTENvbG9yKGFQcm9wLCBjclByb3ApOw0KCQkJCWNvbG9yOjpDb252ZXJ0QXJyYXlUb1BXTENvbG9yKGFyQ29sb3IsIGNyQ29sb3IpOw0KDQoJCQkJaWYgKGNyQ29sb3IgIT0gY3JQcm9wKQ0KCQkJCXsNCgkJCQkJQ0pTX1Byb3BWYWx1ZSB2UHJvcDIoaXNvbGF0ZSk7DQoJCQkJCXZQcm9wMi5TdGFydEdldHRpbmcoKTsNCgkJCQkJdlByb3AyPDxhckNvbG9yOw0KCQkJCQl2UHJvcDIuU3RhcnRTZXR0aW5nKCk7DQogICAgIAkJCQlmVGFyZ2V0LT50ZXh0Q29sb3IoY2MsdlByb3AyLHNFcnJvcik7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfQ0KCVZhbHVlID0gc3RyVmFsdWUyLmNfc3RyKCk7DQojZW5kaWYNCglyZXR1cm4gVFJVRTsNCn0NCg0KLy9mdW5jdGlvbiBBRk51bWJlcl9LZXlzdHJva2UobkRlYywgc2VwU3R5bGUsIG5lZ1N0eWxlLCBjdXJyU3R5bGUsIHN0ckN1cnJlbmN5LCBiQ3VycmVuY3lQcmVwZW5kKQ0KRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZOdW1iZXJfS2V5c3Ryb2tlKE9CSl9NRVRIT0RfUEFSQU1TKQ0Kew0KCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOw0KCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsNCglDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7DQoJQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsNCgkNCglpZihwYXJhbXMuc2l6ZSgpIDwgMikNCgkJcmV0dXJuIEZBTFNFOw0KCWludCBpU2VwU3R5bGUgPSBwYXJhbXNbMV07DQoJDQoJaWYgKGlTZXBTdHlsZSA8IDAgfHwgaVNlcFN0eWxlID4gMykNCgkJaVNlcFN0eWxlID0gMDsNCglpZighcEV2ZW50LT5tX3BWYWx1ZSkNCgkJcmV0dXJuIEZBTFNFOw0KCUNGWF9XaWRlU3RyaW5nICYgdmFsID0gcEV2ZW50LT5WYWx1ZSgpOwkNCglDRlhfV2lkZVN0cmluZyAmIHdfc3RyQ2hhbmdlID0gcEV2ZW50LT5DaGFuZ2UoKTsNCiAgICBDRlhfV2lkZVN0cmluZyB3X3N0clZhbHVlID0gdmFsOw0KDQoJaWYgKHBFdmVudC0+V2lsbENvbW1pdCgpKQ0KCXsNCgkJQ0ZYX1dpZGVTdHJpbmcgd3N0ckNoYW5nZSA9IHdfc3RyQ2hhbmdlOw0KCQlDRlhfV2lkZVN0cmluZyB3c3RyVmFsdWUgPSBTdHJMVHJpbSh3X3N0clZhbHVlKTsNCgkJaWYgKHdzdHJWYWx1ZS5Jc0VtcHR5KCkpDQoJCQlyZXR1cm4gVFJVRTsNCgkJDQoJCUNGWF9XaWRlU3RyaW5nIHN3VGVtcCA9IHdzdHJWYWx1ZTsNCgkJc3dUZW1wLlJlcGxhY2UoKEZYX0xQQ1dTVFIpTCIsIiwgKEZYX0xQQ1dTVFIpTCIuIik7DQoJCWlmICghSXNOdW1iZXIoc3dUZW1wKSkgLy8hKElzTnVtYmVyKHdzdHJDaGFuZ2UpICYmIA0KCQl7DQoJCQlwRXZlbnQtPlJjKCkgPSBGQUxTRTsNCgkJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTQUZOVU1CRVJfS0VZU1RST0tFKTsNCgkJCUFsZXJ0KHBDb250ZXh0LCBzRXJyb3IpOw0KCQkJcmV0dXJuIFRSVUU7DQoJCX0NCgkJcmV0dXJuIFRSVUU7IC8vIGl0IGhhcHBlbnMgYWZ0ZXIgdGhlIGxhc3Qga2V5c3Ryb2tlIGFuZCBiZWZvcmUgdmFsaWRhdGluZywNCgl9DQoJDQoJc3RkOjp3c3RyaW5nIHdfc3RyVmFsdWUyICh3X3N0clZhbHVlKTsNCglzdGQ6OndzdHJpbmcgd19zdHJDaGFuZ2UyKHdfc3RyQ2hhbmdlKTsNCgkNCglzdGQ6OndzdHJpbmcgd19zdHJTZWxlY3RlZDsNCglpZigtMSAhPSBwRXZlbnQtPlNlbFN0YXJ0KCkpDQoJCXdfc3RyU2VsZWN0ZWQgPSB3X3N0clZhbHVlMi5zdWJzdHIocEV2ZW50LT5TZWxTdGFydCgpLChwRXZlbnQtPlNlbEVuZCgpIC0gcEV2ZW50LT5TZWxTdGFydCgpKSk7DQoJRlhfQk9PTCBiSGFzU2lnbiA9ICh3X3N0clZhbHVlMi5maW5kKCctJykgIT0gLTEpICYmICh3X3N0clNlbGVjdGVkLmZpbmQoJy0nKSA9PSAtMSk7DQoJaWYgKGJIYXNTaWduKQ0KCXsNCgkJLy9jYW4ndCBpbnNlcnQgImNoYW5nZSIgaW4gZnJvbnQgdG8gc2lnbiBwb3N0aW9uLg0KCQlpZiAocEV2ZW50LT5TZWxTdGFydCgpID09IDApDQoJCXsNCiAgICAgICAgICAgIEZYX0JPT0wgJmJSYyA9IHBFdmVudC0+UmMoKTsNCgkJCWJSYyA9IEZBTFNFOw0KCQkJcmV0dXJuIFRSVUU7DQoJCX0NCgl9DQoNCgljaGFyIGNTZXAgPSBMJy4nOw0KDQoJc3dpdGNoIChpU2VwU3R5bGUpDQoJew0KCWNhc2UgMDoNCgljYXNlIDE6DQoJCWNTZXAgPSBMJy4nOw0KCQlicmVhazsNCgljYXNlIDI6DQoJY2FzZSAzOg0KCQljU2VwID0gTCcsJzsNCgkJYnJlYWs7DQoJfQ0KCQ0KCUZYX0JPT0wgYkhhc1NlcCA9ICh3X3N0clZhbHVlMi5maW5kKGNTZXApICE9IC0xKTsNCglmb3IgKHN0ZDo6d3N0cmluZzo6aXRlcmF0b3IgaXQgPSB3X3N0ckNoYW5nZTIuYmVnaW4oKTsgaXQgIT0gd19zdHJDaGFuZ2UyLmVuZCgpOyBpdCsrKQ0KCXsNCgkJaWYgKCppdCA9PSBjU2VwKQ0KCQl7DQoJCQlpZiAoYkhhc1NlcCkNCgkJCXsNCgkJCQlGWF9CT09MICZiUmMgPSBwRXZlbnQtPlJjKCk7DQoJCQkJYlJjID0gRkFMU0U7DQoJCQkJcmV0dXJuIFRSVUU7DQoJCQl9DQoJCQllbHNlDQoJCQl7DQoJCQkJYkhhc1NlcCA9IFRSVUU7DQoJCQkJY29udGludWU7DQoJCQl9DQoJCX0NCgkJaWYgKCppdCA9PSBMJy0nKQ0KCQl7DQoJCQlpZiAoYkhhc1NpZ24pDQoJCQl7DQoJCQkJRlhfQk9PTCAmYlJjID0gcEV2ZW50LT5SYygpOw0KCQkJCWJSYyA9IEZBTFNFOw0KCQkJCXJldHVybiBUUlVFOw0KCQkJfQ0KCQkJZWxzZSBpZiAoaXQgIT0gd19zdHJDaGFuZ2UyLmJlZ2luKCkpIC8vc2lnbidzIHBvc2l0aW9uIGlzIG5vdCBjb3JyZWN0DQoJCQl7DQoJCQkJRlhfQk9PTCAmYlJjID0gcEV2ZW50LT5SYygpOw0KCQkJCWJSYyA9IEZBTFNFOw0KCQkJCXJldHVybiBUUlVFOw0KCQkJfQ0KCQkJZWxzZSBpZiAocEV2ZW50LT5TZWxTdGFydCgpICE9IDApDQoJCQl7DQoJCQkJRlhfQk9PTCAmYlJjID0gcEV2ZW50LT5SYygpOw0KCQkJCWJSYyA9IEZBTFNFOw0KCQkJCXJldHVybiBUUlVFOw0KCQkJfQ0KCQkJYkhhc1NpZ24gPSBUUlVFOw0KCQkJY29udGludWU7DQoJCX0NCgkJDQoJCWlmICghSXNEaWdpdCgqaXQpKQ0KCQl7CQkJDQoJCQlGWF9CT09MICZiUmMgPSBwRXZlbnQtPlJjKCk7DQoJCQliUmMgPSBGQUxTRTsNCgkJCXJldHVybiBUUlVFOw0KCQl9DQoJfQ0KCQ0KCQ0KCXN0ZDo6d3N0cmluZyB3X3ByZWZpeCA9IHdfc3RyVmFsdWUyLnN1YnN0cigwLHBFdmVudC0+U2VsU3RhcnQoKSk7DQoJc3RkOjp3c3RyaW5nIHdfcG9zdGZpeDsNCglpZiAocEV2ZW50LT5TZWxFbmQoKTwoaW50KXdfc3RyVmFsdWUyLmxlbmd0aCgpKQ0KCQl3X3Bvc3RmaXggID0gd19zdHJWYWx1ZTIuc3Vic3RyKHBFdmVudC0+U2VsRW5kKCkpOw0KCXdfc3RyVmFsdWUyID0gd19wcmVmaXggKyB3X3N0ckNoYW5nZTIgKyB3X3Bvc3RmaXg7DQoJd19zdHJWYWx1ZSA9IHdfc3RyVmFsdWUyLmNfc3RyKCk7DQoJdmFsID0gd19zdHJWYWx1ZTsNCglyZXR1cm4gVFJVRTsJCQ0KCQ0KfQ0KDQovL2Z1bmN0aW9uIEFGUGVyY2VudF9Gb3JtYXQobkRlYywgc2VwU3R5bGUpDQpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlBlcmNlbnRfRm9ybWF0KE9CSl9NRVRIT0RfUEFSQU1TKQ0Kew0KI2lmIF9GWF9PU18gIT0gX0ZYX0FORFJPSURfDQoJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7DQoJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOw0KCUNKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsNCglBU1NFUlQocEV2ZW50ICE9IE5VTEwpOw0KDQogICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMikNCgl7DQoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7DQoJCXJldHVybiBGQUxTRTsNCgl9DQoJaWYoIXBFdmVudC0+bV9wVmFsdWUpDQoJCXJldHVybiBGQUxTRTsNCglDRlhfV2lkZVN0cmluZyYgVmFsdWUgPSBwRXZlbnQtPlZhbHVlKCk7DQoJDQovLyAgICAgSFdORCBoTWFpbkZyYW1lID0gTlVMTDsNCi8vIAkNCi8vIAlDUERGU0RLX0Zvcm1GaWxsQXBwICpwQXBwID0gcENvbnRleHQtPkdldFJlYWRlckFwcCgpOw0KLy8gCUFTU0VSVChwQXBwKTsNCi8vIAloTWFpbkZyYW1lID0gcEFwcC0+R2V0TWFpbkZyYW1lV25kKCk7DQoJCQ0KCUNGWF9CeXRlU3RyaW5nIHN0clZhbHVlID0gU3RyVHJpbShDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoVmFsdWUpKTsNCgkNCglpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKQ0KCQlyZXR1cm4gVFJVRTsNCgkNCglpbnQgaURlYyA9IHBhcmFtc1swXTsNCglpbnQgaVNlcFN0eWxlID0gcGFyYW1zWzFdOw0KCQ0KCS8vQVNTRVJUKGlEZWMgPiAwKTsNCglpZiAoaURlYyA8IDApDQoJCWlEZWMgPSAtaURlYzsNCgkNCglpZiAoaVNlcFN0eWxlIDwgMCB8fCBpU2VwU3R5bGUgPiAzKQ0KCQlpU2VwU3R5bGUgPSAwOw0KCQ0KCQ0KCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KCS8vZm9yIHByb2Nlc3NpbmcgZGVjaW1hbCBwbGFjZXMNCglkb3VibGUgZFZhbHVlID0gYXRvZihzdHJWYWx1ZSk7DQoJZFZhbHVlICo9IDEwMDsNCglpZiAoaURlYyA+IDApDQoJCWRWYWx1ZSArPSBET1VCTEVfQ09SUkVDVDsvL9Cj1f0NCg0KCWludCBpRGVjMjsNCglGWF9CT09MIGJOYWdhdGl2ZSA9IEZBTFNFOw0KCXN0clZhbHVlID0gZmN2dChkVmFsdWUsaURlYywmaURlYzIsJmJOYWdhdGl2ZSk7DQogICAgaWYgKHN0clZhbHVlLklzRW1wdHkoKSkNCgl7DQoJCWRWYWx1ZSA9IDA7DQoJCXN0clZhbHVlID0gZmN2dChkVmFsdWUsaURlYywmaURlYzIsJmJOYWdhdGl2ZSk7DQoJfQ0KDQoJaWYgKGlEZWMyIDwgMCkNCgl7DQoJCWZvciAoaW50IGlOdW0gPSAwOyBpTnVtIDwgYWJzKGlEZWMyKTsgaU51bSsrKQ0KCQl7DQoJCQlzdHJWYWx1ZSA9ICIwIiArIHN0clZhbHVlOw0KCQl9DQoJCWlEZWMyID0gMDsNCgkJDQoJfQ0KCWludCBpTWF4ID0gc3RyVmFsdWUuR2V0TGVuZ3RoKCk7DQoJaWYgKGlEZWMyID4gaU1heCkNCgl7DQoJCWZvciAoaW50IGlOdW0gPSAwOyBpTnVtIDw9IGlEZWMyIC0gaU1heDsgaU51bSsrKQ0KCQl7DQoJCQlzdHJWYWx1ZSArPSAiMCI7DQoJCX0NCgkJaU1heCA9IGlEZWMyKzE7CQkJDQoJfQ0KCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCiAgICAvL2ZvciBwcm9jZXNzaW5nIHNlcGVyYXRvciBzdHlsZQ0KCWlmIChpRGVjMiA8IGlNYXgpDQoJew0KCQlpZiAoaVNlcFN0eWxlID09IDAgfHwgaVNlcFN0eWxlID09IDEpDQoJCXsNCgkJCXN0clZhbHVlLkluc2VydChpRGVjMiwgJy4nKTsNCgkJCWlNYXgrKzsNCgkJfQ0KCQllbHNlIGlmIChpU2VwU3R5bGUgPT0gMiB8fCBpU2VwU3R5bGUgPT0gMykNCgkJew0KCQkJc3RyVmFsdWUuSW5zZXJ0KGlEZWMyLCAnLCcpOw0KCQkJaU1heCsrOw0KCQl9DQoJCQ0KCQlpZiAoaURlYzIgPT0gMCkNCgkJCXN0clZhbHVlLkluc2VydChpRGVjMiwgJzAnKTsNCgl9DQoJaWYgKGlTZXBTdHlsZSA9PSAwIHx8IGlTZXBTdHlsZSA9PSAyKQ0KCXsNCgkJY2hhciBjU2VwZXJhdG9yOw0KCQlpZiAoaVNlcFN0eWxlID09IDApDQoJCQljU2VwZXJhdG9yID0gJywnOw0KCQllbHNlDQoJCQljU2VwZXJhdG9yID0gJy4nOw0KCQkNCgkJaW50IGlEZWNQb3NpdGl2ZSxpRGVjTmFnYXRpdmU7DQoJCWlEZWNQb3NpdGl2ZSA9IGlEZWMyOw0KCQlpRGVjTmFnYXRpdmUgPSBpRGVjMjsNCgkJCQ0KCQlmb3IgKGlEZWNQb3NpdGl2ZSA9IGlEZWMyIC0zOyBpRGVjUG9zaXRpdmUgPiAwOyBpRGVjUG9zaXRpdmUgLT0gMykNCgkJew0KCQkJc3RyVmFsdWUuSW5zZXJ0KGlEZWNQb3NpdGl2ZSxjU2VwZXJhdG9yKTsNCgkJCWlNYXgrKzsNCgkJfQ0KCX0NCgkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KCS8vbmFnYXRpdmUgbWFyaw0KCWlmKGJOYWdhdGl2ZSkNCgkJc3RyVmFsdWUgPSAiLSIgKyBzdHJWYWx1ZTsNCglzdHJWYWx1ZSArPSAiJSI7DQoJVmFsdWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHN0clZhbHVlKTsNCiNlbmRpZg0KCXJldHVybiBUUlVFOw0KfQ0KLy9BRlBlcmNlbnRfS2V5c3Ryb2tlKG5EZWMsIHNlcFN0eWxlKQ0KRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZQZXJjZW50X0tleXN0cm9rZShPQkpfTUVUSE9EX1BBUkFNUykNCnsNCglyZXR1cm4gQUZOdW1iZXJfS2V5c3Ryb2tlKGNjLHBhcmFtcyx2UmV0LHNFcnJvcik7DQp9DQoNCi8vZnVuY3Rpb24gQUZEYXRlX0Zvcm1hdEV4KGNGb3JtYXQpDQpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRkRhdGVfRm9ybWF0RXgoT0JKX01FVEhPRF9QQVJBTVMpDQp7DQoJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7DQoJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOw0KCUNKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsNCglBU1NFUlQocEV2ZW50ICE9IE5VTEwpOw0KDQoJaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkNCgl7DQoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7DQoJCXJldHVybiBGQUxTRTsNCgl9CQ0KCWlmKCFwRXZlbnQtPm1fcFZhbHVlKQ0KCQlyZXR1cm4gRkFMU0U7DQoJQ0ZYX1dpZGVTdHJpbmcmIHZhbCA9IHBFdmVudC0+VmFsdWUoKTsNCgkNCglDRlhfV2lkZVN0cmluZyBzdHJWYWx1ZSA9IHZhbDsJDQoJaWYgKHN0clZhbHVlLklzRW1wdHkoKSkgcmV0dXJuIFRSVUU7CQkNCg0KCUNGWF9XaWRlU3RyaW5nIHNGb3JtYXQgPSBwYXJhbXNbMF0ub3BlcmF0b3IgQ0ZYX1dpZGVTdHJpbmcoKTsNCg0KCUZYX0JPT0wgYldyb25nRm9ybWF0ID0gRkFMU0U7DQoJZG91YmxlIGREYXRlID0gMC4wZjsNCg0KCWlmKHN0clZhbHVlLkZpbmQoTCJHTVQiKSAhPSAtMSkNCgl7DQoJCS8vZm9yIEdNVCBmb3JtYXQgdGltZQ0KCQkvL3N1Y2ggYXMgIlR1ZSBBdWcgMTEgMTQ6MjQ6MTYgR01UKzA4MDAyMDA5Ig0KCQlkRGF0ZSA9IE1ha2VJbnRlckRhdGUoc3RyVmFsdWUpOw0KCX0NCgllbHNlDQoJew0KCQlkRGF0ZSA9IE1ha2VSZWd1bGFyRGF0ZShzdHJWYWx1ZSxzRm9ybWF0LGJXcm9uZ0Zvcm1hdCk7DQoJfQ0KDQoJaWYgKEpTX1BvcnRJc05hbihkRGF0ZSkpDQoJew0KCQlDRlhfV2lkZVN0cmluZyBzd01zZzsNCgkJc3dNc2cuRm9ybWF0KEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSU0VEQVRFKSwgKEZYX0xQQ1dTVFIpc0Zvcm1hdCk7DQoJCUFsZXJ0KHBDb250ZXh0LCBzd01zZyk7DQoJCXJldHVybiBGQUxTRTsNCgl9DQoJDQoJdmFsID0gIE1ha2VGb3JtYXREYXRlKGREYXRlLHNGb3JtYXQpOw0KDQoJcmV0dXJuIFRSVUU7DQp9DQoNCmRvdWJsZSBDSlNfUHVibGljTWV0aG9kczo6TWFrZUludGVyRGF0ZShDRlhfV2lkZVN0cmluZyBzdHJWYWx1ZSkNCnsNCglpbnQgbkhvdXI7DQoJaW50IG5NaW47DQoJaW50IG5TZWM7DQoJaW50IG5ZZWFyOw0KCWludCBuTW9udGg7DQoJaW50IG5EYXk7DQoNCglDRlhfV2lkZVN0cmluZ0FycmF5IHdzQXJyYXk7DQoJQ0ZYX1dpZGVTdHJpbmcgc01vbnRoID0gTCIiOw0KCUNGWF9XaWRlU3RyaW5nIHNUZW1wID0gTCIiOw0KCWludCBuU2l6ZSA9IHN0clZhbHVlLkdldExlbmd0aCgpOw0KDQoJZm9yKGludCBpID0gMDsgaSA8IG5TaXplOyBpKyspDQoJew0KCQlGWF9XQ0hBUiBjID0gc3RyVmFsdWUuR2V0QXQoaSk7DQoJCWlmKGMgPT0gTCcgJyB8fCBjID09IEwnOicpDQoJCXsJDQoJCQl3c0FycmF5LkFkZChzVGVtcCk7DQoJCQlzVGVtcCA9IEwiIjsNCgkJCWNvbnRpbnVlOw0KCQl9DQoNCgkJc1RlbXAgKz0gYzsNCgl9DQoJDQoJd3NBcnJheS5BZGQoc1RlbXApOw0KCWlmKHdzQXJyYXkuR2V0U2l6ZSgpICE9IDgpcmV0dXJuIDA7DQoNCglzVGVtcCA9IHdzQXJyYXlbMV07DQoJaWYoc1RlbXAuQ29tcGFyZShMIkphbiIpID09IDApIG5Nb250aCA9IDE7DQoJaWYoc1RlbXAuQ29tcGFyZShMIkZlYiIpID09IDApIG5Nb250aCA9IDI7DQoJaWYoc1RlbXAuQ29tcGFyZShMIk1hciIpID09IDApIG5Nb250aCA9IDM7DQoJaWYoc1RlbXAuQ29tcGFyZShMIkFwciIpID09IDApIG5Nb250aCA9IDQ7DQoJaWYoc1RlbXAuQ29tcGFyZShMIk1heSIpID09IDApIG5Nb250aCA9IDU7DQoJaWYoc1RlbXAuQ29tcGFyZShMIkp1biIpID09IDApIG5Nb250aCA9IDY7DQoJaWYoc1RlbXAuQ29tcGFyZShMIkp1bCIpID09IDApIG5Nb250aCA9IDc7DQoJaWYoc1RlbXAuQ29tcGFyZShMIkF1ZyIpID09IDApIG5Nb250aCA9IDg7DQoJaWYoc1RlbXAuQ29tcGFyZShMIlNlcCIpID09IDApIG5Nb250aCA9IDk7DQoJaWYoc1RlbXAuQ29tcGFyZShMIk9jdCIpID09IDApIG5Nb250aCA9IDEwOw0KCWlmKHNUZW1wLkNvbXBhcmUoTCJOb3YiKSA9PSAwKSBuTW9udGggPSAxMTsNCglpZihzVGVtcC5Db21wYXJlKEwiRGVjIikgPT0gMCkgbk1vbnRoID0gMTI7DQoNCgluRGF5ID0gKGludClQYXJzZVN0cmluZ1RvTnVtYmVyKHdzQXJyYXlbMl0pOw0KCW5Ib3VyID0gKGludClQYXJzZVN0cmluZ1RvTnVtYmVyKHdzQXJyYXlbM10pOw0KCW5NaW4gPSAoaW50KVBhcnNlU3RyaW5nVG9OdW1iZXIod3NBcnJheVs0XSk7DQoJblNlYyA9IChpbnQpUGFyc2VTdHJpbmdUb051bWJlcih3c0FycmF5WzVdKTsNCgluWWVhciA9IChpbnQpUGFyc2VTdHJpbmdUb051bWJlcih3c0FycmF5WzddKTsNCg0KCWRvdWJsZSBkUmV0ID0gSlNfTWFrZURhdGUoSlNfTWFrZURheShuWWVhcixuTW9udGggLSAxLG5EYXkpLEpTX01ha2VUaW1lKG5Ib3VyLCBuTWluLCBuU2VjLCAwKSk7DQoNCglpZiAoSlNfUG9ydElzTmFuKGRSZXQpKQ0KCXsNCgkJZFJldCA9IEpTX0RhdGVQYXJzZShzdHJWYWx1ZSk7DQoJfQ0KCQ0KCXJldHVybiBkUmV0Ow0KfQ0KDQovL0FGRGF0ZV9LZXlzdHJva2VFeChjRm9ybWF0KQ0KRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZEYXRlX0tleXN0cm9rZUV4KE9CSl9NRVRIT0RfUEFSQU1TKQ0Kew0KCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOw0KCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsNCglDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7DQoJQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsNCg0KCWlmIChwYXJhbXMuc2l6ZSgpICE9IDEpDQoJew0KCQlzRXJyb3IgPSBMIkFGRGF0ZV9LZXlzdHJva2VFeCdzIHBhcmFtZXRlcnMnIHNpemUgciBub3QgY29ycmVjdCI7DQoJCXJldHVybiBGQUxTRTsNCgl9CQ0KCQ0KCWlmIChwRXZlbnQtPldpbGxDb21taXQoKSkNCgl7DQoJCWlmKCFwRXZlbnQtPm1fcFZhbHVlKQ0KCQkJcmV0dXJuIEZBTFNFOw0KCQlDRlhfV2lkZVN0cmluZyBzdHJWYWx1ZSA9IHBFdmVudC0+VmFsdWUoKTsNCgkJaWYgKHN0clZhbHVlLklzRW1wdHkoKSkgcmV0dXJuIFRSVUU7DQoNCgkJQ0ZYX1dpZGVTdHJpbmcgc0Zvcm1hdCA9IHBhcmFtc1swXS5vcGVyYXRvciBDRlhfV2lkZVN0cmluZygpOw0KDQoJCUZYX0JPT0wgYldyb25nRm9ybWF0ID0gRkFMU0U7DQoJCWRvdWJsZSBkUmV0ID0gTWFrZVJlZ3VsYXJEYXRlKHN0clZhbHVlLHNGb3JtYXQsYldyb25nRm9ybWF0KTsNCgkJaWYgKGJXcm9uZ0Zvcm1hdCB8fCBKU19Qb3J0SXNOYW4oZFJldCkpDQoJCXsNCgkJCUNGWF9XaWRlU3RyaW5nIHN3TXNnOw0KCQkJc3dNc2cuRm9ybWF0KEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSU0VEQVRFKSwgKEZYX0xQQ1dTVFIpc0Zvcm1hdCk7DQoJCQlBbGVydChwQ29udGV4dCwgc3dNc2cpOw0KCQkJcEV2ZW50LT5SYygpID0gRkFMU0U7DQoJCQlyZXR1cm4gVFJVRTsNCgkJfQ0KCX0NCglyZXR1cm4gVFJVRTsNCn0NCg0KRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZEYXRlX0Zvcm1hdChPQkpfTUVUSE9EX1BBUkFNUykNCnsNCgl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7DQoNCglpZiAocGFyYW1zLnNpemUoKSAhPSAxKQ0KCXsNCgkJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsNCgkJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOw0KDQoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7DQoJCXJldHVybiBGQUxTRTsNCgl9DQoNCglpbnQgaUluZGV4ID0gcGFyYW1zWzBdOw0KCUZYX0xQQ1dTVFIgY0Zvcm1hdHNbXSA9ICB7KEZYX0xQQ1dTVFIpTCJtL2QiLCAoRlhfTFBDV1NUUilMIm0vZC95eSIsIChGWF9MUENXU1RSKUwibW0vZGQveXkiLCAoRlhfTFBDV1NUUilMIm1tL3l5IiwgKEZYX0xQQ1dTVFIpTCJkLW1tbSIsIChGWF9MUENXU1RSKUwiZC1tbW0teXkiLCAoRlhfTFBDV1NUUilMImRkLW1tbS15eSIsDQoJCShGWF9MUENXU1RSKUwieXktbW0tZGQiLCAoRlhfTFBDV1NUUilMIm1tbS15eSIsIChGWF9MUENXU1RSKUwibW1tbS15eSIsIChGWF9MUENXU1RSKUwibW1tIGQsIHl5eXkiLCAoRlhfTFBDV1NUUilMIm1tbW0gZCwgeXl5eSIsDQoJCShGWF9MUENXU1RSKUwibS9kL3l5IGg6TU0gdHQiLCAoRlhfTFBDV1NUUilMIm0vZC95eSBISDpNTSIgfTsNCg0KCUFTU0VSVChpSW5kZXggPCBzaXplb2YoY0Zvcm1hdHMpL3NpemVvZihGWF9MUENXU1RSKSk7DQoNCglpZiAoaUluZGV4IDwgMCkNCgkJaUluZGV4ID0gMDsNCglpZiAoaUluZGV4ID49IHNpemVvZihjRm9ybWF0cykvc2l6ZW9mKEZYX0xQQ1dTVFIpKQ0KCQlpSW5kZXggPSAwOw0KCUNKU19QYXJhbWV0ZXJzIG5ld1BhcmFtczsNCglDSlNfVmFsdWUgdmFsKGlzb2xhdGUsY0Zvcm1hdHNbaUluZGV4XSk7DQoJbmV3UGFyYW1zLnB1c2hfYmFjayh2YWwpOw0KCXJldHVybiBBRkRhdGVfRm9ybWF0RXgoY2MsbmV3UGFyYW1zLHZSZXQsc0Vycm9yKTsNCn0NCg0KLy9BRkRhdGVfS2V5c3Ryb2tlRXgoY0Zvcm1hdCkNCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRGF0ZV9LZXlzdHJva2UoT0JKX01FVEhPRF9QQVJBTVMpDQp7DQoJdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSA6OkdldElzb2xhdGUoY2MpOw0KDQoJaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkNCgl7DQoJCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7DQoJCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsNCg0KCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOw0KCQlyZXR1cm4gRkFMU0U7DQoJfQ0KDQoJaW50IGlJbmRleCA9IHBhcmFtc1swXTsNCglGWF9MUENXU1RSIGNGb3JtYXRzW10gPSAgeyhGWF9MUENXU1RSKUwibS9kIiwgKEZYX0xQQ1dTVFIpTCJtL2QveXkiLCAoRlhfTFBDV1NUUilMIm1tL2RkL3l5IiwgKEZYX0xQQ1dTVFIpTCJtbS95eSIsIChGWF9MUENXU1RSKUwiZC1tbW0iLCAoRlhfTFBDV1NUUilMImQtbW1tLXl5IiwgKEZYX0xQQ1dTVFIpTCJkZC1tbW0teXkiLA0KCQkoRlhfTFBDV1NUUilMInl5LW1tLWRkIiwgKEZYX0xQQ1dTVFIpTCJtbW0teXkiLCAoRlhfTFBDV1NUUilMIm1tbW0teXkiLCAoRlhfTFBDV1NUUilMIm1tbSBkLCB5eXl5IiwgKEZYX0xQQ1dTVFIpTCJtbW1tIGQsIHl5eXkiLA0KCQkoRlhfTFBDV1NUUilMIm0vZC95eSBoOk1NIHR0IiwgKEZYX0xQQ1dTVFIpTCJtL2QveXkgSEg6TU0iIH07DQoNCglBU1NFUlQoaUluZGV4PHNpemVvZihjRm9ybWF0cykvc2l6ZW9mKEZYX0xQQ1dTVFIpKTsNCg0KCWlmIChpSW5kZXggPCAwKQ0KCQlpSW5kZXggPSAwOw0KCWlmIChpSW5kZXggPj0gc2l6ZW9mKGNGb3JtYXRzKS9zaXplb2YoRlhfTFBDV1NUUikpDQoJCWlJbmRleCA9IDA7DQoJQ0pTX1BhcmFtZXRlcnMgbmV3UGFyYW1zOw0KCUNKU19WYWx1ZSB2YWwoaXNvbGF0ZSxjRm9ybWF0c1tpSW5kZXhdKTsNCgluZXdQYXJhbXMucHVzaF9iYWNrKHZhbCk7DQoJcmV0dXJuIEFGRGF0ZV9LZXlzdHJva2VFeChjYyxuZXdQYXJhbXMsdlJldCxzRXJyb3IpOw0KfQ0KDQovL2Z1bmN0aW9uIEFGVGltZV9Gb3JtYXQocHRmKQ0KRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZUaW1lX0Zvcm1hdChPQkpfTUVUSE9EX1BBUkFNUykNCnsNCgl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7DQoNCglpZiAocGFyYW1zLnNpemUoKSAhPSAxKQ0KCXsNCgkJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsNCgkJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOw0KCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOw0KCQlyZXR1cm4gRkFMU0U7DQoJfQ0KDQoJaW50IGlJbmRleCA9IHBhcmFtc1swXTsNCglGWF9MUENXU1RSIGNGb3JtYXRzW10gPSB7KEZYX0xQQ1dTVFIpTCJISDpNTSIsIChGWF9MUENXU1RSKUwiaDpNTSB0dCIsIChGWF9MUENXU1RSKUwiSEg6TU06c3MiLCAoRlhfTFBDV1NUUilMImg6TU06c3MgdHQifTsNCg0KCUFTU0VSVChpSW5kZXg8c2l6ZW9mKGNGb3JtYXRzKS9zaXplb2YoRlhfTFBDV1NUUikpOw0KDQoJaWYgKGlJbmRleCA8IDApDQoJCWlJbmRleCA9IDA7DQoJaWYgKGlJbmRleCA+PSBzaXplb2YoY0Zvcm1hdHMpL3NpemVvZihGWF9MUENXU1RSKSkNCgkJaUluZGV4ID0gMDsNCglDSlNfUGFyYW1ldGVycyBuZXdQYXJhbXM7DQoJQ0pTX1ZhbHVlIHZhbChpc29sYXRlLGNGb3JtYXRzW2lJbmRleF0pOw0KCW5ld1BhcmFtcy5wdXNoX2JhY2sodmFsKTsNCglyZXR1cm4gQUZEYXRlX0Zvcm1hdEV4KGNjLG5ld1BhcmFtcyx2UmV0LHNFcnJvcik7DQp9DQoNCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGVGltZV9LZXlzdHJva2UoT0JKX01FVEhPRF9QQVJBTVMpDQp7DQoJdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSA6OkdldElzb2xhdGUoY2MpOw0KCWlmIChwYXJhbXMuc2l6ZSgpICE9IDEpDQoJew0KCQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOw0KCQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7DQoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7DQoJCXJldHVybiBGQUxTRTsNCgl9DQoNCglpbnQgaUluZGV4ID0gcGFyYW1zWzBdOw0KCUZYX0xQQ1dTVFIgY0Zvcm1hdHNbXSA9IHsoRlhfTFBDV1NUUilMIkhIOk1NIiwgKEZYX0xQQ1dTVFIpTCJoOk1NIHR0IiwgKEZYX0xQQ1dTVFIpTCJISDpNTTpzcyIsIChGWF9MUENXU1RSKUwiaDpNTTpzcyB0dCJ9Ow0KDQoJQVNTRVJUKGlJbmRleDxzaXplb2YoY0Zvcm1hdHMpL3NpemVvZihGWF9MUENXU1RSKSk7DQoNCglpZiAoaUluZGV4IDwgMCkNCgkJaUluZGV4ID0gMDsNCglpZiAoaUluZGV4ID49IHNpemVvZihjRm9ybWF0cykvc2l6ZW9mKEZYX0xQQ1dTVFIpKQ0KCQlpSW5kZXggPSAwOw0KCUNKU19QYXJhbWV0ZXJzIG5ld1BhcmFtczsNCglDSlNfVmFsdWUgdmFsKGlzb2xhdGUsY0Zvcm1hdHNbaUluZGV4XSk7DQoJbmV3UGFyYW1zLnB1c2hfYmFjayh2YWwpOw0KCXJldHVybiBBRkRhdGVfS2V5c3Ryb2tlRXgoY2MsbmV3UGFyYW1zLHZSZXQsc0Vycm9yKTsNCn0NCg0KRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZUaW1lX0Zvcm1hdEV4KE9CSl9NRVRIT0RfUEFSQU1TKQ0Kew0KCXJldHVybiBBRkRhdGVfRm9ybWF0RXgoY2MscGFyYW1zLHZSZXQsc0Vycm9yKTsNCn0NCg0KRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZUaW1lX0tleXN0cm9rZUV4KE9CSl9NRVRIT0RfUEFSQU1TKQ0Kew0KCXJldHVybiBBRkRhdGVfS2V5c3Ryb2tlRXgoY2MscGFyYW1zLHZSZXQsc0Vycm9yKTsNCn0NCg0KLy9mdW5jdGlvbiBBRlNwZWNpYWxfRm9ybWF0KHBzZikNCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGU3BlY2lhbF9Gb3JtYXQoT0JKX01FVEhPRF9QQVJBTVMpDQp7DQoJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7DQoJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOw0KDQoJaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkNCgl7DQoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7DQoJCXJldHVybiBGQUxTRTsNCgl9DQoNCglzdGQ6OnN0cmluZyBjRm9ybWF0Ow0KCWludCBpSW5kZXggPSBwYXJhbXNbMF07DQoNCglDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7DQoJQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsNCg0KCWlmKCFwRXZlbnQtPm1fcFZhbHVlKQ0KCQlyZXR1cm4gRkFMU0U7DQoJQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlID0gcEV2ZW50LT5WYWx1ZSgpOwkNCglzdGQ6OnN0cmluZyBzdHJTcmMgPSAoRlhfTFBDU1RSKUNGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShWYWx1ZSk7DQoJDQoJc3dpdGNoIChpSW5kZXgpIA0KCXsNCgljYXNlIDA6ICAgICAgICAgICAgICAgICAgICAgICAgIA0KCQljRm9ybWF0ID0gIjk5OTk5IjsNCgkJYnJlYWs7DQoJY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICANCgkJY0Zvcm1hdCA9ICI5OTk5OS05OTk5IjsNCgkJYnJlYWs7DQoJY2FzZSAyOiAgICAgICAgICAgICAgICAgICAgICAgICANCgkJew0KCQkJc3RkOjpzdHJpbmcgTnVtYmVyU3RyOw0KCQkJdXRpbDo6cHJpbnR4KCI5OTk5OTk5OTk5Iiwgc3RyU3JjLE51bWJlclN0cik7IA0KCQkJaWYgKE51bWJlclN0ci5sZW5ndGgoKSA+PSAxMCApDQoJCQkJY0Zvcm1hdCA9ICIoOTk5KSA5OTktOTk5OSI7DQoJCQllbHNlIA0KCQkJCWNGb3JtYXQgPSAiOTk5LTk5OTkiOw0KCQkJYnJlYWs7DQoJCX0NCgljYXNlIDM6DQoJCWNGb3JtYXQgPSAiOTk5LTk5LTk5OTkiOw0KCQlicmVhazsNCgl9DQoJDQoJc3RkOjpzdHJpbmcgc3RyRGVzOw0KCXV0aWw6OnByaW50eChjRm9ybWF0LHN0clNyYyxzdHJEZXMpOw0KCVZhbHVlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChzdHJEZXMuY19zdHIoKSk7DQoJcmV0dXJuIFRSVUU7DQp9DQoNCg0KLy9mdW5jdGlvbiBBRlNwZWNpYWxfS2V5c3Ryb2tlRXgobWFzaykNCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGU3BlY2lhbF9LZXlzdHJva2VFeChPQkpfTUVUSE9EX1BBUkFNUykNCnsNCglDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsNCglBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7DQoJQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOw0KDQoJQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsNCg0KCWlmIChwYXJhbXMuc2l6ZSgpIDwgMSkNCgl7DQoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7DQoJCXJldHVybiBGQUxTRTsNCgl9DQoNCglpZighcEV2ZW50LT5tX3BWYWx1ZSkNCgkJcmV0dXJuIEZBTFNFOw0KCUNGWF9XaWRlU3RyaW5nJiB2YWxFdmVudCA9IHBFdmVudC0+VmFsdWUoKTsNCg0KCUNGWF9XaWRlU3RyaW5nIHdzdHJNYXNrID0gcGFyYW1zWzBdLm9wZXJhdG9yIENGWF9XaWRlU3RyaW5nKCk7DQoJaWYgKHdzdHJNYXNrLklzRW1wdHkoKSkgcmV0dXJuIFRSVUU7DQoJDQoJc3RkOjp3c3RyaW5nIHdzdHJWYWx1ZSh2YWxFdmVudCk7DQoJDQoJaWYgKHBFdmVudC0+V2lsbENvbW1pdCgpKQ0KCXsNCgkJaWYgKHdzdHJWYWx1ZS5lbXB0eSgpKQ0KCQkJcmV0dXJuIFRSVUU7DQoJCWludCBpSW5kZXhNYXNrID0gMDsNCgkJZm9yIChzdGQ6OndzdHJpbmc6Oml0ZXJhdG9yIGl0ID0gd3N0clZhbHVlLmJlZ2luKCk7IGl0ICE9IHdzdHJWYWx1ZS5lbmQoKTsgaXQrKykNCgkJew0KCQkJd2NoYXJfdCB3X1ZhbHVlID0gKml0Ow0KICAgICAgICAgICAgaWYgKCFtYXNrU2F0aXNmaWVkKHdfVmFsdWUsd3N0ck1hc2tbaUluZGV4TWFza10pKQ0KCQkJCWJyZWFrOw0KCQkJaUluZGV4TWFzaysrOw0KCQl9DQoNCgkJaWYgKGlJbmRleE1hc2sgIT0gd3N0ck1hc2suR2V0TGVuZ3RoKCkgfHwgKGlJbmRleE1hc2sgIT0gd3N0clZhbHVlLnNpemUoKSAmJiB3c3RyTWFzay5HZXRMZW5ndGgoKSAhPSAwKSkNCgkJew0KCQkJQWxlcnQocENvbnRleHQsIEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTQUZOVU1CRVJfS0VZU1RST0tFKSk7DQoJCQlwRXZlbnQtPlJjKCkgPSBGQUxTRTsNCgkJfQ0KCQlyZXR1cm4gVFJVRTsNCgl9DQoNCgkNCglDRlhfV2lkZVN0cmluZyAmd2lkZUNoYW5nZSA9IHBFdmVudC0+Q2hhbmdlKCk7DQoJc3RkOjp3c3RyaW5nIHdDaGFuZ2Uod2lkZUNoYW5nZSk7DQoJDQoJaWYgKHdDaGFuZ2UuZW1wdHkoKSkNCgkJcmV0dXJuIFRSVUU7DQogICAgaW50IGlJbmRleE1hc2sgPSBwRXZlbnQtPlNlbFN0YXJ0KCk7DQoJLy9pSW5kZXhNYXNrKys7DQoJDQoJDQoJaWYgKHdzdHJWYWx1ZS5sZW5ndGgoKSAtIChwRXZlbnQtPlNlbEVuZCgpLXBFdmVudC0+U2VsU3RhcnQoKSkgKyB3Q2hhbmdlLmxlbmd0aCgpID4gKEZYX0RXT1JEKXdzdHJNYXNrLkdldExlbmd0aCgpKQ0KCXsNCgkJQWxlcnQocENvbnRleHQsIEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1fVE9PTE9ORykpOw0KCQlwRXZlbnQtPlJjKCkgPSBGQUxTRTsNCgkJcmV0dXJuIFRSVUU7DQoJfQ0KCQ0KCQ0KCWlmIChpSW5kZXhNYXNrID49IHdzdHJNYXNrLkdldExlbmd0aCgpICYmICghd0NoYW5nZS5lbXB0eSgpKSkNCgl7DQoJCUFsZXJ0KHBDb250ZXh0LCBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNX1RPT0xPTkcpKTsNCgkJcEV2ZW50LT5SYygpID0gRkFMU0U7DQoJCXJldHVybiBUUlVFOw0KCX0NCgkNCglmb3IgKHN0ZDo6d3N0cmluZzo6aXRlcmF0b3IgaXQgPSB3Q2hhbmdlLmJlZ2luKCk7IGl0ICE9IHdDaGFuZ2UuZW5kKCk7IGl0KyspDQoJew0KCQlpZiAoaUluZGV4TWFzayA+PSB3c3RyTWFzay5HZXRMZW5ndGgoKSkNCgkJew0KCQkJQWxlcnQocENvbnRleHQsIEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1fVE9PTE9ORykpOw0KCQkJcEV2ZW50LT5SYygpID0gRkFMU0U7DQoJCQlyZXR1cm4gVFJVRTsNCgkJfQ0KCQl3Y2hhcl90IHdfTWFzayA9IHdzdHJNYXNrW2lJbmRleE1hc2tdOw0KCQlpZiAoIWlzUmVzZXJ2ZWRNYXNrQ2hhcih3X01hc2spKQ0KCQl7DQoJCQkvL3dDaGFuZ2UuaW5zZXJ0KGl0LHdfTWFzayk7CQkJCQ0KCQkJKml0ID0gd19NYXNrOw0KCQl9DQoJCXdjaGFyX3Qgd19DaGFuZ2UgPSAqaXQ7DQoJCQ0KICAgICAgICBpZiAoIW1hc2tTYXRpc2ZpZWQod19DaGFuZ2Usd19NYXNrKSkNCgkJew0KCQkJcEV2ZW50LT5SYygpID0gRkFMU0U7DQoJCQlyZXR1cm4gVFJVRTsNCgkJfQ0KCQlpSW5kZXhNYXNrKys7DQoJfQ0KCQ0KCXdpZGVDaGFuZ2UgPSB3Q2hhbmdlLmNfc3RyKCk7CQ0KCQ0KCXJldHVybiBUUlVFOw0KfQ0KDQoNCi8vZnVuY3Rpb24gQUZTcGVjaWFsX0tleXN0cm9rZShwc2YpDQpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlNwZWNpYWxfS2V5c3Ryb2tlKE9CSl9NRVRIT0RfUEFSQU1TKQ0Kew0KCXY4OjpJc29sYXRlKiBpc29sYXRlID0gOjpHZXRJc29sYXRlKGNjKTsNCg0KCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOw0KCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsNCglDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7DQoJQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsNCg0KCWlmIChwYXJhbXMuc2l6ZSgpICE9IDEpDQoJew0KCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOw0KCQlyZXR1cm4gRkFMU0U7DQoJfQ0KDQoJc3RkOjpzdHJpbmcgY0Zvcm1hdDsNCglpbnQgaUluZGV4ID0gKGludClwYXJhbXNbMF07CQ0KDQoJaWYoIXBFdmVudC0+bV9wVmFsdWUpDQoJCXJldHVybiBGQUxTRTsNCgkvL0NKU19WYWx1ZSB2YWwgPSBwRXZlbnQtPlZhbHVlKCk7DQoJQ0ZYX1dpZGVTdHJpbmcmIHZhbCA9IHBFdmVudC0+VmFsdWUoKTsNCglzdGQ6OnN0cmluZyBzdHJTcmMgPSAoRlhfTFBDU1RSKUNGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZSh2YWwpOw0KCXN0ZDo6d3N0cmluZyB3c3RyQ2hhbmdlKHBFdmVudC0+Q2hhbmdlKCkpOw0KCQ0KCXN3aXRjaCAoaUluZGV4KSANCgl7DQoJY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgICAgICANCgkJY0Zvcm1hdCA9ICI5OTk5OSI7DQoJCWJyZWFrOw0KCWNhc2UgMTogICAgICAgICAgICAgICAgICAgICAgICAgDQoJCS8vY0Zvcm1hdCA9ICI5OTk5OS05OTk5IjsNCgkJY0Zvcm1hdCA9ICI5OTk5OTk5OTkiOw0KCQlicmVhazsNCgljYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgICAgIA0KCQl7DQoJCQlzdGQ6OnN0cmluZyBOdW1iZXJTdHI7DQoJCQl1dGlsOjpwcmludHgoIjk5OTk5OTk5OTkiLCBzdHJTcmMsTnVtYmVyU3RyKTsgDQoJCQlpZiAoc3RyU3JjLmxlbmd0aCgpICsgd3N0ckNoYW5nZS5sZW5ndGgoKSA+IDcgKQ0KCQkJCS8vY0Zvcm1hdCA9ICIoOTk5KSA5OTktOTk5OSI7DQoJCQkJY0Zvcm1hdCA9ICI5OTk5OTk5OTk5IjsNCgkJCWVsc2UgDQoJCQkJLy9jRm9ybWF0ID0gIjk5OS05OTk5IjsNCgkJCQljRm9ybWF0ID0gIjk5OTk5OTkiOw0KCQkJYnJlYWs7DQoJCX0NCgljYXNlIDM6DQoJCS8vY0Zvcm1hdCA9ICI5OTktOTktOTk5OSI7DQoJCWNGb3JtYXQgPSAiOTk5OTk5OTk5IjsNCgkJYnJlYWs7DQoJfQ0KICAgIA0KCUNKU19QYXJhbWV0ZXJzIHBhcmFtczI7DQoJQ0pTX1ZhbHVlIHZNYXNrKGlzb2xhdGUsIGNGb3JtYXQuY19zdHIoKSk7DQoJcGFyYW1zMi5wdXNoX2JhY2sodk1hc2spOw0KCQ0KICAgIHJldHVybiBBRlNwZWNpYWxfS2V5c3Ryb2tlRXgoY2MscGFyYW1zMix2UmV0LHNFcnJvcik7DQp9DQoNCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGTWVyZ2VDaGFuZ2UoT0JKX01FVEhPRF9QQVJBTVMpDQp7DQoJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7DQoJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOw0KCUNKU19FdmVudEhhbmRsZXIqIHBFdmVudEhhbmRsZXIgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7DQoJQVNTRVJUKHBFdmVudEhhbmRsZXIgIT0gTlVMTCk7DQoNCglpZiAocGFyYW1zLnNpemUoKSAhPSAxKQ0KCXsNCgkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsNCgkJcmV0dXJuIEZBTFNFOw0KCX0NCg0KCUNGWF9XaWRlU3RyaW5nIHN3VmFsdWU7DQoJaWYgKHBFdmVudEhhbmRsZXItPm1fcFZhbHVlICE9IE5VTEwpDQoJCXN3VmFsdWUgPSBwRXZlbnRIYW5kbGVyLT5WYWx1ZSgpOw0KDQoJaWYgKHBFdmVudEhhbmRsZXItPldpbGxDb21taXQoKSkNCgl7DQoJCXZSZXQgPSBzd1ZhbHVlOw0KCQlyZXR1cm4gVFJVRTsNCgl9DQoNCglDRlhfV2lkZVN0cmluZyBwcmVmaXgscG9zdGZpeDsNCg0KCWlmIChwRXZlbnRIYW5kbGVyLT5TZWxTdGFydCgpID49IDApDQoJCXByZWZpeCA9IHN3VmFsdWUuTWlkKDAscEV2ZW50SGFuZGxlci0+U2VsU3RhcnQoKSk7DQoJZWxzZQ0KCQlwcmVmaXggPSBMIiI7DQoNCg0KCWlmIChwRXZlbnRIYW5kbGVyLT5TZWxFbmQoKSA+PSAwICYmIHBFdmVudEhhbmRsZXItPlNlbEVuZCgpIDw9IHN3VmFsdWUuR2V0TGVuZ3RoKCkpDQoJCXBvc3RmaXggPSBzd1ZhbHVlLk1pZChwRXZlbnRIYW5kbGVyLT5TZWxFbmQoKSwgc3dWYWx1ZS5HZXRMZW5ndGgoKSAtIHBFdmVudEhhbmRsZXItPlNlbEVuZCgpKTsNCgllbHNlIHBvc3RmaXggPSBMIiI7DQoNCgl2UmV0ID0gcHJlZml4ICsgcEV2ZW50SGFuZGxlci0+Q2hhbmdlKCkgKyBwb3N0Zml4Ow0KDQoJcmV0dXJuIFRSVUU7DQp9DQoNCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGUGFyc2VEYXRlRXgoT0JKX01FVEhPRF9QQVJBTVMpDQp7DQoJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7DQoJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOw0KDQoJaWYgKHBhcmFtcy5zaXplKCkgIT0gMikNCgl7DQoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7DQoJCXJldHVybiBGQUxTRTsNCgl9DQoNCglDRlhfV2lkZVN0cmluZyBzVmFsdWUgPSBwYXJhbXNbMF0ub3BlcmF0b3IgQ0ZYX1dpZGVTdHJpbmcoKTsNCglDRlhfV2lkZVN0cmluZyBzRm9ybWF0ID0gcGFyYW1zWzFdLm9wZXJhdG9yIENGWF9XaWRlU3RyaW5nKCk7DQoNCglGWF9CT09MIGJXcm9uZ0Zvcm1hdCA9IEZBTFNFOw0KCWRvdWJsZSBkRGF0ZSA9IE1ha2VSZWd1bGFyRGF0ZShzVmFsdWUsc0Zvcm1hdCxiV3JvbmdGb3JtYXQpOw0KDQoJaWYgKEpTX1BvcnRJc05hbihkRGF0ZSkpDQoJew0KCQlDRlhfV2lkZVN0cmluZyBzd01zZzsNCgkJc3dNc2cuRm9ybWF0KEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSU0VEQVRFKSwgKEZYX0xQQ1dTVFIpc0Zvcm1hdCk7DQoJCUFsZXJ0KChDSlNfQ29udGV4dCAqKWNjLCBzd01zZyk7DQoJCXJldHVybiBGQUxTRTsNCgl9DQoJDQoJdlJldCA9IGREYXRlOw0KDQoJcmV0dXJuIFRSVUU7DQp9DQoNCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGU2ltcGxlKE9CSl9NRVRIT0RfUEFSQU1TKQ0Kew0KCWlmIChwYXJhbXMuc2l6ZSgpICE9IDMpDQoJew0KCQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsNCgkJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOw0KDQoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7DQoJCXJldHVybiBGQUxTRTsNCgl9DQoNCgl2UmV0ID0gKGRvdWJsZSlBRl9TaW1wbGUocGFyYW1zWzBdLm9wZXJhdG9yIENGWF9XaWRlU3RyaW5nKCksIChkb3VibGUpcGFyYW1zWzFdLCAoZG91YmxlKXBhcmFtc1syXSk7DQoJcmV0dXJuIFRSVUU7DQp9DQoNCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGTWFrZU51bWJlcihPQkpfTUVUSE9EX1BBUkFNUykNCnsNCglpZiAocGFyYW1zLnNpemUoKSAhPSAxKQ0KCXsNCgkJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7DQoJCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsNCg0KCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOw0KCQlyZXR1cm4gRkFMU0U7DQoJfQ0KICAgIHZSZXQgPSBQYXJzZVN0cmluZ1RvTnVtYmVyKHBhcmFtc1swXS5vcGVyYXRvciBDRlhfV2lkZVN0cmluZygpKTsNCglyZXR1cm4gVFJVRTsNCn0NCg0KRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZTaW1wbGVfQ2FsY3VsYXRlKE9CSl9NRVRIT0RfUEFSQU1TKQ0Kew0KCXY4OjpJc29sYXRlKiBpc29sYXRlID0gOjpHZXRJc29sYXRlKGNjKTsNCg0KCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOw0KCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsNCg0KCWlmIChwYXJhbXMuc2l6ZSgpICE9IDIpDQoJew0KCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOw0KCQlyZXR1cm4gRkFMU0U7DQoJfQ0KDQoJQ0pTX1ZhbHVlIHBhcmFtczEgPSBwYXJhbXNbMV07DQoNCglpZiAoIXBhcmFtczEuSXNBcnJheU9iamVjdCgpICYmIHBhcmFtczEuR2V0VHlwZSgpICE9IFZUX3N0cmluZykNCgl7DQoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7DQoJCXJldHVybiBGQUxTRTsNCgl9DQoJDQoJQ1BERlNES19Eb2N1bWVudCogcFJlYWRlckRvYyA9IHBDb250ZXh0LT5HZXRSZWFkZXJEb2N1bWVudCgpOw0KICAgIEFTU0VSVChwUmVhZGVyRG9jICE9IE5VTEwpOw0KDQoJQ1BERlNES19JbnRlckZvcm0qIHBSZWFkZXJJbnRlckZvcm0gPSBwUmVhZGVyRG9jLT5HZXRJbnRlckZvcm0oKTsNCglBU1NFUlQocFJlYWRlckludGVyRm9ybSAhPSBOVUxMKTsNCg0KCUNQREZfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gcFJlYWRlckludGVyRm9ybS0+R2V0SW50ZXJGb3JtKCk7DQoJQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7DQoNCglkb3VibGUgZFZhbHVlOw0KCUNGWF9XaWRlU3RyaW5nIHNGdW5jdGlvbiA9IHBhcmFtc1swXS5vcGVyYXRvciBDRlhfV2lkZVN0cmluZygpOw0KCWlmICh3Y3NjbXAoc0Z1bmN0aW9uLCBMIlBSRCIpID09IDApDQogICAgCWRWYWx1ZSA9IDEuMDsNCgllbHNlDQoJCWRWYWx1ZSA9IDAuMDsNCg0KCUNKU19BcnJheSBGaWVsZE5hbWVBcnJheSA9IEFGX01ha2VBcnJheUZyb21MaXN0KGlzb2xhdGUscGFyYW1zMSk7DQoNCglpbnQgbkZpZWxkc0NvdW50ID0gMDsNCg0KCWZvciAoaW50IGk9MCxpc3o9RmllbGROYW1lQXJyYXkuR2V0TGVuZ3RoKCk7IGk8aXN6OyBpKyspDQoJew0KCQlDSlNfVmFsdWUganNWYWx1ZShpc29sYXRlKTsNCgkJRmllbGROYW1lQXJyYXkuR2V0RWxlbWVudChpLGpzVmFsdWUpOw0KICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0ZpZWxkTmFtZSA9IGpzVmFsdWUub3BlcmF0b3IgQ0ZYX1dpZGVTdHJpbmcoKTsNCg0KICAgICAgICBmb3IgKGludCBqPTAsanN6PXBJbnRlckZvcm0tPkNvdW50RmllbGRzKHdzRmllbGROYW1lKTsgajxqc3o7IGorKykNCgkJew0KCQkJaWYgKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gcEludGVyRm9ybS0+R2V0RmllbGQoaiwgd3NGaWVsZE5hbWUpKQ0KCQkJew0KCQkJCWRvdWJsZSBkVGVtcCA9IDAuMDsNCg0KCQkJCXN3aXRjaCAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkpDQoJCQkJew0KCQkJCWNhc2UgRklFTERUWVBFX1RFWFRGSUVMRDoNCgkJCQljYXNlIEZJRUxEVFlQRV9DT01CT0JPWDoNCgkJCQkJew0KCQkJCQkJZFRlbXAgPSBQYXJzZVN0cmluZ1RvTnVtYmVyKHBGb3JtRmllbGQtPkdldFZhbHVlKCkpOw0KCQkJCQkJYnJlYWs7DQoJCQkJCX0NCgkJCQljYXNlIEZJRUxEVFlQRV9QVVNIQlVUVE9OOg0KCQkJCQl7DQoJCQkJCQlkVGVtcCA9IDAuMDsNCgkJCQkJCWJyZWFrOw0KCQkJCQl9DQoJCQkJY2FzZSBGSUVMRFRZUEVfQ0hFQ0tCT1g6DQoJCQkJY2FzZSBGSUVMRFRZUEVfUkFESU9CVVRUT046DQoJCQkJCXsNCgkJCQkJCWRUZW1wID0gMC4wOw0KCQkJCQkJZm9yIChpbnQgYz0wLGNzej1wRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGM8Y3N6OyBjKyspDQoJCQkJCQl7DQoJCQkJCQkJaWYgKENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IHBGb3JtRmllbGQtPkdldENvbnRyb2woYykpDQoJCQkJCQkJew0KCQkJCQkJCQlpZiAocEZvcm1DdHJsLT5Jc0NoZWNrZWQoKSkNCgkJCQkJCQkJew0KCQkJCQkJCQkJZFRlbXAgKz0gUGFyc2VTdHJpbmdUb051bWJlcihwRm9ybUN0cmwtPkdldEV4cG9ydFZhbHVlKCkpOw0KCQkJCQkJCQkJYnJlYWs7DQoJCQkJCQkJCX0NCgkJCQkJCQkJZWxzZQ0KCQkJCQkJCQkJY29udGludWU7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQkJYnJlYWs7DQoJCQkJCX0NCgkJCQljYXNlIEZJRUxEVFlQRV9MSVNUQk9YOg0KCQkJCQl7DQoJCQkJCQlkVGVtcCA9IDAuMDsNCgkJCQkJCWlmIChwRm9ybUZpZWxkLT5Db3VudFNlbGVjdGVkSXRlbXMoKSA+IDEpDQoJCQkJCQkJYnJlYWs7DQoJCQkJCQllbHNlDQoJCQkJCQl7DQoJCQkJCQkJZFRlbXAgPSBQYXJzZVN0cmluZ1RvTnVtYmVyKHBGb3JtRmllbGQtPkdldFZhbHVlKCkpOw0KCQkJCQkJCWJyZWFrOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJZGVmYXVsdDoNCgkJCQkJYnJlYWs7DQoJCQkJfQ0KDQoJCQkJaWYgKGkgPT0gMCAmJiBqID09IDAgJiYgKHdjc2NtcChzRnVuY3Rpb24sTCJNSU4iKSA9PSAwIHx8IHdjc2NtcChzRnVuY3Rpb24sIEwiTUFYIikgPT0gMCkpDQoJCQkJCWRWYWx1ZSA9IGRUZW1wOw0KDQoJCQkJZFZhbHVlID0gQUZfU2ltcGxlKHNGdW5jdGlvbiwgZFZhbHVlLCBkVGVtcCk7DQoNCgkJCQluRmllbGRzQ291bnQrKzsNCgkJCX0NCgkJfQ0KCX0NCg0KCWlmICh3Y3NjbXAoc0Z1bmN0aW9uLCBMIkFWRyIpID09IDAgJiYgbkZpZWxkc0NvdW50ID4gMCkNCgkJZFZhbHVlIC89IG5GaWVsZHNDb3VudDsNCg0KCWRWYWx1ZSA9IChkb3VibGUpZmxvb3IoZFZhbHVlICogRlhTWVNfcG93KChkb3VibGUpMTAsKGRvdWJsZSk2KSArIDAuNDkpIC8gRlhTWVNfcG93KChkb3VibGUpMTAsKGRvdWJsZSk2KTsNCglDSlNfVmFsdWUganNWYWx1ZShpc29sYXRlLGRWYWx1ZSk7DQoJaWYoKENKU19FdmVudEhhbmRsZXIqKXBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKS0+bV9wVmFsdWUpDQoJCSgoQ0pTX0V2ZW50SGFuZGxlciopcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpKS0+VmFsdWUoKSA9IGpzVmFsdWU7DQoNCglyZXR1cm4gVFJVRTsNCn0NCg0KLyogVGhpcyBmdW5jdGlvbiB2YWxpZGF0ZXMgdGhlIGN1cnJlbnQgZXZlbnQgdG8gZW5zdXJlIHRoYXQgaXRzIHZhbHVlIGlzIA0KKiogd2l0aGluIHRoZSBzcGVjaWZpZWQgcmFuZ2UuICovDQoNCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGUmFuZ2VfVmFsaWRhdGUoT0JKX01FVEhPRF9QQVJBTVMpDQp7DQoJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7DQoJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOw0KCUNKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsNCglBU1NFUlQocEV2ZW50ICE9IE5VTEwpOw0KDQoJaWYgKHBhcmFtcy5zaXplKCkgIT0gNCkgDQoJew0KCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOw0KCQlyZXR1cm4gRkFMU0U7DQoJfQ0KDQoJaWYoIXBFdmVudC0+bV9wVmFsdWUpDQoJCXJldHVybiBGQUxTRTsNCglpZiAocEV2ZW50LT5WYWx1ZSgpLklzRW1wdHkoKSApDQoJCXJldHVybiBUUlVFOw0KCWRvdWJsZSBkRWVudFZhbHVlID0gYXRvZihDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUocEV2ZW50LT5WYWx1ZSgpKSk7DQoJRlhfQk9PTCBiR3JlYXRlclRoYW4sIGJMZXNzVGhhbjsNCglkb3VibGUgIGRHcmVhdGVyVGhhbiwgZExlc3NUaGFuOw0KICAgIGJHcmVhdGVyVGhhbiA9IChGWF9CT09MKXBhcmFtc1swXTsNCglDRlhfV2lkZVN0cmluZyBzd01zZzsNCglkR3JlYXRlclRoYW4gPSAoZG91YmxlKXBhcmFtc1sxXTsNCgliTGVzc1RoYW4gPSAoRlhfQk9PTClwYXJhbXNbMl07DQoJZExlc3NUaGFuID0gKGRvdWJsZSlwYXJhbXNbM107DQoNCglpZiAoYkdyZWF0ZXJUaGFuICYmIGJMZXNzVGhhbikNCgl7DQoJCWlmIChkRWVudFZhbHVlIDwgZEdyZWF0ZXJUaGFuIHx8IGRFZW50VmFsdWUgPiBkTGVzc1RoYW4pDQoJCQlzd01zZy5Gb3JtYXQoSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNSQU5HRTEpLChGWF9MUENXU1RSKXBhcmFtc1sxXS5vcGVyYXRvciBDRlhfV2lkZVN0cmluZygpLCAoRlhfTFBDV1NUUilwYXJhbXNbM10ub3BlcmF0b3IgQ0ZYX1dpZGVTdHJpbmcoKSk7DQoJfQ0KCWVsc2UgaWYgKGJHcmVhdGVyVGhhbikNCgl7DQoJCWlmIChkRWVudFZhbHVlIDwgZEdyZWF0ZXJUaGFuKQ0KCQkJc3dNc2cuRm9ybWF0KEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUkFOR0UyKSwgKEZYX0xQQ1dTVFIpcGFyYW1zWzFdLm9wZXJhdG9yIENGWF9XaWRlU3RyaW5nKCkpOw0KCX0NCgllbHNlIGlmIChiTGVzc1RoYW4pDQoJew0KCQlpZiAoZEVlbnRWYWx1ZSA+IGRMZXNzVGhhbikNCgkJCXN3TXNnLkZvcm1hdChKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1JBTkdFMyksIChGWF9MUENXU1RSKXBhcmFtc1szXS5vcGVyYXRvciBDRlhfV2lkZVN0cmluZygpKTsNCgl9DQoNCglpZiAoIXN3TXNnLklzRW1wdHkoKSkNCgl7DQoJCUFsZXJ0KHBDb250ZXh0LCBzd01zZyk7DQoJCXBFdmVudC0+UmMoKSA9IEZBTFNFOw0KCX0NCglyZXR1cm4gVFJVRTsNCn0NCg0KRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZFeHRyYWN0TnVtcyhPQkpfTUVUSE9EX1BBUkFNUykNCnsNCgl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7DQoJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsNCglBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7DQoNCglpZiAocGFyYW1zLnNpemUoKSAhPSAxKSANCgl7DQoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7DQoJCXJldHVybiBGQUxTRTsNCgl9DQoNCglDSlNfQXJyYXkgbnVtcyhpc29sYXRlKTsNCg0KCUNGWF9XaWRlU3RyaW5nIHN0ciA9IHBhcmFtc1swXS5vcGVyYXRvciBDRlhfV2lkZVN0cmluZygpOw0KCUNGWF9XaWRlU3RyaW5nIHNQYXJ0Ow0KDQoJaWYgKHN0ci5HZXRBdCgwKSA9PSBMJy4nIHx8IHN0ci5HZXRBdCgwKSA9PSBMJywnKQ0KCQlzdHIgPSBMIjAiICsgc3RyOw0KDQoJaW50IG5JbmRleCA9IDA7DQoJZm9yIChpbnQgaT0wLCBzej1zdHIuR2V0TGVuZ3RoKCk7IGk8c3o7IGkrKykNCgl7DQoJCUZYX1dDSEFSIHdjID0gc3RyLkdldEF0KGkpOw0KCQlpZiAoSXNEaWdpdCgod2NoYXJfdCl3YykpDQoJCXsNCgkJCXNQYXJ0ICs9IHdjOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJaWYgKHNQYXJ0LkdldExlbmd0aCgpID4gMCkNCgkJCXsNCgkJCQludW1zLlNldEVsZW1lbnQobkluZGV4LENKU19WYWx1ZShpc29sYXRlLChGWF9MUENXU1RSKXNQYXJ0KSk7DQoJCQkJc1BhcnQgPSBMIiI7DQoJCQkJbkluZGV4ICsrOw0KCQkJfQ0KCQl9DQoJfQ0KDQoJaWYgKHNQYXJ0LkdldExlbmd0aCgpID4gMCkNCgl7DQoJCW51bXMuU2V0RWxlbWVudChuSW5kZXgsQ0pTX1ZhbHVlKGlzb2xhdGUsKEZYX0xQQ1dTVFIpc1BhcnQpKTsJDQoJfQ0KDQoJaWYgKG51bXMuR2V0TGVuZ3RoKCkgPiAwKQ0KCQl2UmV0ID0gbnVtczsNCgllbHNlDQoJCXZSZXQuU2V0TnVsbCgpOw0KDQoJcmV0dXJuIFRSVUU7DQp9DQo=