# Name: etc_date v0.3 # Type: Admin/Public side plugin # Custom dates and calendars # Author: Oleg Loukianov # URL: http://www.iut-fbleau.fr/projet/etc/ # Recommended load order: 5 # ..................................................................... # This is a plugin for Textpattern CMS - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ..................................................................... YToxMTp7czo0OiJuYW1lIjtzOjg6ImV0Y19kYXRlIjtzOjY6ImF1dGhvciI7czoxNDoiT2xl ZyBMb3VraWFub3YiO3M6MTA6ImF1dGhvcl91cmkiO3M6MzY6Imh0dHA6Ly93d3cuaXV0LWZi bGVhdS5mci9wcm9qZXQvZXRjLyI7czo3OiJ2ZXJzaW9uIjtzOjM6IjAuMyI7czoxMToiZGVz Y3JpcHRpb24iO3M6MjY6IkN1c3RvbSBkYXRlcyBhbmQgY2FsZW5kYXJzIjtzOjQ6ImNvZGUi O3M6MTQ0NDA6ImlmKEB0eHBpbnRlcmZhY2UgPT0gJ2FkbWluJykgew0KCWFkZF9wcml2cygn ZXRjX2RhdGUnLCAnMSwyJyk7DQoJcmVnaXN0ZXJfdGFiKCJleHRlbnNpb25zIiwgImV0Y19k YXRlIiwgImV0Y19kYXRlIik7DQoJcmVnaXN0ZXJfY2FsbGJhY2soImV0Y19kYXRlX3RhYiIs ICJldGNfZGF0ZSIpOw0KCWFkZF9wcml2cygncGx1Z2luX3ByZWZzLmV0Y19kYXRlJywnMSwy Jyk7DQoJcmVnaXN0ZXJfY2FsbGJhY2soJ2V0Y19kYXRlX3RhYicsICdwbHVnaW5fcHJlZnMu ZXRjX2RhdGUnKTsNCglyZWdpc3Rlcl9jYWxsYmFjaygnZXRjX2RhdGVfaW5zdGFsbCcsICdw bHVnaW5fbGlmZWN5Y2xlLmV0Y19kYXRlJyk7DQp9DQoNCmZ1bmN0aW9uIGV0Y19kYXRlX2lu c3RhbGwoJGV2ZW50PScnLCAkc3RlcD0nJykgew0KCWlmKCRzdGVwID09ICdpbnN0YWxsZWQn KTsgLyp7DQoJCXNldF9wcmVmKCdldGNfZGF0ZV9sb2NhbGVfZXNwZXJhbnRvJywgc2VyaWFs aXplKGFycmF5KA0KCQkJJ21vbnRoJyA9PiBhcnJheSgnamFudWFybycsICdmZWJydWFybycs ICdtYXJ0bycsICdhcHJpbG8nLCAnbWFqbycsICdqdW5pbycsICdqdWxpbycsICdhdWd1c3Rv JywgJ3NlcHRlbWJybycsICdva3RvYnJvJywgJ25vdmVtYnJvJywgJ2RlY2VtYnJvJyksDQoJ CQknd2Vla2RheScgPT4gYXJyYXkoJ2x1bmRvJywgJ21hcmRvJywgJ21lcmtyZWRvJywgJ2ph dWRvJywgJ3ZlbmRyZWRvJywgJ3NhYmF0bycsICdkaW1hbmNobycpDQoJCSkpLCAnZXRjX2Rh dGUnLCBQUkVGX0hJRERFTik7DQoJfSovDQoJZWxzZWlmKCRzdGVwID09ICdkZWxldGVkJykg DQoJCXNhZmVfZGVsZXRlKCd0eHBfcHJlZnMnLCAiZXZlbnQgPSAnZXRjX2RhdGUnIik7DQp9 DQoNCmZ1bmN0aW9uIGV0Y19kYXRlX3RhYigkZXZlbnQsICRzdGVwKSB7DQoJZ2xvYmFsICRw cmVmczsNCgkkZXRjX2NhbGVuZGFycyA9IGFycmF5KCcnLCdoaWpyaScsJ2phbGFsaScpOw0K CWV4dHJhY3QocHNhKGFycmF5KCdsb2MnLCAnb2xkX2xvYycsICdkZWZfbG9jJywgJ2RlZl9j YWwnLCAnZGVmX2Zvcm0nKSkpOw0KDQoJaWYoYm91bmNlcigkc3RlcCwgYXJyYXkoJ3NhdmUn PT50cnVlLCAnZGVmJz0+dHJ1ZSkpKSBpZigkc3RlcCA9PSAnc2F2ZScpIHN3aXRjaChwcygn c2F2ZScpKSB7DQoJCWNhc2UgJ1NhdmUnIDogaWYoJGxvYyAhPSAkb2xkX2xvYykgc2FmZV9k ZWxldGUoJ3R4cF9wcmVmcycsICJuYW1lPSdldGNfZGF0ZV9sb2NhbGVfIi5kb1NsYXNoKCRv bGRfbG9jKS4iJyIpOw0KCQlzZXRfcHJlZignZXRjX2RhdGVfbG9jYWxlXycuJGxvYywgc2Vy aWFsaXplKGFycmF5KCdtb250aCc9PmRvX2xpc3QocHMoJ21vbnRoJykpLCAnd2Vla2RheSc9 PmRvX2xpc3QocHMoJ3dlZWtkYXknKSkpKSwgJ2V0Y19kYXRlJywgUFJFRl9ISURERU4pOw0K CQlicmVhazsNCgkJY2FzZSAnRGVsZXRlJyA6IHNhZmVfZGVsZXRlKCd0eHBfcHJlZnMnLCAi bmFtZT0nZXRjX2RhdGVfbG9jYWxlXyIuZG9TbGFzaCgkbG9jKS4iJyIpOw0KCQlicmVhazsN Cgl9IGVsc2VpZigkc3RlcCA9PSAnZGVmJykgew0KCQkJJHByZWZzWydldGNfZGF0ZV9kZWZh dWx0X2xvY2FsZSddID0gJGRlZl9sb2M7DQoJCQkkcHJlZnNbJ2V0Y19kYXRlX2RlZmF1bHRf Y2FsZW5kYXInXSA9IGluX2FycmF5KCRkZWZfY2FsLCAkZXRjX2NhbGVuZGFycykgPyAkZGVm X2NhbCA6ICcnOw0KCQkJJHByZWZzWydldGNfZGF0ZV9kZWZhdWx0X2Zvcm1hdCddID0gJGRl Zl9mb3JtOw0KCQkJaWYoJHByZWZzWydldGNfZGF0ZV9kZWZhdWx0X2xvY2FsZSddKSBzZXRf cHJlZignZXRjX2RhdGVfZGVmYXVsdF9sb2NhbGUnLCAkcHJlZnNbJ2V0Y19kYXRlX2RlZmF1 bHRfbG9jYWxlJ10sICdldGNfZGF0ZScsIFBSRUZfSElEREVOKTsNCgkJCWVsc2Ugc2FmZV9k ZWxldGUoJ3R4cF9wcmVmcycsICJuYW1lID0gJ2V0Y19kYXRlX2RlZmF1bHRfbG9jYWxlJyIp Ow0KCQkJaWYoJHByZWZzWydldGNfZGF0ZV9kZWZhdWx0X2NhbGVuZGFyJ10pIHNldF9wcmVm KCdldGNfZGF0ZV9kZWZhdWx0X2NhbGVuZGFyJywgJHByZWZzWydldGNfZGF0ZV9kZWZhdWx0 X2NhbGVuZGFyJ10sICdldGNfZGF0ZScsIFBSRUZfSElEREVOKTsNCgkJCWVsc2Ugc2FmZV9k ZWxldGUoJ3R4cF9wcmVmcycsICJuYW1lID0gJ2V0Y19kYXRlX2RlZmF1bHRfY2FsZW5kYXIn Iik7DQoJCQlpZigkcHJlZnNbJ2V0Y19kYXRlX2RlZmF1bHRfZm9ybWF0J10pIHNldF9wcmVm KCdldGNfZGF0ZV9kZWZhdWx0X2Zvcm1hdCcsICRwcmVmc1snZXRjX2RhdGVfZGVmYXVsdF9m b3JtYXQnXSwgJ2V0Y19kYXRlJywgUFJFRl9ISURERU4pOw0KCQkJZWxzZSBzYWZlX2RlbGV0 ZSgndHhwX3ByZWZzJywgIm5hbWUgPSAnZXRjX2RhdGVfZGVmYXVsdF9mb3JtYXQnIik7DQoJ CX0NCg0KCSRkZWZfbG9jID0gZ2V0X3ByZWYoJ2V0Y19kYXRlX2RlZmF1bHRfbG9jYWxlJyk7 DQoJJGRlZl9jYWwgPSBnZXRfcHJlZignZXRjX2RhdGVfZGVmYXVsdF9jYWxlbmRhcicpOw0K CSRkZWZfZm9ybSA9IGdldF9wcmVmKCdldGNfZGF0ZV9kZWZhdWx0X2Zvcm1hdCcpOw0KCSRy cyA9IHNhZmVfcm93cygnbmFtZSwgdmFsJywgJ3R4cF9wcmVmcycsICJuYW1lIGxpa2UgJ2V0 Y19kYXRlX2xvY2FsZV8lJyIpOw0KCSRjYWxlbmRhcnMgPSAnJzsNCglmb3JlYWNoKCRldGNf Y2FsZW5kYXJzIGFzICRjYWxlbmRhcikgJGNhbGVuZGFycyAuPSAnPG9wdGlvbiB2YWx1ZT0i Jy4kY2FsZW5kYXIuJyInLigkY2FsZW5kYXIgPT0gJGRlZl9jYWwgPyAnIHNlbGVjdGVkPSJz ZWxlY3RlZCInIDogJycpLic+Jy4kY2FsZW5kYXIuJzwvb3B0aW9uPic7DQoNCglwYWdldG9w KCJldGNfZGF0ZSIsICI8c3Ryb25nPmV0Y19kYXRlPC9zdHJvbmc+IHByZWZlcmVuY2VzIik7 DQoJZWNobyAnPHN0eWxlPicsDQoJJwkuZXRjLXdpZGUge3dpZHRoOiAxMDAlfScsDQoJJwkj ZXRjLWRlZmF1bHQgbGFiZWwsICNldGMtZGVmYXVsdCBpbnB1dFt0eXBlPSJ0ZXh0Il0sICNl dGMtZGVmYXVsdCBzZWxlY3Qge21hcmdpbi1yaWdodDogMWVtO30nLA0KCSc8L3N0eWxlPic7 DQoJZWNobyAnPGgxPmV0Y19kYXRlIHNldHVwPC9oMT4nLCBuOw0KDQoJZWNobyAnPGgyPkRl ZmF1bHRzPC9oMj4nLCBuOw0KCWVjaG8gJzxmb3JtIGlkPSJldGMtZGVmYXVsdCIgYWN0aW9u PSI/ZXZlbnQ9ZXRjX2RhdGUiIG1ldGhvZD0icG9zdCI+JywgbiwgJzxwPjxsYWJlbD5Mb2Nh bGU8L2xhYmVsPicsIGZJbnB1dCgndGV4dCcsICdkZWZfbG9jJywgJGRlZl9sb2MpLCAnPGxh YmVsPkNhbGVuZGFyPC9sYWJlbD4nLCAnPHNlbGVjdCBuYW1lPSJkZWZfY2FsIj4nLCAkY2Fs ZW5kYXJzLCAnPC9zZWxlY3Q+JywgJzxsYWJlbD5Gb3JtYXQ8L2xhYmVsPicsIGZJbnB1dCgn dGV4dCcsICdkZWZfZm9ybScsICRkZWZfZm9ybSksIHRJbnB1dCgpLCBzSW5wdXQoJ2RlZicp LCBmSW5wdXQoJ3N1Ym1pdCcsICdzYXZlJywgJ1NhdmUnLCAncHVibGlzaCcpLCBuLCAnPC9w PjwvZm9ybT4nLCBuOw0KDQoJZWNobyAnPGgyPkxvY2FsZSBzdHJpbmdzPC9oMj4nLCBuOw0K CWZvcmVhY2goJHJzIGFzICRyb3cpIHsNCgkJJGxvYyA9IHN0cl9yZXBsYWNlKCdldGNfZGF0 ZV9sb2NhbGVfJywgJycsICRyb3dbJ25hbWUnXSk7DQoJCSRkYXRhID0gJHJvd1sndmFsJ10g PyB1bnNlcmlhbGl6ZSgkcm93Wyd2YWwnXSkgOiBudWxsOw0KCQkkbW9udGggPSBpc3NldCgk ZGF0YVsnbW9udGgnXSkgPyBpbXBsb2RlKCcsJywgJGRhdGFbJ21vbnRoJ10pIDogJyc7DQoJ CSR3ZWVrZGF5ID0gaXNzZXQoJGRhdGFbJ3dlZWtkYXknXSkgPyBpbXBsb2RlKCcsJywgJGRh dGFbJ3dlZWtkYXknXSkgOiAnJzsNCgkJZWNobyBldGNfZGF0ZV9mb3JtKGFycmF5KCdsb2Mn PT4kbG9jLCAnbW9udGgnPT4kbW9udGgsICd3ZWVrZGF5Jz0+JHdlZWtkYXkpKTsNCgl9DQoJ ZWNobyBldGNfZGF0ZV9mb3JtKGFycmF5KCdsb2MnPT4nJywgJ21vbnRoJz0+JycsICd3ZWVr ZGF5Jz0+JycpKTsNCg0KCWVjaG8gJzxzY3JpcHQ+JChmdW5jdGlvbiAoKSB7DQoJCSQoIi5s ZXZlciBhW2hyZWY9XCcjZXRjLWZvcm0tXCddIikudHJpZ2dlcigiY2xpY2siKTsNCgl9KTs8 L3NjcmlwdD4nOw0KDQp9DQoNCmZ1bmN0aW9uIGV0Y19kYXRlX2Zvcm0oJHJvdykgew0KCSRs b2MgPSBodG1sc3BlY2lhbGNoYXJzKCRyb3dbJ2xvYyddKTsNCgllY2hvICc8ZGl2PjxoMyBj bGFzcz0ibGV2ZXIiPjxhIGhyZWY9IiNldGMtZm9ybS0nLiRsb2MuJyI+JywgKCRsb2MgPyAn TG9jYWxlICcuJGxvYyA6ICdOZXcgbG9jYWxlJyksICc8L2E+PC9oMz4nLCBuOw0KCWVjaG8g Jzxmb3JtIGlkPSJldGMtZm9ybS0nLiRsb2MuJyIgY2xhc3M9InRvZ2dsZSIgbWV0aG9kPSJw b3N0IiBhY3Rpb249Ij9ldmVudD1ldGNfZGF0ZSI+JywgbjsNCgllY2hvICc8cD48bGFiZWw+ TmFtZTwvbGFiZWw+Jm5ic3A7JywgZklucHV0KCd0ZXh0JywgJ2xvYycsICRyb3dbJ2xvYydd KSwgJzwvcD4nLCBuOw0KCWVjaG8gJzxwPjxsYWJlbD5Nb250aCBuYW1lcyAoY29tbWEtc2Vw YXJhdGVkKTwvbGFiZWw+PGJyIC8+JywgZklucHV0KCd0ZXh0JywgJ21vbnRoJywgJHJvd1sn bW9udGgnXSwgJ2V0Yy13aWRlJyksICc8L3A+JywgbjsNCgllY2hvICc8cD48bGFiZWw+V2Vl a2RheSBuYW1lcyAoY29tbWEtc2VwYXJhdGVkKSBzdHJhdGluZyB3aXRoIFN1bmRheTwvbGFi ZWw+PGJyIC8+JywgZklucHV0KCd0ZXh0JywgJ3dlZWtkYXknLCAkcm93Wyd3ZWVrZGF5J10s ICdldGMtd2lkZScpLCAnPC9wPicsIG47DQoJZWNobyAnPHA+Jywgc0lucHV0KCdzYXZlJyks IGhJbnB1dCgnb2xkX2xvYycsICRyb3dbJ2xvYyddKSwgdElucHV0KCksIGZJbnB1dCgnc3Vi bWl0JywgJ3NhdmUnLCAnU2F2ZScsICdwdWJsaXNoJyksICgkbG9jID8gZklucHV0KCdzdWJt aXQnLCAnc2F2ZScsICdEZWxldGUnLCAncHVibGlzaCcpIDogJycpLCAnPC9wPicsIG47DQoJ ZWNobyAnPC9mb3JtPjwvZGl2Pic7DQp9DQoNCmZ1bmN0aW9uIGV0Y19kYXRlKCRhdHRzLCAk dGhpbmcgPSAnJykgew0KDQoJZ2xvYmFsICR0aGlzYXJ0aWNsZSwgJHByZWZzLCAkYXJjaGl2 ZV9kYXRlZm9ybWF0LCAkbG9jYWxlLCAkZXRjX3RpbWVzdGFtcDsNCglpZihlbXB0eSgkbG9j YWxlKSkgJGxvY2FsZSA9IHNldGxvY2FsZShMQ19USU1FLCAwKTsNCgkkb2xkX2xvY2FsZSA9 ICRsb2NhbGU7DQoJJG9sZF90aW1lc3RhbXAgPSBpc3NldCgkZXRjX3RpbWVzdGFtcCkgPyAk ZXRjX3RpbWVzdGFtcCA6IG51bGw7DQoNCglleHRyYWN0KGxBdHRzKGFycmF5KA0KCQkiY3Vz dG9tIj0+IjAiLA0KCQkiZGF0ZSI9Pm51bGwsDQoJCSJ0aW1lc3RhbXAiPT5udWxsLA0KCQki Y2FsZW5kYXIiPT5pc3NldCgkcHJlZnNbJ2V0Y19kYXRlX2RlZmF1bHRfY2FsZW5kYXInXSkg PyAkcHJlZnNbJ2V0Y19kYXRlX2RlZmF1bHRfY2FsZW5kYXInXSA6ICcnLA0KCQkibGFuZyI9 Pmlzc2V0KCRwcmVmc1snZXRjX2RhdGVfZGVmYXVsdF9sb2NhbGUnXSkgPyAkcHJlZnNbJ2V0 Y19kYXRlX2RlZmF1bHRfbG9jYWxlJ10gOiAnJywNCgkJImZvcm1hdCI9Pmlzc2V0KCRwcmVm c1snZXRjX2RhdGVfZGVmYXVsdF9mb3JtYXQnXSkgPyAkcHJlZnNbJ2V0Y19kYXRlX2RlZmF1 bHRfZm9ybWF0J10gOiAkYXJjaGl2ZV9kYXRlZm9ybWF0LA0KCQkid3JhcHRhZyI9PicnLA0K CQkiYnJlYWsiPT4nJw0KCSksJGF0dHMpKTsNCg0KCSRjdXN0b20gPSBpbnR2YWwoJGN1c3Rv bSk7DQoJJGV0Y19sb2NhbGUgPSAkbGFuZyAmJiAkY3VzdG9tID4gLTIgPyB1bnNlcmlhbGl6 ZShnZXRfcHJlZignZXRjX2RhdGVfbG9jYWxlXycuJGxhbmcpKSA6IG51bGw7DQoJaWYoJGxh bmcgPT0gJG9sZF9sb2NhbGUpICRsYW5nID0gbnVsbDsNCglzd2l0Y2goJGN1c3RvbSkgew0K CQljYXNlIDIgOiAkbGFuZyA9IG51bGw7DQoJCWNhc2UgMSA6IGlmKCRldGNfbG9jYWxlKSAk bGFuZyA9IG51bGw7DQoJCWRlZmF1bHQgOiBpZigkbGFuZykgew0KCQkJaWYoJG5ld19sb2Nh bGUgPSBzZXRsb2NhbGUoTENfVElNRSwgJGxhbmcpKSAkbG9jYWxlID0gJG5ld19sb2NhbGU7 DQoJCQllbHNlICRsb2NhbGUgPSBnZXRsb2NhbGUoJGxhbmcpOy8vc2V0cyAkbG9jYWxlDQoJ CQlpZigkbG9jYWxlICE9ICRvbGRfbG9jYWxlICYmICgkY3VzdG9tIDwgMCB8fCAkY3VzdG9t ID09IDAgJiYgISRjYWxlbmRhcikpICRldGNfbG9jYWxlID0gbnVsbDsNCgkJfQ0KCX0NCglp ZigkY2FsZW5kYXIgJiYgaXNfY2FsbGFibGUoJ2V0Y19kYXRlXycuJGNhbGVuZGFyKSkgJGNh bGVuZGFyID0gJ2V0Y19kYXRlXycuJGNhbGVuZGFyOw0KCWVsc2UgJGNhbGVuZGFyID0gJGV0 Y19sb2NhbGUgPyAnZXRjX2RhdGVfJyA6IG51bGw7DQoJJG91dCA9IGFycmF5KCk7DQoNCglp Zihpc3NldCgkdGltZXN0YW1wKSkgJG91dFtdID0gJHRoaW5nIA0KCQk/IHBhcnNlKEV2YWxF bHNlKCR0aGluZywgJHRpbWVzdGFtcCkpIA0KCQk6IHN0cmZ0aW1lKCRjYWxlbmRhciA/ICRj YWxlbmRhcigkZm9ybWF0LCAkdGltZXN0YW1wLCAkZXRjX2xvY2FsZSkgOiAkZm9ybWF0LCAk dGltZXN0YW1wKTsNCgllbHNlIGZvcmVhY2goZG9fbGlzdCgkZGF0ZSkgYXMgJGRhdGUpIHsN CgkJdW5zZXQoJHRpbWVzdGFtcCk7DQoJCWxpc3QoJGRhdGUsICRzdGVwKSA9IGV4cGxvZGUo JzonLCAkZGF0ZSwgMikgKyBhcnJheShudWxsLCA4NjQwMCk7DQoJCWlmKCRkYXRlKSBzd2l0 Y2goc3RydG9sb3dlcigkZGF0ZSkpIHsNCgkJCWNhc2UgJ3Bvc3RlZCcgOiBjYXNlICdtb2Rp ZmllZCcgOiBjYXNlICdleHBpcmVzJyA6IGlmKGlzc2V0KCR0aGlzYXJ0aWNsZVskZGF0ZV0p KSAkdGltZXN0YW1wID0gJHRoaXNhcnRpY2xlWyRkYXRlXSArIHR6X29mZnNldCgkdGhpc2Fy dGljbGVbJGRhdGVdKTsgYnJlYWs7DQoJCQlkZWZhdWx0IDogaWYoIWVtcHR5KCR0aGlzYXJ0 aWNsZSkpICRkYXRlID0gc3RyX2lyZXBsYWNlKGFycmF5KCdwb3N0ZWQnLCAnbW9kaWZpZWQn LCAnZXhwaXJlcycpLCBhcnJheShkYXRlKCdyJywgJHRoaXNhcnRpY2xlWydwb3N0ZWQnXSks IGRhdGUoJ3InLCAkdGhpc2FydGljbGVbJ21vZGlmaWVkJ10pLCBkYXRlKCdyJywgJHRoaXNh cnRpY2xlWydleHBpcmVzJ10pKSwgJGRhdGUpOw0KCQl9DQoJCUBsaXN0KCRmcm9tLCAkdG8p ID0gZXhwbG9kZSgnLi4nLCAkZGF0ZSwgMik7DQoJCWlmKCFpc3NldCgkdGltZXN0YW1wKSAm JiAoJHRpbWVzdGFtcCA9IHN0cnRvdGltZSgkZnJvbSkpID09PSBmYWxzZSkgJHRpbWVzdGFt cCA9IHRpbWUoKTsNCgkJCQ0KCQlpZighaXNzZXQoJHRvKSB8fCAoJHRvID0gc3RydG90aW1l KCR0bykpID09PSBmYWxzZSkgJHRvID0gJHRpbWVzdGFtcDsNCgkJZm9yKCR0ID0gJHRpbWVz dGFtcDsgJHN0ZXAgPiAwID8gJHQgPD0gJHRvIDogJHQgPj0gJHRvOyAkdCArPSAkc3RlcCkg ew0KCQkJaWYoJGNhbGVuZGFyKSAkZm9ybWF0ID0gJGNhbGVuZGFyKCRmb3JtYXQsICR0LCAk ZXRjX2xvY2FsZSk7DQoJCQkkZXRjX3RpbWVzdGFtcCA9ICR0Ow0KCQkJJG91dFtdID0gJHRo aW5nID8gcGFyc2UoRXZhbEVsc2UoJHRoaW5nLCB0cnVlKSkgOiBzdHJmdGltZSgkZm9ybWF0 LCAkdCk7DQoJCX0NCgl9DQoNCglpZigkb2xkX2xvY2FsZSAhPSAkbG9jYWxlKSAkbG9jYWxl ID0gc2V0bG9jYWxlKExDX1RJTUUsICRvbGRfbG9jYWxlKTsNCgkkZXRjX3RpbWVzdGFtcCA9 ICRvbGRfdGltZXN0YW1wOw0KCXJldHVybiAkb3V0ID8gKCR3cmFwdGFnIHx8ICRicmVhayA/ IGRvV3JhcCgkb3V0LCAkd3JhcHRhZywgJGJyZWFrKSA6IGltcGxvZGUoJycsICRvdXQpKSA6 IHBhcnNlKEV2YWxFbHNlKCR0aGluZywgZmFsc2UpKTsNCn0NCg0KZnVuY3Rpb24gZXRjX2lm X2RhdGUoJGF0dHMsICR0aGluZz1udWxsKSB7DQoNCglnbG9iYWwgJHByZWZzLCAkYXJjaGl2 ZV9kYXRlZm9ybWF0Ow0KDQoJZXh0cmFjdChsQXR0cyhhcnJheSgNCgkJInZhbHVlIj0+bnVs bCwNCgkJImNvbXBhcmUiPT5udWxsLA0KCQkiZGF0ZSI9Pm51bGwsDQoJCSJ0aW1lc3RhbXAi PT5udWxsLA0KCQkiY2FsZW5kYXIiPT5pc3NldCgkcHJlZnNbJ2V0Y19kYXRlX2RlZmF1bHRf Y2FsZW5kYXInXSkgPyAkcHJlZnNbJ2V0Y19kYXRlX2RlZmF1bHRfY2FsZW5kYXInXSA6ICcn LA0KCQkibGFuZyI9Pmlzc2V0KCRwcmVmc1snZXRjX2RhdGVfZGVmYXVsdF9sb2NhbGUnXSkg PyAkcHJlZnNbJ2V0Y19kYXRlX2RlZmF1bHRfbG9jYWxlJ10gOiAnJywNCgkJImZvcm1hdCI9 Pmlzc2V0KCRwcmVmc1snZXRjX2RhdGVfZGVmYXVsdF9mb3JtYXQnXSkgPyAkcHJlZnNbJ2V0 Y19kYXRlX2RlZmF1bHRfZm9ybWF0J10gOiAkYXJjaGl2ZV9kYXRlZm9ybWF0DQoJKSwkYXR0 cykpOw0KDQoJdW5zZXQoJGF0dHNbJ3ZhbHVlJ10sICRhdHRzWydjb21wYXJlJ10pOw0KCWlm KCR2YWx1ZSA9PT0gbnVsbCAmJiAkY29tcGFyZSA9PT0gbnVsbCkgcmV0dXJuICR0aGluZyA/ IHBhcnNlKEV2YWxFbHNlKCR0aGluZywgdHJ1ZSkpIDogZXRjX2RhdGUoJGF0dHMpOw0KCWlm KCR2YWx1ZSA9PT0gbnVsbCkgJHZhbHVlID0gJGNvbXBhcmUvKmV0Y19kYXRlKGFycmF5KCdk YXRlJyA9PiAkY29tcGFyZSkgKyAkYXR0cykqLzsgZWxzZSAkY29tcGFyZSA9IGZhbHNlOw0K CSRkYXRlID0gZXRjX2RhdGUoJGF0dHMpOw0KCSR0ZGF0ZSA9IHRyaW0oJGRhdGUpOw0KLy8J JHJlc3VsdCA9IHRyaW0oJHZhbHVlKSA9PSB0cmltKCRkYXRlKTsNCglmb3JlYWNoKGV4cGxv ZGUoJ3wnLCAkdmFsdWUpIGFzICRyYW5nZSkgaWYoKCRyYW5nZSA9IGx0cmltKCRyYW5nZSkp IHx8ICgkcmFuZ2UgPiAnJykpIHsNCgkJJG5vdCA9ICRyYW5nZVswXSA9PT0gJyEnOw0KCQlp Zigkbm90KSAkcmFuZ2UgPSBzdWJzdHIoJHJhbmdlLCAxKTsNCgkJQGxpc3QoJHN0YXJ0LCAk ZW5kKSA9IGRvX2xpc3QoJHJhbmdlLCAnLi4nKTsNCgkJaWYoJGNvbXBhcmUgIT09IGZhbHNl KSB7DQoJCQlpZigkc3RhcnQgPiAnJykgJHN0YXJ0ID0gZXRjX2RhdGUoYXJyYXkoJ2RhdGUn ID0+ICRzdGFydCkgKyAkYXR0cyk7DQoJCQlpZihpc3NldCgkZW5kKSAmJiAkZW5kID4gJycp ICRlbmQgPSBldGNfZGF0ZShhcnJheSgnZGF0ZScgPT4gJGVuZCkgKyAkYXR0cyk7DQoJCX0N CgkJJHJlc3VsdCA9IGlzc2V0KCRlbmQpID8gKCRzdGFydCA9PT0gJycgfHwgJHN0YXJ0IDw9 ICR0ZGF0ZSkgJiYgKCRlbmQgPT09ICcnIHx8ICR0ZGF0ZSA8PSAkZW5kKSA6ICRzdGFydCA9 PSAkdGRhdGU7DQoJCWlmKCRub3QpICRyZXN1bHQgPSAhJHJlc3VsdDsNCgkJaWYoJHJlc3Vs dCkgYnJlYWs7DQoJfQ0KCXJldHVybiAkdGhpbmcgPyBwYXJzZShFdmFsRWxzZSgkdGhpbmcs ICRyZXN1bHQpKSA6ICgkcmVzdWx0ID8gJGRhdGUgOiAnJyk7DQp9DQoNCmZ1bmN0aW9uIGV0 Y19kYXRlX2RpZmYoJGF0dHMpIHsNCg0KCWlmKCFjbGFzc19leGlzdHMoJ0RhdGVUaW1lJykp IHJldHVybiAnJzsNCg0KCWdsb2JhbCAkdGhpc2FydGljbGU7DQoJZXh0cmFjdChsQXR0cyhh cnJheSgNCgkJImZyb20iPT5udWxsLA0KCQkidG8iPT5udWxsLA0KCQkiZm9ybWF0Ij0+JyVh Jw0KCSksJGF0dHMpKTsNCg0KCWlmKCFlbXB0eSgkdGhpc2FydGljbGUpKSB7DQoJCSRyZXBs YWNlbWVudHMgPSBhcnJheShkYXRlKCdyJywgJHRoaXNhcnRpY2xlWydwb3N0ZWQnXSksIGRh dGUoJ3InLCAkdGhpc2FydGljbGVbJ21vZGlmaWVkJ10pLCBkYXRlKCdyJywgJHRoaXNhcnRp Y2xlWydleHBpcmVzJ10pKTsNCgkJaWYoJGZyb20pICRmcm9tID0gc3RyX2lyZXBsYWNlKGFy cmF5KCdwb3N0ZWQnLCAnbW9kaWZpZWQnLCAnZXhwaXJlcycpLCAkcmVwbGFjZW1lbnRzLCAk ZnJvbSk7DQoJCWlmKCR0bykgJHRvID0gc3RyX2lyZXBsYWNlKGFycmF5KCdwb3N0ZWQnLCAn bW9kaWZpZWQnLCAnZXhwaXJlcycpLCAkcmVwbGFjZW1lbnRzLCAkdG8pOw0KCX0NCgkkaW50 ZXJ2YWwgPSBkYXRlX2RpZmYoZGF0ZV9jcmVhdGUoJGZyb20pLCBkYXRlX2NyZWF0ZSgkdG8p KTsNCglyZXR1cm4gJGludGVydmFsLT5mb3JtYXQoJGZvcm1hdCk7DQp9DQoNCmZ1bmN0aW9u IGV0Y190aW1lc3RhbXAoKSB7DQoJZ2xvYmFsICRldGNfdGltZXN0YW1wOw0KCXJldHVybiBp c3NldCgkZXRjX3RpbWVzdGFtcCkgPyAkZXRjX3RpbWVzdGFtcCA6IHRpbWUoKTsNCn0NCg0K LyoNCiAqIERlZmF1bHQgY2FsZW5kYXIgDQogKi8NCmZ1bmN0aW9uIGV0Y19kYXRlXygkZm9y bWF0LCAkdGltZXN0YW1wLCAkbG9jYWxlPW51bGwpIHsNCg0KCWlmKGlzc2V0KCRsb2NhbGVb J21vbnRoJ10pKSAkbW9udGhuYW1lID0gJGxvY2FsZVsnbW9udGgnXTsNCglpZihpc3NldCgk bG9jYWxlWyd3ZWVrZGF5J10pKSAkZGF5bmFtZSA9ICRsb2NhbGVbJ3dlZWtkYXknXTsNCg0K CWV4dHJhY3QoZ2V0ZGF0ZSgkdGltZXN0YW1wKSk7DQoNCgkkZnJvbSA9ICR0byA9IGFycmF5 KCk7DQoJaWYoaXNzZXQoJGRheW5hbWVbJHdkYXldKSkgeyRmcm9tW10gPSAnJUEnOyAkdG9b XSA9ICRkYXluYW1lWyR3ZGF5XTsgJGZyb21bXSA9ICclYSc7ICR0b1tdID0gJGRheW5hbWVb JHdkYXldO30NCglpZihpc3NldCgkbW9udGhuYW1lWyRtb24tMV0pKSB7JGZyb21bXSA9ICcl Qic7ICR0b1tdID0gJG1vbnRobmFtZVskbW9uLTFdOyAkZnJvbVtdID0gJyViJzsgJHRvW10g PSAkbW9udGhuYW1lWyRtb24tMV07fQ0KCXJldHVybiBzdHJ0cigkZm9ybWF0LCBhcnJheV9j b21iaW5lKCRmcm9tLCAkdG8pKTsNCn0NCg0KLyoNCiAqDQogKiBDYWtlUEhQKHRtKSA6IFJh cGlkIERldmVsb3BtZW50IEZyYW1ld29yayAoaHR0cDovL2Nha2VwaHAub3JnKQ0KICogQ29w eXJpZ2h0IDIwMDUtMjAxMCwgQ2FrZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuIChodHRw Oi8vY2FrZWZvdW5kYXRpb24ub3JnKQ0KICoNCiAqIExpY2Vuc2VkIHVuZGVyIFRoZSBNSVQg TGljZW5zZQ0KICogUmVkaXN0cmlidXRpb25zIG9mIGZpbGVzIG11c3QgcmV0YWluIHRoZSBh Ym92ZSBjb3B5cmlnaHQgbm90aWNlLg0KICoNCiAqLw0KDQpmdW5jdGlvbiBldGNfZGF0ZV9o aWpyaSgkZm9ybWF0LCAkdGltZXN0YW1wLCAkbG9jYWxlPW51bGwpIHsNCg0KCWlmKGlzc2V0 KCRsb2NhbGVbJ21vbnRoJ10pKSAkbW9udGhuYW1lID0gJGxvY2FsZVsnbW9udGgnXTsNCglp Zihpc3NldCgkbG9jYWxlWyd3ZWVrZGF5J10pKSAkZGF5bmFtZSA9ICRsb2NhbGVbJ3dlZWtk YXknXTsNCi8vCSRtb250aG5hbWUgPSBhcnJheSgnTXVoYXJyYW0nLCdTYWZhcicsJ1JhYml1 bGF3YWwnLCdSYWJpdWxha2hpcicsJ0phbWFkaWxhd2FsJywnSmFtYWRpbGFraGlyJywnUmVq YWInLCdTeWFhYmFuJywnUmFtYWRoYW4nLCdTeWF3YWwnLCdadWxrYWVkYWgnLCdadWxoaWpq YWgnKTsNCi8vCSRkYXluYW1lID0gYXJyYXkoJ0HhuKVhZCcsJ0l0aG5heW4nLCdUaHVsYWF0 aGFhJywnQXJiYeKAmWFhJywnS2hhbcSrcycsJ0p1bXXigJlhaCcsJ1NhYnQnKTsvL1N1bmRh eSwgTW9uZGF5LCAuLi4NCg0KCWV4dHJhY3QoZ2V0ZGF0ZSgkdGltZXN0YW1wKSk7DQoNCglp ZiAoKCR5ZWFyPjE1ODIpfHwoKCR5ZWFyPT0xNTgyKSYmKCRtb24+MTApKXx8KCgkeWVhcj09 MTU4MikmJigkbW9uPT0xMCkmJigkbWRheT4xNCkpKXsNCgkJJGpkPShpbnQpKCgxNDYxKigk eWVhcis0ODAwKyhpbnQpKCgkbW9uLTE0KS8xMikpKS80KSsoaW50KSgoMzY3KigkbW9uLTIt MTIqKChpbnQpKCgkbW9uLTE0KS8xMikpKSkvMTIpLShpbnQpKCAoMyogKChpbnQpKCAgKCR5 ZWFyKzQ5MDArICAgIChpbnQpKCAoJG1vbi0xNCkvMTIpKS8xMDApKSkvNCkrJG1kYXktMzIw NzU7DQoJfSBlbHNlIHsNCgkJJGpkID0gMzY3KiR5ZWFyLShpbnQpKCg3KigkeWVhcis1MDAx KyhpbnQpKCgkbW9uLTkpLzcpKSkvNCkrKGludCkoKDI3NSokbW9uKS85KSskbWRheSsxNzI5 Nzc3Ow0KCX0NCgkkbD0kamQtMTk0ODQ0MCsxMDYzMjsNCgkkbj0oaW50KSgoJGwtMSkvMTA2 MzEpOw0KCSRsPSRsLTEwNjMxKiRuKzM1NDsNCgkkaj0oKGludCkoKDEwOTg1LSRsKS81MzE2 KSkqKChpbnQpKCg1MCokbCkvMTc3MTkpKSsoKGludCkoJGwvNTY3MCkpKigoaW50KSgoNDMq JGwpLzE1MjM4KSk7DQoJJGw9JGwtKChpbnQpKCgzMC0kaikvMTUpKSooKGludCkoKDE3NzE5 KiRqKS81MCkpLSgoaW50KSgkai8xNikpKigoaW50KSgoMTUyMzgqJGopLzQzKSkrMjk7DQoJ JG1vbj0oaW50KSgoMjQqJGwpLzcwOSk7DQoJJG1kYXk9JGwtKGludCkoKDcwOSokbW9uKS8y NCk7DQoJJHllYXI9MzAqJG4rJGotMzA7DQoNCgkkZnJvbSA9IGFycmF5KCclZCcsICclZScs ICclbScsICclWScpOw0KCSR0byA9IGFycmF5KCRtZGF5LCAkbWRheSwgJG1vbiwgJHllYXIp Ow0KCWlmKGlzc2V0KCRkYXluYW1lWyR3ZGF5XSkpIHskZnJvbVtdID0gJyVBJzsgJHRvW10g PSAkZGF5bmFtZVskd2RheV07ICRmcm9tW10gPSAnJWEnOyAkdG9bXSA9ICRkYXluYW1lWyR3 ZGF5XTt9DQoJJG1uYW1lID0gaXNzZXQoJG1vbnRobmFtZVskbW9uLTFdKSA/ICRtb250aG5h bWVbJG1vbi0xXSA6IHN0cmZ0aW1lKCclQicsIG1rdGltZSgwLCAwLCAwLCAkbW9uKSk7DQoJ aWYoJG1uYW1lKSB7JGZyb21bXSA9ICclQic7ICR0b1tdID0gJG1uYW1lOyAkZnJvbVtdID0g JyViJzsgJHRvW10gPSAkbW5hbWU7ICRmcm9tW10gPSAnJWgnOyAkdG9bXSA9ICRtbmFtZTt9 DQovLwlpZihpc3NldCgkbW9udGhuYW1lWyRtb24tMV0pKSB7JGZyb21bXSA9ICclQic7ICR0 b1tdID0gJG1vbnRobmFtZVskbW9uLTFdOyAkZnJvbVtdID0gJyViJzsgJHRvW10gPSAkbW9u dGhuYW1lWyRtb24tMV07ICRmcm9tW10gPSAnJWgnOyAkdG9bXSA9ICRtb250aG5hbWVbJG1v bi0xXTt9DQoJcmV0dXJuIHN0cnRyKCRmb3JtYXQsIGFycmF5X2NvbWJpbmUoJGZyb20sICR0 bykpOw0KfQ0KDQpmdW5jdGlvbiBldGNfZGF0ZV9qYWxhbGkgKCRmb3JtYXQsICR0aW1lc3Rh bXAsICRsb2NhbGU9bnVsbCAvKiRnX3ksICRnX20sICRnX2QqLykNCnsNCglpZihpc3NldCgk bG9jYWxlWydtb250aCddKSkgJG1vbnRobmFtZSA9ICRsb2NhbGVbJ21vbnRoJ107DQoJaWYo aXNzZXQoJGxvY2FsZVsnd2Vla2RheSddKSkgJGRheW5hbWUgPSAkbG9jYWxlWyd3ZWVrZGF5 J107DQoNCglleHRyYWN0KGdldGRhdGUoJHRpbWVzdGFtcCkpOw0KDQoJJGdfZGF5c19pbl9t b250aCA9IGFycmF5KDMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAz MCwgMzEpOw0KCSRqX2RheXNfaW5fbW9udGggPSBhcnJheSgzMSwgMzEsIDMxLCAzMSwgMzEs IDMxLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDI5KTsNCg0KCSRneSA9ICR5ZWFyLTE2MDA7Ly8k Z195DQoJJGdtID0gJG1vbi0xOy8vJGdfbQ0KCSRnZCA9ICRtZGF5LTE7Ly8kZ19kDQoNCgkk Z19kYXlfbm8gPSAzNjUqJGd5K2ludHZhbCgoJGd5KzMpLzQpLWludHZhbCgoJGd5Kzk5KS8x MDApK2ludHZhbCgoJGd5KzM5OSkvNDAwKTsNCg0KCWZvciAoJGk9MDsgJGkgPCAkZ207ICsr JGkpDQoJCSRnX2RheV9ubyArPSAkZ19kYXlzX2luX21vbnRoWyRpXTsNCglpZiAoJGdtPjEg JiYgKCgkZ3klND09MCAmJiAkZ3klMTAwIT0wKSB8fCAoJGd5JTQwMD09MCkpKQ0KCS8qIGxl YXAgYW5kIGFmdGVyIEZlYiAqLw0KCQkkZ19kYXlfbm8rKzsNCgkkZ19kYXlfbm8gKz0gJGdk Ow0KCSRqX2RheV9ubyA9ICRnX2RheV9uby03OTsNCg0KCSRqX25wID0gaW50dmFsKCRqX2Rh eV9uby8xMjA1Myk7IC8qIDEyMDUzID0gMzY1KjMzICsgMzIvNCAqLw0KCSRqX2RheV9ubyA9 ICRqX2RheV9ubyAlIDEyMDUzOw0KDQoJJGp5ID0gOTc5KzMzKiRqX25wKzQqaW50dmFsKCRq X2RheV9uby8xNDYxKTsgLyogMTQ2MSA9IDM2NSo0ICsgNC80ICovDQoNCgkkal9kYXlfbm8g JT0gMTQ2MTsNCg0KCWlmICgkal9kYXlfbm8gPj0gMzY2KSB7DQoJCSRqeSArPSBpbnR2YWwo KCRqX2RheV9uby0xKS8zNjUpOw0KCQkkal9kYXlfbm8gPSAoJGpfZGF5X25vLTEpJTM2NTsN Cgl9DQoNCglmb3IgKCRpID0gMDsgJGkgPCAxMSAmJiAkal9kYXlfbm8gPj0gJGpfZGF5c19p bl9tb250aFskaV07ICsrJGkpDQoJCSRqX2RheV9ubyAtPSAkal9kYXlzX2luX21vbnRoWyRp XTsNCgkkeWVhciA9ICRqeTsNCgkkbW9uID0gJGkrMTsNCgkkbWRheSA9ICRqX2RheV9ubysx Ow0KDQoJJGZyb20gPSBhcnJheSgnJWQnLCAnJWUnLCAnJW0nLCAnJVknKTsNCgkkdG8gPSBh cnJheSgkbWRheSwgJG1kYXksICRtb24sICR5ZWFyKTsNCglpZihpc3NldCgkZGF5bmFtZVsk d2RheV0pKSB7JGZyb21bXSA9ICclQSc7ICR0b1tdID0gJGRheW5hbWVbJHdkYXldOyAkZnJv bVtdID0gJyVhJzsgJHRvW10gPSAkZGF5bmFtZVskd2RheV07fQ0KCSRtbmFtZSA9IGlzc2V0 KCRtb250aG5hbWVbJG1vbi0xXSkgPyAkbW9udGhuYW1lWyRtb24tMV0gOiBzdHJmdGltZSgn JUInLCBta3RpbWUoMCwgMCwgMCwgJG1vbikpOw0KCWlmKCRtbmFtZSkgeyRmcm9tW10gPSAn JUInOyAkdG9bXSA9ICRtbmFtZTsgJGZyb21bXSA9ICclYic7ICR0b1tdID0gJG1uYW1lOyAk ZnJvbVtdID0gJyVoJzsgJHRvW10gPSAkbW5hbWU7fQ0KCXJldHVybiBzdHJ0cigkZm9ybWF0 LCBhcnJheV9jb21iaW5lKCRmcm9tLCAkdG8pKTsNCn0iO3M6NDoidHlwZSI7czoxOiIxIjtz OjU6Im9yZGVyIjtzOjE6IjUiO3M6NToiZmxhZ3MiO3M6MToiMSI7czo0OiJoZWxwIjtzOjMz MTU6Igk8aDQ+RGVzY3JpcHRpb248L2g0PgoKCTxwPlRoaXMgcGx1Z2luIGRpc3BsYXlzIGRh dGVzIGluIGN1c3RvbSBsb2NhbGVzLiBJdCBpbnRyb2R1Y2VzIHRocmVlIHRhZ3M6IDxjb2Rl PiZsdDt0eHA6ZXRjX2RhdGUgLyZndDs8L2NvZGU+LCA8Y29kZT4mbHQ7dHhwOmV0Y19pZl9k YXRlIC8mZ3Q7PC9jb2RlPiBhbmQgPGNvZGU+Jmx0O3R4cDpldGNfZGF0ZV9kaWZmIC8mZ3Q7 PC9jb2RlPi4gVGhlIGxhc3Qgb25lIHJlcXVpcmVzIDxzcGFuIGNsYXNzPSJjYXBzIj5QSFA8 L3NwYW4+IERhdGVUaW1lIGV4dGVuc2lvbi48L3A+CgoJPGg0PkF0dHJpYnV0ZXM8L2g0PgoK CTxoNT5Db21tb24gdG8gPGNvZGU+Jmx0O3R4cDpldGNfZGF0ZSAvJmd0OzwvY29kZT4gYW5k IDxjb2RlPiZsdDt0eHA6ZXRjX2lmX2RhdGUgLyZndDs8L2NvZGU+PC9oNT4KCgk8dWw+CgkJ PGxpPjxzdHJvbmc+dGltZXN0YW1wPC9zdHJvbmc+OiB0aW1lc3RhbXAsIG9yPC9saT4KCQk8 bGk+PHN0cm9uZz5kYXRlPC9zdHJvbmc+OiA8Y29kZT5wb3N0ZWQ8L2NvZGU+LCA8Y29kZT5t b2RpZmllZDwvY29kZT4sIDxjb2RlPmV4cGlyZXM8L2NvZGU+LCBzb21lIDxhIGhyZWY9Imh0 dHA6Ly93d3cucGhwLm5ldC9tYW51YWwvZW4vZGF0ZXRpbWUuZm9ybWF0cy5waHAiPmRhdGUg c3RyaW5nPC9hPiAoY3VycmVudCBzZXJ2ZXIgZGF0ZSBieSBkZWZhdWx0KS48L2xpPgoJCTxs aT48c3Ryb25nPmZvcm1hdDwvc3Ryb25nPjogPGEgaHJlZj0iaHR0cDovL3d3dy5waHAubmV0 L21hbnVhbC9lbi9mdW5jdGlvbi5zdHJmdGltZS5waHAiPnN0cmZ0aW1lPC9hPiBvdXRwdXQg Zm9ybWF0IChleGFtcGxlOiA8Y29kZT4lZCAlQiAlWTwvY29kZT4pLjwvbGk+CgkJPGxpPjxz dHJvbmc+bGFuZzwvc3Ryb25nPjogbmFtZSBvZiBkZXNpcmVkIGxhbmd1YWdlIHN0cmluZyBv ciBsb2NhbGUgKGV4YW1wbGU6IDxjb2RlPmZyLWZyPC9jb2RlPiBvciA8Y29kZT5mcl9GUjwv Y29kZT4sIHByZWZlcnJlZCkuIFlvdSBjYW4gZGVmaW5lIGN1c3RvbSBsb2NhbGUgc3RyaW5n cyBpbiA8Y29kZT5ldGNfZGF0ZTwvY29kZT4gYWRtaW4gdGFiLjwvbGk+CgkJPGxpPjxzdHJv bmc+Y2FsZW5kYXI8L3N0cm9uZz46IGN1c3RvbSBmdW5jdGlvbiBmb3IgZGF0ZXMgb3V0cHV0 IChjdXJyZW50bHkgb25seSA8Y29kZT5oaWpyaTwvY29kZT4gYW5kIDxjb2RlPmphbGFsaTwv Y29kZT4gYXJlIGF2YWlsYWJsZSkuPC9saT4KCQk8bGk+PHN0cm9uZz5jdXN0b208L3N0cm9u Zz46IG9uZSBvZiA8Y29kZT4yLDEsMCwtMSwtMjwvY29kZT4sIGZvciBmaW5lLXR1bmluZy4K CTx1bD4KCQk8bGk+PGNvZGU+MjwvY29kZT46IHVzZSBvbmx5IGN1c3RvbSBsb2NhbGVzLjwv bGk+CgkJPGxpPjxjb2RlPjE8L2NvZGU+OiBpZiBjdXN0b20gbG9jYWxlIGRvZXMgbm90IGV4 aXN0LCBzZWFyY2ggc3lzdGVtIGxvY2FsZXMuPC9saT4KCQk8bGk+PGNvZGU+MDwvY29kZT4g KGRlZmF1bHQpOiBzZWFyY2ggZm9yIGJvdGggY3VzdG9tIGFuZCBzeXN0ZW0gbG9jYWxlcy48 L2xpPgoJCTxsaT48Y29kZT4tMTwvY29kZT46IGlmIHN5c3RlbSBsb2NhbGUgZG9lcyBub3Qg ZXhpc3QsIHNlYXJjaCBjdXN0b20gbG9jYWxlcy48L2xpPgoJCTxsaT48Y29kZT4tMjwvY29k ZT46IHVzZSBvbmx5IHN5c3RlbSBsb2NhbGVzLjwvbGk+Cgk8L3VsPjwvbGk+Cgk8L3VsPgoK CTxoNT48Y29kZT5ldGNfaWZfZGF0ZTwvY29kZT4tc3BlY2lmaWM8L2g1PgoKCTx1bD4KCQk8 bGk+PHN0cm9uZz5jb21wYXJlPC9zdHJvbmc+OiBhIGRhdGUgdG8gcHJvY2VzcyBhbmQgY29t cGFyZSB0aGUgcHJvY2Vzc2VkIDxzdHJvbmc+ZGF0ZTwvc3Ryb25nPiBhZ2FpbnN0LCBvcjwv bGk+CgkJPGxpPjxzdHJvbmc+dmFsdWU8L3N0cm9uZz46IGEgdmFsdWUgdG8gbGl0ZXJhbGx5 IGNvbXBhcmUgdGhlIHByb2Nlc3NlZCA8c3Ryb25nPmRhdGU8L3N0cm9uZz4gYWdhaW5zdC48 L2xpPgoJPC91bD4KCgk8cD5Cb3RoIGNhbiBiZSBvbmUgb3IgbW9yZSA8Y29kZT58PC9jb2Rl Pi1zZXBhcmF0ZWQgcmFuZ2VzIG9mIHRoZSBmb3JtIDxjb2RlPnN0YXJ0Li5lbmQ8L2NvZGU+ LiBJZiBhIHJhbmdlIHN0YXJ0cyB3aXRoIDxjb2RlPiE8L2NvZGU+LCBpdCB3aWxsIGJlIGlu dmVydGVkLjwvcD4KCgk8aDU+PGNvZGU+ZXRjX2RhdGVfZGlmZjwvY29kZT4tc3BlY2lmaWM8 L2g1PgoKCTx1bD4KCQk8bGk+PHN0cm9uZz5mcm9tPC9zdHJvbmc+OiBFbmdsaXNoIDxlbT5m cm9tPC9lbT4gZGF0ZS48L2xpPgoJCTxsaT48c3Ryb25nPnRvPC9zdHJvbmc+OiBFbmdsaXNo IDxlbT50bzwvZW0+IGRhdGUuPC9saT4KCQk8bGk+PHN0cm9uZz5mb3JtYXQ8L3N0cm9uZz46 IDxhIGhyZWY9Imh0dHA6Ly93d3cucGhwLm5ldC9tYW51YWwvZW4vZnVuY3Rpb24uc3RyZnRp bWUucGhwIj5zdHJmdGltZTwvYT4gb3V0cHV0IGZvcm1hdCAoZGVmYXVsdDogPGNvZGU+JWE8 L2NvZGU+KS48L2xpPgoJPC91bD4KCgk8aDQ+RXhhbXBsZTwvaDQ+CgoJPHA+PGNvZGU+Jmx0 O3R4cDpldGNfZGF0ZSBkYXRlPSZxdW90O3Bvc3RlZCZxdW90OyAvJmd0OzwvY29kZT4gKHJl cGxhY2VzIDxjb2RlPiZsdDt0eHA6cG9zdGVkIC8mZ3Q7PC9jb2RlPiBpbiBhcnRpY2xlIGZv cm0pLCBvciA8Y29kZT4mbHQ7dHhwOmV0Y19kYXRlIGRhdGU9JnF1b3Q7bmV4dCBGcmlkYXkm cXVvdDsgLyZndDs8L2NvZGU+LjwvcD4KCjxwcmU+PGNvZGU+Jmx0O3R4cDpldGNfaWZfZGF0 ZSBkYXRlPSZxdW90O2V4cGlyZXMmcXVvdDsgY29tcGFyZT0mcXVvdDtub3cuLiszIGRheXMm cXVvdDsgZm9ybWF0PSZxdW90OyVzJnF1b3Q7Jmd0OwoJVGhpcyBhcnRpY2xlIGV4cGlyZXMg aW4gbGVzcyB0aGFuICZsdDt0eHA6ZXRjX2RhdGVfZGlmZiBmcm9tPSZxdW90O3llc3RlcmRh eSZxdW90OyB0bz0mcXVvdDtleHBpcmVzJnF1b3Q7IC8mZ3Q7IGRheXMhCiZsdDsvdHhwOmV0 Y19pZl9kYXRlJmd0Owo8L2NvZGU+PC9wcmU+Cgo8cHJlPjxjb2RlPiZsdDt0eHA6ZXRjX2lm X2RhdGUgdmFsdWU9JnF1b3Q7MTItMjQuLjEyLTMxIHwgMDEtMDEuLjAxLTAyJnF1b3Q7IGZv cm1hdD0mcXVvdDslbS0lZCZxdW90OyZndDsKCUNsb3NlZCBmb3Igd2ludGVyIGhvbGlkYXlz IQombHQ7L3R4cDpldGNfaWZfZGF0ZSZndDsKPC9jb2RlPjwvcHJlPgoKCTxoND5TZXR0aW5n czwvaDQ+CgoJPHA+VGhlIHBsdWdpbiB3aWxsIGNyZWF0ZSA8Y29kZT5ldGNfZGF0ZTwvY29k ZT4gdGFiIHVuZGVyIDxjb2RlPkV4dGVuc2lvbnM8L2NvZGU+LiBJZiB5b3UgbmVlZCB0byBk ZWZpbmUgY3VzdG9tIGxvY2FsZXMsIHlvdSBzaG91bGQgc2V0IHRoZSAoc2VsZi1leHBsYW5h dG9yeSkgZGVmYXVsdHMgdGhlcmUuPC9wPiI7czozOiJtZDUiO3M6MzI6IjY1ZTgwNGZiZDg4 OGM5NjQ0MGZkY2E2NWRhNTQ4YTIzIjt9