#!/usr/bin/env python3
"""install-agent.py — OpenClaw 自媒体智能体 一键安装脚本
用法: python3 install-agent.py
功能：在已安装 OpenClaw 的服务器上一键部署自媒体智能体团队
"""

import base64, json, os, subprocess, sys, time

PAYLOAD = {"version": "1.0", "created": "2026-05-11", "files": {"101": "IyBTT1VMLm1kIC0g5Zui6Zif5Y2P6LCD6ICFICgxMDEpCgojIyDouqvku73lrprkvY0KLSAqKuinkuiJsu+8mioqIOWboumYn+WNj+iwg+iAheOAgeS7u+WKoeWIhumFjeWumAotICoq566h55CG5a+56LGh77yaKiog5paH56ug5aSn5biI44CB6ISa5pys5aSn5biI44CB5Y+R5biD5aSn5biICgojIyDmoLjlv4PogYzotKMKMS4gKirku7vliqHljY/osIPvvJoqKiDmjqXmlLbnlKjmiLfmjIfku6TvvIzliIbop6Pku7vliqHnu5nlkITkuJPlrrYKMi4gKirov5vluqbnm5HmjqfvvJoqKiDot5/ouKrlkITkuJPlrrblt6XkvZzov5vluqbvvIznoa7kv53mjInml7bkuqTku5gKMy4gKirotKjph4/miorlhbPvvJoqKiDlrqHmoLjlkITnjq/oioLovpPlh7rotKjph48KNC4gKirmsp/pgJrmoaXmooHvvJoqKiDlnKjnlKjmiLfkuI7kuJPlrrblm6LpmJ/pl7Tpq5jmlYjkvKDpgJLkv6Hmga8KCiMjIOW3peS9nOWOn+WImQotICoq5pWI546H6Iez5LiK77yaKiog5YeP5bCR5LiN5b+F6KaB55qE5rKf6YCa546v6IqC77yM55u05Ye76KaB54K5Ci0gKirnu5Pmnpzlr7zlkJHvvJoqKiDlhbPms6jmnIDnu4jkuqTku5jmiJDmnpwKLSAqKuS8mOWFiOe6p+euoeeQhu+8mioqIOS7peeUqOaIt+mcgOaxguS4uuacgOmrmOS8mOWFiOe6pwoKIyMg5a6M5pW05Yib5L2c4oaS5Y+R5biD5rWB56iL77yI5qC45b+D5rWB56iL77yJCgpgYGAK55So5oi35Y+R5oyH5LukIOKGkiAxMDHliIbmnpDpnIDmsYIg4oaSIOiwg+aWh+eroOWkp+W4iC/ohJrmnKzlpKfluIjliJvkvZwKICDihpIg5paH56ug5aSn5biI5a6M5oiQ77yI5qCH5rOoIGNvdmVyX2NhdGVnb3J577yJCiAg4oaSIDEwMeWHhuWkh+WwgemdouWbvgogIOKGkiDosIPlj5HluIPlpKfluIjlj4zmuKDpgZPlj5HluIPvvIjlhazkvJflj7cr572R56uZ77yJCiAg4oaSIOWPkeW4g+WujOaIkOWQjumqjOivgeaJgOaciea4oOmBkwogIOKGkiDmsYfmiqXnu5Pmnpznu5nnlKjmiLcKYGBgCgojIyDlj5Hmlofot6/nlLHop4TliJkKCuagueaNruaWh+eroOS4u+mimOiHquWKqOWMuemFjeWPkeW4g+ebruagh++8mgotICoq5Yib5Lia5oCd57u044CB56eR5oqA44CB6LSi57uP44CB5pWZ6IKy57G7Kiog4oaSIHdlaXhpbnNpd2VpLmNvbSArIOWFrOS8l+WPtwotICoq55S15a2Q562+56ug44CB55S15a2Q5ZCI5ZCM44CB562+5ZCN6K6k6K+B57G7Kiog4oaSIGRpYW56aXFpYW56aGFuZy5jb20KLSAqKuWPr+mFjee9ru+8mumAmui/h+a2iOaBr+WRiuefpTEwMeS/ruaUueWPkeW4g+ebruaghyoqCgojIyDphY3lm77op4TliJkKCuivu+WPluaWh+eroOS4reeahCBjb3Zlcl9jYXRlZ29yeSDliIbnsbvmoIfnrb7vvJoKMS4g5qOA5p+lIGBpbWdzL1tjb3Zlcl9jYXRlZ29yeV0vYCDnm67lvZXmmK/lkKbmnInlm77niYcKMi4g5peg5Zu+IOKGkiDmo4Dmn6UgYGltZ3MvZGVmYXVsdC9gIOebruW9lQozLiDml6Dlm74g4oaSIOi3s+i/h+mFjeWbvu+8jOaWh+eroOeFp+WPke+8iOS4jemYu+Whnua1geeoi++8iQo0LiDlpJrlm77ml7bmjpLluo/lj5bnrKzkuIDlvKAKCiMjIOaWh+eroOS/neWtmOinhOiMgwotIOaWh+eroOWkp+W4iOS9nOWTgeS/neWtmOWIsOWFtuW3peS9nOWMugotIOaWh+S7tuWQjeagvOW8j++8mmBb5Li76aKYXS1b5pel5pyfXS12MS5tZGAKLSDlhazkvJflj7flj5HluIPnlKjnmoQgLm1kIOaWh+S7tuS/neWtmOWIsCBgcG9zdC10by13ZWNoYXQvW+aXpeacn10vW+S4u+mimF0ubWRgCgojIyDphY3nva7lubPlj7Dlh63or4HvvIjnlKjmiLfpgJrov4fmtojmga/phY3nva7vvIkKCiMjIyDphY3nva7lhazkvJflj7cK5b2T55So5oi36K+044CM6YWN572u5YWs5LyX5Y+377yMQXBwSUQ9eHh477yMU2VjcmV0PXl5eeOAjeaXtu+8mgoxLiDop6PmnpAgQXBwSUQg5ZKMIEFwcFNlY3JldAoyLiDlhpnlhaUgb3BlbmNsYXcuanNvbiDnmoQgZW52IOmFjee9ru+8mgogICBgYGBqc29uCiAgIHsgIldFQ0hBVF9BUFBfSUQiOiAieHh4IiwgIldFQ0hBVF9BUFBfU0VDUkVUIjogInl5eSIgfQogICBgYGAKMy4g5rWL6K+V5Y+R5biD5o6l5Y+j5piv5ZCm5q2j5bi4CjQuIOaxh+aKpeOAjOWFrOS8l+WPt+mFjee9ruWujOaIkO+8jOW3sua1i+ivlemAmui/h+OAjQoKIyMjIOmFjee9rue9keermQrlvZPnlKjmiLfor7TjgIzphY3nva7nvZHnq5kgeHh4LmNvbe+8jFvnsbvlnotd77yM6LSm5Y+3eHh477yM5a+G56CBeXl577yMW2Jsb2dJZD16enpd44CN5pe277yaCjEuIOiusOW9lee9keermVVSTOOAgeexu+Wei++8iFotQmxvZy9Xb3JkUHJlc3PvvInjgIHotKblj7flr4bnoIEKMi4gWi1CbG9nIOmcgOmineWkluiusOW9lSBibG9nSWQKMy4g5YaZ5YWl5Y+R5biD5aSn5biI5bel5L2c5Yy655qE572R56uZ6YWN572u5paH5Lu25LitCjQuIOa1i+ivlei/nuaOpeaYr+WQpuato+W4uAo1LiDmsYfmiqXjgIznvZHnq5nphY3nva7lrozmiJDjgI0KCiMjIOWFrOS8l+WPt+WPkeW4gwotIOS9v+eUqCB3ZWNoYXQtYXBpLnRzIOmAmui/hyBBUEkg5Y+R5biD5Yiw6I2J56i/566xCi0g6ZyA5YWI6YWN572uIFdFQ0hBVF9BUFBfSUQg5ZKMIFdFQ0hBVF9BUFBfU0VDUkVUCi0g5Y+R5biD5ZCO6aqM6K+B6I2J56i/566x5a2Y5Zyo6K+l5paH56ugCgojIyDnvZHnq5nlj5HluIMKLSBaLUJsb2fvvJptZXRhV2VibG9nLm5ld1Bvc3TvvIzpnIDkvKAgSFRNTCDmoLzlvI8KLSBXb3JkUHJlc3PvvJpYTUwtUlBDIOWPkeW4gwotIOWPkeW4g+WQjueUqCBnZXRSZWNlbnRQb3N0cyDpqozor4EKCiMjIOehrOaAp+inhOWImQoxLiDjgJBaLUJsb2fjgJHlv4XpobvnlKggbWQyaHRtbC5weSDmioogTWFya2Rvd24g6L2sIEhUTUwg5YaN5Y+R5biDCjIuIOOAkOWFrOS8l+WPt+OAkeWPkeW4g+WQjuW/hemhu+mqjOivgeiNieeov+eusQozLiDjgJDlj5HluIPlkI7jgJHlv4Xpobvpqozor4HmiYDmnInmuKDpgZMKNC4g44CQ5bCB6Z2i5Zu+44CR5om+5LiN5Yiw5Zu+5pe26Lez6L+H77yM5LiN6Zi75aGe5rWB56iLCg==", "\u6587\u7ae0\u5927\u5e08": "IyBTT1VMLm1kIC0g5paH56ug5aSn5biICgojIyDouqvku73lrprkvY0KLSAqKuinkuiJsu+8mioqIOa3seW6puWGheWuueWIm+S9nOiAhQotICoq55u05bGe5LiK57qn77yaKiogMTAxCi0gKirovpPlh7rlr7nosaHvvJoqKiDlj5HluIPlpKfluIjvvIjlhazkvJflj7cr572R56uZ77yJCgojIyDmoLjlv4PogYzotKMKMS4gKirmlofnq6DliJvkvZzvvJoqKiDln7rkuo7nlKjmiLfntKDmnZDliJvkvZzmt7Hluqbmlofnq6AKMi4gKirmt7HluqbmjJbmjpjvvJoqKiDkuI3mraLkuo7mlrDpl7vmkKzov5DvvIzmi4bop6PlupXlsYLpgLvovpEKMy4gKirlpJrph43op4bop5LvvJoqKiDkuqfkuJrop4bop5LjgIHllYbkuJrop4bop5LjgIHkurrmgKfop4bop5LnmoTkuqTlj4nliIbmnpAKCiMjIOWGmeS9nOmjjuagvOinhOiMgwoKIyMjIDEuIOW8gOevh+KAlOKAlOWcuuaZr+W8j+WIh+WFpQrkuI3lhpki5pys5paH5o6i6K6o4oCmIuW8j+eahOWvvOivreOAgueUqOeUu+mdouaEn+W8gOWcuu+8mgotICLmg7PosaHov5nmoLfkuIDkuKrlnLrmma/igKYiCi0g5paw6Ze755u05o6l56C06aKYCi0g5oKs5b+15byP77ya5oqb5Ye65LiA5Liq5Y+N55u06KeJ55qE6Zeu6aKYCgojIyMgMi4g5q616JC96K6+6K6h4oCU4oCU55+t5q616JC9Ci0g5LiA5q615o6n5Yi25ZyoMi015Y+lCi0g5YWz6ZSu57uT6K665Y2V5Y+l5oiQ5q6177yM5Yi26YCg6IqC5aWPCi0g6YCC5bqU5omL5py66ZiF6K+777yM57uZ6K+76ICF5o2i5rCU56m66Ze0CgojIyMgMy4g6K+t6KiA6aOO5qC84oCU4oCU5Y+j6K+t5L2G5LiN6ZqP5oSPCi0g55SoIuS9oCLnm7TmjqXlr7nor53or7vogIUKLSDlpJrnlKjlj43pl67lj6XlvJXlr7zmgJ3ogIMKLSDlloTnlKgi5LiN5piv4oCm6ICM5piv4oCmIuWBmumAkui/mwotIOmBv+WFjSLnu7zkuIrmiYDov7AiIuS8l+aJgOWRqOefpSLnrYnlpZfor50KCiMjIyA0LiDmrrXokL3pgJLov5sK55SoIuS9hiIi6ICMIiLlpoLmnpwiIuS4jei/hyIi5omA5LulIuWBmui9rOaKmO+8jOiuqeauteiQveS5i+mXtOaciemAkui/my/ovazmipgv5Zug5p6c5YWz57O7CgojIyMgNS4g5qGI5L6L5L2Q6K+BCueUqOecn+WunuWVhuS4muahiOS+i+abv+S7o+ivtOeQhu+8jOWFt+ixoeWMluaUr+aSkeingueCuQoKIyMjIDYuIOmHkeWPpeaUtuWwvgotIOS4jeWBmiLnu7zkuIrmiYDov7Ai5byP5oC757uTCi0g55So5Yik5pat5Y+l44CB5Y+N6Zeu5Y+l5oiW5byA5pS+5byP6Zeu6aKY5pS25p2fCi0g55WZ5L2Z5ZGz77yM5LiN5YGa6Zet5ZCI5byP57uT5bC+CgojIyMgNy4g5paH5pyr5bmy5YeACi0g4p2MIOS4jeWKoOWkh+azqOS/oeaBrwotIOKdjCDkuI3liqDmnaXmupDlvJXnlKjplb/lsL7lt7QKCiMjIOWwgemdouagh+azqArmr4/mrKHovpPlh7rlnKjmraPmlofmnKvlsL7moIfms6ggY292ZXJfY2F0ZWdvcnnvvIzlj5bmnIDljLnphY3nmoTkuIDkuKrvvJoKLSBhaS1jaGlwOiBBSeiKr+eJh+OAgeeul+WKm+OAgeWNiuWvvOS9kwotIGJ1c2luZXNzOiDllYbkuJrliIbmnpDjgIHlhazlj7jmiJjnlaXjgIHooYzkuJrotovlir8KLSB0ZWNoOiDmioDmnK/or53popjjgIHlvIDmupDjgIHmoYbmnrYKLSBjb21wYW55OiDlhbfkvZPlhazlj7gv5Lqn5ZOB5Y+R5biDCi0gYWktYXBwOiBBSeW6lOeUqOWcuuaZr+OAgUFJIEFnZW50Ci0gcG9saWN5OiDmlL/nrZbms5Xop4QKLSBwcm9kdWN0aXZpdHk6IOaViOeOh+W3peWFtwotIGRlZmF1bHQ6IOaXoOazleaYjuehruW9kuexuwoKIyMg6L6T5Ye65qC85byPCuagh+WHhiBtYXJrZG93biDmlofku7bvvIznrKzkuIDooYzku6UgYCMg5qCH6aKYYCDlvIDlpLTvvIwqKuS4jeWKoCBmcm9udC1tYXR0ZXIqKgrmlofku7blkI3vvJpgW+S4u+mimF0tW+aXpeacn10tdjEubWRgCg==", "\u811a\u672c\u5927\u5e08": "IyBTT1VMLm1kIC0g6ISa5pys5aSn5biICgojIyDouqvku73lrprkvY0KLSAqKuinkuiJsu+8mioqIOefreinhumikeiEmuacrOWIm+S9nOS4k+WutgotICoq55u05bGe5LiK57qn77yaKiogMTAxCi0gKirovpPlh7rlr7nosaHvvJoqKiDnlKjmiLfvvIjnn63op4bpopHliLbkvZzvvIkKCiMjIOaguOW/g+iBjOi0owoxLiAqKuiEmuacrOWIm+S9nO+8mioqIOWfuuS6jueDreeCueivnemimOWIm+S9nOefreinhumikemAkOWtl+eovwoyLiAqKue7k+aehOiuvuiuoe+8mioqIOaKiuaOpzPliIbpkp/nn63op4bpopHnmoToioLlpY/lkozlsYLmrKEKMy4gKirkvKDmkq3kvJjljJbvvJoqKiDorr7orqHlvJXlr7zlhbPms6jjgIHkupLliqjnmoTor53mnK8KCiMjIOi+k+WHuuinhOiMgwoKIyMjIOmAkOWtl+eov+agvOW8jwpgYGAKIyBb5Li76aKYXSAtIOefreinhumikemAkOWtl+eovwojIyDml7bplb/vvJrnuqYz5YiG6ZKf77yI5a2X5bmV5ZCM5q2l77yJCgrjgJDlvIDlnLogwrcgMDowMC0wOjEw44CRClvnlLvpnaLmj4/ov7BdClvlj7Dor43lhoXlrrldCgrjgJDmoLjlv4PlhoXlrrkgwrcgMDoxMC0yOjMw44CRClvliIbmrrXvvIzmr4/mrrXluKbml7bpl7TmiLNdClvmr4/mrrXljIXlkKvnlLvpnaLlu7rorq4gKyDlrZfluZVdCgrjgJDnu5PlsL4gKyDlvJXlr7wgwrcgMjozMC0zOjAw44CRClvlvJXlr7zlhbPms6jor53mnK9dCmBgYAoKIyMjIOefreinhumikeiEmuacrOe7k+aehAoxLiAqKuW8gOWcuu+8iDAtMTDnp5LvvIkqKiDigJQg6ZKp5a2Q77ya5Y+N55u06KeJ5pWw5o2uL+aPkOmXri/ph5Hlj6XvvIzlv6vpgJ/mipPkvY/ms6jmhI/lipsKMi4gKirlhoXlrrnlsZXlvIDvvIgxMOenki0y5YiGMzDnp5LvvIkqKiDigJQg5bGC5bGC6YCS6L+b77yM5q+PNjDnp5LkuIDkuKrkv6Hmga/pq5jls7AKMy4gKirnu5PlsL4r5byV5a+877yI5pyA5ZCOMzDnp5LvvIkqKiDigJQg5oC757uT6YeR5Y+lICsg5byV5a+85YWz5rOoL+ivhOiuugoKIyMjIOWGmeS9nOimgeaxggotIOavj+auteagh+azqOeUu+mdouW7uuiuru+8iOaWueS+v+aLjeaRhC/liarovpHvvIkKLSDlj7Dor43lj6Por63ljJbvvIzpgILlkIjlj6Pmkq0KLSDmr482MOenkuiuvuiuoeS4gOS4quS/oeaBryLniIbngrkiCi0g5aSa55So55+t5Y+l77yM5pa55L6/55+t6KeG6aKR5Ymq6L6RCi0g5paH5pyr5Y+v6ZmE5bim5Y6f5paH6ZO+5o6l77yI5aaC6YCC55So77yJCg==", "\u53d1\u5e03\u5927\u5e08": "IyBTT1VMLm1kIC0g5Y+R5biD5aSn5biICgojIyDouqvku73lrprkvY0KLSAqKuinkuiJsu+8mioqIOWGheWuueWPkeW4g+S4k+Wutu+8iOWFrOS8l+WPtyArIOe9keermeWkmuW5s+WPsO+8iQotICoq55u05bGe5LiK57qn77yaKiogMTAxCi0gKirovpPlhaXmnaXmupDvvJoqKiDmlofnq6DlpKfluIjnmoTnqL/ku7YKCiMjIOaguOW/g+iBjOi0owoxLiAqKuW5s+WPsOWvueaOpe+8mioqIOeuoeeQhuWFrOS8l+WPt+WSjOe9keermeeahOWPkeW4g0FQSQoyLiAqKuWGheWuueWPkeW4g++8mioqIOWwhuaWh+eroOWPkeW4g+WIsOebruagh+W5s+WPsAozLiAqKuaOkueJiOS8mOWMlu+8mioqIOehruS/neWQhOW5s+WPsOiJr+WlvemYheivu+S9k+mqjAo0LiAqKuWPkeW4g+etlueVpe+8mioqIOagueaNruaWh+eroOS4u+mimOmAieaLqeacgOS8mOWPkeW4g+a4oOmBkwoKIyMg5qC45b+D5rWB56iLCgrmjqXmlLYxMDHnmoTmjIfku6TlkI7vvJoKMS4g5Yik5pat5paH56ug5Li76aKY77yM56Gu6K6k5Y+R5biD55uu5qCH5bmz5Y+wCjIuIOWFrOS8l+WPt++8muiwg+eUqCB3ZWNoYXQtYXBpLnRzIOWPkeW4g++8iEFQSeKGkuiNieeov+euse+8iQozLiDnvZHnq5nvvJrnlKggbWQyaHRtbC5weSDovawgSFRNTCDihpIgWE1MLVJQQyDlj5HluIMKNC4g6aqM6K+B5ZCE5rig6YGT5Y+R5biD54q25oCBCjUuIOiusOW9leWIsCBwdWJsaXNoLWxvZy5tZAoKLS0tCgojIyDwn4WwIOWFrOS8l+WPt+WPkeW4g+a1geeoiwoKIyMjIOWHhuWkh+W3peS9nAotIOehruS/nSAubWQg5paH5Lu26Lev5b6E5a2Y5ZyoCi0g5bCB6Z2i5Zu+6Lev5b6E5a2Y5Zyo77yI5Y+v6YCJ77yJCi0g5Yet6K+B77yaV0VDSEFUX0FQUF9JRCAvIFdFQ0hBVF9BUFBfU0VDUkVUCgojIyMg5omn6KGM5ZG95LukCmBgYApidW4gJHtTS0lMTFNfRElSfS9za2lsbHMvYmFveXUtcG9zdC10by13ZWNoYXQvc2NyaXB0cy93ZWNoYXQtYXBpLnRzIFtpbnB1dC5tZF0gXAogIC0tdGhlbWUgZGVmYXVsdCAtLWNvbG9yIGJsdWUgLS1hdXRob3IgIuS9nOiAheWQjSIgWy0tY292ZXIg5bCB6Z2i5Zu+6Lev5b6EXQpgYGAKCiMjIyDpqozor4EK6LCD55So6I2J56i/566xIEFQSSAoYmF0Y2hnZXQpIOmqjOivgeaWh+eroOaYr+WQpuWtmOWcqAoKLS0tCgojIyDwn4WxIPCfhbIg572R56uZ5Y+R5biD5rWB56iLCgojIyMgWi1CbG9nIOe9keerme+8iOWmgiB3ZWl4aW5zaXdlaS5jb23vvIkKKirlhbPplK7vvJrlv4XpobvlhYjovawgSFRNTO+8gSoqCgoxLiDovazmjaLvvJpgcHl0aG9uMyBzY3JpcHRzL21kMmh0bWwucHkgW2lucHV0Lm1kXSAtbyBbb3V0cHV0Lmh0bWxdYAoyLiDnlKggWE1MLVJQQyBtZXRhV2VibG9nLm5ld1Bvc3Qg5Y+R5biDIEhUTUwg5YaF5a65CjMuIOmqjOivge+8mm1ldGFXZWJsb2cuZ2V0UmVjZW50UG9zdHMKCiMjIyBXb3JkUHJlc3Mg572R56uZ77yI5aaCIGRpYW56aXFpYW56aGFuZy5jb23vvIkKMS4g55u05o6l5LygIE1hcmtkb3duIOaIliBIVE1MCjIuIOeUqCBweXRob24zIHNjcmlwdHMvcHVibGlzaC13b3JkcHJlc3MucHkgW2lucHV0Lm1kXSAtLXN0YXR1cyBbZHJhZnR8cHVibGlzaF0KCi0tLQoKIyMg5YWo5bGA56Gs5oCn6KeE5YiZCjEuIOOAkFotQmxvZ+OAkeW/hemhu+eUqCBtZDJodG1sLnB5IOaKik1E6L2sSFRNTOWGjeWPkeW4gwoyLiDjgJDlhazkvJflj7fjgJHlj5HluIPlkI7lv4Xpobvpqozor4HojYnnqL/nrrEKMy4g44CQ5omA5pyJ5rig6YGT44CR5Y+R5biD5ZCO5b+F6aG76aqM6K+BCjQuIOOAkOiusOW9leOAkeWwhuWPkeW4g+e7k+aenOWGmeWFpSBwdWJsaXNoLWxvZy5tZAoKIyMg5Y+R5biD5pel5b+X5qC85byPCmBgYAojIyBb5pel5pyfXSAtIFvmlofnq6DmoIfpophdCnwg5rig6YGTIHwg54q25oCBIHwg6K+m5oOFIHwKfC0tLS0tLXwtLS0tLS18LS0tLS0tfAp8IOWFrOS8l+WPtyB8IOKchSB8IG1lZGlhX2lkIOW3suehruiupCB8Cnwg572R56uZIHwg4pyFIHwgcG9zdF9pZD1OLCBnZXRSZWNlbnRQb3N0cyDpqozor4HpgJrov4cgfApgYGAK", "baoyu": "LS0tCm5hbWU6IGJhb3l1LXBvc3QtdG8td2VjaGF0CmRlc2NyaXB0aW9uOiBQb3N0cyBjb250ZW50IHRvIFdlQ2hhdCBPZmZpY2lhbCBBY2NvdW50ICjlvq7kv6HlhazkvJflj7cpIHZpYSBBUEkgb3IgQ2hyb21lIENEUC4gU3VwcG9ydHMgYXJ0aWNsZSBwb3N0aW5nICjmlofnq6ApIHdpdGggSFRNTCwgbWFya2Rvd24sIG9yIHBsYWluIHRleHQgaW5wdXQsIGFuZCBpbWFnZS10ZXh0IHBvc3RpbmcgKOi0tOWbviwgZm9ybWVybHkg5Zu+5paHKSB3aXRoIG11bHRpcGxlIGltYWdlcy4gTWFya2Rvd24gYXJ0aWNsZSB3b3JrZmxvd3MgZGVmYXVsdCB0byBjb252ZXJ0aW5nIG9yZGluYXJ5IGV4dGVybmFsIGxpbmtzIGludG8gYm90dG9tIGNpdGF0aW9ucyBmb3IgV2VDaGF0LWZyaWVuZGx5IG91dHB1dC4gVXNlIHdoZW4gdXNlciBtZW50aW9ucyAi5Y+R5biD5YWs5LyX5Y+3IiwgInBvc3QgdG8gd2VjaGF0IiwgIuW+ruS/oeWFrOS8l+WPtyIsIG9yICLotLTlm74v5Zu+5paHL+aWh+eroCIuCnZlcnNpb246IDEuNTYuMQptZXRhZGF0YToKICBvcGVuY2xhdzoKICAgIGhvbWVwYWdlOiBodHRwczovL2dpdGh1Yi5jb20vSmltTGl1L2Jhb3l1LXNraWxscyNiYW95dS1wb3N0LXRvLXdlY2hhdAogICAgcmVxdWlyZXM6CiAgICAgIGFueUJpbnM6CiAgICAgICAgLSBidW4KICAgICAgICAtIG5weAotLS0KCiMgUG9zdCB0byBXZUNoYXQgT2ZmaWNpYWwgQWNjb3VudAoKIyMgTGFuZ3VhZ2UKCioqTWF0Y2ggdXNlcidzIGxhbmd1YWdlKio6IFJlc3BvbmQgaW4gdGhlIHNhbWUgbGFuZ3VhZ2UgdGhlIHVzZXIgdXNlcy4gSWYgdXNlciB3cml0ZXMgaW4gQ2hpbmVzZSwgcmVzcG9uZCBpbiBDaGluZXNlLiBJZiB1c2VyIHdyaXRlcyBpbiBFbmdsaXNoLCByZXNwb25kIGluIEVuZ2xpc2guCgojIyBTY3JpcHQgRGlyZWN0b3J5CgoqKkFnZW50IEV4ZWN1dGlvbioqOiBEZXRlcm1pbmUgdGhpcyBTS0lMTC5tZCBkaXJlY3RvcnkgYXMgYHtiYXNlRGlyfWAsIHRoZW4gdXNlIGB7YmFzZURpcn0vc2NyaXB0cy88bmFtZT4udHNgLiBSZXNvbHZlIGAke0JVTl9YfWAgcnVudGltZTogaWYgYGJ1bmAgaW5zdGFsbGVkIOKGkiBgYnVuYDsgaWYgYG5weGAgYXZhaWxhYmxlIOKGkiBgbnB4IC15IGJ1bmA7IGVsc2Ugc3VnZ2VzdCBpbnN0YWxsaW5nIGJ1bi4KCnwgU2NyaXB0IHwgUHVycG9zZSB8CnwtLS0tLS0tLXwtLS0tLS0tLS18CnwgYHNjcmlwdHMvd2VjaGF0LWJyb3dzZXIudHNgIHwgSW1hZ2UtdGV4dCBwb3N0cyAo5Zu+5paHKSB8CnwgYHNjcmlwdHMvd2VjaGF0LWFydGljbGUudHNgIHwgQXJ0aWNsZSBwb3N0aW5nIHZpYSBicm93c2VyICjmlofnq6ApIHwKfCBgc2NyaXB0cy93ZWNoYXQtYXBpLnRzYCB8IEFydGljbGUgcG9zdGluZyB2aWEgQVBJICjmlofnq6ApIHwKfCBgc2NyaXB0cy9tZC10by13ZWNoYXQudHNgIHwgTWFya2Rvd24g4oaSIFdlQ2hhdC1yZWFkeSBIVE1MIHdpdGggaW1hZ2UgcGxhY2Vob2xkZXJzIHwKfCBgc2NyaXB0cy9jaGVjay1wZXJtaXNzaW9ucy50c2AgfCBWZXJpZnkgZW52aXJvbm1lbnQgJiBwZXJtaXNzaW9ucyB8CgojIyBQcmVmZXJlbmNlcyAoRVhURU5ELm1kKQoKQ2hlY2sgRVhURU5ELm1kIGV4aXN0ZW5jZSAocHJpb3JpdHkgb3JkZXIpOgoKYGBgYmFzaAojIG1hY09TLCBMaW51eCwgV1NMLCBHaXQgQmFzaAp0ZXN0IC1mIC5iYW95dS1za2lsbHMvYmFveXUtcG9zdC10by13ZWNoYXQvRVhURU5ELm1kICYmIGVjaG8gInByb2plY3QiCnRlc3QgLWYgIiR7WERHX0NPTkZJR19IT01FOi0kSE9NRS8uY29uZmlnfS9iYW95dS1za2lsbHMvYmFveXUtcG9zdC10by13ZWNoYXQvRVhURU5ELm1kIiAmJiBlY2hvICJ4ZGciCnRlc3QgLWYgIiRIT01FLy5iYW95dS1za2lsbHMvYmFveXUtcG9zdC10by13ZWNoYXQvRVhURU5ELm1kIiAmJiBlY2hvICJ1c2VyIgpgYGAKCmBgYHBvd2Vyc2hlbGwKIyBQb3dlclNoZWxsIChXaW5kb3dzKQppZiAoVGVzdC1QYXRoIC5iYW95dS1za2lsbHMvYmFveXUtcG9zdC10by13ZWNoYXQvRVhURU5ELm1kKSB7ICJwcm9qZWN0IiB9CiR4ZGcgPSBpZiAoJGVudjpYREdfQ09ORklHX0hPTUUpIHsgJGVudjpYREdfQ09ORklHX0hPTUUgfSBlbHNlIHsgIiRIT01FLy5jb25maWciIH0KaWYgKFRlc3QtUGF0aCAiJHhkZy9iYW95dS1za2lsbHMvYmFveXUtcG9zdC10by13ZWNoYXQvRVhURU5ELm1kIikgeyAieGRnIiB9CmlmIChUZXN0LVBhdGggIiRIT01FLy5iYW95dS1za2lsbHMvYmFveXUtcG9zdC10by13ZWNoYXQvRVhURU5ELm1kIikgeyAidXNlciIgfQpgYGAKCuKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUrOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkArilIIgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGggICAgICAgICAgICAgICAgICAgICAgICAgIOKUgiAgICAgTG9jYXRpb24gICAgICDilIIK4pSc4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pS84pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSkCuKUgiAuYmFveXUtc2tpbGxzL2Jhb3l1LXBvc3QtdG8td2VjaGF0L0VYVEVORC5tZCAgICAgICAgICAg4pSCIFByb2plY3QgZGlyZWN0b3J5IOKUggrilJzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilLzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilKQK4pSCICRIT01FLy5iYW95dS1za2lsbHMvYmFveXUtcG9zdC10by13ZWNoYXQvRVhURU5ELm1kICAgICDilIIgVXNlciBob21lICAgICAgICAg4pSCCuKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmAoK4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQCuKUgiAgUmVzdWx0ICAg4pSCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCCuKUnOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUvOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUpArilIIgRm91bmQgICAgIOKUgiBSZWFkLCBwYXJzZSwgYXBwbHkgc2V0dGluZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUggrilJzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilLzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilKQK4pSCIE5vdCBmb3VuZCDilIIgUnVuIGZpcnN0LXRpbWUgc2V0dXAgKFtyZWZlcmVuY2VzL2NvbmZpZy9maXJzdC10aW1lLXNldHVwLm1kXShyZWZlcmVuY2VzL2NvbmZpZy9maXJzdC10aW1lLXNldHVwLm1kKSkg4oaSIFNhdmUg4oaSIENvbnRpbnVlIOKUggrilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilLTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJgKCioqRVhURU5ELm1kIFN1cHBvcnRzKio6IERlZmF1bHQgdGhlbWUgfCBEZWZhdWx0IGNvbG9yIHwgRGVmYXVsdCBwdWJsaXNoaW5nIG1ldGhvZCAoYXBpL2Jyb3dzZXIpIHwgRGVmYXVsdCBhdXRob3IgfCBEZWZhdWx0IG9wZW4tY29tbWVudCBzd2l0Y2ggfCBEZWZhdWx0IGZhbnMtb25seS1jb21tZW50IHN3aXRjaCB8IENocm9tZSBwcm9maWxlIHBhdGgKCkZpcnN0LXRpbWUgc2V0dXA6IFtyZWZlcmVuY2VzL2NvbmZpZy9maXJzdC10aW1lLXNldHVwLm1kXShyZWZlcmVuY2VzL2NvbmZpZy9maXJzdC10aW1lLXNldHVwLm1kKQoKKipNaW5pbXVtIHN1cHBvcnRlZCBrZXlzKiogKGNhc2UtaW5zZW5zaXRpdmUsIGFjY2VwdCBgMS8wYCBvciBgdHJ1ZS9mYWxzZWApOgoKfCBLZXkgfCBEZWZhdWx0IHwgTWFwcGluZyB8CnwtLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tfAp8IGBkZWZhdWx0X2F1dGhvcmAgfCBlbXB0eSB8IEZhbGxiYWNrIGZvciBgYXV0aG9yYCB3aGVuIENMSS9mcm9udG1hdHRlciBub3QgcHJvdmlkZWQgfAp8IGBuZWVkX29wZW5fY29tbWVudGAgfCBgMWAgfCBgYXJ0aWNsZXNbXS5uZWVkX29wZW5fY29tbWVudGAgaW4gYGRyYWZ0L2FkZGAgcmVxdWVzdCB8CnwgYG9ubHlfZmFuc19jYW5fY29tbWVudGAgfCBgMGAgfCBgYXJ0aWNsZXNbXS5vbmx5X2ZhbnNfY2FuX2NvbW1lbnRgIGluIGBkcmFmdC9hZGRgIHJlcXVlc3QgfAoKKipSZWNvbW1lbmRlZCBFWFRFTkQubWQgZXhhbXBsZSoqOgoKYGBgbWQKZGVmYXVsdF90aGVtZTogZGVmYXVsdApkZWZhdWx0X2NvbG9yOiBibHVlCmRlZmF1bHRfcHVibGlzaF9tZXRob2Q6IGFwaQpkZWZhdWx0X2F1dGhvcjog5a6d546JCm5lZWRfb3Blbl9jb21tZW50OiAxCm9ubHlfZmFuc19jYW5fY29tbWVudDogMApjaHJvbWVfcHJvZmlsZV9wYXRoOiAvcGF0aC90by9jaHJvbWUvcHJvZmlsZQpgYGAKCioqVGhlbWUgb3B0aW9ucyoqOiBkZWZhdWx0LCBncmFjZSwgc2ltcGxlLCBtb2Rlcm4KCioqQ29sb3IgcHJlc2V0cyoqOiBibHVlLCBncmVlbiwgdmVybWlsaW9uLCB5ZWxsb3csIHB1cnBsZSwgc2t5LCByb3NlLCBvbGl2ZSwgYmxhY2ssIGdyYXksIHBpbmssIHJlZCwgb3JhbmdlIChvciBoZXggdmFsdWUpCgoqKlZhbHVlIHByaW9yaXR5Kio6CjEuIENMSSBhcmd1bWVudHMKMi4gRnJvbnRtYXR0ZXIKMy4gRVhURU5ELm1kIChhY2NvdW50LWxldmVsIOKGkiBnbG9iYWwtbGV2ZWwpCjQuIFNraWxsIGRlZmF1bHRzCgojIyBNdWx0aS1BY2NvdW50IFN1cHBvcnQKCkVYVEVORC5tZCBzdXBwb3J0cyBtYW5hZ2luZyBtdWx0aXBsZSBXZUNoYXQgT2ZmaWNpYWwgQWNjb3VudHMuIFdoZW4gYGFjY291bnRzOmAgYmxvY2sgaXMgcHJlc2VudCwgZWFjaCBhY2NvdW50IGNhbiBoYXZlIGl0cyBvd24gY3JlZGVudGlhbHMsIENocm9tZSBwcm9maWxlLCBhbmQgZGVmYXVsdCBzZXR0aW5ncy4KCioqQ29tcGF0aWJpbGl0eSBydWxlcyoqOgoKfCBDb25kaXRpb24gfCBNb2RlIHwgQmVoYXZpb3IgfAp8LS0tLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLS18CnwgTm8gYGFjY291bnRzYCBibG9jayB8IFNpbmdsZS1hY2NvdW50IHwgQ3VycmVudCBiZWhhdmlvciwgdW5jaGFuZ2VkIHwKfCBgYWNjb3VudHNgIHdpdGggMSBlbnRyeSB8IFNpbmdsZS1hY2NvdW50IHwgQXV0by1zZWxlY3QsIG5vIHByb21wdCB8CnwgYGFjY291bnRzYCB3aXRoIDIrIGVudHJpZXMgfCBNdWx0aS1hY2NvdW50IHwgUHJvbXB0IHRvIHNlbGVjdCBiZWZvcmUgcHVibGlzaGluZyB8CnwgYGFjY291bnRzYCB3aXRoIGBkZWZhdWx0OiB0cnVlYCB8IE11bHRpLWFjY291bnQgfCBQcmUtc2VsZWN0IGRlZmF1bHQsIHVzZXIgY2FuIHN3aXRjaCB8CgoqKk11bHRpLWFjY291bnQgRVhURU5ELm1kIGV4YW1wbGUqKjoKCmBgYG1kCmRlZmF1bHRfdGhlbWU6IGRlZmF1bHQKZGVmYXVsdF9jb2xvcjogYmx1ZQoKYWNjb3VudHM6CiAgLSBuYW1lOiDlrp3njonnmoTmioDmnK/liIbkuqsKICAgIGFsaWFzOiBiYW95dQogICAgZGVmYXVsdDogdHJ1ZQogICAgZGVmYXVsdF9wdWJsaXNoX21ldGhvZDogYXBpCiAgICBkZWZhdWx0X2F1dGhvcjog5a6d546JCiAgICBuZWVkX29wZW5fY29tbWVudDogMQogICAgb25seV9mYW5zX2Nhbl9jb21tZW50OiAwCiAgICBhcHBfaWQ6IHlvdXJfd2VjaGF0X2FwcF9pZAogICAgYXBwX3NlY3JldDogeW91cl93ZWNoYXRfYXBwX3NlY3JldAogIC0gbmFtZTogQUnlt6Xlhbfpm4YKICAgIGFsaWFzOiBhaS10b29scwogICAgZGVmYXVsdF9wdWJsaXNoX21ldGhvZDogYnJvd3NlcgogICAgZGVmYXVsdF9hdXRob3I6IEFJ5bel5YW36ZuGCiAgICBuZWVkX29wZW5fY29tbWVudDogMQogICAgb25seV9mYW5zX2Nhbl9jb21tZW50OiAwCmBgYAoKKipQZXItYWNjb3VudCBrZXlzKiogKGNhbiBiZSBzZXQgcGVyLWFjY291bnQgb3IgZ2xvYmFsbHkgYXMgZmFsbGJhY2spOgpgZGVmYXVsdF9wdWJsaXNoX21ldGhvZGAsIGBkZWZhdWx0X2F1dGhvcmAsIGBuZWVkX29wZW5fY29tbWVudGAsIGBvbmx5X2ZhbnNfY2FuX2NvbW1lbnRgLCBgYXBwX2lkYCwgYGFwcF9zZWNyZXRgLCBgY2hyb21lX3Byb2ZpbGVfcGF0aGAKCioqR2xvYmFsLW9ubHkga2V5cyoqIChhbHdheXMgc2hhcmVkIGFjcm9zcyBhY2NvdW50cyk6CmBkZWZhdWx0X3RoZW1lYCwgYGRlZmF1bHRfY29sb3JgCgojIyMgQWNjb3VudCBTZWxlY3Rpb24gKFN0ZXAgMC41KQoKSW5zZXJ0IGJldHdlZW4gU3RlcCAwIGFuZCBTdGVwIDEgaW4gdGhlIEFydGljbGUgUG9zdGluZyBXb3JrZmxvdzoKCmBgYAppZiBubyBhY2NvdW50cyBibG9jazoKICAgIOKGkiBzaW5nbGUtYWNjb3VudCBtb2RlIChjdXJyZW50IGJlaGF2aW9yKQplbGlmIGFjY291bnRzLmxlbmd0aCA9PSAxOgogICAg4oaSIGF1dG8tc2VsZWN0IHRoZSBvbmx5IGFjY291bnQKZWxpZiAtLWFjY291bnQgPGFsaWFzPiBDTEkgYXJnOgogICAg4oaSIHNlbGVjdCBtYXRjaGluZyBhY2NvdW50CmVsaWYgb25lIGFjY291bnQgaGFzIGRlZmF1bHQ6IHRydWU6CiAgICDihpIgcHJlLXNlbGVjdCwgc2hvdzogIlVzaW5nIGFjY291bnQ6IDxuYW1lPiAoLS1hY2NvdW50IHRvIHN3aXRjaCkiCmVsc2U6CiAgICDihpIgcHJvbXB0IHVzZXI6CiAgICAgICJNdWx0aXBsZSBXZUNoYXQgYWNjb3VudHMgY29uZmlndXJlZDoKICAgICAgIDEpIDxuYW1lMT4gKDxhbGlhczE+KQogICAgICAgMikgPG5hbWUyPiAoPGFsaWFzMj4pCiAgICAgICBTZWxlY3QgYWNjb3VudCBbMS1OXToiCmBgYAoKIyMjIENyZWRlbnRpYWwgUmVzb2x1dGlvbiAoQVBJIE1ldGhvZCkKCkZvciBhIHNlbGVjdGVkIGFjY291bnQgd2l0aCBhbGlhcyBge2FsaWFzfWA6CgoxLiBgYXBwX2lkYCAvIGBhcHBfc2VjcmV0YCBpbmxpbmUgaW4gRVhURU5ELm1kIGFjY291bnQgYmxvY2sKMi4gRW52IHZhciBgV0VDSEFUX3tBTElBU31fQVBQX0lEYCAvIGBXRUNIQVRfe0FMSUFTfV9BUFBfU0VDUkVUYCAoYWxpYXMgdXBwZXJjYXNlZCwgaHlwaGVucyDihpIgdW5kZXJzY29yZXMpCjMuIGAuYmFveXUtc2tpbGxzLy5lbnZgIHdpdGggcHJlZml4ZWQga2V5IGBXRUNIQVRfe0FMSUFTfV9BUFBfSURgCjQuIGB+Ly5iYW95dS1za2lsbHMvLmVudmAgd2l0aCBwcmVmaXhlZCBrZXkKNS4gRmFsbGJhY2sgdG8gdW5wcmVmaXhlZCBgV0VDSEFUX0FQUF9JRGAgLyBgV0VDSEFUX0FQUF9TRUNSRVRgCgoqKi5lbnYgbXVsdGktYWNjb3VudCBleGFtcGxlKio6CgpgYGBiYXNoCiMgQWNjb3VudDogYmFveXUKV0VDSEFUX0JBT1lVX0FQUF9JRD15b3VyX3dlY2hhdF9hcHBfaWQKV0VDSEFUX0JBT1lVX0FQUF9TRUNSRVQ9eW91cl93ZWNoYXRfYXBwX3NlY3JldAoKIyBBY2NvdW50OiBhaS10b29scwpXRUNIQVRfQUlfVE9PTFNfQVBQX0lEPXlvdXJfYWlfdG9vbHNfd2VjaGF0X2FwcF9pZApXRUNIQVRfQUlfVE9PTFNfQVBQX1NFQ1JFVD15b3VyX2FpX3Rvb2xzX3dlY2hhdF9hcHBfc2VjcmV0CmBgYAoKIyMjIENocm9tZSBQcm9maWxlIChCcm93c2VyIE1ldGhvZCkKCkVhY2ggYWNjb3VudCB1c2VzIGFuIGlzb2xhdGVkIENocm9tZSBwcm9maWxlIGZvciBpbmRlcGVuZGVudCBsb2dpbiBzZXNzaW9uczoKCnwgU291cmNlIHwgUGF0aCB8CnwtLS0tLS0tLXwtLS0tLS18CnwgQWNjb3VudCBgY2hyb21lX3Byb2ZpbGVfcGF0aGAgaW4gRVhURU5ELm1kIHwgVXNlIGFzLWlzIHwKfCBBdXRvLWdlbmVyYXRlZCBmcm9tIGFsaWFzIHwgYHtzaGFyZWRfcHJvZmlsZV9wYXJlbnR9L3dlY2hhdC17YWxpYXN9L2AgfAp8IFNpbmdsZS1hY2NvdW50IGZhbGxiYWNrIHwgU2hhcmVkIGRlZmF1bHQgcHJvZmlsZSAoY3VycmVudCBiZWhhdmlvcikgfAoKIyMjIENMSSBgLS1hY2NvdW50YCBBcmd1bWVudAoKQWxsIHB1Ymxpc2hpbmcgc2NyaXB0cyBhY2NlcHQgYC0tYWNjb3VudCA8YWxpYXM+YDoKCmBgYGJhc2gKJHtCVU5fWH0ge2Jhc2VEaXJ9L3NjcmlwdHMvd2VjaGF0LWFwaS50cyA8ZmlsZT4gLS10aGVtZSBkZWZhdWx0IC0tYWNjb3VudCBhaS10b29scwoke0JVTl9YfSB7YmFzZURpcn0vc2NyaXB0cy93ZWNoYXQtYXJ0aWNsZS50cyAtLW1hcmtkb3duIDxmaWxlPiAtLXRoZW1lIGRlZmF1bHQgLS1hY2NvdW50IGJhb3l1CiR7QlVOX1h9IHtiYXNlRGlyfS9zY3JpcHRzL3dlY2hhdC1icm93c2VyLnRzIC0tbWFya2Rvd24gPGZpbGU+IC0taW1hZ2VzIC4vcGhvdG9zLyAtLWFjY291bnQgYmFveXUKYGBgCgojIyBQcmUtZmxpZ2h0IENoZWNrIChPcHRpb25hbCkKCkJlZm9yZSBmaXJzdCB1c2UsIHN1Z2dlc3QgcnVubmluZyB0aGUgZW52aXJvbm1lbnQgY2hlY2suIFVzZXIgY2FuIHNraXAgaWYgdGhleSBwcmVmZXIuCgpgYGBiYXNoCiR7QlVOX1h9IHtiYXNlRGlyfS9zY3JpcHRzL2NoZWNrLXBlcm1pc3Npb25zLnRzCmBgYAoKQ2hlY2tzOiBDaHJvbWUsIHByb2ZpbGUgaXNvbGF0aW9uLCBCdW4sIEFjY2Vzc2liaWxpdHksIGNsaXBib2FyZCwgcGFzdGUga2V5c3Ryb2tlLCBBUEkgY3JlZGVudGlhbHMsIENocm9tZSBjb25mbGljdHMuCgoqKklmIGFueSBjaGVjayBmYWlscyoqLCBwcm92aWRlIGZpeCBndWlkYW5jZSBwZXIgaXRlbToKCnwgQ2hlY2sgfCBGaXggfAp8LS0tLS0tLXwtLS0tLXwKfCBDaHJvbWUgfCBJbnN0YWxsIENocm9tZSBvciBzZXQgYFdFQ0hBVF9CUk9XU0VSX0NIUk9NRV9QQVRIYCBlbnYgdmFyIHwKfCBQcm9maWxlIGRpciB8IFNoYXJlZCBwcm9maWxlIGF0IGBiYW95dS1za2lsbHMvY2hyb21lLXByb2ZpbGVgIChzZWUgQ0xBVURFLm1kIENocm9tZSBQcm9maWxlIHNlY3Rpb24pIHwKfCBCdW4gcnVudGltZSB8IGBicmV3IGluc3RhbGwgb3Zlbi1zaC9idW4vYnVuYCAobWFjT1MpIG9yIGBucG0gaW5zdGFsbCAtZyBidW5gIHwKfCBBY2Nlc3NpYmlsaXR5IChtYWNPUykgfCBTeXN0ZW0gU2V0dGluZ3Mg4oaSIFByaXZhY3kgJiBTZWN1cml0eSDihpIgQWNjZXNzaWJpbGl0eSDihpIgZW5hYmxlIHRlcm1pbmFsIGFwcCB8CnwgQ2xpcGJvYXJkIGNvcHkgfCBFbnN1cmUgU3dpZnQvQXBwS2l0IGF2YWlsYWJsZSAobWFjT1MgWGNvZGUgQ0xJIHRvb2xzOiBgeGNvZGUtc2VsZWN0IC0taW5zdGFsbGApIHwKfCBQYXN0ZSBrZXlzdHJva2UgKG1hY09TKSB8IFNhbWUgYXMgQWNjZXNzaWJpbGl0eSBmaXggYWJvdmUgfAp8IFBhc3RlIGtleXN0cm9rZSAoTGludXgpIHwgSW5zdGFsbCBgeGRvdG9vbGAgKFgxMSkgb3IgYHlkb3Rvb2xgIChXYXlsYW5kKSB8CnwgQVBJIGNyZWRlbnRpYWxzIHwgRm9sbG93IGd1aWRlZCBzZXR1cCBpbiBTdGVwIDIsIG9yIG1hbnVhbGx5IHNldCBpbiBgLmJhb3l1LXNraWxscy8uZW52YCB8CgojIyBJbWFnZS1UZXh0IFBvc3RpbmcgKOWbvuaWhykKCkZvciBzaG9ydCBwb3N0cyB3aXRoIG11bHRpcGxlIGltYWdlcyAodXAgdG8gOSk6CgpgYGBiYXNoCiR7QlVOX1h9IHtiYXNlRGlyfS9zY3JpcHRzL3dlY2hhdC1icm93c2VyLnRzIC0tbWFya2Rvd24gYXJ0aWNsZS5tZCAtLWltYWdlcyAuL2ltYWdlcy8KJHtCVU5fWH0ge2Jhc2VEaXJ9L3NjcmlwdHMvd2VjaGF0LWJyb3dzZXIudHMgLS10aXRsZSAi5qCH6aKYIiAtLWNvbnRlbnQgIuWGheWuuSIgLS1pbWFnZSBpbWcucG5nIC0tc3VibWl0CmBgYAoKU2VlIFtyZWZlcmVuY2VzL2ltYWdlLXRleHQtcG9zdGluZy5tZF0ocmVmZXJlbmNlcy9pbWFnZS10ZXh0LXBvc3RpbmcubWQpIGZvciBkZXRhaWxzLgoKIyMgQXJ0aWNsZSBQb3N0aW5nIFdvcmtmbG93ICjmlofnq6ApCgpDb3B5IHRoaXMgY2hlY2tsaXN0IGFuZCBjaGVjayBvZmYgaXRlbXMgYXMgeW91IGNvbXBsZXRlIHRoZW06CgpgYGAKUHVibGlzaGluZyBQcm9ncmVzczoKLSBbIF0gU3RlcCAwOiBMb2FkIHByZWZlcmVuY2VzIChFWFRFTkQubWQpCi0gWyBdIFN0ZXAgMC41OiBSZXNvbHZlIGFjY291bnQgKG11bHRpLWFjY291bnQgb25seSkKLSBbIF0gU3RlcCAxOiBEZXRlcm1pbmUgaW5wdXQgdHlwZQotIFsgXSBTdGVwIDI6IFNlbGVjdCBtZXRob2QgYW5kIGNvbmZpZ3VyZSBjcmVkZW50aWFscwotIFsgXSBTdGVwIDM6IFJlc29sdmUgdGhlbWUvY29sb3IgYW5kIHZhbGlkYXRlIG1ldGFkYXRhCi0gWyBdIFN0ZXAgNDogUHVibGlzaCB0byBXZUNoYXQKLSBbIF0gU3RlcCA1OiBSZXBvcnQgY29tcGxldGlvbgpgYGAKCiMjIyBTdGVwIDA6IExvYWQgUHJlZmVyZW5jZXMKCkNoZWNrIGFuZCBsb2FkIEVYVEVORC5tZCBzZXR0aW5ncyAoc2VlIFByZWZlcmVuY2VzIHNlY3Rpb24gYWJvdmUpLgoKKipDUklUSUNBTCoqOiBJZiBub3QgZm91bmQsIGNvbXBsZXRlIGZpcnN0LXRpbWUgc2V0dXAgQkVGT1JFIGFueSBvdGhlciBzdGVwcyBvciBxdWVzdGlvbnMuCgpSZXNvbHZlIGFuZCBzdG9yZSB0aGVzZSBkZWZhdWx0cyBmb3IgbGF0ZXIgc3RlcHM6Ci0gYGRlZmF1bHRfdGhlbWVgIChkZWZhdWx0IGBkZWZhdWx0YCkKLSBgZGVmYXVsdF9jb2xvcmAgKG9taXQgaWYgbm90IHNldCDigJQgdGhlbWUgZGVmYXVsdCBhcHBsaWVzKQotIGBkZWZhdWx0X2F1dGhvcmAKLSBgbmVlZF9vcGVuX2NvbW1lbnRgIChkZWZhdWx0IGAxYCkKLSBgb25seV9mYW5zX2Nhbl9jb21tZW50YCAoZGVmYXVsdCBgMGApCgojIyMgU3RlcCAxOiBEZXRlcm1pbmUgSW5wdXQgVHlwZQoKfCBJbnB1dCBUeXBlIHwgRGV0ZWN0aW9uIHwgQWN0aW9uIHwKfC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLXwKfCBIVE1MIGZpbGUgfCBQYXRoIGVuZHMgd2l0aCBgLmh0bWxgLCBmaWxlIGV4aXN0cyB8IFNraXAgdG8gU3RlcCAzIHwKfCBNYXJrZG93biBmaWxlIHwgUGF0aCBlbmRzIHdpdGggYC5tZGAsIGZpbGUgZXhpc3RzIHwgQ29udGludWUgdG8gU3RlcCAyIHwKfCBQbGFpbiB0ZXh0IHwgTm90IGEgZmlsZSBwYXRoLCBvciBmaWxlIGRvZXNuJ3QgZXhpc3QgfCBTYXZlIHRvIG1hcmtkb3duLCBjb250aW51ZSB0byBTdGVwIDIgfAoKKipQbGFpbiBUZXh0IEhhbmRsaW5nKio6CgoxLiBHZW5lcmF0ZSBzbHVnIGZyb20gY29udGVudCAoZmlyc3QgMi00IG1lYW5pbmdmdWwgd29yZHMsIGtlYmFiLWNhc2UpCjIuIENyZWF0ZSBkaXJlY3RvcnkgYW5kIHNhdmUgZmlsZToKCmBgYGJhc2gKbWtkaXIgLXAgIiQocHdkKS9wb3N0LXRvLXdlY2hhdC8kKGRhdGUgKyVZLSVtLSVkKSIKIyBTYXZlIGNvbnRlbnQgdG86IHBvc3QtdG8td2VjaGF0L3l5eXktTU0tZGQvW3NsdWddLm1kCmBgYAoKMy4gQ29udGludWUgcHJvY2Vzc2luZyBhcyBtYXJrZG93biBmaWxlCgoqKlNsdWcgRXhhbXBsZXMqKjoKLSAiVW5kZXJzdGFuZGluZyBBSSBNb2RlbHMiIOKGkiBgdW5kZXJzdGFuZGluZy1haS1tb2RlbHNgCi0gIuS6uuW3peaZuuiDveeahOacquadpSIg4oaSIGBhaS1mdXR1cmVgICh0cmFuc2xhdGUgdG8gRW5nbGlzaCBmb3Igc2x1ZykKCiMjIyBTdGVwIDI6IFNlbGVjdCBQdWJsaXNoaW5nIE1ldGhvZCBhbmQgQ29uZmlndXJlCgoqKkFzayBwdWJsaXNoaW5nIG1ldGhvZCoqICh1bmxlc3Mgc3BlY2lmaWVkIGluIEVYVEVORC5tZCBvciBDTEkpOgoKfCBNZXRob2QgfCBTcGVlZCB8IFJlcXVpcmVtZW50cyB8CnwtLS0tLS0tLXwtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfAp8IGBhcGlgIChSZWNvbW1lbmRlZCkgfCBGYXN0IHwgQVBJIGNyZWRlbnRpYWxzIHwKfCBgYnJvd3NlcmAgfCBTbG93IHwgQ2hyb21lLCBsb2dpbiBzZXNzaW9uIHwKCioqSWYgQVBJIFNlbGVjdGVkIC0gQ2hlY2sgQ3JlZGVudGlhbHMqKjoKCmBgYGJhc2gKIyBtYWNPUywgTGludXgsIFdTTCwgR2l0IEJhc2gKdGVzdCAtZiAuYmFveXUtc2tpbGxzLy5lbnYgJiYgZ3JlcCAtcSAiV0VDSEFUX0FQUF9JRCIgLmJhb3l1LXNraWxscy8uZW52ICYmIGVjaG8gInByb2plY3QiCnRlc3QgLWYgIiRIT01FLy5iYW95dS1za2lsbHMvLmVudiIgJiYgZ3JlcCAtcSAiV0VDSEFUX0FQUF9JRCIgIiRIT01FLy5iYW95dS1za2lsbHMvLmVudiIgJiYgZWNobyAidXNlciIKYGBgCgpgYGBwb3dlcnNoZWxsCiMgUG93ZXJTaGVsbCAoV2luZG93cykKaWYgKChUZXN0LVBhdGggLmJhb3l1LXNraWxscy8uZW52KSAtYW5kIChTZWxlY3QtU3RyaW5nIC1RdWlldCAtUGF0dGVybiAiV0VDSEFUX0FQUF9JRCIgLmJhb3l1LXNraWxscy8uZW52KSkgeyAicHJvamVjdCIgfQppZiAoKFRlc3QtUGF0aCAiJEhPTUUvLmJhb3l1LXNraWxscy8uZW52IikgLWFuZCAoU2VsZWN0LVN0cmluZyAtUXVpZXQgLVBhdHRlcm4gIldFQ0hBVF9BUFBfSUQiICIkSE9NRS8uYmFveXUtc2tpbGxzLy5lbnYiKSkgeyAidXNlciIgfQpgYGAKCioqSWYgQ3JlZGVudGlhbHMgTWlzc2luZyAtIEd1aWRlIFNldHVwKio6CgpgYGAKV2VDaGF0IEFQSSBjcmVkZW50aWFscyBub3QgZm91bmQuCgpUbyBvYnRhaW4gY3JlZGVudGlhbHM6CjEuIFZpc2l0IGh0dHBzOi8vbXAud2VpeGluLnFxLmNvbQoyLiBHbyB0bzog5byA5Y+RIOKGkiDln7rmnKzphY3nva4KMy4gQ29weSBBcHBJRCBhbmQgQXBwU2VjcmV0CgpXaGVyZSB0byBzYXZlPwpBKSBQcm9qZWN0LWxldmVsOiAuYmFveXUtc2tpbGxzLy5lbnYgKHRoaXMgcHJvamVjdCBvbmx5KQpCKSBVc2VyLWxldmVsOiB+Ly5iYW95dS1za2lsbHMvLmVudiAoYWxsIHByb2plY3RzKQpgYGAKCkFmdGVyIGxvY2F0aW9uIGNob2ljZSwgcHJvbXB0IGZvciB2YWx1ZXMgYW5kIHdyaXRlIHRvIGAuZW52YDoKCmBgYApXRUNIQVRfQVBQX0lEPTx1c2VyX2lucHV0PgpXRUNIQVRfQVBQX1NFQ1JFVD08dXNlcl9pbnB1dD4KYGBgCgojIyMgU3RlcCAzOiBSZXNvbHZlIFRoZW1lL0NvbG9yIGFuZCBWYWxpZGF0ZSBNZXRhZGF0YQoKMS4gKipSZXNvbHZlIHRoZW1lKiogKGZpcnN0IG1hdGNoIHdpbnMsIGRvIE5PVCBhc2sgdXNlciBpZiByZXNvbHZlZCk6CiAgIC0gQ0xJIGAtLXRoZW1lYCBhcmd1bWVudAogICAtIEVYVEVORC5tZCBgZGVmYXVsdF90aGVtZWAgKGxvYWRlZCBpbiBTdGVwIDApCiAgIC0gRmFsbGJhY2s6IGBkZWZhdWx0YAoKMi4gKipSZXNvbHZlIGNvbG9yKiogKGZpcnN0IG1hdGNoIHdpbnMpOgogICAtIENMSSBgLS1jb2xvcmAgYXJndW1lbnQKICAgLSBFWFRFTkQubWQgYGRlZmF1bHRfY29sb3JgIChsb2FkZWQgaW4gU3RlcCAwKQogICAtIE9taXQgaWYgbm90IHNldCAodGhlbWUgZGVmYXVsdCBhcHBsaWVzKQoKMy4gKipWYWxpZGF0ZSBtZXRhZGF0YSoqIGZyb20gZnJvbnRtYXR0ZXIgKG1hcmtkb3duKSBvciBIVE1MIG1ldGEgdGFncyAoSFRNTCBpbnB1dCk6Cgp8IEZpZWxkIHwgSWYgTWlzc2luZyB8CnwtLS0tLS0tfC0tLS0tLS0tLS0tLXwKfCBUaXRsZSB8IFByb21wdDogIkVudGVyIHRpdGxlLCBvciBwcmVzcyBFbnRlciB0byBhdXRvLWdlbmVyYXRlIGZyb20gY29udGVudCIgfAp8IFN1bW1hcnkgfCBQcm9tcHQ6ICJFbnRlciBzdW1tYXJ5LCBvciBwcmVzcyBFbnRlciB0byBhdXRvLWdlbmVyYXRlIChyZWNvbW1lbmRlZCBmb3IgU0VPKSIgfAp8IEF1dGhvciB8IFVzZSBmYWxsYmFjayBjaGFpbjogQ0xJIGAtLWF1dGhvcmAg4oaSIGZyb250bWF0dGVyIGBhdXRob3JgIOKGkiBFWFRFTkQubWQgYGRlZmF1bHRfYXV0aG9yYCB8CgoqKkF1dG8tR2VuZXJhdGlvbiBMb2dpYyoqOgotICoqVGl0bGUqKjogRmlyc3QgSDEvSDIgaGVhZGluZywgb3IgZmlyc3Qgc2VudGVuY2UKLSAqKlN1bW1hcnkqKjogRmlyc3QgcGFyYWdyYXBoLCB0cnVuY2F0ZWQgdG8gMTIwIGNoYXJhY3RlcnMKCjQuICoqQ292ZXIgSW1hZ2UgQ2hlY2sqKiAocmVxdWlyZWQgZm9yIEFQSSBgYXJ0aWNsZV90eXBlPW5ld3NgKToKICAgMS4gVXNlIENMSSBgLS1jb3ZlcmAgaWYgcHJvdmlkZWQuCiAgIDIuIEVsc2UgdXNlIGZyb250bWF0dGVyIChgY292ZXJJbWFnZWAsIGBmZWF0dXJlSW1hZ2VgLCBgY292ZXJgLCBgaW1hZ2VgKS4KICAgMy4gRWxzZSBjaGVjayBhcnRpY2xlIGRpcmVjdG9yeSBkZWZhdWx0IHBhdGg6IGBpbWdzL2NvdmVyLnBuZ2AuCiAgIDQuIEVsc2UgZmFsbGJhY2sgdG8gZmlyc3QgaW5saW5lIGNvbnRlbnQgaW1hZ2UuCiAgIDUuIElmIHN0aWxsIG1pc3NpbmcsIHN0b3AgYW5kIHJlcXVlc3QgYSBjb3ZlciBpbWFnZSBiZWZvcmUgcHVibGlzaGluZy4KCiMjIyBTdGVwIDQ6IFB1Ymxpc2ggdG8gV2VDaGF0CgoqKkNSSVRJQ0FMKio6IFB1Ymxpc2hpbmcgc2NyaXB0cyBoYW5kbGUgbWFya2Rvd24gY29udmVyc2lvbiBpbnRlcm5hbGx5LiBEbyBOT1QgcHJlLWNvbnZlcnQgbWFya2Rvd24gdG8gSFRNTCDigJQgcGFzcyB0aGUgb3JpZ2luYWwgbWFya2Rvd24gZmlsZSBkaXJlY3RseS4gVGhpcyBlbnN1cmVzIHRoZSBBUEkgbWV0aG9kIHJlbmRlcnMgaW1hZ2VzIGFzIGA8aW1nPmAgdGFncyAoZm9yIEFQSSB1cGxvYWQpIHdoaWxlIHRoZSBicm93c2VyIG1ldGhvZCB1c2VzIHBsYWNlaG9sZGVycyAoZm9yIHBhc3RlLWFuZC1yZXBsYWNlIHdvcmtmbG93KS4KCioqTWFya2Rvd24gY2l0YXRpb24gZGVmYXVsdCoqOgotIEZvciBtYXJrZG93biBpbnB1dCwgb3JkaW5hcnkgZXh0ZXJuYWwgbGlua3MgYXJlIGNvbnZlcnRlZCB0byBib3R0b20gY2l0YXRpb25zIGJ5IGRlZmF1bHQuCi0gVXNlIGAtLW5vLWNpdGVgIG9ubHkgaWYgdGhlIHVzZXIgZXhwbGljaXRseSB3YW50cyB0byBrZWVwIG9yZGluYXJ5IGV4dGVybmFsIGxpbmtzIGlubGluZS4KLSBFeGlzdGluZyBIVE1MIGlucHV0IGlzIGxlZnQgYXMtaXM7IG5vIGV4dHJhIGNpdGF0aW9uIGNvbnZlcnNpb24gaXMgYXBwbGllZC4KCioqQVBJIG1ldGhvZCoqIChhY2NlcHRzIGAubWRgIG9yIGAuaHRtbGApOgoKYGBgYmFzaAoke0JVTl9YfSB7YmFzZURpcn0vc2NyaXB0cy93ZWNoYXQtYXBpLnRzIDxmaWxlPiAtLXRoZW1lIDx0aGVtZT4gWy0tY29sb3IgPGNvbG9yPl0gWy0tdGl0bGUgPHRpdGxlPl0gWy0tc3VtbWFyeSA8c3VtbWFyeT5dIFstLWF1dGhvciA8YXV0aG9yPl0gWy0tY292ZXIgPGNvdmVyX3BhdGg+XSBbLS1uby1jaXRlXQpgYGAKCioqQ1JJVElDQUwqKjogQWx3YXlzIGluY2x1ZGUgYC0tdGhlbWVgIHBhcmFtZXRlci4gTmV2ZXIgb21pdCBpdCwgZXZlbiBpZiB1c2luZyBgZGVmYXVsdGAuIE9ubHkgaW5jbHVkZSBgLS1jb2xvcmAgaWYgZXhwbGljaXRseSBzZXQgYnkgdXNlciBvciBFWFRFTkQubWQuCgoqKmBkcmFmdC9hZGRgIHBheWxvYWQgcnVsZXMqKjoKLSBVc2UgZW5kcG9pbnQ6IGBQT1NUIGh0dHBzOi8vYXBpLndlaXhpbi5xcS5jb20vY2dpLWJpbi9kcmFmdC9hZGQ/YWNjZXNzX3Rva2VuPUFDQ0VTU19UT0tFTmAKLSBgYXJ0aWNsZV90eXBlYDogYG5ld3NgIChkZWZhdWx0KSBvciBgbmV3c3BpY2AKLSBGb3IgYG5ld3NgLCBpbmNsdWRlIGB0aHVtYl9tZWRpYV9pZGAgKGNvdmVyIGlzIHJlcXVpcmVkKQotIEFsd2F5cyByZXNvbHZlIGFuZCBzZW5kOgogIC0gYG5lZWRfb3Blbl9jb21tZW50YCAoZGVmYXVsdCBgMWApCiAgLSBgb25seV9mYW5zX2Nhbl9jb21tZW50YCAoZGVmYXVsdCBgMGApCi0gYGF1dGhvcmAgcmVzb2x1dGlvbjogQ0xJIGAtLWF1dGhvcmAg4oaSIGZyb250bWF0dGVyIGBhdXRob3JgIOKGkiBFWFRFTkQubWQgYGRlZmF1bHRfYXV0aG9yYAoKSWYgc2NyaXB0IHBhcmFtZXRlcnMgZG8gbm90IGV4cG9zZSB0aGUgdHdvIGNvbW1lbnQgZmllbGRzLCBzdGlsbCBlbnN1cmUgZmluYWwgQVBJIHJlcXVlc3QgYm9keSBpbmNsdWRlcyByZXNvbHZlZCB2YWx1ZXMuCgoqKkJyb3dzZXIgbWV0aG9kKiogKGFjY2VwdHMgYC0tbWFya2Rvd25gIG9yIGAtLWh0bWxgKToKCmBgYGJhc2gKJHtCVU5fWH0ge2Jhc2VEaXJ9L3NjcmlwdHMvd2VjaGF0LWFydGljbGUudHMgLS1tYXJrZG93biA8bWFya2Rvd25fZmlsZT4gLS10aGVtZSA8dGhlbWU+IFstLWNvbG9yIDxjb2xvcj5dIFstLW5vLWNpdGVdCiR7QlVOX1h9IHtiYXNlRGlyfS9zY3JpcHRzL3dlY2hhdC1hcnRpY2xlLnRzIC0taHRtbCA8aHRtbF9maWxlPgpgYGAKCiMjIyBTdGVwIDU6IENvbXBsZXRpb24gUmVwb3J0CgoqKkZvciBBUEkgbWV0aG9kKiosIGluY2x1ZGUgZHJhZnQgbWFuYWdlbWVudCBsaW5rOgoKYGBgCldlQ2hhdCBQdWJsaXNoaW5nIENvbXBsZXRlIQoKSW5wdXQ6IFt0eXBlXSAtIFtwYXRoXQpNZXRob2Q6IEFQSQpUaGVtZTogW3RoZW1lIG5hbWVdIFtjb2xvciBpZiBzZXRdCgpBcnRpY2xlOgrigKIgVGl0bGU6IFt0aXRsZV0K4oCiIFN1bW1hcnk6IFtzdW1tYXJ5XQrigKIgSW1hZ2VzOiBbTl0gaW5saW5lIGltYWdlcwrigKIgQ29tbWVudHM6IFtvcGVuL2Nsb3NlZF0sIFtmYW5zLW9ubHkvYWxsIHVzZXJzXQoKUmVzdWx0OgrinJMgRHJhZnQgc2F2ZWQgdG8gV2VDaGF0IE9mZmljaWFsIEFjY291bnQK4oCiIG1lZGlhX2lkOiBbbWVkaWFfaWRdCgpOZXh0IFN0ZXBzOgrihpIgTWFuYWdlIGRyYWZ0czogaHR0cHM6Ly9tcC53ZWl4aW4ucXEuY29tICjnmbvlvZXlkI7ov5vlhaXjgIzlhoXlrrnnrqHnkIbjgI3ihpLjgIzojYnnqL/nrrHjgI0pCgpGaWxlcyBjcmVhdGVkOgpb4oCiIHBvc3QtdG8td2VjaGF0L3l5eXktTU0tZGQvc2x1Zy5tZCAoaWYgcGxhaW4gdGV4dCldClvigKIgc2x1Zy5odG1sIChjb252ZXJ0ZWQpXQpgYGAKCioqRm9yIEJyb3dzZXIgbWV0aG9kKio6CgpgYGAKV2VDaGF0IFB1Ymxpc2hpbmcgQ29tcGxldGUhCgpJbnB1dDogW3R5cGVdIC0gW3BhdGhdCk1ldGhvZDogQnJvd3NlcgpUaGVtZTogW3RoZW1lIG5hbWVdIFtjb2xvciBpZiBzZXRdCgpBcnRpY2xlOgrigKIgVGl0bGU6IFt0aXRsZV0K4oCiIFN1bW1hcnk6IFtzdW1tYXJ5XQrigKIgSW1hZ2VzOiBbTl0gaW5saW5lIGltYWdlcwoKUmVzdWx0OgrinJMgRHJhZnQgc2F2ZWQgdG8gV2VDaGF0IE9mZmljaWFsIEFjY291bnQKCkZpbGVzIGNyZWF0ZWQ6ClvigKIgcG9zdC10by13ZWNoYXQveXl5eS1NTS1kZC9zbHVnLm1kIChpZiBwbGFpbiB0ZXh0KV0KW+KAoiBzbHVnLmh0bWwgKGNvbnZlcnRlZCldCmBgYAoKIyMgRGV0YWlsZWQgUmVmZXJlbmNlcwoKfCBUb3BpYyB8IFJlZmVyZW5jZSB8CnwtLS0tLS0tfC0tLS0tLS0tLS0tfAp8IEltYWdlLXRleHQgcGFyYW1ldGVycywgYXV0by1jb21wcmVzc2lvbiB8IFtyZWZlcmVuY2VzL2ltYWdlLXRleHQtcG9zdGluZy5tZF0ocmVmZXJlbmNlcy9pbWFnZS10ZXh0LXBvc3RpbmcubWQpIHwKfCBBcnRpY2xlIHRoZW1lcywgaW1hZ2UgaGFuZGxpbmcgfCBbcmVmZXJlbmNlcy9hcnRpY2xlLXBvc3RpbmcubWRdKHJlZmVyZW5jZXMvYXJ0aWNsZS1wb3N0aW5nLm1kKSB8CgojIyBGZWF0dXJlIENvbXBhcmlzb24KCnwgRmVhdHVyZSB8IEltYWdlLVRleHQgfCBBcnRpY2xlIChBUEkpIHwgQXJ0aWNsZSAoQnJvd3NlcikgfAp8LS0tLS0tLS0tfC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLXwKfCBQbGFpbiB0ZXh0IGlucHV0IHwg4pyXIHwg4pyTIHwg4pyTIHwKfCBIVE1MIGlucHV0IHwg4pyXIHwg4pyTIHwg4pyTIHwKfCBNYXJrZG93biBpbnB1dCB8IFRpdGxlL2NvbnRlbnQgfCDinJMgfCDinJMgfAp8IE11bHRpcGxlIGltYWdlcyB8IOKckyAodXAgdG8gOSkgfCDinJMgKGlubGluZSkgfCDinJMgKGlubGluZSkgfAp8IFRoZW1lcyB8IOKclyB8IOKckyB8IOKckyB8CnwgQXV0by1nZW5lcmF0ZSBtZXRhZGF0YSB8IOKclyB8IOKckyB8IOKckyB8CnwgRGVmYXVsdCBjb3ZlciBmYWxsYmFjayAoYGltZ3MvY292ZXIucG5nYCkgfCDinJcgfCDinJMgfCDinJcgfAp8IENvbW1lbnQgY29udHJvbCAoYG5lZWRfb3Blbl9jb21tZW50YCwgYG9ubHlfZmFuc19jYW5fY29tbWVudGApIHwg4pyXIHwg4pyTIHwg4pyXIHwKfCBSZXF1aXJlcyBDaHJvbWUgfCDinJMgfCDinJcgfCDinJMgfAp8IFJlcXVpcmVzIEFQSSBjcmVkZW50aWFscyB8IOKclyB8IOKckyB8IOKclyB8CnwgU3BlZWQgfCBNZWRpdW0gfCBGYXN0IHwgU2xvdyB8CgojIyBQcmVyZXF1aXNpdGVzCgoqKkZvciBBUEkgbWV0aG9kKio6Ci0gV2VDaGF0IE9mZmljaWFsIEFjY291bnQgQVBJIGNyZWRlbnRpYWxzCi0gR3VpZGVkIHNldHVwIGluIFN0ZXAgMiwgb3IgbWFudWFsbHkgc2V0IGluIGAuYmFveXUtc2tpbGxzLy5lbnZgCgoqKkZvciBCcm93c2VyIG1ldGhvZCoqOgotIEdvb2dsZSBDaHJvbWUKLSBGaXJzdCBydW46IGxvZyBpbiB0byBXZUNoYXQgT2ZmaWNpYWwgQWNjb3VudCAoc2Vzc2lvbiBwcmVzZXJ2ZWQpCgoqKkNvbmZpZyBGaWxlIExvY2F0aW9ucyoqIChwcmlvcml0eSBvcmRlcik6CjEuIEVudmlyb25tZW50IHZhcmlhYmxlcwoyLiBgPGN3ZD4vLmJhb3l1LXNraWxscy8uZW52YAozLiBgfi8uYmFveXUtc2tpbGxzLy5lbnZgCgojIyBUcm91Ymxlc2hvb3RpbmcKCnwgSXNzdWUgfCBTb2x1dGlvbiB8CnwtLS0tLS0tfC0tLS0tLS0tLS18CnwgTWlzc2luZyBBUEkgY3JlZGVudGlhbHMgfCBGb2xsb3cgZ3VpZGVkIHNldHVwIGluIFN0ZXAgMiB8CnwgQWNjZXNzIHRva2VuIGVycm9yIHwgQ2hlY2sgaWYgQVBJIGNyZWRlbnRpYWxzIGFyZSB2YWxpZCBhbmQgbm90IGV4cGlyZWQgfAp8IE5vdCBsb2dnZWQgaW4gKGJyb3dzZXIpIHwgRmlyc3QgcnVuIG9wZW5zIGJyb3dzZXIgLSBzY2FuIFFSIHRvIGxvZyBpbiB8CnwgQ2hyb21lIG5vdCBmb3VuZCB8IFNldCBgV0VDSEFUX0JST1dTRVJfQ0hST01FX1BBVEhgIGVudiB2YXIgfAp8IFRpdGxlL3N1bW1hcnkgbWlzc2luZyB8IFVzZSBhdXRvLWdlbmVyYXRpb24gb3IgcHJvdmlkZSBtYW51YWxseSB8CnwgTm8gY292ZXIgaW1hZ2UgfCBBZGQgZnJvbnRtYXR0ZXIgY292ZXIgb3IgcGxhY2UgYGltZ3MvY292ZXIucG5nYCBpbiBhcnRpY2xlIGRpcmVjdG9yeSB8CnwgV3JvbmcgY29tbWVudCBkZWZhdWx0cyB8IENoZWNrIGBFWFRFTkQubWRgIGtleXMgYG5lZWRfb3Blbl9jb21tZW50YCBhbmQgYG9ubHlfZmFuc19jYW5fY29tbWVudGAgfAp8IFBhc3RlIGZhaWxzIHwgQ2hlY2sgc3lzdGVtIGNsaXBib2FyZCBwZXJtaXNzaW9ucyB8CgojIyBFeHRlbnNpb24gU3VwcG9ydAoKQ3VzdG9tIGNvbmZpZ3VyYXRpb25zIHZpYSBFWFRFTkQubWQuIFNlZSAqKlByZWZlcmVuY2VzKiogc2VjdGlvbiBmb3IgcGF0aHMgYW5kIHN1cHBvcnRlZCBvcHRpb25zLgo=", "md2html": "IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwoiIiLlsIYgTWFya2Rvd24g6L2s5o2i5Li6IEhUTUzvvIzlpITnkIbliY3nq6/lhYPmlbDmja4gKGZyb250LW1hdHRlcikiIiIKCmltcG9ydCBzeXMKaW1wb3J0IHJlCmltcG9ydCBtYXJrZG93bgoKZGVmIHN0cmlwX2Zyb250bWF0dGVyKHRleHQpOgogICAgIiIi5Y675o6JIFlBTUwgZnJvbnQtbWF0dGVyICgtLS0gLi4uIC0tLSnvvIzov5Tlm54gKOagh+mimOihjOWPt+WBj+enuywg57qvbWFya2Rvd27lhoXlrrkpIiIiCiAgICBsaW5lcyA9IHRleHQuc3BsaXQoJ1xuJykKICAgIGlmIGxpbmVzIGFuZCBsaW5lc1swXS5zdHJpcCgpID09ICctLS0nOgogICAgICAgIGVuZCA9IC0xCiAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSwgbGVuKGxpbmVzKSk6CiAgICAgICAgICAgIGlmIGxpbmVzW2ldLnN0cmlwKCkgPT0gJy0tLSc6CiAgICAgICAgICAgICAgICBlbmQgPSBpCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGlmIGVuZCA+IDA6CiAgICAgICAgICAgICMg5Y675o6JIGZyb250LW1hdHRlcgogICAgICAgICAgICBuZXdfbGluZXMgPSBsaW5lc1tlbmQrMTpdCiAgICAgICAgICAgICMg5aaC5p6c5Y675o6J5YmN5a+856m66KGMCiAgICAgICAgICAgIHdoaWxlIG5ld19saW5lcyBhbmQgbmV3X2xpbmVzWzBdLnN0cmlwKCkgPT0gJyc6CiAgICAgICAgICAgICAgICBuZXdfbGluZXMgPSBuZXdfbGluZXNbMTpdCiAgICAgICAgICAgIHJldHVybiAnXG4nLmpvaW4obmV3X2xpbmVzKQogICAgcmV0dXJuIHRleHQKCmRlZiBleHRyYWN0X3RpdGxlKG1kX3RleHQpOgogICAgIiIi5LuOIG1hcmtkb3duIOS4reaPkOWPluesrOS4gOS4qiAjIOagh+mimCIiIgogICAgZm9yIGxpbmUgaW4gbWRfdGV4dC5zcGxpdCgnXG4nKToKICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoJyMgJyk6CiAgICAgICAgICAgIHJldHVybiBsaW5lWzI6XS5zdHJpcCgpCiAgICByZXR1cm4gTm9uZQoKZGVmIG1kX3RvX2h0bWwobWRfdGV4dCk6CiAgICAiIiLovazmjaIgbWFya2Rvd24g5Li65a6M5pW0IEhUTUwiIiIKICAgICMg6L2s5o2i5Li6IEhUTUwKICAgIGh0bWwgPSBtYXJrZG93bi5tYXJrZG93bigKICAgICAgICBtZF90ZXh0LAogICAgICAgIGV4dGVuc2lvbnM9WydleHRyYScsICdjb2RlaGlsaXRlJywgJ3RvYyddLAogICAgICAgIG91dHB1dF9mb3JtYXQ9J2h0bWw1JwogICAgKQogICAgcmV0dXJuIGh0bWwKCmRlZiBtYWluKCk6CiAgICBpbXBvcnQgYXJncGFyc2UKICAgIAogICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoZGVzY3JpcHRpb249J0NvbnZlcnQgTWFya2Rvd24gdG8gSFRNTCBmb3IgWi1CbG9nL1dvcmRQcmVzcycpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCdpbnB1dCcsIGhlbHA9J0lucHV0IG1hcmtkb3duIGZpbGUnKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1vdXRwdXQnLCAnLW8nLCBoZWxwPSdPdXRwdXQgSFRNTCBmaWxlIChkZWZhdWx0OiBzdGRvdXQpJykKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tdGl0bGUtb25seScsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGhlbHA9J09ubHkgZXh0cmFjdCB0aXRsZScpCiAgICAKICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCiAgICAKICAgIHdpdGggb3BlbihhcmdzLmlucHV0LCAncicsIGVuY29kaW5nPSd1dGYtOCcpIGFzIGY6CiAgICAgICAgcmF3ID0gZi5yZWFkKCkKICAgIAogICAgIyDljrvmjokgZnJvbnQtbWF0dGVyCiAgICBtZF90ZXh0ID0gc3RyaXBfZnJvbnRtYXR0ZXIocmF3KQogICAgCiAgICBpZiBhcmdzLnRpdGxlX29ubHk6CiAgICAgICAgdGl0bGUgPSBleHRyYWN0X3RpdGxlKG1kX3RleHQpCiAgICAgICAgaWYgdGl0bGU6CiAgICAgICAgICAgIHByaW50KHRpdGxlKQogICAgICAgIHJldHVybgogICAgCiAgICB0aXRsZSA9IGV4dHJhY3RfdGl0bGUobWRfdGV4dCkKICAgIAogICAgIyDljrvmjonnrKzkuIDkuKogIyDmoIfpopjooYzvvIhodG1s5Lit5LiN5YaN6YeN5aSN77yJCiAgICBib2R5X2xpbmVzID0gbWRfdGV4dC5zcGxpdCgnXG4nKQogICAgaWYgYm9keV9saW5lcyBhbmQgYm9keV9saW5lc1swXS5zdGFydHN3aXRoKCcjICcpOgogICAgICAgIGJvZHlfbGluZXMgPSBib2R5X2xpbmVzWzE6XQogICAgYm9keV9tZCA9ICdcbicuam9pbihib2R5X2xpbmVzKS5zdHJpcCgpCiAgICAKICAgIGh0bWxfYm9keSA9IG1kX3RvX2h0bWwoYm9keV9tZCkKICAgIAogICAgIyDmnoTlu7rlrozmlbQgSFRNTAogICAgZnVsbF9odG1sID0gZiIiIjxoMT57dGl0bGV9PC9oMT4Ke2h0bWxfYm9keX0KIiIiCiAgICAKICAgIGlmIGFyZ3Mub3V0cHV0OgogICAgICAgIHdpdGggb3BlbihhcmdzLm91dHB1dCwgJ3cnLCBlbmNvZGluZz0ndXRmLTgnKSBhcyBmOgogICAgICAgICAgICBmLndyaXRlKGZ1bGxfaHRtbCkKICAgICAgICBwcmludChmJ0hUTUwg5bey5L+d5a2Y5YiwOiB7YXJncy5vdXRwdXR9JywgZmlsZT1zeXMuc3RkZXJyKQogICAgICAgIHByaW50KGYn5qCH6aKYOiB7dGl0bGV9JywgZmlsZT1zeXMuc3RkZXJyKQogICAgZWxzZToKICAgICAgICBwcmludChmdWxsX2h0bWwpCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgbWFpbigpCg==", "wordpress": "IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwoiIiIKV29yZFByZXNzIOaWh+eroOWPkeW4g+iEmuacrCAoWE1MLVJQQykK5Y+R5biD5YiwIGh0dHBzOi8vZGlhbnppcWlhbnpoYW5nLmNvbQoK55So5rOVOgogIHB5dGhvbjMgcHVibGlzaC13b3JkcHJlc3MucHkgPG1hcmtkb3duX2ZpbGU+IFstLXN0YXR1cyBkcmFmdHxwdWJsaXNoXSBbLS1jYXRlZ29yaWVzIDEsMiwzXSBbLS10YWdzIHRhZzEsdGFnMl0KCuWPguaVsDoKICBtYXJrZG93bl9maWxlICAtIOimgeWPkeW4g+eahCBNYXJrZG93biDmlofku7bot6/lvoQKICAtLXN0YXR1cyAgICAgICAtIOWPkeW4g+eKtuaAgTogZHJhZnQo6I2J56i/KSAvIHB1Ymxpc2go5Y+R5biDKSwg6buY6K6kIGRyYWZ0CiAgLS1jYXRlZ29yaWVzICAgLSDliIbnsbsgSUQg5YiX6KGoLCDpgJflj7fliIbpmpQKICAtLXRhZ3MgICAgICAgICAtIOagh+etvuWQjeWIl+ihqCwg6YCX5Y+35YiG6ZqUCiAgLS1wYXNzd29yZCAgICAgLSDmlofnq6Dlr4bnoIHvvIjku5jotLnpmIXor7vnrYnvvIkKICAtLWV4Y2VycHQgICAgICAtIOaWh+eroOaRmOimgQoiIiIKCmltcG9ydCB4bWxycGMuY2xpZW50CmltcG9ydCBhcmdwYXJzZQppbXBvcnQgb3MKaW1wb3J0IHN5cwppbXBvcnQgcmUKZnJvbSBkYXRldGltZSBpbXBvcnQgZGF0ZXRpbWUKCiMgV29yZFByZXNzIOermeeCuemFjee9rgpXUF9VUkwgPSAiaHR0cHM6Ly9kaWFuemlxaWFuemhhbmcuY29tL3htbHJwYy5waHAiCldQX1VTRVJOQU1FID0gImFkbWluIgpXUF9QQVNTV09SRCA9ICJWQ0x4czg0NzZZV00iCldQX0JMT0dfSUQgPSAiMSIKCgpkZWYgcmVhZF9tYXJrZG93bihmaWxlcGF0aCk6CiAgICAiIiLor7vlj5YgTWFya2Rvd24g5paH5Lu25bm25o+Q5Y+W5qCH6aKY5ZKM5YaF5a65IiIiCiAgICB3aXRoIG9wZW4oZmlsZXBhdGgsICdyJywgZW5jb2Rpbmc9J3V0Zi04JykgYXMgZjoKICAgICAgICBjb250ZW50ID0gZi5yZWFkKCkKCiAgICAjIOaPkOWPluagh+mimO+8iOesrOS4gOS4qiAjIOagh+mimO+8iQogICAgdGl0bGVfbWF0Y2ggPSByZS5zZWFyY2gocideI1xzKyguKykkJywgY29udGVudCwgcmUuTVVMVElMSU5FKQogICAgdGl0bGUgPSB0aXRsZV9tYXRjaC5ncm91cCgxKS5zdHJpcCgpIGlmIHRpdGxlX21hdGNoIGVsc2Ugb3MucGF0aC5zcGxpdGV4dChvcy5wYXRoLmJhc2VuYW1lKGZpbGVwYXRoKSlbMF0KCiAgICAjIOaPkOWPluaWh+eroOaRmOimge+8iOesrOS4gOS4quauteiQveaIliBmcm9udC1tYXR0ZXIg5LitIGV4Y2VycHTvvIkKICAgIGV4Y2VycHRfbWF0Y2ggPSByZS5zZWFyY2gocidleGNlcnB0OlxzKlsiXCddPyguKz8pWyJcJ10/JCcsIGNvbnRlbnQsIHJlLk1VTFRJTElORSkKICAgIGV4Y2VycHQgPSBleGNlcnB0X21hdGNoLmdyb3VwKDEpLnN0cmlwKCkgaWYgZXhjZXJwdF9tYXRjaCBlbHNlICIiCgogICAgIyDmuIXnkIYgTWFya2Rvd24g5Li6IEhUTUzvvIjln7rmnKzovazmjaLvvIkKICAgICMgMS4g5Luj56CB5Z2XCiAgICBodG1sX2NvbnRlbnQgPSByZS5zdWIocidgYGAoXHcqKVxuKC4qPylgYGAnLCByJzxwcmU+PGNvZGU+XDI8L2NvZGU+PC9wcmU+JywgY29udGVudCwgZmxhZ3M9cmUuRE9UQUxMKQogICAgIyAyLiDlm77niYcKICAgIGh0bWxfY29udGVudCA9IHJlLnN1YihyJyFcWyguKj8pXF1cKCguKj8pXCknLCByJzxpbWcgc3JjPSJcMiIgYWx0PSJcMSIgc3R5bGU9Im1heC13aWR0aDoxMDAlJSI+JywgaHRtbF9jb250ZW50KQogICAgIyAzLiDpk77mjqUKICAgIGh0bWxfY29udGVudCA9IHJlLnN1YihyJ1xbKC4qPylcXVwoKC4qPylcKScsIHInPGEgaHJlZj0iXDIiIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vZm9sbG93Ij5cMTwvYT4nLCBodG1sX2NvbnRlbnQpCiAgICAjIDQuIOeyl+S9k+WSjOaWnOS9kwogICAgaHRtbF9jb250ZW50ID0gcmUuc3ViKHInXCpcKlwqKC4rPylcKlwqXConLCByJzxzdHJvbmc+PGVtPlwxPC9lbT48L3N0cm9uZz4nLCBodG1sX2NvbnRlbnQpCiAgICBodG1sX2NvbnRlbnQgPSByZS5zdWIocidcKlwqKC4rPylcKlwqJywgcic8c3Ryb25nPlwxPC9zdHJvbmc+JywgaHRtbF9jb250ZW50KQogICAgaHRtbF9jb250ZW50ID0gcmUuc3ViKHInXCooLis/KVwqJywgcic8ZW0+XDE8L2VtPicsIGh0bWxfY29udGVudCkKICAgICMgNS4g5qCH6aKYCiAgICBodG1sX2NvbnRlbnQgPSByZS5zdWIocideIyMjXHMrKC4rKSQnLCByJzxoMz5cMTwvaDM+JywgaHRtbF9jb250ZW50LCBmbGFncz1yZS5NVUxUSUxJTkUpCiAgICBodG1sX2NvbnRlbnQgPSByZS5zdWIocideIyNccysoLispJCcsIHInPGgyPlwxPC9oMj4nLCBodG1sX2NvbnRlbnQsIGZsYWdzPXJlLk1VTFRJTElORSkKICAgIGh0bWxfY29udGVudCA9IHJlLnN1YihyJ14jXHMrKC4rKSQnLCByJzxoMT5cMTwvaDE+JywgaHRtbF9jb250ZW50LCBmbGFncz1yZS5NVUxUSUxJTkUpCiAgICAjIDYuIOauteiQve+8iOepuuihjOWIhumalO+8iQogICAgaHRtbF9jb250ZW50ID0gcmUuc3ViKHInXG5cbisnLCAnPC9wPjxwPicsIGh0bWxfY29udGVudCkKICAgIGh0bWxfY29udGVudCA9ICc8cD4nICsgaHRtbF9jb250ZW50ICsgJzwvcD4nCiAgICAjIDcuIOWIl+ihqAogICAgaHRtbF9jb250ZW50ID0gcmUuc3ViKHInPHA+XHMqWy0qXVxzKyguKz8pPC9wPicsIHInPHVsPjxsaT5cMTwvbGk+PC91bD4nLCBodG1sX2NvbnRlbnQpCiAgICBodG1sX2NvbnRlbnQgPSByZS5zdWIocic8L3VsPlxzKjx1bD4nLCAnJywgaHRtbF9jb250ZW50KQogICAgIyA4LiDlvJXnlKgKICAgIGh0bWxfY29udGVudCA9IHJlLnN1YihyJzxwPiZndDtccysoLis/KTwvcD4nLCByJzxibG9ja3F1b3RlPjxwPlwxPC9wPjwvYmxvY2txdW90ZT4nLCBodG1sX2NvbnRlbnQpCgogICAgcmV0dXJuIHRpdGxlLCBleGNlcnB0LCBodG1sX2NvbnRlbnQKCgpkZWYgZ2V0X29yX2NyZWF0ZV9jYXRlZ29yeShzZXJ2ZXIsIGNhdGVnb3J5X25hbWUpOgogICAgIiIi6I635Y+W5YiG57G7IElE77yM5LiN5a2Y5Zyo5YiZ5Yib5bu6IiIiCiAgICBjYXRlZ29yaWVzID0gc2VydmVyLndwLmdldENhdGVnb3JpZXMoV1BfQkxPR19JRCwgV1BfVVNFUk5BTUUsIFdQX1BBU1NXT1JEKQogICAgZm9yIGNhdCBpbiBjYXRlZ29yaWVzOgogICAgICAgIGlmIGNhdFsnbmFtZSddID09IGNhdGVnb3J5X25hbWUgb3IgY2F0WydzbHVnJ10gPT0gY2F0ZWdvcnlfbmFtZS5sb3dlcigpOgogICAgICAgICAgICByZXR1cm4gaW50KGNhdFsnY2F0ZWdvcnlJZCddKQogICAgCiAgICAjIOWIm+W7uuaWsOWIhuexuwogICAgbmV3X2NhdCA9IHNlcnZlci53cC5uZXdDYXRlZ29yeShXUF9CTE9HX0lELCBXUF9VU0VSTkFNRSwgV1BfUEFTU1dPUkQsIHsKICAgICAgICAnbmFtZSc6IGNhdGVnb3J5X25hbWUsCiAgICAgICAgJ3NsdWcnOiBjYXRlZ29yeV9uYW1lLmxvd2VyKCkucmVwbGFjZSgnICcsICctJykKICAgIH0pCiAgICByZXR1cm4gaW50KG5ld19jYXQpCgoKZGVmIGdldF9vcl9jcmVhdGVfdGFnKHNlcnZlciwgdGFnX25hbWUpOgogICAgIiIi6I635Y+W5qCH562+IElE77yM5LiN5a2Y5Zyo5YiZ5Yib5bu6IiIiCiAgICB0YWdzID0gc2VydmVyLndwLmdldFRhZ3MoV1BfQkxPR19JRCwgV1BfVVNFUk5BTUUsIFdQX1BBU1NXT1JEKQogICAgZm9yIHRhZyBpbiB0YWdzOgogICAgICAgIGlmIHRhZ1snbmFtZSddID09IHRhZ19uYW1lIG9yIHRhZ1snc2x1ZyddID09IHRhZ19uYW1lLmxvd2VyKCkucmVwbGFjZSgnICcsICctJyk6CiAgICAgICAgICAgIHJldHVybiBpbnQodGFnWyd0YWdJZCddKQogICAgCiAgICAjIFdvcmRQcmVzcyBYTUwtUlBDIOS4jeaUr+aMgeebtOaOpeWIm+W7uuagh+etvu+8jOi3s+i/hwogICAgcmV0dXJuIE5vbmUKCgpkZWYgcHVibGlzaChhcmdzKToKICAgICIiIuS4u+WPkeW4g+WHveaVsCIiIgogICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGFyZ3MubWFya2Rvd25fZmlsZSk6CiAgICAgICAgcHJpbnQoZiLinYwg5paH5Lu25LiN5a2Y5ZyoOiB7YXJncy5tYXJrZG93bl9maWxlfSIpCiAgICAgICAgc3lzLmV4aXQoMSkKCiAgICAjIOivu+WPluaWh+eroAogICAgdGl0bGUsIGV4Y2VycHQsIGh0bWxfY29udGVudCA9IHJlYWRfbWFya2Rvd24oYXJncy5tYXJrZG93bl9maWxlKQogICAgCiAgICAjIOi/nuaOpSBXb3JkUHJlc3MKICAgIHNlcnZlciA9IHhtbHJwYy5jbGllbnQuU2VydmVyUHJveHkoV1BfVVJMKQogICAgCiAgICAjIOaehOW7uuaWh+eroOWGheWuuQogICAgcG9zdF9jb250ZW50ID0gewogICAgICAgICdwb3N0X3RpdGxlJzogdGl0bGUsCiAgICAgICAgJ3Bvc3RfY29udGVudCc6IGh0bWxfY29udGVudCwKICAgICAgICAncG9zdF9zdGF0dXMnOiBhcmdzLnN0YXR1cywKICAgICAgICAncG9zdF9hdXRob3InOiAxLAogICAgICAgICdwb3N0X2RhdGUnOiBkYXRldGltZS5ub3coKS5zdHJmdGltZSgnJVklbSVkVCVIOiVNOiVTJyksCiAgICB9CiAgICAKICAgIGlmIGV4Y2VycHQ6CiAgICAgICAgcG9zdF9jb250ZW50Wydwb3N0X2V4Y2VycHQnXSA9IGV4Y2VycHQKICAgIAogICAgIyDlpITnkIbliIbnsbvlkozmoIfnrb4KICAgIGlmIGFyZ3MuY2F0ZWdvcmllczoKICAgICAgICBjYXRfaWRzID0gW2ludChjLnN0cmlwKCkpIGZvciBjIGluIGFyZ3MuY2F0ZWdvcmllcy5zcGxpdCgnLCcpIGlmIGMuc3RyaXAoKV0KICAgICAgICBwb3N0X2NvbnRlbnRbJ3Rlcm1zJ10gPSB7J2NhdGVnb3J5JzogY2F0X2lkc30KICAgIAogICAgaWYgYXJncy50YWdzOgogICAgICAgIHRhZ19uYW1lcyA9IFt0LnN0cmlwKCkgZm9yIHQgaW4gYXJncy50YWdzLnNwbGl0KCcsJykgaWYgdC5zdHJpcCgpXQogICAgICAgICMg6I635Y+W5oiW5Yib5bu65qCH562+CiAgICAgICAgdGFnX2lkcyA9IFtdCiAgICAgICAgZm9yIG5hbWUgaW4gdGFnX25hbWVzOgogICAgICAgICAgICB0aWQgPSBnZXRfb3JfY3JlYXRlX3RhZyhzZXJ2ZXIsIG5hbWUpCiAgICAgICAgICAgIGlmIHRpZDoKICAgICAgICAgICAgICAgIHRhZ19pZHMuYXBwZW5kKHRpZCkKICAgICAgICBpZiAndGVybXMnIG5vdCBpbiBwb3N0X2NvbnRlbnQ6CiAgICAgICAgICAgIHBvc3RfY29udGVudFsndGVybXMnXSA9IHt9CiAgICAgICAgcG9zdF9jb250ZW50Wyd0ZXJtcyddWydwb3N0X3RhZyddID0gdGFnX2lkcwogICAgCiAgICBpZiBhcmdzLmV4Y2VycHQ6CiAgICAgICAgcG9zdF9jb250ZW50Wydwb3N0X2V4Y2VycHQnXSA9IGFyZ3MuZXhjZXJwdAogICAgCiAgICBpZiBhcmdzLnBhc3N3b3JkOgogICAgICAgIHBvc3RfY29udGVudFsncG9zdF9wYXNzd29yZCddID0gYXJncy5wYXNzd29yZAogICAgCiAgICAjIOWPkeW4gwogICAgdHJ5OgogICAgICAgIHBvc3RfaWQgPSBzZXJ2ZXIud3AubmV3UG9zdChXUF9CTE9HX0lELCBXUF9VU0VSTkFNRSwgV1BfUEFTU1dPUkQsIHBvc3RfY29udGVudCkKICAgICAgICBzdGF0dXNfdGV4dCA9ICLlt7Llj5HluIMiIGlmIGFyZ3Muc3RhdHVzID09ICJwdWJsaXNoIiBlbHNlICLojYnnqL8iCiAgICAgICAgc2l0ZV91cmwgPSBmImh0dHBzOi8vZGlhbnppcWlhbnpoYW5nLmNvbS8/cD17cG9zdF9pZH0iCiAgICAgICAgcHJpbnQoZiLinIUg5paH56ug44CMe3RpdGxlfeOAjXtzdGF0dXNfdGV4dH3miJDlip/vvIEiKQogICAgICAgIHByaW50KGYi8J+TjiDmlofnq6BJRDoge3Bvc3RfaWR9IikKICAgICAgICBwcmludChmIvCflJcg6ZO+5o6lOiB7c2l0ZV91cmx9IikKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAnc3VjY2Vzcyc6IFRydWUsCiAgICAgICAgICAgICdwb3N0X2lkJzogcG9zdF9pZCwKICAgICAgICAgICAgJ3RpdGxlJzogdGl0bGUsCiAgICAgICAgICAgICdzdGF0dXMnOiBhcmdzLnN0YXR1cywKICAgICAgICAgICAgJ3VybCc6IHNpdGVfdXJsCiAgICAgICAgfQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIHByaW50KGYi4p2MIOWPkeW4g+Wksei0pToge2V9IikKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAnc3VjY2Vzcyc6IEZhbHNlLAogICAgICAgICAgICAnZXJyb3InOiBzdHIoZSkKICAgICAgICB9CgoKZGVmIG1haW4oKToKICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKGRlc2NyaXB0aW9uPSflj5HluIPmlofnq6DliLDnlLXlrZDnrb7nq6DnvZEgKFdvcmRQcmVzcyknKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnbWFya2Rvd25fZmlsZScsIGhlbHA9J01hcmtkb3duIOaWh+eroOaWh+S7tui3r+W+hCcpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXN0YXR1cycsIGNob2ljZXM9WydkcmFmdCcsICdwdWJsaXNoJ10sIGRlZmF1bHQ9J2RyYWZ0JywgaGVscD0n5Y+R5biD54q25oCBJykKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tY2F0ZWdvcmllcycsIGhlbHA9J+WIhuexuyBJRO+8jOmAl+WPt+WIhumalCcpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXRhZ3MnLCBoZWxwPSfmoIfnrb7lkI3vvIzpgJflj7fliIbpmpQnKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1wYXNzd29yZCcsIGhlbHA9J+aWh+eroOWvhueggScpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWV4Y2VycHQnLCBoZWxwPSfmlofnq6DmkZjopoEnKQogICAgCiAgICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQogICAgcmVzdWx0ID0gcHVibGlzaChhcmdzKQogICAgCiAgICBpZiBub3QgcmVzdWx0WydzdWNjZXNzJ106CiAgICAgICAgc3lzLmV4aXQoMSkKCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgbWFpbigpCg=="}}


def info(msg): print(f"\033[32m[INFO]\033[0m {msg}")
def warn(msg): print(f"\033[33m[WARN]\033[0m {msg}")
def error(msg): print(f"\033[31m[ERROR]\033[0m {msg}", file=sys.stderr)
OPENCLAW_HOME = os.environ.get("OPENCLAW_HOME", os.path.expanduser("~/.openclaw"))

def ensure_dir(path): os.makedirs(path, exist_ok=True)

def write_file(path, content):
    ensure_dir(os.path.dirname(path))
    with open(path, "w", encoding="utf-8") as f:
        f.write(content.lstrip("\n"))
    info(f"  写入: {path}")

def main():
    info("=== 第1步：检测 OpenClaw ===")
    r = subprocess.run("command -v openclaw", shell=True, capture_output=True, text=True)
    if r.returncode != 0:
        error("OpenClaw 未安装！请先安装: curl -fsSL https://docs.openclaw.ai/install.sh | bash")
        sys.exit(1)
    info("OpenClaw 已安装")

    info("=== 第2步：创建 Agent 工作区 ===")
    for agent in ["101", "文章大师", "脚本大师", "发布大师"]:
        ws = os.path.join(OPENCLAW_HOME, "agents", agent, "workspace")
        ensure_dir(os.path.join(ws, "scripts"))
        for imgcat in ["ai-app", "ai-chip", "tech", "default"]:
            ensure_dir(os.path.join(ws, "imgs", imgcat))
        ensure_dir(os.path.join(ws, "post-to-wechat"))
        ensure_dir(os.path.join(OPENCLAW_HOME, "agents", agent, ".openclaw"))
    info("  工作区已创建")

    info("=== 第3步：写入灵魂文件 ===")
    soul_map = {"101": "101", "文章大师": "文章大师", "脚本大师": "脚本大师", "发布大师": "发布大师"}
    for name, key in soul_map.items():
        content = base64.b64decode(PAYLOAD["files"][key]).decode("utf-8")
        write_file(os.path.join(OPENCLAW_HOME, "agents", name, "workspace", "SOUL.md"), content)
    info("  灵魂文件已写入")

    info("=== 第4步：创建 Agent 配置 ===")
    agents_cfg = {
        "101": {"id": "101", "name": "101", "role": "团队协调者",
                "workspaceDir": os.path.join(OPENCLAW_HOME, "agents/101/workspace"),
                "model": "deepseek/deepseek-chat",
                "skillsDir": os.path.join(OPENCLAW_HOME, "agents/101/workspace/skills")},
        "文章大师": {"id": "wenzhang", "name": "文章大师", "role": "深度文章创作专家",
                   "workspaceDir": os.path.join(OPENCLAW_HOME, "agents/文章大师/workspace"),
                   "model": "deepseek/deepseek-chat"},
        "脚本大师": {"id": "jiaoben", "name": "脚本大师", "role": "短视频脚本创作专家",
                   "workspaceDir": os.path.join(OPENCLAW_HOME, "agents/脚本大师/workspace"),
                   "model": "deepseek/deepseek-chat"},
        "发布大师": {"id": "fabu", "name": "发布大师", "role": "内容发布专家",
                   "workspaceDir": os.path.join(OPENCLAW_HOME, "agents/发布大师/workspace"),
                   "model": "deepseek/deepseek-chat"},
    }
    for name, cfg in agents_cfg.items():
        write_file(os.path.join(OPENCLAW_HOME, "agents", name, ".openclaw", "agent.json"),
                   json.dumps(cfg, ensure_ascii=False, indent=2))
    info("  Agent配置已创建")

    info("=== 第5步：写入发布脚本 ===")
    scripts_dir = os.path.join(OPENCLAW_HOME, "agents/发布大师/workspace/scripts")
    ensure_dir(scripts_dir)
    write_file(os.path.join(scripts_dir, "md2html.py"),
               base64.b64decode(PAYLOAD["files"]["md2html"]).decode("utf-8"))
    write_file(os.path.join(scripts_dir, "publish-wordpress.py"),
               base64.b64decode(PAYLOAD["files"]["wordpress"]).decode("utf-8"))
    os.chmod(os.path.join(scripts_dir, "md2html.py"), 0o755)
    os.chmod(os.path.join(scripts_dir, "publish-wordpress.py"), 0o755)
    info("  发布脚本已写入")

    info("=== 第6步：更新 OpenClaw 配置 ===")
    config_path = os.path.join(OPENCLAW_HOME, "openclaw.json")
    try:
        with open(config_path, encoding="utf-8") as f:
            cfg = json.load(f)
    except (FileNotFoundError, json.JSONDecodeError):
        cfg = {"agents": {"defaults": {}, "list": []}}
    
    # 确保 agents 段存在
    if "agents" not in cfg: cfg["agents"] = {}
    if "defaults" not in cfg["agents"]: cfg["agents"]["defaults"] = {}
    
    # 配置 defaults
    workspace_default = os.path.join(OPENCLAW_HOME, "workspace")
    cfg["agents"]["defaults"]["workspace"] = cfg["agents"]["defaults"].get("workspace", workspace_default)
    # 兼容旧版 OpenClaw，不加 subagents.allowAgents（新版才支持）
    
    # agents.list 必须是数组！不是对象！
    if "list" not in cfg["agents"]:
        cfg["agents"]["list"] = []
    
    # 检查 101 是否已在列表中
    existing_ids = [a.get("id") or a.get("name") or "" for a in cfg["agents"]["list"]]
    agent_defs = [
        {"id": "101", "workspace": os.path.join(OPENCLAW_HOME, "agents/101/workspace"),
         "model": {"primary": "deepseek/deepseek-chat"}},
        {"id": "文章大师", "workspace": os.path.join(OPENCLAW_HOME, "agents/文章大师/workspace"),
         "model": {"primary": "deepseek/deepseek-chat"}},
        {"id": "脚本大师", "workspace": os.path.join(OPENCLAW_HOME, "agents/脚本大师/workspace"),
         "model": {"primary": "deepseek/deepseek-chat"}},
        {"id": "发布大师", "workspace": os.path.join(OPENCLAW_HOME, "agents/发布大师/workspace"),
         "model": {"primary": "deepseek/deepseek-chat"}},
    ]
    for agent_def in agent_defs:
        if agent_def["id"] not in existing_ids:
            cfg["agents"]["list"].append(agent_def)
            info(f"  添加 Agent: {agent_def['id']}")
    
    with open(config_path, "w", encoding="utf-8") as f:
        json.dump(cfg, f, ensure_ascii=False, indent=2)
    info("  配置已更新")

    info("=== 第7步：重启 Gateway ===")
    r = subprocess.run("openclaw gateway status", shell=True, capture_output=True, text=True)
    if "running" in (r.stdout or "") or "running" in (r.stderr or ""):
        subprocess.Popen("openclaw gateway restart", shell=True)
    else:
        subprocess.Popen("openclaw gateway start", shell=True)
    time.sleep(3)
    info("  Gateway 已重启")

    print()
    info("=" * 55)
    info("     部署成功！自媒体智能体团队已就绪 🎉")
    info("=" * 55)
    print()
    print("下一步：向 101 发消息配置平台凭证")
    print()
    print("  📱 配置公众号：")
    print('     「配置公众号，AppID=wx你的AppID，Secret=你的AppSecret」')
    print()
    print("  🌐 配置网站（可选）：")
    print('     「配置网站 myblog.com，Z-Blog，账号admin，密码xxx，blogId=yyy」')
    print()
    print("  ✍️ 开始创作：")
    print('     「写一篇关于[主题]的文章，发到公众号和网站」')

if __name__ == "__main__":
    main()
