import base64

with open("templates/dashboard/index.html", "r") as f:
    html = f.read()

footer_html = base64.b64decode("CiAgPCEtLSDilIDilIAgRm9vdGVyIOKUgOKUgCAtLT4KICA8Zm9vdGVyIGNsYXNzPSJzaXRlLWZvb3RlciI+CiAgICA8ZGl2IGNsYXNzPSJmb290ZXItbWFpbiI+CgogICAgICA8IS0tIEJyYW5kIGNvbHVtbiAtLT4KICAgICAgPGRpdiBjbGFzcz0iZm9vdGVyLWJyYW5kIj4KICAgICAgICA8ZGl2IGNsYXNzPSJmb290ZXItbG9nbyI+R2V0Rm91bmQ8c3Bhbj5Mb2NhbDwvc3Bhbj48L2Rpdj4KICAgICAgICA8cCBjbGFzcz0iZm9vdGVyLXRhZ2xpbmUiPk1hbmFnZWQgZGlnaXRhbCBzdG9yZWZyb250cyBmb3IgbG9jYWwgc2VydmljZSBidXNpbmVzc2VzLiBXZSBoYW5kbGUgeW91ciBvbmxpbmUgcHJlc2VuY2Ugc28geW91IGNhbiBmb2N1cyBvbiB0aGUgd29yay48L3A+CiAgICAgICAgPGRpdiBjbGFzcz0iZm9vdGVyLXNvY2lhbCI+CiAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ic29jaWFsLWxpbmsiIGFyaWEtbGFiZWw9IkZhY2Vib29rIj4KICAgICAgICAgICAgPHN2ZyB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iY3VycmVudENvbG9yIj48cGF0aCBkPSJNMTggMmgtM2E1IDUgMCAwIDAtNSA1djNIN3Y0aDN2OGg0di04aDNsMS00aC00VjdhMSAxIDAgMCAxIDEtMWgzeiIvPjwvc3ZnPgogICAgICAgICAgPC9hPgogICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9InNvY2lhbC1saW5rIiBhcmlhLWxhYmVsPSJJbnN0YWdyYW0iPgogICAgICAgICAgICA8c3ZnIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxyZWN0IHg9IjIiIHk9IjIiIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgcng9IjUiIHJ5PSI1Ii8+PHBhdGggZD0iTTE2IDExLjM3QTQgNCAwIDEgMSAxMi42MyA4IDQgNCAwIDAgMSAxNiAxMS4zN3oiLz48bGluZSB4MT0iMTcuNSIgeTE9IjYuNSIgeDI9IjE3LjUxIiB5Mj0iNi41Ii8+PC9zdmc+CiAgICAgICAgICA8L2E+CiAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ic29jaWFsLWxpbmsiIGFyaWEtbGFiZWw9IlggLyBUd2l0dGVyIj4KICAgICAgICAgICAgPHN2ZyB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iY3VycmVudENvbG9yIj48cGF0aCBkPSJNMTguMjQ0IDIuMjVoMy4zMDhsLTcuMjI3IDguMjYgOC41MDIgMTEuMjRIMTYuMTdsLTUuMjE0LTYuODE3TDQuOTkgMjEuNzVIMS42OGw3LjczLTguODM1TDEuMjU0IDIuMjVIOC4wOGw0LjcxMyA2LjIzMXptLTEuMTYxIDE3LjUyaDEuODMzTDcuMDg0IDQuMTI2SDUuMTE3eiIvPjwvc3ZnPgogICAgICAgICAgPC9hPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KCiAgICAgIDwhLS0gU2VydmljZXMgY29sdW1uIC0tPgogICAgICA8ZGl2IGNsYXNzPSJmb290ZXItY29sIj4KICAgICAgICA8aDQ+U2VydmljZXM8L2g0PgogICAgICAgIDx1bD4KICAgICAgICAgIDxsaT48YSBocmVmPSIjIj5NeSBXZWJzaXRlPC9hPjwvbGk+CiAgICAgICAgICA8bGk+PGEgaHJlZj0iIyI+SG9zdGluZzwvYT48L2xpPgogICAgICAgICAgPGxpPjxhIGhyZWY9IiMiPkRvbWFpbjwvYT48L2xpPgogICAgICAgICAgPGxpPjxhIGhyZWY9IiMiPlByaXZhdGUgRW1haWw8L2E+PC9saT4KICAgICAgICAgIDxsaT48YSBocmVmPSIjIj5TU0wgQ2VydGlmaWNhdGU8L2E+PC9saT4KICAgICAgICAgIDxsaT48YSBocmVmPSIjIj5Hb29nbGUgQnVzaW5lc3MgUHJvZmlsZTwvYT48L2xpPgogICAgICAgICAgPGxpPjxhIGhyZWY9IiMiPkZvcm0gWW91ciBCdXNpbmVzczwvYT48L2xpPgogICAgICAgIDwvdWw+CiAgICAgIDwvZGl2PgoKICAgICAgPCEtLSBBY2NvdW50IGNvbHVtbiAtLT4KICAgICAgPGRpdiBjbGFzcz0iZm9vdGVyLWNvbCI+CiAgICAgICAgPGg0PkFjY291bnQ8L2g0PgogICAgICAgIDx1bD4KICAgICAgICAgIDxsaT48YSBocmVmPSJ7eyB1cmxfZm9yKCdkYXNoYm9hcmQuaW5kZXgnKSB9fSI+RGFzaGJvYXJkPC9hPjwvbGk+CiAgICAgICAgICA8bGk+PGEgaHJlZj0ie3sgdXJsX2ZvcignZGFzaGJvYXJkLnN1YnNjcmlwdGlvbnMnKSB9fSI+TXkgU3Vic2NyaXB0aW9uczwvYT48L2xpPgogICAgICAgICAgPGxpPjxhIGhyZWY9Int7IHVybF9mb3IoJ2Rhc2hib2FyZC5vcmRlcnMnKSB9fSI+T3JkZXIgSGlzdG9yeTwvYT48L2xpPgogICAgICAgICAgPGxpPjxhIGhyZWY9Int7IHVybF9mb3IoJ2Rhc2hib2FyZC5zZXR0aW5ncycpIH19Ij5BY2NvdW50IFNldHRpbmdzPC9hPjwvbGk+CiAgICAgICAgICA8bGk+PGEgaHJlZj0iIyI+RXhwaXJpbmcgLyBFeHBpcmVkPC9hPjwvbGk+CiAgICAgICAgPC91bD4KICAgICAgPC9kaXY+CgogICAgICA8IS0tIFN1cHBvcnQgY29sdW1uIC0tPgogICAgICA8ZGl2IGNsYXNzPSJmb290ZXItY29sIj4KICAgICAgICA8aDQ+U3VwcG9ydDwvaDQ+CiAgICAgICAgPHVsPgogICAgICAgICAgPGxpPjxhIGhyZWY9IiMiPlN1Ym1pdCBhIFRpY2tldDwvYT48L2xpPgogICAgICAgICAgPGxpPjxhIGhyZWY9IiMiPktub3dsZWRnZSBCYXNlPC9hPjwvbGk+CiAgICAgICAgICA8bGk+PGEgaHJlZj0iIyI+U3lzdGVtIFN0YXR1czwvYT48L2xpPgogICAgICAgICAgPGxpPjxhIGhyZWY9Int7IHVybF9mb3IoJ21haW4uY29udGFjdCcpIH19Ij5Db250YWN0IFVzPC9hPjwvbGk+CiAgICAgICAgPC91bD4KICAgICAgPC9kaXY+CgogICAgICA8IS0tIFNlY3VyaXR5IGNvbHVtbiAtLT4KICAgICAgPGRpdiBjbGFzcz0iZm9vdGVyLWNvbCI+CiAgICAgICAgPGg0PlNlY3VyaXR5PC9oND4KICAgICAgICA8dWw+CiAgICAgICAgICA8bGk+PGEgaHJlZj0iIyI+U1NMIENlcnRpZmljYXRlPC9hPjwvbGk+CiAgICAgICAgICA8bGk+PGEgaHJlZj0iIyI+RG9tYWluIFByaXZhY3k8L2E+PC9saT4KICAgICAgICAgIDxsaT48YSBocmVmPSJ7eyB1cmxfZm9yKCdhdXRoLnZlcmlmeV8yZmEnKSB9fSI+VHdvLUZhY3RvciBBdXRoPC9hPjwvbGk+CiAgICAgICAgPC91bD4KICAgICAgPC9kaXY+CgogICAgPC9kaXY+CgogICAgPCEtLSDilIDilIAgRm9vdGVyIGJvdHRvbSDilIDilIAgLS0+CiAgICA8ZGl2IGNsYXNzPSJmb290ZXItYm90dG9tIj4KICAgICAgPGRpdiBjbGFzcz0iZm9vdGVyLWJvdHRvbS1pbm5lciI+CgogICAgICAgIDwhLS0gTGVnYWwgbGlua3MgLS0+CiAgICAgICAgPGRpdiBjbGFzcz0iZm9vdGVyLWxlZ2FsIj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJmb290ZXItY29weSI+JmNvcHk7IDIwMjUmbmRhc2g7MjAyNiBHZXRGb3VuZExvY2FsLiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvc3Bhbj4KICAgICAgICAgIDxhIGhyZWY9Int7IHVybF9mb3IoJ21haW4udGVybXMnKSB9fSI+VGVybXMgb2YgU2VydmljZTwvYT4KICAgICAgICAgIDxhIGhyZWY9Int7IHVybF9mb3IoJ21haW4ucHJpdmFjeScpIH19Ij5Qcml2YWN5IFBvbGljeTwvYT4KICAgICAgICAgIDxhIGhyZWY9Int7IHVybF9mb3IoJ21haW4uY29va2llcycpIH19Ij5Db29raWUgUG9saWN5PC9hPgogICAgICAgICAgPGEgaHJlZj0ie3sgdXJsX2ZvcignbWFpbi5hYm91dCcpIH19Ij5BYm91dCBVczwvYT4KICAgICAgICAgIDxhIGhyZWY9Int7IHVybF9mb3IoJ21haW4uY29udGFjdCcpIH19Ij5Db250YWN0PC9hPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8IS0tIFBheW1lbnQgaWNvbnMgLS0+CiAgICAgICAgPGRpdiBjbGFzcz0iZm9vdGVyLXBheW1lbnRzIj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJwYXltZW50cy1sYWJlbCI+U2VjdXJlIFBheW1lbnRzPC9zcGFuPgogICAgICAgICAgPGRpdiBjbGFzcz0icGF5bWVudC1pY29ucyI+CiAgICAgICAgICAgIDwhLS0gVmlzYSAtLT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icGF5LWljb24iPgogICAgICAgICAgICAgIDxzdmcgdmlld0JveD0iMCAwIDYwIDM4IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9IjYwIiBoZWlnaHQ9IjM4IiByeD0iNCIgZmlsbD0iIzFBMUY3MSIvPgogICAgICAgICAgICAgICAgPHRleHQgeD0iOCIgeT0iMjYiIGZvbnQtZmFtaWx5PSJBcmlhbCIgZm9udC13ZWlnaHQ9ImJvbGQiIGZvbnQtc2l6ZT0iMTgiIGZpbGw9IiNGRkZGRkYiIGxldHRlci1zcGFjaW5nPSItMSI+VklTQTwvdGV4dD4KICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwhLS0gTWFzdGVyY2FyZCAtLT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icGF5LWljb24iPgogICAgICAgICAgICAgIDxzdmcgdmlld0JveD0iMCAwIDYwIDM4IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9IjYwIiBoZWlnaHQ9IjM4IiByeD0iNCIgZmlsbD0iIzI1MjUyNSIvPgogICAgICAgICAgICAgICAgPGNpcmNsZSBjeD0iMjMiIGN5PSIxOSIgcj0iMTEiIGZpbGw9IiNFQjAwMUIiLz4KICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9IjM3IiBjeT0iMTkiIHI9IjExIiBmaWxsPSIjRjc5RTFCIi8+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMzAgMTAuNWExMSAxMSAwIDAgMSAwIDE3IDExIDExIDAgMCAxIDAtMTd6IiBmaWxsPSIjRkY1RjAwIi8+CiAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8IS0tIEFtZXggLS0+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InBheS1pY29uIj4KICAgICAgICAgICAgICA8c3ZnIHZpZXdCb3g9IjAgMCA2MCAzOCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPSI2MCIgaGVpZ2h0PSIzOCIgcng9IjQiIGZpbGw9IiMyRTc3QkMiLz4KICAgICAgICAgICAgICAgIDx0ZXh0IHg9IjUiIHk9IjI0IiBmb250LWZhbWlseT0iQXJpYWwiIGZvbnQtd2VpZ2h0PSJib2xkIiBmb250LXNpemU9IjkiIGZpbGw9IiNGRkZGRkYiPkFNRVJJQ0FOPC90ZXh0PgogICAgICAgICAgICAgICAgPHRleHQgeD0iNSIgeT0iMzMiIGZvbnQtZmFtaWx5PSJBcmlhbCIgZm9udC13ZWlnaHQ9ImJvbGQiIGZvbnQtc2l6ZT0iOSIgZmlsbD0iI0ZGRkZGRiI+RVhQUkVTUzwvdGV4dD4KICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwhLS0gUGF5UGFsIC0tPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYXktaWNvbiI+CiAgICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PSIwIDAgNjAgMzgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD0iNjAiIGhlaWdodD0iMzgiIHJ4PSI0IiBmaWxsPSIjRjhGOEY4Ii8+CiAgICAgICAgICAgICAgICA8dGV4dCB4PSI3IiB5PSIxNyIgZm9udC1mYW1pbHk9IkFyaWFsIiBmb250LXdlaWdodD0iYm9sZCIgZm9udC1zaXplPSI5IiBmaWxsPSIjMDAzMDg3Ij5QYXk8L3RleHQ+CiAgICAgICAgICAgICAgICA8dGV4dCB4PSIyMCIgeT0iMTciIGZvbnQtZmFtaWx5PSJBcmlhbCIgZm9udC13ZWlnaHQ9ImJvbGQiIGZvbnQtc2l6ZT0iOSIgZmlsbD0iIzAwOUNERSI+UGFsPC90ZXh0PgogICAgICAgICAgICAgICAgPHRleHQgeD0iNyIgeT0iMjgiIGZvbnQtZmFtaWx5PSJBcmlhbCIgZm9udC1zaXplPSI3IiBmaWxsPSIjNjY2Ij5TZWN1cmVkPC90ZXh0PgogICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPCEtLSBEaXNjb3ZlciAtLT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icGF5LWljb24iPgogICAgICAgICAgICAgIDxzdmcgdmlld0JveD0iMCAwIDYwIDM4IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9IjYwIiBoZWlnaHQ9IjM4IiByeD0iNCIgZmlsbD0iI0ZGRkZGRiIgc3Ryb2tlPSIjZGRkIiBzdHJva2Utd2lkdGg9IjEiLz4KICAgICAgICAgICAgICAgIDx0ZXh0IHg9IjUiIHk9IjIzIiBmb250LWZhbWlseT0iQXJpYWwiIGZvbnQtd2VpZ2h0PSJib2xkIiBmb250LXNpemU9IjgiIGZpbGw9IiMyMzFGMjAiPkRJU0NPVkVSPC90ZXh0PgogICAgICAgICAgICAgICAgPGNpcmNsZSBjeD0iNDYiIGN5PSIxOSIgcj0iMTAiIGZpbGw9IiNGNzZGMjAiLz4KICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KCiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgPC9mb290ZXI+").decode()
footer_css  = base64.b64decode("CiAgICAvKiDilIDilIAgRm9vdGVyIOKUgOKUgCAqLwogICAgLnNpdGUtZm9vdGVyIHsgYmFja2dyb3VuZDogIzExMTExMTsgbWFyZ2luLXRvcDogYXV0bzsgfQogICAgLmZvb3Rlci1tYWluIHsKICAgICAgbWF4LXdpZHRoOiAxMjAwcHg7IG1hcmdpbjogMCBhdXRvOwogICAgICBwYWRkaW5nOiAzcmVtIDJyZW0gMnJlbTsKICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAyZnIgMWZyIDFmciAxZnIgMWZyOwogICAgICBnYXA6IDJyZW07CiAgICB9CiAgICAuZm9vdGVyLWxvZ28geyBmb250LXNpemU6IDEuMnJlbTsgZm9udC13ZWlnaHQ6IDkwMDsgY29sb3I6ICNmZmY7IG1hcmdpbi1ib3R0b206IDAuNzVyZW07IH0KICAgIC5mb290ZXItbG9nbyBzcGFuIHsgY29sb3I6ICMyZGQ0YmY7IH0KICAgIC5mb290ZXItdGFnbGluZSB7IGZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6ICM2NDc0OGI7IGxpbmUtaGVpZ2h0OiAxLjY7IG1hcmdpbi1ib3R0b206IDEuMjVyZW07IH0KICAgIC5mb290ZXItc29jaWFsIHsgZGlzcGxheTogZmxleDsgZ2FwOiAwLjc1cmVtOyB9CiAgICAuc29jaWFsLWxpbmsgewogICAgICB3aWR0aDogMzJweDsgaGVpZ2h0OiAzMnB4OyBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LDI1NSwyNTUsMC4wNyk7IGNvbG9yOiAjOTRhM2I4OwogICAgICBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOyB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTVzLCBjb2xvciAwLjE1czsKICAgIH0KICAgIC5zb2NpYWwtbGluazpob3ZlciB7IGJhY2tncm91bmQ6ICMwZDk0ODg7IGNvbG9yOiAjZmZmOyB9CiAgICAuZm9vdGVyLWNvbCBoNCB7CiAgICAgIGZvbnQtc2l6ZTogMC43NXJlbTsgZm9udC13ZWlnaHQ6IDcwMDsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMDhlbTsgY29sb3I6ICNmZmY7IG1hcmdpbi1ib3R0b206IDFyZW07CiAgICB9CiAgICAuZm9vdGVyLWNvbCB1bCB7IGxpc3Qtc3R5bGU6IG5vbmU7IH0KICAgIC5mb290ZXItY29sIHVsIGxpIHsgbWFyZ2luLWJvdHRvbTogMC41cmVtOyB9CiAgICAuZm9vdGVyLWNvbCB1bCBsaSBhIHsKICAgICAgZm9udC1zaXplOiAwLjgycmVtOyBjb2xvcjogIzY0NzQ4YjsgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICB0cmFuc2l0aW9uOiBjb2xvciAwLjE1czsKICAgIH0KICAgIC5mb290ZXItY29sIHVsIGxpIGE6aG92ZXIgeyBjb2xvcjogIzJkZDRiZjsgfQoKICAgIC8qIEZvb3RlciBib3R0b20gKi8KICAgIC5mb290ZXItYm90dG9tIHsgYmFja2dyb3VuZDogIzBhMGEwYTsgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4wNik7IH0KICAgIC5mb290ZXItYm90dG9tLWlubmVyIHsKICAgICAgbWF4LXdpZHRoOiAxMjAwcHg7IG1hcmdpbjogMCBhdXRvOwogICAgICBwYWRkaW5nOiAxLjI1cmVtIDJyZW07CiAgICAgIGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgZmxleC13cmFwOiB3cmFwOyBnYXA6IDFyZW07CiAgICB9CiAgICAuZm9vdGVyLWxlZ2FsIHsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZmxleC13cmFwOiB3cmFwOyBnYXA6IDAuNXJlbSAxcmVtOyB9CiAgICAuZm9vdGVyLWNvcHkgeyBmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiAjNDc1NTY5OyB9CiAgICAuZm9vdGVyLWxlZ2FsIGEgeyBmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiAjNDc1NTY5OyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IHRyYW5zaXRpb246IGNvbG9yIDAuMTVzOyB9CiAgICAuZm9vdGVyLWxlZ2FsIGE6aG92ZXIgeyBjb2xvcjogIzJkZDRiZjsgfQogICAgLmZvb3Rlci1wYXltZW50cyB7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogMC43NXJlbTsgfQogICAgLnBheW1lbnRzLWxhYmVsIHsgZm9udC1zaXplOiAwLjdyZW07IGNvbG9yOiAjNDc1NTY5OyB3aGl0ZS1zcGFjZTogbm93cmFwOyB9CiAgICAucGF5bWVudC1pY29ucyB7IGRpc3BsYXk6IGZsZXg7IGdhcDogMC40cmVtOyBhbGlnbi1pdGVtczogY2VudGVyOyB9CiAgICAucGF5LWljb24geyB3aWR0aDogNDhweDsgaGVpZ2h0OiAzMHB4OyBib3JkZXItcmFkaXVzOiA0cHg7IG92ZXJmbG93OiBoaWRkZW47IG9wYWNpdHk6IDAuODU7IH0KICAgIC5wYXktaWNvbiBzdmcgeyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlOyB9CiAgICAucGF5LWljb246aG92ZXIgeyBvcGFjaXR5OiAxOyB9CgogICAgQG1lZGlhIChtYXgtd2lkdGg6IDkwMHB4KSB7CiAgICAgIC5mb290ZXItbWFpbiB7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmcjsgfQogICAgICAuZm9vdGVyLWJyYW5kIHsgZ3JpZC1jb2x1bW46IDEgLyAtMTsgfQogICAgICAuZm9vdGVyLWJvdHRvbS1pbm5lciB7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyB9CiAgICB9CiAgICBAbWVkaWEgKG1heC13aWR0aDogNjAwcHgpIHsKICAgICAgLmZvb3Rlci1tYWluIHsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7IH0KICAgIH0=").decode()

# Inject CSS before </style>
html = html.replace("  </style>", footer_css + "\n  </style>")

# Inject footer before </body>
html = html.replace("</body>", footer_html + "\n</body>")

# Also make body a flex column so footer sticks to bottom
html = html.replace(
    "body { font-family: \'Segoe UI\', system-ui, sans-serif; background: #f1f5f9; color: #0f172a; display: flex; flex-direction: column; min-height: 100vh; }",
    "body { font-family: \'Segoe UI\', system-ui, sans-serif; background: #f1f5f9; color: #0f172a; display: flex; flex-direction: column; min-height: 100vh; }"
)

with open("templates/dashboard/index.html", "w") as f:
    f.write(html)
print("done, len=", len(html))
