# Name: smd_thumbnail v0.12 # Type: Admin/Public side plugin # Multiple image thumbnails of arbitrary dimensions # Author: Stef Dawson # URL: http://stefdawson.com/ # Recommended load order: 5 # ..................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ..................................................................... YToxMTp7czo0OiJuYW1lIjtzOjEzOiJzbWRfdGh1bWJuYWlsIjtzOjY6ImF1dGhvciI7czox MToiU3RlZiBEYXdzb24iO3M6MTA6ImF1dGhvcl91cmkiO3M6MjI6Imh0dHA6Ly9zdGVmZGF3 c29uLmNvbS8iO3M6NzoidmVyc2lvbiI7czo0OiIwLjEyIjtzOjExOiJkZXNjcmlwdGlvbiI7 czo0OToiTXVsdGlwbGUgaW1hZ2UgdGh1bWJuYWlscyBvZiBhcmJpdHJhcnkgZGltZW5zaW9u cyI7czo0OiJjb2RlIjtzOjM3ODUxOiJpZiAoQHR4cGludGVyZmFjZSA9PSAnYWRtaW4nKSB7 DQoJZ2xvYmFsICRzbWRfdGh1bWJfZXZlbnQ7DQoNCgkkc21kX3RodW1iX2V2ZW50ID0gJ3Nt ZF90aHVtYm5haWwnOw0KCSRzbWRfdGh1bWJfcHJpdnMgPSAnMSwyLDMnOw0KDQoJYWRkX3By aXZzKCRzbWRfdGh1bWJfZXZlbnQsICRzbWRfdGh1bWJfcHJpdnMpOw0KCWFkZF9wcml2cygn c21kX3RodW1iX3Byb2ZpbGVzJywgJHNtZF90aHVtYl9wcml2cyk7DQoJYWRkX3ByaXZzKCdw bHVnaW5fcHJlZnMuJy4kc21kX3RodW1iX2V2ZW50LCAkc21kX3RodW1iX3ByaXZzKTsNCgly ZWdpc3Rlcl9jYWxsYmFjaygnc21kX3RodW1iX3dlbGNvbWUnLCAncGx1Z2luX2xpZmVjeWNs ZS4nLiRzbWRfdGh1bWJfZXZlbnQpOw0KCXJlZ2lzdGVyX2NhbGxiYWNrKCdzbWRfdGh1bWJf cHJvZmlsZXMnLCAnaW1hZ2VfdWknLCAnZXh0ZW5kX2NvbnRyb2xzJyk7DQoJcmVnaXN0ZXJf Y2FsbGJhY2soJ3NtZF90aHVtYnMnLCAnaW1hZ2VfdWknLCAndGh1bWJuYWlsJyk7DQoJcmVn aXN0ZXJfY2FsbGJhY2soJ3NtZF90aHVtYl9lZGl0JywgJ2ltYWdlX3VpJywgJ3RodW1ibmFp bF9lZGl0Jyk7DQoJcmVnaXN0ZXJfY2FsbGJhY2soJ3NtZF90aHVtYl9jcmVhdGUnLCAnaW1h Z2VfdWknLCAndGh1bWJuYWlsX2NyZWF0ZScpOw0KCXJlZ2lzdGVyX2NhbGxiYWNrKCdzbWRf dGh1bWJfZ2VuZXJhdGUnLCAnaW1hZ2UnLCAnaW1hZ2VfZGF0YScpOw0KCXJlZ2lzdGVyX2Nh bGxiYWNrKCdzbWRfdGh1bWJfZGVsZXRlJywgJ2ltYWdlJywgJ2ltYWdlX2RlbGV0ZScpOw0K CXJlZ2lzdGVyX2NhbGxiYWNrKCdzbWRfdGh1bWJfY3JlYXRlX29uZScsICdpbWFnZScsICdz bWRfdGh1bWJfY3JlYXRlX29uZScpOw0KCXJlZ2lzdGVyX2NhbGxiYWNrKCdzbWRfdGh1bWJf c3dpdGNoX2FjdGl2ZScsICdpbWFnZScsICdzbWRfdGh1bWJfc3dpdGNoX2FjdGl2ZScpOw0K CXJlZ2lzdGVyX2NhbGxiYWNrKCdzbWRfdGh1bWJfc3dpdGNoX3ByZWYnLCAnaW1hZ2UnLCAn c21kX3RodW1iX3N3aXRjaF9wcmVmJyk7DQoJcmVnaXN0ZXJfY2FsbGJhY2soJ3NtZF90aHVt Yl9pbnNlcnQnLCAnaW1hZ2UnLCAnc21kX3RodW1ibmFpbF9pbnNlcnQnLCAxKTsNCg0KfSBl bHNlIHsNCglnbG9iYWwgJHBhdGhfdG9fc2l0ZSwgJGltZ19kaXI7DQoJaWYgKCFkZWZpbmVk KCdJTVBBVEgnKSkgew0KCQlkZWZpbmUoIklNUEFUSCIsJHBhdGhfdG9fc2l0ZS5EUy4kaW1n X2Rpci5EUyk7DQoJfQ0KfQ0KDQppZiAoIWRlZmluZWQoJ1NNRF9USFVNQicpKSB7DQoJZGVm aW5lKCJTTURfVEhVTUIiLCAnc21kX3RodW1ibmFpbCcpOw0KfQ0KaWYgKCFkZWZpbmVkKCdT TURfVEhVTUJfQUNUSVZFJykpIHsNCglkZWZpbmUoIlNNRF9USFVNQl9BQ1RJVkUiLCAxKTsN Cn0NCmlmICghZGVmaW5lZCgnU01EX1RIVU1CX0NST1AnKSkgew0KCWRlZmluZSgiU01EX1RI VU1CX0NST1AiLCAyKTsNCn0NCmlmICghZGVmaW5lZCgnU01EX1RIVU1CX1NIQVJQJykpIHsN CglkZWZpbmUoIlNNRF9USFVNQl9TSEFSUCIsIDQpOw0KfQ0KDQovLyAtLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpmdW5j dGlvbiBzbWRfdGh1bWJfd2VsY29tZSgkZXZ0LCAkc3RwKSB7DQoJc3dpdGNoICgkc3RwKSB7 DQoJCWNhc2UgJ2luc3RhbGxlZCc6DQoJCQlzbWRfdGh1bWJfdGFibGVfaW5zdGFsbCgpOw0K CQkJYnJlYWs7DQoJCWNhc2UgJ2RlbGV0ZWQnOg0KCQkJc21kX3RodW1iX3RhYmxlX3JlbW92 ZSgpOw0KCQkJYnJlYWs7DQoJfQ0KCXJldHVybjsNCn0NCg0KLy8gLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tDQovLyBEaXNwbGF5IHRoZSBkZXNpZ25hdGVkIGRlZmF1bHQgdGh1bWJuYWls IG9uIHRoZSBsaXN0IHBhZ2UNCmZ1bmN0aW9uIHNtZF90aHVtYnMoJGV2dCwgJHN0cCwgJGRm bHQsICRjdXJyaW1nKSB7DQoJZXh0cmFjdChncHNhKGFycmF5KCdwYWdlJywgJ3NvcnQnLCAn ZGlyJywgJ2NyaXQnLCAnc2VhcmNoX21ldGhvZCcpKSk7DQoNCglpZiAoc21kX3RodW1iX3Rh YmxlX2V4aXN0KCkpIHsNCgkJJGRlZmF1bHQgPSBnZXRfcHJlZignc21kX3RodW1iX2RlZmF1 bHRfcHJvZmlsZScsICcnLCAxKTsNCgkJaWYgKCRkZWZhdWx0KSB7DQoJCQkkcm93ID0gc2Fm ZV9yb3coJyonLCBTTURfVEhVTUIsICJuYW1lPSciLnNhbml0aXplRm9yVXJsKCRkZWZhdWx0 KS4iJyIpOw0KCQkJaWYgKCRyb3cpIHsNCgkJCQkkZWRpdF91cmwgPSAnP2V2ZW50PWltYWdl Jy5hLidzdGVwPWltYWdlX2VkaXQnLmEuJ2lkPScuJGN1cnJpbWdbJ2lkJ10uYS4nc29ydD0n LiRzb3J0Lg0KCQkJCQkJYS4nZGlyPScuJGRpci5hLidwYWdlPScuJHBhZ2UuYS4nc2VhcmNo X21ldGhvZD0nLiRzZWFyY2hfbWV0aG9kLmEuJ2NyaXQ9Jy4kY3JpdDsNCgkJCQkkb3V0ID0g c21kX3RodW1iX2ltZygkcm93LCAkY3VycmltZyk7DQoJCQkJcmV0dXJuICgkb3V0KSA/IGhy ZWYoJG91dCwgJGVkaXRfdXJsKSA6IGdUeHQoJ25vJyk7DQoJCQl9IGVsc2Ugew0KCQkJCXJl dHVybiBnVHh0KCdubycpOw0KCQkJfQ0KCQl9IGVsc2Ugew0KCQkJcmV0dXJuIGdUeHQoJ25v Jyk7DQoJCX0NCgl9DQp9DQoNCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8gRG9u J3Qgd2FudCB0aGUgJ2NyZWF0ZScgY29udHJvbHMgYXMgdGhleSdyZSBoYW5kbGVkIGluIHRo ZSBlZGl0IHBvcnRpb24gb2YgdGhlIHNjcmVlbg0KZnVuY3Rpb24gc21kX3RodW1iX2NyZWF0 ZSgkZXZ0LCAkc3RwLCAkZGZsdCwgJGN1cnJpbWcpIHsNCglyZXR1cm4gJyAnOw0KfQ0KDQov LyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vIFdpdGggYSBsb3Qgb2YgaW1hZ2VzIGlu IHRoZSBkYXRhYmFzZSwgZG9pbmcgaXQgYWxsIGluIG9uZSBoaXQgd291bGQgdGltZSBvdXQu DQovLyBTbyBpdCdzIGRvbmUgdmlhIGFqYXg7IG9uZSByZXF1ZXN0IHBlciBpbWFnZQ0KZnVu Y3Rpb24gc21kX3RodW1iX2NyZWF0ZV9hbGwoKSB7DQoJJGltYWdlcyA9IHNhZmVfY29sdW1u KCdpZCcsICd0eHBfaW1hZ2UnLCAnMT0xJyk7DQoJJGNvdW50ID0gY291bnQoJGltYWdlcyk7 DQoNCgllY2hvICc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+JzsNCgllY2hvICJ2 YXIgYmN0ciA9IDA7IHZhciBidG90ID0geyRjb3VudH07IjsNCgllY2hvICdqUXVlcnkoZnVu Y3Rpb24oKSB7JzsNCgllY2hvICdqUXVlcnkoIiNzbWRfdGh1bWJfYnRvdCIpLnRleHQoIi8n LiRjb3VudC4nIik7JzsNCglmb3JlYWNoICgkaW1hZ2VzIGFzICRpbWcpIHsNCgkJZWNobyA8 PDxFT0pTDQoJCXNlbmRBc3luY0V2ZW50KA0KCQl7DQoJCQlldmVudDogdGV4dHBhdHRlcm4u ZXZlbnQsDQoJCQlzdGVwOiAnc21kX3RodW1iX2NyZWF0ZV9vbmUnLA0KCQkJc21kX3RodW1i X2ltZ2lkOiB7JGltZ30NCgkJfSwgc21kX2NyZWF0ZV9hbGxfZmVlZGJhY2spOw0KRU9KUzsN Cgl9DQoJZWNobyAnfSk7JzsNCgllY2hvIDw8PEVPSlMNCglmdW5jdGlvbiBzbWRfY3JlYXRl X2FsbF9mZWVkYmFjaygpIHsNCgkJYmN0cisrOw0KCQlqUXVlcnkoJyNzbWRfdGh1bWJfYmN1 cnInKS50ZXh0KGJjdHIpOw0KCQlpZiAoYmN0ciA+PSBidG90KSB7DQoJCQlqUXVlcnkoJyNz bWRfdGh1bWJfYmN1cnIsI3NtZF90aHVtYl9idG90JykuZW1wdHkoKTsNCgkJfQ0KCX0NCkVP SlM7DQoJZWNobyAnPC9zY3JpcHQ+JzsNCn0NCg0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tDQpmdW5jdGlvbiBzbWRfdGh1bWJfY3JlYXRlX29uZSgpIHsNCgkkY3VycmltZyA9IGdw cygnc21kX3RodW1iX2ltZ2lkJyk7DQoJYXNzZXJ0X2ludCgkY3VycmltZyk7DQoNCgkkcnMg PSBzYWZlX3Jvd3MoJyonLCBTTURfVEhVTUIsICcxPTEgQU5EIGZsYWdzICYgJy5TTURfVEhV TUJfQUNUSVZFKTsNCgkkY3VyciA9IHNhZmVfcm93KCcqJywgJ3R4cF9pbWFnZScsICJpZD0i LmRvU2xhc2goJGN1cnJpbWcpKTsNCglpZiAoJHJzKSB7DQoJCXNtZF90aHVtYl9tYWtlKCRy cywgJGN1cnIpOw0KCQlzZW5kX3htbF9yZXNwb25zZSgpOw0KCX0NCn0NCg0KLy8gLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tDQpmdW5jdGlvbiBzbWRfdGh1bWJfc3dpdGNoX2FjdGl2ZSgp IHsNCgkkbmFtZSA9IGRvU2xhc2goZ3BzKCdzbWRfdGh1bWJfcHJvZmlsZScpKTsNCglpZiAo JG5hbWUpIHsNCgkJc2FmZV91cGRhdGUoU01EX1RIVU1CLCAnZmxhZ3MgPSBmbGFncyBeICcu U01EX1RIVU1CX0FDVElWRSwgIm5hbWU9JyRuYW1lJyIpOw0KCQlzZW5kX3htbF9yZXNwb25z ZShhcnJheSgnc21kX3RodW1iX3Byb2ZpbGUnID0+ICRuYW1lKSk7DQoJfQ0KfQ0KDQovLyAt LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCmZ1bmN0aW9uIHNtZF90aHVtYl9zd2l0Y2hfcHJl ZigpIHsNCgkkbmFtZSA9IGRvU2xhc2goZ3BzKCdzbWRfdGh1bWJfdHhwdHlwZScpKTsNCgkk c3RhdGUgPSBkb1NsYXNoKGdwcygnc21kX3RodW1iX3N0YXRlJykpOw0KCWlmICgkbmFtZSkg ew0KCQlzZXRfcHJlZignc21kX3RodW1iXycuJG5hbWUsICRzdGF0ZSwgJ3NtZF90aHVtYics IFBSRUZfSElEREVOLCAndGV4dF9pbnB1dCcsIDAsIFBSRUZfUFJJVkFURSk7DQoJCXNlbmRf eG1sX3Jlc3BvbnNlKCk7DQoJfQ0KfQ0KDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0N CmZ1bmN0aW9uIHNtZF90aHVtYl9nZW5lcmF0ZSgkZXZ0LCAkc3RwKSB7DQoJJGlkID0gZG9T bGFzaChncHMoJ2lkJykpOw0KDQoJJGlkID0gKCRpZCkgPyAkaWQgOiAkR0xPQkFMU1snSUQn XTsNCgkkcnMgPSBzYWZlX3Jvd3MoJyonLCBTTURfVEhVTUIsICcxPTEgQU5EIGZsYWdzICYg Jy5TTURfVEhVTUJfQUNUSVZFKTsNCg0KCXNtZF90aHVtYl9tYWtlKCRycywgJGlkKTsNCn0N Cg0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpmdW5jdGlvbiBzbWRfdGh1bWJfZGVs ZXRlKCRldnQsICRzdHApIHsNCgkkaWRzID0gZ3BzKCdzZWxlY3RlZCcpOw0KCSRycyA9IHNh ZmVfcm93cygnKicsIFNNRF9USFVNQiwgJzE9MScpOw0KDQoJJGltYWdlcyA9IHNhZmVfcm93 cygnKicsICd0eHBfaW1hZ2UnLCAnaWQgSU4gKCcgLiBqb2luKCcsJyxxdW90ZV9saXN0KCRp ZHMpKSAuICcpJyk7DQoJZm9yZWFjaCAoJGltYWdlcyBhcyAkaW1nKSB7DQoJCXNtZF90aHVt Yl91bm1ha2UoJHJzLCAkaW1nKTsNCgl9DQp9DQoNCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQ0KZnVuY3Rpb24gc21kX3RodW1iX21ha2UoJHJzLCAkY3VycmltZykgew0KCS8vIFdy YXBwZXIgZm9yIHdldF90aHVtYiB0byBhbGxvdyBtdWx0aXBsZSB0aHVtYm5haWxzDQoJJG1z ZyA9ICcnOw0KCWlmICghY2xhc3NfZXhpc3RzKCdzbWRfdGh1bWInKSkgew0KCQljbGFzcyBz bWRfdGh1bWIgZXh0ZW5kcyB3ZXRfdGh1bWIgew0KCQkJdmFyICRtX2V4dDsNCgkJCXZhciAk bV9pZDsNCgkJCXZhciAkbV9kaXI7DQoJCQl2YXIgJG1fZGZsdDsNCgkJCXZhciAkd2lkdGg7 DQoJCQl2YXIgJGhlaWdodDsNCg0KCQkJLy8gQ29uc3RydWN0b3INCgkJCWZ1bmN0aW9uIHNt ZF90aHVtYiAoJGlkLCAkZGlyLCAkaW1nX3JvdywgJGlzX2RlZmF1bHQ9ZmFsc2UsICRwcm9f dz0nJywgJHByb19oPScnKSB7DQoJCQkJJGlkID0gYXNzZXJ0X2ludCgkaWQpOw0KCQkJCWlm ICgkaW1nX3Jvdykgew0KCQkJCQlleHRyYWN0KCRpbWdfcm93KTsNCgkJCQkJJHRoaXMtPm1f aWQgPSAkaWQ7DQoJCQkJCSR0aGlzLT5tX2V4dCA9ICRleHQ7DQoJCQkJCSR0aGlzLT5tX2Rp ciA9ICRkaXI7DQoJCQkJCSR0aGlzLT53aWR0aCA9ICRwcm9fdzsNCgkJCQkJJHRoaXMtPmhl aWdodCA9ICRwcm9faDsNCgkJCQkJJHRoaXMtPm1fZGZsdCA9ICRpc19kZWZhdWx0Ow0KCQkJ CX0NCgkJCQkkdGhpcy0+d2V0X3RodW1iKCk7IC8vIGNvbnN0cnVjdCBiYXNlIGNsYXNzIGlu c3RhbmNlDQoJCQl9DQoNCgkJCWZ1bmN0aW9uIHdyaXRlKCkgew0KCQkJCWlmICggIWlzc2V0 KCR0aGlzLT5tX2V4dCkgKSByZXR1cm4gZmFsc2U7DQoNCgkJCQkkaW5maWxlID0gSU1QQVRI LiR0aGlzLT5tX2lkLiR0aGlzLT5tX2V4dDsNCgkJCQkkb3V0ZmlsZSA9IElNUEFUSC4kdGhp cy0+bV9kaXIuRFMuJHRoaXMtPm1faWQuJHRoaXMtPm1fZXh0Ow0KDQoJCQkJLy8gSWYgdGhp cyBpcyB0aGUgZGVmYXVsdCBwcm9maWxlIGFuZCB0aGUgcHJlZiBpbmRpY2F0ZXMsIHdyaXRl IGEgVFhQIHRodW1iIHRvbw0KCQkJCWlmICgoJHRoaXMtPm1fZGZsdCA9PSB0cnVlKSAmJiAo Z2V0X3ByZWYoJ3NtZF90aHVtYl90eHBfY3JlYXRlJywgJzAnKSkpIHsNCgkJCQkJJHR4cF90 aHVtYiA9IElNUEFUSC4kdGhpcy0+bV9pZC4ndCcuJHRoaXMtPm1fZXh0Ow0KCQkJCQlpZiAo IHBhcmVudDo6d3JpdGUgKCAkaW5maWxlLCAkdHhwX3RodW1iICkgKSB7DQoJCQkJCQlzYWZl X3VwZGF0ZSgndHhwX2ltYWdlJywgInRodW1ibmFpbCA9IDEsIHRodW1iX3cgPSAkdGhpcy0+ d2lkdGgsIHRodW1iX2ggPSAkdGhpcy0+aGVpZ2h0IiwgJ2lkID0gJy4kdGhpcy0+bV9pZCk7 DQoJCQkJCQljaG1vZCgkb3V0ZmlsZSwgMDY0NCk7DQoJCQkJCX0NCgkJCQl9DQoNCgkJCQlp ZiAoIHBhcmVudDo6d3JpdGUgKCAkaW5maWxlLCAkb3V0ZmlsZSApICkgew0KCQkJCQljaG1v ZCgkb3V0ZmlsZSwgMDY0NCk7DQoJCQkJCXJldHVybiB0cnVlOw0KCQkJCX0NCgkJCQlyZXR1 cm4gZmFsc2U7DQoJCQl9DQoJCX0NCgl9DQoNCgkvLyBJZiBwYXNzZWQgb25seSBhbiBJRCwg bG9vayB1cCB0aGUgcmVzdCBvZiB0aGUgaW1hZ2UgZGF0YQ0KCWlmICghaXNfYXJyYXkoJGN1 cnJpbWcpKSB7DQoJCWFzc2VydF9pbnQoJGN1cnJpbWcpOw0KCQkkY3VycmltZyA9IHNhZmVf cm93KCcqJywgJ3R4cF9pbWFnZScsICdpZD0nLiRjdXJyaW1nKTsNCgl9DQoNCgkvLyBDcmVh dGUgZWFjaCB0aHVtYm5haWwNCgkkcHJvX2RmbHQgPSBnZXRfcHJlZignc21kX3RodW1iX2Rl ZmF1bHRfcHJvZmlsZScsICcnKTsNCglmb3JlYWNoICgkcnMgYXMgJHJvdykgew0KCQkvLyBT YW5pdGl6ZSBhIGxpdHRsZQ0KCQkkd2lkdGggPSAoaW50KSAkcm93Wyd3aWR0aCddOw0KCQkk aGVpZ2h0ID0gKGludCkgJHJvd1snaGVpZ2h0J107DQoJCWlmICgkd2lkdGggPT0gMCkgJHdp ZHRoID0gJyc7DQoJCWlmICgkaGVpZ2h0ID09IDApICRoZWlnaHQgPSAnJzsNCgkJaWYgKCR3 aWR0aCA9PT0gJycgJiYgJGhlaWdodCA9PT0gJycpIGNvbnRpbnVlOw0KCQkkYWN0aXZlID0g KCRyb3dbJ2ZsYWdzJ10gJiBTTURfVEhVTUJfQUNUSVZFKSA/IDEgOiAwOw0KCQkkY3JvcCA9 ICgkcm93WydmbGFncyddICYgU01EX1RIVU1CX0NST1ApID8gMSA6IDA7DQoJCSRzaGFycGVu ID0gKCRyb3dbJ2ZsYWdzJ10gJiBTTURfVEhVTUJfU0hBUlApID8gMSA6IDA7DQoJCSRpZCA9 ICRjdXJyaW1nWydpZCddOw0KCQkkaXNfZGZsdCA9ICgkcm93WyduYW1lJ10gPT0gJHByb19k Zmx0KSA/IHRydWUgOiBmYWxzZTsNCg0KCQkkdCA9IG5ldyBzbWRfdGh1bWIoJGlkLCBzYW5p dGl6ZUZvclVybCgkcm93WyduYW1lJ10pLCAkY3VycmltZywgJGlzX2RmbHQpOw0KCQkkdC0+ Y3JvcCA9ICgkY3JvcCA9PSAnMScpOw0KCQkkdC0+c2hhcnBlbiA9ICgkc2hhcnBlbiA9PSAn MScpOw0KCQkkdC0+aGludCA9ICcwJzsNCgkJJHQtPndpZHRoID0gJHdpZHRoOw0KCQkkdC0+ aGVpZ2h0ID0gJGhlaWdodDsNCgkJJHQtPnF1YWxpdHkgPSAkcm93WydxdWFsaXR5J107DQoJ CWlmICgkdC0+d3JpdGUoKSkgew0KCQkJJG1zZyA9IGdUeHQoJ3RodW1ibmFpbF9zYXZlZCcs IGFycmF5KCd7aWR9JyA9PiAkaWQpKTsNCgkJfSBlbHNlIHsNCgkJCSRtc2cgPSBhcnJheShn VHh0KCd0aHVtYm5haWxfbm90X3NhdmVkJywgYXJyYXkoJ3tpZH0nID0+ICRpZCkpLCBFX0VS Uk9SKTsNCgkJfQ0KCX0NCglyZXR1cm4gJG1zZzsNCn0NCg0KLy8gLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tDQpmdW5jdGlvbiBzbWRfdGh1bWJfdW5tYWtlKCRycywgJGN1cnJpbWcpIHsN CgkkaWQgPSAkY3VycmltZ1snaWQnXTsNCgkkZXh0ID0gJGN1cnJpbWdbJ2V4dCddOw0KCSRw cm9fZGZsdCA9IGdldF9wcmVmKCdzbWRfdGh1bWJfZGVmYXVsdF9wcm9maWxlJywgJycpOw0K CSR0eHBfZGVsID0gZ2V0X3ByZWYoJ3NtZF90aHVtYl90eHBfZGVsZXRlJywgJzAnKTsNCg0K CWZvcmVhY2ggKCRycyBhcyAkcm93KSB7DQoJCSRwYXRoID0gSU1QQVRILnNhbml0aXplRm9y VXJsKCRyb3dbJ25hbWUnXSkuRFMuJGlkLiRleHQ7DQoJCWlmIChmaWxlX2V4aXN0cygkcGF0 aCkpIHsNCgkJCXVubGluaygkcGF0aCk7DQoJCX0NCg0KCQkvLyBBbHNvIHJlbW92ZSBUWFAn cyBidWlsdC1pbiB0aHVtYj8NCgkJaWYgKCgkcm93WyduYW1lJ10gPT0gJHByb19kZmx0KSAm JiAoJHR4cF9kZWwgPT0gJzEnKSkgew0KCQkJJHBhdGggPSBJTVBBVEguJGlkLid0Jy4kZXh0 Ow0KCQkJaWYgKGZpbGVfZXhpc3RzKCRwYXRoKSkgew0KCQkJCXNhZmVfdXBkYXRlKCd0eHBf aW1hZ2UnLCAidGh1bWJuYWlsID0gMCwgdGh1bWJfdyA9IDAsIHRodW1iX2ggPSAwIiwgJ2lk ID0gJy4kaWQpOw0KCQkJCXVubGluaygkcGF0aCk7DQoJCQl9DQoJCX0NCgl9DQoJcmV0dXJu ICcnOw0KfQ0KDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCmZ1bmN0aW9uIHNtZF90 aHVtYl9pbnNlcnQoKSB7DQoJZ2xvYmFsICR0eHBjZmcsJHR4cF91c2VyLCRpbWdfZGlyLCRw YXRoX3RvX3NpdGUsICRwYWdlLCAkc29ydCwgJGRpciwgJGNyaXQsICRzZWFyY2hfbWV0aG9k Ow0KDQoJaWYgKCFkZWZpbmVkKCdJTVBBVEgnKSkgew0KCQlkZWZpbmUoJ0lNUEFUSCcsJHBh dGhfdG9fc2l0ZS5EUy4kaW1nX2Rpci5EUyk7DQoJfQ0KDQoJZXh0cmFjdChncHNhKGFycmF5 KCdwYWdlJywgJ3NvcnQnLCAnZGlyJywgJ2NyaXQnLCAnc2VhcmNoX21ldGhvZCcpKSk7DQoN CglpbmNsdWRlX29uY2UgdHhwYXRoLicvbGliL3R4cGxpYl9taXNjLnBocCc7DQoNCglleHRy YWN0KCR0eHBjZmcpOw0KCSRpZCA9IGFzc2VydF9pbnQoZ3BzKCdpZCcpKTsNCgkkcHJvZmls ZSA9IGdwcygnc21kX3RodW1iX3Byb2ZpbGUnKTsNCgkkdGh1bWJfZXh0ID0gZ3BzKCdzbWRf dGh1bWJfZXh0Jyk7DQoNCgkkYXV0aG9yID0gZmV0Y2goJ2F1dGhvcicsICd0eHBfaW1hZ2Un LCAnaWQnLCAkaWQpOw0KCWlmICghaGFzX3ByaXZzKCdpbWFnZS5lZGl0JykgJiYgISgkYXV0 aG9yID09ICR0eHBfdXNlciAmJiBoYXNfcHJpdnMoJ2ltYWdlLmVkaXQub3duJykpKSB7DQoJ CXJldHVybjsNCgl9DQoNCgkkZmlsZSA9ICRfRklMRVNbJ3RoZWZpbGUnXVsndG1wX25hbWUn XTsNCgkkbmFtZSA9ICRfRklMRVNbJ3RoZWZpbGUnXVsnbmFtZSddOw0KDQoJJGZpbGUgPSBn ZXRfdXBsb2FkZWRfZmlsZSgkZmlsZSk7DQoNCglpZiAoZW1wdHkoJGZpbGUpKQ0KCXsNCgkJ cmV0dXJuOw0KCX0NCg0KCWxpc3QoJHcsICRoLCAkZXh0ZW5zaW9uKSA9IGdldGltYWdlc2l6 ZSgkZmlsZSk7DQoJJHZhbGlkX2V4dHMgPSBhcnJheSgNCgkJSU1BR0VUWVBFX0dJRiAgPT4g Jy5naWYnLA0KCQlJTUFHRVRZUEVfSlBFRyA9PiAnLmpwZycsDQoJCUlNQUdFVFlQRV9QTkcg ID0+ICcucG5nJywNCgkJSU1BR0VUWVBFX1NXRiAgPT4gJy5zd2YnLA0KCSk7DQoJJGV4dCA9 IGlzc2V0KCR2YWxpZF9leHRzWyRleHRlbnNpb25dKSA/ICR2YWxpZF9leHRzWyRleHRlbnNp b25dIDogJyc7DQoNCglpZiAoKCRmaWxlICE9PSBmYWxzZSkgJiYgJHByb2ZpbGUgJiYgJGV4 dCkgew0KCQkkbmV3cGF0aCA9IElNUEFUSC5zYW5pdGl6ZUZvclVybCgkcHJvZmlsZSkuRFMu JGlkLiRleHQ7DQoJCWlmIChzaGlmdF91cGxvYWRlZF9maWxlKCRmaWxlLCAkbmV3cGF0aCkg PT0gZmFsc2UpIHsNCgkJfSBlbHNlIHsNCgkJCWNobW9kKCRuZXdwYXRoLCAwNjQ0KTsNCgkJ CSRtZXNzYWdlID0gZ1R4dCgnaW1hZ2VfdXBsb2FkZWQnLCBhcnJheSgne25hbWV9JyA9PiAk bmFtZSkpOw0KCQl9DQoJfQ0KDQoJLy8gU2luY2UgdGhlIGhlYWRlcnMgaGF2ZSBiZWVuIHNl bnQsIHJlc29ydCB0byBqcyB0byByZWZyZXNoIHRoZSBwYWdlDQoJJHVybCA9ICc/ZXZlbnQ9 aW1hZ2Umc3RlcD1pbWFnZV9lZGl0JmlkPScuJGlkLicmc29ydD0nLiRzb3J0LicmZGlyPScu JGRpci4nJnBhZ2U9Jy4kcGFnZS4nJnNlYXJjaF9tZXRob2Q9Jy4kc2VhcmNoX21ldGhvZC4n JmNyaXQ9Jy4kY3JpdDsNCgllY2hvIDw8PEVPUw0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFz Y3JpcHQiPg0Kd2luZG93LmxvY2F0aW9uLmhyZWY9InskdXJsfSI7DQo8L3NjcmlwdD4NCjxu b3NjcmlwdD4NCjxtZXRhIGh0dHAtZXF1aXY9InJlZnJlc2giIGNvbnRlbnQ9IjA7dXJsPXsk dXJsfSIgLz4NCjwvbm9zY3JpcHQ+DQpFT1M7DQoJZXhpdDsNCn0NCg0KLy8gLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tDQpmdW5jdGlvbiBzbWRfdGh1bWJfZWRpdCgkZXZ0LCAkc3RwLCAk ZGZsdCwgJGN1cnJpbWcpIHsNCglnbG9iYWwgJHN0ZXAsICRmaWxlX21heF91cGxvYWRfc2l6 ZSwgJHR4cF91c2VyOw0KDQoJZXh0cmFjdChncHNhKGFycmF5KCdpZCcsICdwYWdlJywgJ3Nv cnQnLCAnZGlyJywgJ2NyaXQnLCAnc2VhcmNoX21ldGhvZCcsICdzbWRfdGh1bWJuYWlsX3Np emUnLCAnc21kX3RodW1ibmFpbF9jaG9zZW5fc2l6ZScsICdzbWRfdGh1bWJuYWlsX2RlbGV0 ZScsICdzbWRfc3RlcCcpKSk7DQoNCgkkaWQgPSAoJGlkKSA/ICRpZCA6ICRHTE9CQUxTWydJ RCddOw0KDQoJLy8gVG9nZ2xlIHByb2ZpbGUgcGFuZWwNCglpZiAoJHN0ZXAgPT0gJ3NhdmVf cGFuZV9zdGF0ZScpIHsNCgkJc21kX3RodW1ibmFpbF9zYXZlX3BhbmVfc3RhdGUoKTsNCgkJ cmV0dXJuOw0KCX0NCg0KCS8vIENyZWF0ZS9kZWxldGUgdGhlIHNlbGVjdGVkIHRodW1icyBk ZXBlbmRpbmcgb24gdGhlIGJ1dHRvbiBwcmVzc2VkDQoJaWYgKCRzbWRfc3RlcCA9PSAnc21k X3RodW1ibmFpbF9tYW5hZ2UnKSB7DQoJCS8vIFZhbGlkYXRlIHVzZXINCgkJJGF1dGhvciA9 IGZldGNoKCdhdXRob3InLCAndHhwX2ltYWdlJywgJ2lkJywgJGlkKTsNCgkJaWYgKCFoYXNf cHJpdnMoJ2ltYWdlLmVkaXQnKSAmJiAhKCRhdXRob3IgPT0gJHR4cF91c2VyICYmIGhhc19w cml2cygnaW1hZ2UuZWRpdC5vd24nKSkpDQoJCXsNCgkJCWltYWdlX2xpc3QoZ1R4dCgncmVz dHJpY3RlZF9hcmVhJykpOw0KCQkJcmV0dXJuOw0KCQl9DQoNCgkJLy8gR3JhYiB0aGUgdGh1 bWJuYWlscyB0byB3b3JrIG9uDQoJCSR3aGVyZSA9ICgkc21kX3RodW1ibmFpbF9zaXplPT0n YWxsJykgPyAnMT0xIEFORCBmbGFncyAmICcuU01EX1RIVU1CX0FDVElWRSA6ICJuYW1lPSci LmRvU2xhc2goJHNtZF90aHVtYm5haWxfY2hvc2VuX3NpemUpLiInIjsNCgkJJHJzID0gc2Fm ZV9yb3dzKCcqJywgU01EX1RIVU1CLCAkd2hlcmUpOw0KDQoJCS8vIERvIGl0DQoJCWlmKCRz bWRfdGh1bWJuYWlsX2RlbGV0ZSkgew0KCQkJJG1zZyA9IHNtZF90aHVtYl91bm1ha2UoJHJz LCAkY3VycmltZyk7DQoJCX0gZWxzZSB7DQoJCQkkbXNnID0gc21kX3RodW1iX21ha2UoJHJz LCAkY3VycmltZyk7DQoJCX0NCgl9DQoNCgkkZXh0ID0gJGN1cnJpbWdbJ2V4dCddOw0KCWVj aG8gPDw8RU9DDQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQpmdW5jdGlvbiBz bWRfdGh1bWJfc2VsZWN0b3Ioc2VsKSB7DQoJdmFyIGlkeCA9IDA7DQoJalF1ZXJ5KCIjc21k X3RodW1icyBpbWciKS5lYWNoKGZ1bmN0aW9uKCkgew0KCQlpZiAoalF1ZXJ5KHRoaXMpLmhh c0NsYXNzKHNlbCkpIHsNCgkJCWpRdWVyeSh0aGlzKS50b2dnbGVDbGFzcygnc21kX3NlbGVj dGVkJyk7DQoJCQlpZiAoalF1ZXJ5KHRoaXMpLmhhc0NsYXNzKCdzbWRfc2VsZWN0ZWQnKSkg ew0KCQkJCWpRdWVyeSgiI3NtZF91cGxvYWRfdGh1bWJuYWlsIikuYXR0cignZGlzYWJsZWQn LCBmYWxzZSk7DQoJCQkJalF1ZXJ5KCIjc21kX3RodW1iX3Byb2ZpbGUiKS52YWwoc2VsKTsN CgkJCQlpZHggPSBqUXVlcnkoIiNzbWRfdGh1bWJuYWlsX3NpemUgb3B0aW9uW3ZhbHVlPSci K3NlbCsiJ10iKS5pbmRleCgpOw0KCQkJCWpRdWVyeSgiI3NtZF90aHVtYm5haWxfY2hvc2Vu X3NpemUiKS52YWwoc2VsKTsNCgkJCX0gZWxzZSB7DQoJCQkJalF1ZXJ5KCIjc21kX3VwbG9h ZF90aHVtYm5haWwiKS5hdHRyKCdkaXNhYmxlZCcsIHRydWUpOw0KCQkJCWpRdWVyeSgiI3Nt ZF90aHVtYl9wcm9maWxlIikudmFsKCcnKTsNCgkJCQlqUXVlcnkoIiNzbWRfdGh1bWJuYWls X2Nob3Nlbl9zaXplIikudmFsKCcnKTsNCgkJCX0NCgkJfSBlbHNlIHsNCgkJCWpRdWVyeSh0 aGlzKS5yZW1vdmVDbGFzcygnc21kX3NlbGVjdGVkJyk7DQoJCX0NCgl9KTsNCglqUXVlcnko IiNzbWRfdGh1bWJuYWlsX3NpemUiKS5hdHRyKCJzZWxlY3RlZEluZGV4IiwgaWR4KTsNCn0N CmZ1bmN0aW9uIHNtZF90aHVtYl9zZWxlY3RfY2hhbmdlZCgpIHsNCglvYmogPSBqUXVlcnko IiNzbWRfdGh1bWJuYWlsX3NpemUiKTsNCglpZiAob2JqLmF0dHIoInNlbGVjdGVkSW5kZXgi KSA9PSAwKSB7DQoJCWpRdWVyeSgiI3NtZF91cGxvYWRfdGh1bWJuYWlsIikuYXR0cignZGlz YWJsZWQnLCB0cnVlKTsNCgkJalF1ZXJ5KCIjc21kX3RodW1iX3Byb2ZpbGUiKS52YWwoJycp Ow0KCQlqUXVlcnkoIiNzbWRfdGh1bWJuYWlsX2Nob3Nlbl9zaXplIikudmFsKCcnKTsNCgl9 IGVsc2Ugew0KCQlqUXVlcnkoIiNzbWRfdXBsb2FkX3RodW1ibmFpbCIpLmF0dHIoJ2Rpc2Fi bGVkJywgZmFsc2UpOw0KCQlqUXVlcnkoIiNzbWRfdGh1bWJfcHJvZmlsZSIpLnZhbChvYmou dmFsKCkpOw0KCQlqUXVlcnkoIiNzbWRfdGh1bWJuYWlsX2Nob3Nlbl9zaXplIikudmFsKG9i ai52YWwoKSk7DQoJfQ0KCWpRdWVyeSgiI3NtZF90aHVtYnMgaW1nIikuZWFjaChmdW5jdGlv bigpIHsNCgkJaWYgKGpRdWVyeSh0aGlzKS5oYXNDbGFzcyhvYmoudmFsKCkpKSB7DQoJCQlq UXVlcnkodGhpcykuYWRkQ2xhc3MoJ3NtZF9zZWxlY3RlZCcpOw0KCQl9IGVsc2Ugew0KCQkJ alF1ZXJ5KHRoaXMpLnJlbW92ZUNsYXNzKCdzbWRfc2VsZWN0ZWQnKTsNCgkJfQ0KCX0pOw0K fQ0KalF1ZXJ5KGZ1bmN0aW9uKCkgew0KCWpRdWVyeSgiI3NtZF90aHVtYnMgaW1nIikuZWFj aChmdW5jdGlvbigpIHsNCgkJdmFyIGNscyA9IGpRdWVyeSh0aGlzKS5hdHRyKCdjbGFzcycp Ow0KCQlqUXVlcnkodGhpcykuY2xpY2soZnVuY3Rpb24oKSB7DQoJCQlzbWRfdGh1bWJfc2Vs ZWN0b3IoY2xzKTsNCgkJfSk7DQoJfSk7DQoJalF1ZXJ5KCIjc21kX3VwbG9hZF90aHVtYm5h aWwiKS5hdHRyKCdkaXNhYmxlZCcsIHRydWUpOw0KCWpRdWVyeSgiLnRodW1ibmFpbC11cGxv YWQiKS5wcmVwZW5kKCc8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzbWRfdGh1bWJfaW1n aWQiIHZhbHVlPSJ7JGlkfSIgLz48aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0ic21kX3RodW1i X3Byb2ZpbGUiIG5hbWU9InNtZF90aHVtYl9wcm9maWxlIiB2YWx1ZT0iIiAvPjxpbnB1dCB0 eXBlPSJoaWRkZW4iIGlkPSJzbWRfdGh1bWJfZXh0IiBuYW1lPSJzbWRfdGh1bWJfZXh0IiB2 YWx1ZT0ieyRleHR9IiAvPicpOw0KfSk7DQo8L3NjcmlwdD4NCjxzdHlsZSB0eXBlPSJ0ZXh0 L2NzcyI+DQouc21kX3NlbGVjdGVkIHsNCglib3JkZXI6MXB4IHNvbGlkIHJlZDsNCgliYWNr Z3JvdW5kOnJlZDsNCn0NCiNzbWRfdGh1bWJzIGltZyB7DQoJcGFkZGluZzoycHg7DQoJbWFy Z2luOjFweDsNCglib3JkZXI6MXB4IHNvbGlkIGJsYWNrOw0KfQ0KLnRodW1ibmFpbC1hbHRl ciB7DQoJZGlzcGxheTpub25lOw0KfQ0KPC9zdHlsZT4NCkVPQzsNCg0KCS8vIEFkZCB0aHVt Ym5haWxzIGFuZCBjcmVhdGlvbiBjb250cm9scw0KCWlmIChzbWRfdGh1bWJfdGFibGVfZXhp c3QoKSkgew0KCQkkcnMgPSBzYWZlX3Jvd3MoJyonLCBTTURfVEhVTUIsICcxPTEgT1JERVIg QlkgbmFtZScpOw0KCQlpZiAoJHJzKSB7DQoJCQkkcHJvZmlsZXMgPSBhcnJheSgnYWxsJyA9 PiBzbWRfdGh1bWJfZ1R4dCgnYWxsX3NpemVzJykpOw0KCQkJJHRodW1ic1tdID0gJzxkaXYg aWQ9InNtZF90aHVtYnMiPic7DQoJCQlmb3JlYWNoICgkcnMgYXMgJHJvdykgew0KCQkJCWlm ICgkcm93WydmbGFncyddICYgU01EX1RIVU1CX0FDVElWRSkgew0KCQkJCQkkcHJvZmlsZXNb JHJvd1snbmFtZSddXSA9ICRyb3dbJ25hbWUnXTsNCgkJCQl9DQoJCQkJJHRodW1ic1tdID0g c21kX3RodW1iX2ltZygkcm93LCAkY3VycmltZyk7DQoJCQl9DQoJCQkkdGh1bWJzW10gPSAn PC9kaXY+JzsNCgkJCSRxcyA9IGFycmF5KA0KCQkJCSJldmVudCIgPT4gJ2ltYWdlJywNCgkJ CQkic3RlcCIgPT4gJ2ltYWdlX2VkaXQnLA0KCQkJCSJpZCIgPT4gJGlkLA0KCQkJCSJwYWdl IiA9PiAkcGFnZSwNCgkJCQkic29ydCIgPT4gJHNvcnQsDQoJCQkJImRpciIgPT4gJGRpciwN CgkJCQkiY3JpdCIgPT4gJGNyaXQsDQoJCQkJInNlYXJjaF9tZXRob2QiID0+ICRzZWFyY2hf bWV0aG9kLA0KCQkJKTsNCg0KCQkJJG91dFtdID0gJzxkaXYgaWQ9InNtZF90aHVtYm5haWxf Y29udHJvbCI+PHNwYW4gY2xhc3M9InBsYWluIGxldmVyJy4oZ2V0X3ByZWYoJ3BhbmVfc21k X3RodW1ibmFpbHNfdmlzaWJsZScpID8gJyBleHBhbmRlZCcgOiAnJykuJyI+PGEgaHJlZj0i I3NtZF90aHVtYm5haWxzIj4nLnNtZF90aHVtYl9nVHh0KCd0aHVtYm5haWxfaGVhZGluZycp Lic8L2E+PC9zcGFuPjxkaXYgaWQ9InNtZF90aHVtYm5haWxzIiBjbGFzcz0idG9nZ2xlIiBz dHlsZT0iZGlzcGxheTonLihnZXRfcHJlZigncGFuZV9zbWRfdGh1bWJuYWlsc192aXNpYmxl JykgPyAnYmxvY2snIDogJ25vbmUnKS4nIj4nOw0KCQkJJG91dFtdID0gJzxmb3JtIG5hbWU9 InNtZF90aHVtYm5haWxfY3JlYXRlIiBtZXRob2Q9InBvc3QiIGFjdGlvbj0iJy5qb2luX3Fz KCRxcykuJyI+JzsNCgkJCSRvdXRbXSA9IGZJbnB1dCgnaGlkZGVuJywgJ3NtZF9zdGVwJywg J3NtZF90aHVtYm5haWxfbWFuYWdlJyk7DQoJCQkkb3V0W10gPSBmSW5wdXQoJ2hpZGRlbics ICdzbWRfdGh1bWJuYWlsX2Nob3Nlbl9zaXplJywgJycsICcnLCAnJywgJycsICcnLCAnJywg J3NtZF90aHVtYm5haWxfY2hvc2VuX3NpemUnKTsNCgkJCSRvdXRbXSA9IHNlbGVjdElucHV0 KCdzbWRfdGh1bWJuYWlsX3NpemUnLCAkcHJvZmlsZXMsICcnLCAnJywgJ29uY2hhbmdlPSJy ZXR1cm4gc21kX3RodW1iX3NlbGVjdF9jaGFuZ2VkKCkiOycsICdzbWRfdGh1bWJuYWlsX3Np emUnKTsNCgkJCSRvdXRbXSA9IGZJbnB1dCgnc3VibWl0JywgJycsIGdUeHQoJ2NyZWF0ZScp LCAnc21hbGxlcmJveCcpOw0KCQkJJG91dFtdID0gZklucHV0KCdzdWJtaXQnLCAnc21kX3Ro dW1ibmFpbF9kZWxldGUnLCBnVHh0KCdkZWxldGUnKSwgJ3NtYWxsZXJib3gnKTsNCgkJCSRv dXRbXSA9IGpvaW4oJycsICR0aHVtYnMpOw0KCQkJJG91dFtdID0gJzwvZm9ybT4nOw0KCQkJ JG91dFtdID0gdXBsb2FkX2Zvcm0oZ1R4dCgndXBsb2FkX3RodW1ibmFpbCcpLCAndXBsb2Fk X3RodW1ibmFpbCcsICdzbWRfdGh1bWJuYWlsX2luc2VydCcsICdpbWFnZScsICRpZCwgJGZp bGVfbWF4X3VwbG9hZF9zaXplLCAnc21kX3VwbG9hZF90aHVtYm5haWwnLCAndGh1bWJuYWls LXVwbG9hZCcpOw0KCQkJJG91dFtdID0gJzwvZGl2Pic7DQoJCQlyZXR1cm4gam9pbignJywg JG91dCk7DQoJCX0NCgl9DQoJcmV0dXJuICcgJzsNCn0NCg0KLy8gLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tDQpmdW5jdGlvbiBzbWRfdGh1bWJfaW1nKCRyb3csICRjdXJyaW1nLCAkbWV0 YT1hcnJheSgpKSB7DQoJZ2xvYmFsICRpbWdfZGlyLCAkcHJlZnM7DQoNCgkkZGlyID0gc2Fu aXRpemVGb3JVcmwoJHJvd1snbmFtZSddKTsNCgkkaWQgPSAkY3VycmltZ1snaWQnXTsNCgkk ZXh0ID0gJGN1cnJpbWdbJ2V4dCddOw0KDQoJJHBhdGggPSBJTVBBVEguJGRpci5EUy4kaWQu JGV4dDsNCg0KCWlmIChmaWxlX2V4aXN0cygkcGF0aCkpIHsNCgkJJGV4dHJhcyA9ICcnOw0K CQlpZiAoaXNzZXQoJG1ldGFbJ2ZvcmNldyddKSB8fCBpc3NldCgkbWV0YVsnZm9yY2VoJ10p KSB7DQoJCQkkZGltcyA9IGdldGltYWdlc2l6ZSgkcGF0aCk7DQoJCQlpZiAoaXNzZXQoJG1l dGFbJ2ZvcmNldyddKSAmJiAhJHJvd1snd2lkdGgnXSkgew0KCQkJCSRyb3dbJ3dpZHRoJ10g PSAkZGltc1swXTsNCgkJCX0NCgkJCWlmIChpc3NldCgkbWV0YVsnZm9yY2VoJ10pICYmICEk cm93WydoZWlnaHQnXSkgew0KCQkJCSRyb3dbJ2hlaWdodCddID0gJGRpbXNbMV07DQoJCQl9 DQoJCQl1bnNldCgkbWV0YVsnZm9yY2V3J10pOw0KCQkJdW5zZXQoJG1ldGFbJ2ZvcmNlaCdd KTsNCgkJfQ0KCQkkdyA9ICgkcm93Wyd3aWR0aCddKSA/ICcgd2lkdGg9IicuJHJvd1snd2lk dGgnXS4nIic6ICcnOw0KCQkkaCA9ICgkcm93WydoZWlnaHQnXSkgPyAnIGhlaWdodD0iJy4k cm93WydoZWlnaHQnXS4nIic6ICcnOw0KDQoJCSR1RGF0ZSA9ICcnOw0KCQlpZiAoIWlzc2V0 KCRtZXRhWydzdGFtcCddKSkgew0KCQkJJHVEYXRlID0gJz8nLmZpbGVtdGltZSgkcGF0aCk7 DQoJCX0NCgkJdW5zZXQoJG1ldGFbJ3N0YW1wJ10pOw0KDQoJCWlmICghaXNzZXQoJG1ldGFb J2NsYXNzJ10pKSB7DQoJCQkkbWV0YVsnY2xhc3MnXSA9ICRkaXI7DQoJCX0NCg0KCQlmb3Jl YWNoICgkbWV0YSBhcyAka2V5ID0+ICR2YWwpIHsNCgkJCSRleHRyYXMgLj0gJyAnLiRrZXku Jz0iJy4kdmFsLiciJzsNCgkJfQ0KCQlyZXR1cm4gJzxpbWcgc3JjPSInLmlodS4kaW1nX2Rp ci4nLycuJGRpci4nLycuJGlkLiRleHQuJHVEYXRlLiciJy4kdy4kaC4kZXh0cmFzLicgLz4n Ow0KCX0NCg0KCXJldHVybiAnJzsNCn0NCg0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t DQpmdW5jdGlvbiBzbWRfdGh1bWJfcHJvZmlsZXMoJGV2dCwgJHN0cCwgJGRmbHQsICRpbWds aXN0KSB7DQoJZ2xvYmFsICRzbWRfdGh1bWJfZXZlbnQsICRwcmVmcywgJHN0ZXA7DQoNCglp ZiAoIWhhc19wcml2cyhfX0ZVTkNUSU9OX18pKSB7DQoJCXJldHVybjsNCgl9DQoNCglleHRy YWN0KGdwc2EoYXJyYXkoDQoJCSdwYWdlJywNCgkJJ3NvcnQnLA0KCQknZGlyJywNCgkJJ2Ny aXQnLA0KCQknc2VhcmNoX21ldGhvZCcsDQoJCSdzbWRfdGh1bWJfYWRkJywNCgkJJ3NtZF90 aHVtYl9jYW5jZWwnLA0KCQknc21kX3RodW1iX3NhdmUnLA0KCQknc21kX3RodW1iX25hbWUn LA0KCQknc21kX3RodW1iX25ld25hbWUnLA0KCQknc21kX3RodW1iX3dpZHRoJywNCgkJJ3Nt ZF90aHVtYl9oZWlnaHQnLA0KCQknc21kX3RodW1iX3F1YWxpdHknLA0KCQknc21kX3RodW1i X2FjdGl2ZScsDQoJCSdzbWRfdGh1bWJfYWN0aXZlX25ldycsDQoJCSdzbWRfdGh1bWJfY3Jv cCcsDQoJCSdzbWRfdGh1bWJfc2hhcnBlbicsDQoJCSdzbWRfdGh1bWJfZGVmYXVsdCcpKSk7 DQoNCgkvLyBTYW5pdGl6ZQ0KCSRxdWFsaXR5ID0gKGlzX251bWVyaWMoJHNtZF90aHVtYl9x dWFsaXR5KSkgPyAoKCRzbWRfdGh1bWJfcXVhbGl0eTwwKSA/IDc1IDogKCgkc21kX3RodW1i X3F1YWxpdHk+MTAwKSA/IDc1IDogJHNtZF90aHVtYl9xdWFsaXR5KSApIDogNzU7DQoJJHdp ZHRoID0gKGlzX251bWVyaWMoJHNtZF90aHVtYl93aWR0aCkpID8gJHNtZF90aHVtYl93aWR0 aCA6IDA7DQoJJGhlaWdodCA9IChpc19udW1lcmljKCRzbWRfdGh1bWJfaGVpZ2h0KSkgPyAk c21kX3RodW1iX2hlaWdodCA6IDA7DQoJJG5ld25hbWUgPSBzYW5pdGl6ZUZvclVybCgkc21k X3RodW1iX25ld25hbWUpOw0KCSRtc2cgPSAnJzsNCg0KCS8vIFRhYmxlIGNvbnRyb2wNCglp ZiAoZ3BzKCdyZW1vdmUnKSkgew0KCQlzbWRfdGh1bWJfdGFibGVfcmVtb3ZlKCk7DQoJfSBl bHNlIHsNCgkJaWYgKCFzbWRfdGh1bWJfdGFibGVfZXhpc3QoKSkgew0KCQkJc21kX3RodW1i X3RhYmxlX2luc3RhbGwoKTsNCgkJfQ0KCX0NCg0KCS8vIFRvZ2dsZSBwcm9maWxlIHBhbmVs DQoJaWYgKCRzdGVwID09ICdzYXZlX3BhbmVfc3RhdGUnKSB7DQoJCXNtZF90aHVtYm5haWxf c2F2ZV9wYW5lX3N0YXRlKCk7DQoJCXJldHVybjsNCgl9DQoNCglpZiAoJHN0ZXAgPT0gJ3Nt ZF90aHVtYl9jcmVhdGVfYWxsJykgew0KCQlzbWRfdGh1bWJfY3JlYXRlX2FsbCgpOw0KCX0N Cg0KCS8vIFNhdmUgcHJvZmlsZQ0KCWlmICgkc3RlcCA9PSAnc21kX3RodW1iX3Byb2ZpbGVf c2F2ZScpIHsNCgkJaWYgKHNtZF90aHVtYl90YWJsZV9leGlzdCgpKSB7DQoJCQlpZiAoJHNt ZF90aHVtYl9jYW5jZWwpIHsNCgkJCQkvLyBEbyBub3RoaW5nDQoJCQl9IGVsc2UgaWYgKCRz bWRfdGh1bWJfYWRkKSB7DQoJCQkJLy8gQ3JlYXRlIG5ldyBwcm9maWxlDQoJCQkJJGV4aXN0 cyA9IHNhZmVfcm93KCcqJywgU01EX1RIVU1CLCAibmFtZT0nIi5kb1NsYXNoKCRuZXduYW1l KS4iJyIpOw0KCQkJCWlmICgkZXhpc3RzKSB7DQoJCQkJCSRtc2cgPSBzbWRfdGh1bWJfZ1R4 dCgncHJvZmlsZV9leGlzdHMnLCBhcnJheSgne25hbWV9JyA9PiBkb1NsYXNoKCRuZXduYW1l KSkpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCWlmICgkbmV3bmFtZSkgew0KCQkJCQkJJGZsYWdz ID0gMDsNCgkJCQkJCSRmbGFncyA9ICgkc21kX3RodW1iX2FjdGl2ZV9uZXcpID8gJGZsYWdz IHwgU01EX1RIVU1CX0FDVElWRSA6ICRmbGFnczsNCgkJCQkJCSRmbGFncyA9ICgkc21kX3Ro dW1iX2Nyb3ApID8gJGZsYWdzIHwgU01EX1RIVU1CX0NST1AgOiAkZmxhZ3M7DQoJCQkJCQkk ZmxhZ3MgPSAoJHNtZF90aHVtYl9zaGFycGVuKSA/ICRmbGFncyB8IFNNRF9USFVNQl9TSEFS UCA6ICRmbGFnczsNCg0KCQkJCQkJc2FmZV9pbnNlcnQoU01EX1RIVU1CLA0KCQkJCQkJCSJu YW1lPSciLmRvU2xhc2goJG5ld25hbWUpLiInIi4NCgkJCQkJCQkiLCB3aWR0aD0nIi5kb1Ns YXNoKCR3aWR0aCkuIiciLg0KCQkJCQkJCSIsIGhlaWdodD0nIi5kb1NsYXNoKCRoZWlnaHQp LiInIi4NCgkJCQkJCQkiLCBxdWFsaXR5PSciLmRvU2xhc2goJHF1YWxpdHkpLiInIi4NCgkJ CQkJCQkiLCBmbGFncz0nIi5kb1NsYXNoKCRmbGFncykuIiciDQoJCQkJCQkpOw0KDQoJCQkJ CQkvLyBBbHRlciB0aGUgZGVmYXVsdCB0aHVtYm5haWwNCgkJCQkJCWlmICgkc21kX3RodW1i X2RlZmF1bHQpIHsNCgkJCQkJCQlzZXRfcHJlZignc21kX3RodW1iX2RlZmF1bHRfcHJvZmls ZScsICRuZXduYW1lLCAnc21kX3RodW1iJywgUFJFRl9ISURERU4pOw0KCQkJCQkJfQ0KDQoJ CQkJCQkvLyBDcmVhdGUgdGhlIHRodW1ibmFpbCBkaXJlY3RvcnkNCgkJCQkJCUBta2RpcihJ TVBBVEguJG5ld25hbWUpOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfSBlbHNlIHsNCgkJCQkvLyBV cGRhdGUgZXhpc3RpbmcgcHJvZmlsZQ0KCQkJCSRuYW1lID0gc2FuaXRpemVGb3JVcmwoJHNt ZF90aHVtYl9uYW1lKTsNCgkJCQkkZXhpc3RzID0gc2FmZV9yb3coJyonLCBTTURfVEhVTUIs ICJuYW1lPSciLmRvU2xhc2goJG5ld25hbWUpLiInIik7DQoJCQkJaWYgKCRleGlzdHMgJiYg c3RydG9sb3dlcigkbmV3bmFtZSkgIT0gc3RydG9sb3dlcigkbmFtZSkpIHsNCgkJCQkJJG1z ZyA9IHNtZF90aHVtYl9nVHh0KCdwcm9maWxlX2V4aXN0cycsIGFycmF5KCd7bmFtZX0nID0+ IGRvU2xhc2goJG5ld25hbWUpKSk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJaWYgKCRuZXduYW1l KSB7DQoJCQkJCQkkZmxhZ3MgPSAwOw0KCQkJCQkJJGZsYWdzID0gKCRzbWRfdGh1bWJfYWN0 aXZlKSA/ICRmbGFncyB8IFNNRF9USFVNQl9BQ1RJVkUgOiAkZmxhZ3M7DQoJCQkJCQkkZmxh Z3MgPSAoJHNtZF90aHVtYl9jcm9wKSA/ICRmbGFncyB8IFNNRF9USFVNQl9DUk9QIDogJGZs YWdzOw0KCQkJCQkJJGZsYWdzID0gKCRzbWRfdGh1bWJfc2hhcnBlbikgPyAkZmxhZ3MgfCBT TURfVEhVTUJfU0hBUlAgOiAkZmxhZ3M7DQoNCgkJCQkJCXNhZmVfdXBkYXRlKA0KCQkJCQkJ CVNNRF9USFVNQiwNCgkJCQkJCQkibmFtZT0nIi5kb1NsYXNoKCRuZXduYW1lKS4iJyINCgkJ CQkJCQkJLiIsIHdpZHRoPSciLmRvU2xhc2goJHdpZHRoKS4iJyINCgkJCQkJCQkJLiIsIGhl aWdodD0nIi5kb1NsYXNoKCRoZWlnaHQpLiInIg0KCQkJCQkJCQkuIiwgcXVhbGl0eT0nIi5k b1NsYXNoKCRxdWFsaXR5KS4iJyINCgkJCQkJCQkJLiIsIGZsYWdzPSciLmRvU2xhc2goJGZs YWdzKS4iJyINCgkJCQkJCQksICJuYW1lPSciLmRvU2xhc2goJG5hbWUpLiInIg0KCQkJCQkJ KTsNCg0KCQkJCQkJLy8gQWx0ZXIgdGhlIGRlZmF1bHQgdGh1bWJuYWlsDQoJCQkJCQlpZiAo JHNtZF90aHVtYl9kZWZhdWx0KSB7DQoJCQkJCQkJc2V0X3ByZWYoJ3NtZF90aHVtYl9kZWZh dWx0X3Byb2ZpbGUnLCAkbmV3bmFtZSwgJ3NtZF90aHVtYicsIFBSRUZfSElEREVOKTsNCgkJ CQkJCX0gZWxzZSB7DQoJCQkJCQkJLy8gUmVtb3ZlIHRoZSBkZWZhdWx0IGZsYWcgaWYgdGhp cyB1c2VkIHRvIGJlIHRoZSBkZWZhdWx0DQoJCQkJCQkJaWYgKGdldF9wcmVmKCdzbWRfdGh1 bWJfZGVmYXVsdF9wcm9maWxlJykgPT0gZG9TbGFzaCgkbmFtZSkpIHsNCgkJCQkJCQkJc2V0 X3ByZWYoJ3NtZF90aHVtYl9kZWZhdWx0X3Byb2ZpbGUnLCAnJywgJ3NtZF90aHVtYicsIFBS RUZfSElEREVOKTsNCgkJCQkJCQl9DQoJCQkJCQl9DQoNCgkJCQkJCS8vIEFkanVzdCB0aGUg dGh1bWJuYWlsIGRpcmVjdG9yeSBpZiB0aGUgbmFtZSBoYXMgY2hhbmdlZA0KCQkJCQkJaWYg KCRuZXduYW1lICE9ICRuYW1lKSB7DQoJCQkJCQkJcmVuYW1lKElNUEFUSC4kbmFtZSwgSU1Q QVRILiRuZXduYW1lKTsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJfSBlbHNl IHsNCgkJCSRtc2cgPSBzbWRfdGh1bWJfZ1R4dCgndGFibGVzX25vdF9pbnN0YWxsZWQnKTsN CgkJfQ0KCX0NCg0KCS8vIERlbGV0ZSBwcm9maWxlDQoJaWYgKCRzdGVwID09ICdzbWRfdGh1 bWJfcHJvZmlsZV9kZWxldGUnKSB7DQoJCWlmIChzbWRfdGh1bWJfdGFibGVfZXhpc3QoKSkg ew0KCQkJJHR4cF9kZWwgPSBnZXRfcHJlZignc21kX3RodW1iX3R4cF9kZWxldGUnKTsNCgkJ CSR0aGVfZGZsdCA9IGdldF9wcmVmKCdzbWRfdGh1bWJfZGVmYXVsdF9wcm9maWxlJywgJycs IDEpOw0KDQoJCQlpZiAoIWVtcHR5KCRzbWRfdGh1bWJfbmFtZSkpIHsNCgkJCQkkbmFtZSA9 IHNhbml0aXplRm9yVXJsKCRzbWRfdGh1bWJfbmFtZSk7DQoJCQkJJHJldCA9IHNhZmVfZGVs ZXRlKFNNRF9USFVNQiwgIm5hbWU9JyIuZG9TbGFzaCgkbmFtZSkuIiciKTsNCgkJCQlpZiAo JHJldCkgew0KCQkJCQlzbWRfdGh1bWJfcm1kaXIoSU1QQVRILiRuYW1lKTsNCg0KCQkJCQkv LyBEZWxldGUgYWxsIFRYUCB0aHVtYnMgdG9vPw0KCQkJCQlpZiAoKCRuYW1lID09ICR0aGVf ZGZsdCkgJiYgKCR0eHBfZGVsID09ICcxJykpIHsNCgkJCQkJCSRycyA9IHNhZmVfcm93cygn aWQsIGV4dCcsICd0eHBfaW1hZ2UnLCAndGh1bWJuYWlsID0gMScpOw0KCQkJCQkJZm9yZWFj aCAoJHJzIGFzICRyb3cpIHsNCgkJCQkJCQkkcGF0aCA9IElNUEFUSC4kcm93WydpZCddLid0 Jy4kcm93WydleHQnXTsNCgkJCQkJCQlpZiAoZmlsZV9leGlzdHMoJHBhdGgpKSB7DQoJCQkJ CQkJCXVubGluaygkcGF0aCk7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQkJc2FmZV91cGRh dGUoJ3R4cF9pbWFnZScsICd0aHVtYm5haWwgPSAwLCB0aHVtYl93ID0gMCwgdGh1bWJfaCA9 IDAnLCAndGh1bWJuYWlsID0gMScpOw0KCQkJCQl9DQoNCgkJCQkJLy8gUmVtb3ZlIHRoZSBk ZWZhdWx0IGZsYWcgaWYgdGhpcyB1c2VkIHRvIGJlIHRoZSBkZWZhdWx0DQoJCQkJCWlmIChn ZXRfcHJlZignc21kX3RodW1iX2RlZmF1bHRfcHJvZmlsZScpID09IGRvU2xhc2goJG5hbWUp KSB7DQoJCQkJCQlzZXRfcHJlZignc21kX3RodW1iX2RlZmF1bHRfcHJvZmlsZScsICcnLCAn c21kX3RodW1iJywgUFJFRl9ISURERU4pOw0KCQkJCQl9DQoNCgkJCQkJJG1zZyA9IHNtZF90 aHVtYl9nVHh0KCdwcm9maWxlX2RlbGV0ZWQnLCBhcnJheSgne25hbWV9JyA9PiBkb1NsYXNo KCRuYW1lKSkpOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCX0NCg0KCSRxcyA9IGFycmF5KA0KCQki ZXZlbnQiID0+ICdpbWFnZScsDQoJCSJwYWdlIiA9PiAkcGFnZSwNCgkJInNvcnQiID0+ICRz b3J0LA0KCQkiZGlyIiA9PiAkZGlyLA0KCQkiY3JpdCIgPT4gJGNyaXQsDQoJCSJzZWFyY2hf bWV0aG9kIiA9PiAkc2VhcmNoX21ldGhvZCwNCgkpOw0KDQoJJGVkaXRGb2N1cyA9ICgkc3Rl cCA9PSAnc21kX3RodW1iX3Byb2ZpbGVfZWRpdCcpID8gJ2pRdWVyeSgiI3NtZF90aHVtYl9w cm9maWxlX2VkaXRlZCBpbnB1dFtuYW1lPVwnc21kX3RodW1iX25ld25hbWVcJ10iKS5mb2N1 cygpOycgOiAnJzsNCg0KCWVjaG8gPDw8RU9DDQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNj cmlwdCI+DQpmdW5jdGlvbiBzbWRfdGh1bWJfdG9nZ2xlbmV3KCkgew0KCWJveCA9IGpRdWVy eSgiI3NtZF90aHVtYl9wcm9maWxlX2NyZWF0ZSIpOw0KCWlmIChib3guY3NzKCJkaXNwbGF5 IikgPT0gIm5vbmUiKSB7DQoJCWJveC5zaG93KCk7DQoJfSBlbHNlIHsNCgkJYm94LmhpZGUo KTsNCgl9DQoJalF1ZXJ5KCJpbnB1dC5zbWRfZm9jdXMiKS5mb2N1cygpOw0KCXJldHVybiBm YWxzZTsNCn0NCmZ1bmN0aW9uIHNtZF90aHVtYl9zd2l0Y2hfYWN0aXZlKG5hbWUpIHsNCglz ZW5kQXN5bmNFdmVudCgNCgl7DQoJCWV2ZW50OiB0ZXh0cGF0dGVybi5ldmVudCwNCgkJc3Rl cDogJ3NtZF90aHVtYl9zd2l0Y2hfYWN0aXZlJywNCgkJc21kX3RodW1iX3Byb2ZpbGU6IG5h bWUNCgl9LCBzbWRfdGh1bWJfc3dpdGNoX2FjdGl2ZV9kb25lKTsNCn0NCmZ1bmN0aW9uIHNt ZF90aHVtYl9zd2l0Y2hfYWN0aXZlX2RvbmUoZGF0YSkgew0KCXZhciBzbWRfdGh1bWJfcHJv ZmlsZSA9IGpRdWVyeSgnI3NtZF90aHVtYl9wcm9maWxlXycralF1ZXJ5KGRhdGEpLmZpbmQo J3NtZF90aHVtYl9wcm9maWxlJykuYXR0cigndmFsdWUnKSk7DQoJc21kX3RodW1iX3Byb2Zp bGUudG9nZ2xlQ2xhc3MoJ3NtZF9pbmFjdGl2ZScpOw0KCWlmIChzbWRfdGh1bWJfcHJvZmls ZS5oYXNDbGFzcygnc21kX2luYWN0aXZlJykpIHsNCgkJc21kX3RodW1iX3Byb2ZpbGUuZmlu ZCgnaW5wdXQ6Y2hlY2tib3gnKS5yZW1vdmVBdHRyKCdjaGVja2VkJyk7DQoJfSBlbHNlIHsN CgkJc21kX3RodW1iX3Byb2ZpbGUuZmluZCgnaW5wdXQ6Y2hlY2tib3gnKS5hdHRyKCdjaGVj a2VkJywgJ2NoZWNrZWQnKTsNCiAgCQkJfQ0KfQ0KZnVuY3Rpb24gc21kX3RodW1iX3N3aXRj aF9wcmVmKG9iaiwgbmFtZSkgew0KCXZhciBzdGF0ZSA9IChqUXVlcnkob2JqKS5hdHRyKCdj aGVja2VkJykpID8gMSA6IDA7DQoJc2VuZEFzeW5jRXZlbnQoDQoJew0KCQlldmVudDogdGV4 dHBhdHRlcm4uZXZlbnQsDQoJCXN0ZXA6ICdzbWRfdGh1bWJfc3dpdGNoX3ByZWYnLA0KCQlz bWRfdGh1bWJfdHhwdHlwZTogbmFtZSwNCgkJc21kX3RodW1iX3N0YXRlOiBzdGF0ZQ0KCX0p Ow0KfQ0KDQpqUXVlcnkoZnVuY3Rpb24oKSB7DQoJalF1ZXJ5KCcuc21kX3RodW1iX2hlYWRp bmdfYWN0aXZlJykuY2xpY2soZnVuY3Rpb24oKSB7DQoJCWpRdWVyeSgnLnNtZF90aHVtYl9y b3cgaW5wdXQ6Y2hlY2tib3gnKS5lYWNoKGZ1bmN0aW9uKCkgew0KCQkJc21kX3RodW1iX3N3 aXRjaF9hY3RpdmUoalF1ZXJ5KHRoaXMpLnBhcmVudCgpLmF0dHIoJ2NsYXNzJykpOw0KCQl9 KTsNCgl9KTsNCgl7JGVkaXRGb2N1c30NCn0pOw0KPC9zY3JpcHQ+DQo8c3R5bGUgdHlwZT0i dGV4dC9jc3MiPg0KLnNtZF9oaWRkZW4gew0KCWRpc3BsYXk6bm9uZTsNCn0NCiNzbWRfdGh1 bWJfcHJvZmlsZXMgew0KCXdpZHRoOjcwMHB4Ow0KCW1hcmdpbjowIGF1dG8gMThweDsNCglw b3NpdGlvbjpyZWxhdGl2ZTsNCn0NCiNzbWRfdGh1bWJfYmF0Y2ggew0KCWZsb2F0OnJpZ2h0 Ow0KfQ0KLnNtZF9pbmFjdGl2ZSB7DQoJYmFja2dyb3VuZDojZTZlNmU2Ow0KCWNvbG9yOiM5 OTk7DQp9DQouc21kX3RodW1iX2hlYWRpbmdfYWN0aXZlIHsNCgljdXJzb3I6cG9pbnRlcjsN Cn0NCiNzbWRfdGh1bWJfcHJvZmlsZV9mb3JtIHsNCglwYWRkaW5nLXRvcDo4cHg7DQp9DQpm b3JtI3NtZF90aHVtYl9wcm9maWxlX2Zvcm0gdGQgew0KCWJvcmRlcjogMDsNCn0NCi5zbWRf dGh1bWJfZXJyb3Igew0KCXBvc2l0aW9uOmFic29sdXRlOw0KCXJpZ2h0OjEwMHB4Ow0KCXRl eHQtYWxpZ246Y2VudGVyOw0KCWJvcmRlcjoxcHggc29saWQgcmVkOw0KCWJhY2tncm91bmQ6 I2ZmYzsNCglwYWRkaW5nOjNweDsNCn0NCjwvc3R5bGU+DQpFT0M7DQoNCgkkbmV3YnRuID0g JzxhIHN0eWxlPSJtYXJnaW4tbGVmdDotNXB4OyIgY2xhc3M9Im5hdmxpbmsiIGhyZWY9IiMi IG9uY2xpY2s9InJldHVybiBzbWRfdGh1bWJfdG9nZ2xlbmV3KCk7Ij4nLnNtZF90aHVtYl9n VHh0KCduZXcnKS4nPC9hPiZuYnNwOyc7DQoJJGFsbGJ0biA9ICc8YSBjbGFzcz0ibmF2bGlu ayIgaHJlZj0iJy5qb2luX3FzKCRxcykuJyYjMzg7c3RlcD1zbWRfdGh1bWJfY3JlYXRlX2Fs bCI+Jy5zbWRfdGh1bWJfZ1R4dCgnYWxsX3RodW1icycpLic8L2E+JzsNCg0KCSRoZWFkaW5n cyA9IG4udHIoDQoJCW4uY29sdW1uX2hlYWQoJ25hbWUnLCAnbmFtZScsICdpbWFnZScsIGZh bHNlLCAnYXNjJykuDQoJCWNvbHVtbl9oZWFkKCd0aHVtYl93aWR0aCcsICd3aWR0aCcsICdp bWFnZScsIGZhbHNlKS4NCgkJY29sdW1uX2hlYWQoJ3RodW1iX2hlaWdodCcsICdoZWlnaHQn LCAnaW1hZ2UnLCBmYWxzZSkuDQoJCWNvbHVtbl9oZWFkKHNtZF90aHVtYl9nVHh0KCdxdWFs aXR5JyksICdxdWFsaXR5JywgJ2ltYWdlJywgZmFsc2UpLg0KCQljb2x1bW5faGVhZCgna2Vl cF9zcXVhcmVfcGl4ZWxzJywgJ2Nyb3AnLCAnaW1hZ2UnLCBmYWxzZSkuDQoJCWNvbHVtbl9o ZWFkKHNtZF90aHVtYl9nVHh0KCdzaGFycGVuJyksICdzaGFycGVuJywgJ2ltYWdlJywgZmFs c2UpLg0KCQljb2x1bW5faGVhZCgnYWN0aXZlJywgJ2FjdGl2ZScsICdpbWFnZScsIGZhbHNl LCAnJywgJycsICcnLCAnc21kX3RodW1iX2hlYWRpbmdfYWN0aXZlJykuDQoJCWNvbHVtbl9o ZWFkKCdkZWZhdWx0JywgJ2RlZmF1bHQnLCAnaW1hZ2UnLCBmYWxzZSkuDQoJCWNvbHVtbl9o ZWFkKHNtZF90aHVtYl9nVHh0KCdhY3Rpb25zJyksICdhY3Rpb25zJywgJ2ltYWdlJywgZmFs c2UpDQoJKTsNCg0KCSRvdXRbXSA9ICc8ZmllbGRzZXQgaWQ9InNtZF90aHVtYl9wcm9maWxl cyI+PGxlZ2VuZCBjbGFzcz0icGxhaW4gbGV2ZXInLihnZXRfcHJlZigncGFuZV9zbWRfdGh1 bWJuYWlsX3Byb2ZpbGVzX3Zpc2libGUnKSA/ICcgZXhwYW5kZWQnIDogJycpLiciPjxhIGhy ZWY9IiNzbWRfdGh1bWJuYWlsX3Byb2ZpbGVzIj4nLnNtZF90aHVtYl9nVHh0KCdwcm9maWxl X2hlYWRpbmcnKS4nPC9hPjwvbGVnZW5kPjxkaXYgaWQ9InNtZF90aHVtYl9iYXRjaCI+PHNw YW4gaWQ9InNtZF90aHVtYl9iY3VyciI+PC9zcGFuPjxzcGFuIGlkPSJzbWRfdGh1bWJfYnRv dCI+PC9zcGFuPjwvZGl2PjxkaXYgaWQ9InNtZF90aHVtYm5haWxfcHJvZmlsZXMiIGNsYXNz PSJ0b2dnbGUiIHN0eWxlPSJkaXNwbGF5OicuKGdldF9wcmVmKCdwYW5lX3NtZF90aHVtYm5h aWxfcHJvZmlsZXNfdmlzaWJsZScpID8gJ2Jsb2NrJyA6ICdub25lJykuJyI+JzsNCgkkb3V0 W10gPSAkbXNnID8gJzxkaXYgY2xhc3M9InNtZF90aHVtYl9lcnJvciI+Jy4kbXNnLic8L2Rp dj4nIDogJyc7DQoNCgkvLyBNYWluIGxpc3Qgb2YgcHJvZmlsZXMNCgkkb3V0W10gPSAnPGZv cm0gbWV0aG9kPSJwb3N0IiBuYW1lPSJzbWRfdGh1bWJfcHJvZmlsZV9mb3JtIiBpZD0ic21k X3RodW1iX3Byb2ZpbGVfZm9ybSIgYWN0aW9uPSInLmpvaW5fcXMoJHFzKS4nIj4nOw0KCSRv dXRbXSA9IHN0YXJ0VGFibGUoJ2xpc3QnKTsNCgkkb3V0W10gPSB0cih0ZGEoJG5ld2J0bi4k YWxsYnRuLCAnIGNvbHNwYW49IjgiJykpOw0KCSRvdXRbXSA9ICRoZWFkaW5nczsNCg0KCWlm IChzbWRfdGh1bWJfdGFibGVfZXhpc3QoKSkgew0KCQkkcnMgPSBzYWZlX3Jvd3MoJyonLCBT TURfVEhVTUIsICcxPTEgT1JERVIgQlkgbmFtZScpOw0KCQkkcHJvX2RmbHQgPSBnZXRfcHJl Zignc21kX3RodW1iX2RlZmF1bHRfcHJvZmlsZScsICcnLCAxKTsNCg0KCQkvLyBOZXcgUHJv ZmlsZSByb3cNCgkJJG91dFtdPSAnPHRyIGlkPSJzbWRfdGh1bWJfcHJvZmlsZV9jcmVhdGUi IGNsYXNzPSJzbWRfaGlkZGVuIj4nOw0KCQkkb3V0W10gPSB0ZChzSW5wdXQoJ3NtZF90aHVt Yl9wcm9maWxlX3NhdmUnKS5mSW5wdXQoJ3RleHQnLCAnc21kX3RodW1iX25ld25hbWUnLCAo KCRzdGVwPT0nc21kX3RodW1iX3Byb2ZpbGVfc2F2ZScpID8gJHNtZF90aHVtYl9uYW1lIDog JycpLCAnc21kX2ZvY3VzJykpDQoJCQkudGQoZklucHV0KCd0ZXh0JywgJ3NtZF90aHVtYl93 aWR0aCcsICgoJHN0ZXA9PSdzbWRfdGh1bWJfcHJvZmlsZV9zYXZlJykgPyAkd2lkdGggOiAn JyksICcnLCAnJywgJycsICc0JykpDQoJCQkudGQoZklucHV0KCd0ZXh0JywgJ3NtZF90aHVt Yl9oZWlnaHQnLCAoKCRzdGVwPT0nc21kX3RodW1iX3Byb2ZpbGVfc2F2ZScpID8gJGhlaWdo dCA6ICcnKSwgJycsICcnLCAnJywgJzQnKSkNCgkJCS50ZChmSW5wdXQoJ3RleHQnLCAnc21k X3RodW1iX3F1YWxpdHknLCAoKCRzdGVwPT0nc21kX3RodW1iX3Byb2ZpbGVfc2F2ZScpID8g JHF1YWxpdHkgOiAnJyksICcnLCAnJywgJycsICc0JykpDQoJCQkudGQoY2hlY2tib3goJ3Nt ZF90aHVtYl9jcm9wJywgJzEnLCAoKCRzdGVwPT0nc21kX3RodW1iX3Byb2ZpbGVfc2F2ZScp ID8gJHNtZF90aHVtYl9jcm9wIDogMCkpKQ0KCQkJLnRkKGNoZWNrYm94KCdzbWRfdGh1bWJf c2hhcnBlbicsICcxJywgKCgkc3RlcD09J3NtZF90aHVtYl9wcm9maWxlX3NhdmUnKSA/ICRz bWRfdGh1bWJfc2hhcnBlbiA6IDApKSkNCgkJCS50ZChjaGVja2JveCgnc21kX3RodW1iX2Fj dGl2ZV9uZXcnLCAnMScsIDEpKQ0KCQkJLnRkKGNoZWNrYm94KCdzbWRfdGh1bWJfZGVmYXVs dCcsICcxJywgMCkpDQoJCQkudGQoZklucHV0KCdzdWJtaXQnLCAnc21kX3RodW1iX2FkZCcs IGdUeHQoJ2FkZCcpLCAnc21hbGxlcmJveCcpKTsNCgkJJG91dFtdPSAnPC90cj4nOw0KDQoJ CS8vIFJlbWFpbmluZyByb3dzDQoJCWZvcmVhY2ggKCRycyBhcyAkcm93KSB7DQoJCQkkbGlu a19lZHQgPSBqb2luX3FzKCRxcykuJyYjMzg7c3RlcD1zbWRfdGh1bWJfcHJvZmlsZV9lZGl0 JiMzODtzbWRfdGh1bWJfbmFtZT0nLiRyb3dbJ25hbWUnXTsNCgkJCSRsaW5rX2RlbCA9IGpv aW5fcXMoJHFzKS4nJiMzODtzdGVwPXNtZF90aHVtYl9wcm9maWxlX2RlbGV0ZSYjMzg7c21k X3RodW1iX25hbWU9Jy4kcm93WyduYW1lJ107DQoJCQkkYnRuRWR0ID0gJzxhIGhyZWY9Iicu JGxpbmtfZWR0LiciPlsnIC4gZ1R4dCgnZWRpdCcpIC4gJ108L2E+JzsNCgkJCSRidG5EZWwg PSAnPGEgaHJlZj0iJy4kbGlua19kZWwuJyIgb25jbGljaz0icmV0dXJuIGNvbmZpcm0oXCcn LnNtZF90aHVtYl9nVHh0KCdkZWxldGVfY29uZmlybScsIGFycmF5KCJ7bmFtZX0iID0+ICRy b3dbJ25hbWUnXSkpLidcJyk7Ij5bJyAuIGdUeHQoJ2RlbGV0ZScpIC4gJ108L2E+JzsNCgkJ CSRhY3RpdmUgPSAoJHJvd1snZmxhZ3MnXSAmIFNNRF9USFVNQl9BQ1RJVkUpID8gMSA6IDA7 DQoJCQkkY3JvcCA9ICgkcm93WydmbGFncyddICYgU01EX1RIVU1CX0NST1ApID8gMSA6IDA7 DQoJCQkkc2hhcnBlbiA9ICgkcm93WydmbGFncyddICYgU01EX1RIVU1CX1NIQVJQKSA/IDEg OiAwOw0KDQoJCQlpZiAoJHN0ZXAgPT0gJ3NtZF90aHVtYl9wcm9maWxlX2VkaXQnICYmICRy b3dbJ25hbWUnXSA9PSAkc21kX3RodW1iX25hbWUpIHsNCgkJCQkkYnRuU2F2ZSA9IGZJbnB1 dCgnc3VibWl0JywgJ3NtZF90aHVtYl9zYXZlJywgZ1R4dCgnU2F2ZScpLCAnc21hbGxlcmJv eCcpOw0KCQkJCSRidG5DYW5jZWwgPSBmSW5wdXQoJ3N1Ym1pdCcsICdzbWRfdGh1bWJfY2Fu Y2VsJywgZ1R4dCgnQ2FuY2VsJyksICdzbWFsbGVyYm94Jyk7DQoJCQkJJG91dFtdID0gdHIo DQoJCQkJCXRkKGhJbnB1dCgnc21kX3RodW1iX25hbWUnLCAkcm93WyduYW1lJ10pLmZJbnB1 dCgndGV4dCcsICdzbWRfdGh1bWJfbmV3bmFtZScsICRyb3dbJ25hbWUnXSkpDQoJCQkJCS50 ZChmSW5wdXQoJ3RleHQnLCAnc21kX3RodW1iX3dpZHRoJywgJHJvd1snd2lkdGgnXSwgJycs ICcnLCAnJywgJzQnKSkNCgkJCQkJLnRkKGZJbnB1dCgndGV4dCcsICdzbWRfdGh1bWJfaGVp Z2h0JywgJHJvd1snaGVpZ2h0J10sICcnLCAnJywgJycsICc0JykpDQoJCQkJCS50ZChmSW5w dXQoJ3RleHQnLCAnc21kX3RodW1iX3F1YWxpdHknLCAkcm93WydxdWFsaXR5J10sICcnLCAn JywgJycsICc0JykpDQoJCQkJCS50ZChjaGVja2JveCgnc21kX3RodW1iX2Nyb3AnLCAnMScs ICRjcm9wKSkNCgkJCQkJLnRkKGNoZWNrYm94KCdzbWRfdGh1bWJfc2hhcnBlbicsICcxJywg JHNoYXJwZW4pKQ0KCQkJCQkudGQoY2hlY2tib3goJ3NtZF90aHVtYl9hY3RpdmUnLCAnMScs ICRhY3RpdmUpLCAnJywgJHJvd1snbmFtZSddKQ0KCQkJCQkudGQoY2hlY2tib3goJ3NtZF90 aHVtYl9kZWZhdWx0JywgJzEnLCAoKCRyb3dbJ25hbWUnXSA9PSAkcHJvX2RmbHQpID8gMSA6 IDApKSkNCgkJCQkJLnRkKCRidG5TYXZlLiRidG5DYW5jZWwpDQoJCQkJLCAnIGlkPSJzbWRf dGh1bWJfcHJvZmlsZV9lZGl0ZWQiJyk7DQoJCQl9IGVsc2Ugew0KCQkJCSRvdXRbXSA9IHRy KA0KCQkJCQl0ZChocmVmKCRyb3dbJ25hbWUnXSwgJGxpbmtfZWR0KSkuDQoJCQkJCXRkKCRy b3dbJ3dpZHRoJ10pLg0KCQkJCQl0ZCgkcm93WydoZWlnaHQnXSkuDQoJCQkJCXRkKCRyb3db J3F1YWxpdHknXSkuDQoJCQkJCXRkKCgkY3JvcCkgPyBnVHh0KCd5ZXMnKSA6IGdUeHQoJ25v JykpLg0KCQkJCQl0ZCgoJHNoYXJwZW4pID8gZ1R4dCgneWVzJykgOiBnVHh0KCdubycpKS4N CgkJCQkJdGQoJzxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0ic21kX3RodW1iX2FjdGl2 ZV8nLiRyb3dbJ25hbWUnXS4nIiB2YWx1ZT0iMSInLigoJGFjdGl2ZSkgPyAnIiBjaGVja2Vk PSJjaGVja2VkIicgOiAnJykuICcgY2xhc3M9ImNoZWNrYm94IiBvbmNoYW5nZT0ic21kX3Ro dW1iX3N3aXRjaF9hY3RpdmUoXCcnLiRyb3dbJ25hbWUnXS4nXCcpOyIgLz4nLCAnJywgJHJv d1snbmFtZSddKS4NCgkJCQkJdGQoKCRyb3dbJ25hbWUnXSA9PSAkcHJvX2RmbHQpID8gZ1R4 dCgneWVzJykgOiBnVHh0KCdubycpKS4NCgkJCQkJdGQoJGJ0bkRlbCkNCgkJCQksICcgaWQ9 InNtZF90aHVtYl9wcm9maWxlXycuJHJvd1snbmFtZSddLiciIGNsYXNzPSJzbWRfdGh1bWJf cm93JyAuICgoJGFjdGl2ZSkgPyAnJyA6ICcgc21kX2luYWN0aXZlJykuJyInKTsNCgkJCX0N CgkJfQ0KCX0NCg0KCWlmICgkcHJvX2RmbHQpIHsNCgkJJHR4cF9jID0gZ2V0X3ByZWYoJ3Nt ZF90aHVtYl90eHBfY3JlYXRlJyk7DQoJCSR0eHBfZCA9IGdldF9wcmVmKCdzbWRfdGh1bWJf dHhwX2RlbGV0ZScpOw0KCQkkb3V0W10gPSB0cigNCgkJCXRkKCcmbmJzcDsnKS4NCgkJCXRk Y3MoDQoJCQkJc21kX3RodW1iX2dUeHQoJ3R4cF9kZWZhdWx0X3N5bmMnKSAuDQoJCQkJJzxp bnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0ic21kX3RodW1iX3R4cF9jcmVhdGUiIHZhbHVl PSIxIicuKCgkdHhwX2MpID8gJyIgY2hlY2tlZD0iY2hlY2tlZCInIDogJycpLiAnIGNsYXNz PSJjaGVja2JveCIgb25jaGFuZ2U9InNtZF90aHVtYl9zd2l0Y2hfcHJlZih0aGlzLCBcJ3R4 cF9jcmVhdGVcJyk7IiAvPicuDQoJCQkJc21kX3RodW1iX2dUeHQoJ2NyZWF0ZScpLg0KCQkJ CSc8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InNtZF90aHVtYl90eHBfZGVsZXRlIiB2 YWx1ZT0iMSInLigoJHR4cF9kKSA/ICciIGNoZWNrZWQ9ImNoZWNrZWQiJyA6ICcnKS4gJyBj bGFzcz0iY2hlY2tib3giIG9uY2hhbmdlPSJzbWRfdGh1bWJfc3dpdGNoX3ByZWYodGhpcywg XCd0eHBfZGVsZXRlXCcpOyIgLz4nLg0KCQkJCXNtZF90aHVtYl9nVHh0KCdkZWxldGUnKQ0K CQkJLCA4KSk7DQoJfQ0KDQoJJG91dFtdID0gZW5kVGFibGUoJycpOw0KCSRvdXRbXSA9ICc8 L2Rpdj48L2Zvcm0+PC9maWVsZHNldD4nOw0KDQoJcmV0dXJuIGpvaW4oJycsICRvdXQpOw0K fQ0KDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vIERlbGV0ZSBhIHRodW1ibmFp bCBkaXJlY3RvcnkgYW5kIGl0cyBjb250ZW50cw0KZnVuY3Rpb24gc21kX3RodW1iX3JtZGly KCRkaXIpIHsNCglpZiAoaXNfZGlyKCRkaXIpKSB7DQoJCSRvYmplY3RzID0gc2NhbmRpcigk ZGlyKTsNCgkJZm9yZWFjaCAoJG9iamVjdHMgYXMgJG9iamVjdCkgew0KCQkJaWYgKCRvYmpl Y3QgIT0gIi4iICYmICRvYmplY3QgIT0gIi4uIikgew0KCQkJCWlmIChmaWxldHlwZSgkZGly LkRTLiRvYmplY3QpID09ICJkaXIiKSBzbWRfdGh1bWJfcm1kaXIoJGRpci5EUy4kb2JqZWN0 KTsgZWxzZSB1bmxpbmsoJGRpci5EUy4kb2JqZWN0KTsNCgkJCX0NCgkJfQ0KCQlyZXNldCgk b2JqZWN0cyk7DQoJCXJtZGlyKCRkaXIpOw0KCX0NCn0NCg0KLy8gLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tDQovLyBBZGQgdGh1bWJuYWlsIHRhYmxlIGlmIG5vdCBhbHJlYWR5IGluc3Rh bGxlZA0KLy8gRmxhZ3M6IEJpdCAwPUFjdGl2ZSAvIDE9Q3JvcCAvIDIgPSBTaGFycGVuDQpm dW5jdGlvbiBzbWRfdGh1bWJfdGFibGVfaW5zdGFsbCgpIHsNCgkkR0xPQkFMU1sndHhwX2Vy cl9jb3VudCddID0gMDsNCgkkcmV0ID0gJyc7DQoJJHNxbCA9IGFycmF5KCk7DQoJJHNxbFtd ID0gIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIGAiLlBGWC5TTURfVEhVTUIuImAgKA0K CQlgbmFtZWAgdmFyY2hhcigzMikgTk9UIE5VTEwgZGVmYXVsdCAnJywNCgkJYHdpZHRoYCBp bnQoNCkgTk9UIE5VTEwgZGVmYXVsdCAnMCcsDQoJCWBoZWlnaHRgIGludCg0KSBOT1QgTlVM TCBkZWZhdWx0ICcwJywNCgkJYHF1YWxpdHlgIHRpbnlpbnQoMikgTlVMTCBkZWZhdWx0ICc3 NScsDQoJCWBmbGFnc2AgdGlueWludCgyKSBOT1QgTlVMTCBkZWZhdWx0ICcwJywNCgkJUFJJ TUFSWSBLRVkgKGBuYW1lYCkNCgkpIEVOR0lORT1NeUlTQU0iOw0KDQoJaWYoZ3BzKCdkZWJ1 ZycpKSB7DQoJCWRtcCgkc3FsKTsNCgl9DQoJZm9yZWFjaCAoJHNxbCBhcyAkcXJ5KSB7DQoJ CSRyZXQgPSBzYWZlX3F1ZXJ5KCRxcnkpOw0KCQlpZiAoJHJldD09PWZhbHNlKSB7DQoJCQkk R0xPQkFMU1sndHhwX2Vycl9jb3VudCddKys7DQoJCQllY2hvICI8Yj4iLiRHTE9CQUxTWyd0 eHBfZXJyX2NvdW50J10uIi48L2I+ICIubXlzcWxfZXJyb3IoKS4iPGJyIC8+XG4iOw0KCQkJ ZWNobyAiPCEtLVxuICRxcnkgXG4tLT5cbiI7DQoJCX0NCgl9DQoNCgkvLyBCYWNrdXAgdGhl IGN1cnJlbnQgdGh1bWIgcHJlZnMNCgkkZXhpc3RzID0gc2FmZV9yb3coJyonLCAndHhwX3By ZWZzJywgIm5hbWU9J3NtZF90aHVtYl9iYWNrdXBfdyciKTsNCglpZiAoISRleGlzdHMpIHsN CgkJc2V0X3ByZWYoJ3NtZF90aHVtYl9iYWNrdXBfdycsIGdldF9wcmVmKCd0aHVtYl93Jyks ICdzbWRfdGh1bWInLCBQUkVGX0hJRERFTiwgJ3RleHRfaW5wdXQnLCAwKTsNCgkJc2V0X3By ZWYoJ3NtZF90aHVtYl9iYWNrdXBfaCcsIGdldF9wcmVmKCd0aHVtYl9oJyksICdzbWRfdGh1 bWInLCBQUkVGX0hJRERFTiwgJ3RleHRfaW5wdXQnLCAxKTsNCgkJc2V0X3ByZWYoJ3NtZF90 aHVtYl9iYWNrdXBfYycsIGdldF9wcmVmKCd0aHVtYl9jcm9wJyksICdzbWRfdGh1bWInLCBQ UkVGX0hJRERFTiwgJ3RleHRfaW5wdXQnLCAyKTsNCg0KCQkvLyBFcmFzZSB0aGUgY3VycmVu dCB0aHVtYiBwcmVmcw0KCQlzZXRfcHJlZigndGh1bWJfdycsICcnLCAnaW1hZ2UnLCBQUkVG X0hJRERFTik7DQoJCXNldF9wcmVmKCd0aHVtYl9oJywgJycsICdpbWFnZScsIFBSRUZfSElE REVOKTsNCgkJc2V0X3ByZWYoJ3RodW1iX2Nyb3AnLCAnJywgJ2ltYWdlJywgUFJFRl9ISURE RU4pOw0KCX0NCn0NCg0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyBEcm9wIHRh YmxlIGlmIGluIGRhdGFiYXNlDQpmdW5jdGlvbiBzbWRfdGh1bWJfdGFibGVfcmVtb3ZlKCkg ew0KCSRyZXQgPSAnJzsNCgkkc3FsID0gYXJyYXkoKTsNCgkkR0xPQkFMU1sndHhwX2Vycl9j b3VudCddID0gMDsNCglpZiAoc21kX3RodW1iX3RhYmxlX2V4aXN0KCkpIHsNCgkJJHNxbFtd ID0gIkRST1AgVEFCTEUgSUYgRVhJU1RTICIgLlBGWC5TTURfVEhVTUIuICI7ICI7DQoJCWlm KGdwcygnZGVidWcnKSkgew0KCQkJZG1wKCRzcWwpOw0KCQl9DQoJCWZvcmVhY2ggKCRzcWwg YXMgJHFyeSkgew0KCQkJJHJldCA9IHNhZmVfcXVlcnkoJHFyeSk7DQoJCQlpZiAoJHJldD09 PWZhbHNlKSB7DQoJCQkJJEdMT0JBTFNbJ3R4cF9lcnJfY291bnQnXSsrOw0KCQkJCWVjaG8g IjxiPiIuJEdMT0JBTFNbJ3R4cF9lcnJfY291bnQnXS4iLjwvYj4gIi5teXNxbF9lcnJvcigp LiI8YnIgLz5cbiI7DQoJCQkJZWNobyAiPCEtLVxuICRxcnkgXG4tLT5cbiI7DQoJCQl9DQoJ CX0NCgl9DQoNCgkvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCB0aHVtYiBwcmVmcw0KCSRleGlz dHMgPSBzYWZlX3JvdygnKicsICd0eHBfcHJlZnMnLCAibmFtZT0nc21kX3RodW1iX2JhY2t1 cF93JyIpOw0KCWlmICgkZXhpc3RzKSB7DQoJCXNldF9wcmVmKCd0aHVtYl93JywgZ2V0X3By ZWYoJ3NtZF90aHVtYl9iYWNrdXBfdycpLCAnaW1hZ2UnLCBQUkVGX0hJRERFTik7DQoJCXNl dF9wcmVmKCd0aHVtYl9oJywgZ2V0X3ByZWYoJ3NtZF90aHVtYl9iYWNrdXBfaCcpLCAnaW1h Z2UnLCBQUkVGX0hJRERFTik7DQoJCXNldF9wcmVmKCd0aHVtYl9jcm9wJywgZ2V0X3ByZWYo J3NtZF90aHVtYl9iYWNrdXBfYycpLCAnaW1hZ2UnLCBQUkVGX0hJRERFTik7DQoNCgl9DQoJ Ly8gRXJhc2UgdGhlIGJhY2t1cCB0aHVtYiBwcmVmcw0KCXNhZmVfZGVsZXRlKCd0eHBfcHJl ZnMnLCAibmFtZSBJTignc21kX3RodW1iX2JhY2t1cF93JywgJ3NtZF90aHVtYl9iYWNrdXBf aCcsICdzbWRfdGh1bWJfYmFja3VwX2MnLCAnc21kX3RodW1iX2RlZmF1bHRfcHJvZmlsZScs ICdwYW5lX3NtZF90aHVtYm5haWxfcHJvZmlsZXNfdmlzaWJsZScsICdwYW5lX3NtZF90aHVt Ym5haWxzX3Zpc2libGUnKSIpOw0KfQ0KDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0N CmZ1bmN0aW9uIHNtZF90aHVtYl90YWJsZV9leGlzdCgkYWxsPScnKSB7DQoJaWYgKCRhbGwp IHsNCgkJJHRibHMgPSBhcnJheShTTURfVEhVTUIgPT4gNSk7DQoJCSRvdXQgPSBjb3VudCgk dGJscyk7DQoJCWZvcmVhY2ggKCR0YmxzIGFzICR0YmwgPT4gJGNvbHMpIHsNCgkJCWlmIChn cHMoJ2RlYnVnJykpIHsNCgkJCQllY2hvICIrKyBUQUJMRSAiLiR0YmwuIiBIQVMgIi5jb3Vu dChAc2FmZV9zaG93KCdjb2x1bW5zJywgJHRibCkpLiIgQ09MVU1OUzsgUkVRVUlSRVMgIi4k Y29scy4iICsrIi5icjsNCgkJCX0NCgkJCWlmIChjb3VudChAc2FmZV9zaG93KCdjb2x1bW5z JywgJHRibCkpID09ICRjb2xzKSB7DQoJCQkJJG91dC0tOw0KCQkJfQ0KCQl9DQoJCXJldHVy biAoJG91dD09PTApID8gMSA6IDA7DQoJfSBlbHNlIHsNCgkJaWYgKGdwcygnZGVidWcnKSkg ew0KCQkJZWNobyAiKysgVEFCTEUgIi5TTURfVEhVTUIuIiBIQVMgIi5jb3VudChAc2FmZV9z aG93KCdjb2x1bW5zJywgU01EX1RIVU1CKSkuIiBDT0xVTU5TOyI7DQoJCX0NCgkJcmV0dXJu KEBzYWZlX3Nob3coJ2NvbHVtbnMnLCBTTURfVEhVTUIpKTsNCgl9DQp9DQoNCi8vIC0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0NCmZ1bmN0aW9uIHNtZF90aHVtYm5haWxfc2F2ZV9wYW5lX3N0YXRlKCkgew0KCSRwYW5l cyA9IGFycmF5KCdzbWRfdGh1bWJuYWlsX3Byb2ZpbGVzJywgJ3NtZF90aHVtYm5haWxzJyk7 DQoJJHBhbmUgPSBncHMoJ3BhbmUnKTsNCglpZiAoaW5fYXJyYXkoJHBhbmUsICRwYW5lcykp DQoJew0KCQlzZXRfcHJlZigicGFuZV97JHBhbmV9X3Zpc2libGUiLCAoZ3BzKCd2aXNpYmxl JykgPT0gJ3RydWUnID8gJzEnIDogJzAnKSwgJ3NtZF90aHVtYicsIFBSRUZfSElEREVOLCAn eWVzbm9yYWRpbycsIDAsIFBSRUZfUFJJVkFURSk7DQoJCXNlbmRfeG1sX3Jlc3BvbnNlKCk7 DQoJfSBlbHNlIHsNCgkJc2VuZF94bWxfcmVzcG9uc2UoYXJyYXkoJ2h0dHAtc3RhdHVzJyA9 PiAnNDAwIEJhZCBSZXF1ZXN0JykpOw0KCX0NCn0NCg0KLy8qKioqKioqKioqKioqKioqKg0K Ly8gUFVCTElDIFNJREUgVEFHUw0KLy8qKioqKioqKioqKioqKioqKg0KLy8gLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tDQpmdW5jdGlvbiBzbWRfdGh1bWJuYWlsKCRhdHRzKSB7DQoJZ2xv YmFsICR0aGlzaW1hZ2U7DQoNCglleHRyYWN0KGxBdHRzKGFycmF5KA0KCQkndHlwZScgICAg ICAgPT4gQGdldF9wcmVmKCdzbWRfdGh1bWJfZGVmYXVsdF9wcm9maWxlJyksDQoJCSdpZCcg ICAgICAgICA9PiAnJywNCgkJJ25hbWUnICAgICAgID0+ICcnLA0KCQknZXNjYXBlJyAgICAg PT4gJ2h0bWwnLA0KCQknd3JhcHRhZycgICAgPT4gJycsDQoJCSdjbGFzcycgICAgICA9PiAn JywNCgkJJ2h0bWxfaWQnICAgID0+ICcnLA0KCQknc3R5bGUnICAgICAgPT4gJycsDQoJCSds aW5rJyAgICAgICA9PiAnJywNCgkJJ2xpbmtfcmVsJyAgID0+ICcnLA0KCQkncG9wbGluaycg ICAgPT4gMCwNCgkJJ2FkZF9zdGFtcCcgID0+IDAsDQoJCSdmb3JjZV9zaXplJyA9PiAnJywN CgkpLCRhdHRzKSk7DQoNCglpZiAoJG5hbWUpIHsNCgkJJG5hbWUgPSBkb1NsYXNoKCRuYW1l KTsNCgkJJHJzID0gc2FmZV9yb3coJyonLCAndHhwX2ltYWdlJywgIm5hbWUgPSAnJG5hbWUn IGxpbWl0IDEiKTsNCgl9IGVsc2VpZiAoJGlkKSB7DQoJCSRpZCA9IChpbnQpICRpZDsNCgkJ JHJzID0gc2FmZV9yb3coJyonLCAndHhwX2ltYWdlJywgImlkID0gJGlkIGxpbWl0IDEiKTsN Cgl9IGVsc2VpZiAoJHRoaXNpbWFnZSkgew0KCQkkaWQgPSAoaW50KSAkdGhpc2ltYWdlWydp ZCddOw0KCQkkcnMgPSAkdGhpc2ltYWdlOw0KCX0gZWxzZSB7DQoJCXRyaWdnZXJfZXJyb3Io Z1R4dCgndW5rbm93bl9pbWFnZScpKTsNCgkJcmV0dXJuOw0KCX0NCg0KCWlmICgkcnMpIHsN CgkJZXh0cmFjdCgkcnMpOw0KCQkkdGh1bWJpbmZvID0gc2FmZV9yb3coJyonLCBTTURfVEhV TUIsICJuYW1lPSciLmRvU2xhc2goJHR5cGUpLiInIik7DQoJCWlmICgkdGh1bWJpbmZvKSB7 DQoJCQkkcGF0aCA9IElNUEFUSC5zYW5pdGl6ZUZvclVybCgkdGh1bWJpbmZvWyduYW1lJ10p LkRTLiRpZC4kZXh0Ow0KCQkJaWYgKGZpbGVfZXhpc3RzKCRwYXRoKSkgew0KCQkJCWlmICgk ZXNjYXBlID09ICdodG1sJykgew0KCQkJCQkkYWx0ID0gaHRtbHNwZWNpYWxjaGFycygkYWx0 KTsNCgkJCQkJJGNhcHRpb24gPSBodG1sc3BlY2lhbGNoYXJzKCRjYXB0aW9uKTsNCgkJCQl9 DQoNCgkJCQkkbWV0YVsnYWx0J10gPSAkYWx0Ow0KCQkJCSRmb3JjZV9zaXplID0gZG9fbGlz dCgkZm9yY2Vfc2l6ZSk7DQoJCQkJaWYgKGluX2FycmF5KCd3aWR0aCcsICRmb3JjZV9zaXpl KSkgew0KCQkJCQkkbWV0YVsnZm9yY2V3J10gPSAxOw0KCQkJCX0NCgkJCQlpZiAoaW5fYXJy YXkoJ2hlaWdodCcsICRmb3JjZV9zaXplKSkgew0KCQkJCQkkbWV0YVsnZm9yY2VoJ10gPSAx Ow0KCQkJCX0NCgkJCQlpZiAoJGFkZF9zdGFtcCA9PSAwKSB7ICRtZXRhWydzdGFtcCddID0g MTsgfSAvLyBOZWdhdGl2ZSBsb2dpYyBzaW5jZSB3ZSB3YW50IHRoZSBzdGFtcCBvbiBieSBk ZWZhdWx0IGZvciB0aGUgYWRtaW4gc2lkZQ0KCQkJCWlmICgkY2FwdGlvbikgeyAkbWV0YVsn dGl0bGUnXSA9ICRjYXB0aW9uOyB9DQoJCQkJaWYgKCRodG1sX2lkICYmICEkd3JhcHRhZykg eyAkbWV0YVsnaWQnXSA9ICRodG1sX2lkOyB9DQoJCQkJaWYgKCRjbGFzcyAmJiAhJHdyYXB0 YWcpIHsgJG1ldGFbJ2NsYXNzJ10gPSAkY2xhc3M7IH0gZWxzZSB7ICRjbGFzcz0kdHlwZTsg fQ0KCQkJCWlmICgkc3R5bGUpIHsgJG1ldGFbJ3N0eWxlJ10gPSAkc3R5bGU7IH0NCg0KCQkJ CSRvdXQgPSBzbWRfdGh1bWJfaW1nKCR0aHVtYmluZm8sICRycywgJG1ldGEpOw0KDQoJCQkJ aWYgKCRsaW5rKSB7DQoJCQkJCSRvdXQgPSBocmVmKCRvdXQsIGltYWdlc3JjdXJsKCRpZCwg JGV4dCksICghZW1wdHkoJGxpbmtfcmVsKSA/ICcgcmVsPSInLiRsaW5rX3JlbC4nIicgOiAn JykuJyB0aXRsZT0iJy4kY2FwdGlvbi4nIicpOw0KCQkJCX0gZWxzZWlmICgkcG9wbGluaykg ew0KCQkJCQkkb3V0ID0gJzxhIGhyZWY9IicuaW1hZ2VzcmN1cmwoJGlkLCAkZXh0KS4nIicu DQoJCQkJCQknIG9uY2xpY2s9IndpbmRvdy5vcGVuKHRoaXMuaHJlZiwgXCdwb3B1cHdpbmRv d1wnLCAnLg0KCQkJCQkJJ1wnd2lkdGg9Jy4kdy4nLCBoZWlnaHQ9Jy4kaC4nLCBzY3JvbGxi YXJzLCByZXNpemFibGVcJyk7IHJldHVybiBmYWxzZTsiPicuJG91dC4nPC9hPic7DQoJCQkJ fQ0KDQoJCQkJcmV0dXJuICgkd3JhcHRhZykgPyBkb1RhZygkb3V0LCAkd3JhcHRhZywgJGNs YXNzLCAnJywgJGh0bWxfaWQpIDogJG91dDsNCgkJCX0NCgkJfQ0KCX0NCg0KCXRyaWdnZXJf ZXJyb3IoZ1R4dCgndW5rbm93bl9pbWFnZScpKTsNCn0NCg0KLy8gLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tDQpmdW5jdGlvbiBzbWRfaWZfdGh1bWJuYWlsKCRhdHRzLCAkdGhpbmcpIHsN CglnbG9iYWwgJHRoaXNpbWFnZTsNCglhc3NlcnRfaW1hZ2UoKTsNCg0KCWV4dHJhY3QobEF0 dHMoYXJyYXkoDQoJCSd0eXBlJyA9PiBAZ2V0X3ByZWYoJ3NtZF90aHVtYl9kZWZhdWx0X3By b2ZpbGUnKSwNCgkpLCRhdHRzKSk7DQoNCgkkdGh1bWJpbmZvID0gc2FmZV9yb3coJyonLCBT TURfVEhVTUIsICJuYW1lPSciLmRvU2xhc2goJHR5cGUpLiInIik7DQoJJHJldCA9IGZhbHNl Ow0KCWlmICgkdGh1bWJpbmZvKSB7DQoJCSRwYXRoID0gSU1QQVRILnNhbml0aXplRm9yVXJs KCR0aHVtYmluZm9bJ25hbWUnXSkuRFMuJHRoaXNpbWFnZVsnaWQnXS4kdGhpc2ltYWdlWydl eHQnXTsNCgkJJHJldCA9IGZpbGVfZXhpc3RzKCRwYXRoKTsNCgl9DQoJcmV0dXJuIHBhcnNl KEV2YWxFbHNlKCR0aGluZywgJHJldCkpOw0KfQ0KDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0NCi8vIFBsdWdpbi1zcGVjaWZpYyByZXBsYWNlbWVudCBzdHJpbmdzIC0gbG9jYWxp c2UgYXMgcmVxdWlyZWQNCi8vIFRPRE86IG1ha2UgdGhlc2UgaW50byBhIHRleHRwYWNrIHdo ZW4gcGx1Z2luIGNvbXBvc2VyIHN1cHBvcnRzIHRoZW0NCmZ1bmN0aW9uIHNtZF90aHVtYl9n VHh0KCR3aGF0LCAkYXR0cyA9IGFycmF5KCkpIHsNCgkkbGFuZyA9IGFycmF5KA0KCQknYWN0 aW9ucycgPT4gJ0FjdGlvbnMnLA0KCQknYWxsX3NpemVzJyA9PiAnQWxsIHNpemVzJywNCgkJ J2FsbF90aHVtYnMnID0+ICdDcmVhdGUgYWxsJywNCgkJJ2NyZWF0ZScgPT4gJ0NyZWF0aW9u JywNCgkJJ2RlbGV0ZScgPT4gJ0RlbGV0aW9uJywNCgkJJ2RlbGV0ZV9jb25maXJtJyA9PiAn UmVhbGx5IGRlbGV0ZSBwcm9maWxlIHtuYW1lfT8gSXQgd2lsbCBkZWxldGUgQUxMIHRodW1i bmFpbHMgb2YgdGhpcyB0eXBlLicsDQoJCSduZXcnID0+ICdOZXcgcHJvZmlsZScsDQoJCSdw cmVmc19pbnN0YWxsZWQnID0+ICdQcmVmZXJlbmNlcyBpbnN0YWxsZWQnLA0KCQkncHJvZmls ZV9kZWxldGVkJyA9PiAnUHJvZmlsZSAie25hbWV9IiBkZWxldGVkJywNCgkJJ3Byb2ZpbGVf ZXhpc3RzJyA9PiAnUHJvZmlsZSAie25hbWV9IiBhbHJlYWR5IGV4aXN0cycsDQoJCSdwcm9m aWxlX2hlYWRpbmcnID0+ICdUaHVtYm5haWwgcHJvZmlsZXMnLA0KCQkncXVhbGl0eScgPT4g J1F1YWxpdHkgKCUpJywNCgkJJ3NoYXJwZW4nID0+ICdTaGFycGVuJywNCgkJJ3RhYmxlc19u b3RfaW5zdGFsbGVkJyA9PiAnVGFibGVzIG5vdCBpbnN0YWxsZWQ6IHRyeSByZWluc3RhbGxp bmcgdGhlIHBsdWdpbicsDQoJCSd0aHVtYm5haWxfaGVhZGluZycgPT4gJ1RodW1ibmFpbHMn LA0KCQkndHhwX2RlZmF1bHRfc3luYycgPT4gJ0tlZXAgVFhQIHRodW1ibmFpbHMgaW4gc3lu YyB3aXRoIGRlZmF1bHQgcHJvZmlsZSBvbjogJywNCgkpOw0KCXJldHVybiBzdHJ0cigkbGFu Z1skd2hhdF0sICRhdHRzKTsNCn0iO3M6NDoidHlwZSI7czoxOiIxIjtzOjU6Im9yZGVyIjtz OjE6IjUiO3M6NToiZmxhZ3MiO3M6MToiMiI7czo0OiJoZWxwIjtzOjE1MjA2OiI8ZGl2IGlk PSJzbWRfaGVscCI+CgoJPGgxPnNtZF90aHVtYm5haWw8L2gxPgoKCTxoMj5GZWF0dXJlczwv aDI+CgoJPHVsPgoJCTxsaT5Bc3NpZ24gYW55IG51bWJlciBvZiB0aHVtYm5haWxzIHRvIDxz cGFuIGNsYXNzPSJjYXBzIj5UWFA8L3NwYW4+JiM4MjE3O3MgaW1hZ2VzPC9saT4KCQk8bGk+ QmF0Y2ggYXNzaWduIHRodW1ibmFpbHMgdG8gYWxsIGV4aXN0aW5nIGltYWdlczwvbGk+CgkJ PGxpPlNldCBvbmUgdGh1bWJuYWlsIHNpemUgYXMgZGVmYXVsdDwvbGk+CgkJPGxpPkRpc3Bs YXkgYW55IG9mIHRoZSB0aHVtYm5haWwgc2l6ZXMgb24geW91ciBzaXRlPC9saT4KCQk8bGk+ S2VlcCB0aHVtYnMgaW4gc3luYyB3aXRoIDxzcGFuIGNsYXNzPSJjYXBzIj5UWFA8L3NwYW4+ JiM4MjE3O3MgdGh1bWJzIGlmIHlvdSB3aXNoPC9saT4KCQk8bGk+Q29uZGl0aW9uYWwgdGh1 bWJuYWlsIGNoZWNrIGF2YWlsYWJsZTwvbGk+Cgk8L3VsPgoKCTxoMj5BdXRob3IgLyBjcmVk aXRzPC9oMj4KCgk8cD5Xcml0dGVuIGJ5IDxhIGhyZWY9Imh0dHA6Ly9zdGVmZGF3c29uLmNv bS9jb250YWN0Ij5TdGVmIERhd3NvbjwvYT4uIE1hbnkgdGhhbmtzIHRvIHRoZSBiZXRhIHRl c3QgY3JldyB3aG8gb2ZmZXJlZCBmZWF0dXJlIGFuZCB3b3JrZmxvdyBhZHZpY2UsIGVzcGVj aWFsbHkgdGhlYm9tYnNpdGUsIGpha29iIGFuZCBqc3R1YmJzLjwvcD4KCgk8aDI+SW5zdGFs bGF0aW9uIC8gdW5pbnN0YWxsYXRpb248L2gyPgoKCTxwIGNsYXNzPSJpbXBvcnRhbnQiPlJl cXVpcmVzIFBIUDUrIGFuZCA8c3BhbiBjbGFzcz0iY2FwcyI+VFhQPC9zcGFuPiA0LjMuMCs8 L3A+CgoJPHA+RG93bmxvYWQgdGhlIHBsdWdpbiBmcm9tIGVpdGhlciA8YSBocmVmPSJodHRw Oi8vdGV4dHBhdHRlcm4ub3JnL3BsdWdpbnMvMTE4Ni9zbWRfdGh1bWJuYWlsIj50ZXh0cGF0 dGVybi5vcmc8L2E+LCBvciB0aGUgPGEgaHJlZj0iaHR0cDovL3N0ZWZkYXdzb24uY29tL3N3 Ij5zb2Z0d2FyZSBwYWdlPC9hPiwgcGFzdGUgdGhlIGNvZGUgaW50byB0aGUgPHNwYW4gY2xh c3M9ImNhcHMiPlRYUDwvc3Bhbj4gQWRtaW4gLSZndDsgUGx1Z2lucyBwYW5lLCBpbnN0YWxs IGFuZCBlbmFibGUgdGhlIHBsdWdpbi4gVmlzaXQgdGhlIDxhIGhyZWY9Imh0dHA6Ly9mb3J1 bS50ZXh0cGF0dGVybi5jb20vdmlld3RvcGljLnBocD9pZD0zNDM2NyI+Zm9ydW0gdGhyZWFk PC9hPiBmb3IgbW9yZSBpbmZvIG9yIHRvIHJlcG9ydCBvbiB0aGUgc3VjY2VzcyBvciBvdGhl cndpc2Ugb2YgdGhlIHBsdWdpbi48L3A+CgoJPHA+VG8gdW5pbnN0YWxsLCBkZWxldGUgZnJv bSB0aGUgQWRtaW4gLSZndDsgUGx1Z2lucyBwYWdlLjwvcD4KCgk8aDI+VXNhZ2UgJiM4MjEy OyBhZG1pbiBzaWRlPC9oMj4KCgk8cD5WaXNpdCB0aGUgQ29udGVudC0mZ3Q7SW1hZ2VzIHRh Yi4gQWJvdmUgdGhlIGxpc3Qgb2YgaW1hZ2VzIGlzIGFuIGFyZWEgbGFiZWxsZWQgPGVtPlRo dW1ibmFpbCBQcm9maWxlczwvZW0+LiBDbGljayBpdCB0byByZXZlYWwgdGhlIGNvbnRyb2wg cGFuZWwuIFlvdSBjYW4gdG9nZ2xlIHRoaXMgcGFuZWwgb24gYW5kIG9mZiBieSBjbGlja2lu ZyB0aGUgaGVhZGluZy48L3A+CgoJPHA+WW91IG11c3QgZGVmaW5lIGF0IGxlYXN0IG9uZSBw cm9maWxlIHRvIGJlZ2luIHdpdGgsIHNvIGNsaWNrIHRoZSA8ZW0+TmV3IHByb2ZpbGU8L2Vt PiBidXR0b24uIFRoaXMgd2lsbCByZXZlYWwgZWRpdCBib3hlcyB3aGVyZSB5b3UgY2FuIGVu dGVyOjwvcD4KCgk8dWw+CgkJPGxpPjxzdHJvbmc+TmFtZTwvc3Ryb25nPjogc29tZSBkZXNj cmlwdGl2ZSBuYW1lIGZvciB0aGlzIHRodW1ibmFpbCBkaW1lbnNpb24uIFlvdSBhcmUgbGlt aXRlZCB0byB1c3VhbCBub24td2VpcmQgY2hhcmFjdGVycyBpbiB0aGUgbmFtZTwvbGk+CgkJ PGxpPjxzdHJvbmc+V2lkdGg8L3N0cm9uZz46IHRodW1ibmFpbCB3aWR0aCwgaW4gcGl4ZWxz LiBJZiBsZWZ0IGJsYW5rIChvciBzZXQgdG8gMCkgYW5kIGhlaWdodCBpcyBzcGVjaWZpZWQs IHRoZSB3aWR0aCB3aWxsIGJlIGNvbXB1dGVkIGluIHByb3BvcnRpb24gdG8gdGhlIGhlaWdo dDwvbGk+CgkJPGxpPjxzdHJvbmc+SGVpZ2h0PC9zdHJvbmc+OiB0aHVtYm5haWwgaGVpZ2h0 LCBpbiBwaXhlbHMuIElmIGxlZnQgYmxhbmsgKG9yIHNldCB0byAwKSBhbmQgd2lkdGggaXMg c3BlY2lmaWVkLCB0aGUgaGVpZ2h0IHdpbGwgYmUgY29tcHV0ZWQgaW4gcHJvcG9ydGlvbiB0 byB0aGUgd2lkdGg8L2xpPgoJCTxsaT48c3Ryb25nPlF1YWxpdHkgKCUpPC9zdHJvbmc+OiBU aGUgcXVhbGl0eSBvZiB0aGUgcmVzdWx0aW5nIHRodW1ibmFpbC4gR2VuZXJhbGx5IG9ubHkg b2YgdXNlIGZvciBqcGcgb3IgcG5nKDI0KSBpbWFnZXMuIFRoZSBoaWdoZXIgdGhlIHZhbHVl IHRoZSBiZXR0ZXIgdGhlIHF1YWxpdHkgYW5kIHRoZSBiaWdnZXIgdGhlIGZpbGUgc2l6ZS4g RGVmYXVsdDogNzU8L2xpPgoJCTxsaT48c3Ryb25nPkNyb3A8L3N0cm9uZz46IHdoZXRoZXIg dG8gY3JvcCB0aGUgaW1hZ2Ugd2hlbiB0aGUgdGh1bWJuYWlsIGlzIGNyZWF0ZWQsIG9yIHNj YWxlIGl0IHRvIGZpdDwvbGk+CgkJPGxpPjxzdHJvbmc+U2hhcnBlbjwvc3Ryb25nPjogd2hl dGhlciB0byBhcHBseSBhIHNoYXJwZW5pbmcgZmlsdGVyIHRvIHRoZSB0aHVtYm5haWwgd2hl biBpdCBpcyBjcmVhdGVkLiBVc2VmdWwgZm9yIHZlcnkgc21hbGwgaW1hZ2VzPC9saT4KCQk8 bGk+PHN0cm9uZz5BY3RpdmU8L3N0cm9uZz46IEVuYWJsZS9kaXNhYmxlIHRoaXMgdGh1bWJu YWlsIHNpemUgc28gaXQgd2lsbC93b24mIzgyMTc7dCBiZSBhdXRvbWF0aWNhbGx5IGdlbmVy YXRlZCB3aGVuIHRoZSBuZXh0IGltYWdlIGlzIHVwbG9hZGVkLiBDbGljayB0aGUgY2hlY2ti b3ggdG8gaW5zdGFudGx5IHN3aXRjaCB0aGUgcHJvZmlsZSBvbi9vZmYuIENsaWNrIHRoZSAm IzgyMTY7QWN0aXZlJiM4MjE3OyB3b3JkIGluIHRoZSBoZWFkaW5nIHJvdyB0byB0b2dnbGUg dGhlIHN0YXR1cyBvZiBhbGwgcHJvZmlsZXMuIE5vdGUgdGhhdCB0aGlzIHNldHRpbmcgZ292 ZXJucyBob3cgdGhlIDxhIGhyZWY9IiNjcmVhdGUiPkFsbCBzaXplczwvYT4gZHJvcGRvd24g ZW50cnkgaW50ZXJhY3RzIHdpdGggdGhlIDxlbT5DcmVhdGU8L2VtPiBhbmQgPGVtPkRlbGV0 ZTwvZW0+IGJ1dHRvbnM8L2xpPgoJCTxsaT48c3Ryb25nPkRlZmF1bHQ8L3N0cm9uZz46IHNl dCB0aGlzIHRodW1ibmFpbCBwcm9maWxlIGFzIHRoZSBkZWZhdWx0LiBUaGUgZGVmYXVsdCBp bWFnZSB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgSW1hZ2VzIGxpc3QgYW5kIHdpbGwgYWxz byBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHNpemUgdG8gYmUgZGlzcGxheWVkIHVzaW5nIDxj b2RlPiZsdDt0eHA6c21kX3RodW1ibmFpbC8mZ3Q7PC9jb2RlPi4gSWYgdGhlIG9wdGlvbiB0 byA8YSBocmVmPSIjdHhwX3RodW1icyI+c3luYyB3aXRoIDxzcGFuIGNsYXNzPSJjYXBzIj5U WFA8L3NwYW4+JiM4MjE3O3MgdGh1bWJzPC9hPiBpcyBvbiwgaXQgd2lsbCBhbHNvIGJlY29t ZSA8c3BhbiBjbGFzcz0iY2FwcyI+VFhQPC9zcGFuPiYjODIxNztzIHN0YW5kYXJkIChidWls dC1pbikgdGh1bWJuYWlsIHNpemUgZnJvbSB0aGlzIHBvaW50IGZvcndhcmQ8L2xpPgoJPC91 bD4KCgk8cD5PbmNlIHlvdSYjODIxNzt2ZSBjb25maWd1cmVkIHlvdXIgcHJvZmlsZSwgY2xp Y2sgU2F2ZSB0byBzdG9yZSBpdC4gWW91IGNhbiBhbHdheXMgZWRpdCBpdCBhZ2FpbiBieSBj bGlja2luZyBpdHMgbmFtZS4gR28gYWhlYWQgYW5kIGNyZWF0ZSBzb21lIG1vcmUgcHJvZmls ZXMgZm9yIHRodW1ibmFpbHMgb2YgZGlmZmVyZW50IHNpemVzL3BhcmFtZXRlcnMuIElmIHlv dSB3aXNoIHRvIGRlbGV0ZSBhIHByb2ZpbGUsIGhpdCB0aGUgPGVtPltEZWxldGVdPC9lbT4g YnV0dG9uIGFuZCBjb25maXJtLiA8c3Ryb25nPkFsbCB0aHVtYm5haWxzIGFzc29jaWF0ZWQg d2l0aCB0aGF0IHByb2ZpbGUgd2lsbCBiZSBkZWxldGVkPC9zdHJvbmc+LjwvcD4KCgk8cD5B dCB0aGlzIHBvaW50LCBubyB0aHVtYm5haWxzIGhhdmUgYmVlbiBjcmVhdGVkLiBMZXQmIzgy MTc7cyByZWN0aWZ5IHRoYXQuPC9wPgoKCTxoMyBpZD0iY3JlYXRlIj5DcmVhdGluZyB0aHVt Ym5haWxzPC9oMz4KCgk8cD5QaWNrIG9uZSBvZiB5b3VyIGltYWdlcyBhbmQgY2xpY2sgdG8g ZWRpdCBpdC48L3A+CgoJPHA+QmVuZWF0aCB0aGUgbWFpbiBwaWN0dXJlIHlvdSB3aWxsIHNl ZSBhbiBhcmVhIGxhYmVsbGVkIDxlbT5UaHVtYm5haWxzPC9lbT4uIFlvdSBjYW4gdG9nZ2xl IHRoaXMgcGFuZWwgb24gYW5kIG9mZiBieSBjbGlja2luZyB0aGUgaGVhZGluZy48L3A+CgoJ PHA+SW5zaWRlIHRoZSBwYW5lbCBpcyBhIHNpbXBsZSBzZWxlY3QgbGlzdCBjb250YWluaW5n IG9uZSBlbnRyeSBmb3IgZWFjaCB0aHVtYm5haWwgcHJvZmlsZSB5b3UgaGF2ZSBjb25maWd1 cmVkLCBwbHVzIHRoZSBzcGVjaWFsIGVudHJ5IDxlbT5BbGwgc2l6ZXM8L2VtPi4gWW91IGNh biBzZWxlY3Qgb25lIG9mIHRoZXNlIGVudHJpZXMgYW5kIGNsaWNrIDxlbT5DcmVhdGU8L2Vt PiB0byBjcmVhdGUgdGh1bWJuYWlsKHMpIGluIHRoZSBzZWxlY3RlZCBzaXplIG9yIGhpdCA8 ZW0+RGVsZXRlPC9lbT4gdG8gcmVtb3ZlIHRoZSBzZWxlY3RlZCB0aHVtYm5haWwocykuPC9w PgoKCTxwPk9uY2UgY3JlYXRlZCwgdGhlIHRodW1ibmFpbHMgYXBwZWFyIGluIHRoZSBwYW5l bDsgcmVtZW1iZXIgdGhleSBjYW4gYmUgdHVja2VkIGF3YXkgaWYgeW91IGRvbiYjODIxNzt0 IHdhbnQgdG8gbG9vayBhdCB0aGVtLjwvcD4KCgk8cD5JZiB5b3Ugc2VsZWN0IDxlbT5BbGwg c2l6ZXM8L2VtPiBhbmQgaGl0IDxlbT5DcmVhdGU8L2VtPiwgeW91IHdpbGwgZ2V0IG9uZSB0 aHVtYm5haWwgZm9yIGVhY2ggYWN0aXZlIHByb2ZpbGUuIFNpbWlsYXJseSwgaWYgeW91IGhp dCA8ZW0+RGVsZXRlPC9lbT4gYW55IHRodW1ibmFpbHMgc3RvcmVkIGFnYWluc3QgYW4gYWN0 aXZlIHByb2ZpbGUgZm9yIHRoZSBjdXJyZW50IGltYWdlIHdpbGwgYmUgcmVtb3ZlZC4gQnkg dG9nZ2xpbmcgY2VydGFpbiB0aHVtYm5haWwgcHJvZmlsZXMgb24vb2ZmIHlvdSBjYW4gY29u dHJvbCB3aGljaCBvbmVzIGFyZSBjcmVhdGVkIG9yIGRlbGV0ZWQuPC9wPgoKCTxwPldoZW4g eW91IHVwbG9hZCBhIG5ldyBpbWFnZSBvciByZXBsYWNlIGFuIGV4aXN0aW5nIGltYWdlLCB0 aHVtYm5haWxzIHdpbGwgYmUgYXV0b21hdGljYWxseSBjcmVhdGVkIGZvciBhbnkgYWN0aXZl IHByb2ZpbGVzLiBOb3RlIHRoYXQgaWYgeW91IHVzZSB0aGUgbXVsdGktZWRpdCB0b29sIHRv IGRlbGV0ZSBpbWFnZXMsIDxzdHJvbmc+YWxsPC9zdHJvbmc+IGNvcnJlc3BvbmRpbmcgdGh1 bWJuYWlscyBmb3IgdGhlIHNlbGVjdGVkIGltYWdlcyAoaW5jbHVkaW5nIGluYWN0aXZlIG9u ZXMpIHdpbGwgYmUgcmVtb3ZlZC48L3A+CgoJPGgzIGlkPSJjdXN0b20iPkN1c3RvbSB0aHVt Ym5haWxzPC9oMz4KCgk8cD5JZiB5b3UgcHJlZmVyIHRvIG1ha2UgeW91ciBvd24gdGh1bWJz IGluIGFuIGV4dGVybmFsIHByb2dyYW0sIHlvdSBjYW4gc3RpbGwgc2V0IHVwIHRoZSBwcm9m aWxlcyBhcyBub3JtYWwgYnV0IGluc3RlYWQgb2YgY2xpY2tpbmcgPGVtPkNyZWF0ZTwvZW0+ IGluIHRoZSBJbWFnZSBFZGl0IHNjcmVlbiwgeW91IGNhbiBzZWxlY3QgYSBwcm9maWxlIHNp emUgZnJvbSB0aGUgZHJvcGRvd24gYW5kIHVzZSB0aGUgQnJvd3NlJiM4MjMwOyBmYWNpbGl0 eSB0byBjaG9vc2UgYSB0aHVtYm5haWwgZnJvbSB5b3VyIGhhcmQgZHJpdmUuIFdoZW4geW91 IGNsaWNrIDxlbT5VcGxvYWQ8L2VtPiB0aGUgaW1hZ2Ugd2lsbCBiZSBpbnNlcnRlZCBhZ2Fp bnN0IHRoZSBzZWxlY3RlZCBwcm9maWxlLjwvcD4KCgk8cD5BdCBhbnkgdGltZSB5b3UgY2Fu IGNsaWNrIG9uZSBvZiB0aGUgdGh1bWJuYWlscyAob3Igc2VsZWN0IGEgc2l6ZSBmcm9tIHRo ZSBkcm9wZG93bikgYW5kIEJyb3dzZSYjODIzMDsgZm9yIGFub3RoZXIgaW1hZ2UgdG8gcmVw bGFjZSB0aGUgZXhpc3RpbmcgdGh1bWJuYWlsICYjODIxMjsgZXZlbiBvbmVzIHRoYXQgaGF2 ZSBiZWVuIGF1dG8tY3JlYXRlZC4gU29tZSB0aGluZ3MgdG8gbm90ZSBhYm91dCB0aGlzIGZl YXR1cmU6PC9wPgoKCTx1bD4KCQk8bGk+dGhlIHRodW1ibmFpbCBtdXN0IGJlIG9mIHRoZSBz YW1lIGZpbGUgdHlwZSBhcyB0aGUgb3JpZ2luYWwgaW1hZ2Ugb3IgdGhlIHVwbG9hZCB3aWxs IGJlIGlnbm9yZWQ8L2xpPgoJCTxsaT50aHVtYnMgY2Fubm90IGhhdmUgZGltZW5zaW9ucyBn cmVhdGVyIHRoYW4gdGhlIG9yaWdpbmFsIGltYWdlIG9yIHRoZSB1cGxvYWQgd2lsbCBiZSBp Z25vcmVkPC9saT4KCQk8bGk+eW91IGNhbiBjbGljayBhIGhpZ2hsaWdodGVkIGltYWdlIHRv IGRlc2VsZWN0IGl0PC9saT4KCQk8bGk+eW91IGNhbm5vdCBCcm93c2UgZm9yIGFuIGltYWdl IHVubGVzcyB5b3UgaGF2ZSBjaG9zZW4gb25lIHByb2ZpbGU8L2xpPgoJPC91bD4KCgk8aDMg aWQ9ImJhdGNoIj5CYXRjaCB0aHVtYm5haWwgY3JlYXRpb248L2gzPgoKCTxwPllvdSBjYW4g YWxzbyBjcmVhdGUgdGh1bWJuYWlscyBlbi1tYXNzZS4gRnJvbSB0aGUgbWFpbiA8ZW0+VGh1 bWJuYWlsIHByb2ZpbGVzPC9lbT4gcGFuZWwsIGlmIHlvdSBoaXQgPGVtPkNyZWF0ZSBhbGw8 L2VtPiB0aGUgcGx1Z2luIHdpbGwgZ28gYXdheSBhbmQgY3JlYXRlIHRodW1ibmFpbHMgZm9y IGV2ZXJ5IGFjdGl2ZSBwcm9maWxlIGZvciBhbGwgY3VycmVudGx5IGluc3RhbGxlZCBpbWFn ZXMuIFRoaXMgaXMgYSBxdWljayB3YXkgdG8gZ2VuZXJhdGUgdGh1bWJzIGZvciB5b3VyIGV4 aXN0aW5nIGltYWdlcy48L3A+CgoJPHA+QmVjYXVzZSBvZiB0aGUgbmF0dXJlIG9mIHRoaXMg dG9vbCAmIzgyMTI7IGVzcGVjaWFsbHkgd2l0aCBsYXJnZSBpbWFnZSBwb29scyAmIzgyMTI7 IHRoZSBwcm9jZXNzIGlzIGRvbmUgYXMgYSBiYWNrZ3JvdW5kIHRhc2sgdmlhIDxzcGFuIGNs YXNzPSJjYXBzIj5BSkFYPC9zcGFuPi4gQWZ0ZXIgY2xpY2tpbmcgdGhlIDxlbT5DcmVhdGUg YWxsPC9lbT4gYnV0dG9uIGEgY291bnRlciB3aWxsIGFwcGVhciBpbiB0aGUgdG9wLXJpZ2h0 IG9mIHRoZSBjb250cm9sIHBhbmVsIHNob3dpbmcgaG93IG1hbnkgaW1hZ2VzIGl0IGhhcyBw cm9jZXNzZWQgYW5kIHRoZSB0b3RhbCBudW1iZXIgb2YgaW1hZ2VzIGluc3RhbGxlZC4gV2hl biBpdCYjODIxNztzIGRvbmUsIHRoZSBudW1iZXJzIHdpbGwgZGlzYXBwZWFyLiBJZiB5b3Ug dGhlbiByZWZyZXNoIHlvdXIgSW1hZ2VzIHRhYiB5b3Ugd2lsbCBzZWUgeW91ciBjaG9zZW4g ZGVmYXVsdCB0aHVtYm5haWxzIGluIHRoZSBsaXN0IChhc3N1bWluZyB5b3UmIzgyMTc7dmUg c2V0IG9uZSBhcyBkZWZhdWx0ISk8L3A+CgoJPGgzIGlkPSJ0eHBfdGh1bWJzIj5LZWVwIDxz cGFuIGNsYXNzPSJjYXBzIj5UWFA8L3NwYW4+IHRodW1ibmFpbHMgaW4gc3luYyB3aXRoIGRl ZmF1bHQgcHJvZmlsZTwvaDM+CgoJPHA+SWYgeW91IGhhdmUgc2V0IGEgcHJvZmlsZSBhcyBk ZWZhdWx0LCB0d28gb3RoZXIgY2hlY2tib3hlcyBiZWNvbWUgYXZhaWxhYmxlIGJlbmVhdGgg dGhlIGxpc3Qgb2YgcHJvZmlsZXMuIE9yZGluYXJpbHksIHNtZF90aHVtYm5haWwgd29ya3Mg aW5kZXBlbmRlbnRseSBvZiA8c3BhbiBjbGFzcz0iY2FwcyI+VFhQPC9zcGFuPiYjODIxNztz IHRodW1icy4gSWYgeW91IGRpc2FibGUgdGhlIHBsdWdpbiB5b3UmIzgyMTc7bGwgc2VlIHRo YXQgZXZlcnl0aGluZyBnb2VzIGJhY2sgdG8gaG93IGl0IHdhcyBiZWZvcmUgeW91IGluc3Rh bGxlZCBpdC4gVGhpcyBpcyBncmVhdCBiZWNhdXNlIHlvdXIgaGFyZC1ncmFmdCBpc24mIzgy MTc7dCBsb3N0IGlmIHlvdSBoYXZlIHVwbG9hZGVkIHlvdXIgb3duIHRodW1icy48L3A+CgoJ PHA+QnV0IGlmIHlvdSBzdGFydCBjcmVhdGluZyB0aHVtYnMgd2l0aCB0aGUgcGx1Z2luIHlv dSB3aWxsIG5vdGljZSB0aGF0IDxzcGFuIGNsYXNzPSJjYXBzIj5UWFA8L3NwYW4+JiM4MjE3 O3MgYnVpbHQgaW4gdGFncyBzdWNoIGFzIDxjb2RlPiZsdDt0eHA6YXJ0aWNsZV9pbWFnZSB0 aHVtYm5haWw9JnF1b3Q7MSZxdW90OyAvJmd0OzwvY29kZT4gYW5kIDxjb2RlPiZsdDt0eHA6 dGh1bWJuYWlsIC8mZ3Q7PC9jb2RlPiB3b24mIzgyMTc7dCB3b3JrIGZvciBuZXdlciB0aHVt Ym5haWxzLiBUaGlzIG1pZ2h0IGJlIGNvbmZ1c2luZyBzbywgaWYgeW91IHByZWZlciwgeW91 IGNhbiBvcHQgdG8gaGF2ZSBzbWRfdGh1bWJuYWlsIHVwZGF0ZSB5b3VyIDxzcGFuIGNsYXNz PSJjYXBzIj5UWFA8L3NwYW4+IHRodW1ibmFpbHMgYXQgdGhlIHNhbWUgdGltZS48L3A+CgoJ PHA+QnkgdGlja2luZyBlaXRoZXIgb2YgdGhlIGNoZWNrYm94ZXMsIHRoZSBwbHVnaW4gd2ls bCB0cmFjayBhbnkgY2hhbmdlcyA8c3Ryb25nPnRvIHRoZSBkZWZhdWx0IHByb2ZpbGU8L3N0 cm9uZz4gYW5kIG1pbWljIHRoZW0gd2l0aCA8c3BhbiBjbGFzcz0iY2FwcyI+VFhQPC9zcGFu PiYjODIxNztzIHRodW1ibmFpbHMuIFRoaXMgaGFzIGEgZmV3IGVmZmVjdHMgd29ydGggaGln aGxpZ2h0aW5nLjwvcD4KCgk8cD5XaGVuIHRoZSA8ZW0+Q3JlYXRpb248L2VtPiBjaGVja2Jv eCBpcyB0aWNrZWQ6PC9wPgoKCTxvbD4KCQk8bGk+aWYgeW91IDxlbT5DcmVhdGUgQWxsPC9l bT4gdGh1bWJzLCB1cGxvYWQgYSBuZXcgaW1hZ2UsIG9yIHJlcGxhY2UgYW4gZXhpc3Rpbmcg aW1hZ2UsIGEgbmV3IDxzcGFuIGNsYXNzPSJjYXBzIj5UWFA8L3NwYW4+IHRodW1ibmFpbCB3 aWxsIGJlIGNyZWF0ZWQgYXQgdGhlIGRlZmF1bHQgc2l6ZS4gQW55IGV4aXN0aW5nIHRodW1i cyB3aWxsIGJlIG92ZXJ3cml0dGVuPC9saT4KCQk8bGk+aWYgeW91IGNoYW5nZSBkZWZhdWx0 IHByb2ZpbGUsIGFueSA8c3BhbiBjbGFzcz0iY2FwcyI+VFhQPC9zcGFuPiB0aHVtYm5haWxz IHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQgd2lsbCByZW1haW4gYXQgdGhlIHByZXZpb3VzIHNp emUuIE9ubHkgd2hlbiB5b3Ugc3RhcnQgY3JlYXRpbmcsIHVwbG9hZGluZyBvciByZXBsYWNp bmcgaW1hZ2VzIHdpbGwgdGhlIG5ldyB0aHVtYm5haWwgc2l6ZXMgYmUgY3JlYXRlZDwvbGk+ Cgk8L29sPgoKCTxwPldoZW4gdGhlIDxlbT5EZWxldGlvbjwvZW0+IGNoZWNrYm94IGlzIHRp Y2tlZDo8L3A+CgoJPG9sPgoJCTxsaT5pZiB5b3UgZGVsZXRlIGEgc2luZ2xlIHRodW1iIHRo YXQgY29ycmVzcG9uZHMgdG8gdGhlIGRlZmF1bHQgcHJvZmlsZSwgYm90aCB0aGUgcHJvZmls ZSB0aHVtYiBhbmQgPHNwYW4gY2xhc3M9ImNhcHMiPlRYUDwvc3Bhbj4mIzgyMTc7cyB0aHVt YiB3aWxsIGJlIGRlbGV0ZWQ8L2xpPgoJCTxsaT5pZiB5b3UgZGVsZXRlIGFuIGVudGlyZSBw cm9maWxlLCBhbGwgaXRzIHRodW1ibmFpbHMgPHN0cm9uZz5hbmQgYWxsIDxzcGFuIGNsYXNz PSJjYXBzIj5UWFA8L3NwYW4+JiM4MjE3O3MgdGh1bWJzPC9zdHJvbmc+IHdpbGwgYmUgcmVt b3ZlZDwvbGk+Cgk8L29sPgoKCTxwPkZ1cnRoZXI6PC9wPgoKCTxvbD4KCQk8bGk+aWYgeW91 IHJlbW92ZSB0aGUgZGVmYXVsdCBjaGVja2JveCBmcm9tIHlvdXIgcHJvZmlsZXMsIHRoZSBj aGVja2JveGVzIGRpc2FwcGVhciBhbmQgdGhlIHNldHRpbmdzIGhhdmUgbm8gZWZmZWN0LiBD aG9vc2UgYSBkZWZhdWx0IHByb2ZpbGUgdG8gcmVpbnN0YXRlIHRoZSBiZWhhdmlvdXI8L2xp PgoJCTxsaT5pZiB5b3UgZGVhY3RpdmF0ZSB0aGUgZGVmYXVsdCBwcm9maWxlIHRoZSBjaGVj a2JveGVzIGhhdmUgbm8gZWZmZWN0IDxzdHJvbmc+dW5sZXNzPC9zdHJvbmc+IHlvdSBkZWxl dGUgdGhlIHByb2ZpbGUgKHNpbmNlIHlvdSYjODIxNztyZSBkZWxldGluZyBpdCwgaXRzIHN0 YXR1cyBpcyAmIzgyMTY7bG9zdCYjODIxNzsgYW5kIHRoZXJlZm9yZSB0aGUgY2hlY2tib3hl cyBmdW5jdGlvbiBhcyBub3JtYWwpLiBJZiB0aGVyZSYjODIxNztzIGFueSBkb3VidCwgdW5j aGVjayB0aGUgPGVtPkRlbGV0aW9uPC9lbT4gY2hlY2tib3ggZmlyc3QhPC9saT4KCTwvb2w+ CgoJPGgyIGlkPSJ1c2FnZSI+VXNhZ2UgJiM4MjEyOyBwdWJsaWMgc2lkZTwvaDI+CgoJPHA+ VHdvIG5ldyB0YWdzIGFyZSBhdmFpbGFibGUgdG8gZGlzcGxheSB5b3VyIHRodW1ibmFpbHMu PC9wPgoKCTxoMyBpZD0ic21kX3RodW1iIj48Y29kZT4mbHQ7dHhwOnNtZF90aHVtYm5haWwv Jmd0OzwvY29kZT48L2gzPgoKCTxwPkEgZGlyZWN0IHJlcGxhY2VtZW50IGZvciB0aGUgYnVp bHQgaW4gPGEgaHJlZj0iaHR0cDovL3RleHRwYXR0ZXJuLm5ldC93aWtpL2luZGV4LnBocD90 aXRsZT10aHVtYm5haWwiPnR4cDp0aHVtYm5haWw8L2E+IHRhZyB3aXRoIGV4YWN0bHkgdGhl IHNhbWUgZnVuY3Rpb25hbGl0eSBhbmQgYXR0cmlidXRlcyBhcGFydCBmcm9tIHRoZXNlIGV4 Y2VwdGlvbnM6PC9wPgoKCTx1bD4KCQk8bGk+PHNwYW4gY2xhc3M9ImF0bm0iPnR5cGU8L3Nw YW4+IDogdXNlIHRoaXMgYXR0cmlidXRlIHRvIGRpc3BsYXkgdGh1bWJuYWlscyBvZiB0aGUg Z2l2ZW4gcHJvZmlsZSBuYW1lLiBlLmcuIDxjb2RlPnR5cGU9JnF1b3Q7bGFyZ2UmcXVvdDs8 L2NvZGU+LiBJZiB5b3UgZG8gbm90IHNwZWNpZnkgdGhpcyBhdHRyaWJ1dGUsIHRoZSBkZWZh dWx0IHByb2ZpbGUgd2lsbCBiZSB1c2VkLiBJZiB0aGVyZSBpcyBubyBkZWZhdWx0IHByb2Zp bGUgeW91JiM4MjE3O2xsIHNlZSB3YXJuaW5nIG1lc3NhZ2VzPC9saT4KCQk8bGk+PHNwYW4g Y2xhc3M9ImF0bm0iPmNsYXNzPC9zcGFuPiA6IGlmIG9taXR0ZWQsIHRoZSBuYW1lIG9mIHRo ZSBwcm9maWxlIHdpbGwgYmUgdXNlZCBhcyBhIGNsYXNzIG5hbWUgZm9yIHRoZSBpbWcgdGFn LiBJZiB5b3Ugc3BlY2lmeSBhIHdyYXB0YWcgYW5kIG9taXQgdGhlIGNsYXNzLCB0aGUgcHJv ZmlsZSBuYW1lIHdpbGwgYmUgdXNlZCBhcyBhIGNsYXNzIG9uIGJvdGggdGhlIGNvbnRhaW5l ciBhbmQgdGhlIGltZyB0YWc8L2xpPgoJCTxsaT48c3BhbiBjbGFzcz0iYXRubSI+YWxpZ248 L3NwYW4+IDogdGhpcyBhdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZDwvbGk+CgkJPGxpPjxz cGFuIGNsYXNzPSJhdG5tIj5hZGRfc3RhbXA8L3NwYW4+IDogYWRkcyB0aGUgaW1hZ2UgZmls ZSBtb2RpZmljYXRpb24gdGltZSB0byB0aGUgZW5kIG9mIHRoZSB0aHVtYm5haWwmIzgyMTc7 cyA8c3BhbiBjbGFzcz0iY2FwcyI+VVJMPC9zcGFuPi4gVXNlIDxjb2RlPmFkZF9zdGFtcD0m cXVvdDsxJnF1b3Q7PC9jb2RlPiB0byBzd2l0Y2ggdGhpcyBmZWF0dXJlIG9uLiBUaGlzIGhl bHBzIHByZXZlbnQgc3RhbGUgaW1hZ2VzLCBidXQgbWF5IHByZXZlbnQgYnJvd3NlcnMgZnJv bSBjYWNoZWluZyB0aGUgdGh1bWJzIHByb3Blcmx5IHRodXMgaW5jcmVhc2luZyBiYW5kd2lk dGggdXNhZ2UuIERlZmF1bHQ6IDA8L2xpPgoJCTxsaT48c3BhbiBjbGFzcz0iYXRubSI+Zm9y Y2Vfc2l6ZTwvc3Bhbj4gOiB1c3VhbGx5IHdoZW4geW91IHNldCBvbmUgb3Igb3RoZXIgd2lk dGgvaGVpZ2h0IHRvIDAgaW4gYSBwcm9maWxlLCB0aGUgYnJvd3NlciBzY2FsZXMgdGhlIG1p c3NpbmcgZGltZW5zaW9uIGF1dG9tYXRpY2FsbHkuIEl0IGRvZXMgdGhpcyBieSBvbWl0dGlu ZyB0aGUgPGNvZGU+d2lkdGg9PC9jb2RlPiBvciA8Y29kZT5oZWlnaHQ9PC9jb2RlPiBhdHRy aWJ1dGUgaW4gdGhlIDxjb2RlPiZsdDtpbWcmZ3Q7PC9jb2RlPiB0YWcuIFRoaXMgbWF5IGNh dXNlIHZpc3VhbCBhcnRlZmFjdHMgYXMgdGhlIHBhZ2UgaXMgcmVuZGVyZWQgYW5kIHRoZSBi cm93c2VyIGNhbGN1bGF0ZXMgdGhlIHNpemVzLiBJZiB5b3Ugd2lzaCB0aGUgcGx1Z2luIHRv IGFkZCB0aGUgYWN0dWFsIGRpbWVuc2lvbiB0byB0aGUgPGNvZGU+Jmx0O2ltZyZndDs8L2Nv ZGU+IHRhZyAodGhlIHNpemUgYXQgdGhlIHRpbWUgdGhlIHRodW1ibmFpbCB3YXMgY3JlYXRl ZCksIHRlbGwgdGhlIHBsdWdpbiB3aXRoIHRoaXMgYXR0cmlidXRlLiBDaG9vc2Ugb25lIG9y IGJvdGggb2YgPGNvZGU+d2lkdGg8L2NvZGU+IG9yIDxjb2RlPmhlaWdodDwvY29kZT4uIENv bW1hLXNlcGFyYXRlIGFzIHJlcXVpcmVkLiBEZWZhdWx0OiB1bnNldDwvbGk+Cgk8L3VsPgoK CTxwPlRoZSB0YWcgd29ya3MgaW5zaWRlIDxjb2RlPiZsdDt0eHA6aW1hZ2VfbGlzdCZndDs8 L2NvZGU+IG9yIGNhbiBiZSB1c2VkIHN0YW5kYWxvbmUgYnkgc3BlY2lmeWluZyB0aGUgPGNv ZGU+aWQ8L2NvZGU+IG9yIDxjb2RlPm5hbWU8L2NvZGU+IGF0dHJpYnV0ZS48L3A+CgoJPGgz IGlkPSJzbWRfaWZfdGh1bWIiPjxjb2RlPiZsdDt0eHA6c21kX2lmX3RodW1ibmFpbC8mZ3Q7 PC9jb2RlPjwvaDM+CgoJPHA+QSBkaXJlY3QgcmVwbGFjZW1lbnQgZm9yIHRoZSBidWlsdCBp biA8Y29kZT4mbHQ7dHhwOmlmX3RodW1ibmFpbCAvJmd0OzwvY29kZT4gdGFnIHdpdGggZXhh Y3RseSB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5LiBJdCBoYXMgb25lIGF0dHJpYnV0ZTo8L3A+ CgoJPHVsPgoJCTxsaT48c3BhbiBjbGFzcz0iYXRubSI+dHlwZTwvc3Bhbj4gOiB1c2UgdGhp cyBhdHRyaWJ1dGUgdG8gY2hlY2sgZm9yIHRodW1ibmFpbHMgb2YgdGhlIGdpdmVuIHByb2Zp bGUgbmFtZS4gZS5nLiA8Y29kZT50eXBlPSZxdW90O01lZGl1bSZxdW90OzwvY29kZT4uIElm IHlvdSBkbyBub3Qgc3BlY2lmeSB0aGlzIGF0dHJpYnV0ZSwgdGhlIGRlZmF1bHQgcHJvZmls ZSB3aWxsIGJlIHRlc3RlZC4gSWYgdGhlcmUgaXMgbm8gZGVmYXVsdCBwcm9maWxlIHRoZSB0 YWcgd2lsbCBhbHdheXMgcmVuZGVyIHRoZSA8Y29kZT4mbHQ7dHhwOmVsc2UgLyZndDs8L2Nv ZGU+IHBvcnRpb248L2xpPgoJPC91bD4KCgk8aDIgaWQ9Imhvd19pdF93b3JrcyI+SG93IGl0 IHdvcmtzPC9oMj4KCgk8cD5Gb3IgcmVmZXJlbmNlLCB3aGVuIHlvdSBjcmVhdGUgYSBwcm9m aWxlIGEgZGlyZWN0b3J5IGlzIGNyZWF0ZWQgd2l0aCB0aGF0IG5hbWUgaW5zaWRlIHlvdXIg PHNwYW4gY2xhc3M9ImNhcHMiPlRYUDwvc3Bhbj4gPGNvZGU+aW1hZ2VzPC9jb2RlPiBmb2xk ZXIuIEluc2lkZSB0aGlzIGZvbGRlciB5b3Ugd2lsbCBmaW5kIGltYWdlcyBvZiB0aGUgZm9y bWF0IDxjb2RlPmlkLmV4dDwvY29kZT46IHdoZXJlIDxjb2RlPmlkPC9jb2RlPiBhbmQgPGNv ZGU+ZXh0PC9jb2RlPiBtYXRjaCB0aGUgY29ycmVzcG9uZGluZyBpbWFnZSBJRHMgaW4gdGhl IDxzcGFuIGNsYXNzPSJjYXBzIj5UWFA8L3NwYW4+IGRhdGFiYXNlLiBUaGF0JiM4MjE3O3Mg cHJldHR5IG11Y2ggaXQuPC9wPgoKCTxwPllvdSBjYW4gZGVsZXRlIHRodW1ibmFpbCBmaWxl cyBtYW51YWxseSBmcm9tIGFueSBvZiB0aGVzZSBkaXJlY3RvcmllcyBhbmQgdGhlIHBsdWdp biB3aWxsIGZpZ3VyZSBldmVyeXRoaW5nIG91dC4gQnV0IGl0JiM4MjE3O3MgcHJvYmFibHkg bm90IGFkdmlzYWJsZSB0byBkZWxldGUgdGhlIGRpcmVjdG9yaWVzIHRoZW1zZWx2ZXMgJiM4 MjEyOyB1c2UgdGhlIDxlbT5bRGVsZXRlXTwvZW0+IGJ1dHRvbnMgaW4gdGhlIGNvbnRyb2wg cGFuZWwgZm9yIHRoYXQuPC9wPgoKCTxoMiBpZD0iY2hhbmdlbG9nIj5DaGFuZ2Vsb2c8L2gy PgoKCTx1bD4KCQk8bGk+MDYgQXVnIDEwIHwgMC4xMGJldGEgfCBJbml0aWFsIGJldGEgcmVs ZWFzZTwvbGk+CgkJPGxpPjA0IE9jdCAxMCB8IDAuMTAgfCBPZmZpY2lhbCBwdWJsaWMgcmVs ZWFzZTwvbGk+CgkJPGxpPjA5IE5vdiAxMCB8IDAuMTEgfCBBZGRlZCA8Y29kZT5mb3JjZV9z aXplPC9jb2RlPiBhbmQgPGNvZGU+YWRkX3N0YW1wPC9jb2RlPiAoYm90aCB0aGFua3MgemVy bykgOyByZW1vdmVkIHVubmVjZXNzYXJ5IERCIGNhbGw8L2xpPgoJCTxsaT4xMCBOb3YgMTAg IHwgMC4xMiB8IEFkZGVkIGFiaWxpdHkgdG8gc3luYyBkZWZhdWx0IHByb2ZpbGUgdGh1bWJz IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgPHNwYW4gY2xhc3M9ImNhcHMiPlRYUDwvc3Bhbj4g dGh1bWJuYWlscyAodGhhbmtzIHplcm8pPC9saT4KCTwvdWw+Cgo8L2Rpdj4KPCEtLSAqKiog QkVHSU4gUExVR0lOIENTUyAqKiogLS0+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiNzbWRf aGVscCB7IGxpbmUtaGVpZ2h0OjEuNSA7fQojc21kX2hlbHAgY29kZSB7IGZvbnQtd2VpZ2h0 OmJvbGQ7IGZvbnQ6IDEwNSUvMTMwJSAiQ291cmllciBOZXciLCBjb3VyaWVyLCBtb25vc3Bh Y2U7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGQ0M7fQojc21kX2hlbHAgY29kZS5ibG9jayB7 IGZvbnQtd2VpZ2h0Om5vcm1hbDsgYm9yZGVyOjFweCBkb3R0ZWQgIzk5OTsgYmFja2dyb3Vu ZC1jb2xvcjogI2YwZTY4YzsgZGlzcGxheTpibG9jazsgbWFyZ2luOjEwcHggMTBweCAyMHB4 OyBwYWRkaW5nOjEwcHg7IH0KI3NtZF9oZWxwIGgxIHsgY29sb3I6ICMzNjk7IGZvbnQ6IDIw cHggR2VvcmdpYSwgc2Fucy1zZXJpZjsgbWFyZ2luOiAwOyB0ZXh0LWFsaWduOiBjZW50ZXI7 IH0KI3NtZF9oZWxwIGgyIHsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrOyBwYWRk aW5nOjEwcHggMCAwOyBjb2xvcjogIzM2OTsgZm9udDogMTdweCBHZW9yZ2lhLCBzYW5zLXNl cmlmOyB9CiNzbWRfaGVscCBoMyB7IGNvbG9yOiAjMjc1Njg1OyBmb250OiBib2xkIDEycHgg QXJpYWwsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxcHg7IG1hcmdpbjogMTBweCAw IDA7dGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGlu ZTt9CiNzbWRfaGVscCBoNCB7IGZvbnQ6IGJvbGQgMTFweCBBcmlhbCwgc2Fucy1zZXJpZjsg bGV0dGVyLXNwYWNpbmc6IDFweDsgbWFyZ2luOiAxMHB4IDAgMCA7dGV4dC10cmFuc2Zvcm06 IHVwcGVyY2FzZTsgfQojc21kX2hlbHAgLmF0bm0geyBmb250LXdlaWdodDpib2xkOyBjb2xv cjojMzNkOyB9CiNzbWRfaGVscCAubWFuZCB7IGJhY2tncm91bmQ6I2VlZTsgYm9yZGVyOjFw eCBkb3R0ZWQgIzk5OTsgfQojc21kX2hlbHAgdGFibGUge3dpZHRoOjkwJTsgdGV4dC1hbGln bjpjZW50ZXI7IHBhZGRpbmctYm90dG9tOjFlbTt9CiNzbWRfaGVscCB0ZCwgI3NtZF9oZWxw IHRoIHtib3JkZXI6MXB4IHNvbGlkICM5OTk7IHBhZGRpbmc6LjVlbSAwO30KI3NtZF9oZWxw IHVsIHsgbGlzdC1zdHlsZS10eXBlOnNxdWFyZTsgfQojc21kX2hlbHAgLmltcG9ydGFudCB7 Y29sb3I6cmVkO30KI3NtZF9oZWxwIGxpIHsgbWFyZ2luOjVweCAyMHB4IDVweCAzMHB4OyB9 CiNzbWRfaGVscCAuYnJlYWsgeyBtYXJnaW4tdG9wOjVweDsgfQo8L3N0eWxlPgo8IS0tICoq KiBFTkQgUExVR0lOIENTUyAqKiogLS0+CiI7czozOiJtZDUiO3M6MzI6IjNkNGRkMTU1MzY1 YzRhOTA0N2EyZmU2N2E0MDQwNTI4Ijt9