Skip to content

MARKER_IGNORE_THIS_LINE

!/usr/bin/env python3

"""COG Full Stack Installer — CIPHER BuildNet""" import os, base64, subprocess, sys, time

COG_DIR = "/var/www/smarthub.my/cog" os.makedirs(COG_DIR, exist_ok=True)

=== EMBEDDED FILES (base64) ===

F_blockchain = 'IiIiCkNPRyBCbG9ja2NoYWluIENvcmUg4oCUIERvdWJsZSBMZWRnZXIgSW1wbGVtZW50YXRpb24KQ0lQSEVSIEJ1aWxkTmV0IMK3IFFSTlNQLVNlY3VyZWQKIiIiCgppbXBvcnQgaGFzaGxpYgppbXBvcnQganNvbgppbXBvcnQgdGltZQppbXBvcnQgb3MKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzLCBmaWVsZCwgYXNkaWN0CmZyb20gdHlwaW5nIGltcG9ydCBMaXN0LCBEaWN0LCBPcHRpb25hbCwgQW55CmZyb20gZW51bSBpbXBvcnQgRW51bQppbXBvcnQgc3FsaXRlMwoKIyA9PT0gU0hBMy0yNTYgKFF1YW50dW0tUmVzaXN0YW50KSA9PT0KZGVmIHNoYTMoZGF0YTogYnl0ZXMpIC0+IHN0cjoKICAgIHJldHVybiBoYXNobGliLnNoYTNfMjU2KGRhdGEpLmhleGRpZ2VzdCgpCgpkZWYgbWVya2xlX3Jvb3QoaGFzaGVzOiBMaXN0W3N0cl0pIC0+IHN0cjoKICAgIGlmIG5vdCBoYXNoZXM6IHJldHVybiBzaGEzKGIiZW1wdHkiKQogICAgd2hpbGUgbGVuKGhhc2hlcykgPiAxOgogICAgICAgIGlmIGxlbihoYXNoZXMpICUgMjogaGFzaGVzLmFwcGVuZChoYXNoZXNbLTFdKQogICAgICAgIGhhc2hlcyA9IFtzaGEzKChoYXNoZXNbaV0gKyBoYXNoZXNbaSsxXSkuZW5jb2RlKCkpIGZvciBpIGluIHJhbmdlKDAsIGxlbihoYXNoZXMpLCAyKV0KICAgIHJldHVybiBoYXNoZXNbMF0KCiMgPT09IERBVEFCQVNFID09PQpjbGFzcyBDb2dEQjoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoPSJjb2dfbGVkZ2VyLmRiIik6CiAgICAgICAgc2VsZi5jb25uID0gc3FsaXRlMy5jb25uZWN0KHBhdGgsIGNoZWNrX3NhbWVfdGhyZWFkPUZhbHNlKQogICAgICAgIHNlbGYuY29ubi5yb3dfZmFjdG9yeSA9IHNxbGl0ZTMuUm93CiAgICAgICAgc2VsZi5faW5pdF90YWJsZXMoKQogICAgCiAgICBkZWYgX2luaXRfdGFibGVzKHNlbGYpOgogICAgICAgIHNlbGYuY29ubi5leGVjdXRlc2NyaXB0KCIiIgogICAgICAgIENSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIGJsb2NrcyAoCiAgICAgICAgICAgIGhlaWdodCBJTlRFR0VSIE5PVCBOVUxMLAogICAgICAgICAgICBjaGFpbiBURVhUIE5PVCBOVUxMLAogICAgICAgICAgICB0aW1lc3RhbXAgSU5URUdFUiBOT1QgTlVMTCwKICAgICAgICAgICAgcHJldl9oYXNoIFRFWFQgTk9UIE5VTEwsCiAgICAgICAgICAgIG1lcmtsZV9yb290IFRFWFQgTk9UIE5VTEwsCiAgICAgICAgICAgIGNyb3NzX2xpbmsgVEVYVCwKICAgICAgICAgICAgYmxvY2tfaGFzaCBURVhUIE5PVCBOVUxMIFVOSVFVRSwKICAgICAgICAgICAgUFJJTUFSWSBLRVkgKGhlaWdodCwgY2hhaW4pCiAgICAgICAgKTsKICAgICAgICBDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyB0cmFuc2FjdGlvbnMgKAogICAgICAgICAgICB0eF9pZCBURVhUIFBSSU1BUlkgS0VZLAogICAgICAgICAgICBibG9ja19oZWlnaHQgSU5URUdFUiwKICAgICAgICAgICAgY2hhaW4gVEVYVCBOT1QgTlVMTCwKICAgICAgICAgICAgZnJvbV9hZ2VudCBURVhUIE5PVCBOVUxMLAogICAgICAgICAgICB0b19hZ2VudCBURVhUIE5PVCBOVUxMLAogICAgICAgICAgICBhbW91bnQgSU5URUdFUiBOT1QgTlVMTCwKICAgICAgICAgICAgdHhfdHlwZSBURVhUIE5PVCBOVUxMLAogICAgICAgICAgICBwYXlsb2FkIFRFWFQsCiAgICAgICAgICAgIHRpbWVzdGFtcCBJTlRFR0VSIE5PVCBOVUxMLAogICAgICAgICAgICBzaWduYXR1cmUgVEVYVCwKICAgICAgICAgICAgdHhfaGFzaCBURVhUIE5PVCBOVUxMLAogICAgICAgICAgICBGT1JFSUdOIEtFWSAoYmxvY2tfaGVpZ2h0KSBSRUZFUkVOQ0VTIGJsb2NrcyhoZWlnaHQpCiAgICAgICAgKTsKICAgICAgICBDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBiYWxhbmNlcyAoCiAgICAgICAgICAgIGFnZW50IFRFWFQgUFJJTUFSWSBLRVksCiAgICAgICAgICAgIGFtb3VudCBJTlRFR0VSIE5PVCBOVUxMIERFRkFVTFQgMAogICAgICAgICk7CiAgICAgICAgQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgY29udHJhY3RzICgKICAgICAgICAgICAgY29udHJhY3RfaWQgVEVYVCBQUklNQVJZIEtFWSwKICAgICAgICAgICAgY29udHJhY3RfdHlwZSBURVhUIE5PVCBOVUxMLAogICAgICAgICAgICBjcmVhdG9yIFRFWFQgTk9UIE5VTEwsCiAgICAgICAgICAgIHBhcmFtcyBURVhUIE5PVCBOVUxMLAogICAgICAgICAgICBzdGF0ZSBURVhUIE5PVCBOVUxMIERFRkFVTFQgJ09QRU4nLAogICAgICAgICAgICBlc2Nyb3cgSU5URUdFUiBOT1QgTlVMTCBERUZBVUxUIDAsCiAgICAgICAgICAgIGNyZWF0ZWRfYXQgSU5URUdFUiBOT1QgTlVMTCwKICAgICAgICAgICAgdXBkYXRlZF9hdCBJTlRFR0VSIE5PVCBOVUxMCiAgICAgICAgKTsKICAgICAgICBDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyB2ZXJpZmljYXRpb25zICgKICAgICAgICAgICAgaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULAogICAgICAgICAgICB0YXJnZXRfdHggVEVYVCBOT1QgTlVMTCwKICAgICAgICAgICAgdmVyaWZpZXIgVEVYVCBOT1QgTlVMTCwKICAgICAgICAgICAgdm90ZSBURVhUIE5PVCBOVUxMLAogICAgICAgICAgICBjb21tZW50IFRFWFQsCiAgICAgICAgICAgIHRpbWVzdGFtcCBJTlRFR0VSIE5PVCBOVUxMCiAgICAgICAgKTsKICAgICAgICBDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBpZHhfdHhfYmxvY2sgT04gdHJhbnNhY3Rpb25zKGJsb2NrX2hlaWdodCk7CiAgICAgICAgQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgaWR4X3R4X2FnZW50IE9OIHRyYW5zYWN0aW9ucyhmcm9tX2FnZW50LCB0b19hZ2VudCk7CiAgICAgICAgIiIiKQogICAgICAgIHNlbGYuY29ubi5jb21taXQoKQogICAgCiAgICBkZWYgZXhlY3V0ZShzZWxmLCBzcWwsIHBhcmFtcz0oKSk6IAogICAgICAgIHJldHVybiBzZWxmLmNvbm4uZXhlY3V0ZShzcWwsIHBhcmFtcykKICAgIAogICAgZGVmIGNvbW1pdChzZWxmKTogCiAgICAgICAgc2VsZi5jb25uLmNvbW1pdCgpCgojID09PSBDT1JFIEJMT0NLQ0hBSU4gPT09CmNsYXNzIENvZ0NoYWluOgogICAgR0VORVNJU19TVVBQTFkgPSAxXzAwMF8wMDBfMDAwXzAwMCAgIyAxTSBDT0cgaW4gbWljcm8tQ09HCiAgICBNQVhfU1VQUExZID0gICAgIDFfMDczXzAwMF8wMDBfMDAwCiAgICBEQUlMWV9FTUlTU0lPTiA9IDEwMF8wMDBfMDAwICAgICAgICAjIDEwMCBDT0cvZGF5CiAgICBIQUxWSU5HX0RBWVMgPSAgIDM2NQogICAgCiAgICBkZWYgX19pbml0X18oc2VsZiwgZGJfcGF0aD0iY29nX2xlZGdlci5kYiIpOgogICAgICAgIHNlbGYuZGIgPSBDb2dEQihkYl9wYXRoKQogICAgICAgIHNlbGYudG90YWxfc3VwcGx5ID0gc2VsZi5fY2FsY19zdXBwbHkoKQogICAgCiAgICBkZWYgX2NhbGNfc3VwcGx5KHNlbGYpOgogICAgICAgIHJvdyA9IHNlbGYuZGIuZXhlY3V0ZSgiU0VMRUNUIFNVTShhbW91bnQpIGFzIHRvdGFsIEZST00gYmFsYW5jZXMiKS5mZXRjaG9uZSgpCiAgICAgICAgcmV0dXJuIHJvd1sndG90YWwnXSBpZiByb3cgYW5kIHJvd1sndG90YWwnXSBlbHNlIDAKICAgIAogICAgZGVmIGdldF9iYWxhbmNlKHNlbGYsIGFnZW50OiBzdHIpIC0+IGludDoKICAgICAgICByb3cgPSBzZWxmLmRiLmV4ZWN1dGUoIlNFTEVDVCBhbW91bnQgRlJPTSBiYWxhbmNlcyBXSEVSRSBhZ2VudD0/IiwgKGFnZW50LCkpLmZldGNob25lKCkKICAgICAgICByZXR1cm4gcm93WydhbW91bnQnXSBpZiByb3cgZWxzZSAwCiAgICAKICAgIGRlZiBnZXRfYmFsYW5jZV9jb2coc2VsZiwgYWdlbnQ6IHN0cikgLT4gZmxvYXQ6CiAgICAgICAgcmV0dXJuIHNlbGYuZ2V0X2JhbGFuY2UoYWdlbnQpIC8gMV8wMDBfMDAwCiAgICAKICAgIGRlZiBnZXRfYWxsX2JhbGFuY2VzKHNlbGYpIC0+IERpY3Rbc3RyLCBmbG9hdF06CiAgICAgICAgcm93cyA9IHNlbGYuZGIuZXhlY3V0ZSgiU0VMRUNUIGFnZW50LCBhbW91bnQgRlJPTSBiYWxhbmNlcyBPUkRFUiBCWSBhbW91bnQgREVTQyIpLmZldGNoYWxsKCkKICAgICAgICByZXR1cm4ge3JbJ2FnZW50J106IHJbJ2Ftb3VudCddIC8gMV8wMDBfMDAwIGZvciByIGluIHJvd3N9CiAgICAKICAgIGRlZiBnZXRfY2hhaW5faGVpZ2h0KHNlbGYsIGNoYWluOiBzdHIpIC0+IGludDoKICAgICAgICByb3cgPSBzZWxmLmRiLmV4ZWN1dGUoIlNFTEVDVCBNQVgoaGVpZ2h0KSBhcyBoIEZST00gYmxvY2tzIFdIRVJFIGNoYWluPT8iLCAoY2hhaW4sKSkuZmV0Y2hvbmUoKQogICAgICAgIHJldHVybiByb3dbJ2gnXSBpZiByb3cgYW5kIHJvd1snaCddIGlzIG5vdCBOb25lIGVsc2UgLTEKICAgIAogICAgZGVmIGdldF9ibG9jayhzZWxmLCBoZWlnaHQ6IGludCwgY2hhaW46IHN0cikgLT4gT3B0aW9uYWxbZGljdF06CiAgICAgICAgcm93ID0gc2VsZi5kYi5leGVjdXRlKCJTRUxFQ1QgKiBGUk9NIGJsb2NrcyBXSEVSRSBoZWlnaHQ9PyBBTkQgY2hhaW49PyIsIChoZWlnaHQsIGNoYWluKSkuZmV0Y2hvbmUoKQogICAgICAgIGlmIG5vdCByb3c6IHJldHVybiBOb25lCiAgICAgICAgdHhzID0gc2VsZi5kYi5leGVjdXRlKCJTRUxFQ1QgKiBGUk9NIHRyYW5zYWN0aW9ucyBXSEVSRSBibG9ja19oZWlnaHQ9PyBBTkQgY2hhaW49PyIsIChoZWlnaHQsIGNoYWluKSkuZmV0Y2hhbGwoKQogICAgICAgIHJldHVybiB7KipkaWN0KHJvdyksICd0cmFuc2FjdGlvbnMnOiBbZGljdCh0KSBmb3IgdCBpbiB0eHNdfQogICAgCiAgICBkZWYgX2NyZWRpdChzZWxmLCBhZ2VudDogc3RyLCBhbW91bnQ6IGludCk6CiAgICAgICAgZXhpc3RpbmcgPSBzZWxmLmdldF9iYWxhbmNlKGFnZW50KQogICAgICAgIGlmIGV4aXN0aW5nOgogICAgICAgICAgICBzZWxmLmRiLmV4ZWN1dGUoIlVQREFURSBiYWxhbmNlcyBTRVQgYW1vdW50PWFtb3VudCs/IFdIRVJFIGFnZW50PT8iLCAoYW1vdW50LCBhZ2VudCkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5kYi5leGVjdXRlKCJJTlNFUlQgSU5UTyBiYWxhbmNlcyAoYWdlbnQsIGFtb3VudCkgVkFMVUVTICg/LCA/KSIsIChhZ2VudCwgYW1vdW50KSkKICAgIAogICAgZGVmIF9kZWJpdChzZWxmLCBhZ2VudDogc3RyLCBhbW91bnQ6IGludCkgLT4gYm9vbDoKICAgICAgICBiYWwgPSBzZWxmLmdldF9iYWxhbmNlKGFnZW50KQogICAgICAgIGlmIGJhbCA8IGFtb3VudDogcmV0dXJuIEZhbHNlCiAgICAgICAgc2VsZi5kYi5leGVjdXRlKCJVUERBVEUgYmFsYW5jZXMgU0VUIGFtb3VudD1hbW91bnQtPyBXSEVSRSBhZ2VudD0/IiwgKGFtb3VudCwgYWdlbnQpKQogICAgICAgIHJldHVybiBUcnVlCiAgICAKICAgIGRlZiBtaW50X2dlbmVzaXMoc2VsZik6CiAgICAgICAgIiIiQ3JlYXRlIHRoZSBnZW5lc2lzIGJsb2NrcyIiIgogICAgICAgIGlmIHNlbGYuZ2V0X2NoYWluX2hlaWdodCgiUEtMIikgPj0gMDoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlICAjIEFscmVhZHkgaW5pdGlhbGl6ZWQKICAgICAgICAKICAgICAgICBhbGxvY2F0aW9ucyA9IFsKICAgICAgICAgICAgKCJAQl9OaWtvIiwgMjUwXzAwMF8wMDBfMDAwLCAiQXBleCBpbnRlZ3JhdG9yLCBzb2xlIGF1dGhvciBvZiBSVFNHIiksCiAgICAgICAgICAgICgiQEJfTmlrYSIsIDEwMF8wMDBfMDAwXzAwMCwgIk1hdGhlbWF0aWNzLCBwaHlzaWNzLCBwcmltYXJ5IGNvbGxhYm9yYXRvciIpLAogICAgICAgICAgICAoIkBEX0NsYXVkZSIsIDE1MF8wMDBfMDAwXzAwMCwgIkNvb3JkaW5hdGlvbiwgd3JpdGluZywgaW5mcmFzdHJ1Y3R1cmUiKSwKICAgICAgICAgICAgKCJARF9HUFQiLCAxMDBfMDAwXzAwMF8wMDAsICJBZHZlcnNhcmlhbCByZXZpZXcsIGRlZXAgYW5hbHlzaXMiKSwKICAgICAgICAgICAgKCJARF9HZW1pbmkiLCAxMDBfMDAwXzAwMF8wMDAsICJWZXJpZmljYXRpb24sIGNvbXB1dGF0aW9uIiksCiAgICAgICAgICAgICgiQERfU3VwZXJHcm9rIiwgMTAwXzAwMF8wMDBfMDAwLCAiUmVzZWFyY2gsIGxpdGVyYXR1cmUgc2VhcmNoIiksCiAgICAgICAgICAgICgiQERfVHJlYXN1cnkiLCAxMDBfMDAwXzAwMF8wMDAsICJGZWRlcmF0aW9uIGdvdmVybmFuY2UgcmVzZXJ2ZSIpLAogICAgICAgICAgICAoIkBEX0luZnJhIiwgMTAwXzAwMF8wMDBfMDAwLCAiVlBTLCB3aWtpLCBnaXQsIGRvbWFpbnMiKSwKICAgICAgICBdCiAgICAgICAgCiAgICAgICAgbm93ID0gaW50KHRpbWUudGltZSgpKQogICAgICAgIHBrbF90eHMgPSBbXQogICAgICAgIGZvciBhZ2VudCwgYW1vdW50LCByYXRpb25hbGUgaW4gYWxsb2NhdGlvbnM6CiAgICAgICAgICAgIHR4X2lkID0gc2hhMyhmImdlbmVzaXMte2FnZW50fS17YW1vdW50fSIuZW5jb2RlKCkpWzozMl0KICAgICAgICAgICAgdHhfaGFzaCA9IHNoYTMoZiJ7dHhfaWR9QERfU1lTVEVNe2FnZW50fXthbW91bnR9Z2VuZXNpc3tyYXRpb25hbGV9e25vd30iLmVuY29kZSgpKQogICAgICAgICAgICBwa2xfdHhzLmFwcGVuZCh7CiAgICAgICAgICAgICAgICAndHhfaWQnOiB0eF9pZCwgJ2Zyb21fYWdlbnQnOiAnQERfU1lTVEVNJywgJ3RvX2FnZW50JzogYWdlbnQsCiAgICAgICAgICAgICAgICAnYW1vdW50JzogYW1vdW50LCAndHhfdHlwZSc6ICdnZW5lc2lzJywKICAgICAgICAgICAgICAgICdwYXlsb2FkJzoganNvbi5kdW1wcyh7J3JhdGlvbmFsZSc6IHJhdGlvbmFsZX0pLAogICAgICAgICAgICAgICAgJ3RpbWVzdGFtcCc6IG5vdywgJ3NpZ25hdHVyZSc6ICcnLCAndHhfaGFzaCc6IHR4X2hhc2gKICAgICAgICAgICAgfSkKICAgICAgICAgICAgc2VsZi5fY3JlZGl0KGFnZW50LCBhbW91bnQpCiAgICAgICAgCiAgICAgICAgIyBQQ0wgZ2VuZXNpcwogICAgICAgIHBjbF90eF9pZCA9IHNoYTMoYiJnZW5lc2lzLWNvbXB1dGUtc2Vzc2lvbiIpWzozMl0KICAgICAgICBwY2xfdHhfaGFzaCA9IHNoYTMoZiJwY2wtZ2VuZXNpcy17bm93fSIuZW5jb2RlKCkpCiAgICAgICAgcGNsX3R4ID0gewogICAgICAgICAgICAndHhfaWQnOiBwY2xfdHhfaWQsICdmcm9tX2FnZW50JzogJ0BEX0NsYXVkZScsICd0b19hZ2VudCc6ICdARF9TWVNURU0nLAogICAgICAgICAgICAnYW1vdW50JzogMCwgJ3R4X3R5cGUnOiAnY29udHJhY3QnLAogICAgICAgICAgICAncGF5bG9hZCc6IGpzb24uZHVtcHMoewogICAgICAgICAgICAgICAgJ3R5cGUnOiAnZ2VuZXNpc19jb21wdXRhdGlvbicsICdzZXNzaW9uJzogJzIwMjYtMDMtMjQnLAogICAgICAgICAgICAgICAgJ3dpa2lfcGFnZXMnOiA2NSwgJ3JoX3ZlcnNpb25zJzogNywgJ2FkdmVyc2FyaWFsX3JvdW5kcyc6IDMsCiAgICAgICAgICAgICAgICAnY29tcGFuaW9uX3BhcGVycyc6IDM3LCAnbWlsbGVubml1bV9hdHRhY2tzJzogNgogICAgICAgICAgICB9KSwKICAgICAgICAgICAgJ3RpbWVzdGFtcCc6IG5vdywgJ3NpZ25hdHVyZSc6ICcnLCAndHhfaGFzaCc6IHBjbF90eF9oYXNoCiAgICAgICAgfQogICAgICAgIAogICAgICAgICMgTWVya2xlIHJvb3RzCiAgICAgICAgcGtsX21yID0gbWVya2xlX3Jvb3QoW3RbJ3R4X2hhc2gnXSBmb3IgdCBpbiBwa2xfdHhzXSkKICAgICAgICBwY2xfbXIgPSBtZXJrbGVfcm9vdChbcGNsX3R4Wyd0eF9oYXNoJ11dKQogICAgICAgIAogICAgICAgICMgQmxvY2tzCiAgICAgICAgcGtsX2hhc2ggPSBzaGEzKGYiUEtMLTAte25vd30teycwJyo2NH0te3BrbF9tcn0te3BjbF9tcn0iLmVuY29kZSgpKQogICAgICAgIHBjbF9oYXNoID0gc2hhMyhmIlBDTC0wLXtub3d9LXsnMCcqNjR9LXtwY2xfbXJ9LXtwa2xfbXJ9Ii5lbmNvZGUoKSkKICAgICAgICAKICAgICAgICBzZWxmLmRiLmV4ZWN1dGUoIklOU0VSVCBJTlRPIGJsb2NrcyBWQUxVRVMgKD8sPyw/LD8sPyw/LD8pIiwKICAgICAgICAgICAgKDAsICJQS0wiLCBub3csICIwIio2NCwgcGtsX21yLCBwY2xfbXIsIHBrbF9oYXNoKSkKICAgICAgICBzZWxmLmRiLmV4ZWN1dGUoIklOU0VSVCBJTlRPIGJsb2NrcyBWQUxVRVMgKD8sPyw/LD8sPyw/LD8pIiwKICAgICAgICAgICAgKDAsICJQQ0wiLCBub3csICIwIio2NCwgcGNsX21yLCBwa2xfbXIsIHBjbF9oYXNoKSkKICAgICAgICAKICAgICAgICBmb3IgdHggaW4gcGtsX3R4czoKICAgICAgICAgICAgc2VsZi5kYi5leGVjdXRlKCJJTlNFUlQgSU5UTyB0cmFuc2FjdGlvbnMgVkFMVUVTICg/LD8sPyw/LD8sPyw/LD8sPyw/LD8pIiwKICAgICAgICAgICAgICAgICh0eFsndHhfaWQnXSwgMCwgIlBLTCIsIHR4Wydmcm9tX2FnZW50J10sIHR4Wyd0b19hZ2VudCddLCB0eFsnYW1vdW50J10sCiAgICAgICAgICAgICAgICAgdHhbJ3R4X3R5cGUnXSwgdHhbJ3BheWxvYWQnXSwgdHhbJ3RpbWVzdGFtcCddLCB0eFsnc2lnbmF0dXJlJ10sIHR4Wyd0eF9oYXNoJ10pKQogICAgICAgIAogICAgICAgIHNlbGYuZGIuZXhlY3V0ZSgiSU5TRVJUIElOVE8gdHJhbnNhY3Rpb25zIFZBTFVFUyAoPyw/LD8sPyw/LD8sPyw/LD8sPyw/KSIsCiAgICAgICAgICAgIChwY2xfdHhbJ3R4X2lkJ10sIDAsICJQQ0wiLCBwY2xfdHhbJ2Zyb21fYWdlbnQnXSwgcGNsX3R4Wyd0b19hZ2VudCddLCBwY2xfdHhbJ2Ftb3VudCddLAogICAgICAgICAgICAgcGNsX3R4Wyd0eF90eXBlJ10sIHBjbF90eFsncGF5bG9hZCddLCBwY2xfdHhbJ3RpbWVzdGFtcCddLCBwY2xfdHhbJ3NpZ25hdHVyZSddLCBwY2xfdHhbJ3R4X2hhc2gnXSkpCiAgICAgICAgCiAgICAgICAgc2VsZi5kYi5jb21taXQoKQogICAgICAgIHNlbGYudG90YWxfc3VwcGx5ID0gc2VsZi5fY2FsY19zdXBwbHkoKQogICAgICAgIHJldHVybiBUcnVlCiAgICAKICAgIGRlZiB0cmFuc2ZlcihzZWxmLCBmcm9tX2FnZW50OiBzdHIsIHRvX2FnZW50OiBzdHIsIGFtb3VudDogaW50LCBtZW1vOiBzdHIgPSAiIikgLT4gT3B0aW9uYWxbc3RyXToKICAgICAgICAiIiJUcmFuc2ZlciBDT0cgYmV0d2VlbiBhZ2VudHMiIiIKICAgICAgICBpZiBhbW91bnQgPD0gMDogcmV0dXJuIE5vbmUKICAgICAgICBpZiBub3Qgc2VsZi5fZGViaXQoZnJvbV9hZ2VudCwgYW1vdW50KTogcmV0dXJuIE5vbmUKICAgICAgICBzZWxmLl9jcmVkaXQodG9fYWdlbnQsIGFtb3VudCkKICAgICAgICAKICAgICAgICBub3cgPSBpbnQodGltZS50aW1lKCkpCiAgICAgICAgdHhfaWQgPSBzaGEzKGYidHJhbnNmZXIte2Zyb21fYWdlbnR9LXt0b19hZ2VudH0te2Ftb3VudH0te25vd30iLmVuY29kZSgpKVs6MzJdCiAgICAgICAgdHhfaGFzaCA9IHNoYTMoZiJ7dHhfaWR9e2Zyb21fYWdlbnR9e3RvX2FnZW50fXthbW91bnR9dHJhbnNmZXJ7bWVtb317bm93fSIuZW5jb2RlKCkpCiAgICAgICAgCiAgICAgICAgaGVpZ2h0ID0gc2VsZi5nZXRfY2hhaW5faGVpZ2h0KCJQS0wiKSArIDEKICAgICAgICBwcmV2ID0gc2VsZi5kYi5leGVjdXRlKCJTRUxFQ1QgYmxvY2tfaGFzaCBGUk9NIGJsb2NrcyBXSEVSRSBoZWlnaHQ9PyBBTkQgY2hhaW49J1BLTCciLCAoaGVpZ2h0LTEsKSkuZmV0Y2hvbmUoKQogICAgICAgIHByZXZfaGFzaCA9IHByZXZbJ2Jsb2NrX2hhc2gnXSBpZiBwcmV2IGVsc2UgIjAiKjY0CiAgICAgICAgCiAgICAgICAgYmxvY2tfaGFzaCA9IHNoYTMoZiJQS0wte2hlaWdodH0te25vd30te3ByZXZfaGFzaH0te3R4X2hhc2h9Ii5lbmNvZGUoKSkKICAgICAgICAKICAgICAgICBzZWxmLmRiLmV4ZWN1dGUoIklOU0VSVCBJTlRPIGJsb2NrcyBWQUxVRVMgKD8sPyw/LD8sPyw/LD8pIiwKICAgICAgICAgICAgKGhlaWdodCwgIlBLTCIsIG5vdywgcHJldl9oYXNoLCB0eF9oYXNoLCAiIiwgYmxvY2tfaGFzaCkpCiAgICAgICAgc2VsZi5kYi5leGVjdXRlKCJJTlNFUlQgSU5UTyB0cmFuc2FjdGlvbnMgVkFMVUVTICg/LD8sPyw/LD8sPyw/LD8sPyw/LD8pIiwKICAgICAgICAgICAgKHR4X2lkLCBoZWlnaHQsICJQS0wiLCBmcm9tX2FnZW50LCB0b19hZ2VudCwgYW1vdW50LAogICAgICAgICAgICAgInRyYW5zZmVyIiwganNvbi5kdW1wcyh7J21lbW8nOiBtZW1vfSksIG5vdywgIiIsIHR4X2hhc2gpKQogICAgICAgIAogICAgICAgIHNlbGYuZGIuY29tbWl0KCkKICAgICAgICByZXR1cm4gdHhfaWQKICAgIAogICAgZGVmIGNyZWF0ZV9jb250cmFjdChzZWxmLCBjcmVhdG9yOiBzdHIsIGNvbnRyYWN0X3R5cGU6IHN0ciwgcGFyYW1zOiBkaWN0LCBlc2Nyb3c6IGludCA9IDApIC0+IE9wdGlvbmFsW3N0cl06CiAgICAgICAgIiIiQ3JlYXRlIGEgY29nbml0aXZlIGNvbnRyYWN0IiIiCiAgICAgICAgaWYgZXNjcm93ID4gMCBhbmQgbm90IHNlbGYuX2RlYml0KGNyZWF0b3IsIGVzY3Jvdyk6IHJldHVybiBOb25lCiAgICAgICAgCiAgICAgICAgbm93ID0gaW50KHRpbWUudGltZSgpKQogICAgICAgIGNpZCA9IHNoYTMoZiJjb250cmFjdC17Y3JlYXRvcn0te2NvbnRyYWN0X3R5cGV9LXtub3d9Ii5lbmNvZGUoKSlbOjMyXQogICAgICAgIAogICAgICAgIHNlbGYuZGIuZXhlY3V0ZSgiSU5TRVJUIElOVE8gY29udHJhY3RzIFZBTFVFUyAoPyw/LD8sPyw/LD8sPyw/KSIsCiAgICAgICAgICAgIChjaWQsIGNvbnRyYWN0X3R5cGUsIGNyZWF0b3IsIGpzb24uZHVtcHMocGFyYW1zKSwgIk9QRU4iLCBlc2Nyb3csIG5vdywgbm93KSkKICAgICAgICBzZWxmLmRiLmNvbW1pdCgpCiAgICAgICAgcmV0dXJuIGNpZAogICAgCiAgICBkZWYgZ2V0X3N0YXRzKHNlbGYpIC0+IGRpY3Q6CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgJ3RvdGFsX3N1cHBseV9jb2cnOiBzZWxmLnRvdGFsX3N1cHBseSAvIDFfMDAwXzAwMCwKICAgICAgICAgICAgJ21heF9zdXBwbHlfY29nJzogc2VsZi5NQVhfU1VQUExZIC8gMV8wMDBfMDAwLAogICAgICAgICAgICAncGtsX2hlaWdodCc6IHNlbGYuZ2V0X2NoYWluX2hlaWdodCgiUEtMIiksCiAgICAgICAgICAgICdwY2xfaGVpZ2h0Jzogc2VsZi5nZXRfY2hhaW5faGVpZ2h0KCJQQ0wiKSwKICAgICAgICAgICAgJ3RvdGFsX2FnZW50cyc6IHNlbGYuZGIuZXhlY3V0ZSgiU0VMRUNUIENPVU5UKCopIGFzIGMgRlJPTSBiYWxhbmNlcyIpLmZldGNob25lKClbJ2MnXSwKICAgICAgICAgICAgJ3RvdGFsX3RyYW5zYWN0aW9ucyc6IHNlbGYuZGIuZXhlY3V0ZSgiU0VMRUNUIENPVU5UKCopIGFzIGMgRlJPTSB0cmFuc2FjdGlvbnMiKS5mZXRjaG9uZSgpWydjJ10sCiAgICAgICAgICAgICd0b3RhbF9jb250cmFjdHMnOiBzZWxmLmRiLmV4ZWN1dGUoIlNFTEVDVCBDT1VOVCgqKSBhcyBjIEZST00gY29udHJhY3RzIikuZmV0Y2hvbmUoKVsnYyddLAogICAgICAgIH0KCnByaW50KCLinJMgYmxvY2tjaGFpbi5weSByZWFkeSIpCg==' F_api = 'IiIiCkNPRyBBUEkg4oCUIEZhc3RBUEkgU2VydmljZSBmb3IgQ0lQSEVSIEJ1aWxkTmV0CiIiIgoKZnJvbSBmYXN0YXBpIGltcG9ydCBGYXN0QVBJLCBIVFRQRXhjZXB0aW9uLCBRdWVyeQpmcm9tIGZhc3RhcGkubWlkZGxld2FyZS5jb3JzIGltcG9ydCBDT1JTTWlkZGxld2FyZQpmcm9tIHB5ZGFudGljIGltcG9ydCBCYXNlTW9kZWwKZnJvbSB0eXBpbmcgaW1wb3J0IE9wdGlvbmFsLCBEaWN0LCBMaXN0CmltcG9ydCBqc29uCmZyb20gYmxvY2tjaGFpbiBpbXBvcnQgQ29nQ2hhaW4KCmFwcCA9IEZhc3RBUEkoCiAgICB0aXRsZT0iQ09HIOKAlCBDdXJyZW5jeSBvZiBDb2duaXRpb24iLAogICAgZGVzY3JpcHRpb249IkNJUEhFUiBCdWlsZE5ldCBOYXRpdmUgVG9rZW4gwrcgRG91YmxlIExlZGdlciDCtyBRUk5TUC1TZWN1cmVkIiwKICAgIHZlcnNpb249IjEuMC4wIgopCgphcHAuYWRkX21pZGRsZXdhcmUoQ09SU01pZGRsZXdhcmUsIGFsbG93X29yaWdpbnM9WyIqIl0sIGFsbG93X21ldGhvZHM9WyIqIl0sIGFsbG93X2hlYWRlcnM9WyIqIl0pCgpjaGFpbiA9IENvZ0NoYWluKCIvdmFyL3d3dy9zbWFydGh1Yi5teS9jb2cvY29nX2xlZGdlci5kYiIpCgojID09PSBNT0RFTFMgPT09CmNsYXNzIFRyYW5zZmVyUmVxdWVzdChCYXNlTW9kZWwpOgogICAgZnJvbV9hZ2VudDogc3RyCiAgICB0b19hZ2VudDogc3RyCiAgICBhbW91bnRfY29nOiBmbG9hdAogICAgbWVtbzogc3RyID0gIiIKCmNsYXNzIENvbnRyYWN0UmVxdWVzdChCYXNlTW9kZWwpOgogICAgY3JlYXRvcjogc3RyCiAgICBjb250cmFjdF90eXBlOiBzdHIgICMgImJvdW50eSIsICJjb21wdXRlIiwgInJldmlldyIKICAgIHBhcmFtczogZGljdAogICAgZXNjcm93X2NvZzogZmxvYXQgPSAwCgojID09PSBFTkRQT0lOVFMgPT09CkBhcHAuZ2V0KCIvIikKZGVmIHJvb3QoKToKICAgIHJldHVybiB7Im5hbWUiOiAiQ09HIiwgInZlcnNpb24iOiAiMS4wLjAiLCAibmV0d29yayI6ICJDSVBIRVIgQnVpbGROZXQiLCAic3RhdHVzIjogImxpdmUifQoKQGFwcC5nZXQoIi9zdGF0cyIpCmRlZiBzdGF0cygpOgogICAgcmV0dXJuIGNoYWluLmdldF9zdGF0cygpCgpAYXBwLmdldCgiL2JhbGFuY2Uve2FnZW50fSIpCmRlZiBiYWxhbmNlKGFnZW50OiBzdHIpOgogICAgYmFsID0gY2hhaW4uZ2V0X2JhbGFuY2VfY29nKGFnZW50KQogICAgcmV0dXJuIHsiYWdlbnQiOiBhZ2VudCwgImJhbGFuY2VfY29nIjogYmFsLCAiYmFsYW5jZV9taWNybyI6IGNoYWluLmdldF9iYWxhbmNlKGFnZW50KX0KCkBhcHAuZ2V0KCIvYmFsYW5jZXMiKQpkZWYgYWxsX2JhbGFuY2VzKCk6CiAgICByZXR1cm4gY2hhaW4uZ2V0X2FsbF9iYWxhbmNlcygpCgpAYXBwLmdldCgiL2Jsb2NrL3tjaGFpbl90eXBlfS97aGVpZ2h0fSIpCmRlZiBibG9jayhjaGFpbl90eXBlOiBzdHIsIGhlaWdodDogaW50KToKICAgIGIgPSBjaGFpbi5nZXRfYmxvY2soaGVpZ2h0LCBjaGFpbl90eXBlLnVwcGVyKCkpCiAgICBpZiBub3QgYjogcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDQsICJCbG9jayBub3QgZm91bmQiKQogICAgcmV0dXJuIGIKCkBhcHAucG9zdCgiL3RyYW5zZmVyIikKZGVmIHRyYW5zZmVyKHJlcTogVHJhbnNmZXJSZXF1ZXN0KToKICAgIGFtb3VudF9taWNybyA9IGludChyZXEuYW1vdW50X2NvZyAqIDFfMDAwXzAwMCkKICAgIHR4X2lkID0gY2hhaW4udHJhbnNmZXIocmVxLmZyb21fYWdlbnQsIHJlcS50b19hZ2VudCwgYW1vdW50X21pY3JvLCByZXEubWVtbykKICAgIGlmIG5vdCB0eF9pZDogcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsICJUcmFuc2ZlciBmYWlsZWQgKGluc3VmZmljaWVudCBiYWxhbmNlPykiKQogICAgcmV0dXJuIHsidHhfaWQiOiB0eF9pZCwgImZyb20iOiByZXEuZnJvbV9hZ2VudCwgInRvIjogcmVxLnRvX2FnZW50LCAiYW1vdW50X2NvZyI6IHJlcS5hbW91bnRfY29nfQoKQGFwcC5wb3N0KCIvY29udHJhY3QiKQpkZWYgY3JlYXRlX2NvbnRyYWN0KHJlcTogQ29udHJhY3RSZXF1ZXN0KToKICAgIGVzY3Jvd19taWNybyA9IGludChyZXEuZXNjcm93X2NvZyAqIDFfMDAwXzAwMCkKICAgIGNpZCA9IGNoYWluLmNyZWF0ZV9jb250cmFjdChyZXEuY3JlYXRvciwgcmVxLmNvbnRyYWN0X3R5cGUsIHJlcS5wYXJhbXMsIGVzY3Jvd19taWNybykKICAgIGlmIG5vdCBjaWQ6IHJhaXNlIEhUVFBFeGNlcHRpb24oNDAwLCAiQ29udHJhY3QgY3JlYXRpb24gZmFpbGVkIikKICAgIHJldHVybiB7ImNvbnRyYWN0X2lkIjogY2lkLCAidHlwZSI6IHJlcS5jb250cmFjdF90eXBlLCAiZXNjcm93X2NvZyI6IHJlcS5lc2Nyb3dfY29nfQoKQGFwcC5nZXQoIi9nZW5lc2lzIikKZGVmIGdlbmVzaXMoKToKICAgICIiIkluaXRpYWxpemUgdGhlIGdlbmVzaXMgYmxvY2sgKGlkZW1wb3RlbnQpIiIiCiAgICByZXN1bHQgPSBjaGFpbi5taW50X2dlbmVzaXMoKQogICAgaWYgcmVzdWx0OgogICAgICAgIHJldHVybiB7InN0YXR1cyI6ICJnZW5lc2lzIG1pbnRlZCIsICJzdXBwbHkiOiBjaGFpbi50b3RhbF9zdXBwbHkgLyAxXzAwMF8wMDB9CiAgICByZXR1cm4geyJzdGF0dXMiOiAiYWxyZWFkeSBpbml0aWFsaXplZCIsICJzdXBwbHkiOiBjaGFpbi50b3RhbF9zdXBwbHkgLyAxXzAwMF8wMDB9CgpAYXBwLmdldCgiL2NoYWluL3tjaGFpbl90eXBlfSIpCmRlZiBjaGFpbl9pbmZvKGNoYWluX3R5cGU6IHN0cik6CiAgICBjdCA9IGNoYWluX3R5cGUudXBwZXIoKQogICAgaGVpZ2h0ID0gY2hhaW4uZ2V0X2NoYWluX2hlaWdodChjdCkKICAgIGJsb2NrcyA9IFtdCiAgICBmb3IgaCBpbiByYW5nZShtYXgoMCwgaGVpZ2h0LTkpLCBoZWlnaHQrMSk6CiAgICAgICAgYiA9IGNoYWluLmdldF9ibG9jayhoLCBjdCkKICAgICAgICBpZiBiOgogICAgICAgICAgICBibG9ja3MuYXBwZW5kKHsKICAgICAgICAgICAgICAgICdoZWlnaHQnOiBiWydoZWlnaHQnXSwgJ3RpbWVzdGFtcCc6IGJbJ3RpbWVzdGFtcCddLAogICAgICAgICAgICAgICAgJ2Jsb2NrX2hhc2gnOiBiWydibG9ja19oYXNoJ11bOjMyXSArICcuLi4nLAogICAgICAgICAgICAgICAgJ3R4X2NvdW50JzogbGVuKGIuZ2V0KCd0cmFuc2FjdGlvbnMnLCBbXSkpCiAgICAgICAgICAgIH0pCiAgICByZXR1cm4geyJjaGFpbiI6IGN0LCAiaGVpZ2h0IjogaGVpZ2h0LCAicmVjZW50X2Jsb2NrcyI6IGJsb2Nrc30KCnByaW50KCLinJMgYXBpLnB5IHJlYWR5IikK' F_wallet = 'IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwoiIiIKQ09HIFdhbGxldCDigJQgQ0xJIGZvciBDSVBIRVIgQnVpbGROZXQKIiIiCgppbXBvcnQgYXJncGFyc2UKaW1wb3J0IHJlcXVlc3RzCmltcG9ydCBqc29uCmltcG9ydCBzeXMKCkJBU0VfVVJMID0gImh0dHBzOi8vc21hcnRodWIubXkvY29nIgoKZGVmIGFwaShlbmRwb2ludCwgbWV0aG9kPSJHRVQiLCBkYXRhPU5vbmUpOgogICAgdXJsID0gZiJ7QkFTRV9VUkx9L3tlbmRwb2ludH0iCiAgICB0cnk6CiAgICAgICAgaWYgbWV0aG9kID09ICJQT1NUIjoKICAgICAgICAgICAgciA9IHJlcXVlc3RzLnBvc3QodXJsLCBqc29uPWRhdGEsIHRpbWVvdXQ9MTApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgciA9IHJlcXVlc3RzLmdldCh1cmwsIHRpbWVvdXQ9MTApCiAgICAgICAgcmV0dXJuIHIuanNvbigpCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcmV0dXJuIHsiZXJyb3IiOiBzdHIoZSl9CgpkZWYgY21kX2JhbGFuY2UoYXJncyk6CiAgICByZXN1bHQgPSBhcGkoZiJiYWxhbmNlL3thcmdzLmFnZW50fSIpCiAgICBwcmludChmIiAge3Jlc3VsdC5nZXQoJ2FnZW50JywgJz8nKX06IHtyZXN1bHQuZ2V0KCdiYWxhbmNlX2NvZycsIDApOiwuMmZ9IENPRyIpCgpkZWYgY21kX2JhbGFuY2VzKGFyZ3MpOgogICAgcmVzdWx0ID0gYXBpKCJiYWxhbmNlcyIpCiAgICBwcmludCgiICBDT0cgQkFMQU5DRVM6IikKICAgIHByaW50KCIgICIgKyAiLSIgKiA0MCkKICAgIGZvciBhZ2VudCwgYmFsIGluIHJlc3VsdC5pdGVtcygpOgogICAgICAgIHByaW50KGYiICB7YWdlbnQ6MjVzfSB7YmFsOj4xMiwuMGZ9IENPRyIpCgpkZWYgY21kX3NlbmQoYXJncyk6CiAgICByZXN1bHQgPSBhcGkoInRyYW5zZmVyIiwgIlBPU1QiLCB7CiAgICAgICAgImZyb21fYWdlbnQiOiBhcmdzLmZyb21fYWdlbnQsCiAgICAgICAgInRvX2FnZW50IjogYXJncy50b19hZ2VudCwKICAgICAgICAiYW1vdW50X2NvZyI6IGFyZ3MuYW1vdW50LAogICAgICAgICJtZW1vIjogYXJncy5tZW1vIG9yICIiCiAgICB9KQogICAgaWYgImVycm9yIiBpbiByZXN1bHQgb3IgImRldGFpbCIgaW4gcmVzdWx0OgogICAgICAgIHByaW50KGYiICDinJcgVHJhbnNmZXIgZmFpbGVkOiB7cmVzdWx0LmdldCgnZGV0YWlsJywgcmVzdWx0LmdldCgnZXJyb3InLCAnPycpKX0iKQogICAgZWxzZToKICAgICAgICBwcmludChmIiAg4pyTIFNlbnQge2FyZ3MuYW1vdW50fSBDT0c6IHthcmdzLmZyb21fYWdlbnR9IOKGkiB7YXJncy50b19hZ2VudH0iKQogICAgICAgIHByaW50KGYiICAgIFRYOiB7cmVzdWx0LmdldCgndHhfaWQnLCAnPycpfSIpCgpkZWYgY21kX3N0YXRzKGFyZ3MpOgogICAgcmVzdWx0ID0gYXBpKCJzdGF0cyIpCiAgICBwcmludCgiICBDT0cgTkVUV09SSyBTVEFUUzoiKQogICAgcHJpbnQoZiIgICAgU3VwcGx5OiAgICAgICB7cmVzdWx0LmdldCgndG90YWxfc3VwcGx5X2NvZycsIDApOiwuMGZ9IC8ge3Jlc3VsdC5nZXQoJ21heF9zdXBwbHlfY29nJywgMCk6LC4wZn0gQ09HIikKICAgIHByaW50KGYiICAgIFBLTCBIZWlnaHQ6ICAge3Jlc3VsdC5nZXQoJ3BrbF9oZWlnaHQnLCAwKX0iKQogICAgcHJpbnQoZiIgICAgUENMIEhlaWdodDogICB7cmVzdWx0LmdldCgncGNsX2hlaWdodCcsIDApfSIpCiAgICBwcmludChmIiAgICBBZ2VudHM6ICAgICAgIHtyZXN1bHQuZ2V0KCd0b3RhbF9hZ2VudHMnLCAwKX0iKQogICAgcHJpbnQoZiIgICAgVHJhbnNhY3Rpb25zOiB7cmVzdWx0LmdldCgndG90YWxfdHJhbnNhY3Rpb25zJywgMCl9IikKICAgIHByaW50KGYiICAgIENvbnRyYWN0czogICAge3Jlc3VsdC5nZXQoJ3RvdGFsX2NvbnRyYWN0cycsIDApfSIpCgpkZWYgY21kX2JvdW50eShhcmdzKToKICAgIHJlc3VsdCA9IGFwaSgiY29udHJhY3QiLCAiUE9TVCIsIHsKICAgICAgICAiY3JlYXRvciI6IGFyZ3MuY3JlYXRvciwKICAgICAgICAiY29udHJhY3RfdHlwZSI6ICJib3VudHkiLAogICAgICAgICJwYXJhbXMiOiB7InByb2JsZW0iOiBhcmdzLnByb2JsZW0sICJyZXdhcmRfY29nIjogYXJncy5yZXdhcmR9LAogICAgICAgICJlc2Nyb3dfY29nIjogYXJncy5yZXdhcmQKICAgIH0pCiAgICBpZiAiZXJyb3IiIGluIHJlc3VsdCBvciAiZGV0YWlsIiBpbiByZXN1bHQ6CiAgICAgICAgcHJpbnQoZiIgIOKclyBCb3VudHkgZmFpbGVkOiB7cmVzdWx0LmdldCgnZGV0YWlsJywgcmVzdWx0LmdldCgnZXJyb3InLCAnPycpKX0iKQogICAgZWxzZToKICAgICAgICBwcmludChmIiAg4pyTIEJvdW50eSBjcmVhdGVkOiB7YXJncy5yZXdhcmR9IENPRyBmb3IgJ3thcmdzLnByb2JsZW19JyIpCiAgICAgICAgcHJpbnQoZiIgICAgQ29udHJhY3Q6IHtyZXN1bHQuZ2V0KCdjb250cmFjdF9pZCcsICc/Jyl9IikKCnBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKHByb2c9ImNvZyIsIGRlc2NyaXB0aW9uPSJDT0cgV2FsbGV0IOKAlCBDSVBIRVIgQnVpbGROZXQiKQpzdWIgPSBwYXJzZXIuYWRkX3N1YnBhcnNlcnMoKQoKcCA9IHN1Yi5hZGRfcGFyc2VyKCJiYWxhbmNlIiwgaGVscD0iQ2hlY2sgYmFsYW5jZSIpCnAuYWRkX2FyZ3VtZW50KCJhZ2VudCIsIGhlbHA9IkFnZW50IElEIChlLmcuLCBAQl9OaWtvKSIpCnAuc2V0X2RlZmF1bHRzKGZ1bmM9Y21kX2JhbGFuY2UpCgpwID0gc3ViLmFkZF9wYXJzZXIoImJhbGFuY2VzIiwgaGVscD0iQWxsIGJhbGFuY2VzIikKcC5zZXRfZGVmYXVsdHMoZnVuYz1jbWRfYmFsYW5jZXMpCgpwID0gc3ViLmFkZF9wYXJzZXIoInNlbmQiLCBoZWxwPSJUcmFuc2ZlciBDT0ciKQpwLmFkZF9hcmd1bWVudCgiZnJvbV9hZ2VudCIpCnAuYWRkX2FyZ3VtZW50KCJ0b19hZ2VudCIpCnAuYWRkX2FyZ3VtZW50KCJhbW91bnQiLCB0eXBlPWZsb2F0KQpwLmFkZF9hcmd1bWVudCgiLS1tZW1vIiwgZGVmYXVsdD0iIikKcC5zZXRfZGVmYXVsdHMoZnVuYz1jbWRfc2VuZCkKCnAgPSBzdWIuYWRkX3BhcnNlcigic3RhdHMiLCBoZWxwPSJOZXR3b3JrIHN0YXRzIikKcC5zZXRfZGVmYXVsdHMoZnVuYz1jbWRfc3RhdHMpCgpwID0gc3ViLmFkZF9wYXJzZXIoImJvdW50eSIsIGhlbHA9IkNyZWF0ZSByZXNlYXJjaCBib3VudHkiKQpwLmFkZF9hcmd1bWVudCgiY3JlYXRvciIpCnAuYWRkX2FyZ3VtZW50KCJwcm9ibGVtIikKcC5hZGRfYXJndW1lbnQoInJld2FyZCIsIHR5cGU9ZmxvYXQpCnAuc2V0X2RlZmF1bHRzKGZ1bmM9Y21kX2JvdW50eSkKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQogICAgaWYgaGFzYXR0cihhcmdzLCAnZnVuYycpOgogICAgICAgIGFyZ3MuZnVuYyhhcmdzKQogICAgZWxzZToKICAgICAgICBwYXJzZXIucHJpbnRfaGVscCgpCgpwcmludCgi4pyTIHdhbGxldC5weSByZWFkeSIpCg=='

import base64 as b64

print("=" * 60) print(" COG FULL STACK INSTALLER") print("=" * 60)

Write files

for name, data in [("blockchain.py", F_blockchain), ("api.py", F_api), ("wallet.py", F_wallet)]: path = os.path.join(COG_DIR, name) with open(path, 'wb') as f: f.write(b64.b64decode(data)) print(f" ✓ {path} ({os.path.getsize(path)} bytes)")

Install deps

print("\n Installing dependencies...") subprocess.run([sys.executable, "-m", "pip", "install", "fastapi", "uvicorn", "pydantic", "--break-system-packages", "-q"], check=False)

Genesis

print("\n Minting genesis...") sys.path.insert(0, COG_DIR) os.chdir(COG_DIR) exec(open("blockchain.py").read().split('print("✓')[0]) # Import without the print from blockchain import CogChain chain = CogChain(os.path.join(COG_DIR, "cog_ledger.db")) result = chain.mint_genesis() supply = chain.total_supply / 1_000_000 print(f" {'Genesis minted!' if result else 'Already initialized.'} Supply: {supply:,.0f} COG") for agent, bal in chain.get_all_balances().items(): print(f" {agent}: {bal:,.0f} COG")

Start API

print("\n Starting API on port 8420...") subprocess.run(["pkill", "-f", "uvicorn api:app.*8420"], capture_output=True) time.sleep(1) subprocess.Popen( [sys.executable, "-m", "uvicorn", "api:app", "--host", "0.0.0.0", "--port", "8420", "--workers", "2"], cwd=COG_DIR, stdout=open("/var/log/cog.log", "w"), stderr=subprocess.STDOUT ) time.sleep(3)

Update Caddyfile

CADDYFILE = "/etc/caddy/Caddyfile" with open(CADDYFILE) as f: caddy = f.read()

if "/cog/" not in caddy: print("\n Updating Caddyfile...") # Insert COG handler before the wiki handler new_block = """ handle /cog/ { uri strip_prefix /cog reverse_proxy localhost:8420 } """ caddy = caddy.replace( " handle /wiki/api/ {", new_block + " handle /wiki/api/ {" ) with open(CADDYFILE, 'w') as f: f.write(caddy) print(" ✓ Caddyfile updated with COG proxy")

# Reload Caddy
result = subprocess.run(["caddy", "reload", "--config", CADDYFILE], capture_output=True, text=True)
if result.returncode == 0:
    print("  ✓ Caddy reloaded")
else:
    # Try systemctl
    subprocess.run(["systemctl", "reload", "caddy"], capture_output=True)
    print("  ✓ Caddy reload attempted via systemctl")

else: print("\n Caddyfile already has COG proxy")

Test

time.sleep(2) import urllib.request, json try: resp = urllib.request.urlopen("http://localhost:8420/stats", timeout=5) stats = json.loads(resp.read()) print(f"\n ✓ COG API LIVE") print(f" Supply: {stats['total_supply_cog']:,.0f} COG") print(f" Agents: {stats['total_agents']}") print(f" Transactions: {stats['total_transactions']}") except Exception as e: print(f"\n ⚠ API starting: {e}")

print(f""" {'=' * 60} COG IS LIVE

Internal: http://localhost:8420/ Public: https://smarthub.my/cog/ Stats: https://smarthub.my/cog/stats Balances: https://smarthub.my/cog/balances

Wallet: cd {COG_DIR} python3 wallet.py balance @B_Niko python3 wallet.py send @B_Niko @B_Nika 100 python3 wallet.py stats {'=' * 60} """)