PD9waHAgIAkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCXJlcXVpcmVfb25jZSgkX1NFUlZFUlsnRE9DVU1FTlRfUk9PVCddIC4gIi9lY2xpcHNlLm9yZy1jb21tb24vc3lzdGVtL2FwcC5jbGFzcy5waHAiKTsJcmVxdWlyZV9vbmNlKCRfU0VSVkVSWydET0NVTUVOVF9ST09UJ10gLiAiL2VjbGlwc2Uub3JnLWNvbW1vbi9zeXN0ZW0vbmF2LmNsYXNzLnBocCIpOyAJcmVxdWlyZV9vbmNlKCRfU0VSVkVSWydET0NVTUVOVF9ST09UJ10gLiAiL2VjbGlwc2Uub3JnLWNvbW1vbi9zeXN0ZW0vbWVudS5jbGFzcy5waHAiKTsgCSRBcHAgCT0gbmV3IEFwcCgpOwkkTmF2CT0gbmV3IE5hdigpOwkkTWVudSAJPSBuZXcgTWVudSgpOwkJaW5jbHVkZSgkQXBwLT5nZXRQcm9qZWN0Q29tbW9uKCkpOyAgICAjIEFsbCBvbiB0aGUgc2FtZSBsaW5lIHRvIHVuY2x1dHRlciB0aGUgdXNlcidzIGRlc2t0b3AnCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIENvcHlyaWdodCAoYykgMjAwOSBFY2xpcHNlIEZvdW5kYXRpb24gYW5kIG90aGVycy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKICoKICogQ29udHJpYnV0b3JzOgogKiBT6WJhc3RpZW4gR+lyYXJkLCBDRUEgTElTVAogKiAgICAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoJIwoJIyBCZWdpbjogcGFnZS1zcGVjaWZpYyBzZXR0aW5ncy4KCSRwYWdlVGl0bGUgCQk9ICJQYXB5cnVzIENpbmVtYSBDb3JuZXIiOwoJJHBhZ2VLZXl3b3Jkcwk9ICJwYXB5cnVzLCB1c2VycywgZG9jdW1lbnRzLCB0dXRvcmlhbHMsIGV4YW1wbGVzIjsKCSRwYWdlQXV0aG9yCQk9ICJTZWJhc3RpZW4gR2VyYXJkIjsKCQkKCSMgUGFzdGUgeW91ciBIVE1MIGNvbnRlbnQgYmV0d2VlbiB0aGUgRU9IVE1MIG1hcmtlcnMhCQoJb2Jfc3RhcnQoKTsKCT8+Cgo8aGVhZD4KCTx0aXRsZT5QYXB5cnVzIFNsaWRlc2hvdzwvdGl0bGU+Cgk8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KCTxtZXRhIG5hbWU9ImF1dGhvciIgY29udGVudD0iU2ViYXN0aWVuIEdlcmFyZCIgLz4KCTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImNzcy9zbGlkZXNob3cuY3NzIiBtZWRpYT0ic2NyZWVuIiAvPgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ianMvbW9vdG9vbHMuanMiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ianMvc2xpZGVzaG93LmpzIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4JCQoJLy88IVtDREFUQVsKCSAgd2luZG93LmFkZEV2ZW50KCdkb21yZWFkeScsIGZ1bmN0aW9uKCl7CgkgICAgdmFyIGRhdGEgPSB7CgkgICAgICAnUHJvZmlsZURpYWdyYW1FZGl0b3IuanBnJzogeyBjYXB0aW9uOiAnUHJvZmlsZSBkaWFncmFtIGVkaXRvci4nIH0sIAoJICAgIH07CgkgICAgdmFyIG15U2hvdyA9IG5ldyBTbGlkZXNob3coJ3Nob3cnLCBkYXRhLCB7Y29udHJvbGxlcjogdHJ1ZSwgaGVpZ2h0OiAzMDAsIGh1OiAnaW1hZ2VzLycsIHRodW1ibmFpbHM6IHRydWUsIHdpZHRoOiA0MDB9KTsKCSAgfSk7CgkvL11dPgoJPC9zY3JpcHQ+CjwvaGVhZD4KIAo8Ym9keT4KCTxkaXYgaWQ9Im1pZGNvbHVtbiI+CgkJPGgxPlBhcHlydXMgQ2luZW1hIENvcm5lcjwvaDE+CgkJPHA+CgkJCVRoaXMgcGFnZSBjb25zaXN0cyBvZiBzY3JlZW5zaG90cyBhbmQgc2NyZWVuY2FzdHMgb24gUGFweXJ1cy4KCQk8L3A+CgkJPHA+CiAgCQkJPGRpdiBpZD0ic2hvdyIgY2xhc3M9InNsaWRlc2hvdyI+CiAgICAJCQk8aW1nIHNyYz0iaW1hZ2VzL1Byb2ZpbGVEaWFncmFtRWRpdG9yLmpwZyIgYWx0PSJQcm9maWxlIGRpYWdyYW0gZWRpdG9yLiIgLz4KICAJCQk8L2Rpdj4KICAJCQk8YnI+CiAgCQkJPGJyPgogIAkJPC9wPgogPC9ib2R5PgoKPCEtLSAKPGRpdiBpZD0ic2NyZWVuY2FzdCI+CjxvYmplY3Qgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0ODAiPgo8cGFyYW0gbmFtZT0iYWxsb3dmdWxsc2NyZWVuIiB2YWx1ZT0idHJ1ZSIgLz4KPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIiAvPgo8cGFyYW0gbmFtZT0ibW92aWUiIHZhbHVlPSJ2aWRlb3MvdmlkZW8xL1BhcHlydXNNRFQuc3dmIiAvPgo8ZW1iZWQgc3JjPSJ2aWRlb3MvdmlkZW8xL1BhcHlydXNNRFQuc3dmIiB0eXBlPSJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIgYWxsb3dmdWxsc2NyZWVuPSJ0cnVlIiBhbGxvd3NjcmlwdGFjY2Vzcz0iYWx3YXlzIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQ4MCI+PC9lbWJlZD4KPC9vYmplY3Q+CjwvZGl2PgotLT4KCQkKCQk8IS0tCgkJPGgzPiZsdDtoMyZndDsgdGFnPC9oMz4KCQk8ZGl2IGNsYXNzPSJob21laXRlbSI+CgkJCTx1bD4KCQkJCTxsaT5UaGlzIGlzIGFuIHVub3JkZXJlZCBsaXN0PC9saT4KCQkJCTxsaT5Mb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzaWNpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVuaWFtLCBxdWlzIG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1aXAgZXggZWEgY29tbW9kbyBjb25zZXF1YXQuPC9saT4KCQkJCTxsaT5EdWlzIGF1dGUgaXJ1cmUgZG9sb3IgaW4gcmVwcmVoZW5kZXJpdCBpbiB2b2x1cHRhdGUgdmVsaXQgZXNzZSBjaWxsdW0gZG9sb3JlIGV1IGZ1Z2lhdCBudWxsYSBwYXJpYXR1ci4gRXhjZXB0ZXVyIHNpbnQgb2NjYWVjYXQgY3VwaWRhdGF0IG5vbiBwcm9pZGVudCwgc3VudCBpbiBjdWxwYSBxdWkgb2ZmaWNpYSBkZXNlcnVudCBtb2xsaXQgYW5pbSBpZCBlc3QgbGFib3J1bTwvbGk+CiAJCQkJPGxpPkN1cmFiaXR1ciB2ZWwgbG9yZW0gaW4gdHVycGlzIGFkaXBpc2NpbmcgZGljdHVtLiBOdW5jIG1pIGVzdCwgc2NlbGVyaXNxdWUgdml0YWUsIHZlbmVuYXRpcyBldCwgZXVpc21vZCBldCwgc2VtLiBQcmFlc2VudCBhbGlxdWV0IG1pIHZlbCBmZWxpcy4gUGVsbGVudGVzcXVlIHBlbGxlbnRlc3F1ZSBjb252YWxsaXMgYW50ZS4gUHJhZXNlbnQgaW1wZXJkaWV0IHZlbGl0IHZpdGFlIGp1c3RvLiBOdWxsYW0gcXVpcyBwdXJ1cy4gQWVuZWFuIG5lcXVlIGVuaW0sIGNvbnNlcXVhdCBub24sIG1hdHRpcyBldSwgZ3JhdmlkYSBzZWQsIG1hc3NhLjwvbGk+CgkJCTwvdWw+CgkJCTxvbD4gCgkJCQk8bGk+VGhpcyBpcyBhbiBvcmRlcmVkIGxpc3Q8L2xpPgoJCQkJPGxpPkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNpY2luZyBlbGl0LCBzZWQgZG8gZWl1c21vZCB0ZW1wb3IgaW5jaWRpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1YS4gVXQgZW5pbSBhZCBtaW5pbSB2ZW5pYW0sIHF1aXMgbm9zdHJ1ZCBleGVyY2l0YXRpb24gdWxsYW1jbyBsYWJvcmlzIG5pc2kgdXQgYWxpcXVpcCBleCBlYSBjb21tb2RvIGNvbnNlcXVhdC48L2xpPgoJCQkJPGxpPkR1aXMgYXV0ZSBpcnVyZSBkb2xvciBpbiByZXByZWhlbmRlcml0IGluIHZvbHVwdGF0ZSB2ZWxpdCBlc3NlIGNpbGx1bSBkb2xvcmUgZXUgZnVnaWF0IG51bGxhIHBhcmlhdHVyLiBFeGNlcHRldXIgc2ludCBvY2NhZWNhdCBjdXBpZGF0YXQgbm9uIHByb2lkZW50LCBzdW50IGluIGN1bHBhIHF1aSBvZmZpY2lhIGRlc2VydW50IG1vbGxpdCBhbmltIGlkIGVzdCBsYWJvcnVtPC9saT4KIAkJCQk8bGk+Q3VyYWJpdHVyIHZlbCBsb3JlbSBpbiB0dXJwaXMgYWRpcGlzY2luZyBkaWN0dW0uIE51bmMgbWkgZXN0LCBzY2VsZXJpc3F1ZSB2aXRhZSwgdmVuZW5hdGlzIGV0LCBldWlzbW9kIGV0LCBzZW0uIFByYWVzZW50IGFsaXF1ZXQgbWkgdmVsIGZlbGlzLiBQZWxsZW50ZXNxdWUgcGVsbGVudGVzcXVlIGNvbnZhbGxpcyBhbnRlLiBQcmFlc2VudCBpbXBlcmRpZXQgdmVsaXQgdml0YWUganVzdG8uIE51bGxhbSBxdWlzIHB1cnVzLiBBZW5lYW4gbmVxdWUgZW5pbSwgY29uc2VxdWF0IG5vbiwgbWF0dGlzIGV1LCBncmF2aWRhIHNlZCwgbWFzc2EuPC9saT4KCQkJPC9vbD4JCQkJCgkJPC9kaXY+CgkJCgkJPGgyPiZsdDtoMiZndDsgdGFnPC9oMj4KCQk8dGFibGU+CgkJCTx0cj4KCQkJCTx0ZD5UYWJsZXMgbG9vayA8L3RkPgoJCQkJPHRkPmxpa2UgdGhpczwvdGQ+CgkJCTwvdHI+CgkJCTx0cj4KCQkJCTx0ZD5EYXRhPC90ZD4KCQkJCTx0ZD5EYXRhPC90ZD4KCQkJPC90cj4KCQkJPHRyPgoJCQkJPHRkPkRhdGE8L3RkPgoJCQkJPHRkPkRhdGE8L3RkPgoJCQk8L3RyPgoJCTwvdGFibGU+CgkJLS0+CgkJCgk8L2Rpdj4KCjwhLS0gcmVtb3ZlIHRoZSBlbnRpcmUgPGRpdj4gdGFnIHRvIG9taXQgdGhlIHJpZ2h0IGNvbHVtbiEKCTxkaXYgaWQ9InJpZ2h0Y29sdW1uIj4KCQk8ZGl2IGNsYXNzPSJzaWRlaXRlbSI+CgkJCTxoNj5SZWxhdGVkIExpbmtzPC9oNj4KCQkJPHVsPgoJCQkJPGxpPkZvciBkZXZlbG9wcGVycywgbGV0J3Mgc2VlIGF0IHRoZSA8YSBocmVmPSJodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9NRFQvUGFweXJ1cyI+UGFweXJ1cyB3aWtpPC9hPjwvbGk+CgkJCQk8bGk+Rm9yIGFueSBxdWVzdGlvbnMsIGxldCdzIGdvIHRvIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL25ld3Nwb3J0YWwvdGhyZWFkLnBocD9ncm91cD1lY2xpcHNlLnBhcHlydXMiPlBhcHlydXMgZm9ydW08L2E+PC9saT4KCQkJPC91bD4KCQk8L2Rpdj4KCQkKCQk8ZGl2IGNsYXNzPSJzaWRlaXRlbSI+CgkJCTxoNj4mbHQ7aDYmZ3Q7IHRhZzwvaDY+CgkJCQk8ZGl2IGNsYXNzPSJtb2RhbCI+CgkJCQkJV3JhcHBpbmcgeW91ciBjb250ZW50IHVzaW5nIGEgZGl2Lm1vZGFsIHRhZyBoZXJlIHdpbGwgYWRkIHRoZSBncmFkaWVudCBiYWNrZ3JvdW5kCgkJCQk8L2Rpdj4KCQk8L2Rpdj4KCQkKCTwvZGl2PgotLT4KCgkKeDw/CgkkaHRtbCA9IG9iX2dldF9jbGVhbigpOwoKCSMgR2VuZXJhdGUgdGhlIHdlYiBwYWdlCgkkQXBwLT5nZW5lcmF0ZVBhZ2UoJ05vdmEnLCAkTWVudSwgJE5hdiwgJHBhZ2VBdXRob3IsICRwYWdlS2V5d29yZHMsICRwYWdlVGl0bGUsICRodG1sKTsKPz4=