# smd_lib v0.21b # Shared function library used by smd_ plugins and others. # Stef Dawson # http://www.stefdawson.com/ # ...................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ...................................................................... YTo5OntzOjc6InZlcnNpb24iO3M6NToiMC4yMWIiO3M6NjoiYXV0aG9yIjtzOjExOiJTdGVm IERhd3NvbiI7czoxMDoiYXV0aG9yX3VyaSI7czoyNjoiaHR0cDovL3d3dy5zdGVmZGF3c29u LmNvbS8iO3M6MTE6ImRlc2NyaXB0aW9uIjtzOjU2OiJTaGFyZWQgZnVuY3Rpb24gbGlicmFy eSB1c2VkIGJ5IHNtZF8gcGx1Z2lucyBhbmQgb3RoZXJzLiI7czo0OiJ0eXBlIjtpOjI7czo0 OiJuYW1lIjtzOjc6InNtZF9saWIiO3M6NDoiaGVscCI7czo1ODc6Igk8aDE+c21kXyBwbHVn aW4gbGlicmFyeTwvaDE+CgoJPHA+T2ZmZXJzIG5vIHB1YmxpYyB0ZXh0cGF0dGVybiB0YWdz LiBJdCBpcyBzaW1wbHkgYSBzaGFyZWQgbGlicmFyeSBvZiBjb21tb24gZnVuY3Rpb25zIHVz ZWQgYnkgc21kXyBwbHVnaW5zLjwvcD4KCgk8aDI+Q2hhbmdlbG9nPC9oMj4KCgk8dWw+CgkJ PGxpPnYwLjEgICAwNy0wMi0yNSBJbml0aWFsIHB1YmxpYyByZWxlYXNlPC9saT4KCQk8bGk+ djAuMiAgIDA3LTAzLTAzIEFkZGVkIDxzcGFuIGNsYXNzPSJjYXBzIj5NTFA8L3NwYW4+IChN dWx0aS1MaW5ndWFsIFBhY2spIGxpYnJhcnkgc3VwcG9ydDwvbGk+CgkJPGxpPnYwLjIxICAw Ny0wMy0wNiBBZGRlZCBpbnRlZ2VyIHJhbmdlIGZ1bmN0aW9uYWxpdHkuIGdldEF0dHMgbm93 IHRha2VzIGEgcmVnZXhwIGFyZy48L2xpPgoJCTxsaT52MC4yMWEgMDctMDMtMjEgRml4ZWQ6 IENoYXJhY3RlciByYW5nZXMgaWdub3JlZCAodGhhbmtzIG1yZGFsZSk8L2xpPgoJCTxsaT52 MC4yMWIgMDctMDQtMDIgRml4ZWQ6IFN0aWNreSBhcnRpY2xlIHN1cHBvcnQgaW4gc21kX2dl dEF0dHMgKHRoYW5rcyBwaWVtYW4pPC9saT4KCTwvdWw+IjtzOjQ6ImNvZGUiO3M6NzU2ODoi Cmdsb2JhbCAkc21kTUxQOwokc21kTUxQID0gYXJyYXkoCgkJJ3NtZF9zbGltYm94JyA9PiAn c21kX3Nib3gnLAoJCSdzbWRfc2xpbWJveF9pbmMnID0+ICdzbWRfc2JveCcsCgkJJ3NtZF9y YW5kb21fYmFubmVyJyA9PiAnc21kX3JiYW4nLAoJKTsKZnVuY3Rpb24gc21kX2FkZFFTVmFy KCR1cmwsICRrZXksICR2YWx1ZSkgewoJJHVybCA9IHNtZF9yZW1vdmVRU1ZhcigkdXJsLCAk a2V5KTsKCWlmIChzdHJwb3MoJHVybCwgJz8nKSA9PT0gZmFsc2UpIHsKCQlyZXR1cm4gKCR1 cmwgLiAnPycgLiAka2V5IC4gJz0nIC4gJHZhbHVlKTsKCX0gZWxzZSB7CgkJcmV0dXJuICgk dXJsIC4gJyYnIC4gJGtleSAuICc9JyAuICR2YWx1ZSk7Cgl9Cn0KZnVuY3Rpb24gc21kX3Jl bW92ZVFTVmFyKCR1cmwsICRrZXkpIHsKCSR1cmwgPSBwcmVnX3JlcGxhY2UoJy8oLiopKFw/ fCYpJyAuICRrZXkgLiAnPVteJl0rPygmKSguKikvaScsICckMSQyJDQnLCAkdXJsIC4gJyYn KTsKCSR1cmwgPSBzdWJzdHIoJHVybCwgMCwgLTEpOwoJcmV0dXJuICgkdXJsKTsKfQovLyBy ZXR1cm4gYSBsaXN0IG9mIGNhdGVnb3JpZXMgdW5kZXIgKGFuZCBpbmNsdWRpbmcpIHRoZSBn aXZlbiBwYXJlbnQgY2F0ZWdvcnkKZnVuY3Rpb24gc21kX2dldFN1YkNhdHMoJHBhcmVudCwk Y2F0dHlwZSkgewoJJHBhcmVudCA9IGRvU2xhc2goJHBhcmVudCk7CgkkbGV4dHJlbSA9IDE7 ICRyZXh0cmVtID0gMTsKCWV4dHJhY3Qoc2FmZV9yb3coImxmdCBhcyBsZXh0cmVtLCByZ3Qg YXMgcmV4dHJlbSIsICJ0eHBfY2F0ZWdvcnkiLCAibmFtZT0nJHBhcmVudCcgYW5kIHR5cGUg PSAnJGNhdHR5cGUnIikpOwoJJHJzID0gc2FmZV9yb3dzX3N0YXJ0KCJpZCxuYW1lLHRpdGxl IiwidHhwX2NhdGVnb3J5IiwgImxmdCBiZXR3ZWVuICRsZXh0cmVtIGFuZCAkcmV4dHJlbSBh bmQgdHlwZSA9ICckY2F0dHlwZScgb3JkZXIgYnkgbGZ0IGFzYyIpOwoJJGNhdHMgPSBhcnJh eSgpOwoKCXdoaWxlICgkcm93ID0gbmV4dFJvdygkcnMpKSB7CgkJJGNhdHNbXSA9IGFycmF5 KAoJCQknaWQnID0+ICRyb3dbJ2lkJ10sCgkJCSduYW1lJyA9PiAkcm93WyduYW1lJ10sCgkJ CSd0aXRsZScgPT4gJHJvd1sndGl0bGUnXQoJCSk7Cgl9CglyZXR1cm4gJGNhdHM7Cn0KLy8g U2VhcmNoZXMgdGhlIHBhc3NlZCAkc3RyIGZvciBwcmVkZXRlcm1pbmVkIHNlcXVlbmNlcyBv ZiBjaGFyYWN0ZXJzCi8vIGFuZCwgaWYgdGhhdCBzZXF1ZW5jZSBpcyBpbiAkYWxsb3dlZCwg cmVwbGFjZXMgaXQgYXMgZm9sbG93czoKLy8gID9jID0gY3VycmVudCBnbG9iYWwgY2F0ZWdv cnkgKCFjID0gbm90IGN1cnJlbnQgY2F0ZWdvcnkpCi8vICA/cyA9IGN1cnJlbnQgc2VjdGlv biAoIXMgPSBub3QgY3VycmVudCBzZWN0aW9uKQovLyAgP3QgPSBjdXJyZW50IGFydGljbGUg dGl0bGUgKCF0ID0gbm90IGN1cnJlbnQgdGl0bGUpCi8vICA/aWQgPSBjdXJyZW50IGFydGlj bGUgSUQsIHByZXBlbmRlZCB3aXRoICRpZHByZWZpeCAoIWlkID0gbm90IGN1cnJlbnQgSUQp Ci8vICA/ZmllbGQgPSBjb250ZW50cyBvZiB0aGUgY3VycmVudCBhcnRpY2xlJ3MgZmllbGQg KGNvdWxkIGJlIGEgY29tbWEtc2VwYXJhdGVkIGxpc3QpCi8vICAhZmllbGQgPSBub3QgdGhl IGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50IGFydGljbGUncyBmaWVsZCAoY291bGQgYmUgYSBj b21tYS1zZXBhcmF0ZWQgbGlzdCkKLy8gUmFuZ2VzIChlLmcuIDEtNSBvciBhLXopIHdpbGwg YmUgZXhwYW5kZWQgaW50byB0aGVpciBpbmRpdmlkdWFsIHZhbHVlcyAoUEhQPjQuMS4wIGZv ciBjaGFycykuCi8vIEFueXRoaW5nIGVsc2UgaXMgcmV0dXJuZWQgdmVyYmF0aW0uCi8vIE91 dHB1dHMgdHdvIGFycmF5czsgdGhlIDFzdCBjb250YWluaW5nIGl0ZW1zIGZvciBpbmNsdXNp b24sIHRoZSAybmQgZm9yIGV4Y2x1c2lvbi4KZnVuY3Rpb24gc21kX2dldEF0dHMoJHN0ciwg JGFsbG93ZWQsICRpZHByZWZpeD0iIiwgJHNwbGl0YXQ9IixccyIpIHsKCWdsb2JhbCAkcHJl dGV4dCwgJHRoaXNhcnRpY2xlOwoKCSRvdXQgPSBhcnJheSgpOwoJJHN1Ym91dCA9IGFycmF5 KCk7Cgkkbm90b3V0ID0gYXJyYXkoKTsKCSRtYXRjaGVzID0gc21kX3NwbGl0UmFuZ2UoJHN0 ciwgJHNwbGl0YXQpOwoKCWZvciAoJGlkeCA9IDA7ICRpZHggPCBjb3VudCgkbWF0Y2hlcyk7 ICRpZHgrKykgewoJCSR0aGlzbWF0Y2ggPSAkbWF0Y2hlc1skaWR4XTsKCQlpZiAoKCR0aGlz bWF0Y2ggPT09ICI/YyIpICYmIGluX2FycmF5KCI/YyIsJGFsbG93ZWQpKSB7CgkJCS8vIFVz ZSBnbG9iYWwgYXJ0aWNsZSBjYXRlZ29yeSwgaWYgaXQgZXhpc3RzCgkJCWlmICgkcHJldGV4 dFsnYyddICE9ICIiKSB7CgkJCQlpZiAoIWluX2FycmF5KCRwcmV0ZXh0WydjJ10sICRvdXQp KSB7CgkJCQkJJG91dFtdID0gJHByZXRleHRbJ2MnXTsKCQkJCX0KCQkJfQoJCX0gZWxzZSBp ZiAoKCR0aGlzbWF0Y2ggPT09ICIhYyIpICYmIGluX2FycmF5KCIhYyIsJGFsbG93ZWQpKSB7 CgkJCS8vIERvbid0IHVzZSBnbG9iYWwgYXJ0aWNsZSBjYXRlZ29yeQoJCQlpZiAoJHByZXRl eHRbJ2MnXSAhPSAiIikgewoJCQkJaWYgKCFpbl9hcnJheSgkcHJldGV4dFsnYyddLCAkbm90 b3V0KSkgewoJCQkJCSRub3RvdXRbXSA9ICRwcmV0ZXh0WydjJ107CgkJCQl9CgkJCX0KCQl9 IGVsc2UgaWYgKCgkdGhpc21hdGNoID09PSAiP3MiKSAmJiBpbl9hcnJheSgiP3MiLCRhbGxv d2VkKSkgewoJCQkvLyBVc2UgYXJ0aWNsZSBzZWN0aW9uCgkJCWlmICgkcHJldGV4dFsncydd ICE9ICIiKSB7CgkJCQlpZiAoIWluX2FycmF5KCRwcmV0ZXh0WydzJ10sICRvdXQpKSB7CgkJ CQkJJG91dFtdID0gJHByZXRleHRbJ3MnXTsKCQkJCX0KCQkJfQoJCX0gZWxzZSBpZiAoKCR0 aGlzbWF0Y2ggPT09ICIhcyIpICYmIGluX2FycmF5KCIhcyIsJGFsbG93ZWQpKSB7CgkJCS8v IERvbid0IHVzZSBhcnRpY2xlIHNlY3Rpb24KCQkJaWYgKCRwcmV0ZXh0WydzJ10gIT0gIiIp IHsKCQkJCWlmICghaW5fYXJyYXkoJHByZXRleHRbJ3MnXSwgJG5vdG91dCkpIHsKCQkJCQkk bm90b3V0W10gPSAkcHJldGV4dFsncyddOwoJCQkJfQoJCQl9CgkJfSBlbHNlIGlmICgoJHRo aXNtYXRjaCA9PT0gIj90IikgJiYgaW5fYXJyYXkoIj90IiwkYWxsb3dlZCkpIHsKCQkJLy8g VXNlIGFydGljbGUgVVJMIHRpdGxlIGlmIHRoaXMgaXMgYW4gYXJ0aWNsZS4KCQkJaWYgKCR0 aGlzYXJ0aWNsZSAhPSBOVUxMICYmICR0aGlzYXJ0aWNsZVsndXJsX3RpdGxlJ10gIT0gIiIp IHsKCQkJCWlmICghaW5fYXJyYXkoJHRoaXNhcnRpY2xlWyd1cmxfdGl0bGUnXSwgJG91dCkp IHsKCQkJCQkkb3V0W10gPSAkdGhpc2FydGljbGVbJ3VybF90aXRsZSddOwoJCQkJfQoJCQl9 CgkJfSBlbHNlIGlmICgoJHRoaXNtYXRjaCA9PT0gIiF0IikgJiYgaW5fYXJyYXkoIiF0Iiwk YWxsb3dlZCkpIHsKCQkJLy8gRG9uJ3QgdXNlIGFydGljbGUgVVJMIHRpdGxlCgkJCWlmICgk dGhpc2FydGljbGUgIT0gTlVMTCAmJiAkdGhpc2FydGljbGVbJ3VybF90aXRsZSddICE9ICIi KSB7CgkJCQlpZiAoIWluX2FycmF5KCR0aGlzYXJ0aWNsZVsndXJsX3RpdGxlJ10sICRub3Rv dXQpKSB7CgkJCQkJJG5vdG91dFtdID0gJHRoaXNhcnRpY2xlWyd1cmxfdGl0bGUnXTsKCQkJ CX0KCQkJfQoJCX0gZWxzZSBpZiAoKCR0aGlzbWF0Y2ggPT09ICI/aWQiKSAmJiBpbl9hcnJh eSgiP2lkIiwkYWxsb3dlZCkpIHsKCQkJLy8gVXNlIGFydGljbGUgSUQsIHByZXBlbmRlZCB3 aXRoICRpZHByZWZpeAoJCQlpZiAoJHRoaXNhcnRpY2xlICE9IE5VTEwpIHsKCQkJCWlmICgh aW5fYXJyYXkoJGlkcHJlZml4IC4gJHByZXRleHRbJ2lkJ10sICRvdXQpKSB7CgkJCQkJJG91 dFtdID0gJGlkcHJlZml4IC4gJHByZXRleHRbJ2lkJ107CgkJCQl9CgkJCX0KCQl9IGVsc2Ug aWYgKCgkdGhpc21hdGNoID09PSAiIWlkIikgJiYgaW5fYXJyYXkoIiFpZCIsJGFsbG93ZWQp KSB7CgkJCS8vIERvbid0IHVzZSBhcnRpY2xlIElECgkJCWlmICgkdGhpc2FydGljbGUgIT0g TlVMTCkgewoJCQkJaWYgKCFpbl9hcnJheSgkaWRwcmVmaXggLiAkcHJldGV4dFsnaWQnXSwg JG5vdG91dCkpIHsKCQkJCQkkbm90b3V0W10gPSAkaWRwcmVmaXggLiAkcHJldGV4dFsnaWQn XTsKCQkJCX0KCQkJfQoJCX0gZWxzZSBpZiAoKCR0aGlzbWF0Y2hbMF0gPT09ICI/IikgJiYg aW5fYXJyYXkoIj9maWVsZCIsJGFsbG93ZWQpKSB7CgkJCS8vIFVzZSB0aGUgZ2l2ZW4gZmll bGQgbmFtZTsgd2hpY2ggbWF5IGJlIGEgY29tbWEtc2VwYXJhdGVkIHN1Ymxpc3QuCgkJCS8v IFNwbGl0IG9mZiB0aGUgZmllbGQgbmFtZSBmcm9tIHRoZSBxdWVzdGlvbiBtYXJrCgkJCSRm aWVsZG5hbWUgPSBzdWJzdHIoJHRoaXNtYXRjaCwxKTsKCQkJaWYgKCgkdGhpc2FydGljbGUg IT0gTlVMTCkgJiYgKGlzc2V0KCR0aGlzYXJ0aWNsZVskZmllbGRuYW1lXSkpKSB7CgkJCQkk ZmllbGRDb250ZW50cyA9ICR0aGlzYXJ0aWNsZVskZmllbGRuYW1lXTsKCQkJfSBlbHNlIHsK CQkJCSRmaWVsZENvbnRlbnRzID0gJGZpZWxkbmFtZTsKCQkJfQoJCQlpZiAoIWVtcHR5KCRm aWVsZENvbnRlbnRzKSkgewoJCQkJJHN1Ym91dCA9IHNtZF9zcGxpdFJhbmdlKHN0cmlwX3Rh Z3MoJGZpZWxkQ29udGVudHMpLCAkc3BsaXRhdCk7CgkJCQlmb3JlYWNoICgkc3Vib3V0IGFz ICRzdWJuYW1lKSB7CgkJCQkJaWYgKCFpbl9hcnJheSgkc3VibmFtZSwgJG91dCkpIHsKCQkJ CQkJJG91dFtdID0gJHN1Ym5hbWU7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfSBlbHNlIGlmICgo JHRoaXNtYXRjaFswXSA9PT0gIiEiKSAmJiBpbl9hcnJheSgiIWZpZWxkIiwkYWxsb3dlZCkp IHsKCQkJLy8gTmVnYXRpb24uIE1heSBlaXRoZXIgYmUgYSBmaWVsZCBuYW1lIChhbmQgbWF5 YmUgYW5vdGhlciBDU0wpIG9yIGEgZml4ZWQgdGVybS4KCQkJLy8gU3BsaXQgb2ZmIHRoZSBu YW1lIGZyb20gdGhlIGV4Y2xhbWF0aW9uIG1hcmsKCQkJJGZpZWxkbmFtZSA9IHN1YnN0cigk dGhpc21hdGNoLDEpOwoJCQlpZiAoKCR0aGlzYXJ0aWNsZSAhPSBOVUxMKSAmJiAoaXNzZXQo JHRoaXNhcnRpY2xlWyRmaWVsZG5hbWVdKSkpIHsKCQkJCSRmaWVsZENvbnRlbnRzID0gJHRo aXNhcnRpY2xlWyRmaWVsZG5hbWVdOwoJCQl9IGVsc2UgewoJCQkJJGZpZWxkQ29udGVudHMg PSAkZmllbGRuYW1lOwoJCQl9CgkJCWlmICghZW1wdHkoJGZpZWxkQ29udGVudHMpKSB7CgkJ CQkkc3Vib3V0ID0gc21kX3NwbGl0UmFuZ2Uoc3RyaXBfdGFncygkZmllbGRDb250ZW50cyks ICRzcGxpdGF0KTsKCQkJCWZvcmVhY2ggKCRzdWJvdXQgYXMgJHN1Ym5hbWUpIHsKCQkJCQlp ZiAoIWluX2FycmF5KCRzdWJuYW1lLCAkbm90b3V0KSkgewoJCQkJCQkkbm90b3V0W10gPSAk c3VibmFtZTsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9IGVsc2UgewoJCQlpZiAoIWluX2FycmF5 KCR0aGlzbWF0Y2gsICRvdXQpKSB7CgkJCQkkb3V0W10gPSAkdGhpc21hdGNoOwoJCQl9CgkJ fQoJfQoJcmV0dXJuIGFycmF5KCRvdXQsJG5vdG91dCk7Cn0KLy8gUmV0dXJuIGFuIGFycmF5 IG9mIGl0ZW1zIGZyb20gYSBzdHJpbmcgb2YgKHVzdWFsbHkpIGNvbW1hLXNlcGFyYXRlZCB2 YWx1ZXMuCi8vIFNvbWUgdmFsdWVzIG1heSBjb250YWluIHJhbmdlcyBvZiBudW1iZXJzIGxp a2UgMS01IHRoYXQgbmVlZCAnZXhwYW5kaW5nJyBmaXJzdApmdW5jdGlvbiBzbWRfc3BsaXRS YW5nZSgkc3RyLCAkc3BsaXRhdD0iLFxzIikgewoJJHJldGFyciA9IGFycmF5KCk7CgkkZWxl bXMgPSBwcmVnX3NwbGl0KCcvWycuJHNwbGl0YXQuJ10rLycsICRzdHIsIC0xLCBQUkVHX1NQ TElUX05PX0VNUFRZKTsKCWZvcmVhY2ggKCRlbGVtcyBhcyAkaXRlbSkgewoJCSRuZWdhdGUg PSBmYWxzZTsKCQkvLyBEb2VzIHRoZSBpdGVtIHN0YXJ0IHdpdGggYSBuZWFnYXRpb24gY2hh cmFjdGVyCgkJaWYgKCRpdGVtWzBdID09ICIhIikgewoJCQkkbmVnYXRlID0gdHJ1ZTsKCQkJ JGl0ZW0gPSBzdWJzdHIoJGl0ZW0sMSk7CgkJfQoJCS8vIElzIHRoZSBpdGVtIGFuIGludGVn ZXIgbGlzdCByYW5nZQoJCWlmIChwcmVnX21hdGNoKCcvKFxkKylcLShcZCspLycsICRpdGVt KSkgewoJCQlsaXN0KCRsbywgJGhpKSA9IGV4cGxvZGUoIi0iLCAkaXRlbSwgMik7CgkJCSRy ZXRhcnIgPSBhcnJheV9tZXJnZSgkcmV0YXJyLCByYW5nZSgkbG8sICRoaSkpOwoJCX0gZWxz ZSB7CgkJCSRyZXRhcnJbXSA9ICRpdGVtOwoJCX0KCQkvLyBOZWdhdGUgZWFjaCBpdGVtIGlm IG5lY2Vzc2FyeQoJCWlmICgkbmVnYXRlKSB7CgkJCWZvciAoJGlkeCA9IDA7ICRpZHggPCBj b3VudCgkcmV0YXJyKTsgJGlkeCsrKSB7CgkJCQkkcmV0YXJyWyRpZHhdID0gIiEiLiRyZXRh cnJbJGlkeF07CgkJCX0KCQl9Cgl9CglyZXR1cm4gJHJldGFycjsKfQovLyBHZW5lcmljIGxv b2t1cCBmdW5jdGlvbiBmb3IgaW50ZXJmYWNpbmcgd2l0aCBNTFAgdG8gbG9jYWxpc2Ugc3Ry aW5ncy4KLy8gICRzdHJheSA9IGFycmF5IG9mIGRlZmF1bHQgc3RyaW5ncwovLyAgJHdoYXQg PSBrZXkgdG8gbG9vayB1cAovLyAgJGFyZ3MgPSBhbnkgYXJndW1lbnRzIHRoZSBrZXkgaXMg ZXhwZWN0aW5nIGZvciByZXBsYWNlbWVudApmdW5jdGlvbiBzbWRfZ1R4dCgkc3RyYXksICR3 aGF0LCAkYXJncyA9IGFycmF5KCkpIHsKCWdsb2JhbCAkdGV4dGFycmF5LCAkc21kTUxQOwoJ JGZuID0gc21kX2dldENhbGxlcigpOwoKCS8vIERyb3Agb3V0IGlmIHRoZSBpZCBpc24ndCBk ZWZpbmVkLgoJLy8gV291bGQgYmUgbmljZSB0byB1c2UgcmVmbGVjdGlvbiB0byBmaW5kIHRo ZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiBhbmQgcGFzcyB0aGF0LAoJLy8gYnV0IHRoYXQncyBQ SFA1IHRlcnJpdG9yeSBvbmx5CglpZiAoZW1wdHkoJGZuKSkgewoJCSRzdHIgPSAkd2hhdDsK CX0gZWxzZSB7CgkJLy8gUHJlcGFyZSB0aGUgcHJlZml4ZWQga2V5IGZvciB1c2UKCQkka2V5 ID0gJHNtZE1MUFskZm5dIC4gJy0nIC4gJHdoYXQ7CgkJJGtleSA9IHN0cnRvbG93ZXIoJGtl eSk7CgoJCS8vIEdyYWIgZnJvbSB0aGUgZ2xvYmFsIHRleHRhcnJheSAocG9zc2libHkgZWRp dGVkIGJ5IE1MUCkgaWYgd2UgY2FuCgkJaWYoaXNzZXQoJHRleHRhcnJheVska2V5XSkpIHsK CQkJJHN0ciA9ICR0ZXh0YXJyYXlbJGtleV07CgkJfSBlbHNlIHsKCQkJLy8gVGhlIHN0cmlu ZyBpc24ndCBpbiB0aGUgbG9jYWxpc2VkICR0ZXh0YXJyYXkgc28gZmFsbGJhY2sgdG8gdXNp bmcKCQkJLy8gdGhlIChub24gcHJlZml4ZWQpIHN0cmluZyBhcnJheSBpbiB0aGUgcGx1Z2lu CgkJCSRrZXkgPSBzdHJ0b2xvd2VyKCR3aGF0KTsKCQkJJHN0ciA9IChpc3NldCgkc3RyYXlb JGtleV0pKSA/ICRzdHJheVska2V5XSA6ICR3aGF0OwoJCX0KCX0KCS8vIFBlcmZvcm0gc3Vi c3RpdHV0aW9ucwoJaWYoIWVtcHR5KCRhcmdzKSkgewoJCSRzdHIgPSBzdHJ0cigkc3RyLCAk YXJncyk7Cgl9CglyZXR1cm4gJHN0cjsKfQovLyBDaGVhdGluZyB3YXkgb2YgZmluZGluZyBh IGZ1bmN0aW9uJ3MgY2FsbGVyCmZ1bmN0aW9uIHNtZF9nZXRDYWxsZXIoKSB7CgkkYmFja3Ry YWNlID0gZGVidWdfYmFja3RyYWNlKCk7CglyZXR1cm4gJGJhY2t0cmFjZVsyXVsnZnVuY3Rp b24nXTsKfQoiO3M6MzoibWQ1IjtzOjMyOiJiYTc5NzZkMTlhNGNlMTE2ZmUwY2Q5NTQ0MzYw YWY0OSI7fQ==