# Name: smd_user_manager v0.10 # Type: Admin side plugin # Manage user accounts, groups and privileges # Author: Stef Dawson # URL: http://stefdawson.com/ # Recommended load order: 9 # ..................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ..................................................................... YToxMTp7czo0OiJuYW1lIjtzOjE2OiJzbWRfdXNlcl9tYW5hZ2VyIjtzOjY6ImF1dGhvciI7 czoxMToiU3RlZiBEYXdzb24iO3M6MTA6ImF1dGhvcl91cmkiO3M6MjI6Imh0dHA6Ly9zdGVm ZGF3c29uLmNvbS8iO3M6NzoidmVyc2lvbiI7czo0OiIwLjEwIjtzOjExOiJkZXNjcmlwdGlv biI7czo0MzoiTWFuYWdlIHVzZXIgYWNjb3VudHMsIGdyb3VwcyBhbmQgcHJpdmlsZWdlcyI7 czo0OiJjb2RlIjtzOjYwMDcxOiIvKioNCiAqIHNtZF91c2VyX21hbmFnZXINCiAqDQogKiBB IFRleHRwYXR0ZXJuIENNUyBwbHVnaW4gZm9yIGNvbXBsZXRlIHVzZXIgYWRtaW5pc3RyYXRp b246DQogKiAgLT4gU2VhcmNoIC8gZmlsdGVyIC8gYWx0ZXIgaW5mbyBvbiB1c2VycyAod2l0 aCBhc3NldCBjb3VudHMpDQogKiAgLT4gQ3JlYXRlIC8gYWx0ZXIgZ3JvdXBzIChyb2xlcykN CiAqICAtPiBDcmVhdGUgLyBjdXN0b21pc2UgcHJpdnMgKGFyZWFzKQ0KICogIC0+IE9ubGlu ZSB1c2VyIGxpc3QNCiAqDQogKiBAYXV0aG9yIFN0ZWYgRGF3c29uDQogKiBAbGluayAgIGh0 dHA6Ly9zdGVmZGF3c29uLmNvbS8NCiAqLw0KaWYgKCFkZWZpbmVkKCdTTURfVU1fUFJJVlMn KSkgew0KCWRlZmluZSgiU01EX1VNX1BSSVZTIiwgJ3NtZF91bV9wcml2cycpOw0KfQ0KaWYg KCFkZWZpbmVkKCdTTURfVU1fR1JPVVBTJykpIHsNCglkZWZpbmUoIlNNRF9VTV9HUk9VUFMi LCAnc21kX3VtX2dyb3VwcycpOw0KfQ0KDQppZihAdHhwaW50ZXJmYWNlID09ICdhZG1pbicp IHsNCglnbG9iYWwgJHNtZF91bV9ldmVudCwgJHNtZF91bV9zdHlsZXMsICRzbWRfdW1fcHJl ZnMsICR0eHBfcGVybWlzc2lvbnMsICR0eHBfZ3JvdXBzLCAkdHhwX3VzZXIsICRldmVudCwg JHN0ZXA7DQoJJHNtZF91bV9ldmVudCA9ICdzbWRfdW0nOw0KDQoJLy8gU3R5bGVzIGluY2x1 ZGUgYSBoYWNrIGZvciBSZW1vcmEgKCNuYXYgbGkgdWwpIHRvIHByZXZlbnQgbWVudSBmcm9t IGRpc2FwcGVhcmluZyB1bmRlciB0aGUNCgkvLyBwcml2cyBjb250ZW50LiBUaGlzIG9ubHkg b2NjdXJzIGJlY2F1c2UgdGhlIC5zbWRfdW1fcHJpdmdyb3VwIGNsYXNzIHVzZXMgcG9zaXRp b246cmVsYXRpdmUuDQoJLy8gTmVlZHMgd29ya2Fyb3VuZCBhcyBpdCBhZmZlY3RzIG90aGVy IHBsdWdpbnMuDQoJJHNtZF91bV9zdHlsZXMgPSBhcnJheSgNCgkJJ2NvbnRyb2wtcGFuZWwn ID0+DQonI3NtZF91bV9jb250cm9sIHsgdGV4dC1hbGlnbjpjZW50ZXI7IH0NCiNzbWRfdW1f Y29udHJvbCAuc2VhcmNoLWZvcm0sICNzbWRfdW1fY29udHJvbCAuc21kX3VtX3RpdGxlLCAu c21kX3VtX2J1dHRvbnMgeyBkaXNwbGF5OmlubGluZS1ibG9jazsgbWFyZ2luOjAgMzBweDsg fQ0KLnNtZF91bV9wcml2Z3JvdXAgeyBtYXJnaW46MTBweCBhdXRvOyB3aWR0aDo1MCU7IHBv c2l0aW9uOnJlbGF0aXZlOyB9DQouc21kX3VtX3ByaXZncm91cCBoMiB7IHRleHQtYWxpZ246 bGVmdDsgZm9udC13ZWlnaHQ6Ym9sZDsgfQ0KLnNtZF9hY3RpdmUgeyBmb250LXdlaWdodDpi b2xkOyB9DQouc21kX3VtX3ByaXZzYXZlIHsgcG9zaXRpb246YWJzb2x1dGU7IGxlZnQ6LTU1 cHg7IHRvcDowOyB9DQouc21kX3VtX3RpdGxlIHsgZm9udC1zaXplOiAxMzAlOyBtYXJnaW46 MCAzMHB4IDEwcHghaW1wb3J0YW50OyB9DQouc21kX3VtX2FjdGl2ZV91c2VycyB7IG1hcmdp bjoxNXB4IGF1dG87IHRleHQtYWxpZ246Y2VudGVyOyB3aWR0aDo4MCU7IH0NCi5zbWRfdW1f c2VsZWN0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9yOiNlMmRmY2U7IH0NCi5zbWRfdW1fZ3JwX25h bWUsIC5zbWRfdW1fcHJ2X25hbWUsIC5zbWRfdW1fcmVzZXRfY29sIHsgY3Vyc29yOnBvaW50 ZXI7IH0NCi5zbWRfdW1fY2hlY2tib3gsIC5zbWRfdW1fcHJ2X2hkciB7IHRleHQtYWxpZ246 Y2VudGVyIWltcG9ydGFudDsgfQ0KI25hdiBsaSB1bCB7IHotaW5kZXg6MTAwMDA7IH0nLA0K CSk7DQoNCglhZGRfcHJpdnMoJHNtZF91bV9ldmVudC4nLnVzci5saXN0JywgJzEsIDIsIDMn KTsNCglhZGRfcHJpdnMoJHNtZF91bV9ldmVudC4nLnVzci5lZGl0JywgJzEsIDInKTsNCglh ZGRfcHJpdnMoJHNtZF91bV9ldmVudC4nLnVzci5jcmVhdGUnLCAnMScpOw0KCWFkZF9wcml2 cygkc21kX3VtX2V2ZW50LicuZ3JwJywgJzEnKTsNCglhZGRfcHJpdnMoJHNtZF91bV9ldmVu dC4nLnBydicsICcxJyk7DQoJYWRkX3ByaXZzKCRzbWRfdW1fZXZlbnQuJy5wcmYnLCAnMScp Ow0KCXJlZ2lzdGVyX3RhYignYWRtaW4nLCAkc21kX3VtX2V2ZW50LCBzbWRfdW1fZ1R4dCgn c21kX3VtX3RhYl9uYW1lJykpOw0KCXJlZ2lzdGVyX2NhbGxiYWNrKCdzbWRfdW1fZGlzcGF0 Y2hlcicsICdhZG1pbicpOw0KCXJlZ2lzdGVyX2NhbGxiYWNrKCdzbWRfdW1fZGlzcGF0Y2hl cicsICRzbWRfdW1fZXZlbnQpOw0KCXJlZ2lzdGVyX2NhbGxiYWNrKCdzbWRfdW1fZGlzcGF0 Y2hlcicsICRzbWRfdW1fZXZlbnQuJy51c3IuZWRpdC5vd24nKTsNCglyZWdpc3Rlcl9jYWxs YmFjaygnc21kX3VtX3VzZXJzX3RhYicsICdhZG1pbl9zaWRlJywgJ2hlYWRfZW5kJyk7DQoJ cmVnaXN0ZXJfY2FsbGJhY2soJ3NtZF91bV93ZWxjb21lJywgJ3BsdWdpbl9saWZlY3ljbGUu c21kX3VzZXJfbWFuYWdlcicpOw0KDQoJLy8gTG9nIHRoZSB0aW1lIG9mIHRoaXMgYWNjZXNz IGF0dGVtcHQNCgkkY3Vycl91c2VycyA9IHVuc2VyaWFsaXplKGdldF9wcmVmKCdzbWRfdW1f Y3VycmVudF91c2VycycsICcnKSk7DQoJJGN1cnJfdXNlcnNbJHR4cF91c2VyXSA9IHRpbWUo KTsNCglzZXRfcHJlZignc21kX3VtX2N1cnJlbnRfdXNlcnMnLCBzZXJpYWxpemUoJGN1cnJf dXNlcnMpLCAnc21kX3VtJywgUFJFRl9ISURERU4sICcnLCAwKTsNCg0KCS8vIE1lcmdlIGlu IHRoZSBncm91cHMgb25seSBmb3Igbm93DQoJc21kX3VtX3ByaXZfbWVyZ2UoMSwgMCk7DQoJ aW5jbHVkZV9vbmNlIHR4cGF0aC4nL2xpYi90eHBsaWJfYWRtaW4ucGhwJzsNCg0KCS8vIFBl cm1pdCB1c2VyIHNlbGYtZWRpdGluZw0KCSRzbWRfdW1fZ3JwcyA9IGFycmF5X2tleXMoc21k X3VtX2dldF9ncm91cHMoMCkpOw0KCXVuc2V0KCRzbWRfdW1fZ3Jwc1swXSk7IC8vIFJlbW92 ZSBOb25lIHVzZXINCgkkYWxscHJpdnMgPSBqb2luKCcsJywkc21kX3VtX2dycHMpOw0KCWFk ZF9wcml2cygkc21kX3VtX2V2ZW50LCAkYWxscHJpdnMpOyAvLyBSZXF1aXJlZCB0byBkaXNw bGF5IGFueXRoaW5nIGF0IGFsbCBvbiB0aGUgVXNlciBNYW5hZ2VyIHRhYg0KCWFkZF9wcml2 cygkc21kX3VtX2V2ZW50LicudXNyLmVkaXQub3duJywgJGFsbHByaXZzKTsNCg0KCS8vIE5v dyB0aGUgcHJpdnMgYXJlIGVzdGFibGlzaGVkIGZvciBhbGwgYWRtaW4gc3RlcHMgc28gd2Ug Y2FuIGdvIGFoZWFkDQoJLy8gYW5kIG1lcmdlIGluIHRoZSBjaGFuZ2VzLiBPbmUgY2F2ZWF0 OiBpZiB3ZSdyZSBzYXZpbmcgdGhlIHByaXZzIHdlDQoJLy8gbmVlZCB0byBkZWxheSB0aGUg ZGF0YWJhc2UgbWVyZ2UgdW50aWwgYWZ0ZXIgdGhlIHJlc2V0cyBoYXZlIGJlZW4gYXBwbGll ZCwNCgkvLyBvdGhlcndpc2Ugd2Ugd29uJ3Qga25vdyB3aGF0IHRoZSBkZWZhdWx0cyAoaW4g YWRtaW5fY29uZmlnLnBocCkgYXJlDQoJJGRvX3ByaXZzID0gKCgkc3RlcCA9PSAnc21kX3Vt X3ByaXZzJykgJiYgcHMoJ3NtZF91bV9wcml2X3NhdmUnKSkgPyAwIDogMTsNCglzbWRfdW1f cHJpdl9tZXJnZSgwLCAkZG9fcHJpdnMpOw0KDQoJJHNtZF91bV9wcmVmcyA9IGFycmF5KA0K CQknc21kX3VtX2hpZXJhcmNoaWNhbF9ncm91cHMnID0+IGFycmF5KA0KCQkJJ2h0bWwnICAg ICA9PiAneWVzbm9yYWRpbycsDQoJCQkndHlwZScgICAgID0+IFBSRUZfSElEREVOLA0KCQkJ J3Bvc2l0aW9uJyA9PiAxMCwNCgkJCSdkZWZhdWx0JyAgPT4gJzAnLA0KCQkpLA0KCQknc21k X3VtX2FkbWluX2dyb3VwJyA9PiBhcnJheSgNCgkJCSdodG1sJyAgICAgPT4gJ3NlbGVjdGxp c3QnLA0KCQkJJ3R5cGUnICAgICA9PiBQUkVGX0hJRERFTiwNCgkJCSdwb3NpdGlvbicgPT4g MjAsDQoJCQknY29udGVudCcgID0+IGFycmF5KGdldF9ncm91cHMoKSwgZmFsc2UpLA0KCQkJ J2RlZmF1bHQnICA9PiAnMScsDQoJCSksDQoJCSdzbWRfdW1fbWF4X3NlYXJjaF9saW1pdCcg PT4gYXJyYXkoDQoJCQknaHRtbCcgICAgID0+ICd0ZXh0X2lucHV0JywNCgkJCSd0eXBlJyAg ICAgPT4gUFJFRl9ISURERU4sDQoJCQkncG9zaXRpb24nID0+IDQwLA0KCQkJJ2RlZmF1bHQn ICA9PiAnNTAwJywNCgkJKSwNCgkJJ3NtZF91bV9wYXNzX2xlbmd0aCcgPT4gYXJyYXkoDQoJ CQknaHRtbCcgICAgID0+ICd0ZXh0X2lucHV0JywNCgkJCSd0eXBlJyAgICAgPT4gUFJFRl9I SURERU4sDQoJCQkncG9zaXRpb24nID0+IDUwLA0KCQkJJ2RlZmF1bHQnICA9PiAnMTInLA0K CQkpLA0KCQknc21kX3VtX2FjdGl2ZV90aW1lb3V0JyA9PiBhcnJheSgNCgkJCSdodG1sJyAg ICAgPT4gJ3RleHRfaW5wdXQnLA0KCQkJJ3R5cGUnICAgICA9PiBQUkVGX0hJRERFTiwNCgkJ CSdwb3NpdGlvbicgPT4gNjAsDQoJCQknZGVmYXVsdCcgID0+ICc2MCcsDQoJCSksDQoJKTsN Cn0NCg0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyBQbHVnaW4ganVtcCBvZmYg cG9pbnQNCmZ1bmN0aW9uIHNtZF91bV9kaXNwYXRjaGVyKCRldnQsICRzdHApIHsNCglnbG9i YWwgJHNtZF91bV9ldmVudCwgJHR4cF9wZXJtaXNzaW9ucywgJHR4cF91c2VyLCAkZXZlbnQ7 DQoNCglvYl9lbmRfY2xlYW4oKTsgLy8gS2lsbCBhbnkgZXhpc3RpbmcgQWRtaW4gdGFiIHBh bmVsLi4uDQoJb2Jfc3RhcnQoKTsgLy8gLi4uIGFuZCBzdGFydCBhZ2Fpbg0KDQoJJGV2ZW50 ID0gJHNtZF91bV9ldmVudDsNCgkkc3RwID0gZ3BzKCdzdGVwJyk7DQoJJGF2YWlsYWJsZV9z dGVwcyA9IGFycmF5KA0KCQknc21kX3VtJyAgICAgICAgICAgICAgID0+IGZhbHNlLA0KCQkn c21kX3VtX2VkaXQnICAgICAgICAgID0+IGZhbHNlLA0KCQknc21kX3VtX3NhdmUnICAgICAg ICAgID0+IHRydWUsDQoJCSdzbWRfdW1fc2F2ZV9uZXcnICAgICAgPT4gdHJ1ZSwNCgkJJ3Nt ZF91bV9ncm91cHMnICAgICAgICA9PiB0cnVlLA0KCQknc21kX3VtX3ByaXZzJyAgICAgICAg ID0+IHRydWUsDQoJCSdzbWRfdW1fcHJlZnMnICAgICAgICAgPT4gdHJ1ZSwNCgkJJ3NtZF91 bV9tdWx0aV9lZGl0JyAgICA9PiB0cnVlLA0KCQknc21kX3VtX2NoYW5nZV9wYXNzJyAgID0+ IHRydWUsDQoJCSdzbWRfdW1fY2hhbmdlX3BhZ2VieScgPT4gdHJ1ZSwNCgkJJ3NtZF91bV90 YWJsZV9pbnN0YWxsJyA9PiB0cnVlLA0KCQknc21kX3VtX3RhYmxlX3JlbW92ZScgID0+IHRy dWUsDQoJCSdzYXZlX3BhbmVfc3RhdGUnICAgICAgPT4gdHJ1ZSwNCgkpOw0KDQoJaWYgKCFo YXNfcHJpdnMoJHNtZF91bV9ldmVudC4nLnVzci5saXN0JykpIHsNCgkJJHN0cCA9ICgkc3Rw KSA/ICRzdHAgOiAnc21kX3VtX2VkaXQnOw0KCQkkdWlkID0gc2FmZV9maWVsZCgndXNlcl9p ZCcsICd0eHBfdXNlcnMnLCAibmFtZT0nIiAuIGRvU2xhc2goJHR4cF91c2VyKSAuICInIik7 DQoJCWlmICgkdWlkKSB7DQoJCQkvLyBJbmplY3QgdGhpcyB2YWx1ZSBzbyB0aGUgZWRpdCBz dGVwIHBpY2tzIGl0IHVwIGFuZCBlZGl0cyBvbmx5IHRoZSBjdXJyZW50IHVzZXIuDQoJCQkv LyBUaGUgZWRpdC9zYXZlIHN0ZXBzIHdpbGwgdmVyaWZ5IGlmIHRoZSBjdXJyZW50IHVzZXIg aXMgdGhlIG9uZSB0cnlpbmcgdG8gYmUgZWRpdGVkDQoJCQkvLyB0byBwcmV2ZW50IHBlb3Bs ZSBhZGRpbmcgJnVzZXJfaWQ9TiB0byB0aGUgVVJMDQoJCQkkX1BPU1RbJ3VzZXJfaWQnXSA9 ICR1aWQ7DQoJCX0NCiAgIH0NCglpZiAoJHN0cCA9PSAnc2F2ZV9wYW5lX3N0YXRlJykgew0K CQlzbWRfdW1fc2F2ZV9wYW5lX3N0YXRlKCk7DQoJfSBlbHNlIGlmICghJHN0cCBvciAhYm91 bmNlcigkc3RwLCAkYXZhaWxhYmxlX3N0ZXBzKSkgew0KCQkkc3RwID0gJHNtZF91bV9ldmVu dDsNCgl9DQoJJHN0cCgpOw0KfQ0KDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8v IFRyeSB0byBoaWRlIHRoZSBBZG1pbi0+VXNlcnMgdGFiIGluIHRoZSBzZWNvbmRhcnkgbmF2 IHZpYSBqUXVlcnkuDQovLyBNYXkgZmFpbCB3aXRoIGludmVudGl2ZSBET00gc3RydWN0dXJl cy4NCi8vIChub3RlIHRvIHNlbGY6IGNhbXBhaWduIGZvciBpbXByb3ZlbWVudCBpbiB0aGlz IGFyZWEgYmVjYXVzZSBqUXVlcnkgc21lbGxzIGhhY2tpc2gpDQpmdW5jdGlvbiBzbWRfdW1f dXNlcnNfdGFiKCkgew0KCSR1c2VyU3RyID0gZ1R4dCgndGFiX3NpdGVfYWRtaW4nKTsNCgll Y2hvIDw8PCBFT0pTDQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQoJalF1ZXJ5 KGZ1bmN0aW9uKCkgew0KCQlqUXVlcnkoImFbaHJlZj0nP2V2ZW50PWFkbWluJ10iKS5lYWNo KGZ1bmN0aW9uKCkgew0KCQkJbWUgPSBqUXVlcnkodGhpcyk7DQoJCQlpZiAobWUudGV4dCgp ID09ICJ7JHVzZXJTdHJ9Iikgew0KCQkJCW1lLnBhcmVudCgpLmhpZGUoKTsNCgkJCX0NCgkJ fSk7DQoJfSk7DQo8L3NjcmlwdD4NCkVPSlM7DQp9DQoNCi8vIC0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQ0KZnVuY3Rpb24gc21kX3VtX3dlbGNvbWUoJGV2dCwgJHN0cCkgew0KCSRtc2cg PSAnJzsNCglzd2l0Y2ggKCRzdHApIHsNCgkJY2FzZSAnaW5zdGFsbGVkJzoNCgkJCXNtZF91 bV90YWJsZV9pbnN0YWxsKDApOw0KCQkJJG1zZyA9ICdTdXBlciBkdXBlciB1c2VycyEnOw0K CQkJYnJlYWs7DQoJCWNhc2UgJ2RlbGV0ZWQnOg0KCQkJc21kX3VtX3RhYmxlX3JlbW92ZSgw KTsNCgkJCWJyZWFrOw0KCX0NCglyZXR1cm4gJG1zZzsNCn0NCg0KLy8gLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tDQovLyBNYWluIHVzZXIgZGlzcGxheSBsaXN0DQpmdW5jdGlvbiBzbWRf dW0oJG1zZz0nJykgew0KCWdsb2JhbCAkc21kX3VtX2V2ZW50LCAkc21kX3VtX3ByZWZzLCAk dHhwX3VzZXIsICRzbWRfdW1fbGlzdF9wYWdlYnksICRzbWRfdW1fc3R5bGVzOw0KDQoJcmVx dWlyZV9wcml2cygkc21kX3VtX2V2ZW50LicudXNyLmxpc3QnKTsNCg0KCWlmICghc21kX3Vt X3RhYmxlX2V4aXN0KDEpKSB7DQoJCXNtZF91bV90YWJsZV9pbnN0YWxsKDApOw0KCX0NCg0K CXBhZ2V0b3Aoc21kX3VtX2dUeHQoJ3NtZF91bV90YWJfbmFtZScpLicgJnJhcXVvOyAnLnNt ZF91bV9nVHh0KCdzbWRfdW1fdXNyX2xibCcpLCAkbXNnKTsNCglleHRyYWN0KHNtZF91bV9i dXR0b25zKCd1c3InKSk7DQoNCglleHRyYWN0KGdwc2EoYXJyYXkoJ3BhZ2UnLCAnc29ydCcs ICdkaXInLCAnY3JpdCcsICdzZWFyY2hfbWV0aG9kJykpKTsNCglpZiAoJHNvcnQgPT09ICcn KSAkc29ydCA9IGdldF9wcmVmKCdzbWRfdW1fc29ydF9jb2x1bW4nLCAnbG9naW4nKTsNCglp ZiAoJGRpciA9PT0gJycpICRkaXIgPSBnZXRfcHJlZignc21kX3VtX3NvcnRfZGlyJywgJ2Rl c2MnKTsNCgkkZGlyID0gKCRkaXIgPT0gJ2FzYycpID8gJ2FzYycgOiAnZGVzYyc7DQoNCglz d2l0Y2ggKCRzb3J0KSB7DQoJCWNhc2UgJ3JlYWxfbmFtZSc6DQoJCQkkc29ydF9zcWwgPSAn UmVhbE5hbWUgJy4kZGlyLicsIGxhc3RfYWNjZXNzIGRlc2MnOw0KCQlicmVhazsNCg0KCQlj YXNlICdlbWFpbCc6DQoJCQkkc29ydF9zcWwgPSAnZW1haWwgJy4kZGlyLicsIGxhc3RfYWNj ZXNzIGRlc2MnOw0KCQlicmVhazsNCg0KCQljYXNlICdwcml2cyc6DQoJCQkkc29ydF9zcWwg PSAncHJpdnMgJy4kZGlyLicsIGxhc3RfYWNjZXNzIGRlc2MnOw0KCQlicmVhazsNCg0KCQlj YXNlICdhcnRpY2xlX2NvdW50JzoNCgkJCSRzb3J0X3NxbCA9ICdhcnRpY2xlX2NvdW50ICcu JGRpci4nLCBsYXN0X2FjY2VzcyBkZXNjJzsNCgkJYnJlYWs7DQoNCgkJY2FzZSAnaW1hZ2Vf Y291bnQnOg0KCQkJJHNvcnRfc3FsID0gJ2ltYWdlX2NvdW50ICcuJGRpci4nLCBsYXN0X2Fj Y2VzcyBkZXNjJzsNCgkJYnJlYWs7DQoNCgkJY2FzZSAnZmlsZV9jb3VudCc6DQoJCQkkc29y dF9zcWwgPSAnZmlsZV9jb3VudCAnLiRkaXIuJywgbGFzdF9hY2Nlc3MgZGVzYyc7DQoJCWJy ZWFrOw0KDQoJCWNhc2UgJ2xpbmtfY291bnQnOg0KCQkJJHNvcnRfc3FsID0gJ2xpbmtfY291 bnQgJy4kZGlyLicsIGxhc3RfYWNjZXNzIGRlc2MnOw0KCQlicmVhazsNCg0KCQljYXNlICds YXN0X2xvZ2luJzoNCgkJCSRzb3J0X3NxbCA9ICdsYXN0X2FjY2VzcyAnLiRkaXI7DQoJCWJy ZWFrOw0KDQoJCWRlZmF1bHQ6DQoJCQkkc29ydCA9ICduYW1lJzsNCgkJCSRzb3J0X3NxbCA9 ICduYW1lICcuJGRpci4nLCBsYXN0X2FjY2VzcyBkZXNjJzsNCgkJYnJlYWs7DQoJfQ0KDQoJ c2V0X3ByZWYoJ3NtZF91bV9zb3J0X2NvbHVtbicsICRzb3J0LCAnc21kX3VtJywgUFJFRl9I SURERU4sICcnLCAwLCBQUkVGX1BSSVZBVEUpOw0KCXNldF9wcmVmKCdzbWRfdW1fc29ydF9k aXInLCAkZGlyLCAnc21kX3VtJywgUFJFRl9ISURERU4sICcnLCAwLCBQUkVGX1BSSVZBVEUp Ow0KDQoJJHN3aXRjaF9kaXIgPSAoJGRpciA9PSAnZGVzYycpID8gJ2FzYycgOiAnZGVzYyc7 DQoNCgkkY3JpdGVyaWEgPSAxOw0KDQoJJGNvdW50X2NvbHVtbnMgPSBhcnJheSgnYXJ0aWNs ZV9jb3VudCcsICdpbWFnZV9jb3VudCcsICdmaWxlX2NvdW50JywgJ2xpbmtfY291bnQnKTsN Cg0KCWlmICgkc2VhcmNoX21ldGhvZCBhbmQgJGNyaXQgIT0gJycpIHsNCgkJJGNyaXRfZXNj YXBlZCA9IGRvU2xhc2goc3RyX3JlcGxhY2UoYXJyYXkoJ1xcJywnJScsJ18nLCdcJycpLCBh cnJheSgnXFxcXCcsJ1xcJScsJ1xcXycsICdcXFwnJyksICRjcml0KSk7DQoNCgkJLy8gUGVy bWl0IHNlYXJjaGluZyBieSBwcml2aWxlZ2UgbmFtZSAoc29ydCBvZikNCgkJaWYgKCRzZWFy Y2hfbWV0aG9kID09ICdwcml2aWxlZ2VzJyAmJiAhaXNfbnVtZXJpYygkY3JpdF9lc2NhcGVk KSkgew0KCQkJJGxldmVscyA9IGdldF9ncm91cHMoKTsNCgkJCWZvcmVhY2ggKCRsZXZlbHMg YXMgJGlkeCA9PiAkZ3JvdXApIHsNCgkJCQlpZiAoc3RycG9zKHN0cnRvbG93ZXIoJGdyb3Vw KSwgc3RydG9sb3dlcigkY3JpdF9lc2NhcGVkKSkgIT09IGZhbHNlKSB7DQoJCQkJCSRjcml0 X2VzY2FwZWQgPSAkaWR4Ow0KCQkJCQlicmVhazsNCgkJCQl9DQoJCQl9DQoJCX0NCg0KCQkv LyBQZXJtaXQgPCwgPSwgYW5kID4gb3BlcmF0b3JzIGluIGNvdW50IHNlYXJjaGVzLg0KCQkv LyBudWxsY2hlY2sgaXMgbm90IHJlcXVpcmVkIGZvciBwcml2cyBzZWFyY2hlcyBiZWNhdXNl IHRoZSB2YWx1ZSBpcyBhIHRydWUgMCAod2hlcmVhcyBpbiB0aGUgY29tcHV0ZWQNCgkJLy8g Y29sdW1ucyBpdCdzIGVtcHR5L251bGwpDQoJCSRvcGVyYXRvciA9ICc9JzsNCgkJJG51bGxj aGVjayA9ICcnOw0KCQlpZiAoaW5fYXJyYXkoJHNlYXJjaF9tZXRob2QsICRjb3VudF9jb2x1 bW5zKSB8fCAkc2VhcmNoX21ldGhvZCA9PSAncHJpdmlsZWdlcycpIHsNCgkJCXByZWdfbWF0 Y2goJy8oWzw9Pl0rKT8oWzAtOV0rKS8nLCAkY3JpdF9lc2NhcGVkLCAkbWF0Y2hlcyk7DQoJ CQkkb3BlcmF0b3IgPSAoaXNzZXQoJG1hdGNoZXNbMV0pICYmICRtYXRjaGVzWzFdICE9ICcn KSA/ICRtYXRjaGVzWzFdIDogJz0nOw0KCQkJJGNyaXRfZXNjYXBlZCA9IChpc3NldCgkbWF0 Y2hlc1syXSkgJiYgJG1hdGNoZXNbMl0gIT0gJycpID8gJG1hdGNoZXNbMl0gOiAkY3JpdF9l c2NhcGVkOw0KCQkJJGNoYXJfb25lID0gc3Vic3RyKCRvcGVyYXRvciwgMCwgMSk7DQoJCQkk Y2hhcl90d28gPSBzdWJzdHIoJG9wZXJhdG9yLCAxLCAxKTsNCgkJCSRudWxsY2hlY2sgPSAo JGNoYXJfb25lID09ICc8JyB8fCAoJGNoYXJfb25lID09ICc+JyAmJiAkY2hhcl90d28gPT0g Jz0nICYmICRjcml0X2VzY2FwZWQgPT0gJzAnKSkgPyAnIE9SIElTTlVMTCgnLiRzZWFyY2hf bWV0aG9kLicpJyA6ICcnOw0KCQl9DQoNCgkJJGNyaXRzcWwgPSBhcnJheSgNCgkJCSdsb2dp bl9uYW1lJyAgICA9PiAibmFtZSBsaWtlICclJGNyaXRfZXNjYXBlZCUnIiwNCgkJCSdyZWFs X25hbWUnICAgICA9PiAiUmVhbE5hbWUgbGlrZSAnJSRjcml0X2VzY2FwZWQlJyIsDQoJCQkn ZW1haWwnICAgICAgICAgPT4gImVtYWlsIGxpa2UgJyUkY3JpdF9lc2NhcGVkJSciLA0KCQkJ J3ByaXZpbGVnZXMnICAgID0+ICJwcml2cyAkb3BlcmF0b3IgJyRjcml0X2VzY2FwZWQnIiwN CgkJCSdhcnRpY2xlX2NvdW50JyA9PiAiYXJ0aWNsZV9jb3VudCAkb3BlcmF0b3IgJyRjcml0 X2VzY2FwZWQnJG51bGxjaGVjayIsDQoJCQknaW1hZ2VfY291bnQnICAgPT4gImltYWdlX2Nv dW50ICRvcGVyYXRvciAnJGNyaXRfZXNjYXBlZCckbnVsbGNoZWNrIiwNCgkJCSdmaWxlX2Nv dW50JyAgICA9PiAiZmlsZV9jb3VudCAkb3BlcmF0b3IgJyRjcml0X2VzY2FwZWQnJG51bGxj aGVjayIsDQoJCQknbGlua19jb3VudCcgICAgPT4gImxpbmtfY291bnQgJG9wZXJhdG9yICck Y3JpdF9lc2NhcGVkJyRudWxsY2hlY2siLA0KCQkpOw0KDQoJCWlmIChhcnJheV9rZXlfZXhp c3RzKCRzZWFyY2hfbWV0aG9kLCAkY3JpdHNxbCkpIHsNCgkJCSRjcml0ZXJpYSA9ICRjcml0 c3FsWyRzZWFyY2hfbWV0aG9kXTsNCgkJCSRsaW1pdCA9IGdldF9wcmVmKCdzbWRfdW1fbWF4 X3NlYXJjaF9saW1pdCcsICRzbWRfdW1fcHJlZnNbJ3NtZF91bV9tYXhfc2VhcmNoX2xpbWl0 J11bJ2RlZmF1bHQnXSk7DQoJCX0gZWxzZSB7DQoJCQkkc2VhcmNoX21ldGhvZCA9ICcnOw0K CQkJJGNyaXQgPSAnJzsNCgkJfQ0KCX0gZWxzZSB7DQoJCSRzZWFyY2hfbWV0aG9kID0gJyc7 DQoJCSRjcml0ID0gJyc7DQoJfQ0KDQoJLy8gU2luY2UgdGhlICpfY291bnQgY29sdW1ucyBh cmUgY29tcHV0ZWQgd2UgbmVlZCB0byBzb21lIGppZ2dlcnkgcG9rZXJ5IGhlcmUuDQoJLy8g VGh1cywgaWYgd2UncmUgbG9va2luZyBmb3IgY291bnRzIG9mICd6ZXJvJyB0aGUgYWN0dWFs IHNlYXJjaCB2YWx1ZSBzaG91bGQgYmUgaXNudWxsKCkNCglpZiAoaW5fYXJyYXkoJHNlYXJj aF9tZXRob2QsICRjb3VudF9jb2x1bW5zKSAmJiAkb3BlcmF0b3IgPT0gJz0nICYmICRjcml0 X2VzY2FwZWQgPT0gJzAnKSB7DQoJCSRjcml0ZXJpYSA9ICJJU05VTEwoJHNlYXJjaF9tZXRo b2QpIjsNCgl9DQoNCgkvLyBUaGUgZmllbGRzLCBqb2lucyBhbmQgc3ViLXF1ZXJpZXMgdGhh dCBtYWtlIHVwIHRoZSByZWFsIGFuZCBjb21wdXRlZCBjb2x1bW5zDQoJJGZpZWxkcyA9ICd0 eHUudXNlcl9pZCwgdHh1Lm5hbWUsIHR4dS5SZWFsTmFtZSwgdHh1LmVtYWlsLCB0eHUucHJp dnMsIHVuaXhfdGltZXN0YW1wKHR4dS5sYXN0X2FjY2VzcykgYXMgbGFzdF9sb2dpbiwgdHhw LnRvdGFsIEFTIGFydGljbGVfY291bnQsIHR4aS50b3RhbCBBUyBpbWFnZV9jb3VudCwgdHhm LnRvdGFsIEFTIGZpbGVfY291bnQsIHR4bC50b3RhbCBBUyBsaW5rX2NvdW50JzsNCgkkY2xh dXNlID0gJyBGUk9NICcuUEZYLid0eHBfdXNlcnMgYXMgdHh1DQoJCUxFRlQgSk9JTiAoU0VM RUNUIEF1dGhvcklELCBjb3VudChJRCkgQVMgdG90YWwgRlJPTSAnLlBGWC4ndGV4dHBhdHRl cm4gR1JPVVAgQlkgQXV0aG9ySUQpIEFTIHR4cCBPTiB0eHAuQXV0aG9ySUQgPSB0eHUubmFt ZQ0KCQlMRUZUIEpPSU4gKFNFTEVDVCBhdXRob3IsIGNvdW50KGlkKSBBUyB0b3RhbCBGUk9N ICcuUEZYLid0eHBfaW1hZ2UgR1JPVVAgQlkgYXV0aG9yKSBBUyB0eGkgT04gdHhpLmF1dGhv ciA9IHR4dS5uYW1lDQoJCUxFRlQgSk9JTiAoU0VMRUNUIGF1dGhvciwgY291bnQoaWQpIEFT IHRvdGFsIEZST00gJy5QRlguJ3R4cF9maWxlIEdST1VQIEJZIGF1dGhvcikgQVMgdHhmIE9O IHR4Zi5hdXRob3IgPSB0eHUubmFtZQ0KCQlMRUZUIEpPSU4gKFNFTEVDVCBhdXRob3IsIGNv dW50KGlkKSBBUyB0b3RhbCBGUk9NICcuUEZYLid0eHBfbGluayBHUk9VUCBCWSBhdXRob3Ip IEFTIHR4bCBPTiB0eGwuYXV0aG9yID0gdHh1Lm5hbWUnOw0KDQoJLy8gUGVyZm9ybSBhIGNv dW50IG9uIHRoZSByZWxldmFudCBzZWFyY2ggaXRlbS4gRG9pbmcgYSBjb3VudCgqKSBpcyBh d2t3YXJkIGR1ZSB0byB0aGUgY29tcHV0ZWQgY29sdW1ucw0KCS8vIHNvIGEgc3RyYWlnaHQg cXVlcnkgaXMgcGVyZm9ybWVkIHdpdGggYSBsb29wIHRvIGluY3JlbWVudCB0aGUgdG90YWwu IGdldFRoaW5nKCkgb3IgZ2V0Um93cyBmb3Igc29tZSByZWFzb24NCgkvLyBmYWlsZWQgdW5k ZXIgY2VydGFpbiBjb25kaXRpb25zDQoJJHRvdGFsID0gMDsNCgkkdG90cnMgPSBzYWZlX3F1 ZXJ5KCdTRUxFQ1QgJy4kZmllbGRzLiRjbGF1c2UuJyBIQVZJTkcgJy4kY3JpdGVyaWEpOw0K CXdoaWxlICgkcm93ID0gbmV4dFJvdygkdG90cnMpKSB7DQoJCSR0b3RhbCsrOw0KCX0NCg0K CSRidG5iYXIgPSAnPHNwYW4gY2xhc3M9InNtZF91bV9idXR0b25zIj4nLiRidG5Vc3IuJGJ0 bkdycC4kYnRuUHJ2LiRidG5QcmYuJzwvc3Bhbj4nOw0KCSRuZXdidG4gPSBoYXNfcHJpdnMo JHNtZF91bV9ldmVudC4nLnVzci5jcmVhdGUnKSA/ICc8YSBjbGFzcz0ibmF2bGluayIgaHJl Zj0iP2V2ZW50PScuJHNtZF91bV9ldmVudC5hLidzdGVwPXNtZF91bV9lZGl0Ij4nIC5zbWRf dW1fZ1R4dCgnc21kX3VtX25ld191c2VyJykuICc8L2E+JyA6ICcnOw0KDQoJLy8gSW5qZWN0 IHN0eWxlcw0KCWVjaG8gJzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+JyAuICRzbWRfdW1fc3R5 bGVzWydjb250cm9sLXBhbmVsJ10gLiAnPC9zdHlsZT4nOw0KDQoJZWNobyAnPGRpdiBpZD0i Jy4kc21kX3VtX2V2ZW50LidfY29udHJvbCIgY2xhc3M9InR4cC1jb250cm9sLXBhbmVsIj4n Ow0KDQoJaWYgKCR0b3RhbCA8IDEpIHsNCgkJaWYgKCRjcml0ZXJpYSAhPSAxKSB7DQoJCQll Y2hvIG4uc21kX3VtX3NlYXJjaF9mb3JtKCRjcml0LCAkc2VhcmNoX21ldGhvZCkuJGJ0bmJh ci4NCgkJCQluLmdyYWYoZ1R4dCgnbm9fcmVzdWx0c19mb3VuZCcpLCAnIGNsYXNzPSJpbmRp Y2F0b3IiJykuJzwvZGl2Pic7DQoJCX0NCgkJcmV0dXJuOw0KCX0NCg0KCSRsaW1pdCA9IG1h eCgkc21kX3VtX2xpc3RfcGFnZWJ5LCAxNSk7DQoNCglsaXN0KCRwYWdlLCAkb2Zmc2V0LCAk bnVtUGFnZXMpID0gcGFnZXIoJHRvdGFsLCAkbGltaXQsICRwYWdlKTsNCg0KCWVjaG8gbi5z bWRfdW1fc2VhcmNoX2Zvcm0oJGNyaXQsICRzZWFyY2hfbWV0aG9kKS4kYnRuYmFyLic8L2Rp dj4nOw0KDQoJLy8gUmV0cmlldmUgdGhlIHVzZXIgaW5mbyBhbmQgcmVsYXRlZCBjb3VudHMN CgkkcnMgPSBzYWZlX3F1ZXJ5KCdTRUxFQ1QgJy4kZmllbGRzLiRjbGF1c2UuJyBIQVZJTkcg Jy4kY3JpdGVyaWEuJyBPUkRFUiBCWSAnLiRzb3J0X3NxbC4nIExJTUlUICcuJG9mZnNldC4n LCAnLiRsaW1pdCk7DQoNCglpZiAoJHJzKSB7DQoJCWVjaG8gbi4nPGRpdiBjbGFzcz0idHhw LWxpc3QiPic7DQoJCWVjaG8gJzxmb3JtIGFjdGlvbj0iaW5kZXgucGhwIiBpZD0ic21kX3Vt X2Zvcm0iIG1ldGhvZD0icG9zdCIgbmFtZT0ibG9uZ2Zvcm0iIG9uc3VibWl0PSJyZXR1cm4g dmVyaWZ5KFwnJy5nVHh0KCdhcmVfeW91X3N1cmUnKS4nXCcpIj4nLg0KCQlzdGFydFRhYmxl KCdsaXN0JywgJycsICdsaXN0JykuDQoJCW4uJzx0aGVhZD4nLg0KCQl0cih0ZGEoJG5ld2J0 biwgJyBjbGFzcz0ibm9saW5lIicpKS4NCgkJbi50cigNCgkJCWNvbHVtbl9oZWFkKCdsb2dp bl9uYW1lJywgJ25hbWUnLCAnc21kX3VtJywgdHJ1ZSwgJHN3aXRjaF9kaXIsICRjcml0LCAk c2VhcmNoX21ldGhvZCwgKCgnbmFtZScgPT0gJHNvcnQpID8gIiRkaXIgIiA6ICcnKS4nbmFt ZSBsb2dpbi1uYW1lJykuDQoJCQljb2x1bW5faGVhZCgncmVhbF9uYW1lJywgJ3JlYWxfbmFt ZScsICdzbWRfdW0nLCB0cnVlLCAkc3dpdGNoX2RpciwgJGNyaXQsICRzZWFyY2hfbWV0aG9k LCAoKCdyZWFsX25hbWUnID09ICRzb3J0KSA/ICIkZGlyICIgOiAnJykuJ25hbWUgcmVhbC1u YW1lJykuDQoJCQljb2x1bW5faGVhZCgnZW1haWwnLCAnZW1haWwnLCAnc21kX3VtJywgdHJ1 ZSwgJHN3aXRjaF9kaXIsICRjcml0LCAkc2VhcmNoX21ldGhvZCwgKCgnZW1haWwnID09ICRz b3J0KSA/ICIkZGlyICIgOiAnJykuJ2VtYWlsJykuDQoJCQljb2x1bW5faGVhZCgncHJpdmls ZWdlcycsICdwcml2cycsICdzbWRfdW0nLCB0cnVlLCAkc3dpdGNoX2RpciwgJGNyaXQsICRz ZWFyY2hfbWV0aG9kLCAoKCdwcml2cycgPT0gJHNvcnQpID8gIiRkaXIgIiA6ICcnKS4ncHJp dnMnKS4NCgkJCWNvbHVtbl9oZWFkKCdsYXN0X2xvZ2luJywgJ2xhc3RfbG9naW4nLCAnc21k X3VtJywgdHJ1ZSwgJHN3aXRjaF9kaXIsICRjcml0LCAkc2VhcmNoX21ldGhvZCwgKCgnbGFz dF9sb2dpbicgPT0gJHNvcnQpID8gIiRkaXIgIiA6ICcnKS4nZGF0ZSBsYXN0LWxvZ2luIG1v ZGlmaWVkJykuDQoJCQljb2x1bW5faGVhZChzbWRfdW1fZ1R4dCgnc21kX3VtX2FydGljbGVf Y291bnQnKSwgJ2FydGljbGVfY291bnQnLCAnc21kX3VtJywgdHJ1ZSwgJHN3aXRjaF9kaXIs ICRjcml0LCAkc2VhcmNoX21ldGhvZCwgKCgnYXJ0aWNsZV9jb3VudCcgPT0gJHNvcnQpID8g IiRkaXIgIiA6ICcnKSkuDQoJCQljb2x1bW5faGVhZChzbWRfdW1fZ1R4dCgnc21kX3VtX2lt YWdlX2NvdW50JyksICdpbWFnZV9jb3VudCcsICdzbWRfdW0nLCB0cnVlLCAkc3dpdGNoX2Rp ciwgJGNyaXQsICRzZWFyY2hfbWV0aG9kLCAoKCdpbWFnZV9jb3VudCcgPT0gJHNvcnQpID8g IiRkaXIgIiA6ICcnKSkuDQoJCQljb2x1bW5faGVhZChzbWRfdW1fZ1R4dCgnc21kX3VtX2Zp bGVfY291bnQnKSwgJ2ZpbGVfY291bnQnLCAnc21kX3VtJywgdHJ1ZSwgJHN3aXRjaF9kaXIs ICRjcml0LCAkc2VhcmNoX21ldGhvZCwgKCgnZmlsZV9jb3VudCcgPT0gJHNvcnQpID8gIiRk aXIgIiA6ICcnKSkuDQoJCQljb2x1bW5faGVhZChzbWRfdW1fZ1R4dCgnc21kX3VtX2xpbmtf Y291bnQnKSwgJ2xpbmtfY291bnQnLCAnc21kX3VtJywgdHJ1ZSwgJHN3aXRjaF9kaXIsICRj cml0LCAkc2VhcmNoX21ldGhvZCwgKCgnbGlua19jb3VudCcgPT0gJHNvcnQpID8gIiRkaXIg IiA6ICcnKSkuDQoJCQloQ2VsbCgnJywgJycsICcgY2xhc3M9Im11bHRpLWVkaXQiJykNCgkJ KS4NCgkJbi4nPC90aGVhZD4nOw0KDQoJCSRhc3NldHMgPSBzYWZlX2NvbHVtbignbmFtZScs ICd0eHBfdXNlcnMnLCAnMT0xJyk7DQoJCSRhc3NpZ25fYXNzZXRzID0gJGFzc2V0cyA/ICc8 bGFiZWwgZm9yPSJhc3NpZ25fYXNzZXRzIj4nLmFkZHNsYXNoZXMoZ1R4dCgnYXNzaWduX2Fz c2V0c190bycpKS5zcC4nPC9sYWJlbD48c3Bhbj4nLnN0cl9yZXBsYWNlKGFycmF5KCJcbiIs ICctJyksIGFycmF5KCcnLCAnJiM0NTsnKSwgc3RyX3JlcGxhY2UoJzwvJywgJzxcLycsIGFk ZHNsYXNoZXMoc2VsZWN0SW5wdXQoJ2Fzc2lnbl9hc3NldHMnLCAkYXNzZXRzLCAnJywgdHJ1 ZSkpKSkuJzxcL3NwYW4+JyA6ICcnOw0KCQkkcGVybWl0dGVkX3VzZXJzID0gc21kX3VtX2dl dF9ncm91cHMoMSk7DQoJCSRwcml2bGlzdCA9IHN0cl9yZXBsYWNlKGFycmF5KCJcbiIsICct JyksIGFycmF5KCcnLCAnJiM0NTsnKSwgc3RyX3JlcGxhY2UoJzwvJywgJzxcLycsIGFkZHNs YXNoZXMoc2VsZWN0SW5wdXQoJ3ByaXZzJywgJHBlcm1pdHRlZF91c2VycywgJycpKSkpOw0K DQoJCSR0Zm9vdCA9IG4uJzx0Zm9vdD4nLnRyKA0KCQkJdGRhKA0KCQkJCSgoaGFzX3ByaXZz KCRzbWRfdW1fZXZlbnQuJy51c3IuZWRpdCcpKQ0KCQkJCQk/IHNlbGVjdF9idXR0b25zKCku DQoJCQkJCXNtZF91bV9tdWx0aWVkaXRfZm9ybSgkcGFnZSwgJHNvcnQsICRkaXIsICRjcml0 LCAkc2VhcmNoX21ldGhvZCkuJzxwIGlkPSJzbWRfdW1fanMiPjwvcD4nDQoJCQkJCTogJycp DQoJCQksICcgY2xhc3M9Im11bHRpLWVkaXQiIGNvbHNwYW49IjEwIiBzdHlsZT0idGV4dC1h bGlnbjogcmlnaHQ7IGJvcmRlcjogbm9uZTsiJykNCgkJKS5uLic8L3Rmb290Pic7DQoNCgkJ ZWNobyAkdGZvb3Q7DQoJCWVjaG8gPDw8RU9KUw0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFz Y3JpcHQiPg0KalF1ZXJ5KGZ1bmN0aW9uKCkgew0KCWpRdWVyeSgnI3dpdGhzZWxlY3RlZCcp LmF0dHIoJ29uY2hhbmdlJywgJycpLmNoYW5nZShmdW5jdGlvbigpIHsNCgkJc3dpdGNoKGpR dWVyeSh0aGlzKS52YWwoKSkgew0KCQkJY2FzZSAiY2hhbmdlcHJpdmlsZWdlIjoNCgkJCQlq UXVlcnkoJyNzbWRfdW1fanMnKS5lbXB0eSgpLmFwcGVuZCgnPHNwYW4+eyRwcml2bGlzdH08 L3NwYW4+Jyk7DQoJCQlicmVhazsNCgkJCWNhc2UgImRlbGV0ZSI6DQoJCQkJalF1ZXJ5KCcj c21kX3VtX2pzJykuZW1wdHkoKS5hcHBlbmQoJ3skYXNzaWduX2Fzc2V0c30nKTsNCgkJCWJy ZWFrOw0KCQkJZGVmYXVsdDoNCgkJCQlqUXVlcnkoJyNzbWRfdW1fanMnKS5lbXB0eSgpOw0K CQkJYnJlYWs7DQoJCX0NCgl9KTsNCn0pOw0KPC9zY3JpcHQ+DQpFT0pTOw0KCQllY2hvICc8 dGJvZHk+JzsNCg0KCQkkY3RyID0gMTsNCgkJJGN1cnJfcHJpdiA9IHNhZmVfZmllbGQoJ3By aXZzJywgJ3R4cF91c2VycycsICJuYW1lID0gJyIgLmRvU2xhc2goJHR4cF91c2VyKS4gIici KTsNCg0KCQl3aGlsZSAoJHJvdyA9IG5leHRSb3coJHJzKSkgew0KCQkJZXh0cmFjdChkb1Nw ZWNpYWwoJHJvdykpOw0KDQoJCQkkcGVybWl0dGVkID0gc21kX3VtX2Nhbl9lZGl0KCRjdXJy X3ByaXYsICRuYW1lLCAkcHJpdnMpOw0KDQoJCQllY2hvIHRyKA0KCQkJCXRkKCAoKCRwZXJt aXR0ZWQpID8gZUxpbmsoJHNtZF91bV9ldmVudCwgJ3NtZF91bV9lZGl0JywgJ3VzZXJfaWQn LCAkdXNlcl9pZCwgJG5hbWUpIDogJG5hbWUpLCAnJywgJ25hbWUgbG9naW4tbmFtZSBhY3Rp b25zJykuDQoJCQkJdGQoJFJlYWxOYW1lLCAnJywgJ25hbWUgcmVhbC1uYW1lJykuDQoJCQkJ dGQoJzxhIGhyZWY9Im1haWx0bzonLiRlbWFpbC4nIj4nLiRlbWFpbC4nPC9hPicsICcnLCAn ZW1haWwnKS4NCgkJCQl0ZChzbWRfdW1fZ2V0X3ByaXZfbGV2ZWwoJHByaXZzKSwgJycsICdw cml2cycpLg0KCQkJCXRkKCgkbGFzdF9sb2dpbiA/IHNhZmVfc3RyZnRpbWUoJyViJiMxNjA7 JVknLCAkbGFzdF9sb2dpbikgOiAnJyksICcnLCAnZGF0ZSBsYXN0LWxvZ2luIG1vZGlmaWVk JykuDQoJCQkJdGQoKCRhcnRpY2xlX2NvdW50KSA/IGVMaW5rKCdsaXN0JywgJ2xpc3QnLCAn c2VhcmNoX21ldGhvZCcsICdhdXRob3InLCAkYXJ0aWNsZV9jb3VudCwgJ2NyaXQnLCAkbmFt ZSkgOiAnMCcpLg0KCQkJCXRkKCgkaW1hZ2VfY291bnQpID8gZUxpbmsoJ2ltYWdlJywgJ2lt YWdlX2xpc3QnLCAnc2VhcmNoX21ldGhvZCcsICdhdXRob3InLCAkaW1hZ2VfY291bnQsICdj cml0JywgJG5hbWUpIDogJzAnKS4NCgkJCQl0ZCgoJGZpbGVfY291bnQpID8gZUxpbmsoJ2Zp bGUnLCAnZmlsZV9saXN0JywgJ3NlYXJjaF9tZXRob2QnLCAnYXV0aG9yJywgJGZpbGVfY291 bnQsICdjcml0JywgJG5hbWUpIDogJzAnKS4NCgkJCQl0ZCgoJGxpbmtfY291bnQpID8gZUxp bmsoJ2xpbmsnLCAnbGlua19lZGl0JywgJ3NlYXJjaF9tZXRob2QnLCAnYXV0aG9yJywgJGxp bmtfY291bnQsICdjcml0JywgJG5hbWUpIDogJzAnKS4NCgkJCQl0ZCgoKGhhc19wcml2cygk c21kX3VtX2V2ZW50LicudXNyLmVkaXQnKSAmJiAkdHhwX3VzZXIgIT0gJHJvd1snbmFtZSdd ICYmIGFycmF5X2tleV9leGlzdHMoJHByaXZzLCAkcGVybWl0dGVkX3VzZXJzKSkgPyBmSW5w dXQoJ2NoZWNrYm94JywgJ3NlbGVjdGVkW10nLCAkcm93WyduYW1lJ10sICdjaGVja2JveCcp IDogJycpLCAnJywgJ211bHRpLWVkaXQnKQ0KCQkJLCAnIGNsYXNzPSInLigoJGN0ciUyID09 IDApID8gJ2V2ZW4nIDogJ29kZCcpLiciJw0KCQkJKTsNCg0KCQkJJGN0cisrOw0KCQl9DQoN CgkJZWNobyAnPC90Ym9keT4nLg0KCQluLmVuZFRhYmxlKCkuDQoJCW4udElucHV0KCkuDQoJ CW4uJzwvZm9ybT4nLg0KDQoJCW4uJzxkaXYgaWQ9InVzZXJzX25hdmlnYXRpb24iIGNsYXNz PSJ0eHAtbmF2aWdhdGlvbiI+Jy4NCgkJbmF2X2Zvcm0oJ3NtZF91bScsICRwYWdlLCAkbnVt UGFnZXMsICRzb3J0LCAkZGlyLCAkY3JpdCwgJHNlYXJjaF9tZXRob2QsICR0b3RhbCwgJGxp bWl0KS4NCg0KCQlwYWdlYnlfZm9ybSgnc21kX3VtJywgJHNtZF91bV9saXN0X3BhZ2VieSku DQoJCW4uJzwvZGl2Picubi5zbWRfdW1fYWN0aXZlX3VzZXJzKCkuJzwvZGl2Pic7DQoJfQ0K fQ0KDQovLyBDYW4gdGhpcyBsb2dnZWQtaW4gdXNlciBlZGl0IHRoZSBnaXZlbiB1c2VyIGFj Y291bnQ/DQpmdW5jdGlvbiBzbWRfdW1fY2FuX2VkaXQoJGN1cnJfcHJpdiwgJG5hbWUsICRw cml2cykgew0KCWdsb2JhbCAkc21kX3VtX2V2ZW50LCAkc21kX3VtX3ByZWZzLCAkdHhwX3Vz ZXI7DQoNCgkkcGVybWl0dGVkID0gZmFsc2U7IC8vIEFzc3VtZSBubyBlZGl0aW5nIHJpZ2h0 cyB1bmxlc3NzIG90aGVyd2lzZSBzdGF0ZWQNCg0KCSR0aWVyZWQgPSBnZXRfcHJlZignc21k X3VtX2hpZXJhcmNoaWNhbF9ncm91cHMnLCAkc21kX3VtX3ByZWZzWydzbWRfdW1faGllcmFy Y2hpY2FsX2dyb3VwcyddWydkZWZhdWx0J10pOw0KCSRwcm90ZWN0ZWQgPSBnZXRfcHJlZign c21kX3VtX2FkbWluX2dyb3VwJywgJHNtZF91bV9wcmVmc1snc21kX3VtX2FkbWluX2dyb3Vw J11bJ2RlZmF1bHQnXSk7DQoNCglpZiAoJG5hbWUgJiYgJHByaXZzKSB7DQoJCSRwZXJtaXR0 ZWQgPSBoYXNfcHJpdnMoJHNtZF91bV9ldmVudC4nLnVzci5lZGl0Lm93bicpICYmICgkbmFt ZSA9PSAkdHhwX3VzZXIpOw0KCQkkY2FuX2VkaXQgPSBoYXNfcHJpdnMoJHNtZF91bV9ldmVu dC4nLnVzci5lZGl0Jyk7DQoJCWlmICgkY2FuX2VkaXQpIHsNCgkJCSRwZXJtaXR0ZWQgfD0g JGNhbl9lZGl0Ow0KCQkJaWYgKCR0aWVyZWQpIHsNCgkJCQkkcGVybWl0dGVkICY9ICgkcHJp dnMgPj0gJGN1cnJfcHJpdik7DQoJCQl9DQoJCQlpZiAoJHByb3RlY3RlZCkgew0KCQkJCSRw ZXJtaXR0ZWQgJj0gKCgkcHJpdnMgIT0gJHByb3RlY3RlZCkgfHwgKCRjdXJyX3ByaXYgPT0g JHByb3RlY3RlZCkpOw0KCQkJfQ0KCQl9DQoJfQ0KDQoJcmV0dXJuICRwZXJtaXR0ZWQ7DQp9 DQoNCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8gRWRpdCBhIHNpbmdsZSBVc2Vy DQpmdW5jdGlvbiBzbWRfdW1fZWRpdCgkbXNnPScnKSB7DQoJZ2xvYmFsICR0eHBfdXNlciwg JHNtZF91bV9ldmVudCwgJHNtZF91bV9zdHlsZXM7DQoNCgkkdmFycyA9IGFycmF5KCd1c2Vy X2lkJywgJ25hbWUnLCAnUmVhbE5hbWUnLCAnZW1haWwnLCAncHJpdnMnKTsNCglleHRyYWN0 KGdwc2EoJHZhcnMpKTsNCg0KCSRycyA9IGFycmF5KCk7DQoJJGN1cnJfcHJpdiA9IHNhZmVf ZmllbGQoJ3ByaXZzJywgJ3R4cF91c2VycycsICJuYW1lID0gJyIgLmRvU2xhc2goJHR4cF91 c2VyKS4gIiciKTsNCg0KCWlmICgkdXNlcl9pZCkgew0KCQkkdXNlcl9pZCA9IGFzc2VydF9p bnQoJHVzZXJfaWQpOw0KCQkkcnMgPSBzYWZlX3JvdygnKicsICd0eHBfdXNlcnMnLCAidXNl cl9pZCA9ICR1c2VyX2lkIik7DQoJCWV4dHJhY3QoJHJzKTsNCgl9IGVsc2UgaWYgKCFoYXNf cHJpdnMoJHNtZF91bV9ldmVudC4nLnVzci5jcmVhdGUnKSkgew0KCQkvLyBJZiB0aGUgY3Vy cmVudCB1c2VyIGRvZXNuJ3QgaGF2ZSBzdWZmaWNpZW50IHJpZ2h0cyB0byBjcmVhdGUgbmV3 IHVzZXJzDQoJCS8vIHRoZW4gdGhpcyBFZGl0IHJlcXVlc3Qgd2l0aG91dCB1c2VyX2lkIGlz IGEgc2VsZi1lZGl0DQoJCSRycyA9IHNhZmVfcm93KCcqJywgJ3R4cF91c2VycycsICJuYW1l ID0gJyIgLmRvU2xhc2goJHR4cF91c2VyKS4gIiciKTsNCgkJZXh0cmFjdCgkcnMpOw0KCX0N Cg0KCS8vIENoZWNrIGZvciBlZGl0IC8gY3JlYXRpb24gcmlnaHRzDQoJJHBlcm1pdHRlZCA9 ICgkdXNlcl9pZCkgPyBzbWRfdW1fY2FuX2VkaXQoJGN1cnJfcHJpdiwgJG5hbWUsICRwcml2 cykgOiBoYXNfcHJpdnMoJHNtZF91bV9ldmVudC4nLnVzci5jcmVhdGUnKTsNCg0KCWlmICgh JHBlcm1pdHRlZCkNCgkJZXhpdChwYWdlVG9wKCdSZXN0cmljdGVkJykuJzxwIHN0eWxlPSJt YXJnaW4tdG9wOjNlbTt0ZXh0LWFsaWduOmNlbnRlciI+Jy4NCgkJCWdUeHQoJ3Jlc3RyaWN0 ZWRfYXJlYScpLic8L3A+Jyk7DQoNCgkkY2FwdGlvbiA9IGdUeHQoKCR1c2VyX2lkKSA/ICdl ZGl0X2F1dGhvcicgOiAnYWRkX25ld19hdXRob3InKTsNCg0KCXBhZ2V0b3Aoc21kX3VtX2dU eHQoJ3NtZF91bV90YWJfbmFtZScpLicgJnJhcXVvOyAnLnNtZF91bV9nVHh0KCdzbWRfdW1f dXNyX2xibCcpLCAkbXNnKTsNCglleHRyYWN0KHNtZF91bV9idXR0b25zKCd1c3InKSk7DQoN CgkkYnRuYmFyID0gJzxzcGFuIGNsYXNzPSJzbWRfdW1fYnV0dG9ucyI+Jy4kYnRuVXNyLiRi dG5HcnAuJGJ0blBydi4kYnRuUHJmLic8L3NwYW4+JzsNCg0KCS8vIEluamVjdCBzdHlsZXMN CgllY2hvICc8c3R5bGUgdHlwZT0idGV4dC9jc3MiPicgLiAkc21kX3VtX3N0eWxlc1snY29u dHJvbC1wYW5lbCddIC4gJzwvc3R5bGU+JzsNCg0KCWVjaG8gJzxkaXYgaWQ9IicuJHNtZF91 bV9ldmVudC4nX2NvbnRyb2wiIGNsYXNzPSJ0eHAtY29udHJvbC1wYW5lbCI+Jw0KCQkuICc8 c3BhbiBjbGFzcz0ic21kX3VtX3RpdGxlIj4nLiRjYXB0aW9uLic8L3NwYW4+JyAuICRidG5i YXIgLiAnPC9kaXY+JzsNCg0KCWVjaG8gJzxkaXYgaWQ9IicuJHNtZF91bV9ldmVudC4nX2Nv bnRhaW5lciIgY2xhc3M9InR4cC1lZGl0Ij4nOw0KCWVjaG8gZm9ybSgNCg0KCQlzdGFydFRh YmxlKCdlZGl0JywgJycsICdlZGl0LXBhbmUnKS4NCg0KCQl0cigNCgkJCWZMYWJlbENlbGwo J2xvZ2luX25hbWUnLCAnJywgJ25hbWUnKS4NCgkJCSgkdXNlcl9pZCA/IHRkKHN0cm9uZygk bmFtZSkpIDogZklucHV0Q2VsbCgnbmFtZScsICRuYW1lLCAnJywgMzApKQ0KCQksICcgY2xh c3M9Im5hbWUgbG9naW4tbmFtZSInKQ0KDQoJCS50cigNCgkJCWZMYWJlbENlbGwoJ3JlYWxf bmFtZScsICcnLCAnUmVhbE5hbWUnKS4NCgkJCWZJbnB1dENlbGwoJ1JlYWxOYW1lJywgJFJl YWxOYW1lLCAnJywgMzApDQoJCSwgJyBjbGFzcz0ibmFtZSByZWFsLW5hbWUiJykNCg0KCQku dHIoDQoJCQlmTGFiZWxDZWxsKCdlbWFpbCcsICcnLCAnZW1haWwnKS4NCgkJCWZJbnB1dENl bGwoJ2VtYWlsJywgJGVtYWlsLCAnJywgMzApDQoJCSwgJyBjbGFzcz0iZW1haWwiJykNCg0K CQkudHIoDQoJCQlmTGFiZWxDZWxsKCdwcml2aWxlZ2VzJywgJycsICdwcml2cycpLg0KCQkJ dGQoDQoJCQkJKCR0eHBfdXNlciAhPSAkbmFtZQ0KCQkJCQk/IHNlbGVjdElucHV0KCdwcml2 cycsIHNtZF91bV9nZXRfZ3JvdXBzKDEpLCAkcHJpdnMpDQoJCQkJCTogaElucHV0KCdwcml2 cycsICRwcml2cykuc3Ryb25nKHNtZF91bV9nZXRfcHJpdl9sZXZlbCgkcHJpdnMpKQ0KCQkJ CSkNCgkJCQkuc3AucG9wSGVscCgnYWJvdXRfcHJpdmlsZWdlcycpDQoJCQkpDQoJCSwgJyBj bGFzcz0icHJpdnMiJykNCg0KCQkucGx1Z2dhYmxlX3VpKCdhdXRob3JfdWknLCAnZXh0ZW5k X2RldGFpbF9mb3JtJywgJycsICRycykNCg0KCQkudHIoDQoJCQl0ZCgpDQoJCQkudGQoDQoJ CQkJZklucHV0KCdzdWJtaXQnLCAnJywgZ1R4dCgnc2F2ZScpLCAncHVibGlzaCcpLigkdXNl cl9pZCA/ICcnIDogc3AucG9wSGVscCgnYWRkX25ld19hdXRob3InKSkNCgkJCSkNCgkJKQ0K DQoJCS5lbmRUYWJsZSgpDQoNCgkJLmVJbnB1dCgkc21kX3VtX2V2ZW50KS4NCgkJKCR1c2Vy X2lkID8gaElucHV0KCd1c2VyX2lkJywgJHVzZXJfaWQpLnNJbnB1dCgnc21kX3VtX3NhdmUn KSA6IHNJbnB1dCgnc21kX3VtX3NhdmVfbmV3JykpDQoJLCAnJywgJycsICdwb3N0JywgJ2Vk aXQtZm9ybScsICcnLCAndXNlcl9lZGl0Jyk7DQoJZWNobyBzbWRfdW1fY2hhbmdlX3Bhc3Nf Zm9ybSgkbmFtZSwgJHVzZXJfaWQpOw0KCWVjaG8gJzwvZGl2Pic7DQp9DQoNCi8vIC0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8gVmlydHVhbGx5IGNsb25lZCBmcm9tIEFkbWluLT5V c2Vycw0KZnVuY3Rpb24gc21kX3VtX3NhdmUoKSB7DQoJZ2xvYmFsICRzbWRfdW1fZXZlbnQs ICR0eHBfdXNlcjsNCg0KCWV4dHJhY3QoZG9TbGFzaChwc2EoYXJyYXkoJ3ByaXZzJywgJ3Vz ZXJfaWQnLCAnUmVhbE5hbWUnLCAnZW1haWwnKSkpKTsNCgkkcHJpdnMgICA9IGFzc2VydF9p bnQoJHByaXZzKTsNCgkkdXNlcl9pZCA9IGFzc2VydF9pbnQoJHVzZXJfaWQpOw0KCSRuYW1l ID0gc2FmZV9maWVsZCgnbmFtZScsICd0eHBfdXNlcnMnLCAidXNlcl9pZCA9ICR1c2VyX2lk Iik7DQoJJGN1cnJfcHJpdiA9IHNhZmVfZmllbGQoJ3ByaXZzJywgJ3R4cF91c2VycycsICJu YW1lID0gJyIgLmRvU2xhc2goJHR4cF91c2VyKS4gIiciKTsNCg0KCS8vIENoZWNrIGZvciBo YWNraW5nIGF0dGVtcHRzDQoJJHBlcm1pdHRlZCA9IHNtZF91bV9jYW5fZWRpdCgkY3Vycl9w cml2LCAkbmFtZSwgJHByaXZzKTsNCg0KCWlmICghJHBlcm1pdHRlZCkNCgkJZXhpdChwYWdl VG9wKCdSZXN0cmljdGVkJykuJzxwIHN0eWxlPSJtYXJnaW4tdG9wOjNlbTt0ZXh0LWFsaWdu OmNlbnRlciI+Jy4NCgkJCWdUeHQoJ3Jlc3RyaWN0ZWRfYXJlYScpLic8L3A+Jyk7DQoNCglp ZiAoIWlzX3ZhbGlkX2VtYWlsKCRlbWFpbCkpIHsNCgkJc21kX3VtX2VkaXQoYXJyYXkoZ1R4 dCgnZW1haWxfcmVxdWlyZWQnKSwgRV9FUlJPUikpOw0KCQlyZXR1cm47DQoJfQ0KDQoJJHJz ID0gc2FmZV91cGRhdGUoJ3R4cF91c2VycycsICINCgkJcHJpdnMgICAgPSAkcHJpdnMsDQoJ CVJlYWxOYW1lID0gJyRSZWFsTmFtZScsDQoJCWVtYWlsICAgID0gJyRlbWFpbCciLA0KCQki dXNlcl9pZCA9ICR1c2VyX2lkIg0KCSk7DQoNCglpZiAoJHJzKSB7DQoJCSRtc2cgPSBnVHh0 KCdhdXRob3JfdXBkYXRlZCcsIGFycmF5KCd7bmFtZX0nID0+ICRSZWFsTmFtZSkpOw0KCX0g ZWxzZSB7DQoJCSRtc2cgPSAnJzsNCgl9DQoNCgkkc21kX3VtX2V2ZW50KCRtc2cpOw0KfQ0K DQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vIFZpcnR1YWxseSBjbG9uZWQgZnJv bSBBZG1pbi0+VXNlcnMNCmZ1bmN0aW9uIHNtZF91bV9zYXZlX25ldygpIHsNCglnbG9iYWwg JHNtZF91bV9ldmVudCwgJHNtZF91bV9wcmVmczsNCg0KCXJlcXVpcmVfcHJpdnMoJHNtZF91 bV9ldmVudC4nLnVzci5jcmVhdGUnKTsNCg0KCWV4dHJhY3QoZG9TbGFzaChwc2EoYXJyYXko J3ByaXZzJywgJ25hbWUnLCAnZW1haWwnLCAnUmVhbE5hbWUnKSkpKTsNCg0KCSRwcml2cyAg PSBhc3NlcnRfaW50KCRwcml2cyk7DQoJJGxlbmd0aCA9IGZ1bmN0aW9uX2V4aXN0cygnbWJf c3RybGVuJykgPyBtYl9zdHJsZW4oJG5hbWUsICc4Yml0JykgOiBzdHJsZW4oJG5hbWUpOw0K DQoJaWYgKCRuYW1lIGFuZCAkbGVuZ3RoIDw9IDY0IGFuZCBpc192YWxpZF9lbWFpbCgkZW1h aWwpKSB7DQoJCSRleGlzdHMgPSBzYWZlX2ZpZWxkKCduYW1lJywgJ3R4cF91c2VycycsICJu YW1lID0gJyIgLiRuYW1lLiAiJyIpOw0KDQoJCWlmICgkZXhpc3RzKSB7DQoJCQlzbWRfdW1f ZWRpdChhcnJheShnVHh0KCdhdXRob3JfYWxyZWFkeV9leGlzdHMnLCBhcnJheSgne25hbWV9 JyA9PiAkbmFtZSkpLCBFX0VSUk9SKSk7DQoJCQlyZXR1cm47DQoJCX0NCg0KCQkkcGFzc19s ZW4gPSBnZXRfcHJlZignc21kX3VtX3Bhc3NfbGVuZ3RoJywgJHNtZF91bV9wcmVmc1snc21k X3VtX3Bhc3NfbGVuZ3RoJ11bJ2RlZmF1bHQnXSk7DQoJCSRwYXNzd29yZCA9IGdlbmVyYXRl X3Bhc3N3b3JkKCRwYXNzX2xlbik7DQoJCSRoYXNoID0gZG9TbGFzaCh0eHBfaGFzaF9wYXNz d29yZCgkcGFzc3dvcmQpKTsNCgkJJG5vbmNlID0gZG9TbGFzaChtZDUodW5pcWlkKG10X3Jh bmQoKSwgVFJVRSkpKTsNCg0KCQkkcnMgPSBzYWZlX2luc2VydCgndHhwX3VzZXJzJywgIg0K CQkJcHJpdnMgICAgPSAkcHJpdnMsDQoJCQluYW1lICAgICA9ICckbmFtZScsDQoJCQllbWFp bCAgICA9ICckZW1haWwnLA0KCQkJUmVhbE5hbWUgPSAnJFJlYWxOYW1lJywNCgkJCW5vbmNl ICAgID0gJyRub25jZScsDQoJCQlwYXNzICAgICA9ICckaGFzaCcNCgkJIik7DQoNCgkJaWYg KCRycykgew0KCQkJLy8gVE9ETzogY29uc2lkZXIgY2xvbmluZyBzZW5kX3Bhc3N3b3JkKCkg YmVjYXVzZSBvbmx5IHBlb3BsZSB3aXRoIGFkbWluLmVkaXQgY2FuIHJ1biBpdCAoaS5lLiBQ dWJsaXNoZXJzKQ0KCQkJc2VuZF9wYXNzd29yZCgkUmVhbE5hbWUsICRuYW1lLCAkZW1haWws ICRwYXNzd29yZCk7DQoJCQkkbXNnID0gZ1R4dCgncGFzc3dvcmRfc2VudF90bycpLnNwLiRl bWFpbDsNCgkJCSRzbWRfdW1fZXZlbnQoJG1zZyk7DQoJCX0gZWxzZSB7DQoJCQkkbXNnID0g YXJyYXkoZ1R4dCgnZXJyb3JfYWRkaW5nX25ld19hdXRob3InKSwgRV9FUlJPUik7DQoJCQlz bWRfdW1fZWRpdCgkbXNnKTsNCgkJfQ0KCX0gZWxzZSB7DQoJCSRtc2cgPSBhcnJheShnVHh0 KCdlcnJvcl9hZGRpbmdfbmV3X2F1dGhvcicpLCBFX0VSUk9SKTsNCgkJc21kX3VtX2VkaXQo JG1zZyk7DQoJfQ0KDQp9DQoNCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8gR3Jv dXAgbWFuYWdlbWVudCBwYW5lbA0KZnVuY3Rpb24gc21kX3VtX2dyb3VwcygkbXNnPScnKSB7 DQoJZ2xvYmFsICRzbWRfdW1fZXZlbnQsICR0eHBfdXNlciwgJHNtZF91bV9zdHlsZXMsICR0 eHBfZ3JvdXBzLCAkdHhwX3Blcm1pc3Npb25zOw0KDQoJcmVxdWlyZV9wcml2cygkc21kX3Vt X2V2ZW50LicuZ3JwJyk7DQoNCglpZiAoIXNtZF91bV90YWJsZV9leGlzdCgpKSB7DQoJCXNt ZF91bV90YWJsZV9pbnN0YWxsKDApOw0KCX0NCg0KCS8vIEhhbmRsZSBhbnkgZm9ybSBhY3Rp b25zDQoJaWYgKHBzKCdzbWRfdW1fZ3JvdXBfc2F2ZScpKSB7DQoJCSRleGNsdWRlZCA9IHNt ZF91bV9nZXRfZ3JvdXBzKDApOw0KCQkkaWRzID0gcHMoJ3NtZF91bV9ncm91cF9pZCcpOw0K CQkkbmFtZXMgPSBwcygnc21kX3VtX2dyb3VwX25hbWUnKTsNCgkJJHRpdGxlcyA9IHBzKCdz bWRfdW1fZ3JvdXBfdGl0bGUnKTsNCg0KCQlmb3JlYWNoKCRpZHMgYXMgJGlkeCA9PiAkaWQp IHsNCgkJCSR0aXRsZSA9ICR0aXRsZXNbJGlkeF07DQoJCQkkbmFtZSA9IHN0cnRvbG93ZXIo c2FuaXRpemVGb3JVcmwoJG5hbWVzWyRpZHhdKSk7DQoJCQkvLyBDYW4ndCBjcmVhdGUgZHVw bGljYXRlIHR5cGVzDQoJCQlpZiAoIWluX2FycmF5KCRuYW1lLCAkZXhjbHVkZWQpKSB7DQoJ CQkJc2FmZV91cGRhdGUoU01EX1VNX0dST1VQUywgIm5hbWU9JyIgLiBkb1NsYXNoKCRuYW1l KSAuICInIiwgImlkPSciIC4gZG9TbGFzaCgkaWQpIC4gIiciKTsNCgkJCX0NCgkJCXNtZF91 bV91cHNlcnRfbGFuZygkdGl0bGUsICRuYW1lKTsNCgkJfQ0KDQoJCSRtc2cgPSBzbWRfdW1f Z1R4dCgnc21kX3VtX2dycF9zYXZlZCcpOw0KDQoJfSBlbHNlIGlmIChwcygnc21kX3VtX2dy b3VwX2FkZCcpKSB7DQoJCSR0aXRsZSA9IHBzKCdzbWRfdW1fbmV3X2dycCcpOw0KCQkkbmFt ZSA9IHBzKCdzbWRfdW1fbmV3X2dycF9uYW1lJyk7DQoJCSRuYW1lID0gKCRuYW1lID09ICcn KSA/IHN0cnRvbG93ZXIoc2FuaXRpemVGb3JVcmwoJHRpdGxlKSkgOiAkbmFtZTsNCgkJaWYg KCRuYW1lKSB7DQoJCQkkZXhpc3RzID0gc2FmZV9maWVsZCgnaWQnLCBTTURfVU1fR1JPVVBT LCAibmFtZT0nIi5kb1NsYXNoKCRuYW1lKS4iJyIpOw0KCQkJaWYgKCRleGlzdHMpIHsNCgkJ CQkkbXNnID0gYXJyYXkoc21kX3VtX2dUeHQoJ3NtZF91bV9ncnBfZXhpc3RzJywgYXJyYXko J3tpZH0nID0+ICRleGlzdHMpKSwgRV9VU0VSX1dBUk5JTkcpOw0KCQkJfSBlbHNlIHsNCgkJ CQkvLyBJdCdzIG5vdCBhdG9taWMgYnV0IGl0J2xsIGRvLCBnaXZlbiB0aGF0Og0KCQkJCS8v ICBhKSBub3JtYWxseSBvbmx5IG9uZSBwZXJzb24gYWRtaW5pc3RlcnMgdGhpcyBwbHVnaW4N CgkJCQkvLyAgYikgZ3JvdXBzIGFyZSBhZGRlZCBvbmUgYXQgYSB0aW1lDQoJCQkJJGN1cnJf bWF4ID0gc2FmZV9maWVsZCgiTUFYKGlkKSIsIFNNRF9VTV9HUk9VUFMsICcxPTEnKTsNCgkJ CQkkbmV3X3ByaXYgPSAoJGN1cnJfbWF4ICsgMSk7DQoJCQkJc2FmZV9pbnNlcnQoU01EX1VN X0dST1VQUywgImlkPSciIC4gJG5ld19wcml2IC4gIicsIG5hbWU9JyIgLiBkb1NsYXNoKCRu YW1lKSAuICInIik7DQoJCQkJc21kX3VtX3Vwc2VydF9sYW5nKCR0aXRsZSwgJG5hbWUpOw0K DQoJCQkJJGJhc2VkX29uID0gcHMoJ3NtZF91bV9uZXdfZ3JwX2Jhc2VkX29uJyk7DQoJCQkJ aWYgKCRiYXNlZF9vbiAhPSAnJykgew0KCQkJCQlhc3NlcnRfaW50KCRiYXNlZF9vbik7DQoJ CQkJCS8vIENhbid0IHJlbHkgb24gdGhlIHByaXZzIGJlaW5nIGluIHRoZSBkYXRhYmFzZSBz byByZXNvcnQgdG8gdGhlIChtZXJnZWQpIGFycmF5DQoJCQkJCWZvcmVhY2ggKCR0eHBfcGVy bWlzc2lvbnMgYXMgJGFyZWEgPT4gJHByaXZzKSB7DQoJCQkJCQkkcHJpdnMgPSBkb19saXN0 KCRwcml2cyk7DQoJCQkJCQlpZiAoaW5fYXJyYXkoJGJhc2VkX29uLCAkcHJpdnMpKSB7DQoJ CQkJCQkJc2FmZV9pbnNlcnQoU01EX1VNX1BSSVZTLCAiYXJlYT0nIiAuIGRvU2xhc2goJGFy ZWEpIC4gIicsIHByaXY9JyIgLiBkb1NsYXNoKCRuZXdfcHJpdikgLiAiJyIpOw0KCQkJCQkJ fQ0KCQkJCQl9DQoJCQkJfQ0KDQoJCQkJJG1zZyA9IHNtZF91bV9nVHh0KCdzbWRfdW1fZ3Jw X2NyZWF0ZWQnLCBhcnJheSgne25hbWV9JyA9PiAkbmFtZSkpOw0KCQkJfQ0KCQl9IGVsc2Ug ew0KCQkJJG1zZyA9IGFycmF5KHNtZF91bV9nVHh0KCdzbWRfdW1fbmFtZV9yZXF1aXJlZCcp LCBFX0VSUk9SKTsNCgkJfQ0KCX0gZWxzZSBpZiAocHMoJ3NtZF91bV9ncm91cF9kZWwnKSkg ew0KCQkkaWQgPSBzdHJfcmVwbGFjZSgnc21kX3VtX2RlbF8nLCAnJywgcHMoJ3NtZF91bV9n cnBfZGVsJykpOw0KCQlhc3NlcnRfaW50KCRpZCk7DQoNCgkJJGFmZmVjdGVkX3VzZXJzID0g c2FmZV9jb2x1bW4oJ3VzZXJfaWQnLCAndHhwX3VzZXJzJywgInByaXZzID0gJyIuZG9TbGFz aCgkaWQpLiInIik7DQoJCWlmICgkYWZmZWN0ZWRfdXNlcnMpIHsNCgkJCS8vIFNldCBhbGwg b3JwaGFuZWQgdXNlcnMgdG8gbm8gcHJpdnMgLS0gY2FuIGFsd2F5cyBhc3NpZ24gdGhlbSBh IG5ldyBncm91cCBmcm9tIHRoZSBtYWluIHNjcmVlbiBsYXRlcg0KCQkJJHJldCA9IHNhZmVf dXBkYXRlKCd0eHBfdXNlcnMnLCAicHJpdnM9MCIsICJ1c2VyX2lkIElOICgnIi4gam9pbigi JywnIiwgZG9TbGFzaCgkYWZmZWN0ZWRfdXNlcnMpKSAuIicpIik7DQoJCX0NCg0KCQkvLyBU T0RPOiBkb3VibGUgY2hlY2sgdGhpcyBpc24ndCBhIGNvcmUgZ3JvdXA/DQoJCSRyZWQgPSBz YWZlX2RlbGV0ZShTTURfVU1fR1JPVVBTLCAiaWQ9JyIuZG9TbGFzaCgkaWQpLiInIik7DQoN CgkJaWYgKCRyZWQpIHsNCgkJCSRyZXQgPSBzYWZlX2RlbGV0ZShTTURfVU1fUFJJVlMsICJw cml2PSciLmRvU2xhc2goJGlkKS4iJyIpOw0KCQkJJG1zZyA9IHNtZF91bV9nVHh0KCdzbWRf dW1fZ3JwX2RlbGV0ZWQnKSAuICgkYWZmZWN0ZWRfdXNlcnMgPyBzbWRfdW1fZ1R4dCgnc21k X3VtX2dycF9hZmZlY3RlZCcsIGFycmF5KCd7bnVtfScgPT4gY291bnQoJGFmZmVjdGVkX3Vz ZXJzKSkpIDogJycpOw0KCQl9DQoJfQ0KDQoJLy8gUmVuZGVyIHRoZSBwYWdlDQoJcGFnZXRv cChzbWRfdW1fZ1R4dCgnc21kX3VtX3RhYl9uYW1lJykuJyAmcmFxdW87ICcuc21kX3VtX2dU eHQoJ3NtZF91bV9ncnBfbGJsJyksICRtc2cpOw0KCWV4dHJhY3Qoc21kX3VtX2J1dHRvbnMo J2dycCcpKTsNCg0KCSRidG5iYXIgPSAnPHNwYW4gY2xhc3M9InNtZF91bV9idXR0b25zIj4n LiRidG5Vc3IuJGJ0bkdycC4kYnRuUHJ2LiRidG5QcmYuJzwvc3Bhbj4nOw0KCSRncm91cGxp c3QgPSBzbWRfdW1fZ2V0X2dyb3VwcygxKTsNCgl1bnNldCgkZ3JvdXBsaXN0WzBdKTsgLy8g RG9uJ3Qgd2FudCBOb25lIHByaXZzDQoJJGdyb3VwbGlzdCA9IHNlbGVjdElucHV0KCdzbWRf dW1fbmV3X2dycF9iYXNlZF9vbicsICRncm91cGxpc3QsICcnLCB0cnVlKTsNCg0KCS8vIElu amVjdCBzdHlsZXMNCgllY2hvICc8c3R5bGUgdHlwZT0idGV4dC9jc3MiPicgLiAkc21kX3Vt X3N0eWxlc1snY29udHJvbC1wYW5lbCddIC4gJzwvc3R5bGU+JzsNCg0KCS8vIE5ldyBncm91 cA0KCWVjaG8gJzxkaXYgaWQ9IicuJHNtZF91bV9ldmVudC4nX2NvbnRyb2wiIGNsYXNzPSJ0 eHAtY29udHJvbC1wYW5lbCI+Jw0KCQkuIGZvcm0oDQoJCQlncmFmKA0KCQkJCSc8bGFiZWwg Zm9yPSJzbWRfdW1fbmV3X2dycCI+JyAuIHNtZF91bV9nVHh0KCdzbWRfdW1fZ3JwX25ldycp IC4gJzwvbGFiZWw+Jy5zcA0KCQkJCS5mSW5wdXQoJ3RleHQnLCAnc21kX3VtX25ld19ncnAn LCAnJywgJycsICcnLCAnJywgJycsICcnLCAnc21kX3VtX25ld19ncnAnKS5zcA0KCQkJCS4n PGxhYmVsIGZvcj0ic21kX3VtX25ld19ncnBfbmFtZSI+JyAuIHNtZF91bV9nVHh0KCdzbWRf dW1fZ3JwX25ld19uYW1lJykgLiAnPC9sYWJlbD4nLnNwDQoJCQkJLmZJbnB1dCgndGV4dCcs ICdzbWRfdW1fbmV3X2dycF9uYW1lJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJ3NtZF91 bV9uZXdfZ3JwX25hbWUnKS5zcA0KCQkJCS4nPGxhYmVsIGZvcj0ic21kX3VtX25ld19ncnBf YmFzZWRfb24iPicgLiBzbWRfdW1fZ1R4dCgnc21kX3VtX2Jhc2VkX29uJykgLiAnPC9sYWJl bD4nLnNwDQoJCQkJLiRncm91cGxpc3Quc3ANCgkJCQkuZklucHV0KCdzdWJtaXQnLCAnc21k X3VtX2dyb3VwX2FkZCcsIGdUeHQoJ2NyZWF0ZScpLCAnc21hbGxlcmJveCcpDQoJCQkJLmVJ bnB1dCgkc21kX3VtX2V2ZW50KQ0KCQkJCS5zSW5wdXQoJ3NtZF91bV9ncm91cHMnKQ0KCQkJ CSkNCgkJCSwgJycsJycsJ3Bvc3QnLCdzZWFyY2gtZm9ybScNCgkJCSkNCgkJLiAkYnRuYmFy IC4gJzwvZGl2Pic7DQoNCgkvLyBSZXRyaWV2ZSB0aGUgZ3JvdXAgaW5mbyBhbmQgdXNlciBj b3VudHMgcGVyIHByaXZpbGVnZSBsZXZlbA0KCSRmaWVsZHMgPSAnc21kZy5pZCwgc21kZy5u YW1lLCBzbWRnLmNvcmUsIHR4dS50b3RhbCBBUyB1c2VyX2NvdW50JzsNCgkkY2xhdXNlID0g JyBGUk9NICcuUEZYLidzbWRfdW1fZ3JvdXBzIEFTIHNtZGcNCgkJTEVGVCBKT0lOIChTRUxF Q1QgcHJpdnMsIGNvdW50KHByaXZzKSBBUyB0b3RhbCBGUk9NICcuUEZYLid0eHBfdXNlcnMg R1JPVVAgQlkgcHJpdnMpIEFTIHR4dSBPTiBzbWRnLmlkID0gdHh1LnByaXZzJzsNCg0KCSRy cyA9IGdldFJvd3MoJ1NFTEVDVCAnIC4gJGZpZWxkcy4kY2xhdXNlIC4gJyBPUkRFUiBCWSBp ZCcpOw0KDQoJaWYgKCRycykgew0KCQllY2hvIG4uJzxkaXYgY2xhc3M9InR4cC1saXN0Ij4n Ow0KCQllY2hvICc8Zm9ybSBhY3Rpb249ImluZGV4LnBocCIgaWQ9InNtZF91bV9ncnBfZm9y bSIgbWV0aG9kPSJwb3N0IiBuYW1lPSJsb25nZm9ybSIgb25zdWJtaXQ9InJldHVybiB2ZXJp ZnkoXCcnLmdUeHQoJ2FyZV95b3Vfc3VyZScpLidcJykiPicuDQoJCXN0YXJ0VGFibGUoJ2xp c3QnLCAnJywgJ2xpc3QnKS4NCgkJbi4nPHRoZWFkPicuDQoJCW4udHIoDQoJCQloQ2VsbCgn SUQnLCAnJywgJyBjbGFzcz0iaWQiJykuDQoJCQloQ2VsbCgnbmFtZScsICcnLCAnIGNsYXNz PSJuYW1lIicpLg0KCQkJaENlbGwoJ3RpdGxlJywgJycsICcgY2xhc3M9Im5hbWUiJykuDQoJ CQloQ2VsbCgnJywgJycsICcnKQ0KCQkpLg0KCQluLic8L3RoZWFkPic7DQoNCgkJJHRmb290 ID0gbi4nPHRmb290PicNCgkJCS50cigNCgkJCQl0ZGEoJyZuYnNwOycsICcgY2xhc3M9Im5v bGluZSInKQ0KCQkJCS4gdGRhKCcmbmJzcDsnLCAnIGNsYXNzPSJub2xpbmUiJykNCgkJCQku IHRkYShmSW5wdXQoJ3N1Ym1pdCcsICdzbWRfdW1fZ3JvdXBfc2F2ZScsIGdUeHQoJ3NhdmUn KSwgJ3B1Ymxpc2gnKSwgJyBjbGFzcz0ibm9saW5lIicpDQoJCQkpLic8L3Rmb290Pic7DQoJ CWVjaG8gJHRmb290Ow0KCQllY2hvIDw8PEVPSlMNCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZh c2NyaXB0Ij4NCmZ1bmN0aW9uIHNtZF91bV9wcmVzdWIob2JqKSB7DQoJalF1ZXJ5KCcjc21k X3VtX2dycF9kZWwnKS52YWwoalF1ZXJ5KG9iaikuYXR0cignaWQnKSk7DQp9DQo8L3Njcmlw dD4NCkVPSlM7DQoNCgkJZWNobyAnPHRib2R5Pic7DQoJCSRjdHIgPSAxOw0KDQoJCWZvcmVh Y2ggKCRycyBhcyAkcm93KSB7DQoJCQlleHRyYWN0KGRvU3BlY2lhbCgkcm93KSk7DQoJCQkk dXNlcl9jb3VudCA9IGVtcHR5KCR1c2VyX2NvdW50KSA/IDAgOiAkdXNlcl9jb3VudDsNCgkJ CSRkTGluayA9ICgkY29yZSkgPyAnJm5ic3A7JyA6IGZJbnB1dCgnc3VibWl0JywgJ3NtZF91 bV9ncm91cF9kZWwnLCAiw5ciLCAnc21hbGxlcmJveCcsICcnLCAnc21kX3VtX3ByZXN1Yih0 aGlzKScsICcnLCAnJywgJ3NtZF91bV9kZWxfJy4kaWQpDQoJCQkJLmVJbnB1dCgkc21kX3Vt X2V2ZW50KQ0KCQkJCS5zSW5wdXQoJ3NtZF91bV9ncm91cHMnKQ0KCQkJCS50SW5wdXQoKTsN CgkJCWVjaG8gdHIoDQoJCQkJdGRhKA0KCQkJCQloSW5wdXQoJ3NtZF91bV9ncm91cF9pZFtd JywgJGlkKQ0KCQkJCQkuKCgkdXNlcl9jb3VudCkgPyBlTGluaygkc21kX3VtX2V2ZW50LCAn JywgJ3NlYXJjaF9tZXRob2QnLCAncHJpdmlsZWdlcycsICRpZCwgJ2NyaXQnLCAkaWQpIDog JGlkKQ0KCQkJCSwgJyBjbGFzcz0iaWQiJw0KCQkJCQkuKCgkdXNlcl9jb3VudCkgPyAnIHRp dGxlPSInIC4gc21kX3VtX2dUeHQoJ3NtZF91bV91c2VyX2NvdW50JykgLiAkdXNlcl9jb3Vu dCAuICciJzogJycpDQoJCQkJKQ0KCQkJCS50ZChmSW5wdXQoJ3RleHQnLCAnc21kX3VtX2dy b3VwX25hbWVbXScsICRuYW1lKSwgJycsICduYW1lJykNCgkJCQkudGQoZklucHV0KCd0ZXh0 JywgJ3NtZF91bV9ncm91cF90aXRsZVtdJywgZ1R4dCgkbmFtZSkpLCAnJywgJ25hbWUnKQ0K CQkJCS50ZCgkZExpbmspDQoJCQksICcgY2xhc3M9IicuKCgkY3RyJTIgPT0gMCkgPyAnZXZl bicgOiAnb2RkJykuJyInDQoJCQkpOw0KDQoJCQkkY3RyKys7DQoJCX0NCg0KCQllY2hvIGZJ bnB1dCgnaGlkZGVuJywgJ3NtZF91bV9ncnBfZGVsJywgJycsICcnLCAnJywgJycsICcnLCAn JywgJ3NtZF91bV9ncnBfZGVsJykgLCAnPC90Ym9keT4nLg0KCQkJbi5lbmRUYWJsZSgpLg0K CQkJbi5lSW5wdXQoJHNtZF91bV9ldmVudCkuDQoJCQluLnNJbnB1dCgnc21kX3VtX2dyb3Vw cycpLg0KCQkJbi50SW5wdXQoKS4NCgkJCW4uJzwvZm9ybT4nLg0KCQkJbi5zbWRfdW1fYWN0 aXZlX3VzZXJzKCkuDQoJCQluLic8L2Rpdj4nOw0KCX0NCn0NCg0KLy8gLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tDQovLyBQcml2cyBtYW5hZ2VtZW50IHBhbmVsDQpmdW5jdGlvbiBzbWRf dW1fcHJpdnMoJG1zZz0nJykgew0KCWdsb2JhbCAkc21kX3VtX2V2ZW50LCAkc21kX3VtX3By ZWZzLCAkc21kX3VtX3N0eWxlcywgJHR4cF91c2VyLCAkdHhwX3Blcm1pc3Npb25zOw0KDQoJ cmVxdWlyZV9wcml2cygkc21kX3VtX2V2ZW50LicucHJ2Jyk7DQoNCglpZiAoIXNtZF91bV90 YWJsZV9leGlzdCgpKSB7DQoJCXNtZF91bV90YWJsZV9pbnN0YWxsKDApOw0KCX0NCg0KCWlm IChwcygnc21kX3VtX3ByaXZfc2F2ZScpKSB7DQoJCSRhcmVhcyA9IHBzKCdzbWRfdW1fYXJl YXMnKTsNCgkJZm9yZWFjaCAoJGFyZWFzIGFzICRhcmVhKSB7DQoJCQkkYXJfZmFrZW5hbWUg PSBzdHJfcmVwbGFjZSgnLicsICctLS0nLCAkYXJlYSk7DQoJCQkkcHJpdnMgPSBwcygkYXJf ZmFrZW5hbWUpOw0KCQkJJGFyZWEgPSBzdHJ0b2xvd2VyKHNhbml0aXplRm9yUGFnZSgkYXJl YSkpOw0KDQoJCQkvLyBEZWxldGUgdGhlIG9sZCBhcmVhIHByaXZzIGlmIHRoZXkgZXhpc3QN CgkJCXNhZmVfZGVsZXRlKFNNRF9VTV9QUklWUywgImFyZWE9JyIuZG9TbGFzaCgkYXJlYSku IiciKTsNCg0KCQkJaWYgKGlzX2FycmF5KCRwcml2cykpIHsNCgkJCQlmb3JlYWNoICgkcHJp dnMgYXMgJHByaXYpIHsNCgkJCQkJLy8gUmVzZXQgc2hvdWxkIGFsd2F5cyBiZSBmaXJzdCBp biB0aGUgbGlzdCBzaW5jZSBpdCdzIHRoZSBmaXJzdCBjaGVja2JveCBjb2wNCgkJCQkJLy8g SWYgcmVzZXQsIGRvbid0IGFkZCB0aGUgcHJpdnMgYWdhaW4gKHRodXMgdGhleSB3aWxsIGJl IHJlYWQgZnJvbSBhZG1pbl9jb25maWcucGhwKQ0KCQkJCQlpZiAoJHByaXYgPT0gJ3NtZF91 bV9yZXNldCcpIHsNCgkJCQkJCWJyZWFrOw0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJYXNzZXJ0 X2ludCgkcHJpdik7DQoJCQkJCQlzYWZlX2luc2VydChTTURfVU1fUFJJVlMsICJhcmVhPSci IC4gZG9TbGFzaCgkYXJlYSkgLiAiJywgcHJpdj0nIiAuIGRvU2xhc2goJHByaXYpIC4gIici KTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJfQ0KDQoJCS8vIE1lcmdlIHRoZSBjaGFuZ2Vz IGludG8gdGhlIHByaXYgdGFibGUNCgkJc21kX3VtX3ByaXZfbWVyZ2UoMCwxKTsNCgkJJG1z ZyA9IHNtZF91bV9nVHh0KCdzbWRfdW1fcHJ2X3NhdmVkJyk7DQoJfSBlbHNlIGlmIChwcygn c21kX3VtX3ByaXZfYWRkJykpIHsNCgkJJG5hbWUgPSBwcygnc21kX3VtX25ld19wcnYnKTsN CgkJJG5hbWUgPSBzdHJ0b2xvd2VyKHNhbml0aXplRm9yUGFnZSgkbmFtZSkpOw0KDQoJCWlm ICgkbmFtZSkgew0KCQkJaWYgKHN0cnBvcygkbmFtZSwgJ3NtZF91bScpID09PSAwKSB7DQoJ CQkJLy8gQ2FuJ3QgY3JlYXRlIHByaXZzIGZvciB0aGlzIHBsdWdpbg0KCQkJCSRtc2cgPSBh cnJheShzbWRfdW1fZ1R4dCgnc21kX3VtX3Bydl9zbWRfdW0nKSwgRV9VU0VSX1dBUk5JTkcp Ow0KCQkJfSBlbHNlIHsNCgkJCQkkZXhpc3RzID0gYXJyYXlfa2V5X2V4aXN0cygkbmFtZSwg JHR4cF9wZXJtaXNzaW9ucyk7DQoJCQkJaWYgKCRleGlzdHMpIHsNCgkJCQkJJG1zZyA9IGFy cmF5KHNtZF91bV9nVHh0KCdzbWRfdW1fcHJ2X2V4aXN0cycpLCBFX1VTRVJfV0FSTklORyk7 DQoJCQkJfSBlbHNlIHsNCgkJCQkJc2FmZV9pbnNlcnQoU01EX1VNX1BSSVZTLCAiYXJlYT0n IiAuIGRvU2xhc2goJG5hbWUpIC4gIiciKTsNCg0KCQkJCQlzbWRfdW1fcHJpdl9tZXJnZSgw LDEpOw0KCQkJCQkkbXNnID0gc21kX3VtX2dUeHQoJ3NtZF91bV9wcnZfY3JlYXRlZCcsIGFy cmF5KCd7YXJlYX0nID0+ICRuYW1lKSk7DQoJCQkJfQ0KCQkJfQ0KCQl9IGVsc2Ugew0KCQkJ JG1zZyA9IGFycmF5KHNtZF91bV9nVHh0KCdzbWRfdW1fbmFtZV9yZXF1aXJlZCcpLCBFX0VS Uk9SKTsNCgkJfQ0KCX0NCg0KCXBhZ2V0b3Aoc21kX3VtX2dUeHQoJ3NtZF91bV90YWJfbmFt ZScpLicgJnJhcXVvOyAnLnNtZF91bV9nVHh0KCdzbWRfdW1fcHJ2X2xibCcpLCAkbXNnKTsN CglleHRyYWN0KHNtZF91bV9idXR0b25zKCdwcnYnKSk7DQoNCgkkYnRuYmFyID0gJzxzcGFu IGNsYXNzPSJzbWRfdW1fYnV0dG9ucyI+Jy4kYnRuVXNyLiRidG5HcnAuJGJ0blBydi4kYnRu UHJmLic8L3NwYW4+JzsNCg0KCS8vIEluamVjdCBzdHlsZXMNCgllY2hvICc8c3R5bGUgdHlw ZT0idGV4dC9jc3MiPicgLiAkc21kX3VtX3N0eWxlc1snY29udHJvbC1wYW5lbCddIC4gJzwv c3R5bGU+JzsNCg0KCWVjaG8gJzxkaXYgaWQ9IicuJHNtZF91bV9ldmVudC4nX2NvbnRyb2wi IGNsYXNzPSJ0eHAtY29udHJvbC1wYW5lbCI+Jw0KCQkuIGZvcm0oDQoJCQlncmFmKA0KCQkJ CSc8bGFiZWwgZm9yPSJzbWRfdW1fbmV3X3BydiI+JyAuIHNtZF91bV9nVHh0KCdzbWRfdW1f cHJ2X25ldycpIC4gJzwvbGFiZWw+Jy5zcA0KCQkJCS5mSW5wdXQoJ3RleHQnLCAnc21kX3Vt X25ld19wcnYnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnc21kX3VtX25ld19wcnYnKQ0K CQkJCS5mSW5wdXQoJ3N1Ym1pdCcsICdzbWRfdW1fcHJpdl9hZGQnLCBnVHh0KCdjcmVhdGUn KSwgJ3NtYWxsZXJib3gnKQ0KCQkJCS5lSW5wdXQoJHNtZF91bV9ldmVudCkNCgkJCQkuc0lu cHV0KCdzbWRfdW1fcHJpdnMnKQ0KCQkJCSkNCgkJCSwgJycsJycsJ3Bvc3QnLCdzZWFyY2gt Zm9ybScNCgkJCSkNCgkJLiAkYnRuYmFyIC4gJzwvZGl2Pic7DQoNCgkkZ3JvdXBsaXN0X25h bWUgPSBzbWRfdW1fZ2V0X2dyb3VwcygwKTsNCgkkZ3JvdXBsaXN0X3RpdGxlID0gc21kX3Vt X2dldF9ncm91cHMoMSk7DQoNCgl1bnNldCgkZ3JvdXBsaXN0X25hbWVbMF0pOyAvLyBEb24n dCB3YW50IE5vbmUgcHJpdnMNCgl1bnNldCgkZ3JvdXBsaXN0X3RpdGxlWzBdKTsgLy8gRGl0 dG8NCg0KCSRjdXJyX2FyZWEgPSAnJzsNCgkkYXJlYV9jb3VudCA9IDA7DQoJJHRoYXR0cyA9 ICcgY2xhc3M9InNtZF91bV9ncnBfbmFtZSIgdGl0bGU9IicgLiBzbWRfdW1fZ1R4dCgnc21k X3VtX3NlbF9ncnAnKSAuICciJzsNCgkkaGVhZGVycyA9ICc8dGhlYWQ+Jy50cigNCgkJaENl bGwoJycsICcnLCAnIGNsYXNzPSJzbWRfdW1fc2VsX2FyZWEiIHRpdGxlPSInIC4gc21kX3Vt X2dUeHQoJ3NtZF91bV9zZWxfYWxsJykgLiAnIicpDQoJCS5oQ2VsbChzbWRfdW1fZ1R4dCgn c21kX3VtX3Jlc2V0JyksICcnLCAnIGNsYXNzPSJzbWRfdW1fcmVzZXRfY29sIiB0aXRsZT0i JyAuIHNtZF91bV9nVHh0KCdzbWRfdW1fc2VsX3Jlc2V0JykgLiAnIicpDQoJCS5oQ2VsbChq b2luKCc8L3RoPjx0aCcuJHRoYXR0cy4nPicsICRncm91cGxpc3RfdGl0bGUpLCAnJywgJHRo YXR0cykNCgksICcgY2xhc3M9InNtZF91bV9wcnZfaGRyIicpLiAnPC90aGVhZD4nOw0KDQoJ JHZpeiA9IGRvX2xpc3QoZ2V0X3ByZWYoJ3BhbmVfc21kX3VtX3ByaXZfdmlzaWJsZScpKTsN Cg0KCSRjdHIgPSAxOw0KCWVjaG8gPDw8RU9KUw0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFz Y3JpcHQiPg0KZnVuY3Rpb24gc21kX3VtX3ByZXN1YihvYmopIHsNCglqUXVlcnkoJyNzbWRf dW1fcHJ2X2RlbCcpLnZhbChqUXVlcnkob2JqKS5hdHRyKCdpZCcpKTsNCn0NCg0KalF1ZXJ5 LmZuLnNtZF91bV9yb3dzZWwgPSBmdW5jdGlvbihpZHgpIHsNCglyZXR1cm4galF1ZXJ5KCd0 cjpudGgtY2hpbGQoJysoaWR4KzEpKycpIHRkLnNtZF91bV9jaGVja2JveCcsIHRoaXMpOw0K fQ0KalF1ZXJ5LmZuLnNtZF91bV9jb2xzZWwgPSBmdW5jdGlvbihpZHgpIHsNCglyZXR1cm4g alF1ZXJ5KCd0ciB0ZDpudGgtY2hpbGQoJysoaWR4KzEpKycpJywgdGhpcyk7DQp9DQoNCi8v IEFmZmVjdCBhbGwgaGlnaGxpZ2h0ZWQgY2hlY2tib3hlcyBvbiBrZXlwcmVzcw0KZnVuY3Rp b24gc21kX3VtX3RvZ2dsZUNoZWNrYm94KGV2KSB7DQoJa2V5ID0gZXYua2V5Q29kZTsNCglv YmogPSBqUXVlcnkoJy5zbWRfdW1fc2VsZWN0ZWQgOmNoZWNrYm94Jyk7DQoJc3dpdGNoKGtl eSkgew0KCQljYXNlIDY3Og0KCQkJLy8gKGMpaGVjayBzZWxlY3RlZCBib3hlcw0KCQkJb2Jq LnByb3AoJ2NoZWNrZWQnLCB0cnVlKTsNCgkJYnJlYWs7DQoJCWNhc2UgNjg6DQoJCQkvLyAo ZCllc2VsZWN0IGFsbCBzZWxlY3RlZCByb3dzL2NvbHMNCgkJCWpRdWVyeSgnLnNtZF91bV9z ZWxlY3RlZCwgLnNtZF91bV9yc2VsLCAuc21kX3VtX2NzZWwnKS5yZW1vdmVDbGFzcygnc21k X3VtX3NlbGVjdGVkIHNtZF91bV9yc2VsIHNtZF91bV9jc2VsJyk7DQoJCWJyZWFrOw0KCQkN CgkJY2FzZSA4NDoNCgkJCS8vICh0KW9nZ2xlIHNlbGVjdGVkIGJveGVzDQoJCQlvYmouZWFj aChmdW5jdGlvbigpIHsNCgkJCQljYiA9IGpRdWVyeSh0aGlzKTsNCgkJCQlpZiAoY2IucHJv cCgnY2hlY2tlZCcpID09IHRydWUpIHsNCgkJCQkJY2IucHJvcCgnY2hlY2tlZCcsIGZhbHNl KTsNCgkJCQl9IGVsc2Ugew0KCQkJCQljYi5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7DQoJCQkJ fQ0KCQkJfSk7DQoJCWJyZWFrOw0KCQljYXNlIDg1Og0KCQkJLy8gKHUpbmNoZWNrIHNlbGVj dGVkIGJveGVzDQoJCQlvYmoucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTsNCgkJYnJlYWs7DQoJ fQ0KfQ0KDQpqUXVlcnkoZnVuY3Rpb24oKSB7DQoJalF1ZXJ5KGRvY3VtZW50KS5iaW5kKCdr ZXl1cCcsIHNtZF91bV90b2dnbGVDaGVja2JveCk7DQoNCgkvLyBSb3cgc2VsZWN0b3INCglq UXVlcnkoJy5zbWRfdW1fcHJ2X25hbWUnKS5jbGljayhmdW5jdGlvbigpIHsNCgkJdHIgPSBq UXVlcnkodGhpcykuY2xvc2VzdCgndHInKTsNCgkJcm93bnVtID0gdHIuaW5kZXgoKTsNCgkJ b2JqID0galF1ZXJ5KHRyKS5wYXJlbnQoKS5zbWRfdW1fcm93c2VsKHJvd251bSk7DQoNCgkJ Ly8gQ2FuJ3QgdXNlIHRvZ2dsZUNsYXNzIGJlY2F1c2UgaXQgd291bGQgdW50b2dnbGUgYW55 IGNvbHMgdGhhdCB3ZXJlIGFscmVhZHkgc2VsZWN0ZWQNCgkJaWYgKGpRdWVyeSh0aGlzKS5o YXNDbGFzcygnc21kX3VtX3JzZWwnKSkgew0KCQkJb2JqLnJlbW92ZUNsYXNzKCdzbWRfdW1f c2VsZWN0ZWQnKTsNCgkJfSBlbHNlIHsNCgkJCW9iai5hZGRDbGFzcygnc21kX3VtX3NlbGVj dGVkJyk7DQoJCX0NCgkJalF1ZXJ5KHRoaXMpLnRvZ2dsZUNsYXNzKCdzbWRfdW1fcnNlbCcp Ow0KCX0pOw0KDQoJLy8gQ29sdW1uIHNlbGVjdG9yDQoJalF1ZXJ5KCcuc21kX3VtX2dycF9u YW1lLCAuc21kX3VtX3Jlc2V0X2NvbCcpLmNsaWNrKGZ1bmN0aW9uKCkgew0KCQljb2xudW0g PSBqUXVlcnkodGhpcykuaW5kZXgoKTsNCgkJdGJvZHkgPSBqUXVlcnkodGhpcykucGFyZW50 KCkucGFyZW50KCkubmV4dCgndGJvZHknKTsNCgkJb2JqID0galF1ZXJ5KHRib2R5KS5zbWRf dW1fY29sc2VsKGNvbG51bSk7DQoNCgkJLy8gQ2FuJ3QgdXNlIHRvZ2dsZUNsYXNzIGJlY2F1 c2UgaXQgd291bGQgdW50b2dnbGUgYW55IHJvd3MgdGhhdCB3ZXJlIGFscmVhZHkgc2VsZWN0 ZWQNCgkJaWYgKGNvbG51bSA+IDApIHsNCgkJCWlmIChqUXVlcnkodGhpcykuaGFzQ2xhc3Mo J3NtZF91bV9jc2VsJykpIHsNCgkJCQlvYmoucmVtb3ZlQ2xhc3MoJ3NtZF91bV9zZWxlY3Rl ZCcpOw0KCQkJfSBlbHNlIHsNCgkJCQlvYmouYWRkQ2xhc3MoJ3NtZF91bV9zZWxlY3RlZCcp Ow0KCQkJfQ0KCQl9DQoJCWpRdWVyeSh0aGlzKS50b2dnbGVDbGFzcygnc21kX3VtX2NzZWwn KTsNCgl9KTsNCg0KCS8vIFdob2xlIHRhYmxlIHNlbGVjdG9yDQoJalF1ZXJ5KCcuc21kX3Vt X3NlbF9hcmVhJykuY2xpY2soZnVuY3Rpb24oKSB7DQoJCW1lID0galF1ZXJ5KHRoaXMpOw0K CQl0aGVhZCA9IG1lLnBhcmVudCgpLnBhcmVudCgpOw0KCQl0Ym9keSA9IHRoZWFkLm5leHQo J3Rib2R5Jyk7DQoJCXRib2R5LnRvZ2dsZUNsYXNzKCdzbWRfdW1fYWxsc2VsJyk7DQoJCWlm ICh0Ym9keS5oYXNDbGFzcygnc21kX3VtX2FsbHNlbCcpKSB7DQoJCQl0Ym9keS5maW5kKCcu c21kX3VtX3Bydl9uYW1lJykucmVtb3ZlQ2xhc3MoJ3NtZF91bV9yc2VsJykuY2xpY2soKTsN CgkJCW1lLm5leHRBbGwoJy5zbWRfdW1fZ3JwX25hbWUnKS5hZGRDbGFzcygnc21kX3VtX2Nz ZWwnKTsNCgkJfSBlbHNlIHsNCgkJCXRib2R5LmZpbmQoJy5zbWRfdW1fcHJ2X25hbWUnKS5h ZGRDbGFzcygnc21kX3VtX3JzZWwnKS5jbGljaygpOw0KCQkJbWUubmV4dEFsbCgnLnNtZF91 bV9ncnBfbmFtZScpLnJlbW92ZUNsYXNzKCdzbWRfdW1fY3NlbCcpOw0KCQl9DQoJfSk7DQoN Cn0pOw0KPC9zY3JpcHQ+DQpFT0pTOw0KDQoJZWNobyBuLic8ZGl2IGNsYXNzPSJ0eHAtbGlz dCI+JzsNCgllY2hvICc8Zm9ybSBhY3Rpb249ImluZGV4LnBocCIgaWQ9InNtZF91bV9wcml2 aWxlZ2VfZm9ybSIgbWV0aG9kPSJwb3N0IiBuYW1lPSJsb25nZm9ybSIgb25zdWJtaXQ9InJl dHVybiB2ZXJpZnkoXCcnLmdUeHQoJ2FyZV95b3Vfc3VyZScpLidcJykiPic7DQoJZWNobyBl SW5wdXQoJHNtZF91bV9ldmVudCkuc0lucHV0KCdzbWRfdW1fcHJpdnMnKS50SW5wdXQoKTsN Cglmb3JlYWNoICgkdHhwX3Blcm1pc3Npb25zIGFzICRhcmVhID0+ICRwcml2cykgew0KCQkk cHJpdl9saXN0ID0gZG9fbGlzdCgkcHJpdnMpOw0KCQkkYXJlYV9wYXJ0cyA9IGRvX2xpc3Qo JGFyZWEsICcuJyk7DQoJCWlmIChwcmVnX21hdGNoKCcvXihbQS1aYS16MC05XXszLDN9KVxf LycsICRhcmVhX3BhcnRzWzBdLCAkbWF0Y2hlcykpIHsNCgkJCS8vIFBsdWdpbg0KCQkJJGFy ZWFfcGFydHNbMF0gPSAkbWF0Y2hlc1sxXTsNCgkJfQ0KCQkvLyBTdGFydCBvZiBhIG5ldyBh cmVhIHNvIGNsb3NlIHRoZSBwcmV2aW91cyBvbmUgYW5kIHN0YXJ0IGEgbmV3IGJsb2NrDQoJ CWlmICgkY3Vycl9hcmVhICE9ICRhcmVhX3BhcnRzWzBdKSB7DQoJCQlpZiAoJGFyZWFfY291 bnQgPiAwKSB7DQoJCQkJZWNobyAnPC90Ym9keT4nIC4gZW5kVGFibGUoKSAuICc8L2Rpdj48 L2Rpdj4nOw0KCQkJfQ0KCQkJJGFyZWFfaGVhZCA9IGdUeHQoJGFyZWFfcGFydHNbMF0pOw0K CQkJJGlzX3ZpeiA9IGluX2FycmF5KCRhcmVhX3BhcnRzWzBdLCAkdml6KTsNCgkJCSRyZWYg PSAnc21kX3VtX3ByaXZfJy4kYXJlYV9wYXJ0c1swXTsNCgkJCWVjaG8gJzxkaXYgY2xhc3M9 InNtZF91bV9wcml2Z3JvdXAiPjxoMiBjbGFzcz0icGxhaW4gbGV2ZXInLigkaXNfdml6ID8g JyBleHBhbmRlZCcgOiAnJykuJyI+PGEgaHJlZj0iIycuJHJlZi4nIj4nIC4gJGFyZWFfcGFy dHNbMF0gLiAoKCRhcmVhX3BhcnRzWzBdICE9ICRhcmVhX2hlYWQpID8gJyAoJyAuIGdUeHQo JGFyZWFfcGFydHNbMF0pLicpJyA6ICcnKSAuICc8L2E+PC9oMj4nOw0KCQkJZWNobyAnPGRp diBpZD0iJy4kcmVmLiciIGNsYXNzPSJ0b2dnbGUiIHN0eWxlPSJkaXNwbGF5OicuKCRpc192 aXogPyAnYmxvY2snIDogJ25vbmUnKS4nIj4nOw0KCQkJZWNobyBmSW5wdXQoJ3N1Ym1pdCcs ICdzbWRfdW1fcHJpdl9zYXZlJywgZ1R4dCgnc2F2ZScpLCAnc21hbGxlcmJveCBzbWRfdW1f cHJpdnNhdmUnKTsNCgkJCWVjaG8gc3RhcnRUYWJsZSgnbGlzdCcpOw0KCQkJZWNobyAkaGVh ZGVyczsNCgkJCWVjaG8gJzx0Ym9keT4nOw0KCQl9DQoNCgkJJHByaXZib3hlcyA9IGFycmF5 KCk7DQoJCSRzYWZlX2FyZWEgPSBzdHJfcmVwbGFjZSgnLicsICctLS0nLCAkYXJlYSkuJ1td JzsNCgkJZm9yZWFjaCAoJGdyb3VwbGlzdF9uYW1lIGFzICRpZCA9PiAkcHJpdikgew0KCQkJ Ly8vIERvdHMgYXJlbid0IHZhbGlkIGNoYXJhY3RlcnMgZm9yIGEgbmFtZSBzbyByZXBsYWNl IHRoZW0gbm93IGFuZCBzd2FwIHRoZW0gYmFjayB1cG9uIFNhdmUNCgkJCSRwcml2Ym94ZXNb XSA9IHRkKGNoZWNrYm94KCRzYWZlX2FyZWEsICRpZCwgKGluX2FycmF5KCRpZCwgJHByaXZf bGlzdCkpKSwgJycsICdzbWRfdW1fY2hlY2tib3gnKTsNCgkJfQ0KDQoJCWVjaG8gdHIoDQoJ CQl0ZGEoJGFyZWEuaElucHV0KCdzbWRfdW1fYXJlYXNbXScsICRhcmVhKSwgJyBjbGFzcz0i c21kX3VtX3Bydl9uYW1lIiB0aXRsZT0iJyAuIHNtZF91bV9nVHh0KCdzbWRfdW1fc2VsX3By dicpIC4gJyInKQ0KCQkJLnRkKGNoZWNrYm94KCRzYWZlX2FyZWEsICdzbWRfdW1fcmVzZXQn LCAwKSwgJycsICdzbWRfdW1fcmVzZXRib3gnKQ0KCQkJLmpvaW4obiwgJHByaXZib3hlcykN CgkJCSwgJyBjbGFzcz0iJy4oKCRjdHIlMiA9PSAwKSA/ICdldmVuJyA6ICdvZGQnKS4nIicN CgkJKTsNCgkJJGN1cnJfYXJlYSA9ICRhcmVhX3BhcnRzWzBdOw0KCQkkYXJlYV9jb3VudCsr Ow0KCQkkY3RyKys7DQoJfQ0KDQoJZWNobyBlbmRUYWJsZSgpIC4nPC9kaXY+PC9kaXY+JyAu IGZJbnB1dCgnaGlkZGVuJywgJ3NtZF91bV9wcnZfZGVsJywgJycsICcnLCAnJywgJycsICcn LCAnJywgJ3NtZF91bV9wcnZfZGVsJykgLiAnPC9mb3JtPicuc21kX3VtX2FjdGl2ZV91c2Vy cygpLic8L2Rpdj4nOw0KfQ0KDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vIFBy ZWZzIG1hbmFnZW1lbnQgcGFuZWwNCmZ1bmN0aW9uIHNtZF91bV9wcmVmcygkbXNnPScnKSB7 DQoJZ2xvYmFsICRzbWRfdW1fZXZlbnQsICRzbWRfdW1fcHJlZnMsICRzbWRfdW1fc3R5bGVz LCAkdHhwX3VzZXI7DQoNCglyZXF1aXJlX3ByaXZzKCRzbWRfdW1fZXZlbnQuJy5wcmYnKTsN Cg0KCWlmICghc21kX3VtX3RhYmxlX2V4aXN0KCkpIHsNCgkJc21kX3VtX3RhYmxlX2luc3Rh bGwoMCk7DQoJfQ0KDQoJaWYgKHBzKCdzbWRfdW1fcHJlZl9zYXZlJykpIHsNCgkJZm9yZWFj aCAoJHNtZF91bV9wcmVmcyBhcyAkaWR4ID0+ICRwcmVmb2JqKSB7DQoJCQkkdmFsID0gcHMo JGlkeCk7DQoJCQkkdmFsID0gKGlzX2FycmF5KCR2YWwpKSA/IGpvaW4oJywgJywgJHZhbCkg OiAkdmFsOw0KCQkJc2V0X3ByZWYoJGlkeCwgJHZhbCwgJHNtZF91bV9ldmVudCwgJHByZWZv YmpbJ3R5cGUnXSwgJHByZWZvYmpbJ2h0bWwnXSwgJHByZWZvYmpbJ3Bvc2l0aW9uJ10pOw0K CQl9DQoNCgkJJG1zZyA9IHNtZF91bV9nVHh0KCdzbWRfdW1fcHJmX3NhdmVkJyk7DQoJfQ0K DQoJcGFnZXRvcChzbWRfdW1fZ1R4dCgnc21kX3VtX3RhYl9uYW1lJykuJyAmcmFxdW87ICcu c21kX3VtX2dUeHQoJ3NtZF91bV9wcmZfbGJsJyksICRtc2cpOw0KCWV4dHJhY3Qoc21kX3Vt X2J1dHRvbnMoJ3ByZicpKTsNCg0KCSRidG5iYXIgPSAnPHNwYW4gY2xhc3M9InNtZF91bV9i dXR0b25zIj4nLiRidG5Vc3IuJGJ0bkdycC4kYnRuUHJ2LiRidG5QcmYuJzwvc3Bhbj4nOw0K DQoJLy8gSW5qZWN0IHN0eWxlcw0KCWVjaG8gJzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+JyAu ICRzbWRfdW1fc3R5bGVzWydjb250cm9sLXBhbmVsJ10gLiAnPC9zdHlsZT4nOw0KDQoJZWNo byAnPGRpdiBpZD0iJy4kc21kX3VtX2V2ZW50LidfY29udHJvbCIgY2xhc3M9InR4cC1jb250 cm9sLXBhbmVsIj4nIC4gJGJ0bmJhciAuICc8L2Rpdj4nOw0KDQoJJG91dCA9IGFycmF5KCk7 DQoJJG91dFtdID0gbi4nPGRpdiBjbGFzcz0idHhwLWxpc3QiPic7DQoJJG91dFtdID0gJzxm b3JtIG5hbWU9InNtZF91bV9wcmVmcyIgaWQ9InNtZF91bV9wcmVmcyIgYWN0aW9uPSJpbmRl eC5waHAiIG1ldGhvZD0icG9zdCI+JzsNCgkkb3V0W10gPSBlSW5wdXQoJHNtZF91bV9ldmVu dCkuc0lucHV0KCdzbWRfdW1fcHJlZnMnKTsNCgkkb3V0W10gPSBzdGFydFRhYmxlKCdsaXN0 Jyk7DQoJJG91dFtdID0gdHIodGRjcyhzdHJvbmcoc21kX3VtX2dUeHQoJ3NtZF91bV9wcmZf bGVnZW5kJykpLCAyKSk7DQoJZm9yZWFjaCAoJHNtZF91bV9wcmVmcyBhcyAkaWR4ID0+ICRw cmVmb2JqKSB7DQoJCSRzdWJvdXQgPSBhcnJheSgpOw0KCQkkc3Vib3V0W10gPSB0ZGEoJzxs YWJlbCBmb3I9IicuJGlkeC4nIj4nLnNtZF91bV9nVHh0KCRpZHgpLic8L2xhYmVsPicsICcg Y2xhc3M9Im5vbGluZSIgc3R5bGU9InRleHQtYWxpZ246IHJpZ2h0OyB2ZXJ0aWNhbC1hbGln bjogbWlkZGxlOyInKTsNCgkJJHZhbCA9IGdldF9wcmVmKCRpZHgsICRwcmVmb2JqWydkZWZh dWx0J10sIDEpOw0KCQlzd2l0Y2ggKCRwcmVmb2JqWydodG1sJ10pIHsNCgkJCWNhc2UgJ3Rl eHRfaW5wdXQnOg0KCQkJCSRzdWJvdXRbXSA9IGZJbnB1dENlbGwoJGlkeCwgJHZhbCwgJycs ICcnLCAnJywgJGlkeCk7DQoJCQlicmVhazsNCgkJCWNhc2UgJ3llc25vcmFkaW8nOg0KCQkJ CSRzdWJvdXRbXSA9IHRkYSh5ZXNub1JhZGlvKCRpZHgsICR2YWwpLCcgY2xhc3M9Im5vbGlu ZSInKTsNCgkJCWJyZWFrOw0KCQkJY2FzZSAnY2hlY2tib3hzZXQnOg0KCQkJCSR2YWxzID0g ZG9fbGlzdCgkdmFsKTsNCgkJCQkkbGNsb3V0ID0gYXJyYXkoKTsNCgkJCQlmb3JlYWNoICgk cHJlZm9ialsnY29udGVudCddIGFzICRjYiA9PiAkdmFsKSB7DQoJCQkJCSRjaGVja2VkID0g aW5fYXJyYXkoJGNiLCAkdmFscyk7DQoJCQkJCSRsY2xvdXRbXSA9IGNoZWNrYm94KCRpZHgu J1tdJywgJGNiLCAkY2hlY2tlZCkuICR2YWw7DQoJCQkJfQ0KCQkJCSRzdWJvdXRbXSA9IHRk YShqb2luKG4sICRsY2xvdXQpLCcgY2xhc3M9Im5vbGluZSInKTsNCgkJCWJyZWFrOw0KCQkJ Y2FzZSAnc2VsZWN0bGlzdCc6DQoJCQkJJHN1Ym91dFtdID0gdGRhKHNlbGVjdElucHV0KCRp ZHgsICRwcmVmb2JqWydjb250ZW50J11bMF0sICR2YWwsICRwcmVmb2JqWydjb250ZW50J11b MV0pLCcgY2xhc3M9Im5vbGluZSInKTsNCgkJCWJyZWFrOw0KCQl9DQoJCSRvdXRbXSA9IHRy KGpvaW4obiAsJHN1Ym91dCkpOw0KCX0NCg0KCSRvdXRbXSA9IHRyKHRkYSgnJm5ic3A7Jywg JyBjbGFzcz0ibm9saW5lIicpIC4gdGRhKGZJbnB1dCgnc3VibWl0JywgJ3NtZF91bV9wcmVm X3NhdmUnLCBnVHh0KCdzYXZlJyksICdwdWJsaXNoJyksICcgY2xhc3M9Im5vbGluZSInKSk7 DQoJJG91dFtdID0gZW5kVGFibGUoKS50SW5wdXQoKTsNCgkkb3V0W10gPSAnPC9mb3JtPicu c21kX3VtX2FjdGl2ZV91c2VycygpLic8L2Rpdj4nOw0KDQoJZWNobyBqb2luKG4sICRvdXQp Ow0KfQ0KDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vIENvbW1vbiBidXR0b25z IGZvciB0aGUgaW50ZXJmYWNlDQpmdW5jdGlvbiBzbWRfdW1fYnV0dG9ucygkY3Vycj0ndXNy Jykgew0KCWdsb2JhbCAkc21kX3VtX2V2ZW50Ow0KDQoJJGdycCA9IGhhc19wcml2cygkc21k X3VtX2V2ZW50LicuZ3JwJyk7DQoJJHByZiA9IGhhc19wcml2cygkc21kX3VtX2V2ZW50Licu cHJmJyk7DQoJJHBydiA9IGhhc19wcml2cygkc21kX3VtX2V2ZW50LicucHJ2Jyk7DQoJJHVz ciA9ICgkZ3JwIHx8ICRwcmYgfHwgJHBydik7IC8vIERvbid0IHNob3cgdXNyIGJ1dHRvbiBp ZiBpdCdzIHRoZSBvbmx5IHRhYiBhdmFpbGFibGUNCg0KCSRyZXQgPSBhcnJheSAoDQoJCSdi dG5HcnAnICAgICAgPT4gKCAoJGdycCkgPyAnPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249 Ij9ldmVudD0nLiRzbWRfdW1fZXZlbnQuYS4nc3RlcD1zbWRfdW1fZ3JvdXBzIiBzdHlsZT0i ZGlzcGxheTppbmxpbmUiPicuZklucHV0KCdzdWJtaXQnLCAnc3VibWl0Jywgc21kX3VtX2dU eHQoJ3NtZF91bV9ncnBfbGJsJyksICdzbWFsbGVyYm94Jy4oJGN1cnI9PSdncnAnPycgc21k X2FjdGl2ZSc6JycpKS50SW5wdXQoKS4nPC9mb3JtPicgOiAnJyksDQoJCSdidG5QcmYnICAg ICAgPT4gKCAoJHByZikgPyAnPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249Ij9ldmVudD0n LiRzbWRfdW1fZXZlbnQuYS4nc3RlcD1zbWRfdW1fcHJlZnMiIHN0eWxlPSJkaXNwbGF5Omlu bGluZSI+Jy5mSW5wdXQoJ3N1Ym1pdCcsICdzdWJtaXQnLCBzbWRfdW1fZ1R4dCgnc21kX3Vt X3ByZl9sYmwnKSwgJ3NtYWxsZXJib3gnLigkY3Vycj09J3ByZic/JyBzbWRfYWN0aXZlJzon JykpLnRJbnB1dCgpLic8L2Zvcm0+JyA6ICcnKSwNCgkJJ2J0blBydicgICAgICA9PiAoICgk cHJ2KSA/ICc8Zm9ybSBtZXRob2Q9InBvc3QiIGFjdGlvbj0iP2V2ZW50PScuJHNtZF91bV9l dmVudC5hLidzdGVwPXNtZF91bV9wcml2cyIgc3R5bGU9ImRpc3BsYXk6aW5saW5lIj4nLmZJ bnB1dCgnc3VibWl0JywgJ3N1Ym1pdCcsIHNtZF91bV9nVHh0KCdzbWRfdW1fcHJ2X2xibCcp LCAnc21hbGxlcmJveCcuKCRjdXJyPT0ncHJ2Jz8nIHNtZF9hY3RpdmUnOicnKSkudElucHV0 KCkuJzwvZm9ybT4nIDogJycpLA0KCQknYnRuVXNyJyAgICAgID0+ICggKCR1c3IpID8gJzxm b3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSI/ZXZlbnQ9Jy4kc21kX3VtX2V2ZW50LmEuJ3N0 ZXA9c21kX3VtIiBzdHlsZT0iZGlzcGxheTppbmxpbmUiPicuZklucHV0KCdzdWJtaXQnLCAn c3VibWl0Jywgc21kX3VtX2dUeHQoJ3NtZF91bV91c3JfbGJsJyksICdzbWFsbGVyYm94Jy4o JGN1cnI9PSd1c3InPycgc21kX2FjdGl2ZSc6JycpKS50SW5wdXQoKS4nPC9mb3JtPicgOiAn JyksDQoJKTsNCglyZXR1cm4gJHJldDsNCn0NCg0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tDQovLyBBbHRlciB0aGUgcGFnZWJ5IHF1YW50aXR5DQpmdW5jdGlvbiBzbWRfdW1fY2hh bmdlX3BhZ2VieSgpIHsNCglnbG9iYWwgJHNtZF91bV9ldmVudDsNCglldmVudF9jaGFuZ2Vf cGFnZWJ5KCdzbWRfdW0nKTsNCgkkc21kX3VtX2V2ZW50KCk7DQp9DQoNCi8vIC0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQ0KLy8gVGhlIHVzZXIgcGFuZWwgc2VhcmNoIGRyb3Bkb3duIGxp c3QNCmZ1bmN0aW9uIHNtZF91bV9zZWFyY2hfZm9ybSgkY3JpdCwgJG1ldGhvZCkgew0KCWds b2JhbCAkc21kX3VtX2V2ZW50Ow0KDQoJJG1ldGhvZHMgPQlhcnJheSgNCgkJJ2xvZ2luX25h bWUnICAgID0+IGdUeHQoJ2xvZ2luX25hbWUnKSwNCgkJJ3JlYWxfbmFtZScgICAgID0+IGdU eHQoJ3JlYWxfbmFtZScpLA0KCQknZW1haWwnICAgICAgICAgPT4gZ1R4dCgnZW1haWwnKSwN CgkJJ3ByaXZpbGVnZXMnICAgID0+IGdUeHQoJ3ByaXZpbGVnZXMnKSwNCgkJJ2FydGljbGVf Y291bnQnID0+IHNtZF91bV9nVHh0KCdzbWRfdW1fYXJ0aWNsZV9jb3VudCcpLA0KCQknaW1h Z2VfY291bnQnICAgPT4gc21kX3VtX2dUeHQoJ3NtZF91bV9pbWFnZV9jb3VudCcpLA0KCQkn ZmlsZV9jb3VudCcgICAgPT4gc21kX3VtX2dUeHQoJ3NtZF91bV9maWxlX2NvdW50JyksDQoJ CSdsaW5rX2NvdW50JyAgICA9PiBzbWRfdW1fZ1R4dCgnc21kX3VtX2xpbmtfY291bnQnKSwN CgkpOw0KDQoJcmV0dXJuIHNlYXJjaF9mb3JtKCRzbWRfdW1fZXZlbnQsICcnLCAkY3JpdCwg JG1ldGhvZHMsICRtZXRob2QsICdsb2dpbicpOw0KfQ0KDQovLyAtLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0NCmZ1bmN0aW9uIHNtZF91bV9nZXRfcHJpdl9sZXZlbCgkcHJpdikgew0KCSRs ZXZlbHMgPSBnZXRfZ3JvdXBzKCk7DQoJcmV0dXJuICRsZXZlbHNbJHByaXZdOw0KfQ0KDQov LyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vIE1lcmdlL2VkaXQgdGhlIGdyb3VwcyAm IHByaXZzIGludG8gdGhlIGV4aXN0aW5nIGdsb2JhbCBhcnJheXMNCmZ1bmN0aW9uIHNtZF91 bV9wcml2X21lcmdlKCRkb19ncnA9MSwgJGRvX3ByaXY9MSkgew0KCWdsb2JhbCAkdHhwX2dy b3VwcywgJHR4cF9wZXJtaXNzaW9uczsNCg0KCWlmICgkZG9fZ3JwICYmIHNtZF91bV90YWJs ZV9leGlzdChTTURfVU1fR1JPVVBTKSkgew0KCQkkbmV3X2dyb3VwcyA9IHNhZmVfcm93cygn aWQsIG5hbWUnLCBTTURfVU1fR1JPVVBTLCAnMT0xJyk7DQoJCWZvcmVhY2ggKCRuZXdfZ3Jv dXBzIGFzICRyb3cpIHsNCgkJCSR0eHBfZ3JvdXBzWyRyb3dbJ2lkJ11dID0gJHJvd1snbmFt ZSddOw0KCQl9DQoJCWtzb3J0KCR0eHBfZ3JvdXBzKTsNCgl9DQoJaWYgKCRkb19wcml2ICYm IHNtZF91bV90YWJsZV9leGlzdChTTURfVU1fUFJJVlMpKSB7DQoJCSRuZXdfcHJpdnMgPSBz YWZlX3Jvd3MoJ2FyZWEsIEdST1VQX0NPTkNBVChwcml2KSBBUyBwcml2cycsIFNNRF9VTV9Q UklWUywgJzE9MSBHUk9VUCBCWSBhcmVhIE9SREVSIEJZIGFyZWEnKTsNCgkJZm9yZWFjaCAo JG5ld19wcml2cyBhcyAkcm93KSB7DQoJCQkvLyBTa2lwIHRoaXMgcGx1Z2luJ3Mgc3RyaW5n cyBhcyB3ZSBkb24ndCB3YW50IHBlb3BsZSB1cHNldHRpbmcgdGhlIHBsdWdpbidzIGJlaGF2 aW91cg0KCQkJaWYgKHN0cnBvcygkcm93WydhcmVhJ10sICdzbWRfdW0nKSA9PT0gZmFsc2Up IHsNCgkJCQkkdHhwX3Blcm1pc3Npb25zWyRyb3dbJ2FyZWEnXV0gPSAkcm93Wydwcml2cydd Ow0KCQkJfQ0KCQl9DQoJCWtzb3J0KCR0eHBfcGVybWlzc2lvbnMpOw0KCX0NCn0NCg0KLy8g LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyBTaG93IHdobydzIGN1cnJlbnRseSBvbmxp bmUNCmZ1bmN0aW9uIHNtZF91bV9hY3RpdmVfdXNlcnMoKSB7DQoJZ2xvYmFsICRzbWRfdW1f ZXZlbnQsICRzbWRfdW1fcHJlZnM7DQoNCgkkY3Vycl91c2VycyA9IHVuc2VyaWFsaXplKGdl dF9wcmVmKCdzbWRfdW1fY3VycmVudF91c2VycycsICcnLCAxKSk7DQoJJHRpbWVvdXQgPSBn ZXRfcHJlZignc21kX3VtX2FjdGl2ZV90aW1lb3V0JywgJHNtZF91bV9wcmVmc1snc21kX3Vt X2FjdGl2ZV90aW1lb3V0J11bJ2RlZmF1bHQnXSk7DQoJJG9ubGluZSA9IGFycmF5KCk7DQoJ aWYgKGlzX2FycmF5KCRjdXJyX3VzZXJzKSkgew0KCQlmb3JlYWNoICgkY3Vycl91c2VycyBh cyAkdXNlciA9PiAkbGFzdF9hY2Nlc3MpIHsNCgkJCSRzdGlsbF9hY3RpdmUgPSBzdHJ0b3Rp bWUoIiskdGltZW91dCBzZWNvbmRzIiwgJGxhc3RfYWNjZXNzKTsNCgkJCWlmICggKCRzdGls bF9hY3RpdmUgIT09IGZhbHNlKSAmJiAoJHN0aWxsX2FjdGl2ZSA+IHRpbWUoKSkgKSB7DQoJ CQkJJG9ubGluZVtdID0gZUxpbmsoJHNtZF91bV9ldmVudCwgJycsICdzZWFyY2hfbWV0aG9k JywgJ2xvZ2luX25hbWUnLCAkdXNlciwgJ2NyaXQnLCAkdXNlcik7DQoJCQl9DQoJCX0NCgl9 DQoNCglyZXR1cm4gKCRvbmxpbmUpID8gJzxkaXYgY2xhc3M9InNtZF91bV9hY3RpdmVfdXNl cnMiPicgLiBzbWRfdW1fZ1R4dCgnc21kX3VtX2FjdGl2ZScpIC4gam9pbignLCAnLCAkb25s aW5lKSAuICc8L2Rpdj4nIDogJyc7DQp9DQoNCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQ0KLy8gVXBkYXRlIGFueSBsYW5ndWFnZSBzdHJpbmcuIE5vdGUgdGhpcyBtYXkgbGVhdmUg b3JwaGFuIHN0cmluZ3MgaWYgdGhlIG5hbWUgaXMgY2hhbmdlZA0KZnVuY3Rpb24gc21kX3Vt X3Vwc2VydF9sYW5nKCR0aXRsZSwgJG5hbWU9JycpIHsNCglnbG9iYWwgJHRleHRhcnJheTsN Cg0KCSRsYW5nID0gZ2V0X3ByZWYoJ2xhbmd1YWdlJywgJ2VuLWdiJyk7DQoJJG5hbWUgPSAo aXNzZXQoJG5hbWUpICYmICRuYW1lICE9ICcnKSA/ICRuYW1lIDogc3RydG9sb3dlcihzYW5p dGl6ZUZvclVybCgkdGl0bGUpKTsNCgkkdGFibGUgPSAndHhwX2xhbmcnOw0KCSR3aGVyZSA9 ICJuYW1lPSciIC4gZG9TbGFzaCgkbmFtZSkgLiAiJyBBTkQgbGFuZz0nIiAuIGRvU2xhc2go JGxhbmcpIC4gIiciOw0KDQoJLy8gVHJ5IHRvIHVwZGF0ZSBmaXJzdA0KCSRyZXQgPSBzYWZl X3VwZGF0ZSgkdGFibGUsICJkYXRhPSciIC4gZG9TbGFzaCgkdGl0bGUpIC4gIiciLCAkd2hl cmUpOw0KCWlmICgkcmV0ICYmIChteXNxbF9hZmZlY3RlZF9yb3dzKCkgfHwgc2FmZV9jb3Vu dCgkdGFibGUsICR3aGVyZSkpKSB7DQoJCS8vIERvIG5vdGhpbmcgLS0gcmVjb3JkIGhhcyBi ZWVuIHVwZGF0ZWQNCgl9IGVsc2Ugew0KCQlzYWZlX2luc2VydCgkdGFibGUsICJldmVudD0n YWRtaW4nLCBuYW1lPSciIC4gZG9TbGFzaCgkbmFtZSkgLiAiJywgbGFuZz0nIiAuIGRvU2xh c2goJGxhbmcpIC4gIicsIGRhdGE9JyIgLiBkb1NsYXNoKCR0aXRsZSkgLiAiJyIpOw0KCX0N CgkvLyBVcGRhdGUgdGhlIGdsb2JhbCBhcnJheSBvbiB0aGUgcGFnZSBzbyBndHh0KCkgY2Fu IGdldCBpdCBpbW1lZGlhdGVseQ0KCSR0ZXh0YXJyYXlbJG5hbWVdID0gJHRpdGxlOw0KfQ0K DQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCmZ1bmN0aW9uIHNtZF91bV9nZXRfZ3Jv dXBzKCR0eXBlPTApIHsNCglnbG9iYWwgJHR4cF9ncm91cHMsICR0eHBfdXNlciwgJHNtZF91 bV9wcmVmczsNCglzdGF0aWMgJHBlcm1pdHRlZF91c2VycyA9IGFycmF5KCk7DQoNCglpZiAo aXNzZXQoJHBlcm1pdHRlZF91c2Vyc1skdHlwZV0pKSB7DQoJCXJldHVybiAkcGVybWl0dGVk X3VzZXJzWyR0eXBlXTsNCgl9DQoNCgkkbGV2ZWxzID0gKCR0eXBlKSA/IGdldF9ncm91cHMo KSA6ICR0eHBfZ3JvdXBzOw0KCSR0aWVyZWQgPSBnZXRfcHJlZignc21kX3VtX2hpZXJhcmNo aWNhbF9ncm91cHMnLCAkc21kX3VtX3ByZWZzWydzbWRfdW1faGllcmFyY2hpY2FsX2dyb3Vw cyddWydkZWZhdWx0J10pOw0KCSRjdXJyX3ByaXYgPSBzYWZlX2ZpZWxkKCdwcml2cycsICd0 eHBfdXNlcnMnLCAibmFtZSA9ICciIC5kb1NsYXNoKCR0eHBfdXNlcikuICInIik7DQoNCglp ZiAoc21kX3VtX3RhYmxlX2V4aXN0KFNNRF9VTV9HUk9VUFMpKSB7DQoJCSRwcm90ZWN0ZWQg PSBnZXRfcHJlZignc21kX3VtX2FkbWluX2dyb3VwJywgJHNtZF91bV9wcmVmc1snc21kX3Vt X2FkbWluX2dyb3VwJ11bJ2RlZmF1bHQnXSk7DQoJCSRncnAgPSBzYWZlX3Jvd3MoJ2lkLCBu YW1lJywgU01EX1VNX0dST1VQUywgJzE9MScpOw0KCQlmb3JlYWNoICgkZ3JwIGFzICRyb3cp IHsNCgkJCWlmICgkcHJvdGVjdGVkICYmICgkcm93WydpZCddID09ICRwcm90ZWN0ZWQpICYm ICgkY3Vycl9wcml2ICE9ICRwcm90ZWN0ZWQpICkgew0KCQkJCXVuc2V0KCRsZXZlbHNbJHJv d1snaWQnXV0pOw0KCQkJfSBlbHNlIHsNCgkJCQkkbGV2ZWxzWyRyb3dbJ2lkJ11dID0gKCgk dHlwZSkgPyBnVHh0KCRyb3dbJ25hbWUnXSkgOiAkcm93WyduYW1lJ10pOw0KCQkJfQ0KCQl9 DQoJfQ0KDQoJaWYgKCR0aWVyZWQpIHsNCgkJLy8gUmVtb3ZlIGFueSBwcml2cyBoaWdoZXIg dGhhbiB0aGUgY3VycmVudCBsb2dnZWQgaW4gdXNlcg0KCQlmb3JlYWNoICgkbGV2ZWxzIGFz ICRwcml2ID0+ICRuYW1lKSB7DQoJCQlpZiAoICgkcHJpdiA9PSAwKSB8fCAoJHByaXYgPj0g JGN1cnJfcHJpdikgKSB7DQoJCQkJJHBlcm1pdHRlZF91c2Vyc1skdHlwZV1bJHByaXZdID0g JG5hbWU7DQoJCQl9DQoJCX0NCgl9IGVsc2Ugew0KCQkkcGVybWl0dGVkX3VzZXJzWyR0eXBl XSA9ICRsZXZlbHM7DQoJfQ0KDQoJa3NvcnQoJHBlcm1pdHRlZF91c2Vyc1skdHlwZV0pOw0K DQoJcmV0dXJuICRwZXJtaXR0ZWRfdXNlcnNbJHR5cGVdOw0KfQ0KDQovLyAtLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0NCmZ1bmN0aW9uIHNtZF91bV9tdWx0aWVkaXRfZm9ybSgkcGFnZSwg JHNvcnQsICRkaXIsICRjcml0LCAkc2VhcmNoX21ldGhvZCkgew0KCSRtZXRob2RzID0gYXJy YXkoDQoJCSdjaGFuZ2Vwcml2aWxlZ2UnID0+IGdUeHQoJ2NoYW5nZXByaXZpbGVnZScpLA0K CQkncmVzZXRwYXNzd29yZCcgPT4gZ1R4dCgncmVzZXRwYXNzd29yZCcpLA0KCQknZGVsZXRl JyA9PiBnVHh0KCdkZWxldGUnKQ0KCSk7DQoNCglpZiAoc2FmZV9jb3VudCgndHhwX3VzZXJz JywgJzE9MScpIDw9IDEpIHVuc2V0KCRtZXRob2RzWydkZWxldGUnXSk7DQoNCglyZXR1cm4g ZXZlbnRfbXVsdGllZGl0X2Zvcm0oJ3NtZF91bScsICRtZXRob2RzLCAkcGFnZSwgJHNvcnQs ICRkaXIsICRjcml0LCAkc2VhcmNoX21ldGhvZCk7DQp9DQoNCi8vIC0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQ0KLy8gQ2xvbmVkIGFuZCB0d2Vha2VkIGZyb20gQWRtaW4gdGFiIDotKA0K ZnVuY3Rpb24gc21kX3VtX211bHRpX2VkaXQoKSB7DQoJZ2xvYmFsICRzbWRfdW1fZXZlbnQs ICRzbWRfdW1fcHJlZnMsICR0eHBfdXNlcjsNCg0KCXJlcXVpcmVfcHJpdnMoJHNtZF91bV9l dmVudC4nLnVzci5lZGl0Jyk7DQoNCgkkc2VsZWN0ZWQgPSBwcygnc2VsZWN0ZWQnKTsNCgkk bWV0aG9kICAgPSBwcygnZWRpdF9tZXRob2QnKTsNCgkkY2hhbmdlZCAgPSBhcnJheSgpOw0K DQoJaWYgKCEkc2VsZWN0ZWQgb3IgIWlzX2FycmF5KCRzZWxlY3RlZCkpDQoJew0KCQlyZXR1 cm4gJHNtZF91bV9ldmVudCgpOw0KCX0NCg0KCSRuYW1lcyA9IHNhZmVfY29sdW1uKCduYW1l JywgJ3R4cF91c2VycycsICJuYW1lIElOICgnIi5qb2luKCInLCciLCBkb1NsYXNoKCRzZWxl Y3RlZCkpLiInKSBBTkQgbmFtZSAhPSAnIi5kb1NsYXNoKCR0eHBfdXNlcikuIiciKTsNCg0K CWlmICghJG5hbWVzKSByZXR1cm4gJHNtZF91bV9ldmVudCgpOw0KDQoJc3dpdGNoICgkbWV0 aG9kKSB7DQoJCWNhc2UgJ2RlbGV0ZSc6DQoJCQkkYXNzaWduX2Fzc2V0cyA9IHBzKCdhc3Np Z25fYXNzZXRzJyk7DQoJCQlpZiAoJGFzc2lnbl9hc3NldHMgPT09ICcnKSB7DQoJCQkJJG1z ZyA9IGFycmF5KCdtdXN0X3JlYXNzaWduX2Fzc2V0cycsIEVfRVJST1IpOw0KCQkJfSBlbHNl aWYgKGluX2FycmF5KCRhc3NpZ25fYXNzZXRzLCAkbmFtZXMpKSB7DQoJCQkJJG1zZyA9IGFy cmF5KCdjYW5ub3RfYXNzaWduX2Fzc2V0c190b19kZWxldGVlJywgRV9FUlJPUik7DQoJCQl9 IGVsc2VpZiAoc2FmZV9kZWxldGUoJ3R4cF91c2VycycsICJuYW1lIElOICgnIi5qb2luKCIn LCciLCBkb1NsYXNoKCRuYW1lcykpLiInKSIpKSB7DQoJCQkJJGNoYW5nZWQgPSAkbmFtZXM7 DQoJCQkJJGFzc2lnbl9hc3NldHMgPSBkb1NsYXNoKCRhc3NpZ25fYXNzZXRzKTsNCgkJCQkk bmFtZXMgPSBqb2luKCInLCciLCBkb1NsYXNoKCRuYW1lcykpOw0KDQoJCQkJLy8gZGVsZXRl IHByaXZhdGUgcHJlZnMNCgkJCQlzYWZlX2RlbGV0ZSgndHhwX3ByZWZzJywgInVzZXJfbmFt ZSBJTiAoJyRuYW1lcycpIik7DQoNCgkJCQkvLyBhc3NpZ24gZGFuZ2xpbmcgYXNzZXRzIHRv IHRoZWlyIG5ldyBvd25lcg0KCQkJCSRyZWFzc2lnbiA9IGFycmF5KA0KCQkJCQkndGV4dHBh dHRlcm4nID0+ICdBdXRob3JJRCcsDQoJCQkJCSd0eHBfZmlsZScgCT0+ICdhdXRob3InLA0K CQkJCQkndHhwX2ltYWdlJyA9PiAnYXV0aG9yJywNCgkJCQkJJ3R4cF9saW5rJyAJPT4gJ2F1 dGhvcicsDQoJCQkJKTsNCgkJCQlmb3JlYWNoICgkcmVhc3NpZ24gYXMgJHRhYmxlID0+ICRj b2wpIHsNCgkJCQkJc2FmZV91cGRhdGUoJHRhYmxlLCAiJGNvbD0nJGFzc2lnbl9hc3NldHMn IiwgIiRjb2wgSU4gKCckbmFtZXMnKSIpOw0KCQkJCX0NCgkJCQkkbXNnID0gJ2F1dGhvcl9k ZWxldGVkJzsNCgkJCX0NCgkJCWJyZWFrOw0KCQljYXNlICdjaGFuZ2Vwcml2aWxlZ2UnOg0K CQkJJGxldmVscyA9IHNtZF91bV9nZXRfZ3JvdXBzKDEpOw0KCQkJJHByaXZpbGVnZSA9IHBz KCdwcml2cycpOw0KDQoJCQlpZiAoIWlzc2V0KCRsZXZlbHNbJHByaXZpbGVnZV0pKSByZXR1 cm4gJHNtZF91bV9ldmVudCgpOw0KDQoJCQlpZiAoc2FmZV91cGRhdGUoJ3R4cF91c2Vycycs ICdwcml2cyA9ICcuaW50dmFsKCRwcml2aWxlZ2UpLCAibmFtZSBJTiAoJyIuam9pbigiJywn IiwgZG9TbGFzaCgkbmFtZXMpKS4iJykiKSkgew0KCQkJCSRjaGFuZ2VkID0gJG5hbWVzOw0K CQkJCSRtc2cgPSAnYXV0aG9yX3VwZGF0ZWQnOw0KCQkJfQ0KCQkJYnJlYWs7DQoNCgkJY2Fz ZSAncmVzZXRwYXNzd29yZCc6DQoJCQkkZmFpbGVkICA9IGFycmF5KCk7DQoJCQkkcGFzc19s ZW4gPSBnZXRfcHJlZignc21kX3VtX3Bhc3NfbGVuZ3RoJywgJHNtZF91bV9wcmVmc1snc21k X3VtX3Bhc3NfbGVuZ3RoJ11bJ2RlZmF1bHQnXSk7DQoNCgkJCWZvcmVhY2ggKCRuYW1lcyBh cyAkbmFtZSkgew0KCQkJCSRwYXNzd2QgPSBnZW5lcmF0ZV9wYXNzd29yZCgkcGFzc19sZW4p Ow0KCQkJCSRoYXNoID0gZG9TbGFzaCh0eHBfaGFzaF9wYXNzd29yZCgkcGFzc3dkKSk7DQoN CgkJCQlpZiAoc2FmZV91cGRhdGUoJ3R4cF91c2VycycsICJwYXNzID0gJyRoYXNoJyIsICJu YW1lID0gJyIuZG9TbGFzaCgkbmFtZSkuIiciKSkgew0KCQkJCQkkZW1haWwgPSBzYWZlX2Zp ZWxkKCdlbWFpbCcsICd0eHBfdXNlcnMnLCAibmFtZSA9ICciLmRvU2xhc2goJG5hbWUpLiIn Iik7DQoNCgkJCQkJaWYgKHNlbmRfbmV3X3Bhc3N3b3JkKCRwYXNzd2QsICRlbWFpbCwgJG5h bWUpKSB7DQoJCQkJCQkkY2hhbmdlZFtdID0gJG5hbWU7DQoJCQkJCQkkbXNnID0gJ2F1dGhv cl91cGRhdGVkJzsNCgkJCQkJfSBlbHNlIHsNCgkJCQkJCSRtc2cgPSAoYXJyYXkoZ1R4dCgn Y291bGRfbm90X21haWwnKS4nICcuaHRtbHNwZWNpYWxjaGFycygkbmFtZSksIEVfRVJST1Ip KTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJCWJyZWFrOw0KCX0NCg0KCWlmICgkY2hhbmdl ZCkgew0KCQlyZXR1cm4gJHNtZF91bV9ldmVudChnVHh0KCRtc2csIGFycmF5KCd7bmFtZX0n ID0+IGh0bWxzcGVjaWFsY2hhcnMoam9pbignLCAnLCAkY2hhbmdlZCkpKSkpOw0KCX0NCg0K CSRzbWRfdW1fZXZlbnQoJG1zZyk7DQp9DQoNCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQ0KLy8gTW9zdGx5IGNsb25lZCBmcm9tIEFkbWluLT5Vc2VycyB0YWINCmZ1bmN0aW9uIHNt ZF91bV9jaGFuZ2VfcGFzc19mb3JtKCR1c2VyX25hbWUsICR1c2VyX2lkKSB7DQoJZ2xvYmFs ICRzbWRfdW1fZXZlbnQ7DQoJcmV0dXJuICc8ZGl2IHN0eWxlPSJtYXJnaW46IDNlbSBhdXRv IGF1dG8gYXV0bzsgdGV4dC1hbGlnbjogY2VudGVyOyI+Jy4NCglmb3JtKA0KCQl0YWcoZ1R4 dCgnY2hhbmdlX3Bhc3N3b3JkJyksICdoMycpLg0KDQoJCWdyYWYoJzxsYWJlbCBmb3I9Im5l d19wYXNzIj4nLmdUeHQoJ25ld19wYXNzd29yZCcpLic8L2xhYmVsPiAnLg0KCQkJZklucHV0 KCdwYXNzd29yZCcsICduZXdfcGFzcycsICcnLCAnZWRpdCcsICcnLCAnJywgJzIwJywgJzEn LCAnbmV3X3Bhc3MnKS4NCgkJCWNoZWNrYm94KCdtYWlsX3Bhc3N3b3JkJywgJzEnLCB0cnVl LCAnJywgJ21haWxfcGFzc3dvcmQnKS4nPGxhYmVsIGZvcj0ibWFpbF9wYXNzd29yZCI+Jy5n VHh0KCdtYWlsX2l0JykuJzwvbGFiZWw+ICcuDQoJCQloSW5wdXQoJ3VzZXJfbmFtZScsICR1 c2VyX25hbWUpLg0KCQkJaElucHV0KCd1c2VyX2lkJywgJHVzZXJfaWQpLg0KCQkJZklucHV0 KCdzdWJtaXQnLCAnY2hhbmdlX3Bhc3MnLCBnVHh0KCdzdWJtaXQnKSwgJ3NtYWxsZXJib3gn KS4NCgkJCWVJbnB1dCgkc21kX3VtX2V2ZW50KS4NCgkJCXNJbnB1dCgnc21kX3VtX2NoYW5n ZV9wYXNzJykNCgkJLCcgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiJykNCgksICcnLCAn JywgJ3Bvc3QnLCAnJywgJycsICdjaGFuZ2VfcGFzc3dvcmQnKS4nPC9kaXY+JzsNCn0NCg0K Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyBNb3N0bHkgY2xvbmVkIGZyb20gQWRt aW4tPlVzZXJzIHRhYg0KZnVuY3Rpb24gc21kX3VtX2NoYW5nZV9wYXNzKCkgew0KCWdsb2Jh bCAkdHhwX3VzZXI7DQoNCglleHRyYWN0KHBzYShhcnJheSgnbmV3X3Bhc3MnLCAnbWFpbF9w YXNzd29yZCcsICd1c2VyX25hbWUnLCAndXNlcl9pZCcpKSk7DQoNCglpZiAoZW1wdHkoJG5l d19wYXNzKSkgew0KCQlzbWRfdW1fZWRpdChhcnJheShnVHh0KCdwYXNzd29yZF9yZXF1aXJl ZCcpLCBFX0VSUk9SKSk7DQoJCXJldHVybjsNCgl9DQoNCglpZiAoZW1wdHkoJHVzZXJfbmFt ZSkpICR1c2VyX25hbWUgPSAkdHhwX3VzZXI7DQoJJGhhc2ggPSBkb1NsYXNoKHR4cF9oYXNo X3Bhc3N3b3JkKCRuZXdfcGFzcykpOw0KCSR1c2VyX2lkID0gYXNzZXJ0X2ludCgkdXNlcl9p ZCk7DQoJJHJzID0gc2FmZV91cGRhdGUoJ3R4cF91c2VycycsICJwYXNzID0gJyRoYXNoJyIs ICJ1c2VyX2lkID0gJHVzZXJfaWQiKTsNCg0KCWlmICgkcnMpIHsNCgkJJG1zZyA9IGdUeHQo J3Bhc3N3b3JkX2NoYW5nZWQnKTsNCg0KCQlpZiAoJG1haWxfcGFzc3dvcmQpIHsNCgkJCSRl bWFpbCA9IGZldGNoKCdlbWFpbCcsICd0eHBfdXNlcnMnLCAndXNlcl9pZCcsICR1c2VyX2lk KTsNCgkJCXNlbmRfbmV3X3Bhc3N3b3JkKCRuZXdfcGFzcywgJGVtYWlsLCAkdXNlcl9uYW1l KTsNCgkJCSRtc2cgLj0gc3AuZ1R4dCgnYW5kX21haWxlZF90bycpLnNwLiRlbWFpbDsNCgkJ fSBlbHNlIHsNCgkJCWVjaG8gY29tbWVudChteXNxbF9lcnJvcigpKTsNCgkJfQ0KDQoJCSRt c2cgLj0gJy4nOw0KCX0gZWxzZSB7DQoJCSRtc2cgPSBhcnJheShnVHh0KCdzbWRfdW1fcGFz c19jaGFuZ2VfZXJyb3InKSwgRV9FUlJPUik7DQoJfQ0KCXNtZF91bV9lZGl0KCRtc2cpOw0K fQ0KDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCmZ1bmN0aW9uIHNtZF91bV9zYXZl X3BhbmVfc3RhdGUoKSB7DQoJZ2xvYmFsICRzbWRfdW1fZXZlbnQ7DQoNCgkkcGFuZSA9IHN0 cl9yZXBsYWNlKCdzbWRfdW1fcHJpdl8nLCAnJywgZ3BzKCdwYW5lJykpOw0KCSRjdXJyID0g ZG9fbGlzdChnZXRfcHJlZigncGFuZV9zbWRfdW1fcHJpdl92aXNpYmxlJykpOw0KCSR2aXNp YmxlID0gZ3BzKCd2aXNpYmxlJyk7DQoJaWYgKCR2aXNpYmxlID09ICd0cnVlJykgew0KCQkk Y3VycltdID0gJHBhbmU7DQoJfSBlbHNlIHsNCgkJJHBvcyA9IGFycmF5X3NlYXJjaCgkcGFu ZSwgJGN1cnIpOw0KCQlpZiAoJHBvcyAhPT0gZmFsc2UpIHsNCgkJCXVuc2V0KCRjdXJyWyRw b3NdKTsNCgkJfQ0KCX0NCg0KCSRjdXJyID0gYXJyYXlfdW5pcXVlKCRjdXJyKTsNCg0KCXNl dF9wcmVmKCJwYW5lX3NtZF91bV9wcml2X3Zpc2libGUiLCAoam9pbignLCcsICRjdXJyKSks ICRzbWRfdW1fZXZlbnQsIFBSRUZfSElEREVOLCAndGV4dF9pbnB1dCcsIDAsIFBSRUZfUFJJ VkFURSk7DQoJc2VuZF94bWxfcmVzcG9uc2UoKTsNCn0NCg0KLy8gLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tDQovLyBBZGQgZ3JvdXAvcHJpdiB0YWJsZXMgaWYgbm90IGFscmVhZHkgaW5z dGFsbGVkDQpmdW5jdGlvbiBzbWRfdW1fdGFibGVfaW5zdGFsbCgkc2hvd3BhbmU9JzEnKSB7 DQoJZ2xvYmFsICRzbWRfdW1fZXZlbnQsICR0eHBfZ3JvdXBzLCAkdHhwX3Blcm1pc3Npb25z Ow0KDQoJJEdMT0JBTFNbJ3R4cF9lcnJfY291bnQnXSA9IDA7DQoJJHJldCA9ICcnOw0KCSRz cWwgPSBhcnJheSgpOw0KDQoJLy8gSW4gdHJ1dGgsIHRoaXMgdGFibGUgc2hvdWxkIGJlIG5v cm1hbGlzZWQgZnVydGhlciwgYnV0IGZvciB0aGUgc2FrZQ0KCS8vIG9mIG9uZSByb3cgcGVy IHByaXYgbGV2ZWwgcGVyIGFyZWEsIGl0J3MgcXVpY2tlciB0aGFuIGEgam9pbiwgYW5kDQoJ Ly8gdXNpbmcgR1JPVVBfQ09OQ0FUKCkgZ2V0cyB0aGUgcHJpdiB0YWJsZSBhcyBpbiBhZG1p bi5jb25maWcucGhwDQoJJHNxbFtdID0gIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIGAi LlBGWC5TTURfVU1fUFJJVlMuImAgKA0KCQlgYXJlYWAgdmFyY2hhcigxMjcpIE5PVCBOVUxM IGRlZmF1bHQgJycsDQoJCWBwcml2YCBzbWFsbGludCBOT1QgTlVMTCBkZWZhdWx0IDAsDQoJ CVBSSU1BUlkgS0VZIChgYXJlYWAsYHByaXZgKQ0KCSkgRU5HSU5FPU15SVNBTSI7DQoNCgkv LyBpZCBpcyBOT1QgYW4gYXV0b19pbmNyZW1lbnQgY29sdW1tbiBiZWNhdXNlIGF1dG9pbmMg ZG9lc24ndCBhbGxvdyBhIDAgZW50cnksIHdoaWNoIHdlIG5lZWQgZm9yICdOb25lJw0KCSRz cWxbXSA9ICJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBgIi5QRlguU01EX1VNX0dST1VQ Uy4iYCAoDQoJCWBpZGAgc21hbGxpbnQoNCkgTk9UIE5VTEwgZGVmYXVsdCAwLA0KCQlgbmFt ZWAgdmFyY2hhcig2NCkgTk9UIE5VTEwgZGVmYXVsdCAnJywNCgkJYGNvcmVgIGJvb2wgTk9U IE5VTEwgZGVmYXVsdCAwLA0KCQlQUklNQVJZIEtFWSAoYGlkYCkNCgkpIEVOR0lORT1NeUlT QU0gUEFDS19LRVlTPTEiOw0KDQoJLy8gSGFuZGxlIHVwZ3JhZGVzOiBiZSBraW5kIHRvIGJl dGEgdGVzdGVycw0KCWlmIChzbWRfdW1fdGFibGVfZXhpc3QoU01EX1VNX1BSSVZTKSkgew0K CQkkZmxkcyA9IGdldFRoaW5ncygnU0hPVyBDT0xVTU5TIEZST00gYCcuUEZYLlNNRF9VTV9Q UklWUy4nYCcpOw0KCQlpZiAoaW5fYXJyYXkoJ2NvcmUnLCRmbGRzKSkgew0KCQkJJHNxbFtd ID0gIkFMVEVSIFRBQkxFIGAiLlBGWC5TTURfVU1fUFJJVlMuImAgRFJPUCBgY29yZWAiOw0K CQl9DQoJfQ0KDQoJLy8gQXBwZW5kIGluaXRpYWwgdmFsdWUgcG9wdWxhdGlvbiB0byBxdWVy eSBzdGFjayBpZiB0aGlzIGlzIGEgbmV3IGluc3RhbGwNCglpZiAoIXNtZF91bV90YWJsZV9l eGlzdChTTURfVU1fR1JPVVBTKSkgew0KCQlmb3JlYWNoICgkdHhwX2dyb3VwcyBhcyAkaWQg PT4gJG5hbWUpIHsNCgkJCSRzcWxbXSA9ICJJTlNFUlQgSU5UTyBgIi5QRlguU01EX1VNX0dS T1VQUy4iYCBWQUxVRVMgKCckaWQnLCAnJG5hbWUnLCAxKSI7DQoJCX0NCgl9DQoJaWYgKCFz bWRfdW1fdGFibGVfZXhpc3QoU01EX1VNX1BSSVZTKSkgew0KCQlmb3JlYWNoICgkdHhwX3Bl cm1pc3Npb25zIGFzICRhcmVhID0+ICRwcml2cykgew0KCQkJJHByaXZfbGlzdCA9IGRvX2xp c3QoJHByaXZzKTsNCgkJCWZvcmVhY2ggKCRwcml2X2xpc3QgYXMgJHByaXYpIHsNCgkJCQkk c3FsW10gPSAiSU5TRVJUIElOVE8gYCIuUEZYLlNNRF9VTV9QUklWUy4iYCBWQUxVRVMgKCck YXJlYScsICckcHJpdicpIjsNCgkJCX0NCgkJfQ0KCX0NCg0KCWlmKGdwcygnZGVidWcnKSkg ew0KCQlkbXAoJHNxbCk7DQoJfQ0KCWZvcmVhY2ggKCRzcWwgYXMgJHFyeSkgew0KCQkkcmV0 ID0gc2FmZV9xdWVyeSgkcXJ5KTsNCgkJaWYgKCRyZXQ9PT1mYWxzZSkgew0KCQkJJEdMT0JB TFNbJ3R4cF9lcnJfY291bnQnXSsrOw0KCQkJZWNobyAiPGI+Ii4kR0xPQkFMU1sndHhwX2Vy cl9jb3VudCddLiIuPC9iPiAiLm15c3FsX2Vycm9yKCkuIjxiciAvPlxuIjsNCgkJCWVjaG8g IjwhLS1cbiAkcXJ5IFxuLS0+XG4iOw0KCQl9DQoJfQ0KDQoJLy8gU3BpdCBvdXQgcmVzdWx0 cw0KCWlmICgkR0xPQkFMU1sndHhwX2Vycl9jb3VudCddID09IDApIHsNCgkJaWYgKCRzaG93 cGFuZSkgew0KCQkJJG1zZyA9IHNtZF91bV9nVHh0KCdzbWRfdW1fdGJsX2luc3RhbGxlZCcp Ow0KCQkJJHNtZF91bV9ldmVudCgkbXNnKTsNCgkJfQ0KCX0gZWxzZSB7DQoJCWlmICgkc2hv d3BhbmUpIHsNCgkJCSRtc2cgPSBzbWRfdW1fZ1R4dCgnc21kX3VtX3RibF9ub3RfaW5zdGFs bGVkJyk7DQoJCQkkc21kX3VtX2V2ZW50KCRtc2cpOw0KCQl9DQoJfQ0KfQ0KDQovLyAtLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vIERyb3AgdGFibGUgaWYgaW4gZGF0YWJhc2UNCmZ1 bmN0aW9uIHNtZF91bV90YWJsZV9yZW1vdmUoKSB7DQoJZ2xvYmFsICRzbWRfdW1fZXZlbnQ7 DQoNCgkkcmV0ID0gJyc7DQoJJHNxbCA9IGFycmF5KCk7DQoJJEdMT0JBTFNbJ3R4cF9lcnJf Y291bnQnXSA9IDA7DQoJaWYgKHNtZF91bV90YWJsZV9leGlzdCgpKSB7DQoJCSRzcWxbXSA9 ICJEUk9QIFRBQkxFIElGIEVYSVNUUyAiIC5QRlguU01EX1VNX1BSSVZTLiAiOyAiOw0KCQkk c3FsW10gPSAiRFJPUCBUQUJMRSBJRiBFWElTVFMgIiAuUEZYLlNNRF9VTV9HUk9VUFMuICI7 ICI7DQoJCWlmKGdwcygnZGVidWcnKSkgew0KCQkJZG1wKCRzcWwpOw0KCQl9DQoJCWZvcmVh Y2ggKCRzcWwgYXMgJHFyeSkgew0KCQkJJHJldCA9IHNhZmVfcXVlcnkoJHFyeSk7DQoJCQlp ZiAoJHJldD09PWZhbHNlKSB7DQoJCQkJJEdMT0JBTFNbJ3R4cF9lcnJfY291bnQnXSsrOw0K CQkJCWVjaG8gIjxiPiIuJEdMT0JBTFNbJ3R4cF9lcnJfY291bnQnXS4iLjwvYj4gIi5teXNx bF9lcnJvcigpLiI8YnIgLz5cbiI7DQoJCQkJZWNobyAiPCEtLVxuICRxcnkgXG4tLT5cbiI7 DQoJCQl9DQoJCX0NCgl9DQoJaWYgKCRHTE9CQUxTWyd0eHBfZXJyX2NvdW50J10gPT0gMCkg ew0KCQkkbXNnID0gc21kX3VtX2dUeHQoJ3NtZF91bV90YmxfcmVtb3ZlZCcpOw0KCX0gZWxz ZSB7DQoJCSRtc2cgPSBzbWRfdW1fZ1R4dCgnc21kX3VtX3RibF9ub3RfcmVtb3ZlZCcpOw0K CQkkc21kX3VtX2V2ZW50KCRtc2cpOw0KCX0NCn0NCg0KLy8gLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tDQpmdW5jdGlvbiBzbWRfdW1fdGFibGVfZXhpc3QoJHdoaWNoPScnKSB7DQoJc3Rh dGljICRzbWRfdW1faW5zdGFsbGVkID0gYXJyYXkoKTsNCg0KCS8vIFRoZSBudW1iZXIgb2Yg ZXhwZWN0ZWQgY29scyBpbiBlYWNoIHRhYmxlDQoJJHRibHMgPSBhcnJheSgNCgkJU01EX1VN X0dST1VQUyA9PiAzLA0KCQlTTURfVU1fUFJJVlMgPT4gMiwNCgkpOw0KDQoJaWYgKCR3aGlj aCAmJiBhcnJheV9rZXlfZXhpc3RzKCR3aGljaCwgJHRibHMpICYmIGlzc2V0KCRzbWRfdW1f aW5zdGFsbGVkWyR3aGljaF0pKSB7DQoJCXJldHVybiAoJHNtZF91bV9pbnN0YWxsZWRbJHdo aWNoXSA9PSAkdGJsc1skd2hpY2hdKTsNCgl9DQoNCglpZiAoJHdoaWNoID09ICcxJykgew0K CQkkb3V0ID0gY291bnQoJHRibHMpOw0KCQlmb3JlYWNoICgkdGJscyBhcyAkdGJsID0+ICRj b2xzKSB7DQoJCQkkbnVtID0gY291bnQoQHNhZmVfc2hvdygnY29sdW1ucycsICR0YmwpKTsN CgkJCSRzbWRfdW1faW5zdGFsbGVkWyR0YmxdID0gJG51bTsNCgkJCSRvdXQgLT0gKCR0Ymxz WyR0YmxdID09ICRudW0pID8gMSA6IDA7DQoJCX0NCgkJcmV0dXJuICgkb3V0PT09MCkgPyAx IDogMDsNCgl9IGVsc2UgaWYgKGFycmF5X2tleV9leGlzdHMoJHdoaWNoLCAkdGJscykpIHsN CgkJJG51bSA9IGNvdW50KEBzYWZlX3Nob3coJ2NvbHVtbnMnLCAkd2hpY2gpKTsNCgkJJHNt ZF91bV9pbnN0YWxsZWRbJHdoaWNoXSA9ICRudW07DQoJCXJldHVybiAoJHNtZF91bV9pbnN0 YWxsZWRbJHdoaWNoXSA9PSAkdGJsc1skd2hpY2hdKTsNCgl9DQoNCglyZXR1cm4gZmFsc2U7 DQp9DQoNCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KZnVuY3Rpb24gc21kX3VtX2dU eHQoJHdoYXQsICRhdHRzID0gYXJyYXkoKSkgew0KCSRsYW5nID0gYXJyYXkoDQoJCSdlbi1n YicgPT4gYXJyYXkoDQoJCQknc21kX3VtX2FjdGl2ZScgPT4gJ1VzZXJzIGN1cnJlbnRseSBh Y3RpdmU6ICcsDQoJCQknc21kX3VtX2FjdGl2ZV90aW1lb3V0JyA9PiAnQWN0aXZpdHkgdGlt ZW91dCAoc2Vjb25kcyknLA0KCQkJJ3NtZF91bV9hZG1pbl9ncm91cCcgPT4gJ1Byb3RlY3Rl ZCBhZG1pbmlzdHJhdG9yIGdyb3VwOiAnLA0KCQkJJ3NtZF91bV9hcnRpY2xlX2NvdW50JyA9 PiAnQXJ0aWNsZXMnLA0KCQkJJ3NtZF91bV9hc3NpZ25fdG9fZ3JvdXAnID0+ICdBc3NpZ24g dG8gZ3JvdXAnLA0KCQkJJ3NtZF91bV9iYXNlZF9vbicgPT4gJ2Jhc2VkIG9uJywNCgkJCSdz bWRfdW1faW1hZ2VfY291bnQnID0+ICdJbWFnZXMnLA0KCQkJJ3NtZF91bV9maWxlX2NvdW50 JyA9PiAnRmlsZXMnLA0KCQkJJ3NtZF91bV9saW5rX2NvdW50JyA9PiAnTGlua3MnLA0KCQkJ J3NtZF91bV90YWJfbmFtZScgPT4gJ1VzZXIgbWFuYWdlcicsDQoJCQknc21kX3VtX2dycF9h ZmZlY3RlZCcgPT4gJy4gVXNlcnMgYWZmZWN0ZWQ6IHtudW19JywNCgkJCSdzbWRfdW1fZ3Jw X2NyZWF0ZWQnID0+ICdHcm91cCAie25hbWV9IiBjcmVhdGVkJywNCgkJCSdzbWRfdW1fZ3Jw X2RlbGV0ZWQnID0+ICdHcm91cCBkZWxldGVkJywNCgkJCSdzbWRfdW1fZ3JwX2V4aXN0cycg PT4gJ0dyb3VwIGFscmVhZHkgZXhpc3RzIGFzIHByaXYgSUQge2lkfScsDQoJCQknc21kX3Vt X2dycF9sYmwnID0+ICdHcm91cHMnLA0KCQkJJ3NtZF91bV9ncnBfbmV3JyA9PiAnTmV3IGdy b3VwIHRpdGxlJywNCgkJCSdzbWRfdW1fZ3JwX25ld19uYW1lJyA9PiAnbmFtZScsDQoJCQkn c21kX3VtX2dycF9zYXZlZCcgPT4gJ0dyb3VwIGluZm8gdXBkYXRlZCcsDQoJCQknc21kX3Vt X2hpZXJhcmNoaWNhbF9ncm91cHMnID0+ICdBc3N1bWUgaGllcmFyY2hpY2FsIGdyb3VwcyAo bGV2ZWxzKScsDQoJCQknc21kX3VtX21heF9zZWFyY2hfbGltaXQnID0+ICdNYXhpbXVtIHVz ZXIgc2VhcmNoIHJlc3VsdCBsaW1pdCcsDQoJCQknc21kX3VtX25hbWVfcmVxdWlyZWQnID0+ ICdBIG5hbWUgaXMgcmVxdWlyZWQnLA0KCQkJJ3NtZF91bV9uZXdfdXNlcicgPT4gJ05ldyB1 c2VyJywNCgkJCSdzbWRfdW1fcGFzc19jaGFuZ2VfZXJyb3InID0+ICdQYXNzd29yZCBOT1Qg c2F2ZWQnLA0KCQkJJ3NtZF91bV9wYXNzX2xlbmd0aCcgPT4gJ1Bhc3N3b3JkIGxlbmd0aCAo Y2hhcmFjdGVycyknLA0KCQkJJ3NtZF91bV9wcmZfbGJsJyA9PiAnUHJlZnMnLA0KCQkJJ3Nt ZF91bV9wcmZfbGVnZW5kJyA9PiAnVXNlciBNYW5hZ2VyIFByZWZlcmVuY2VzJywNCgkJCSdz bWRfdW1fcHJmX3NhdmVkJyA9PiAnUHJlZmVyZW5jZXMgc2F2ZWQnLA0KCQkJJ3NtZF91bV9w cnZfY3JlYXRlZCcgPT4gJ1ByaXYgYXJlYSAie2FyZWF9IiBjcmVhdGVkJywNCgkJCSdzbWRf dW1fcHJ2X2RlbGV0ZWQnID0+ICdQcml2IGFyZWEgZGVsZXRlZCcsDQoJCQknc21kX3VtX3By dl9leGlzdHMnID0+ICdQcml2IGFyZWEgYWxyZWFkeSBleGlzdCcsDQoJCQknc21kX3VtX3By dl9sYmwnID0+ICdQcml2cycsDQoJCQknc21kX3VtX3Bydl9uZXcnID0+ICdOZXcgcHJpdiBh cmVhJywNCgkJCSdzbWRfdW1fcHJ2X3NhdmVkJyA9PiAnUHJpdnMgdXBkYXRlZCcsDQoJCQkn c21kX3VtX3Bydl9zbWRfdW0nID0+ICdDYW5ub3QgY3JlYXRlIHByaXZzIGZvciBzbWRfdXNl cl9tYW5hZ2VyJywNCgkJCSdzbWRfdW1fcmVzZXQnID0+ICdbUl0nLA0KCQkJJ3NtZF91bV9z ZWxfYWxsJyA9PiAnU2VsZWN0IHRoZSBlbnRpcmUgYXJlYSB0aGVuIChjKWhlY2ssICh1KW5j aGVjayBvciAodClvZ2dsZSBoaWdobGlnaHRlZCBjaGVja2JveGVzJywNCgkJCSdzbWRfdW1f c2VsX2dycCcgPT4gJ1NlbGVjdCB0aGlzIGdyb3VwIHRoZW4gKGMpaGVjaywgKHUpbmNoZWNr IG9yICh0KW9nZ2xlIGhpZ2hsaWdodGVkIGNoZWNrYm94ZXMnLA0KCQkJJ3NtZF91bV9zZWxf cHJ2JyA9PiAnU2VsZWN0IHRoaXMgYXJlYSBzZXQgdGhlbiAoYyloZWNrLCAodSluY2hlY2sg b3IgKHQpb2dnbGUgaGlnaGxpZ2h0ZWQgY2hlY2tib3hlcycsDQoJCQknc21kX3VtX3NlbF9y ZXNldCcgPT4gJ1Jlc2V0OiBhbnkgY2hlY2tlZCBhcmVhIHNldHMgd2lsbCByZXZlcnQgdG8g dGhlaXIgZGVmYXVsdHMgYWZ0ZXIgU2F2ZScsDQoJCQknc21kX3VtX3RibF9yZW1vdmVfbGJs JyA9PiAnUmVtb3ZlJywNCgkJCSdzbWRfdW1fdGJsX2luc3RhbGxfbGJsJyA9PiAnSW5zdGFs bCcsDQoJCQknc21kX3VtX3RibF9pbnN0YWxsZWQnID0+ICdUYWJsZXMgaW5zdGFsbGVkJywN CgkJCSdzbWRfdW1fdGJsX25vdF9pbnN0YWxsZWQnID0+ICdUYWJsZXMgbm90IGluc3RhbGxl ZCcsDQoJCQknc21kX3VtX3RibF9yZW1vdmVkJyA9PiAnVGFibGVzIHJlbW92ZWQnLA0KCQkJ J3NtZF91bV90Ymxfbm90X3JlbW92ZWQnID0+ICdUYWJsZXMgbm90IHJlbW92ZWQnLA0KCQkJ J3NtZF91bV91c2VyX2NvdW50JyA9PiAnVXNlcnMgaW4gdGhpcyBncm91cDogJywNCgkJCSdz bWRfdW1fdXNyX2xibCcgPT4gJ1VzZXJzJywNCgkJKSwNCgkpOw0KDQoJJHRoaXNsYW5nID0g Z2V0X3ByZWYoJ2xhbmd1YWdlJywgJ2VuLWdiJyk7DQoJJHRoaXNsYW5nID0gKGlzc2V0KCRs YW5nWyR0aGlzbGFuZ11bJHdoYXRdKSkgPyAkdGhpc2xhbmcgOiAnZW4tZ2InOw0KCXJldHVy biBzdHJ0cigkbGFuZ1skdGhpc2xhbmddWyR3aGF0XSwgJGF0dHMpOw0KfSI7czo0OiJ0eXBl IjtzOjE6IjMiO3M6NToib3JkZXIiO3M6MToiOSI7czo1OiJmbGFncyI7czoxOiIyIjtzOjQ6 ImhlbHAiO3M6MTcyMzQ6IjxkaXYgaWQ9InNtZF9oZWxwIj4KCgk8aDE+c21kX3VzZXJfbWFu YWdlcjwvaDE+CgoJPHA+Q29tcGxldGUgdXNlciAvIGdyb3VwIC8gcHJpdnMgbWFuYWdlbWVu dC4gRmVhdHVyZXM6PC9wPgoKCTx1bD4KCQk8bGk+UmVwbGFjZXMgPGVtPkFkbWluLSZndDtV c2VyczwvZW0+IHRhYjwvbGk+CgkJPGxpPkFkZCAvIGVkaXQgLyBsaXN0IHVzZXJzLCB3aXRo IGNvbnRlbnQgY291bnRzIGFsb25nc2lkZSBlYWNoIHVzZXI8L2xpPgoJCTxsaT5TZWFyY2gs IHNvcnQsIG9yIGZpbHRlciB0aGUgdXNlcnMgKHN0YW5kYXJkIDxzcGFuIGNsYXNzPSJjYXBz Ij5UWFA8L3NwYW4+IHBhZ2luYXRpb24gcmVzdWx0IGRlcHRocyBhcHBseSk8L2xpPgoJCTxs aT5RdWlja2x5IGZpbmQgYWNjb3VudHMgd2l0aCBjZXJ0YWluIGNoYXJhY3RlcmlzdGljcyAo ZS5nLiBzZWxmLXJlZ2lzdGVyZWQgc3BhbSBhY2NvdW50cyB3aXRoIDAgYXJ0aWNsZXMpPC9s aT4KCQk8bGk+UGVyZm9ybSBtdWx0aS1lZGl0czogY2hhbmdlIHByaXZpbGVnZSAvIHJlc2V0 IHBhc3MgLyBkZWxldGU8L2xpPgoJCTxsaT5BbGwgdXNlcnMgY2FuIGVkaXQgdGhlaXIgb3du IGRldGFpbHMgYW5kIGNoYW5nZSB0aGVpciBwYXNzd29yZDwvbGk+CgkJPGxpPkNyZWF0ZSBu ZXcgdXNlciBncm91cHMgKGEuay5hLiByb2xlcykgaWYgdGhlIGRlZmF1bHQgc2l4IGFyZW4m IzgyMTc7dCBlbm91Z2g8L2xpPgoJCTxsaT5SZW5hbWUgZXhpc3RpbmcgZ3JvdXBzIHRvIG1v cmUgc3VpdGFibGUgbmFtZXMgKHlvdSBjYW5ub3QgZGVsZXRlIHRoZW0pPC9saT4KCQk8bGk+ TW9kaWZ5IDxzcGFuIGNsYXNzPSJjYXBzIj5UWFA8L3NwYW4+JiM4MjE3O3Mgc3RhbmRhcmQg cHJpdiBhcmVhcyB0byBhbHRlciB3aGF0IGVhY2ggdXNlciBncm91cCBjYW4gc2VlL2RvPC9s aT4KCQk8bGk+QWRkIG5ldyBwcml2IGFyZWFzICh1c2VmdWwgZm9yIGN1c3RvbSBjb2RlIHRv IHNhdmUgZG9pbmcgaXQgaW4gYSBwbHVnaW4pPC9saT4KCQk8bGk+QSAmIzgyMjA7d2hvJiM4 MjE3O3Mgb25saW5lJiM4MjIxOyBpbmRpY2F0b3I8L2xpPgoJCTxsaT5JbnRlZ3JhdGVzIHdp dGggc21kX2JpbyAodjAuNDArKSBhbmQgc21kX3Byb2dub3N0aWNzICh2MC4yMCspPC9saT4K CTwvdWw+CgoJPGgyPkF1dGhvciAvIGNyZWRpdHM8L2gyPgoKCTxwPldyaXR0ZW4gYnkgPGEg aHJlZj0iaHR0cDovL3N0ZWZkYXdzb24uY29tL2NvbnRhY3QiPlN0ZWYgRGF3c29uPC9hPi4g VGhhbmtzIHRvIHRoZSBiZXRhIHRlc3QgdGVhbSBqYWtvYiwgbXJkYWxlLCBhbGFuZmx1ZmYs IG1hdmVyaWNrLCBEZXN0cnksIHJlZGJvdCwgYW5kIHJzaWxsZXR0aSBmb3IgdGhlaXIgd2ls bGluZ25lc3MgdG8gbGV0IG15IGNvZGUgbG9vc2Ugb24gdGhlaXIgc2VydmVycy48L3A+CgoJ PGgyPkluc3RhbGxhdGlvbiAvIHVuaW5zdGFsbGF0aW9uPC9oMj4KCgk8cCBjbGFzcz0iaW1w b3J0YW50Ij5SZXF1aXJlcyA8c3BhbiBjbGFzcz0iY2FwcyI+VFhQPC9zcGFuPiA0LjQuMSs8 L3A+CgoJPHA+RG93bmxvYWQgdGhlIHBsdWdpbiBmcm9tIGVpdGhlciA8YSBocmVmPSJodHRw Oi8vdGV4dHBhdHRlcm4ub3JnL3BsdWdpbnMvMTIyOS9zbWRfdXNlcl9tYW5hZ2VyIj50ZXh0 cGF0dGVybi5vcmc8L2E+LCBvciB0aGUgPGEgaHJlZj0iaHR0cDovL3N0ZWZkYXdzb24uY29t L3N3Ij5zb2Z0d2FyZSBwYWdlPC9hPiwgcGFzdGUgdGhlIGNvZGUgaW50byB0aGUgPHNwYW4g Y2xhc3M9ImNhcHMiPlRYUDwvc3Bhbj4gPGVtPkFkbWluLSZndDtQbHVnaW5zPC9lbT4gcGFu ZSwgaW5zdGFsbCBhbmQgZW5hYmxlIHRoZSBwbHVnaW4uIFRoZSB0YWJsZXMgd2lsbCBiZSBp bnN0YWxsZWQgYW5kIHBvcHVsYXRlZCBhdXRvbWF0aWNhbGx5IHVubGVzcyB5b3UgdXNlIHRo ZSBwbHVnaW4gZnJvbSB0aGUgY2FjaGUgZGlyZWN0b3J5OyBpbiBlaXRoZXIgY2FzZSwgdmlz aXRpbmcgdGhlIDxlbT5BZG1pbi0mZ3Q7VXNlciBtYW5hZ2VyPC9lbT4gdGFiIHdpbGwgaW5z dGFsbCBhbmQgcG9wdWxhdGUgdGhlbS48L3A+CgoJPHA+VG8gdW5pbnN0YWxsIHRoZSBwbHVn aW4sIGZpcnN0IGFzc2lnbiBhbGwgeW91ciB1c2VycyB0byBncm91cHMgaW4gPHNwYW4gY2xh c3M9ImNhcHMiPlRYUDwvc3Bhbj4mIzgyMTc7cyBmaXJzdCBzaXgsIHRoZW4gZGVsZXRlIHRo ZSBwbHVnaW4gZnJvbSB0aGUgPGVtPkFkbWluLSZndDtQbHVnaW5zPC9lbT4gcGFnZS4gVGhl IHRhYmxlcyB3aWxsIGJlIGRlbGV0ZWQgYXV0b21hdGljYWxseS4gSWYgeW91IGRvIG5vdCBy ZWFzc2lnbiB1c2VycyB0byB0aG9zZSBkZWZhdWx0IGdyb3VwcywgeW91IG1heSBoYXZlIHVz ZXJzIHdpdGggJiM4MjE2O2RhbmdsaW5nJiM4MjE3OyAoaS5lLiBubykgcHJpdnMuIFRoZSBv dXRjb21lIG9mIHdoYXQgaGFwcGVucyB3aGVuIHN1Y2ggdXNlcnMgbG9nIGluIGlzIHRodXMg dW5kZWZpbmVkLjwvcD4KCgk8cD5WaXNpdCB0aGUgPGEgaHJlZj0iaHR0cDovL2ZvcnVtLnRl eHRwYXR0ZXJuLmNvbS92aWV3dG9waWMucGhwP2lkPTM2NTU4Ij5mb3J1bSB0aHJlYWQ8L2E+ IGZvciBtb3JlIGluZm8gb3IgdG8gcmVwb3J0IG9uIHRoZSBzdWNjZXNzIG9yIG90aGVyd2lz ZSBvZiB0aGUgcGx1Z2luLjwvcD4KCgk8aDI+T3ZlcnZpZXc8L2gyPgoKCTxwPlZpc2l0IHRo ZSA8ZW0+QWRtaW4tJmd0O1VzZXIgbWFuYWdlcjwvZW0+IHRhYi4gVGhlIGRlZmF1bHQgdmll dyAoZm9yIGFkbWlucykgaXMgYSBsaXN0IG9mIHVzZXJzLiBUaGVyZSBhcmUgYnV0dG9ucyB0 b3dhcmRzIHRoZSB0b3AgcmlnaHQtaGFuZCBhcmVhIG9mIHRoZSBzY3JlZW46IDxhIGhyZWY9 IiNzbWRfdW1fdXNlcnMiPlVzZXJzPC9hPiwgPGEgaHJlZj0iI3NtZF91bV9ncm91cHMiPkdy b3VwczwvYT4sIDxhIGhyZWY9IiNzbWRfdW1fcHJpdnMiPlByaXZzPC9hPiwgYW5kIDxhIGhy ZWY9IiNzbWRfdW1fcHJlZnMiPlByZWZzPC9hPi4gRWFjaCBvZiB0aG9zZSBkaXNwbGF5cyBh biBhcmVhIGZvciB0aGUgbWFuYWdlbWVudCBvZiB0aGF0IGNvbXBvbmVudC48L3A+CgoJPHA+ UGxlYXNlIG5vdGU6IFRoZSBwbHVnaW4gdHJpZXMgdG8gcmVtb3ZlIHRoZSA8ZW0+QWRtaW4t Jmd0O1VzZXJzPC9lbT4gbWVudSwgYnV0IGRlcGVuZGluZyBvbiB5b3VyIGluc3RhbGxlZCB0 aGVtZSB0aGlzIG1heSBub3QgYmUgcG9zc2libGUuIElmIHRoZSBtZW51IGl0ZW0gcmVtYWlu cywgaXQgd2lsbCBwZXJmb3JtIHRoZSBzYW1lIGZ1bmN0aW9uIGFzIGNsaWNraW5nIHRoZSA8 ZW0+VXNlciBtYW5hZ2VyPC9lbT4gdGFiLjwvcD4KCgk8aDIgaWQ9InNtZF91bV91c2VycyI+ VXNlciBtYW5hZ2VtZW50ICg8ZW0+VXNlcnM8L2VtPiBidXR0b24pPC9oMj4KCgk8cD5WaWV3 IC8gc2VhcmNoIHRoZSBpbnN0YWxsZWQgdXNlciBiYXNlLiBDaGFuZ2UgdGhlIG51bWJlciBv ZiB1c2VycyB5b3Ugd2lzaCB0byBzZWUgcGVyIHBhZ2UgYnkgdXNpbmcgdGhlICYjODIxNjtw ZXIgcGFnZSYjODIxNzsgZHJvcGRvd24gYmVsb3cgdGhlIGxpc3QuIFRoZSBjb2x1bW5zIG9u IGRpc3BsYXkgYXJlOjwvcD4KCgk8dWw+CgkJPGxpPkxvZ2luICYjODIxMjsgdXNlciBuYW1l PC9saT4KCQk8bGk+UmVhbCBOYW1lICYjODIxMjsgZnVsbCBuYW1lPC9saT4KCQk8bGk+RS1t YWlsICYjODIxMjsgZS1tYWlsIGFkZHJlc3M8L2xpPgoJCTxsaT5Qcml2aWxlZ2VzICYjODIx MjsgdXNlciBncm91cDwvbGk+CgkJPGxpPkxhc3QgTG9naW4gJiM4MjEyOyBtb250aCAmYW1w OyB5ZWFyIG9mIGxhc3QgYWNjZXNzIHRvIHRoZSBUZXh0cGF0dGVybiBhZG1pbiBzaWRlPC9s aT4KCQk8bGk+QXJ0aWNsZXMgJiM4MjEyOyBudW1iZXIgb2YgYXJ0aWNsZXMgYXV0aG9yZWQg YnkgdGhpcyB1c2VyPC9saT4KCQk8bGk+SW1hZ2VzICYjODIxMjsgbnVtYmVyIG9mIGltYWdl cyB1cGxvYWRlZCBieSB0aGlzIHVzZXI8L2xpPgoJCTxsaT5GaWxlcyAmIzgyMTI7IG51bWJl ciBvZiBmaWxlcyB1cGxvYWRlZCBieSB0aGlzIHVzZXI8L2xpPgoJCTxsaT5MaW5rcyAmIzgy MTI7IG51bWJlciBvZiBsaW5rcyBjcmVhdGVkIGJ5IHRoaXMgdXNlcjwvbGk+Cgk8L3VsPgoK CTxwPkNsaWNrIDxlbT5OZXcgdXNlcjwvZW0+IChhZG1pbnMgb25seSkgdG8gY3JlYXRlIGEg bmV3IHVzZXIgYWNjb3VudCBhbmQgYXV0b21hdGljYWxseSBzZW5kIGEgcmFuZG9tbHktZ2Vu ZXJhdGVkIHBhc3N3b3JkIHRvIHRoZSBub21pbmF0ZWQgZS1tYWlsIGFkZHJlc3MuPGJyIC8+ CkNsaWNrIGEgbG9naW4gbmFtZSAocHJpdmlsZWdlcyByZXF1aXJlZCkgdG8gZWRpdCB0aGUg ZGV0YWlscyBhYm91dCB0aGF0IHVzZXIuIElmIHlvdSBoYXZlIGFueSBzbWRfYmlvIGZpZWxk cyBzZXQgdXAsIHRoZXkgY2FuIGFsc28gYmUgZWRpdGVkIChhbmQgaG92ZXJpbmcgb3ZlciB0 aGUgbG9naW4gbmFtZSB3aWxsIHJldHJpZXZlIHNvbWUgZXh0ZW5kZWQgYmlvZ3JhcGhpY2Fs IGluZm8pPGJyIC8+CkNsaWNrIGFuIGUtbWFpbCBhZGRyZXNzIHRvIGxhdW5jaCB5b3VyIGUt bWFpbCBzb2Z0d2FyZSB0byBzZW5kIGEgbWVzc2FnZSB0byB0aGUgdXNlci48YnIgLz4KQ2xp Y2sgYW4gYXJ0aWNsZSAvIGltYWdlIC8gZmlsZSAvIGxpbmsgdmFsdWUgdG8gc2VlIHRoZSBj b250ZW50IG93bmVkIGJ5IHRoYXQgdXNlci48L3A+CgoJPHA+WW91IG1heSBzb3J0IHRoZSBj b2x1bW5zIGJ5IGNsaWNraW5nIHRoZSBoZWFkaW5ncy4gQ2xpY2sgb25jZSB0byBzb3J0IGlu IGFzY2VuZGluZyBvcmRlciwgY2xpY2sgYWdhaW4gdG8gc29ydCBpbiBkZXNjZW5kaW5nIG9y ZGVyLiBBbiBhcnJvdyBzaG93cyB0aGUgc29ydCBkaXJlY3Rpb24uIFlvdXIgc29ydCBjb2x1 bW4gYW5kIGRpcmVjdGlvbiBhcmUgcmVtZW1iZXJlZCBuZXh0IHRpbWUgeW91IHZpc2l0IHRo ZSBwYW5lbC48L3A+CgoJPHA+WW91IG1heSBhbHNvIHNlYXJjaCB1c2VycyBieSBsb2dpbiBu YW1lLCByZWFsIG5hbWUsIGUtbWFpbCBhZGRyZXNzLCBwcml2aWxlZ2UgbGV2ZWwgKG51bWJl ciBvciBuYW1lKSwgb3IgY29udGVudCBjb3VudC4gQSBmZXcgbm90ZXMgYWJvdXQgc2VhcmNo aW5nOjwvcD4KCgk8dWw+CgkJPGxpPldoZW4gc2VhcmNoaW5nIHByaXZpbGVnZXMgYnkgbmFt ZSwgb25seSB0aGUgPGVtPmZpcnN0IG1hdGNoaW5nPC9lbT4gZ3JvdXAgd2lsbCBiZSByZXR1 cm5lZCAmIzgyMTI7IHRoZSBwcml2cyBhcmUgc2VhcmNoZWQgaW4gb3JkZXIgb2YgdGhlaXIg SUQuPC9saT4KCQk8bGk+WW91IG1heSBzZWFyY2ggcHJpdmlsZWdlcyBhbmQgY29udGVudCBj b3VudHMgYnkgc3BlY2lmeWluZyBhbiBleGFjdCB2YWx1ZSwgZm9yIGV4YW1wbGUgQXJ0aWNs ZSBjb3VudDogMCBzaG93cyBhbGwgYWNjb3VudHMgd2l0aCBubyBhcnRpY2xlcyAocGVyaGFw cyBhIHNlbGYtcmVnaXN0ZXJlZCBzcGFtbWVyIG9yIG1hbGljaW91cyB1c2VyPyk8L2xpPgoJ CTxsaT5Zb3UgbWF5IGFsc28gc2VhcmNoIHRoZXNlIGZpZWxkcyB1c2luZyBncmVhdGVyLXRo YW4gb3IgbGVzcy10aGFuIHN5bWJvbHMgdG8gZmluZCB1c2VycyB3aXRoIHRoZSBtYXRjaGlu ZyBudW1iZXIgb2YgYXNzZXRzLiBGb3IgZXhhbXBsZSwgSW1hZ2UgY291bnQ6IDxjb2RlPiZn dDs9NTA8L2NvZGU+IHNob3dzIGFsbCB1c2VycyB3aXRoIDUwIGltYWdlcyBvciBtb3JlLjwv bGk+Cgk8L3VsPgoKCTxwPllvdSBjYW4gYWxzbyBwZXJmb3JtIG11bHRpLWVkaXRzIGJ5IHNl bGVjdGluZyB0aGUgcm93cyB0byBhbHRlciB2aWEgdGhlIGNoZWNrYm94ZXMgb24gdGhlIHJp Z2h0IG9mIGVhY2ggcm93IGFuZCB1c2luZyB0aGUgZHJvcGRvd24gaW1tZWRpYXRlbHkgYmVs b3cgdGhlIGxpc3QgdG8gbWFrZSBtYXNzIGNoYW5nZXMuIFRoZSBvcHRpb25zIGFyZTo8L3A+ CgoJPHVsPgoJCTxsaT5DaGFuZ2UgcHJpdmlsZWdlczogc2V0IGFsbCBzZWxlY3RlZCB1c2Vy cyB0byB0aGUgZ2l2ZW4gcHJpdmlsZWdlIGxldmVsLiBXaGVuIHlvdSBjaG9vc2UgdGhpcyBv cHRpb24sIGEgZnVydGhlciBkcm9wZG93biBhcHBlYXJzIHRvIGFsbG93IHlvdSB0byBjaG9v c2Ugd2hpY2ggbGV2ZWwgdG8gYXBwbHkuPC9saT4KCQk8bGk+UmVzZXQgcGFzc3dvcmQ6IHNl bmQgYSBuZXcgcGFzc3dvcmQgdG8gYWxsIHNlbGVjdGVkIHVzZXJzLjwvbGk+CgkJPGxpPkRl bGV0ZTogcmVtb3ZlIGFsbCBzZWxlY3RlZCB1c2VyIGFjY291bnRzLiBBIGZ1cnRoZXIgZHJv cGRvd24gYXBwZWFycyB3aXRoIGEgbGlzdCBvZiB1c2VyIGFjY291bnRzIGluIGl0OiBjaG9v c2Ugb25lIHRvIHRyYW5zZmVyIG92ZXIgYW55IGNvbnRlbnQgdGhhdCBiZWxvbmdlZCB0byB0 aGUgZGVsZXRlZCB1c2VyKHMpLjwvbGk+Cgk8L3VsPgoKCTxwPkEgY29tbW9uIHVzZSBpcyB0 byBmaW5kIGFueSB1c2VycyB3aXRoIDAgYXJ0aWNsZXMsIGFuZCB0aGVuIHVzZSB0aGUgbXVs dGktZWRpdCB0b29sIHRvIGRlbGV0ZSB0aGVtIGFsbC48L3A+CgoJPGgyIGlkPSJzbWRfdW1f Z3JvdXBzIj5Hcm91cCBtYW5hZ2VtZW50ICg8ZW0+R3JvdXBzPC9lbT4gYnV0dG9uKTwvaDI+ CgoJPHA+VGhpcyBwYW5lbCBhbGxvd3MgeW91IHRvIGFsdGVyIHRoZSBuYW1lcyBvZiA8c3Bh biBjbGFzcz0iY2FwcyI+VFhQPC9zcGFuPiYjODIxNztzIGJ1aWx0LWluIDYgZ3JvdXBzIHRv IHN1aXQgeW91ciBhcHBsaWNhdGlvbi4gSXQgY2hhbmdlcyB0aGUgVGl0bGVzIGluIHRoZSBj dXJyZW50bHkgaW5zdGFsbGVkIGxhbmd1YWdlIG9ubHkuPC9wPgoKCTxwPllvdSBtYXkgYWxz byBhZGQgYSBuZXcgZ3JvdXAgdXNpbmcgdGhlIGlucHV0IGNvbnRyb2xzIGFuZCBhY2NvbXBh bnlpbmcgPGVtPkNyZWF0ZTwvZW0+IGJ1dHRvbiBhdCB0aGUgdG9wIG9mIHRoZSBwYW5lbC4g SWYgeW91IGNob29zZSB0byBvbmx5IGVudGVyIGEgVGl0bGUsIGEgbmFtZSB3aWxsIGJlIGF1 dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIChsb3dlciBjYXNlLCB3aXRoIG1vc3Qgbm9uLTxzcGFu IGNsYXNzPSJjYXBzIj5BU0NJSTwvc3Bhbj4gY2hhcmFjdGVycyByZXBsYWNlZCBieSBzYWZl IGNoYXJhY3RlcnMpLiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHR5cGUgeW91ciBvd24gbmFt ZSwgdGhvdWdoIHBsZWFzZSBzdGljayB0byAmIzgyMTY7c2ltcGxlJiM4MjE3OyBsZXR0ZXJz IGFuZCBudW1iZXJzIHRvIG1ha2UgdGhpbmdzIGVhc3kgb24geW91cnNlbGYgbGF0ZXIuIElm IHlvdSBjaG9vc2UgYW4gZXhpc3RpbmcgZ3JvdXAgZnJvbSB0aGUgPGVtPmJhc2VkIG9uPC9l bT4gZHJvcGRvd24sIHRoZSBwcml2cyBmb3IgdGhhdCBncm91cCB3aWxsIGJlIGNvcGllZCBh Y3Jvc3MgdG8geW91ciBuZXcgZ3JvdXAuPC9wPgoKCTxwPkN1c3RvbSBncm91cHMgY2FuIGJl IGRlbGV0ZWQgdXNpbmcgdGhlICYjODIxNjt4JiM4MjE3OyBidXR0b24gYWxvbmdzaWRlIGVh Y2guIEFueSB1c2VycyB0aGF0IHdlcmUgYXNzaWduZWQgdG8gdGhhdCBncm91cCB3aWxsIGhh dmUgdGhlaXIgcHJpdmlsZWdlcyByZWR1Y2VkIHRvICYjODIxNjtOb25lJiM4MjE3Oy4gRWl0 aGVyIHZpc2l0IHRoZSA8ZW0+VXNlcnM8L2VtPiBwYW5lbCBhbmQgYWx0ZXIgdGhlaXIgcHJp diBsZXZlbCB0byBzb21ldGhpbmcgc3VpdGFibGUsIG9yIHNldCB0aGVpciBsZXZlbCB0byBz b21ldGhpbmcgZWxzZSBwcmlvciB0byBkZWxldGluZyB0aGUgZ3JvdXAuPC9wPgoKCTxwPklm IGFueSBncm91cCBjb250YWlucyBhdCBsZWFzdCBvbmUgdXNlciwgdGhlIGdyb3VwIElEIHZh bHVlcyBhcmUgaHlwZXJsaW5rZWQgYmFjayB0byB0aGUgVXNlcnMgcGFuZWwgdG8gc2hvdyBv bmx5IHRob3NlIHVzZXJzIGluIHRoYXQgZ3JvdXAuIFRoaXMgaXMgaGFuZHkgZm9yIHJlYXNz aWduaW5nIHByaXYgbGV2ZWxzIGJlZm9yZSBkZWxldGluZyBhIGdyb3VwLiBJZiB5b3UgaG92 ZXIgb3ZlciB0aGUgcHJpdiBJRCwgYSB0b29sdGlwIHdpbGwgZGlzcGxheSB0aGUgbnVtYmVy IG9mIHVzZXJzIGFzc2lnbmVkIHRvIHRoYXQgcHJpdmlsZWdlIGdyb3VwLjwvcD4KCgk8aDIg aWQ9InNtZF91bV9wcml2cyI+UHJpdiBtYW5hZ2VtZW50ICg8ZW0+UHJpdnM8L2VtPiBidXR0 b24pPC9oMj4KCgk8cD5Gcm9tIHRoaXMgcGFuZWwgeW91IG1heSBhbHRlciB3aGljaCB1c2Vy IGdyb3VwcyBjYW4gYWNjZXNzIHdoaWNoIHBhcnRzIG9mIHRoZSBhZG1pbiBzaWRlIGludGVy ZmFjZSBvciBwZXJmb3JtIGNlcnRhaW4gdHlwZXMgb2YgYWN0aW9uLiBZb3Ugd2lsbCBzZWUg YSBsaXN0IG9mICYjODIxNjthcmVhJiM4MjE3OyBoZWFkaW5ncy4gQ2xpY2sgb25lIHRvIGV4 cGFuZCBpdCBhbmQgc2VlIHRoZSBwcml2aWxlZ2VzIGl0IGNvbnRhaW5zOyBjbGljayBpdCBh Z2FpbiB0byBjb2xsYXBzZSBpdC4gVGhlIG9wZW4vY2xvc2VkIHN0YXRlIG9mIHRoZSBhcmVh cyBpcyByZW1lbWJlcmVkIG5leHQgdGltZSB5b3UgdmlzaXQgdGhlIHBhbmVsLjwvcD4KCgk8 cD5FYWNoIGFyZWEgaGFzIGEgcm93IG9mIGNoZWNrYm94ZXMgYWxvbmdzaWRlIGl0LiBJZiBh IGNoZWNrYm94IGlzIHRpY2tlZCBpbiBhIGNvbHVtbiBjb3JyZXNwb25kaW5nIHRvIGEgcHJp dmlsZWdlIGdyb3VwLCB0aGF0IGdyb3VwIGhhcyBhY2Nlc3MgdG8gdGhhdCBmZWF0dXJlIG9m IHRoZSBpbnRlcmZhY2UuIFlvdSBtYXkgYWx0ZXIgd2hvIHNlZXMgd2hhdCBieSBjaGFuZ2lu ZyB0aGUgdGljayBib3hlcyBhbmQgaGl0dGluZyBvbmUgb2YgdGhlIDxlbT5TYXZlPC9lbT4g YnV0dG9ucyB0aGF0IGFwcGVhciB0byB0aGUgbGVmdCBvZiBlYWNoIGFyZWEgaGVhZGluZzsg YWxsIHRoZSBidXR0b25zIGRvIHRoZSBzYW1lIHRoaW5nOiB0aGV5IHNhdmUgdGhlIGVudGly ZSBsaXN0IG9mIHByaXZpbGVnZXMuIFlvdSBtdXN0IGNvbmZpcm0gdGhlIGFjdGlvbiwgYmVj YXVzZSB0aGUgY2hhbmdlIGlzIGltbWVkaWF0ZS48L3A+CgoJPHA+WW91IG1heSBjaGFuZ2Ug Y2hlY2tib3hlcyBpbiBiYXRjaGVzIGJ5IHNlbGVjdGluZyByb3dzL2NvbHVtbnMgYW5kIHRo ZW4gdXNpbmcgYSBrZXlib2FyZCBzaG9ydGN1dCB0byBtYWtlIGNoYW5nZXMgdG8gYWxsIGhp Z2hsaWdodGVkIGNoZWNrYm94ZXMuIEZpcnN0bHksIGNob29zZSB3aGljaCBjaGVja2JveGVz IHRvIGFwcGx5IHlvdXIgY2hhbmdlczo8L3A+CgoJPG9sPgoJCTxsaT5jbGljayBhIGNvbHVt biBoZWFkaW5nIHRvIGhpZ2hsaWdodCB0aGF0IGVudGlyZSBHcm91cDwvbGk+CgkJPGxpPmNs aWNrIGEgcm93IGhlYWRpbmcgdG8gaGlnaGxpZ2h0IHRoYXQgZW50aXJlIFByaXYgc2V0PC9s aT4KCQk8bGk+Y2xpY2sgdGhlIHRvcCBsZWZ0LWhhbmQgY29ybmVyIG9mIHRoZSBjb2xsYXBz aWJsZSB0YWJsZSB0byBzZWxlY3QgYWxsIGNoZWNrYm94ZXM8L2xpPgoJPC9vbD4KCgk8cD5Z b3UgY2FuIHNlbGVjdCBtdWx0aXBsZSBjb2x1bW5zL3Jvd3MgZnJvbSBtdWx0aXBsZSBhcmVh cyBpZiB5b3Ugd2lzaC4gQ2xpY2tpbmcgYSByb3cvY29sdW1uL2Nvcm5lciBoZWFkaW5nIGFn YWluIHdpbGwgdG9nZ2xlIGl0cyBzdGF0dXMuPC9wPgoKCTxwPldoZW4geW91IGFyZSByZWFk eSB0byBtYWtlIGNoYW5nZXMgdG8gdGhlIHNlbGVjdGVkIGNoZWNrYm94ZXMsIHlvdSBjYW4g dXNlIHRoZSBmb2xsb3dpbmcga2V5czo8L3A+CgoJPHVsPgoJCTxsaT48Y29kZT5jPC9jb2Rl PiB0byBjaGVjayBhbGwgc2VsZWN0ZWQgYm94ZXM8L2xpPgoJCTxsaT48Y29kZT51PC9jb2Rl PiB0byB1bmNoZWNrIGFsbCBzZWxlY3RlZCBib3hlczwvbGk+CgkJPGxpPjxjb2RlPnQ8L2Nv ZGU+IHRvIHRvZ2dsZSB0aGUgc3RhdHVzIG9mIGFsbCBzZWxlY3RlZCBib3hlcyAoY2hlY2tl ZCBiZWNvbWUgdW5jaGVja2VkLCBhbmQgdmljZSB2ZXJzYSk8L2xpPgoJCTxsaT48Y29kZT5k PC9jb2RlPiBkZXNlbGVjdHMgYWxsIHJvd3MgLyBjb2x1bW5zIHlvdSBoYXZlIGhpZ2hsaWdo dGVkPC9saT4KCTwvdWw+CgoJPHA+VGhlIGFyZWEgaGVhZGluZ3MgbWVyZWx5IGdyb3VwIHRo ZSBhcmVhcyBmb3IgY29udmVuaWVuY2UgYW5kIG1ha2UgdGhlIHBhZ2UgbG9vayBsZXNzIHNj YXJ5ISBBbnkgcGx1Z2lucyB5b3UgaGF2ZSBpbnN0YWxsZWQgd2lsbCBiZSBzaG93biB1bmRl ciBhbiBhcmVhIGhlYWRpbmcgb2YgdGhlIGF1dGhvciYjODIxNztzIHRocmVlLWxldHRlciBw cmVmaXguIE5vdGUgdGhhdCBhbHRlcmluZyBwcml2cyBoZXJlIG92ZXJyaWRlcyB0aGUgcHJp dnMgYXMgc2V0IGJ5IHRoZSBwbHVnaW4gc28geW91IGNhbiBjdXN0b21pc2Ugd2hvIHNlZXMg d2hhdC48L3A+CgoJPHA+VGhlICYjODIxNjt0YWImIzgyMTc7IGFyZWEgaGVhZGluZyBnb3Zl cm5zIHdoaWNoIHVzZXIgZ3JvdXBzIGhhdmUgYWNjZXNzIHRvIHRoZSBwcmltYXJ5IG5hdmln YXRpb24gYXJlYXMgKGNvbnRlbnQsIHByZXNlbnRhdGlvbiwgYWRtaW4sIGV4dGVuc2lvbnMg YW5kIGFueSBjdXN0b20gdGFicyBzdWNoIGFzIHRob3NlIGNyZWF0ZWQgYnkgc21kX3RhYmJl cikuIE5vdGUgdGhhdCBnaXZpbmcgYWNjZXNzIHRvIHRoZXNlIHRhYnMgZG9lcyBub3QgYXV0 b21hdGljYWxseSBnaXZlIGFjY2VzcyB0byB0aGUgc2Vjb25kYXJ5IG5hdmlnYXRpb24gZWxl bWVudHM7IHlvdSBtdXN0IHR1cm4gdGhvc2Ugb24gaW5kZXBlbmRlbnRseS4gQnkgY29udHJh c3QsIGdpdmluZyBhIHVzZXIgZ3JvdXAgYWNjZXNzIHRvIGEgc2Vjb25kYXJ5IG5hdmlnYXRp b24gaXRlbSA8ZW0+ZG9lczwvZW0+IGFsbG93IHRoZW0gdG8gdXNlIHRoYXQgZmVhdHVyZSBi dXQgdGhleSB3b24mIzgyMTc7dCBiZSBhYmxlIHRvIG5hdmlnYXRlIHRvIGl0IHVzaW5nIHRo ZSBwcmltYXJ5IG5hdmlnYXRpb24gYnV0dG9uIHVubGVzcyB0aGV5IGhhdmUgYWxzbyBiZWVu IGdpdmVuIGFjY2VzcyB0byB0aGF0IHRhYi48L3A+CgoJPHA+Rm9yIGV4YW1wbGUsIGlmIHlv dSBncmFudCB0aGUgJiM4MjE2O3BhZ2UmIzgyMTc7IHByaXZpbGVnZSB0byBGcmVlbGFuY2Vy cyBidXQgZG9uJiM4MjE3O3QgZ2l2ZSB0aGVtIGFjY2VzcyB0byB0aGUgUHJlc2VudGF0aW9u IHRhYiwgdGhleSBjb3VsZCB0eXBlIDxjb2RlPj9ldmVudD1wYWdlPC9jb2RlPiBpbiB0aGUg PHNwYW4gY2xhc3M9ImNhcHMiPlVSTDwvc3Bhbj4gdG8gZ2V0IHRvIHRoZSBQYWdlcyBwYW5l bCBidXQgdGhleSB3b3VsZCBoYXZlIG5vIG1lYW5zIG9mIG5hdmlnYXRpbmcgdGhlcmUgYnkg Y2xpY2tpbmcgdGhlIG1vdXNlLiBTaW5jZSB0aGUgcHJpbWFyeSAmIzgyMTY7UHJlc2VudGF0 aW9uJiM4MjE3OyB0YWIgaXMgbWlzc2luZywgdGhlIHNlY29uZGFyeSB0YWJzIGFyZSBhbGwg bWlzc2luZyB0b28sIGV2ZW4gdGhvdWdoIHNvbWUgb2YgdGhlbSBtYXkgYmUgcGVybWl0dGVk IGZvciB0aGF0IGdyb3VwIG9mIHVzZXJzLjwvcD4KCgk8cD5JZiB5b3Ugd2lzaCB0byBhZGQg eW91ciBvd24gcHJpdiBhcmVhLCB0eXBlIGEgbmV3IG9uZSBpbiB0aGUgYm94IGF0IHRoZSB0 b3Agb2YgdGhlIHBhbmVsIGFuZCBoaXQgPGVtPkNyZWF0ZTwvZW0+LiBZb3VyIGFyZWEgd2ls bCBiZSBjcmVhdGVkIHVuZGVyIHRoZSBhcHByb3ByaWF0ZSBoZWFkaW5nLCBlLmcuIGlmIHlv dSBzcGVjaWZpZWQgPGNvZGU+c21kX3Rlc3Q8L2NvZGU+IGl0IHdvdWxkIGFwcGVhciB1bmRl ciB0aGUgPGNvZGU+c21kPC9jb2RlPiBoZWFkaW5nLCBvciBpZiB5b3UgY3JlYXRlZCBhIDxj b2RlPmZpbGUudHJ1c3RlZDwvY29kZT4gcHJpdmlsZWdlIGFyZWEsIGl0IHdvdWxkIGFwcGVh ciB1bmRlciB0aGUgPGNvZGU+ZmlsZTwvY29kZT4gaGVhZGluZy4gQ29yZSBhcmVhcyBhcmUg bm9ybWFsbHkgc3BlY2lmaWVkIGJ5IGEgZG90dGVkIG5vdGF0aW9uIGJ1dCB5b3UgYXJlIGZy ZWUgdG8gY2hvb3NlIGFueSBub3RhdGlvbiB0aGF0IG1ha2VzIHNlbnNlIHRvIHlvdXIgYXBw bGljYXRpb24uPC9wPgoKCTxwPk5vdGUgdGhhdDo8L3A+CgoJPG9sPgoJCTxsaT5zb21lIHBs dWdpbnMgbWF5IG5vdCBzaG93IHVwIGluIHRoZSBsaXN0IGR1ZSB0byBmYWN0b3JzIHN1Y2gg YXMgcGx1Z2luIGxvYWQgb3JkZXIgb3IgdGhlIG1lY2hhbmlzbSBieSB3aGljaCB0aGUgcGx1 Z2luIGlzIHdyaXR0ZW4uPC9saT4KCQk8bGk+dGhlIDxjb2RlPltSXTwvY29kZT4gY29sdW1u IGlzIGEgc3BlY2lhbCBSZXNldCBpbmRpY2F0b3IuIENoZWNraW5nIGFueSByb3cgaW4gdGhp cyBjb2x1bW4gd2lsbCBpZ25vcmUgYW55IHByaXZpbGVnZSBjaGVja2JveGVzIHlvdSBtYXkg aGF2ZSBzZXQgb3IgYWx0ZXJlZCBhbmQgd2lsbCByZXNldCB0aGUgY29ycmVzcG9uZGluZyBw cml2cyB0byB0aGVpciBkZWZhdWx0cyBhZnRlciB5b3UgY2xpY2sgU2F2ZS48L2xpPgoJCTxs aT55b3UgbWF5IG5vdCBhZGQgPGNvZGU+c21kX3VtPC9jb2RlPiBwcml2cyB0byBvdmVycmlk ZSB0aGUgZnVuY3Rpb25hbGl0eSBpZiB0aGlzIHBsdWdpbiwgYWx0aG91Z2ggeW91IGNhbiBh ZGp1c3Qgd2hvIGNhbiBlZGl0IHdoYXQgc28gYmUgY2FyZWZ1bCBub3QgdG8gb3BlbiB0aGUg cGVybWlzc2lvbnMgdG9vIHdpZGVseS48L2xpPgoJPC9vbD4KCgk8aDIgaWQ9InNtZF91bV9w cmVmcyI+UHJlZmVyZW5jZSBtYW5hZ2VtZW50ICg8ZW0+UHJlZnM8L2VtPiBidXR0b24pPC9o Mj4KCgk8cD5BZG1pbmlzdHJhdG9ycyBjYW4gc2V0IGdsb2JhbCBwcmVmZXJlbmNlcyB0aGF0 IGdvdmVybiB0aGUgYmVoYXZpb3VyIG9mIHRoZSBwbHVnaW46PC9wPgoKCTxkbD4KCQk8ZHQ+ PHN0cm9uZz5Bc3N1bWUgaGllcmFyY2hpY2FsIGdyb3Vwczwvc3Ryb25nPjwvZHQ+CgkJPGRk PlRleHRwYXR0ZXJuIGRvZXMgbm90IG5vcm1hbGx5IGhhdmUgdGhlIG5vdGlvbiBvZiBlc2Nh bGF0aW5nIHByaXZpbGVnZSBsZXZlbHMuIEEgQ29weSBFZGl0b3IgaXMgbm90IDxlbT5ncmVh dGVyIHRoYW48L2VtPiBhIFN0YWZmIFdyaXRlciwgZm9yIGV4YW1wbGUsIHRoZXkganVzdCBo YXZlIGRpZmZlcmVudCBwZXJtaXNzaW9ucyB0byBmdWxmaWwgdGhlIHJlbGV2YW50IHJvbGUu PC9kZD4KCQk8ZGQ+WW91IG1heSBzZXQgdGhpcyBwcmVmZXJlbmNlIHRvIDxlbT55ZXM8L2Vt PiB0byBmb3JjZSBUZXh0cGF0dGVybiB0byB0cmVhdCB5b3VyIGxldmVscyBhcyBhIGhpZXJh cmNoeSwgaS5lLiBsb3dlciBudW1iZXJzIGFyZSAmIzgyMjA7bW9yZSBwb3dlcmZ1bCYjODIy MTsgdGhhbiBoaWdoZXIgbnVtYmVycyAod2l0aCB0aGUgZXhjZXB0aW9uIG9mIDA6IE5vbmUg d2hpY2ggaXMgYWx3YXlzICYjODIxNjtubyBwcml2cyYjODIxNzspLjwvZGQ+CgkJPGRkPk9u Y2Ugc2V0LCBsb2dnZWQtaW4gdXNlcnMgbWF5IG5vdCBjcmVhdGUgb3IgZWRpdCBhbnkgb3Ro ZXIgdXNlcnMgdGhhdCBhcmUgJiM4MjE2O2Fib3ZlJiM4MjE3OyB0aGVpciBhc3NpZ25lZCBw cml2cywgZS5nLiBDb3B5IEVkaXRvcnMgY2Fubm90IG1vZGlmeSBQdWJsaXNoZXIgb3IgTWFu YWdpbmcgRWRpdG9yIGFjY291bnRzLiBGdXJ0aGVyLCBpdCBpcyBub3QgcG9zc2libGUgdG8g YWx0ZXIgeW91ciBvd24gcHJpdmlsZWdlcywgbm9yIGNhbiB5b3UgY3JlYXRlIGEgdXNlciB3 aXRoIGEgZ3JlYXRlciBwcml2IGxldmVsIHRoYW4geW91IHBvc3Nlc3MuPC9kZD4KCQk8ZGQ+ RGVmYXVsdDogbm88L2RkPgoJCTxkdD48c3Ryb25nPlByb3RlY3RlZCBhZG1pbmlzdHJhdG9y IGdyb3VwPC9zdHJvbmc+PC9kdD4KCQk8ZGQ+Tm9taW5hdGUgYSBncm91cCB0aGF0IHlvdSB3 aXNoIG9ubHkgYWRtaW5pc3RyYXRvcnMgdG8gYmUgYWJsZSB0byBhbHRlci9jcmVhdGUuPC9k ZD4KCQk8ZGQ+T25jZSBzZXQsIHRoZSBub21pbmF0ZWQgZ3JvdXAgaXMgb2ZmLWxpbWl0cyB0 byBhbGwgdXNlcnMgYXBhcnQgZnJvbSB0aG9zZSBhbHJlYWR5IGluIHRoZSBzZWxlY3RlZCBn cm91cC4gSW4gb3RoZXIgd29yZHMsIG5vbi1hZG1pbiB1c2VycyBjYW5ub3QgY3JlYXRlLCBt b2RpZnksIGFsdGVyIChvciBtYXNzLWFsdGVyKSBhbnkgcHJpdmlsZWdlIHNldHRpbmcgdXNp bmcgdGhpcyBncm91cC48L2RkPgoJCTxkZD5DYW4gYmUgdXNlZCBpbiB0YW5kZW0gd2l0aCBv ciBpbmRlcGVuZGVudGx5IG9mIHRoZSA8ZW0+QXNzdW1lIGhpZXJhcmNoaWNhbCBncm91cHM8 L2VtPiBzZXR0aW5nLjwvZGQ+CgkJPGRkPkRlZmF1bHQ6IDEgKGEuay5hLiBQdWJsaXNoZXJz KTwvZGQ+CgkJPGR0PjxzdHJvbmc+TWF4aW11bSB1c2VyIHNlYXJjaCByZXN1bHQgbGltaXQ8 L3N0cm9uZz48L2R0PgoJCTxkZD5NYXhpbXVtIG51bWJlciBvZiBzZWFyY2ggcmVzdWx0cyB0 byByZXR1cm4gd2hlbiBmaWx0ZXJpbmcgdGhlIFVzZXIgbGlzdC48L2RkPgoJCTxkZD5EZWZh dWx0OiA1MDA8L2RkPgoJCTxkdD48c3Ryb25nPlBhc3N3b3JkIGxlbmd0aCAoY2hhcmFjdGVy cyk8L3N0cm9uZz48L2R0PgoJCTxkZD5UaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gbmV3 bHktZ2VuZXJhdGVkIHBhc3N3b3Jkcy4gVGhlIGhpZ2hlciB0aGUgYmV0dGVyICh1cCB0byBh IHBvaW50KS48L2RkPgoJCTxkZD5EZWZhdWx0OiAxMjwvZGQ+CgkJPGR0PjxzdHJvbmc+QWN0 aXZpdHkgdGltZW91dCAoc2Vjb25kcyk8L3N0cm9uZz48L2R0PgoJCTxkZD5OdW1iZXIgb2Yg c2Vjb25kcyB3aXRoaW4gd2hpY2ggc29tZW9uZSBoYXMgdG8gcGVyZm9ybSBhbiBhZG1pbi1z aWRlIGFjdGlvbiB0byByZW1haW4gdmlzaWJsZSBvbiB0aGUgQWN0aXZlIFVzZXJzIGxpc3Qu IEZvciBoaWdoIGFjdGl2aXR5IHNpdGVzLCB5b3UgY2FuIGxvd2VyIHRoaXMgdmFsdWUgYW5k IHJlY2VpdmUgYSBtb3JlIHJlc3BvbnNpdmUgKGFjY3VyYXRlKSBsaXN0LCBhdCB0aGUgcG9z c2libGUgZXhwZW5zZSBvZiBhY2NvdW50IC4gTGVuZ3RoZW5pbmcgdGhlIHZhbHVlIHdpbGwg a2VlcCBvbmxpbmUgdXNlcnMgaW4gdGhlIGxpc3QgbG9uZ2VyLCBldmVuIHRob3VnaCB0aGV5 IG1heSBub3QgYWN0dWFsbHkgc3RpbGwgYmUgYWN0aXZlLjwvZGQ+CgkJPGRkPkRlZmF1bHQ6 IDYwPC9kZD4KCTwvZGw+CgoJPGgyIGlkPSJzbWRfdW1fbm9uX2FkbWluIj5Ob24tYWRtaW4g dXNlcnM8L2gyPgoKCTxwPlVzZXIgYWNjb3VudHMgd2l0aG91dCBwcml2aWxlZ2VzIHRvIGxp c3QgdXNlcnMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHNob3duIHRoZSBFZGl0IHNjcmVlbiBm b3IgdGhlaXIgb3duIHVzZXIgYWNjb3VudC4gVGhpcyBpcyB0aGUgb25seSBhY2NvdW50IHRo YXQgY2FuIGJlIGVkaXRlZC4gSWYgc21kX2JpbyBpcyBpbnN0YWxsZWQsIGFkZGl0aW9uYWwg YmlvZ3JhcGhpY2FsIGluZm9ybWF0aW9uIG1heSBhbHNvIGJlIGVkaXRlZC48L3A+CgoJPHA+ VXNlcnMgbWF5IGFsc28gY2hhbmdlIHRoZWlyIHBhc3N3b3JkIHVzaW5nIHRoZSBmb3JtIGF0 IHRoZSBib3R0b20gb2YgdGhlIHNjcmVlbi4gVGhlIGNoYW5nZSBwYXNzd29yZCBmZWF0dXJl IGludGVncmF0ZXMgd2l0aCBzbWRfcHJvZ25vc3RpY3MgdG8gc2hvdyBwYXNzd29yZCBjcmFj a2FiaWxpdHkgaGludHMuPC9wPgoKCTxoMiBpZD0ic21kX3VtX2FjdGl2ZSI+QWN0aXZlIHVz ZXJzPC9oMj4KCgk8cD5BdCB0aGUgYm90dG9tIG9mIGVhY2ggcGFuZWwgaXMgYSBsaXN0IG9m IGN1cnJlbnRseSBhY3RpdmUgKCYjODIyMDtvbmxpbmUmIzgyMjE7KSB1c2Vycy4gRWFjaCB1 c2VyIGlzIGh5cGVybGlua2VkIHRvIHRoZSA8YSBocmVmPSIjc21kX3VtX3VzZXJzIj5Vc2Vy czwvYT4gcGFuZWwgdG8gc2hvdyB5b3UgdGhlIGluZm8gYWJvdXQganVzdCB0aGF0IHBlcnNv biwgd2hpY2ggaXMgYSBjb252ZW5pZW50IHNob3J0Y3V0IHRvIGZpbmQgb3V0IGFib3V0IGEg bG9nZ2VkLWluIGF1dGhvci48L3A+CgoJPHA+QW4gYWN0aXZlIHVzZXIgaXMgb25lIHdobyBo YXMgcGVyZm9ybWVkIHNvbWUgYWRtaW4tc2lkZSBhY3Rpb24gaW4gdGhlIHBhc3QgTiBzZWNv bmRzLCB3aGVyZSBOIGlzIGRlZmluZWQgaW4gdGhlIDxhIGhyZWY9IiNzbWRfdW1fcHJlZnMi PkFjdGl2aXR5IFRpbWVvdXQgcGx1Z2luIHByZWZlcmVuY2U8L2E+LjwvcD4KCgk8aDI+Q2hh bmdlbG9nPC9oMj4KCgk8dWw+CgkJPGxpPjI3IEp1bCAxMSB8IHYwLjEwIHwgSW5pdGlhbCBw dWJsaWMgcmVsZWFzZTwvbGk+Cgk8L3VsPgoKPC9kaXY+CjwhLS0gKioqIEJFR0lOIFBMVUdJ TiBDU1MgKioqIC0tPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgojc21kX2hlbHAgeyBsaW5l LWhlaWdodDoxLjUgO30KI3NtZF9oZWxwIGNvZGUgeyBmb250LXdlaWdodDpib2xkOyBmb250 OiAxMDUlLzEzMCUgIkNvdXJpZXIgTmV3IiwgY291cmllciwgbW9ub3NwYWNlOyBiYWNrZ3Jv dW5kLWNvbG9yOiAjZjBlNjhjOyBjb2xvcjojMzMzOyB9CiNzbWRfaGVscCBjb2RlLmJsb2Nr IHsgZm9udC13ZWlnaHQ6bm9ybWFsOyBib3JkZXI6MXB4IGRvdHRlZCAjOTk5OyBkaXNwbGF5 OmJsb2NrOyBtYXJnaW46MTBweCAxMHB4IDIwcHg7IHBhZGRpbmc6MTBweDsgfQojc21kX2hl bHAgaDEgeyBmb250OiAyMHB4IEdlb3JnaWEsIHNhbnMtc2VyaWY7IG1hcmdpbjogMDsgdGV4 dC1hbGlnbjogY2VudGVyOyB9CiNzbWRfaGVscCBoMiB7IGJvcmRlci1ib3R0b206IDFweCBz b2xpZCBibGFjazsgcGFkZGluZzoxMHB4IDAgMDsgZm9udDogMTdweCBHZW9yZ2lhLCBzYW5z LXNlcmlmOyB9CiNzbWRfaGVscCBoMyB7IGZvbnQ6IGJvbGQgMTJweCBBcmlhbCwgc2Fucy1z ZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDFweDsgbWFyZ2luOiAxMHB4IDAgMDsgdGV4dC1kZWNv cmF0aW9uOnVuZGVybGluZTsgfQojc21kX2hlbHAgaDQgeyBmb250OiBib2xkIDExcHggQXJp YWwsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxcHg7IG1hcmdpbjogMTBweCAwIDA7 IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IH0KI3NtZF9oZWxwIC5hdG5tIHsgZm9udC13 ZWlnaHQ6Ym9sZDsgfQojc21kX2hlbHAgLm1hbmQgeyBiYWNrZ3JvdW5kOiNlZWU7IGJvcmRl cjoxcHggZG90dGVkICM5OTk7IH0KI3NtZF9oZWxwIHRhYmxlIHsgd2lkdGg6OTAlOyB0ZXh0 LWFsaWduOmNlbnRlcjsgcGFkZGluZy1ib3R0b206MWVtOyBib3JkZXItY29sbGFwc2U6Y29s bGFwc2U7IH0KI3NtZF9oZWxwIHRkLCAjc21kX2hlbHAgdGggeyBib3JkZXI6MXB4IHNvbGlk ICM5OTk7IHBhZGRpbmc6LjVlbTsgfQojc21kX2hlbHAgdWwgeyBsaXN0LXN0eWxlLXR5cGU6 c3F1YXJlOyB9CiNzbWRfaGVscCAuaW1wb3J0YW50IHsgY29sb3I6cmVkOyB9CiNzbWRfaGVs cCBsaSB7IG1hcmdpbjo1cHggMjBweCA1cHggMzBweDsgfQojc21kX2hlbHAgLmJyZWFrIHsg bWFyZ2luLXRvcDo1cHg7IH0KI3NtZF9oZWxwIGRsIGRkIHsgbWFyZ2luOjJweCAxNXB4OyB9 CiNzbWRfaGVscCBkbCBkZDpiZWZvcmUgeyBjb250ZW50OiAiXDIxZDJcMDBhMCI7IH0KI3Nt ZF9oZWxwIGRsIGRkIGRsIHsgcGFkZGluZzogMCAxNXB4OyB9Cjwvc3R5bGU+CjwhLS0gKioq IEVORCBQTFVHSU4gQ1NTICoqKiAtLT4KIjtzOjM6Im1kNSI7czozMjoiOWFjZGE2NGUxNWRj NWQxOTJhODcwN2Y3MzgzN2I1NjEiO30=