From 65453aa3ed0a88e328bd666b6dfd88a024a0709c Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Fri, 2 Jan 2026 23:24:52 +0100 Subject: [PATCH 01/22] deleted: assets/binaries/helium_helper.sh.x.c deleted: assets/binaries/helium_launcher_update.sh.x.c modified: devdoc.md deleted: launcher-update-helium deleted: update-helium --- assets/binaries/helium_helper.sh.x.c | 2237 ----------------- assets/binaries/helium_launcher_update.sh.x.c | 1262 ---------- devdoc.md | 9 +- launcher-update-helium | Bin 24368 -> 0 bytes update-helium | Bin 39976 -> 0 bytes 5 files changed, 4 insertions(+), 3504 deletions(-) delete mode 100644 assets/binaries/helium_helper.sh.x.c delete mode 100644 assets/binaries/helium_launcher_update.sh.x.c delete mode 100755 launcher-update-helium delete mode 100755 update-helium diff --git a/assets/binaries/helium_helper.sh.x.c b/assets/binaries/helium_helper.sh.x.c deleted file mode 100644 index dfe9c18..0000000 --- a/assets/binaries/helium_helper.sh.x.c +++ /dev/null @@ -1,2237 +0,0 @@ -#if 0 - shc Version 4.0.3, Generic Shell Script Compiler - GNU GPL Version 3 Md Jahidul Hamid - - shc -f helium_helper.sh -o update-helium -#endif - -static char data [] = -#define chk2_z 19 -#define chk2 ((&data[3])) - "\325\217\031\263\156\135\062\310\367\035\156\022\260\125\114\134" - "\010\105\320\260\014\176" -#define msg1_z 65 -#define msg1 ((&data[35])) - "\255\155\253\026\061\252\257\364\210\101\011\146\141\012\221\225" - "\232\001\207\354\300\342\070\272\345\120\101\141\220\173\172\323" - "\163\103\242\330\221\316\346\276\211\226\323\117\101\120\145\043" - "\243\135\215\121\361\350\361\260\366\031\126\126\375\101\057\257" - "\115\260\253\256\215\035\007\260\210\016\216\325\160\017\003\162" - "\134\336\060\155\024\340\310\016\217\345\344" -#define date_z 1 -#define date ((&data[113])) - "\215" -#define tst2_z 19 -#define tst2 ((&data[117])) - "\126\163\300\141\376\045\252\367\020\137\021\236\273\110\140\035" - "\351\323\107\364\007\305\207\035\160" -#define tst1_z 22 -#define tst1 ((&data[142])) - "\206\014\022\346\007\136\124\313\164\277\344\264\271\123\215\263" - "\076\357\227\065\026\147\034\172\160\211\177\157\150" -#define rlax_z 1 -#define rlax ((&data[168])) - "\264" -#define chk1_z 22 -#define chk1 ((&data[172])) - "\036\212\160\151\327\174\156\246\222\025\066\113\267\265\055\062" - "\043\037\233\056\364\012\360\171\264\075\211\154" -#define shll_z 10 -#define shll ((&data[197])) - "\136\027\006\325\015\000\226\050\226\064" -#define msg2_z 19 -#define msg2 ((&data[210])) - "\003\343\107\233\316\050\325\341\230\123\261\335\105\252\377\234" - "\073\177\137\156\033\176\177\211\371\006" -#define opts_z 1 -#define opts ((&data[233])) - "\240" -#define inlo_z 3 -#define inlo ((&data[234])) - "\035\073\253" -#define text_z 20565 -#define text ((&data[1999])) - "\124\374\002\162\207\163\260\020\337\326\142\366\122\050\316\126" - "\013\025\326\225\017\334\053\033\154\101\226\145\005\355\333\132" - "\352\335\314\161\120\175\202\060\123\344\047\245\015\365\373\031" - "\013\322\256\032\256\332\065\032\033\313\200\041\271\133\173\243" - "\071\110\025\212\305\227\272\030\174\342\276\212\330\272\243\343" - "\214\121\375\072\054\063\125\107\376\325\151\270\061\344\134\152" - "\055\161\364\362\011\257\013\206\221\311\020\151\203\263\115\020" - "\005\112\113\061\176\240\171\175\166\342\065\247\306\221\021\364" - "\003\006\346\015\265\361\224\106\273\244\260\077\130\375\117\135" - "\110\232\217\306\073\010\103\262\353\171\131\262\013\153\246\017" - "\161\214\034\047\176\260\156\072\125\036\171\255\034\311\013\144" - "\144\233\053\237\244\157\122\217\350\254\101\364\027\347\003\211" - "\163\040\260\362\321\036\054\046\075\246\324\131\157\340\276\323" - "\173\351\163\037\131\305\256\101\161\357\066\211\327\071\022\113" - "\131\303\075\052\342\151\121\040\017\045\171\177\006\070\122\201" - "\042\306\241\173\214\117\275\375\077\363\207\026\055\232\142\207" - "\136\237\262\100\011\003\140\031\051\332\230\057\022\353\261\064" - "\262\122\260\076\242\155\074\341\141\303\370\216\135\132\025\273" - "\372\307\374\003\313\135\035\364\067\265\044\112\241\325\177\123" - "\047\060\222\311\235\316\253\376\222\244\215\360\377\242\254\371" - "\152\250\375\065\005\032\051\075\320\115\210\162\043\010\306\112" - "\070\130\024\326\047\277\325\271\144\142\251\143\005\125\135\157" - "\376\133\245\004\166\316\102\107\034\313\271\100\323\200\212\014" - "\331\236\343\000\136\270\272\302\033\144\045\040\272\203\220\270" - "\336\065\274\124\004\377\233\041\312\124\141\236\325\354\253\256" - "\212\216\256\351\107\151\253\143\315\321\204\207\124\024\077\062" - "\112\374\206\117\374\042\160\306\167\322\145\114\276\020\372\111" - "\237\251\062\347\022\336\112\337\257\316\147\003\343\247\065\055" - "\244\274\174\240\336\355\147\125\277\314\242\176\335\234\307\175" - "\105\372\144\130\330\257\070\207\175\237\213\141\107\301\217\353" - "\176\014\214\134\371\363\262\271\300\124\070\236\361\000\033\067" - "\372\200\217\323\057\307\133\255\147\346\016\256\247\235\231\045" - "\252\046\202\243\031\065\135\332\212\225\170\173\225\224\262\220" - "\024\102\143\103\011\276\361\161\245\377\037\114\235\271\162\110" - "\337\364\353\371\052\111\323\264\337\114\057\165\340\342\006\364" - "\044\151\070\056\050\051\237\316\051\277\032\307\171\215\017\131" - "\202\373\122\254\105\046\140\044\162\220\232\122\163\240\107\230" - "\012\177\306\062\251\146\001\323\046\033\233\237\251\252\371\053" - "\246\113\330\353\162\070\020\344\311\252\066\075\113\175\325\125" - "\375\233\210\247\002\211\172\050\245\025\310\116\300\301\172\146" - "\015\122\122\177\213\143\143\125\016\232\222\131\030\147\256\025" - "\003\067\274\005\300\067\056\145\115\367\264\015\270\056\164\306" - "\201\307\105\014\052\251\141\071\103\363\222\134\133\101\162\136" - "\170\057\144\071\146\223\236\263\212\123\301\103\201\065\011\002" - "\374\117\017\047\370\160\140\074\144\363\230\300\064\012\036\255" - "\072\203\346\240\026\205\124\240\331\025\343\132\112\355\135\107" - "\074\155\157\065\336\320\162\102\303\013\003\370\026\041\246\120" - "\245\215\360\273\022\104\134\353\132\100\106\245\055\244\355\152" - "\021\134\240\360\054\022\063\357\035\066\350\063\130\216\203\375" - "\033\164\270\056\271\024\032\023\124\141\271\202\005\246\354\027" - "\002\215\007\056\237\072\036\275\160\006\360\311\225\164\306\260" - "\351\176\336\243\223\370\266\350\131\157\152\137\026\127\167\030" - "\344\177\107\204\271\146\101\052\155\062\363\002\246\272\262\220" - "\070\221\063\314\212\352\264\344\132\037\104\160\166\273\211\133" - "\072\320\337\364\066\040\037\243\122\023\246\371\315\131\212\006" - "\352\275\322\165\250\207\132\002\246\236\163\035\132\374\170\224" - "\315\127\211\003\170\250\247\313\273\115\304\211\247\117\217\222" - "\014\141\007\265\350\141\270\217\000\053\254\132\050\044\357\365" - "\174\170\371\365\041\241\300\335\357\205\146\226\324\365\050\341" - "\127\057\226\100\221\117\317\221\172\173\354\243\240\333\230\035" - "\124\222\022\165\063\323\123\042\130\272\270\055\257\340\016\007" - "\020\245\110\242\364\027\063\157\223\040\022\063\373\253\121\117" - "\075\143\305\160\066\030\223\217\322\113\274\202\054\313\212\075" - "\160\322\337\145\352\023\324\175\063\347\261\056\222\002\176\317" - "\146\104\100\235\135\323\055\060\037\351\262\113\265\075\210\045" - "\020\147\213\372\172\137\167\255\107\051\334\331\054\133\251\222" - "\237\351\060\374\275\135\054\334\106\337\047\373\034\260\041\054" - "\030\255\046\222\014\236\100\124\310\034\055\364\167\326\206\027" - "\300\266\023\176\023\077\132\132\036\202\126\073\062\170\150\112" - "\045\217\335\062\056\035\206\366\072\263\352\262\212\161\311\113" - "\047\335\311\073\035\044\226\074\246\354\167\331\144\340\044\212" - "\157\001\274\235\037\102\223\132\366\176\015\201\357\327\315\027" - "\264\227\122\321\273\350\015\142\325\205\073\072\145\137\304\325" - "\141\200\163\200\303\007\333\272\205\350\074\165\277\011\214\163" - "\240\336\105\134\307\123\276\234\331\372\327\077\131\233\024\272" - "\034\207\073\337\216\026\232\024\376\326\211\276\337\025\062\200" - "\364\167\334\274\313\233\131\244\225\060\343\356\313\367\251\347" - "\177\345\307\016\374\141\042\373\067\253\271\027\301\353\227\265" - "\143\164\161\056\017\312\322\244\372\266\223\306\255\075\255\055" - "\043\165\073\037\326\135\033\015\011\324\044\312\300\274\177\043" - "\060\361\122\077\273\045\344\266\333\170\174\211\265\052\266\330" - "\237\362\370\166\117\023\203\131\350\250\043\250\144\243\314\224" - "\224\037\324\120\104\271\006\040\061\203\251\347\256\140\277\116" - "\122\270\304\242\314\107\373\264\360\037\135\124\302\052\351\126" - "\111\276\247\215\167\255\255\251\061\127\220\337\267\120\055\012" - "\010\361\255\324\071\250\211\052\310\347\176\212\021\150\341\132" - "\047\210\350\237\066\226\110\147\356\330\107\246\050\165\260\061" - "\147\135\006\241\006\217\313\316\167\111\131\210\262\072\343\332" - "\302\314\171\371\142\301\140\120\231\250\367\302\035\247\363\204" - "\005\372\045\013\212\361\332\001\072\063\211\355\155\155\307\060" - "\071\100\051\233\002\212\354\234\063\343\136\120\213\122\325\220" - "\115\373\234\327\354\166\330\047\252\142\025\030\317\335\111\011" - "\035\162\245\040\375\221\274\060\165\033\201\001\156\127\222\273" - "\123\056\222\100\245\153\150\120\316\175\150\236\132\261\247\170" - "\044\114\231\042\336\125\123\124\160\324\125\337\054\347\232\177" - "\026\055\277\274\231\050\014\147\245\164\006\000\045\255\171\112" - "\372\022\154\331\147\277\055\330\224\203\267\300\153\122\100\201" - "\177\000\075\031\050\111\200\315\276\207\316\344\065\107\056\060" - "\131\233\011\301\132\067\232\357\273\122\260\046\244\360\250\044" - "\360\346\075\031\060\276\347\357\106\265\323\173\375\002\253\126" - "\235\264\030\370\354\262\347\247\004\227\316\251\210\167\315\170" - "\135\013\221\216\312\170\175\020\056\121\214\053\123\067\202\360" - "\354\232\351\331\115\321\200\121\150\117\373\360\306\311\151\044" - "\325\373\263\237\164\061\260\242\202\074\316\325\164\120\306\140" - "\352\257\071\067\200\272\211\351\011\204\332\320\116\104\365\043" - "\077\250\302\264\331\163\127\133\257\045\061\043\165\367\204\140" - "\247\276\230\050\170\042\021\202\246\353\123\365\057\110\030\157" - "\360\332\044\312\115\173\046\375\240\127\041\026\117\245\166\366" - "\143\017\036\334\061\060\137\330\033\262\315\113\372\345\273\353" - "\277\337\265\015\133\334\013\373\063\055\021\203\322\210\171\066" - "\227\230\222\066\313\240\262\360\375\331\202\371\047\003\224\252" - "\140\060\377\051\120\171\202\072\351\045\337\374\222\146\022\063" - "\140\010\000\364\361\252\014\167\110\256\167\161\141\277\011\210" - "\362\177\011\031\102\326\134\023\265\316\220\262\006\331\042\155" - "\137\071\263\313\016\311\166\005\153\053\177\267\372\303\372\004" - "\151\007\232\132\143\216\071\102\377\035\247\333\232\143\334\330" - "\151\176\107\374\377\056\162\043\113\035\373\043\000\127\210\306" - "\357\176\154\311\234\222\131\167\341\156\140\151\121\226\300\230" - "\075\161\051\275\126\307\160\333\214\240\325\147\214\165\266\244" - "\062\143\326\272\222\053\173\052\146\007\356\017\351\363\104\321" - "\254\335\171\051\370\314\360\243\345\012\266\245\212\227\270\000" - "\221\001\372\347\137\044\275\235\001\211\063\337\302\254\076\261" - "\214\317\032\243\203\273\360\303\223\212\012\303\030\311\332\064" - "\241\002\077\236\227\306\035\354\204\227\202\123\130\374\315\173" - "\352\342\075\363\145\251\271\357\325\030\070\012\103\164\251\213" - "\072\167\215\115\114\020\046\040\007\126\016\242\021\003\057\077" - "\160\153\060\320\323\142\063\375\047\300\300\256\130\364\351\246" - "\135\156\326\024\347\354\144\250\061\110\025\044\214\320\275\165" - "\031\011\306\205\001\146\002\160\233\275\204\245\253\102\105\036" - "\131\004\051\334\054\353\136\244\006\013\133\363\167\161\165\340" - "\041\042\277\061\006\307\156\146\227\337\354\006\265\315\376\032" - "\316\137\064\341\370\104\301\137\106\111\005\270\121\005\360\342" - "\036\070\332\170\257\264\022\207\074\306\327\350\367\135\134\232" - "\225\270\156\171\161\152\162\237\070\247\005\112\323\014\265\034" - "\115\215\324\131\211\130\377\160\314\267\242\343\334\207\165\047" - "\137\105\177\251\257\176\104\346\144\366\251\330\271\305\211\033" - "\145\172\246\343\003\123\020\312\364\037\036\317\170\045\164\374" - "\047\314\001\377\326\102\134\311\256\156\036\247\361\262\354\067" - "\010\140\026\001\367\016\032\362\317\145\037\016\235\324\230\107" - "\305\156\203\275\047\366\212\051\234\330\375\156\101\275\314\155" - "\111\275\165\137\316\213\371\351\107\215\004\346\155\266\075\122" - "\131\145\011\132\046\147\046\223\115\252\077\301\175\072\122\143" - "\160\023\075\125\142\302\313\357\051\302\042\130\052\277\162\304" - "\013\340\343\154\156\045\253\074\362\001\036\314\271\215\347\102" - "\247\375\123\337\004\247\154\100\057\341\301\033\245\261\366\162" - "\270\010\163\022\103\120\362\155\224\132\264\214\002\145\257\025" - "\255\220\300\035\332\050\126\301\163\356\033\153\005\060\247\031" - "\255\146\122\323\202\223\144\352\363\301\116\360\150\172\057\172" - "\116\056\242\237\124\164\021\350\000\056\273\127\073\135\147\334" - "\022\071\306\146\102\324\024\206\177\110\375\112\046\233\133\176" - "\132\301\063\361\202\345\374\237\003\010\274\223\074\270\324\237" - "\271\101\133\365\012\337\064\173\234\251\035\332\202\103\274\263" - "\162\170\232\202\241\056\205\073\010\011\151\063\162\074\061\016" - "\151\277\340\124\342\060\235\337\352\223\375\065\065\337\255\172" - "\114\120\150\343\124\311\377\312\103\364\157\202\036\347\233\175" - "\335\144\254\133\137\140\024\304\343\311\101\206\212\074\075\360" - "\104\337\351\123\302\151\151\376\337\332\255\326\053\114\201\025" - "\346\140\236\335\243\074\101\170\314\243\021\356\232\276\035\224" - "\216\100\031\053\262\212\016\006\206\134\177\317\332\145\236\325" - "\334\050\342\244\130\344\146\055\155\172\234\302\214\353\135\267" - "\261\025\224\003\211\072\227\161\012\171\324\016\241\363\003\315" - "\036\225\212\312\141\272\146\127\133\214\224\154\255\157\335\374" - "\215\010\107\267\037\054\173\210\200\005\231\133\300\233\045\043" - "\322\221\174\024\325\244\235\136\021\245\177\034\101\335\321\064" - "\126\227\020\031\170\055\354\134\337\246\141\034\367\333\226\326" - "\364\166\071\130\217\366\355\127\111\314\055\114\236\251\005\072" - "\350\354\040\362\236\253\164\042\277\040\236\166\021\363\066\262" - "\156\056\353\126\313\220\346\166\051\240\327\236\211\242\261\272" - "\121\312\046\316\265\046\036\326\357\302\363\375\072\060\323\113" - "\067\354\025\134\204\360\267\042\131\234\313\115\104\013\036\262" - "\136\101\246\104\114\000\004\177\046\072\315\356\030\017\132\073" - "\014\065\376\072\243\146\023\070\336\202\362\154\064\351\131\121" - "\104\147\273\200\266\001\331\076\336\176\330\032\164\155\177\373" - "\014\175\006\165\367\372\356\004\250\315\004\303\135\214\061\135" - "\212\065\310\041\271\264\364\341\335\015\116\363\255\363\237\341" - "\352\153\354\353\267\160\373\261\205\006\015\057\355\152\130\247" - "\313\307\010\216\373\204\171\177\071\251\361\146\326\336\371\034" - "\330\065\317\353\135\227\325\365\026\222\117\202\164\173\017\346" - "\345\150\313\270\331\120\355\332\206\106\031\123\022\223\017\107" - "\334\070\265\210\101\232\122\257\141\232\116\157\177\370\336\177" - "\314\177\345\165\333\377\261\321\236\060\174\062\071\125\006\176" - "\275\301\066\326\342\133\222\076\275\236\326\166\267\144\020\355" - "\263\172\327\070\341\113\160\223\234\221\232\202\370\063\035\155" - "\220\075\303\177\363\255\057\023\316\054\162\060\222\044\165\206" - "\156\171\003\323\142\242\340\113\130\073\200\315\223\232\256\111" - "\344\241\270\342\335\223\301\373\011\266\162\102\211\372\312\063" - "\023\263\046\011\305\356\317\043\176\317\072\214\353\171\222\302" - "\356\311\333\127\004\317\266\303\221\064\103\043\357\141\040\266" - "\013\265\360\133\034\372\101\017\236\151\213\374\120\012\344\126" - "\362\062\007\252\034\374\141\241\073\152\103\352\144\135\055\214" - "\244\210\220\255\214\231\314\176\115\276\103\272\077\276\043\036" - "\351\113\173\335\174\000\164\224\031\362\015\205\100\277\253\177" - "\317\152\072\127\205\364\161\364\053\030\250\134\076\152\357\074" - "\254\157\242\132\333\265\347\225\221\225\144\354\017\052\050\260" - "\323\236\304\245\243\356\313\201\305\267\041\204\100\326\165\031" - "\362\035\005\370\231\122\077\263\116\361\100\326\172\015\061\252" - "\043\355\330\155\105\213\305\336\176\303\161\301\064\002\271\017" - "\341\356\250\006\037\252\114\114\142\030\264\075\345\024\113\177" - "\101\042\306\106\075\274\102\131\071\006\113\233\244\261\356\017" - "\066\350\151\177\222\262\025\220\304\001\247\206\062\301\107\144" - "\303\131\100\232\067\103\113\356\175\154\147\022\370\206\136\042" - "\012\121\054\042\266\207\332\177\320\356\123\332\203\131\131\170" - "\365\347\132\234\033\016\111\154\022\001\307\245\125\335\155\041" - "\123\325\274\037\104\100\031\057\022\126\164\150\173\247\243\173" - "\045\164\042\302\027\051\047\210\266\101\241\071\153\215\127\166" - "\354\227\000\134\300\120\313\350\210\046\261\013\154\325\314\355" - "\241\017\232\332\242\076\117\176\337\160\217\176\122\013\106\345" - "\043\142\076\250\100\045\234\125\254\045\160\044\100\225\166\156" - "\046\333\025\000\216\172\061\342\037\200\053\015\176\303\171\272" - "\311\225\014\256\105\033\007\021\356\205\232\041\014\045\227\054" - "\344\252\234\272\236\233\046\233\377\362\314\122\160\324\161\013" - "\320\144\244\276\203\124\201\242\233\000\121\017\334\115\266\025" - "\251\157\374\236\233\337\177\111\137\200\326\005\043\222\062\250" - "\171\227\204\152\356\264\100\276\150\146\361\034\332\044\072\160" - "\117\141\076\314\006\067\266\036\201\054\047\332\141\101\263\027" - "\152\256\050\200\133\204\202\317\330\235\032\321\223\061\040\371" - "\174\142\171\144\323\024\163\020\005\036\155\016\126\332\172\251" - "\346\340\126\024\047\157\216\107\006\356\133\135\344\222\132\110" - "\024\061\373\314\314\223\072\033\154\362\371\017\341\123\205\256" - "\106\243\270\206\277\204\320\100\075\050\207\350\101\107\004\106" - "\107\075\123\053\044\357\030\362\024\071\115\325\016\000\375\365" - "\013\366\356\112\346\350\357\323\104\272\314\100\371\157\334\171" - "\274\276\324\005\120\170\173\232\247\342\231\334\107\214\224\030" - "\235\015\151\131\213\020\355\030\357\005\027\117\260\125\025\315" - "\354\351\011\303\121\343\025\004\076\350\274\236\130\041\357\032" - "\131\104\165\323\253\376\041\037\070\015\011\354\021\275\022\031" - "\331\236\226\246\055\301\046\227\170\370\032\113\051\006\223\035" - "\022\327\172\004\276\033\310\241\220\324\373\205\267\156\263\016" - "\210\256\231\007\015\314\200\222\350\336\030\025\156\253\227\227" - "\313\036\111\062\013\212\032\257\335\230\374\316\230\037\231\375" - "\037\340\131\123\057\161\133\161\273\016\140\071\146\074\224\160" - "\000\044\112\243\131\361\371\211\073\304\261\357\122\221\250\356" - "\025\104\302\101\163\224\247\146\132\134\111\005\346\301\353\144" - "\014\367\114\014\105\124\263\265\315\116\163\072\125\316\173\117" - "\340\257\164\100\261\044\254\165\327\372\144\301\207\077\201\170" - "\142\314\151\300\241\121\137\322\011\136\375\307\326\016\170\164" - "\251\031\344\010\215\377\026\250\327\245\015\074\023\241\235\245" - "\101\127\055\002\065\163\166\210\076\164\327\263\225\220\035\351" - "\273\260\130\303\305\341\067\010\313\133\357\016\264\140\342\051" - "\264\362\353\112\255\033\011\324\127\176\163\127\331\143\350\032" - "\144\073\217\136\257\200\045\151\207\162\372\211\212\317\036\265" - "\101\322\177\114\234\164\023\071\100\233\175\375\316\102\072\235" - "\120\370\375\044\373\270\303\262\336\132\167\342\034\126\202\102" - "\102\310\174\005\320\017\000\270\237\062\353\000\223\345\071\050" - "\253\302\045\037\243\360\075\342\106\216\235\362\335\046\272\102" - "\132\235\205\343\304\357\032\035\315\215\263\230\150\040\333\110" - "\350\040\104\202\160\054\130\170\325\055\277\065\354\131\020\304" - "\114\324\327\067\203\232\347\342\372\053\152\000\047\161\172\237" - "\315\214\116\055\321\002\021\270\172\332\342\221\260\256\255\024" - "\044\314\165\147\371\214\240\047\061\120\365\170\015\045\162\222" - "\167\047\140\012\224\004\240\324\175\067\064\202\232\331\241\060" - "\252\254\272\304\044\010\326\154\150\100\145\142\225\213\036\351" - "\376\006\220\105\342\330\020\064\105\342\273\022\342\250\163\072" - "\236\123\250\005\276\166\212\016\142\103\314\076\131\313\007\164" - "\343\275\232\366\330\257\374\173\373\201\133\351\252\201\101\267" - "\102\266\235\176\311\111\363\365\155\336\220\330\336\204\155\134" - "\316\361\000\140\233\146\355\045\021\353\157\144\377\073\151\164" - "\031\111\362\177\232\223\021\321\311\261\150\123\023\237\254\313" - "\005\074\167\035\251\236\376\316\331\222\121\070\022\050\022\211" - "\253\047\345\211\216\030\275\255\046\055\053\076\336\371\336\016" - "\031\164\215\367\203\034\346\375\343\106\225\165\346\014\276\311" - "\214\077\245\242\152\244\077\203\200\233\274\265\042\247\204\067" - "\263\107\055\240\313\160\145\023\300\164\041\161\073\130\324\266" - "\256\276\100\273\274\250\115\347\147\072\041\076\223\041\362\052" - "\335\206\276\060\005\353\157\173\356\340\014\126\222\027\155\336" - "\076\001\240\074\330\132\265\022\220\202\273\001\142\122\012\147" - "\054\230\304\261\310\032\216\267\035\136\136\173\053\245\114\347" - "\144\372\061\342\045\230\266\350\167\076\262\113\373\346\123\100" - "\266\061\224\340\222\211\036\140\160\033\353\372\355\172\374\255" - "\340\213\307\030\314\075\014\266\020\161\015\266\014\307\131\160" - "\036\154\161\120\372\257\216\050\021\212\347\042\315\330\147\101" - "\266\360\040\264\242\307\115\140\055\151\267\226\074\207\105\157" - "\357\026\051\047\257\371\011\243\051\036\041\375\216\102\330\154" - "\204\113\071\206\350\321\105\157\110\270\213\302\261\323\014\233" - "\041\145\121\031\160\124\044\173\303\270\215\121\126\330\101\225" - "\256\244\201\322\262\313\327\147\352\374\120\057\361\213\335\313" - "\104\324\017\311\211\057\320\001\231\210\234\176\343\364\303\334" - "\235\226\055\052\032\157\267\122\127\013\321\034\031\304\010\053" - "\277\204\321\272\037\310\277\105\170\064\003\362\077\243\224\362" - "\324\076\207\307\041\011\172\356\343\310\070\057\313\114\071\056" - "\203\232\121\153\102\164\072\004\305\035\365\254\376\253\344\236" - "\004\121\154\066\022\140\172\120\332\316\347\266\005\350\102\001" - "\122\260\340\012\237\000\121\121\112\313\023\265\050\234\124\354" - "\133\056\170\170\350\025\052\123\205\125\300\221\160\362\127\316" - "\102\101\231\334\226\063\167\166\244\371\135\270\346\014\270\243" - "\060\216\200\115\212\216\027\054\266\271\264\001\372\036\054\375" - "\375\145\331\012\363\250\336\022\352\256\267\174\057\065\020\076" - "\031\306\036\135\011\221\035\177\307\016\314\106\333\075\262\247" - "\362\260\017\231\076\047\165\217\076\171\273\342\331\142\211\013" - "\167\001\335\227\126\271\117\367\260\262\226\242\211\205\111\333" - "\325\255\245\025\264\200\043\020\073\272\175\262\105\067\262\363" - "\115\223\216\364\124\052\055\134\207\262\051\273\020\237\071\150" - "\026\233\350\321\200\206\347\333\107\255\350\276\351\000\173\317" - "\025\012\306\275\057\357\153\077\221\270\100\112\026\123\124\311" - "\134\105\155\165\122\364\102\113\155\022\105\120\336\346\217\120" - "\003\135\231\036\375\122\321\366\325\300\152\205\105\276\324\145" - "\116\174\102\362\172\371\213\330\227\337\322\155\114\301\066\153" - "\274\205\165\305\065\070\127\266\175\047\077\106\023\354\323\074" - "\337\070\323\051\306\013\143\220\241\066\230\211\243\034\061\057" - "\330\263\124\064\167\322\062\013\151\026\316\322\072\314\051\100" - "\121\004\111\151\134\364\311\136\052\306\053\146\065\322\072\376" - "\250\066\373\062\034\141\171\214\154\275\320\153\310\053\223\031" - "\033\226\003\062\164\323\112\373\104\235\146\074\157\174\215\057" - "\257\023\376\265\022\311\006\171\375\321\124\165\233\015\301\040" - "\212\377\170\207\357\035\033\324\024\361\041\155\163\157\270\154" - "\275\304\312\237\253\151\365\172\205\152\260\016\345\224\252\334" - "\221\342\261\040\060\323\172\355\143\144\315\157\112\057\073\202" - "\042\244\054\057\270\365\260\133\264\101\061\340\330\153\151\034" - "\350\256\341\262\327\051\034\202\125\333\361\226\144\237\131\021" - "\265\254\042\131\052\051\101\101\105\274\054\277\154\340\274\334" - "\003\056\000\213\311\173\075\174\343\033\111\020\035\152\343\143" - "\275\100\376\317\150\364\115\024\253\323\133\355\010\110\153\056" - "\133\143\241\056\257\355\356\353\130\207\237\111\343\313\304\226" - "\070\110\111\023\173\254\053\254\042\330\357\160\137\047\160\241" - "\254\230\063\332\161\241\167\231\251\072\262\170\144\033\255\304" - "\030\026\312\341\274\241\240\265\104\036\240\252\325\373\073\047" - "\227\064\354\004\120\100\172\074\226\170\014\246\234\034\056\063" - "\312\141\164\323\324\064\256\312\242\252\074\033\275\210\153\063" - "\150\305\170\363\331\363\246\244\071\251\141\330\237\066\027\041" - "\060\112\044\020\271\071\303\360\110\277\121\141\321\277\265\216" - "\240\122\201\255\164\302\323\163\015\236\266\224\247\266\206\071" - "\111\056\240\147\236\070\202\223\072\043\004\077\170\362\310\022" - "\266\345\275\316\043\362\130\112\072\200\046\375\303\214\160\242" - "\255\141\174\110\126\042\044\273\104\252\353\031\231\274\376\017" - "\373\331\367\347\207\222\106\245\253\346\250\062\044\056\057\212" - "\007\017\025\027\352\243\165\362\126\200\056\224\261\266\335\371" - "\156\206\074\156\003\232\313\040\015\053\306\315\034\125\271\074" - "\330\054\353\360\064\056\305\144\230\244\077\374\371\074\161\340" - "\001\044\300\332\075\320\265\352\303\017\134\346\013\137\156\123" - "\215\134\147\140\352\365\072\107\102\055\320\307\335\267\345\065" - "\115\077\230\127\004\137\176\301\252\066\310\176\025\172\251\360" - "\104\112\102\011\152\104\336\171\117\120\173\136\323\340\324\210" - "\343\201\043\237\311\371\011\101\275\146\314\342\120\243\111\317" - "\120\065\326\135\232\131\015\162\237\006\216\236\046\147\371\366" - "\014\072\264\254\316\262\253\372\014\314\043\324\202\112\247\301" - "\037\366\275\161\363\254\055\145\032\337\231\062\312\043\244\321" - "\223\302\070\053\054\221\013\320\171\153\116\256\121\043\321\060" - "\106\217\072\056\030\232\276\311\016\072\273\335\372\364\176\307" - "\046\213\216\107\172\256\166\135\333\171\302\147\231\035\143\102" - "\370\305\201\301\331\230\352\125\104\121\024\231\353\261\207\377" - "\333\147\332\224\106\105\133\275\232\115\241\351\071\376\107\014" - "\050\375\176\057\060\044\210\253\210\000\373\051\146\015\112\045" - "\157\275\316\065\105\272\340\266\212\125\235\057\306\013\106\003" - "\166\046\026\377\010\302\100\303\357\146\207\374\265\221\310\353" - "\341\032\250\134\252\266\145\341\362\302\057\210\032\052\272\071" - "\221\300\134\212\370\062\350\040\040\335\367\377\250\021\203\231" - "\015\104\032\243\000\130\237\351\245\207\042\301\273\044\324\210" - "\172\330\166\210\104\270\366\203\157\303\361\267\007\364\120\010" - "\001\123\013\225\161\224\064\120\373\332\017\307\223\157\330\065" - "\270\305\341\044\204\212\022\354\071\323\031\025\234\361\334\104" - "\000\302\046\124\271\054\027\001\015\216\307\364\202\136\120\302" - "\073\343\261\152\235\272\106\237\163\342\153\372\142\262\345\222" - "\200\333\051\344\200\162\222\236\222\204\015\252\040\012\227\010" - "\057\204\322\136\235\017\351\120\253\131\235\175\227\362\130\072" - "\370\341\144\165\037\376\247\261\356\100\021\322\115\025\163\161" - "\300\057\251\367\316\371\340\032\046\157\263\063\055\142\356\314" - "\147\143\161\277\221\243\210\203\141\324\135\063\130\334\056\265" - "\224\042\044\102\326\256\357\050\021\040\160\020\063\014\321\066" - "\102\104\375\065\103\022\002\304\012\304\302\276\065\006\146\335" - "\337\030\173\010\214\303\177\016\051\006\070\075\166\225\240\204" - "\001\371\306\263\275\017\153\147\265\251\140\067\026\055\337\147" - "\111\114\241\142\255\235\172\200\373\306\256\377\354\106\004\332" - "\033\151\105\120\005\050\242\105\357\114\301\123\132\266\207\334" - "\051\143\212\215\154\130\337\217\037\114\311\227\015\006\127\221" - "\332\042\347\035\364\221\112\074\350\025\016\357\370\233\067\072" - "\202\026\266\131\261\051\016\144\166\072\374\073\077\306\036\110" - "\046\023\172\111\216\017\102\105\330\364\222\272\265\336\206\100" - "\220\152\225\042\340\274\154\314\350\036\001\160\341\335\053\200" - "\143\077\336\077\310\215\237\017\212\116\053\313\370\255\234\222" - "\233\105\301\154\266\014\034\312\040\075\342\211\373\355\202\177" - "\111\232\076\367\236\276\177\333\274\176\255\225\204\342\176\117" - "\234\002\374\040\324\152\236\315\063\144\024\321\257\031\344\036" - "\333\143\167\140\016\243\137\144\170\264\122\115\207\027\150\230" - "\203\053\323\306\253\176\321\070\125\362\200\000\155\335\333\306" - "\375\014\003\301\327\342\361\115\266\321\041\053\016\064\375\133" - "\057\370\133\133\133\134\045\261\211\376\155\032\332\342\272\116" - "\220\357\176\312\342\317\065\354\221\350\322\062\234\301\361\046" - "\071\045\250\160\044\256\306\015\214\200\347\151\037\226\250\032" - "\306\301\116\145\145\025\010\263\273\277\050\345\202\272\364\243" - "\076\310\200\325\155\313\327\141\146\323\043\336\123\325\021\272" - "\124\316\242\301\330\100\077\343\066\261\223\170\220\141\233\374" - "\063\141\362\074\071\257\304\166\030\330\203\027\055\047\054\027" - "\254\230\151\150\267\232\073\055\145\133\174\277\277\253\375\025" - "\102\255\233\311\076\305\147\154\004\245\127\335\003\325\274\354" - "\321\326\124\104\266\214\074\110\030\157\215\365\115\320\040\353" - "\046\352\026\073\176\232\152\360\370\374\253\165\043\375\261\300" - "\157\207\211\105\265\242\257\170\274\101\052\330\051\235\255\273" - "\135\274\123\224\026\070\317\231\077\066\244\111\255\327\370\322" - "\252\074\106\277\156\251\032\007\365\115\143\014\315\166\344\136" - "\217\053\230\271\140\252\150\265\121\315\337\004\305\134\233\137" - "\235\363\303\252\026\344\210\357\263\111\215\306\075\003\177\374" - "\000\050\272\055\133\345\313\211\300\206\170\074\265\300\110\206" - "\265\002\100\350\327\002\031\162\234\136\025\123\205\177\006\264" - "\062\370\367\130\143\124\215\215\225\135\370\037\105\347\116\047" - "\364\341\037\006\231\050\074\117\354\143\267\324\377\330\100\236" - "\245\372\101\240\257\250\003\043\302\355\237\334\317\056\002\060" - "\211\356\303\326\264\076\213\202\277\221\302\206\336\042\345\332" - "\226\177\327\115\347\162\277\236\210\316\162\162\333\077\114\221" - "\017\266\274\327\200\145\057\264\051\240\137\163\032\202\367\100" - "\071\374\030\004\345\314\236\024\153\363\307\077\271\010\243\066" - "\132\310\104\262\362\225\024\225\340\136\376\212\361\063\201\234" - "\346\057\272\346\147\333\022\072\165\163\113\062\076\022\210\226" - "\342\316\306\042\001\037\300\315\017\144\052\171\202\057\246\340" - "\106\064\132\176\365\043\021\352\112\350\225\320\027\115\152\361" - "\315\254\263\055\326\321\353\005\300\251\314\147\314\342\376\163" - "\124\105\147\113\153\222\134\306\305\122\001\101\031\013\312\055" - "\146\130\272\030\063\243\357\235\266\176\232\022\010\223\271\037" - "\266\057\372\104\055\310\300\224\012\353\137\377\040\131\252\167" - "\361\362\152\017\257\356\274\334\164\347\117\262\353\012\157\000" - "\340\205\371\170\122\200\055\333\021\172\350\222\057\315\127\340" - "\006\376\100\335\057\271\130\305\310\352\064\310\031\104\051\206" - "\054\332\005\224\210\271\015\246\250\310\105\352\074\326\201\003" - "\106\033\021\214\075\251\351\065\012\176\274\352\346\007\177\211" - "\130\026\171\236\106\360\004\125\206\376\105\361\166\304\365\153" - "\153\027\164\277\323\312\015\246\015\033\122\115\101\342\376\321" - "\303\153\241\333\275\070\006\152\322\263\060\276\306\343\271\334" - "\166\155\343\314\354\300\106\151\001\307\155\244\125\300\244\275" - "\176\034\036\353\170\317\237\204\010\126\020\231\066\074\316\323" - "\113\333\102\335\332\326\265\202\025\317\013\346\037\176\342\177" - "\075\140\234\165\016\005\307\362\112\271\274\101\302\032\033\250" - "\011\031\273\042\305\321\302\164\206\333\034\112\263\056\072\314" - "\057\232\253\353\367\275\106\342\016\300\324\041\376\356\133\012" - "\304\166\257\175\025\060\355\203\274\023\130\053\046\244\171\172" - "\113\041\173\003\135\071\156\034\157\317\262\350\315\034\331\017" - "\332\010\043\335\104\306\055\122\032\101\130\320\367\233\212\247" - "\114\001\341\047\107\157\357\176\357\102\150\155\105\151\144\364" - "\262\174\263\202\350\357\373\345\071\077\356\044\043\366\026\333" - "\113\102\260\073\063\321\140\033\305\345\014\001\326\063\256\134" - "\011\044\066\271\213\240\044\336\345\103\366\136\161\207\250\314" - "\114\024\247\317\341\173\007\357\245\054\155\301\350\277\203\204" - "\076\200\131\005\115\055\320\356\062\163\054\312\225\113\144\266" - "\074\153\207\050\155\362\002\136\170\035\244\021\075\211\165\041" - "\026\153\100\110\210\057\344\335\112\065\160\333\306\011\157\332" - "\117\340\040\164\235\334\367\071\172\323\141\310\003\247\307\172" - "\324\056\241\013\131\337\167\120\111\344\312\351\070\376\023\251" - "\252\143\035\011\222\015\140\247\274\277\024\104\216\270\203\216" - "\230\104\147\144\236\317\323\031\044\244\011\225\032\130\060\067" - "\005\223\222\133\327\103\327\050\067\001\023\372\130\230\061\216" - "\022\217\303\242\306\242\060\106\340\351\046\103\362\045\145\241" - "\362\201\324\071\005\252\250\062\252\254\212\147\243\363\030\251" - "\362\073\325\240\120\117\032\157\002\214\325\146\253\177\056\116" - "\353\004\364\305\237\105\136\367\025\023\255\134\006\317\113\003" - "\013\164\031\214\115\140\305\021\340\364\041\000\031\302\251\262" - "\030\165\164\011\317\246\031\247\243\223\010\151\265\260\000\111" - "\266\327\135\356\311\317\016\301\150\115\034\212\235\103\067\365" - "\327\367\274\017\126\340\105\037\275\217\030\371\056\031\224\170" - "\245\311\104\063\002\111\300\211\236\125\064\324\375\175\237\206" - "\064\152\052\150\202\022\036\354\273\114\301\325\046\144\112\154" - "\341\102\370\140\030\274\010\044\350\314\164\255\223\261\124\120" - "\122\361\164\064\011\304\261\112\014\115\153\143\017\154\377\165" - "\225\057\225\360\164\127\210\077\054\062\246\265\144\034\065\145" - "\211\117\147\324\044\301\003\327\034\205\322\221\230\172\072\126" - "\362\253\116\062\322\102\066\255\235\100\136\037\310\062\034\275" - "\340\302\214\137\345\351\114\161\267\240\306\370\255\207\132\331" - "\233\010\161\004\341\351\135\256\106\357\047\225\172\110\333\035" - "\033\170\002\116\043\217\324\072\057\205\331\314\314\165\071\164" - "\037\234\273\165\163\351\370\256\207\333\300\174\252\336\262\041" - "\024\313\356\067\227\345\221\264\062\141\053\110\053\077\233\204" - "\006\305\166\242\237\237\265\257\033\053\312\161\170\051\331\352" - "\350\076\131\167\240\356\330\327\217\030\264\342\310\022\120\236" - "\337\237\346\324\012\167\065\120\054\277\040\001\254\204\121\275" - "\042\046\273\217\307\137\340\156\223\323\240\020\122\351\002\144" - "\326\075\161\260\222\151\072\131\232\076\004\137\012\075\216\017" - "\344\231\153\127\235\203\362\164\226\327\374\152\046\273\173\112" - "\102\106\161\044\262\124\303\000\247\153\071\212\075\010\232\315" - "\215\114\042\056\161\156\043\061\132\024\253\175\030\164\372\233" - "\147\321\223\063\022\050\366\130\360\072\107\077\307\022\044\343" - "\310\266\216\233\315\142\261\100\371\041\167\113\117\201\071\236" - "\323\231\101\377\375\005\362\030\006\062\114\172\234\301\130\163" - "\205\253\234\350\131\232\023\010\162\200\051\172\024\326\346\057" - "\062\140\211\121\237\067\340\006\125\336\311\222\170\270\323\215" - "\334\052\335\131\304\357\370\370\220\277\002\352\007\003\270\323" - "\056\142\003\343\330\222\262\031\203\326\110\346\246\057\201\314" - "\013\323\026\133\246\127\044\342\113\335\070\022\066\201\375\122" - "\275\100\074\010\326\321\201\254\271\173\033\071\340\367\150\153" - "\365\327\317\356\254\155\146\250\144\321\066\163\223\261\345\332" - "\062\377\162\330\347\063\114\226\046\022\276\105\270\050\206\111" - "\065\122\226\255\040\040\120\012\156\024\333\301\217\074\227\034" - "\070\014\205\050\303\264\230\271\273\267\006\322\111\067\276\272" - "\122\333\233\256\105\240\020\372\100\371\341\237\021\224\074\300" - "\051\120\115\013\355\014\254\326\215\125\241\374\234\215\147\013" - "\072\135\001\130\233\147\266\010\116\127\132\257\316\033\245\134" - "\024\075\310\205\051\066\045\140\352\202\160\014\044\363\025\035" - "\126\124\052\270\321\313\205\147\155\045\167\337\154\255\071\047" - "\056\332\372\126\205\206\004\341\271\217\216\163\261\265\124\206" - "\232\013\155\371\305\200\217\316\156\223\235\163\052\010\375\012" - "\355\333\362\371\051\111\075\350\352\046\324\162\331\061\247\010" - "\374\207\204\107\135\310\147\144\327\011\210\373\102\136\340\341" - "\035\234\312\101\025\341\205\173\111\111\103\237\371\266\243\255" - "\350\275\046\255\250\242\124\126\207\036\104\215\233\222\324\036" - "\103\156\326\364\175\066\052\045\216\354\115\161\026\230\367\356" - "\070\367\231\015\150\215\111\305\270\332\134\251\033\105\244\134" - "\243\113\001\144\016\303\373\234\106\257\326\137\051\207\106\204" - "\160\076\064\266\100\117\041\222\342\123\050\302\134\377\125\364" - "\061\370\221\255\175\205\264\046\164\323\135\030\024\362\013\022" - "\041\356\063\131\140\203\022\056\124\235\024\052\064\035\106\055" - "\041\233\001\376\156\067\374\117\252\353\373\252\321\370\263\254" - "\027\020\213\062\223\203\254\303\104\030\015\033\337\307\306\362" - "\337\211\305\066\316\350\054\371\131\351\234\076\107\165\322\264" - "\356\015\013\076\043\326\371\260\064\156\255\357\050\240\125\303" - "\350\226\226\131\002\172\075\340\152\241\033\223\231\020\047\054" - "\331\160\301\205\173\242\127\170\001\237\212\332\271\153\327\147" - "\300\032\146\071\245\025\032\023\366\215\057\351\351\235\327\057" - "\065\064\327\243\321\270\237\226\201\103\064\100\135\226\160\077" - "\117\374\220\231\253\124\247\215\255\217\147\367\356\133\155\166" - "\040\226\346\155\374\320\235\117\340\206\252\146\162\275\344\171" - "\301\342\324\072\107\233\214\212\037\013\165\166\041\145\071\320" - "\241\275\126\333\306\273\111\006\305\052\300\235\265\306\314\325" - "\014\361\261\241\231\242\061\144\151\063\037\362\220\165\315\231" - "\140\174\155\166\364\177\370\113\203\354\051\103\024\171\013\036" - "\244\301\120\000\324\364\220\035\136\373\204\121\064\007\006\272" - "\152\366\232\250\174\332\221\062\062\212\064\177\325\203\243\263" - "\013\121\062\130\133\021\103\037\243\050\237\266\334\106\223\340" - "\203\026\326\117\155\017\037\141\175\252\240\174\207\122\035\270" - "\350\174\325\306\233\041\146\301\126\001\327\163\241\006\117\366" - "\316\333\026\107\302\261\325\234\050\232\356\170\054\173\077\375" - "\206\106\140\177\247\074\272\057\107\374\133\141\177\371\263\023" - "\057\375\104\320\207\357\143\253\016\146\253\234\021\176\306\037" - "\242\013\052\046\333\331\061\106\137\013\015\255\124\267\143\007" - "\365\140\145\146\170\245\135\025\102\252\043\140\006\026\214\314" - "\031\314\264\077\135\167\015\116\246\310\313\366\231\204\347\214" - "\202\315\336\312\152\255\017\313\045\300\310\032\036\327\123\366" - "\047\252\261\241\022\161\322\171\125\003\276\262\361\051\353\123" - "\102\370\232\106\073\015\123\331\115\373\361\135\247\113\346\252" - "\330\103\140\066\175\321\116\234\262\330\076\057\321\247\056\215" - "\201\077\000\272\053\123\152\116\312\330\070\073\121\002\203\317" - "\177\161\034\161\005\217\162\154\313\010\325\362\353\345\126\256" - "\231\377\346\256\176\205\330\025\054\066\055\113\305\153\246\014" - "\241\375\052\153\267\202\360\353\154\170\035\047\144\322\376\035" - "\165\253\241\302\213\110\275\147\277\203\273\055\260\146\323\023" - "\346\271\350\040\312\345\142\011\165\101\367\203\342\136\076\167" - "\226\110\240\050\016\354\155\345\130\037\321\272\035\013\305\210" - "\106\050\316\274\327\110\111\235\211\235\105\247\171\150\164\052" - "\317\226\152\344\027\235\002\247\330\022\077\257\316\347\044\013" - "\362\032\240\002\056\336\352\156\211\062\071\171\006\053\372\072" - "\352\300\354\227\250\066\231\321\241\376\175\014\330\231\106\254" - "\154\146\355\347\042\110\215\211\156\374\056\203\217\175\245\062" - "\214\270\301\251\227\111\154\145\101\106\140\276\126\310\325\074" - "\125\310\365\153\332\017\341\240\336\252\051\013\145\021\271\007" - "\061\374\312\246\236\262\242\266\364\022\077\135\070\074\206\135" - "\201\262\066\270\350\346\326\351\351\224\027\273\125\374\305\262" - "\304\140\033\126\100\130\305\002\237\223\353\330\273\212\275\265" - "\127\010\254\304\165\173\174\155\207\256\337\226\151\200\063\240" - "\043\155\170\074\254\260\044\145\001\152\120\331\146\176\100\203" - "\344\271\126\133\225\142\367\163\030\077\263\025\142\201\225\113" - "\267\134\213\143\026\017\316\367\272\116\305\050\321\274\047\077" - "\337\143\144\143\242\213\276\171\334\105\146\102\336\202\305\021" - "\376\214\351\176\266\312\241\141\372\054\002\140\272\332\225\315" - "\000\114\315\244\053\264\303\072\054\170\063\073\055\117\175\242" - "\376\225\271\146\224\305\167\317\014\032\072\300\242\224\354\154" - "\331\077\074\145\355\274\150\242\264\007\051\314\342\343\225\262" - "\005\205\102\043\147\372\212\303\021\367\333\313\244\253\312\063" - "\364\320\364\260\352\261\123\230\250\203\132\371\056\275\116\331" - "\366\170\134\260\302\044\151\255\303\164\013\113\356\162\015\340" - "\244\277\355\326\037\053\100\071\312\307\214\370\332\175\322\013" - "\207\224\027\315\337\350\235\001\031\017\331\247\325\264\010\026" - "\132\212\122\055\220\336\142\355\220\041\101\247\303\202\267\006" - "\270\306\166\220\326\032\173\323\105\307\216\371\016\254\237\064" - "\270\240\267\132\126\061\372\263\005\161\077\213\362\121\334\107" - "\231\375\303\103\126\055\356\207\033\172\223\156\311\054\264\154" - "\372\146\352\152\122\336\363\023\362\365\237\063\173\301\146\372" - "\303\306\234\104\040\271\155\273\352\013\363\261\173\225\065\201" - "\152\364\072\057\241\064\015\056\354\266\126\220\274\373\260\306" - "\115\252\033\135\132\234\007\314\151\065\313\103\157\341\312\030" - "\306\122\073\253\201\013\113\156\170\030\256\374\221\107\136\062" - "\000\137\240\377\255\312\163\154\153\223\217\132\360\015\240\277" - "\077\120\070\364\152\335\014\040\124\342\241\246\254\055\115\277" - "\054\244\140\271\103\056\277\300\271\247\002\211\371\202\352\331" - "\256\054\317\366\044\245\316\140\347\124\105\237\212\030\213\324" - "\155\341\045\104\306\315\365\105\154\053\142\371\130\333\170\251" - "\342\055\350\357\216\200\154\216\213\366\135\260\044\111\316\334" - "\106\064\215\070\033\032\312\374\301\156\026\152\037\324\071\325" - "\123\340\104\016\113\241\027\120\045\347\036\111\133\214\047\044" - "\274\151\076\206\222\012\111\371\132\001\370\150\002\117\134\335" - "\046\037\067\050\032\252\124\034\046\065\144\174\103\302\047\254" - "\030\013\266\230\244\260\037\325\166\301\176\002\217\110\007\027" - "\162\101\217\031\300\373\247\256\215\262\365\330\067\142\202\331" - "\023\223\210\137\226\202\173\223\313\237\176\154\044\110\007\114" - "\156\176\160\204\043\070\031\021\123\255\036\346\047\267\246\241" - "\002\362\222\262\142\251\326\042\164\362\220\224\010\224\347\046" - "\042\152\235\124\267\354\065\252\366\223\333\100\002\341\250\165" - "\102\261\123\325\211\152\072\251\037\125\352\210\215\014\332\011" - "\356\173\260\363\113\130\365\363\233\230\072\375\010\365\376\177" - "\312\054\010\271\264\114\113\345\366\202\330\235\322\156\146\177" - "\235\210\326\225\254\361\105\262\103\240\150\342\201\100\106\213" - "\163\237\010\021\247\331\135\235\263\040\230\314\050\122\110\256" - "\144\101\346\130\053\343\112\167\120\057\117\016\217\017\351\232" - "\201\311\037\312\221\166\355\057\367\323\271\127\237\126\355\155" - "\176\242\105\031\130\136\043\305\270\123\060\315\037\030\005\060" - "\343\147\312\210\240\071\116\355\373\341\245\045\227\215\003\036" - "\245\320\303\253\064\117\067\301\275\246\106\053\263\307\123\141" - "\146\233\042\150\333\025\075\165\073\241\351\331\074\260\313\367" - "\074\316\205\044\046\316\051\153\017\245\337\307\005\155\222\104" - "\107\316\300\053\263\213\036\205\330\026\277\336\201\010\042\170" - "\333\150\341\013\111\157\044\263\276\357\254\176\356\220\117\167" - "\315\133\255\245\364\340\304\105\177\200\023\171\322\151\056\244" - "\342\163\034\361\174\174\342\245\101\077\207\317\114\012\336\342" - "\236\275\167\275\106\070\246\301\065\304\206\010\205\167\272\311" - "\044\307\223\276\205\075\044\210\035\162\237\241\044\210\014\337" - "\151\326\023\346\024\122\334\071\274\011\120\011\102\254\324\055" - "\331\000\034\246\006\277\071\337\217\257\227\121\363\274\070\237" - "\057\225\215\251\005\013\135\007\274\312\031\060\340\177\050\276" - "\012\206\346\174\015\357\320\343\345\117\265\165\256\326\277\255" - "\142\006\045\074\050\347\065\344\063\075\374\046\115\237\032\231" - "\371\377\112\060\124\022\321\107\157\154\125\307\373\363\055\056" - "\123\150\215\230\320\126\321\031\107\206\367\325\216\221\326\300" - "\324\072\301\122\043\073\265\106\212\127\106\031\140\260\314\041" - "\153\212\311\315\225\110\326\073\314\376\125\207\335\251\163\162" - "\232\241\152\363\100\240\375\336\325\215\325\141\275\375\135\312" - "\224\221\065\317\222\221\274\043\016\347\137\002\230\140\254\230" - "\212\325\121\064\025\250\076\023\356\101\377\214\205\351\072\112" - "\302\004\342\230\060\255\221\262\114\015\326\362\353\101\033\170" - "\312\122\166\003\304\237\261\216\035\125\300\150\166\330\076\103" - "\345\371\267\332\333\042\205\075\327\245\175\171\231\330\177\261" - "\237\102\155\061\072\014\016\120\002\114\056\206\246\130\150\316" - "\116\101\130\253\237\156\320\344\364\225\253\003\104\077\374\271" - "\253\040\344\347\147\006\175\025\057\305\111\047\045\017\003\302" - "\005\077\336\210\260\003\144\220\124\135\270\050\306\270\353\120" - "\157\117\142\251\001\157\134\305\217\250\153\337\216\107\033\165" - "\131\040\116\344\314\277\314\165\016\167\331\363\237\232\302\255" - "\066\312\375\345\031\361\312\322\165\367\121\314\175\331\135\041" - "\274\260\327\375\206\373\364\267\362\266\273\106\121\130\161\262" - "\213\221\156\033\067\214\152\252\177\156\043\150\207\244\046\103" - "\022\170\253\263\015\135\263\173\200\052\036\052\021\145\155\370" - "\326\112\154\264\252\227\202\117\064\157\222\236\346\267\246\172" - "\375\167\234\351\061\262\353\042\361\156\164\055\222\257\006\306" - "\266\007\030\147\153\036\160\301\057\220\353\341\331\162\131\102" - "\305\071\151\307\103\010\250\211\102\137\315\036\153\157\144\224" - "\077\252\247\215\006\366\202\030\246\230\055\060\175\176\333\177" - "\362\153\223\146\371\342\374\100\076\315\262\251\227\121\042\063" - "\253\200\117\044\261\236\273\363\265\160\103\266\072\333\371\353" - "\147\361\300\177\305\366\133\306\000\055\374\015\143\341\233\013" - "\036\136\244\115\127\067\264\165\011\010\233\357\360\142\305\030" - "\130\104\246\063\233\362\171\173\003\173\316\006\375\172\216\103" - "\214\132\162\054\115\113\274\333\352\012\321\241\017\210\367\201" - "\064\371\136\144\013\147\337\037\230\264\047\273\012\143\363\047" - "\146\141\147\141\302\253\376\331\335\252\301\046\067\303\025\367" - "\302\232\140\220\065\311\007\116\121\156\144\135\335\273\204\266" - "\211\361\147\065\005\334\236\015\065\235\152\344\027\026\131\162" - "\200\242\161\054\101\305\200\036\253\221\120\304\062\203\254\061" - "\342\104\000\172\332\111\213\166\173\241\116\327\237\042\222\255" - "\043\271\010\333\115\205\271\014\133\365\014\204\340\232\041\051" - "\174\307\330\376\116\126\031\310\370\152\220\360\146\237\134\301" - "\133\307\255\065\005\370\040\325\022\151\000\137\174\250\123\213" - "\261\140\374\154\242\071\251\024\232\332\177\307\327\157\343\125" - "\023\252\157\324\331\154\340\073\201\101\317\036\356\214\331\252" - "\141\204\133\254\172\237\166\115\342\212\305\302\123\053\342\275" - "\255\134\061\311\345\342\006\055\001\047\143\343\131\135\024\150" - "\171\363\174\272\243\266\154\376\164\260\303\045\020\216\302\060" - "\352\152\143\256\333\130\272\246\170\151\035\357\202\017\306\267" - "\355\202\326\132\305\247\300\037\341\347\257\046\260\042\260\077" - "\315\117\205\253\134\263\322\250\063\330\031\301\316\002\345\002" - "\157\045\144\123\322\115\147\331\120\273\232\105\037\040\324\223" - "\114\021\306\230\237\330\056\116\141\333\174\006\255\066\154\336" - "\257\174\256\063\131\100\321\144\144\361\023\016\135\311\330\367" - "\263\166\351\307\165\005\046\333\143\212\225\224\326\265\011\151" - "\323\024\253\322\161\066\320\203\117\146\127\005\274\142\153\337" - "\007\022\103\131\263\271\363\052\335\007\366\141\177\207\056\342" - "\075\004\041\242\330\015\234\316\326\140\335\367\025\220\310\005" - "\317\000\250\343\150\175\367\344\070\367\314\164\263\340\313\307" - "\074\157\025\366\222\214\327\036\314\331\262\073\357\234\045\261" - "\231\335\375\362\350\145\175\103\255\033\152\145\350\364\371\040" - "\145\065\374\134\071\044\330\232\343\257\276\305\275\326\206\011" - "\324\266\144\036\274\330\161\307\273\032\241\316\160\203\040\342" - "\044\014\116\023\044\013\363\053\265\164\056\202\336\355\023\046" - "\242\041\056\131\117\053\300\155\301\065\201\004\261\054\255\120" - "\337\214\065\172\372\263\246\242\262\102\274\204\202\121\321\215" - "\331\117\347\040\036\017\000\326\161\213\304\234\055\201\354\277" - "\014\014\203\317\357\323\013\172\217\040\335\070\310\320\055\266" - "\141\267\151\323\306\205\071\024\243\000\110\335\361\051\311\373" - "\125\017\104\171\232\371\161\166\104\266\341\344\317\264\172\270" - "\060\012\130\210\244\325\151\272\147\361\306\265\165\201\233\272" - "\261\203\203\355\057\007\370\054\250\310\023\217\011\070\170\301" - "\255\326\360\142\261\205\126\023\214\177\373\272\261\351\350\070" - "\105\035\321\130\117\055\027\352\113\321\365\000\011\120\235\371" - "\255\307\160\263\103\311\144\250\055\313\161\121\377\165\363\123" - "\153\030\164\067\103\202\253\175\224\255\237\057\327\023\023\231" - "\321\136\043\354\121\304\363\203\343\240\047\144\110\261\364\345" - "\105\072\306\355\274\243\134\271\206\346\161\055\160\143\240\053" - "\172\005\224\117\215\377\313\124\247\123\374\175\025\150\223\010" - "\274\067\273\173\032\341\107\175\064\021\154\205\115\235\275\035" - "\336\332\354\210\013\152\046\144\050\122\203\043\034\155\234\307" - "\153\267\330\155\076\174\300\021\024\156\376\251\336\001\340\055" - "\250\271\237\247\372\065\216\366\132\254\156\031\073\310\014\276" - "\216\254\376\373\113\176\371\223\007\341\240\237\340\174\162\133" - "\327\242\112\377\234\371\063\167\204\340\160\156\104\263\354\353" - "\217\376\255\024\321\002\344\260\113\046\230\121\224\262\101\063" - "\255\124\254\366\072\044\030\312\234\134\375\101\364\232\123\121" - "\137\123\113\050\050\074\051\034\257\263\252\157\373\227\212\273" - "\120\115\277\213\340\052\057\265\121\225\163\360\320\317\052\323" - "\001\227\165\232\366\204\326\276\061\372\246\101\134\145\225\007" - "\130\257\266\022\141\135\000\113\143\017\242\370\102\174\252\154" - "\160\063\175\221\054\210\031\103\231\243\300\240\276\270\105\001" - "\234\241\116\373\146\033\277\061\342\064\052\133\250\270\127\064" - "\242\343\177\003\130\014\163\154\055\250\144\140\232\146\261\257" - "\246\316\257\150\215\147\033\100\233\177\025\123\275\030\316\027" - "\115\110\125\077\163\364\307\233\102\251\313\350\046\274\213\232" - "\004\153\247\040\315\346\111\267\174\155\245\124\341\043\314\276" - "\202\250\065\121\003\366\363\130\260\063\110\301\130\236\142\011" - "\251\362\064\265\107\163\121\254\147\311\214\040\206\051\037\034" - "\203\370\201\152\336\072\305\317\044\062\023\171\225\273\227\005" - "\341\374\116\125\153\277\236\166\354\044\244\001\224\235\267\024" - "\204\317\272\076\135\072\146\043\055\034\246\361\214\040\037\067" - "\220\173\222\246\235\207\153\227\111\077\017\360\217\173\135\156" - "\230\115\340\115\246\344\112\213\210\326\025\101\120\176\326\327" - "\373\353\275\262\343\354\322\165\127\116\146\271\046\030\036\163" - "\157\351\030\207\034\047\064\067\162\202\355\377\071\215\006\320" - "\166\131\331\040\151\304\171\132\122\047\013\174\270\364\017\000" - "\337\062\164\043\037\072\051\214\222\001\110\345\356\344\301\066" - "\223\146\246\271\176\015\347\355\366\033\116\164\244\123\144\202" - "\320\207\143\271\311\344\233\171\133\134\353\321\227\072\323\362" - "\022\373\213\132\054\227\237\334\013\123\074\324\317\354\260\033" - "\213\217\244\303\262\267\167\045\111\002\170\136\137\135\252\127" - "\311\263\235\312\000\302\370\263\004\067\335\044\023\350\257\337" - "\137\314\271\251\137\143\310\365\252\205\312\270\367\021\214\240" - "\204\245\174\075\066\014\242\062\360\031\164\140\105\336\270\272" - "\047\101\040\050\115\313\231\146\370\326\250\100\253\020\075\250" - "\254\370\230\002\007\312\043\151\340\273\247\001\226\166\006\347" - "\165\160\063\076\340\210\337\100\155\006\363\237\010\054\055\040" - "\320\217\130\151\023\154\012\236\341\107\154\161\052\057\107\231" - "\154\047\311\221\163\052\305\142\261\337\175\234\103\111\131\306" - "\007\363\373\031\104\164\131\050\354\057\152\346\247\321\346\062" - "\240\322\133\013\072\245\123\020\315\320\172\137\026\026\161\162" - "\110\062\221\026\231\150\133\202\231\043\205\050\213\046\164\267" - "\361\304\026\145\165\025\112\127\230\151\116\354\221\154\166\366" - "\320\222\210\017\317\302\053\026\011\043\262\050\043\063\235\152" - "\344\333\127\056\350\242\226\306\113\163\260\052\232\110\216\245" - "\361\145\355\164\230\143\372\347\057\203\353\107\343\265\066\262" - "\257\076\252\123\243\262\311\305\356\120\117\322\376\367\375\255" - "\107\326\052\025\253\274\354\116\317\242\174\235\273\147\210\176" - "\311\364\300\264\212\140\026\244\050\072\040\156\301\327\052\244" - "\067\004\356\162\313\257\163\330\311\041\052\010\075\354\175\317" - "\171\247\345\034\156\055\030\001\147\302\023\256\175\270\316\014" - "\372\314\220\064\355\211\103\303\000\274\324\014\270\145\001\237" - "\117\344\205\350\105\222\065\312\113\234\351\365\220\000\210\061" - "\206\331\277\010\152\005\163\045\337\042\170\037\264\304\043\342" - "\052\341\137\062\126\124\162\267\026\377\150\350\166\315\053\176" - "\257\255\155\040\320\021\072\301\352\142\324\041\063\323\346\125" - "\327\121\171\176\314\143\167\132\075\371\055\246\010\205\234\121" - "\372\053\055\216\331\133\272\073\062\043\124\356\323\155\012\323" - "\017\331\102\372\056\033\040\104\042\235\215\112\005\377\251\071" - "\112\305\200\020\030\233\311\076\031\101\140\141\024\027\227\364" - "\233\136\145\206\222\202\357\060\006\377\313\022\165\200\146\320" - "\175\223\207\071\324\005\117\355\064\340\312\332\005\311\227\060" - "\114\024\034\355\063\011\206\107\161\107\054\311\251\175\263\250" - "\054\101\315\072\224\034\232\251\243\220\155\210\122\153\153\023" - "\245\074\271\036\157\324\365\311\350\027\035\333\121\200\070\350" - "\315\116\131\373\253\317\152\151\372\236\131\315\237\324\150\265" - "\276\216\130\240\305\264\057\174\063\263\364\076\062\141\361\337" - "\100\346\314\156\023\344\054\155\160\141\023\061\301\240\361\245" - "\335\216\172\057\225\354\321\342\317\366\150\011\066\202\270\130" - "\350\027\355\302\073\243\150\054\072\126\233\330\367\107\214\261" - "\330\354\030\145\365\217\011\002\013\151\101\036\332\203\330\173" - "\334\373\307\032\122\041\366\323\001\237\310\374\175\347\332\170" - "\110\314\354\030\174\271\076\036\133\344\357\013\266\322\061\146" - "\311\217\256\307\235\305\310\163\047\276\051\376\213\302\107\105" - "\343\352\267\247\321\205\362\321\326\017\152\334\105\210\021\103" - "\223\150\026\302\340\070\041\230\125\323\237\373\156\161\165\147" - "\127\046\157\011\204\101\042\162\275\337\247\205\071\037\213\236" - "\202\260\114\224\151\307\260\032\271\053\160\233\365\265\055\300" - "\374\102\322\040\204\242\241\361\250\361\073\345\167\174\246\362" - "\013\263\240\060\172\070\312\213\146\102\311\054\143\053\136\013" - "\043\066\132\320\152\272\135\241\060\253\063\337\210\160\003\061" - "\161\032\314\322\200\052\331\341\102\247\120\221\214\063\250\132" - "\354\005\117\367\212\207\310\261\032\233\174\052\232\304\133\373" - "\133\144\052\134\231\276\066\040\343\066\117\155\375\342\332\253" - "\002\245\123\072\366\236\240\242\140\167\002\152\260\361\350\027" - "\317\242\144\307\104\324\077\337\113\373\372\165\055\136\306\245" - "\215\041\164\046\167\266\331\356\215\057\211\213\374\150\067\222" - "\022\067\256\226\034\161\321\345\044\057\075\170\357\333\235\113" - "\371\304\057\307\210\342\250\202\354\245\357\156\051\110\110\071" - "\246\301\121\337\277\140\050\347\132\166\260\245\334\224\121\241" - "\114\162\270\220\046\033\311\306\236\001\366\022\340\026\135\260" - "\102\267\005\235\374\127\205\044\304\050\330\117\312\336\276\276" - "\034\303\360\166\105\106\177\133\025\054\165\104\033\074\263\367" - "\321\012\142\226\213\074\000\131\135\313\102\115\107\135\245\163" - "\034\106\213\156\202\327\121\221\000\255\223\151\372\014\064\166" - "\124\356\213\133\137\025\162\361\106\361\052\214\004\011\133\104" - "\176\107\274\205\117\350\050\070\345\372\030\302\137\204\211\070" - "\024\264\212\176\057\345\203\000\046\262\360\030\051\261\357\056" - "\341\353\104\134\025\075\360\273\350\012\055\043\166\077\174\146" - "\063\366\075\311\032\175\007\353\325\165\027\371\354\163\074\340" - "\276\226\302\050\175\173\021\217\312\102\052\225\377\220\211\307" - "\365\241\372\205\353\010\044\245\115\156\024\010\160\210\355\214" - "\257\311\231\371\165\362\230\262\213\160\063\312\377\103\310\072" - "\361\303\040\261\361\257\111\323\063\230\035\033\027\146\123\222" - "\037\324\103\102\006\320\326\351\201\054\340\245\071\311\237\064" - "\262\214\233\262\023\030\352\003\316\043\142\161\130\047\272\174" - "\132\106\044\357\320\114\231\160\323\337\177\121\065\060\060\103" - "\061\176\270\311\060\113\076\252\351\111\067\313\374\216\302\353" - "\377\162\115\350\346\117\204\064\357\112\145\140\233\152\261\220" - "\316\263\210\024\226\303\364\367\001\133\111\341\175\020\211\311" - "\105\302\135\014\146\372\012\323\301\060\102\207\101\317\255\207" - "\064\374\361\316\134\220\353\066\140\211\012\303\301\142\030\140" - "\233\353\243\237\206\323\352\211\325\270\071\224\151\066\157\073" - "\257\150\244\332\034\007\367\125\171\042\316\217\036\101\020\232" - "\103\372\304\031\327\206\212\164\372\163\310\006\244\162\354\064" - "\210\322\007\232\161\163\070\315\117\110\157\266\105\077\306\105" - "\332\235\204\240\105\335\127\212\042\062\156\362\135\017\061\325" - "\354\271\340\303\122\267\201\040\314\216\037\230\222\124\040\305" - "\000\136\344\200\047\100\333\054\062\356\066\302\140\040\112\322" - "\127\160\276\332\147\014\060\112\027\046\125\215\077\267\257\145" - "\240\363\162\321\332\225\267\014\052\235\347\126\102\103\254\112" - "\054\235\024\353\100\263\230\105\120\230\201\301\357\177\030\212" - "\276\146\171\125\171\116\062\303\260\255\073\150\275\103\172\147" - "\236\033\262\247\010\004\135\263\311\127\110\007\270\065\070\013" - "\170\375\223\231\254\312\136\202\143\125\144\341\330\333\040\233" - "\252\117\121\314\071\022\317\113\132\215\033\224\266\270\175\117" - "\115\174\300\126\311\276\234\001\176\341\207\244\276\244\334\204" - "\054\227\127\251\316\021\106\156\005\255\124\331\052\312\341\105" - "\242\135\207\046\375\045\051\012\037\220\201\342\232\267\066\141" - "\077\110\217\374\067\075\135\167\132\221\153\340\243\233\260\127" - "\143\230\014\016\273\354\342\371\373\351\143\302\060\040\020\074" - "\373\241\174\106\034\250\152\306\314\340\376\312\044\107\017\153" - "\243\264\112\077\072\217\155\025\255\026\072\107\276\067\307\003" - "\036\205\222\325\067\135\165\055\141\233\153\350\023\076\356\240" - "\162\264\223\221\304\006\215\221\012\143\107\244\105\204\346\266" - "\031\366\220\104\236\003\353\335\175\073\131\307\333\160\213\263" - "\064\036\261\273\305\073\173\364\003\030\353\137\220\346\146\002" - "\374\122\251\072\026\143\341\220\344\225\305\275\134\376\106\333" - "\103\262\053\223\375\070\233\014\013\077\042\113\200\052\350\360" - "\145\123\223\227\044\145\233\227\374\043\315\232\026\333\013\315" - "\030\020\152\015\215\063\352\013\114\276\230\005\162\161\033\204" - "\330\166\151\112\267\023\053\233\167\362\164\251\113\322\303\160" - "\167\037\176\135\155\234\211\251\044\022\366\340\326\363\364\342" - "\135\171\211\373\302\005\311\357\121\051\302\150\060\030\354\037" - "\106\040\253\242\127\377\236\236\167\264\267\077\020\122\252\215" - "\206\361\215\246\020\177\355\241\244\023\075\251\365\325\244\311" - "\205\110\370\112\213\304\132\017\272\012\147\261\245\107\170\044" - "\277\117\324\073\201\243\221\154\335\046\353\206\241\351\326\103" - "\031\223\351\300\377\267\214\200\030\205\127\114\264\355\321\376" - "\175\362\020\227\326\071\051\317\337\372\023\101\067\126\363\023" - "\102\312\133\250\032\003\124\141\220\213\343\120\020\253\165\221" - "\045\113\260\011\131\172\226\067\152\277\170\054\176\237\024\301" - "\122\050\075\012\354\326\336\236\335\003\324\143\236\037\064\234" - "\146\033\062\160\201\041\057\344\273\063\044\153\015\121\062\136" - "\254\200\014\130\311\107\207\301\167\014\322\002\173\240\023\143" - "\220\376\161\011\250\206\104\201\176\016\202\260\335\166\166\274" - "\252\152\014\101\075\373\266\077\045\265\010\123\005\132\133\335" - "\223\150\362\054\023\136\226\317\254\344\304\034\220\076\143\320" - "\046\135\304\175\203\313\035\243\215\316\026\164\042\067\124\145" - "\172\222\055\175\034\040\377\300\024\326\262\052\352\350\062\171" - "\045\225\037\057\342\165\070\376\362\243\267\261\001\102\151\026" - "\254\157\177\362\017\071\132\262\164\160\234\247\000\110\171\057" - "\276\377\371\244\333\075\347\365\013\324\215\260\007\104\341\275" - "\215\011\162\310\334\325\375\336\317\043\034\165\007\210\024\070" - "\246\355\133\246\166\272\004\032\065\365\236\036\320\225\267\054" - "\006\242\262\063\317\202\211\270\337\333\170\142\261\160\250\215" - "\373\303\350\010\167\001\225\236\155\123\377\355\306\326\316\075" - "\242\051\200\346\254\242\154\243\327\201\025\046\252\104\345\125" - "\210\336\152\241\302\001\011\310\256\047\025\165\366\314\221\075" - "\270\222\206\047\017\206\017\211\116\201\247\213\061\013\201\152" - "\071\151\251\366\341\053\307\022\303\363\002\070\325\326\213\101" - "\242\367\131\346\011\175\212\172\021\055\264\054\367\353\122\175" - "\230\023\353\111\032\157\364\302\027\243\073\041\014\132\306\042" - "\052\007\162\203\164\023\334\124\324\161\054\033\073\215\313\326" - "\264\022\024\342\077\377\030\062\224\307\033\300\233\152\250\172" - "\241\103\106\073\050\156\041\377\376\023\364\074\010\335\157\226" - "\052\126\361\320\246\111\154\233\252\017\331\222\303\347\220\271" - "\256\076\131\262\303\102\257\177\174\065\262\143\105\215\315\164" - "\143\304\173\276\203\007\017\024\030\260\167\124\316\355\034\042" - "\072\325\143\256\154\367\155\120\044\216\272\272\226\114\244\154" - "\032\252\360\120\307\156\315\217\200\220\050\270\216\305\211\202" - "\242\364\002\052\200\252\235\261\014\012\171\243\115\360\005\062" - "\260\211\146\055\006\121\115\116\047\142\007\241\305\102\276\045" - "\037\275\315\266\052\267\230\025\072\337\357\157\334\207\254\334" - "\211\031\203\042\331\253\132\214\022\377\151\137\006\350\311\064" - "\207\130\324\342\277\215\326\131\123\077\144\034\212\352\014\230" - "\342\137\237\345\335\363\017\361\170\120\151\254\156\213\164\055" - "\265\052\113\013\270\004\121\330\040\064\014\247\350\223\073\024" - "\007\254\215\025\112\260\133\332\372\130\155\034\237\253\243\331" - "\145\336\204\376\005\101\036\257\267\210\060\031\323\104\200\261" - "\201\275\176\363\321\215\253\345\316\335\072\357\362\153\142\000" - "\074\335\215\015\107\302\372\150\026\237\070\055\020\004\172\111" - "\102\110\346\211\121\051\053\277\000\262\011\106\010\270\111\125" - "\305\051\333\021\143\307\010\230\155\010\254\202\276\277\357\153" - "\160\071\021\311\331\211\167\103\140\105\232\030\065\200\126\175" - "\170\126\225\325\136\212\147\314\301\031\345\340\221\271\216\277" - "\043\243\031\317\077\070\273\046\361\334\352\230\011\151\301\142" - "\311\002\216\346\146\232\275\056\154\324\043\151\303\031\263\151" - "\063\243\247\066\355\216\245\132\147\014\056\247\022\046\022\075" - "\330\130\226\040\360\247\210\254\255\175\203\134\106\221\102\044" - "\300\274\373\056\020\245\047\061\077\133\345\025\377\201\341\126" - "\074\260\030\140\314\370\232\371\034\215\137\052\145\073\171\233" - "\011\301\224\015\343\257\337\360\267\244\203\231\302\122\254\254" - "\371\216\363\333\244\332\323\017\362\143\334\277\020\062\065\316" - "\360\272\206\146\033\163\052\330\372\016\060\124\335\220\133\345" - "\317\174\224\061\147\320\325\125\320\107\057\314\123\117\077\342" - "\246\251\127\264\241\145\211\067\005\145\112\334\205\074\355\046" - "\346\070\015\116\334\103\347\275\070\234\307\354\014\326\073\002" - "\306\262\346\312\315\013\111\241\236\343\335\171\222\110\323\203" - "\330\057\274\215\300\315\243\307\121\353\064\061\152\033\324\336" - "\127\042\302\335\354\217\245\203\150\337\013\041\141\130\306\243" - "\344\152\255\153\353\161\015\352\364\306\043\271\027\236\170\160" - "\310\152\031\150\337\266\046\136\305\173\103\326\032\361\116\313" - "\030\223\156\070\117\357\174\241\076\165\007\222\303\215\164\011" - "\365\073\061\251\330\254\140\176\271\227\234\164\045\166\242\152" - "\222\302\352\206\374\231\220\075\373\206\034\110\114\341\076\035" - "\361\362\313\015\037\305\244\065\015\254\272\156\073\277\016\004" - "\110\011\344\371\357\352\154\327\016\025\270\341\145\050\332\210" - "\316\373\060\055\030\230\012\222\055\213\010\170\173\244\132\131" - "\236\302\372\251\344\232\236\137\244\214\104\205\202\070\360\065" - "\230\335\315\020\322\340\210\126\346\351\044\157\366\207\126\034" - "\147\345\146\244\320\021\330\105\121\336\032\002\056\333\373\313" - "\027\172\060\034\315\145\262\243\375\030\214\047\000\267\163\340" - "\074\027\177\313\117\035\042\254\347\117\137\166\122\335\116\103" - "\326\301\261\376\146\074\376\265\346\246\233\263\165\261\240\113" - "\336\177\152\020\206\034\325\264\162\230\036\334\053\121\017\143" - "\313\236\032\216\043\013\112\075\144\074\043\064\123\011\022\167" - "\056\247\115\242\267\061\370\113\223\304\263\332\015\374\206\040" - "\377\240\165\042\264\132\070\237\074\041\225\316\167\227\177\247" - "\053\232\162\364\027\352\117\374\372\377\324\126\232\216\053\337" - "\106\240\003\002\102\074\347\323\050\056\252\031\116\133\265\053" - "\250\354\167\016\234\020\127\064\306\267\354\055\357\270\040\244" - "\226\063\372\115\045\067\064\363\070\122\337\010\266\141\001\342" - "\140\351\033\370\226\142\224\307\216\264\305\214\142\156\050\346" - "\056\013\124\260\210\022\105\052\070\114\336\357\362\347\302\233" - "\267\136\127\347\214\213\341\133\015\052\227\375\221\240\012\100" - "\150\165\113\016\264\004\363\337\044\260\321\065\327\106\004\163" - "\150\001\316\275\333\116\055\360\013\032\030\021\023\216\033\353" - "\215\060\047\145\353\322\334\143\306\374\254\217\251\374\123\047" - "\374\355\132\063\005\376\153\035\055\151\331\367\066\347\202\071" - "\252\206\045\167\054\220\162\215\075\242\346\236\313\356\261\332" - "\346\342\205\031\071\272\103\141\053\166\354\203\121\014\101\303" - "\315\006\200\016\345\347\117\271\330\245\141\077\151\160\354\203" - "\073\166\001\132\020\147\064\362\373\001\351\032\271\053\073\211" - "\061\052\053\214\260\163\020\371\250\263\315\055\060\161\267\334" - "\376\120\332\151\256\113\166\360\062\003\167\176\360\021\164\124" - "\076\043\372\061\334\146\327\367\122\144\250\205\110\071\050\010" - "\342\174\217\347\307\270\110\226\154\313\142\014\041\103\276\304" - "\037\265\124\355\173\160\047\134\317\047\265\224\315\222\206\103" - "\015\357\220\021\241\053\027\272\264\271\155\006\263\123\337\161" - "\230\227\235\114\311\063\162\167\063\011\223\030\132\222\050\270" - "\010\312\267\022\021\025\120\325\213\271\070\314\353\067\152\025" - "\201\045\227\126\300\243\101\042\227\010\015\310\120\056\317\047" - "\115\225\337\366\317\160\124\160\036\037\306\344\361\177\240\336" - "\261\076\137\137\172\376\122\242\103\240\121\353\172\263\015\202" - "\262\120\070\317\247\055\042\140\131\307\354\367\015\265\353\212" - "\203\112\071\122\270\021\100\075\147\346\231\067\053\015\137\263" - "\254\247\137\242\010\023\357\005\372\237\240\036\112\323\216\056" - "\111\123\115\076\167\005\152\074\007\140\362\350\112\130\004\002" - "\005\027\172\011\070\131\252\270\316\275\260\014\321\034\240\201" - "\305\227\106\123\270\235\267\330\301\054\006\206\244\045\040\146" - "\043\175\003\241\017\044\261\250\011\076\207\166\011\344\315\161" - "\263\360\327\262\054\022\054\230\270\046\000\330\311\356\017\133" - "\244\132\161\374\356\353\324\333\346\347\250\073\005\260\062\111" - "\350\260\060\327\262\104\136\331\322\067\053\026\114\337\047\120" - "\136\201\206\373\337\353\230\144\107\353\070\026\210\012\177\065" - "\146\257\321\315\042\371\272\200\300\362\320\224\313\372\023\063" - "\364\161\022\120\126\051\365\323\256\337\264\151\261\211\007\220" - "\064\104\041\313\067\145\221\057\263\362\213\111\370\056\236\002" - "\025\247\237\006\116\155\212\377\103\237\357\101\333\304\031\200" - "\002\271\277\243\030\320\103\355\001\104\310\350\207\103\071\122" - "\150\233\053\115\337\306\272\137\160\253\067\332\141\041\112\312" - "\210\212\007\111\160\116\250\042\011\024\031\363\112\330\361\346" - "\176\224\204\103\245\074\043\376\235\027\133\351\012\107\226\161" - "\315\331\135\237\213\330\345\363\231\270\303\237\011\202\022\204" - "\074\336\150\241\117\010\355\023\107\051\245\271\133\351\375\142" - "\010\257\135\136\364\267\333\051\252\134\110\243\356\027\174\264" - "\342\276\362\116\042\303\101\211\370\021\227\144\174\122\074\305" - "\226\346\346\271\006\030\130\133\215\206\044\026\350\127\221\370" - "\066\341\144\006\124\002\104\030\322\007\222\027\160\301\167\136" - "\176\106\000\210\215\003\324\101\124\134\050\347\367\347\126\360" - "\026\177\147\101\154\051\071\100\053\066\172\176\032\105\025\063" - "\104\073\236\142\316\375\134\362\137\052\365\245\312\055\367\310" - "\072\146\103\300\377\022\047\032\350\361\236\016\261\145\023\367" - "\062\222\145\157\214\253\314\066\275\153\250\320\373\251\224\243" - "\006\335\172\005\136\111\040\203\303\225\070\375\265\273\144\305" - "\141\240\142\371\264\353\171\172\315\067\161\100\262\140\022\165" - "\062\113\043\256\103\273\076\326\270\115\323\157\143\007\111\343" - "\175\356\036\053\030\306\106\212\364\004\336\324\332\021\364\122" - "\242\005\105\023\304\006\320\112\326\215\347\250\114\005\303\042" - "\357\243\340\157\157\031\261\352\276\224\244\264\041\177\133\357" - "\323\203\371\230\044\272\166\222\340\215\350\203\150\156\100\306" - "\175\346\224\171\350\072\251\066\073\205\140\260\230\050\221\206" - "\127\034\277\223\177\125\265\064\101\230\050\102\005\030\011\352" - "\317\061\024\310\037\377\044\155\174\176\332\237\212\221\203\141" - "\113\260\065\271\010\236\302\173\163\364\312\267\244\242\344\337" - "\375\244\125\142\040\340\361\336\156\045\000\217\077\133\326\066" - "\351\134\227\341\306\030\376\110\071\273\065\341\342\105\254\147" - "\003\034\202\375\321\231\252\037\044\314\045\214\206\106\022\351" - "\001\362\024\226\047\001\213\200\170\352\015\206\277\063\351\325" - "\120\154\040\004\165\324\050\232\202\326\022\134\125\361\122\077" - "\144\242\123\333\052\331\005\155\017\050\033\200\225\122\243\256" - "\360\155\033\311\304\151\147\212\040\351\326\210\341\373\245\237" - "\021\325\231\347\070\075\266\125\324\161\062\052\275\036\155\304" - "\253\042\172\100\217\034\045\065\046\274\350\251\265\142\054\202" - "\241\164\316\066\263\200\063\007\230\037\234\164\024\127\335\367" - "\304\340\172\350\215\036\343\330\276\124\135\052\274\210\033\047" - "\275\231\176\351\204\213\351\310\013\155\211\374\220\055\171\147" - "\106\016\341\165\150\041\166\151\276\127\310\120\075\310\326\107" - "\114\275\315\014\263\272\376\141\053\112\021\050\203\003\373\200" - "\367\361\225\103\200\242\360\144\224\234\276\131\140\150\255\011" - "\131\114\337\243\272\255\111\106\301\274\236\356\323\054\327\253" - "\240\103\034\002\051\024\020\121\316\100\303\232\127\176\256\165" - "\332\352\262\153\230\356\006\373\372\260\067\137\043\202\147\054" - "\310\120\005\064\230\014\333\140\070\015\015\274\062\355\155\226" - "\347\310\227\016\245\120\371\126\233\166\014\364\151\051\216\025" - "\137\116\350\162\313\125\250\176\274\247\317\104\146\032\173\061" - "\326\114\364\043\314\127\130\145\106\364\112\145\265\165\042\055" - "\207\012\245\050\307\313\045\144\173\160\216\246\177\363\263\331" - "\374\235\037\264\105\274\135\376\306\206\254\337\374\373\331\116" - "\262\022\134\323\256\233\263\174\175\314\363\057\041\136\221\366" - "\354\367\331\103\007\302\167\311\162\341\036\024\173\127\315\116" - "\342\117\252\123\243\220\177\007\133\052\366\251\050\324\151\075" - "\202\120\017\160\264\212\120\050\206\123\035\322\104\347\221\261" - "\115\163\274\330\251\161\060\056\157\305\047\351\341\147\143\032" - "\171\077\026\264\120\074\142\360\154\227\244\163\010\171\351\136" - "\106\140\107\132\065\333\217\152\347\003\175\303\120\155\332\121" - "\350\342\014\206\102\110\070\345\211\226\206\162\370\272\200\162" - "\015\212\110\100\024\062\132\016\076\120\062\350\052\235\003\257" - "\232\141\345\341\113\151\276\340\207\006\111\376\357\020\217\064" - "\303\133\341\214\327\344\005\370\270\327\022\123\350\054\167\235" - "\367\146\347\055\052\001\115\171\131\240\200\154\360\007\150\352" - "\176\171\307\062\204\040\222\336\244\067\334\154\116\105\323\172" - "\061\206\117\135\241\010\343\164\360\013\366\146\053\367\033\017" - "\166\231\321\057\236\331\357\366\270\244\263\302\341\312\376\204" - "\117\150\204\005\325\067\375\215\027\145\132\034\004\156\053\077" - "\275\127\203\245\320\200\162\003\017\220\344\302\315\342\153\343" - "\104\367\135\036\343\317\017\065\076\101\230\066\123\265\152\213" - "\251\127\225\134\043\302\275\231\237\116\140\116\166\356\162\033" - "\230\126\123\077\154\065\015\346\363\237\232\160\034\223\110\267" - "\257\006\312\315\247\322\371\275\372\153\265\326\352\152\336\027" - "\105\257\067\167\100\154\252\027\012\115\150\234\304\137\267\311" - "\152\246\367\224\046\242\153\115\152\346\024\055\260\373\263\106" - "\217\317\267\147\024\350\306\342\310\363\243\214\356\127\137\041" - "\057\136\245\061\254\130\036\370\313\112\032\367\342\050\323\331" - "\226\314\003\062\301\073\357\062\105\204\103\074\014\177\126\050" - "\303\046\257\243\350\310\160\267\305\303\307\213\133\132\323\175" - "\273\257\247\010\371\147\352\157\215\054\144\170\203\301\237\113" - "\160\370\130\273\063\034\324\341\112\340\247\246\102\242\250\103" - "\034\037\312\364\117\231\232\300\366\314\370\271\127\335\007\310" - "\274\127\171\371\066\217\011\012\303\305\201\327\326\243\074\234" - "\051\246\346\022\213\210\051\144\262\305\053\147\370\164\314\373" - "\072\123\006\372\212\027\212\321\065\360\234\176\277\105\363\334" - "\124\057\333\024\215\014\073\203\346\247\113\043\354\355\032\066" - "\022\143\272\117\314\013\341\364\156\107\201\306\030\245\112\121" - "\363\147\137\311\230\164\105\327\045\077\352\364\340\314\223\226" - "\126\061\074\277\037\022\126\102\116\131\142\262\360\017\064\243" - "\256\162\200\227\217\344\335\160\141\000\133\055\143\071\140\061" - "\150\071\103\211\324\170\215\311\037\141\327\131\227\144\316\214" - "\261\324\261\335\363\145\271\134\136\060\244\257\050\301\202\047" - "\206\333\011\117\266\236\244\205\141\260\362\132\070\370\167\165" - "\213\012\177\170\274\303\051\175\077\315\160\002\134\157\256\361" - "\152\362\312\305\351\346\101\155\203\321\051\046\073\310\355\356" - "\365\127\051\162\374\232\101\060\200\157\043\176\166\130\252\161" - "\372\202\215\211\246\164\140\302\064\312\300\152\223\230\113\011" - "\277\234\245\364\025\166\022\156\130\321\212\123\135\364\064\340" - "\221\314\353\151\357\073\056\267\044\024\053\336\224\234\032\133" - "\255\120\162\314\167\242\063\117\246\227\256\016\305\017\002\332" - "\230\366\033\114\263\010\352\017\355\064\363\030\006\365\222\022" - "\300\325\130\020\070\150\261\045\123\317\370\177\167\375\371\016" - "\151\254\330\174\004\263\170\075\211\136\361\007\073\100\307\204" - "\014\372\276\143\230\057\021\335\040\323\243\155\050\376\155\007" - "\021\252\372\124\200\332\005\242\071\064\245\360\336\131\021\157" - "\240\330\066\137\134\304\071\227\202\206\312\277\104\245\001\344" - "\075\234\005\343\314\210\063\157\253\133\353\316\064\256\020\372" - "\301\335\053\311\231\210\325\261\110\066\314\130\277\221\253\210" - "\363\163\331\155\231\175\124\356\336\334\215\362\267\331\246\301" - "\271\020\142\227\210\226\113\311\267\064\366\370\233\160\113\203" - "\164\110\041\011\017\027\056\065\134\175\315\224\124\316\172\357" - "\013\272\314\266\053\244\066\031\276\170\053\207\057\070\346\160" - "\065\335\027\050\310\104\236\211\131\302\165\345\261\231\150\014" - "\363\157\141\041\136\354\351\370\073\312\102\212\302\354\213\106" - "\361\161\324\065\223\264\130\137\130\172\134\001\152\245\256\377" - "\037\003\041\162\324\021\043\023\156\025\122\364\016\015\353\370" - "\006\005\352\076\340\035\213\072\056\227\325\115\264\264\341\022" - "\120\210\125\116\276\361\115\144\150\345\236\036\370\002\341\131" - "\117\033\356\271\277\305\314\225\222\151\376\166\046\245\107\041" - "\053\135\305\114\141\226\350\005\052\340\204\067\136\213\051\203" - "\255\010\223\116\353\374\037\337\127\141\206\045\007\174\265\124" - "\342\237\342\245\156\255\221\023\145\333\303\035\241\134\172\360" - "\137\306\054\215\123\257\201\155\304\244\026\115\122\035\203\041" - "\164\072\147\100\075\124\016\010\065\025\033\046\166\256\011\325" - "\331\063\277\126\250\256\352\214\060\374\166\234\175\232\052\344" - "\177\376\110\314\265\343\356\164\076\260\121\214\050\063\236\364" - "\337\125\074\222\175\347\374\351\347\142\306\132\127\203\221\250" - "\046\073\103\243\031\156\145\032\020\361\212\125\027\013\205\034" - "\063\324\021\125\027\324\272\065\016\246\215\222\366\055\104\204" - "\000\225\174\125\216\120\355\321\377\334\327\040\300\152\233\230" - "\063\204\010\354\064\377\052\121\342\157\173\055\213\235\134\013" - "\310\351\216\147\263\330\216\301\207\347\115\130\045\261\337\165" - "\173\177\172\376\343\337\205\221\242\063\045\163\013\355\315\134" - "\251\376\062\036\176\112\027\235\210\041\040\306\312\216\175\016" - "\252\041\124\203\037\237\223\225\150\064\317\252\256\220\226\035" - "\340\130\076\306\023\332\035\345\012\216\257\171\247\157\144\042" - "\000\327\307\324\243\304\363\372\166\370\007\011\367\046\215\146" - "\177\051\005\362\215\006\272\142\033\163\270\357\211\171\276\001" - "\225\375\151\066\301\226\306\355\242\170\270\117\124\347\140\011" - "\336\361\107\143\063\213\061\051\350\200\305\033\366\360\215\154" - "\032\027\241\153\304\144\015\305\062\323\134\170\372\324\365\367" - "\365\213\132\245\072\334\176\160\044\274\267\321\257\333\145\302" - "\367\356\162\210\012\360\235\044\262\373\343\110\247\047\277\156" - "\255\305\202\044\060\220\143\366\321\265\057\257\206\203\041\133" - "\124\007\344\260\236\365\325\233\203\133\002\224\111\067\302\204" - "\024\353\014\226\241\367\170\362\363\064\011\344\150\225\027\206" - "\074\345\234\346\267\357\310\227\372\202\065\136\132\267\351\311" - "\352\133\061\171\245\351\346\025\073\355\344\153\115\031\005\127" - "\256\051\267\211\303\356\330\231\142\120\137\020\331\147\256\361" - "\022\266\075\357\310\047\071\273\304\212\104\302\370\375\267\224" - "\232\314\143\131\222\272\313\151\317\115\017\164\207\260\200\135" - "\161\045\335\212\221\110\337\154\044\045\067\364\321\127\222\206" - "\273\044\153\131\160\172\365\241\052\172\157\320\134\016\237\213" - "\346\366\270\264\257\102\317\207\023\033\373\312\143\341\114\307" - "\275\137\275\340\231\230\213\070\222\012\170\236\152\257\170\124" - "\053\305\154\067\367\006\046\140\122\131\370\010\363\056\130\260" - "\174\355\117\271\044\361\273\155\167\221\224\121\063\325\202\341" - "\135\047\372\106\133\260\373\045\017\077\006\333\120\347\001\263" - "\045\325\145\200\144\156\127\263\251\314\370\236\172\152\350\262" - "\333\005\332\073\153\075\135\103\112\367\344\261\171\145\020\123" - "\103\221\302\144\027\006\323\206\166\303\275\136\165\136\204\261" - "\035\121\356\322\046\164\024\276\111\130\306\076\006\033\230\166" - "\066\063\000\151\163\177\251\055\062\035\070\167\376\222\256\204" - "\125\051\012\241\333\237\130\251\324\177\326\203\140\007\167\017" - "\144\074\032\315\234\116\344\371\350\357\024\371\221\177\223\331" - "\141\007\056\324\327\205\271\067\076\144\244\112\052\344\123\327" - "\174\370\341\017\107\051\141\034\206\166\132\056\144\172\324\207" - "\067\265\213\001\104\343\377\335\020\076\022\362\033\006\117\336" - "\123\033\215\071\021\231\274\061\025\337\370\204\007\167\356\355" - "\131\064\304\012\062\240\276\133\033\204\357\347\053\171\041\373" - "\216\302\076\225\272\342\332\053\353\260\015\246\205\123\163\023" - "\330\131\322\104\046\331\132\113\256\001\327\375\054\020\175\366" - "\305\364\002\203\266\230\225\020\210\173\330\260\310\022\250\344" - "\334\234\041\031\112\253\334\077\171\054\152\335\212\032\007\006" - "\013\101\244\117\224\205\267\372\166\163\164\206\004\026\065\203" - "\000\214\132\344\374\232\360\366\043\204\000\110\331\040\370\051" - "\052\274\130\355\020\141\163\106\232\345\167\316\340\060\125\262" - "\360\341\134\335\057\173\261\240\071\376\336\152\150\272\210\133" - "\373\241\212\362\244\241\201\306\161\266\115\344\344\374\006\104" - "\312\375\164\204\242\266\325\217\314\043\327\046\231\266\315\314" - "\041\370\206\002\104\376\377\252\173\113\370\261\077\205\146\201" - "\113\301\327\256\003\221\077\332\377\267\322\304\273\104\312\141" - "\160\164\367\321\046\031\327\125\327\253\205\133\051\357\367\040" - "\100\232\050\303\144\305\330\030\220\324\000\256\056\140\144\246" - "\152\016\274\064\032\345\375\155\064\342\232\002\076\007\312\300" - "\100\304\042\220\167\042\213\306\157\012\172\153\062\337\342\126" - "\116\140\047\242\105\333\161\254\137\130\075\064\026\076\172\105" - "\201\246\051\054\305\305\005\144\017\231\062\231\346\214\272\002" - "\073\320\220\361\164\056\343\150\200\165\101\376\002\351\174\141" - "\320\151\325\073\162\210\025\063\022\106\242\017\317\055\141\123" - "\236\165\077\243\231\214\340\072\277\214\323\117\201\023\006\271" - "\112\304\076\147\036\070\371\134\073\317\134\331\007\052\311\214" - "\202\273\073\315\122\227\023\012\152\034\246\365\221\370\100\222" - "\243\061\172\374\033\270\314\051\154\151\045\346\243\360\017\242" - "\353\050\244\371\376\022\256\252\210\203\061\314\332\044\053\115" - "\314\353\056\244\265\374\023\351\303\271\056\060\170\005\061\306" - "\015\300\260\157\214\142\130\374\121\034\140\176\364\072\250\042" - "\106\255\276\371\333\261\173\170\022\005\336\153\154\373\006\012" - "\067\061\215\257\312\251\125\362\142\145\231\277\015\354\265\372" - "\146\126\143\326\144\257\275\217\210\117\220\206\240\373\100\142" - "\354\247\013\207\350\173\374\231\027\335\103\271\057\027\105\241" - "\006\224\264\305\004\342\050\173\136\311\132\043\220\136\015\062" - "\311\063\140\050\037\024\201\267\306\320\355\301\340\230\353\247" - "\103\327\157\133\253\015\247\310\034\350\260\272\002\131\170\351" - "\117\227\254\357\232\247\000\267\073\041\141\222\336\276\111\002" - "\360\010\177\107\235\317\013\276\154\345\200\323\245\051\355\327" - "\351\052\375\154\262\364\166\125\263\374\057\055\361\131\265\135" - "\033\357\124\134\106\123\320\144\213\127\357\022\061\312\112\127" - "\103\204\117\061\233\010\347\310\367\133\026\113\034\015\275\155" - "\256\360\245\020\335\156\112\300\077\164\162\276\260\311\233\377" - "\206\013\344\322\037\116\272\106\063\061\346\055\376\035\243\226" - "\172\153\176\233\354\117\231\333\221\312\002\000\330\142\374\011" - "\366\104\067\054\243\320\105\276\150\230\353\037\043\031\115\321" - "\102\103\252\071\350\222\055\161\220\234\050\011\067\023\175\363" - "\354\315\131\141\137\314\245\235\132\253\163\022\132\351\015\011" - "\254\320\127\345\343\376\330\331\260\021\113\272\275\002\035\245" - "\220\262\131\235\071\270\066\065\337\101\371\317\354\344\022\342" - "\115\363\360\054\140\302\020\227\146\170\025\006\037\012\320\330" - "\211\240\223\220\002\220\115\151\357\217\252\302\175\372\236\333" - "\307\031\046\323\336\173\266\345\331\013\250\162\171\127\072\025" - "\010\121\065\262\103\241\364\367\202\014\316\027\020\356\144\373" - "\030\247\104\235\231\346\103\065\054\176\025\353\260\053\274\042" - "\230\274\004\250\376\271\146\146\062\077\201\245\072\342\360\360" - "\326\243\122\206\024\150\036\115\046\342\072\004\302\261\217\161" - "\162\041\124\334\223\150\221\246\366\342\275\323\070\134\250\112" - "\132\163\041\005\274\277\273\022\151\013\062\043\357\370\355\174" - "\075\272\103\056\263\126\211\025\377\232\075\334\002\356\070\217" - "\054\372\335\144\262\031\056\034\161\227\060\252\340\220\346\327" - "\042\265\015\105\340\141\105\100\032\203\035\355\241\053\213\272" - "\066\251\344\166\270\166\356\014\373\007\206\120\277\027\143\051" - "\135\310\073\075\104\026\072\330\144\142\144\012\034\312\332\023" - "\023\034\207\152\264\154\276\127\061\122\143\110\244\233\123\073" - "\275\033\264\052\000\360\324\223\175\317\360\077\312\127\036\154" - "\113\353\267\153\350\206\316\343\303\132\160\032\007\213\206\037" - "\357\371\076\025\060\251\266\041\172\014\365\314\045\227\363\110" - "\204\210\343\064\314\025\035\312\056\232\352\220\320\036\001\216" - "\376\000\261\323\170\030\165\352\064\135\023\153\055\150\205\042" - "\206\127\222\261\025\152\223\026\273\326\367\153\263\360\277\061" - "\367\207\362\036\366\153\273\222\254\273\344\170\000\071\060\214" - "\327\262\216\234\137\316\117\004\057\001\053\340\160\161\161\150" - "\255\350\070\370\045\140\210\270\232\027\334\152\215\110\325\012" - "\013\170\337\141\147\063\115\162\035\173\066\113\044\245\105\230" - "\326\204\206\163\277\166\102\252\347\075\274\054\235\156\317\124" - "\114\207\154\222\166\004\300\076\150\076\330\105\045\300\066\212" - "\346\262\151\022\170\141\044\373\376\374\142\363\213\121\322\154" - "\301\243\313\334\364\275\377\015\200\371\116\304\226\171\200\077" - "\106\233\263\206\062\345\347\254\237\170\312\015\250\221\317\320" - "\137\104\201\357\022\165\152\210\317\360\031\104\135\063\060\277" - "\154\351\005\116\035\230\056\312\217\112\176\343\367\163\033\026" - "\034\242\226\034\364\113\000\347\011\153\211\265\250\160\361\343" - "\313\373\256\017\025\104\366\303\247\204\271\352\200\150\162\011" - "\334\317\207\223\062\106\005\112\173\260\135\077\206\211\324\162" - "\155\257\375\272\343\174\017\115\055\250\202\376\106\215\016\044" - "\204\072\265\255\232\064\112\231\373\101\256\311\066\311\273\015" - "\352\076\125\277\170\350\266\137\376\322\230\340\317\270\252\136" - "\120\141\146\071\307\260\307\341\226\124\206\055\115\123\262\133" - "\307\204\356\364\366\146\102\012\050\131\315\220\012\230\265\273" - "\204\006\271\237\343\341\336\161\243\132\006\364\371\216\104\072" - "\331\050\227\151\324\246\145\124\002\321\166\064\226\037\063\215" - "\335\205\150\335\035\047\205\346\042\037\357\227\056\114\050\366" - "\162\246\010\340\271\170\174\215\365\336\173\041\020\154\122\234" - "\033\112\261\107\346\027\262\352\047\013\216\365\312\163\015\200" - "\016\260\132\101\360\110\136\067\023\351\000\036\313\126\154\305" - "\321\207\101\075\254\034\166\240\204\105\042\223\064\022\012\242" - "\032\353\043\337\162\252\222\151\156\120\075\072\345\176\112\004" - "\225\233\315\161\036\321\002\021\266\027\077\364\174\266\056\065" - "\327\234\200\350\043\300\301\372\130\011\166\337\112\041\260\260" - "\056\317\072\036\337\173\350\221\172\265\342\164\003\323\250\322" - "\050\315\240\171\131\141\023\042\330\315\121\033\303\133\121\360" - "\001\130\156\254\166\241\025\303\366\021\334\260\032\313\114\172" - "\302\073\027\235\301\120\156\146\246\335\033\216\130\253\232\012" - "\253\027\034\170\247\171\144\231\023\142\302\257\172\261\367\072" - "\067\035\215\060\317\172\246\224\115\217\247\160\205\145\274\100" - "\337\240\115\016\254\301\063\023\015\223\067\302\166\346\300\072" - "\031\244\144\317\164\223\366\110\232\152\173\316\235\016\143\072" - "\057\255\033\302\341\223\225\313\360\115\054\060\371\136\366\132" - "\314\141\372\005\160\146\220\342\024\263\014\006\325\130\245\071" - "\007\204\174\103\222\344\151\210\205\360\276\324\213\332\124\135" - "\204\113\232\367\023\273\010\332\370\127\223\117\324\311\156\056" - "\336\136\130\270\120\252\157\200\215\167\074\120\360\076\161\101" - "\155\324\023\161\350\005\260\347\265\260\262\251\112\362\031\360" - "\257\003\141\075\222\135\225\044\167\150\007\143\156\173\072\000" - "\120\254\364\137\327\263\346\175\145\233\241\225\267\132\316\244" - "\374\116\201\206\307\074\324\304\210\246\201\060\275\112\077\261" - "\101\233\155\167\377\135\362\307\035\310\101\125\065\342\306\227" - "\371\337\316\356\075\220\070\145\347\336\207\254\232\144\252\266" - "\322\044\140\347\253\157\011\273\102\104\257\344\122\037\305\214" - "\357\207\307\053\254\243\230\015\322\031\070\075\330\262\065\301" - "\225\333\165\266\374\077\131\066\073\006\301\326\147\314\343\161" - "\071\341\036\325\104\267\001\035\153\040\114\376\174\350\127\175" - "\012\150\301\305\355\346\335\034\373\007\176\320\045\262\001\233" - "\160\063\044\140\050\331\113\365\032\250\365\216\023\372\065\236" - "\244\162\053\002\224\315\255\026\304\277\335\032\375\237\162\101" - "\135\205\101\314\000\071\333\056\223\131\075\237\211\335\357\026" - "\345\363\250\177\330\243\162\012\276\224\121\053\070\364\321\110" - "\333\370\025\230\346\001\044\055\074\256\036\244\234\167\077\106" - "\247\021\142\140\223\144\172\271\052\206\075\322\131\101\137\172" - "\321\161\267\147\072\345\335\056\051\007\014\160\076\133\177\060" - "\003\024\202\232\112\273\100\226\015\101\205\307\130\335\250\075" - "\325\337\100\171\216\111\111\366\325\043\105\012\313\025\045\037" - "\275\364\366\354\137\070\043\375\202\157\333\353\031\113\206\037" - "\114\103\151\226\154\330\166\143\016\201\246\214\144\114\145\001" - "\367\044\304\017\153\052\261\031\110\101\234\154\256\063\051\323" - "\312\337\230\202\355\360\350\157\202\120\365\026\002\325\053\010" - "\216\234\224\310\175\337\126\242\261\237\262\006\277\222\367\236" - "\373\243\347\313\057\035\002\275\006\302\023\304\273\357\034\252" - "\356\046\250\213\115\201\221\220\162\042\320\302\300\126\070\025" - "\040\033\002\013\246\171\107\275\173\175\206\016\105\104\300\004" - "\235\377\322\326\340\351\221\203\003\243\200\020\007\062\061\036" - "\200\001\226\344\207\305\307\260\237\163\003\145\207\241\135\123" - "\112\075\332\220\275\301\152\000\161\374\273\365\252\373\027\012" - "\170\124\357\273\226\112\105\214\323\000\262\115\272\157\026\046" - "\246\216\044\135\162\222\340\164\177\261\235\034\366\273\253\035" - "\153\222\255\210\170\234\360\200\074\032\053\235\306\070\215\157" - "\236\064\353\326\043\316\001\126\276\030\263\101\371\111\027\275" - "\377\262\162\316\301\314\103\322\003\124\052\112\012\135\247\061" - "\222\060\000\345\033\212\105\077\340\204\070\146\214\273\362\105" - "\135\341\002\305\363\300\305\306\273\026\054\127\055\017\225\033" - "\006\274\200\230\110\263\012\350\364\073\167\357\205\102\032\142" - "\146\116\122\306\101\305\236\267\173\037\061\322\245\152\170\147" - "\155\045\320\164\237\156\112\245\065\053\163\165\353\226\234\320" - "\102\171\254\144\374\323\136\377\232\273\023\105\062\046\246\211" - "\116\300\016\025\213\213\253\246\351\134\316\366\320\356\376\362" - "\073\300\364\007\040\311\331\021\327\247\023\242\364\070\125\114" - "\103\272\342\130\167\266\316\016\155\060\357\371\240\003\173\102" - "\321\374\044\006\176\367\156\232\301\207\355\020\261\226\137\320" - "\013\120\110\161\134\364\005\255\026\044\010\345\273\324\371\304" - "\166\025\311\133\014\362\162\060\112\035\311\242\170\021\002\004" - "\262\327\316\327\362\066\354\117\366\376\221\333\135\013\110\114" - "\040\313\025\261\057\071\122\067\364\347\342\044\201\004\072\075" - "\256\366\126\306\217\211\372\226\334\040\172\245\001\346\156\241" - "\360\317\301\334\252\106\225\176\254\037\067\230\175\110\325\077" - "\334\351\163\346\302\106\347\301\160\172\331\120\225\310\031\214" - "\254\214\130\373\225\074\103\355\321\121\364\224\044\075\213\321" - "\123\175\242\044\251\111\341\030\264\332\201\265\064\161\322\257" - "\202\022\260\157\316\314\063\332\231\210\262\216\022\325\252\222" - "\314\215\347\252\043\174\233\040\120\066\106\161\045\036\164\354" - "\123\237\142\143\226\170\360\021\322\074\140\000\270\034\154\212" - "\073\375\327\045\071\110\353\333\175\154\262\233\334\211\003\305" - "\131\365\302\163\374\333\122\020\031\323\167\072\167\032\075\135" - "\256\344\122\043\046\375\053\273\326\076\134\150\021\052\240\153" - "\162\015\211\034\001\050\356\157\212\374\354\121\070\241\256\210" - "\036\306\040\132\015\160\305\047\070\077\373\263\376\203\354\356" - "\352\114\203\114\162\145\252\224\215\342\164\373\205\007\065\240" - "\005\303\314\054\204\274\164\265\167\040\101\064\217\065\075\272" - "\014\375\320\321\176\150\227\140\026\151\061\167\223\145\076\266" - "\266\165\154\216\357\076\343\256\131\252\122\111\376\077\011\212" - "\363\121\053\250\321\030\047\111\216\227\143\377\370\277\322\301" - "\021\006\332\260\240\145\070\222\307\106\336\130\256\336\334\312" - "\311\025\167\025\203\211\366\021\233\045\011\267\057\316\102\001" - "\250\041\232\110\175\045\106\377\336\315\301\126\107\313\234\226" - "\013\252\307\122\010\007\172\365\231\055\123\353\234\030\314\012" - "\007\353\120\210\256\210\331\224\112\234\333\013\337\237\011\241" - "\217\053\351\006\024\204\061\027\300\327\016\200\132\176\225\035" - "\323\216\340\265\140\267\045\136\000\035\065\023\320\244\233\212" - "\304\007\011\144\325\143\344\012\334\051\200\335\106\141\355\356" - "\050\330\033\062\011\206\331\256\000\016\260\000\206\261\350\361" - "\005\326\356\326\125\325\113\124\143\241\347\006\237\341\061\335" - "\152\260\275\246\274\376\215\050\322\134\016\010\075\031\305\316" - "\003\143\013\133\372\045\341\236\211\301\037\304\135\345\155\113" - "\116\103\324\157\344\210\355\365\173\010\360\124\024\340\002\257" - "\240\064\137\271\077\227\306\301\356\144\230\325\231\356\207\137" - "\144\120\321\011\335\167\301\142\333\111\247\345\274\164\142\172" - "\372\127\211\221\244\325\010\077\155\131\253\256\011\170\323\023" - "\263\247\027\326\317\307\332\237\256\177\136\132\022\060\073\023" - "\246\133\225\136\365\142\207\163\366\361\102\344\277\176\145\237" - "\047\266\211\151\001\174\133\237\374\307\104\050\335\173\261\012" - "\220\106\020\075\064\350\105\130\261\014\327\011\176\365\152\222" - "\334\207\233\153\357\203\216\144\052\324\014\365\071\207\222\112" - "\272\126\062\104\265\266\015\312\104\040\300\346\077\010\107\165" - "\147\141\025\052\311\201\306\127\135\103\147\315\313\300\311\127" - "\276\375\066\112\373\333\223\261\225\237\244\076\045\342\341\166" - "\120\076\375\122\123\167\347\173\007\030\053\254\354\116\361\276" - "\331\217\363\003\301\307\045\021\262\303\040\113\034\216\234\164" - "\373\262\000\237\011\116\276\031\307\370\075\145\215\166\173\363" - "\131\221\227\077\022\023\166\357\322\272\332\246\041\075\133\375" - "\011\030\014\366\311\206\356\052\013\325\263\107\112\304\161\274" - "\152\170\123\363\305\270\012\371\040\221\222\370\052\057\252\273" - "\216\116\162\343\356\067\265\013\267\001\100\076\310\236\360\010" - "\053\155\375\137\040\057\200\200\330\006\257\312\276\134\245\237" - "\331\074\375\005\213\374\123\032\333\260\252\023\253\235\303\114" - "\151\203\202\243\070\010\202\204\345\235\104\055\243\077\205\233" - "\041\353\106\320\023\257\017\343\237\251\013\103\347\310\173\254" - "\305\001\241\110\075\107\050\202\053\162\140\360\010\356\210\222" - "\370\005\007\306\221\175\103\232\323\075\330\061\027\344\360\062" - "\121\252\060\364\313\374\263\016\265\157\203\231\270\337\061\266" - "\103\215\062\077\134\155\031\011\011\300\237\152\210\122\014\076" - "\116\037\304\254\152\313\065\357\374\122\003\144\257\070\012\326" - "\005\243\215\116\227\343\022\365\256\107\164\007\066\040\216\240" - "\241\172\044\332\225\271\027\052\221\005\327\341\032\061\052\130" - "\325\375\002\346\056\205\137\131\241\043\250\344\342\256\325\134" - "\135\223\167\343\374\231\007\227\327\026\367\370\235\365\240\352" - "\135\014\131\063\114\147\072\005\000\163\036\241\336\341\312\327" - "\366\122\000\150\366\273\251\140\137\016\126\204\325\223\364\043" - "\133\350\256\214\070\136\046\223\052\220\143\023\271\041\111\123" - "\352\003\245\176\170\153\176\073\174\134\013\344\222\221\331\215" - "\147\041\116\043\112\340\000\374\146\357\116\324\174\155\077\017" - "\341\346\221\012\201\334\213\173\234\117\315\203\032\243\104\314" - "\344\043\012\243\210\224\024\135\057\376\375\006\253\143\256\040" - "\213\265\346\262\251\057\264\115\275\145\366\112\211\234\353\020" - "\135\276\231\224\350\025\063\365\251\152\137\125\366\100\274\150" - "\021\257\074\153\111\322\315\140\305\047\330\123\213\120\324\011" - "\314\163\300\106\005\026\243\154\014\014\307\206\171\337\233\317" - "\044\144\304\030\221\242\012\124\023\140\155\065\160\371\306\126" - "\311\355\002\112\335\132\237\261\312\130\235\170\217\133\365\010" - "\271\202\044\166\240\222\151\061\003\237\256\110\316\270\301\165" - "\143\324\011\064\252\250\323\133\276\337\352\254\167\246\023\321" - "\230\233\330\240\141\051\262\321\073\144\247\242\120\020\273\252" - "\026\123\335\203\252\377\276\271\162\125\056\226\072\152\026\060" - "\077\054\175\137\302\357\223\215\342\161\231\017\304\367\164\177" - "\110\233\134\332\110\135\375\067\174\175\140\245\216\205\104\137" - "\102\247\033\277\127\131\256\135\133\103\204\146\322\342\225\271" - "\250\243\060\212\176\317\176\235\273\110\323\020\073\127\115\356" - "\053\274\347\033\104\377\306\154\315\217\252\326\124\172\201\070" - "\334\017\043\067\121\015\102\274\162\212\325\130\053\111\265\046" - "\037\345\033\102\372\373\154\363\325\142\073\370\254\210\240\152" - "\215\207\332\160\255\024\175\073\076\171\152\057\137\307\306\031" - "\336\313\052\227\352\202\271\313\131\005\073\044\063\377\243\310" - "\040\027\310\234\316\230\252\017\054\225\372\123\127\372\202\127" - "\012\364\341\327\147\233\036\326\306\222\077\125\056\272\301\237" - "\063\130\164\327\134\170\017\005\063\305\210\264\142\020\167\105" - "\132\120\274\362\042\120\350\046\243\175\173\204\171\057\107\341" - "\167\313\142\177\377\024\061\213\312\070\164\046\211\356\300\210" - "\302\253\067\071\115\326\154\257\206\071\337\376\157\343\006\105" - "\333\233\322\070\161\121\062\020\074\253\125\017\326\217\207\340" - "\277\375\076\031\236\364\365\360\260\107\126\270\047\225\070\272" - "\155\303\207\326\331\144\044\240\012\266\301\377\106\336\017\321" - "\166\175\361\002\106\021\262\047\030\062\127\265\260\202\104\161" - "\146\145\332\271\340\172\100\016\336\355\313\375\327\117\142\303" - "\026\240\336\361\112\247\257\163\053\167\367\233\127\225\331\207" - "\350\334\352\154\103\351\224\156\312\316\020\310\144\273\042\367" - "\152\116\124\070\004\275\232\204\343\146\261\032\161\102\314\312" - "\154\002\242\133\162\203\151\257\364\374\365\365\336\325\146\034" - "\361\323\063\160\204\243\220\177\330\115\063\035\323\115\365\072" - "\332\007\034\162\066\161\174\332\171\263\307\015\174\201\043\233" - "\254\330\147\374\142\067\243\042\346\327\347\052\351\051\347\265" - "\355\330\242\140\335\113\225\036\211\324\027\352\322\321\034\357" - "\112\352\033\000\077\221\317\121\203\115\050\327\250\033\242\107" - "\170\134\252\114\113\334\171\313\030\117\367\061\171\302\230\056" - "\360\050\257\324\376\321\014\316\367\270\345\030\235\104\227\136" - "\132\116\215\247\303\362\121\337\241\235\021\220\232\070\267\114" - "\260\311\310\100\116\176\022\007\365\317\024\127\366\307\076\203" - "\337\204\053\166\123\070\316\343\174\252\372\235\241\265\034\273" - "\355\343\346\247\036\234\006\017\332\216\015\253\100\160\145\021" - "\112\111\337\203\303\042\303\162\346\105\204\000\051\020\003\343" - "\067\302\021\153\013\105\114\023\310\310\162\240\344\044\155\060" - "\037\122\354\012\022\313\300\040\047\234\054\042\320\131\064\123" - "\054\274\315\143\124\146\166\034\056\351\275\023\016\052\103\055" - "\175\057\070\220\373\370\260\042\225\334\105\146\066\171\272\142" - "\066\207\305\212\355\074\247\034\046\144\057\064\217\163\141\014" - "\243\232\234\236\223\115\301\050\052\007\217\140\200\111\303\267" - "\321\211\101\277\305\351\333\353\115\013\040\335\176\202\352\041" - "\034\207\300\257\324\201\327\377\211\147\137\011\260\043\300\201" - "\254\002\101\162\354\034\135\072\050\176\027\246\000\001\310\034" - "\210\210\313\135\012\243\134\223\012\274\235\273\337\136\075\213" - "\141\176\375\115\233\133\207\303\331\236\152\331\240\062\366\050" - "\273\301\205\305\145\341\131\160\235\366\053\175\125\150\010\266" - "\347\006\003\202\141\213\106\073\052\260\024\312\342\012\362\235" - "\314\170\143\061\131\275\241\367\264\315\164\011\066\175\277\035" - "\203\303\237\344\117\345\037\171\226\064\103\170\077\065\026\013" - "\256\172\075\007\067\337\377\353\254\163\364\342\360\264\000\164" - "\170\237\130\307\205\170\100\033\255\204\224\354\272\253\370\150" - "\045\066\160\135\025\157\110\302\343\075\245\324\362\245\110\153" - "\105\240\063\313\031\164\347\306\370\173\263\262\047\253\033\114" - "\341\213\251\367\372\362\272\336\060\140\262\043\006\372\216\114" - "\233\301\027\264\065\376\173\056\172\056\340\241\332\374\356\273" - "\207\230\263\202\213\156\140\274\316\023\337\325\015\156\041\251" - "\060\070\136\145\067\331\224\262\010\165\124\342\161\103\235\370" - "\333\121\173\147\300\334\043\216\357\002\143\374\161\204\246\241" - "\275\004\007\365\335\233\247\346\020\374\310\201\077\146\172\032" - "\267\365\201\167\321\245\006\300\250\152\275\031\357\143\272\255" - "\150\301\242\106\134\112\054\155\106\364\356\205\132\151\237\022" - "\137\041\212\060\306\220\361\157\373\257\210\353\023\102\230\173" - "\004\072\302\141\205\356\316\313\342\275\120\074\046\360\117\205" - "\022\331\266\331\152\250\110\145\130\320\120\154\023\350\350\027" - "\043\252\171\250\230\107\164\172\005\304\267\054\265\007\261\307" - "\340\150\241\112\021\351\260\152\272\000\326\315\351\276\345\015" - "\150\137\266\001\247\052\174\254\357\064\330\244\073\212\154\033" - "\363\015\146\004\366\026\156\261\027\105\176\000\003\144\016\154" - "\304\304\155\153\356\351\027\335\035\357\202\130\171\356\164\154" - "\373\332\161\362\360\340\243\010\045\042\010\050\206\027\225\112" - "\333\002\265\312\353\315\247\010\274\051\141\066\027\325\243\023" - "\257\025\005\240\365\250\250\032\312\261\103\121\310\330\234\244" - "\333\122\156\306\037\026\317\334\077\060\023\127\006\266\153\266" - "\313\160\126\300\031\377\333\343\260\037\065\171\370\321\035\323" - "\043\213\232\103\241\152\037\341\233\062\071\241\351\244\127\265" - "\025\256\166\056\255\121\021\136\161\107\327\151\030\365\075\074" - "\200\330\200\042\102\240\004\335\323\075\177\274\342\326\161\367" - "\204\347\045\062\071\067\220\253\177\147\024\227\134\122\324\335" - "\052\125\000\154\365\004\112\310\102\311\205\045\240\367\034\045" - "\337\102\127\031\172\347\304\371\117\331\221\253\053\146\211\126" - "\273\211\302\260\216\015\171\321\327\377\366\167\366\023\234\325" - "\126\363\357\321\333\263\313\052\214\134\326\270\303\137\016\176" - "\351\321\057\170\336\251\111\265\250\077\055\236\123\312\164\251" - "\276\143\173\231\027\106\303\243\243\231\133\146\371\152\345\342" - "\073\025\133\031\276\244\317\147\344\375\006\067\307\173\341\205" - "\337\134\037\366\242\343\232\106\174\366\254\166\140\222\131\233" - "\250\264\265\147\130\205\316\075\202\324\165\112\120\126\320\057" - "\263\357\045\126\322\300\234\117\266\111\305\026\334\037\262\204" - "\323\147\353\053\354\271\151\157\216\336\272\336\065\212\015\350" - "\172\063\077\114\363\333\234\252\045\142\300\001\201\162\205\124" - "\332\160\200\307\052\351\066\270\310\360\227\375\173\245\345\365" - "\330\044\102\314\000\336\166\045\101\067\046\302\252\253\027\204" - "\034\227\113\106\201\202\376\111\163\226\107\356\073\054\343\024" - "\121\045\340\122\004\127\167\105\217\236\010\071\112\037\276\146" - "\267\012\255\071\214\254\203\377\102\312\356\175\366\321\221\110" - "\367\162\232\374\312\022\102\131\261\112\222\373\152\120\142\042" - "\132\020\133\347\274\336\347\376\250\325\174\237\247\016\350\237" - "\201\202\233\113\225\336\244\106\050\067\101\223\210\244\265\342" - "\264\021\312\161\357\261\157\230\206\354\067\055\373\037\315\174" - "\242\150\310\067\106\155\175\157\244\277\003\054\144\270\017\031" - "\311\332\212\271\213\372\121\022\346\211\100\342\251\015\137\113" - "\165\047\203\274\225\001\054\071\300\057\146\045\347\166\076\261" - "\120\310\153\334\302\274\356\251\106\056\214\357\073\353\072\261" - "\023\275\155\250\276\231\342\177\310\111\245\260\277\343\142\020" - "\254\315\354\157\212\332\031\320\010\245\277\104\221\372\365\244" - "\270\142\114\167\374\056\366\305\170\234\166\067\200\330\110\054" - "\245\065\234\060\020\266\000\031\133\300\135\354\272\122\221\163" - "\265\335\352\261\014\341\167\204\175\355\274\375\305\005\052\153" - "\072\307\233\112\175\234\144\331\135\301\306\030\023\127\213\311" - "\065\165\173\101\126\362\306\324\337\203\321\244\210\374\020\303" - "\303\254\016\100\110\162\031\245\064\337\276\110\067\111\021\154" - "\277\214\256\026\176\165\352\135\370\274\002\201\271\022\105\174" - "\276\123\275\007\306\327\255\372\267\153\102\356\264\123\132\164" - "\340\011\212\136\176\165\273\166\061\276\370\353\320\075\147\217" - "\221\045\226\130\374\103\122\264\257\225\242\144\351\375\330\311" - "\007\143\047\205\330\343\374\012\242\364\365\162\062\135\001\304" - "\202\230\034\177\334\157\063\213\004\326\357\356\324\307\267\333" - "\052\337\141\002\303\135\015\145\122\002\330\204\137\332\110\342" - "\162\145\142\116\324\226\331\331\155\311\307\102\220\177\035\272" - "\137\176\275\042\334\312\210\056\315\141\263\055\073\373\020\256" - "\141\162\375\065\011\327\017\166\240\326\270\061\125\326\354\264" - "\125\251\327\061\164\140\140\102\301\023\157\375\017\200\253\160" - "\362\251\246\373\201\265\162\042\213\052\123\341\000\077\226\126" - "\351\156\207\136\316\347\240\220\373\020\215\012\220\071\172\203" - "\342\040\176\144\325\361\206\141\033\331\103\034\031\332\163\002" - "\110\372\140\027\342\001\247\336\021\065\350\241\156\142\044\121" - "\203\243\265\131\224\073\273\260\025\376\315\056\331\100\061\042" - "\073\221\071\036\222\341\374\244\026\344\105\205\107\152\326\313" - "\016\214\045\242\310\340\123\335\337\040\014\270\141\075\332\234" - "\317\024\272\141\366\267\006\015\234\114\222\344\266\151\257\304" - "\365\324\147\275\265\272\233\224\332\247\115\074\344\047\330\264" - "\074\223\026\063\112\034\100\347\150\323\313\036\075\172\343\063" - "\117\112\361\004\004\214\231\337\064\346\033\031\015\364\315\112" - "\207\343\176\322\377\276\271\147\222\204\206\317\377\151\003\116" - "\264\364\123\270\201\354\230\265\322\264\316\340\250\234\053\060" - "\177\251\002\177\150\274\347\372\101\155\312\100\327\316\217\213" - "\302\343\104\103\317\335\371\242\221\310\203\072\144\256\152\344" - "\130\155\143\300\052\113\273\153\270\206\253\220\124\073\033\027" - "\036\140\132\355\075\124\220\316\034\023\011\200\302\164\145\032" - "\341\310\333\013\024\226\167\315\035\042\135\162\135\171\211\173" - "\331\344\151\027\070\371\346\124\015\357\325\317\143\072\352\105" - "\003\305\121\027\134\310\344\172\352\102\354\110\274\165\304\225" - "\132\055\255\222\047\223\347\064\202\275\004\346\367\356\053\373" - "\264\174\023\021\104\370\213\057\072\167\167\366\355\074\214\107" - "\152\071\332\221\315\301\306\117\176\313\066\166\272\141\161\157" - "\336\204\200\042\175\013\122\267\203\312\256\160\006\073\267\160" - "\164\221\002\102\123\311\222\322\224\310\110\116\052\272\275\010" - "\077\076\053\274\111\175\164\314\107\042\075\115\135\364\276\322" - "\206\300\024\332\211\246\254\036\157\365\155\231\257\053\241\356" - "\151\314\253\262\111\037\177\221\102\274\337\237\261\235\162\070" - "\136\207\022\350\056\277\007\235\264\164\066\143\237\327\122\010" - "\244\375\273\356\034\073\177\137\370\136\377\251\374\161\342\133" - "\371\364\103\047\263\112\304\147\277\373\313\136\323\035\147\167" - "\033\043\145\067\136\344\227\127\103\226\000\100\007\342\233\000" - "\327\337\050\213\051\355\362\351\350\275\107\273\333\257\062\366" - "\322\230\056\061\174\305\210\300\133\211\000\143\154\233\144\103" - "\173\214\316\244\171\301\215\141\177\325\035\132\204\117\121\127" - "\347\177\211\144\105\021\045\240\233\045\004\007\301\150\113\074" - "\364\032\341\156\334\157\320\133\105\355\266\312\074\010\042\044" - "\210\253\210\315\274\256\156\130\323\162\140\225\333\254\322\317" - "\306\264\076\243\044\016\377\151\373\265\064\070\276\126\135\106" - "\001\346\023\276\224\202\026\150\364\166\376\317\042\320\237\351" - "\205\336\214\251\354\214\023\350\101\107\041\000\235\176\106\236" - "\144\132\135\371\334\163\141\321\352\137\241\015\060\101\367\265" - "\037\204\136\014\020\162\365\122\271\027\122\126\226\230\365\373" - "\363\122\364\317\306\125\241\261\265\102\276\345\204\266\232\243" - "\072\371\260\112\153\245\235\045\275\357\173\123\210\161\116\173" - "\304\102\113\212\230\355\073\115\057\372\063\264\260\316\127\353" - "\307\010\066\063\256\323\130\153\302\324\276\113\105\015\307\011" - "\120\022\224\350\377\320\066\057\312\151\343\173\067\073\146\377" - "\103\234\063\362\157\214\135\062\140\034\175\246\051\105\260\171" - "\127\104\142\127\024\230\207\337\002\153\133\072\247\302\072\353" - "\137\155\335\317\372\072\001\132\127\177\001\200\304\261\372\034" - "\366\135\164\012\365\373\352\370\147\106\062\016\010\155\371\147" - "\333\326\066\325\021\070\060\150\267\061\351\174\342\344\230\330" - "\101\015\343\067\010\316\057\160\024\142\176\034\317\170\204\252" - "\116\272\200\140\362\260\311\252\341\263\047\303\230\300\234\331" - "\315\177\021\326\116\100\106\142\243\305\177\163\075\003\036\214" - "\276\236\354\261\116\266\134\057\151\203\363\001\103\220\333\020" - "\020\354\346\136\055\054\300\320\361\100\103\057\103\142\273\002" - "\000\247\263\117\136\017\176\307\223\162\311\326\002\244\346\022" - "\221\315\161\276\372\062\217\354\162\323\033\266\065\326\270\065" - "\176\154\204\334\174\003\244\017\166\156\345\171" -#define xecc_z 15 -#define xecc ((&data[24940])) - "\244\231\375\017\040\231\027\047\330\203\326\015\324\154\241\301" - "\310\001\142\223" -#define lsto_z 1 -#define lsto ((&data[24957])) - "\017" -#define pswd_z 256 -#define pswd ((&data[25008])) - "\130\372\161\021\060\360\175\265\314\372\271\161\011\057\337\356" - "\251\362\273\065\226\124\063\371\350\142\353\150\004\260\003\135" - "\253\165\156\334\145\354\221\062\346\113\243\357\172\203\336\044" - "\165\232\030\172\101\072\272\031\274\007\206\373\322\156\264\312" - "\056\223\220\355\137\343\103\024\000\233\175\374\161\054\001\264" - "\043\032\056\144\124\351\175\021\361\004\014\303\162\300\216\241" - "\124\036\216\264\001\321\310\001\155\106\376\336\163\000\223\226" - "\032\302\372\157\254\170\201\235\174\215\141\357\116\360\220\243" - "\016\037\127\020\361\040\022\136\146\020\075\332\020\320\160\053" - "\223\152\233\077\342\034\335\137\251\076\116\370\056\337\233\075" - "\377\362\116\360\023\141\117\172\162\214\124\203\135\304\256\361" - "\056\111\060\021\146\015\161\017\114\300\010\172\237\243\270\237" - "\226\007\220\251\150\337\043\332\154\170\135\311\074\014\272\153" - "\126\353\175\274\371\356\314\105\256\324\300\116\170\171\355\016" - "\200\176\270\350\135\334\303\311\124\040\223\221\055\116\374\203" - "\072\172\100\063\150\014\171\027\341\071\146\131\262\124\150\063" - "\322\041\034\057\376\337\371\122\000\215\344\055\333\341\261\025" - "\133\362\111\303\377\302\333\340\374\101\072\257\226\243\342\150" - "\304\376\230\302\335\222\025\336\037\371\014\373\332\275\021\066" - "\257\132\131\014\356\214\005\327\357\360\100\364\241\104\121\115" - "\271\300\051\037\254\273\122\223\006\366\202\201\171\141\245\357" - "\373\376\373\352\213\000\302\172\361"/* End of data[] */; -#define hide_z 4096 -#define SETUID 0 /* Define as 1 to call setuid(0) at start of script */ -#define DEBUGEXEC 0 /* Define as 1 to debug execvp calls */ -#define TRACEABLE 1 /* Define as 1 to enable ptrace the executable */ -#define HARDENING 0 /* Define as 1 to disable ptrace/dump the executable */ -#define BUSYBOXON 0 /* Define as 1 to enable work with busybox */ -#define MMAP2 0 /* Define as 1 to use syscall mmap2 */ - -#if HARDENING -static const char * shc_x[] = { -"/*", -" * Copyright 2019 - Intika ", -" * Replace ******** with secret read from fd 21", -" * Also change arguments location of sub commands (sh script commands)", -" * gcc -Wall -fpic -shared -o shc_secret.so shc_secret.c -ldl", -" */", -"", -"#define _GNU_SOURCE /* needed to get RTLD_NEXT defined in dlfcn.h */", -"#define PLACEHOLDER \"********\"", -"#include ", -"#include ", -"#include ", -"#include ", -"#include ", -"#include ", -"", -"static char secret[128000]; //max size", -"typedef int (*pfi)(int, char **, char **);", -"static pfi real_main;", -"", -"// copy argv to new location", -"char **copyargs(int argc, char** argv){", -" char **newargv = malloc((argc+1)*sizeof(*argv));", -" char *from,*to;", -" int i,len;", -"", -" for(i = 0; i 0) {", -" int i;", -"", -" if (secret[n - 1] == '\\n') secret[--n] = '\\0';", -" for (i = 1; i < argc; i++)", -" if (strcmp(argv[i], PLACEHOLDER) == 0)", -" argv[i] = secret;", -" }", -"", -" real_main = main;", -"", -" return real___libc_start_main(mymain, argc, argv, init, fini, rtld_fini, stack_end);", -"}", -"", -0}; -#endif /* HARDENING */ - -/* rtc.c */ - -#include -#include - -#include -#include -#include -#include -#include -#include - -/* 'Alleged RC4' */ - -static unsigned char stte[256], indx, jndx, kndx; - -/* - * Reset arc4 stte. - */ -void stte_0(void) -{ - indx = jndx = kndx = 0; - do { - stte[indx] = indx; - } while (++indx); -} - -/* - * Set key. Can be used more than once. - */ -void key(void * str, int len) -{ - unsigned char tmp, * ptr = (unsigned char *)str; - while (len > 0) { - do { - tmp = stte[indx]; - kndx += tmp; - kndx += ptr[(int)indx % len]; - stte[indx] = stte[kndx]; - stte[kndx] = tmp; - } while (++indx); - ptr += 256; - len -= 256; - } -} - -/* - * Crypt data. - */ -void arc4(void * str, int len) -{ - unsigned char tmp, * ptr = (unsigned char *)str; - while (len > 0) { - indx++; - tmp = stte[indx]; - jndx += tmp; - stte[indx] = stte[jndx]; - stte[jndx] = tmp; - tmp += stte[indx]; - *ptr ^= stte[tmp]; - ptr++; - len--; - } -} - -/* End of ARC4 */ - -#if HARDENING - -#include -#include -#include -#include -#define PR_SET_PTRACER 0x59616d61 - -/* Seccomp Sandboxing Init */ -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include - -#define ArchField offsetof(struct seccomp_data, arch) - -#define Allow(syscall) \ - BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, SYS_##syscall, 0, 1), \ - BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_ALLOW) - -struct sock_filter filter[] = { - /* validate arch */ - BPF_STMT(BPF_LD+BPF_W+BPF_ABS, ArchField), - BPF_JUMP( BPF_JMP+BPF_JEQ+BPF_K, AUDIT_ARCH_X86_64, 1, 0), - BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_KILL), - - /* load syscall */ - BPF_STMT(BPF_LD+BPF_W+BPF_ABS, offsetof(struct seccomp_data, nr)), - - /* list of allowed syscalls */ - Allow(exit_group), /* exits a process */ - Allow(brk), /* for malloc(), inside libc */ -#if MMAP2 - Allow(mmap2), /* also for malloc() */ -#else - Allow(mmap), /* also for malloc() */ -#endif - Allow(munmap), /* for free(), inside libc */ - - /* and if we don't match above, die */ - BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_KILL), -}; -struct sock_fprog filterprog = { - .len = sizeof(filter)/sizeof(filter[0]), - .filter = filter -}; - -/* Seccomp Sandboxing - Set up the restricted environment */ -void seccomp_hardening() { - if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) { - perror("Could not start seccomp:"); - exit(1); - } - if (prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &filterprog) == -1) { - perror("Could not start seccomp:"); - exit(1); - } -} -/* End Seccomp Sandboxing Init */ - -void shc_x_file() { - FILE *fp; - int line = 0; - - if ((fp = fopen("/tmp/shc_x.c", "w")) == NULL ) {exit(1); exit(1);} - for (line = 0; shc_x[line]; line++) fprintf(fp, "%s\n", shc_x[line]); - fflush(fp);fclose(fp); -} - -int make() { - char * cc, * cflags, * ldflags; - char cmd[4096]; - - cc = getenv("CC"); - if (!cc) cc = "cc"; - - sprintf(cmd, "%s %s -o %s %s", cc, "-Wall -fpic -shared", "/tmp/shc_x.so", "/tmp/shc_x.c -ldl"); - if (system(cmd)) {remove("/tmp/shc_x.c"); return -1;} - remove("/tmp/shc_x.c"); return 0; -} - -void arc4_hardrun(void * str, int len) { - //Decode locally - char tmp2[len]; - char tmp3[len+1024]; - memcpy(tmp2, str, len); - - unsigned char tmp, * ptr = (unsigned char *)tmp2; - int lentmp = len; - int pid, status; - pid = fork(); - - shc_x_file(); - if (make()) {exit(1);} - - setenv("LD_PRELOAD","/tmp/shc_x.so",1); - - if(pid==0) { - - //Start tracing to protect from dump & trace - if (ptrace(PTRACE_TRACEME, 0, 0, 0) < 0) { - kill(getpid(), SIGKILL); - _exit(1); - } - - //Decode Bash - while (len > 0) { - indx++; - tmp = stte[indx]; - jndx += tmp; - stte[indx] = stte[jndx]; - stte[jndx] = tmp; - tmp += stte[indx]; - *ptr ^= stte[tmp]; - ptr++; - len--; - } - - //Do the magic - sprintf(tmp3, "%s %s", "'********' 21<<<", tmp2); - - //Exec bash script //fork execl with 'sh -c' - system(tmp2); - - //Empty script variable - memcpy(tmp2, str, lentmp); - - //Clean temp - remove("/tmp/shc_x.so"); - - //Sinal to detach ptrace - ptrace(PTRACE_DETACH, 0, 0, 0); - exit(0); - } - else {wait(&status);} - - /* Seccomp Sandboxing - Start */ - seccomp_hardening(); - - exit(0); -} -#endif /* HARDENING */ - -/* - * Key with file invariants. - */ -int key_with_file(char * file) -{ - struct stat statf[1]; - struct stat control[1]; - - if (stat(file, statf) < 0) - return -1; - - /* Turn on stable fields */ - memset(control, 0, sizeof(control)); - control->st_ino = statf->st_ino; - control->st_dev = statf->st_dev; - control->st_rdev = statf->st_rdev; - control->st_uid = statf->st_uid; - control->st_gid = statf->st_gid; - control->st_size = statf->st_size; - control->st_mtime = statf->st_mtime; - control->st_ctime = statf->st_ctime; - key(control, sizeof(control)); - return 0; -} - -#if DEBUGEXEC -void debugexec(char * sh11, int argc, char ** argv) -{ - int i; - fprintf(stderr, "shll=%s\n", sh11 ? sh11 : ""); - fprintf(stderr, "argc=%d\n", argc); - if (!argv) { - fprintf(stderr, "argv=\n"); - } else { - for (i = 0; i <= argc ; i++) - fprintf(stderr, "argv[%d]=%.60s\n", i, argv[i] ? argv[i] : ""); - } -} -#endif /* DEBUGEXEC */ - -void rmarg(char ** argv, char * arg) -{ - for (; argv && *argv && *argv != arg; argv++); - for (; argv && *argv; argv++) - *argv = argv[1]; -} - -void chkenv_end(void); - -int chkenv(int argc) -{ - char buff[512]; - unsigned long mask, m; - int l, a, c; - char * string; - extern char ** environ; - - mask = (unsigned long)getpid(); - stte_0(); - key(&chkenv, (void*)&chkenv_end - (void*)&chkenv); - key(&data, sizeof(data)); - key(&mask, sizeof(mask)); - arc4(&mask, sizeof(mask)); - sprintf(buff, "x%lx", mask); - string = getenv(buff); -#if DEBUGEXEC - fprintf(stderr, "getenv(%s)=%s\n", buff, string ? string : ""); -#endif - l = strlen(buff); - if (!string) { - /* 1st */ - sprintf(&buff[l], "=%lu %d", mask, argc); - putenv(strdup(buff)); - return 0; - } - c = sscanf(string, "%lu %d%c", &m, &a, buff); - if (c == 2 && m == mask) { - /* 3rd */ - rmarg(environ, &string[-l - 1]); - return 1 + (argc - a); - } - return -1; -} - -void chkenv_end(void){} - -#if HARDENING - -static void gets_process_name(const pid_t pid, char * name) { - char procfile[BUFSIZ]; - sprintf(procfile, "/proc/%d/cmdline", pid); - FILE* f = fopen(procfile, "r"); - if (f) { - size_t size; - size = fread(name, sizeof (char), sizeof (procfile), f); - if (size > 0) { - if ('\n' == name[size - 1]) - name[size - 1] = '\0'; - } - fclose(f); - } -} - -void hardening() { - prctl(PR_SET_DUMPABLE, 0); - prctl(PR_SET_PTRACER, -1); - - int pid = getppid(); - char name[256] = {0}; - gets_process_name(pid, name); - - if ( (strcmp(name, "bash") != 0) - && (strcmp(name, "/bin/bash") != 0) - && (strcmp(name, "sh") != 0) - && (strcmp(name, "/bin/sh") != 0) - && (strcmp(name, "sudo") != 0) - && (strcmp(name, "/bin/sudo") != 0) - && (strcmp(name, "/usr/bin/sudo") != 0) - && (strcmp(name, "gksudo") != 0) - && (strcmp(name, "/bin/gksudo") != 0) - && (strcmp(name, "/usr/bin/gksudo") != 0) - && (strcmp(name, "kdesu") != 0) - && (strcmp(name, "/bin/kdesu") != 0) - && (strcmp(name, "/usr/bin/kdesu") != 0) - ) - { - printf("Operation not permitted\n"); - kill(getpid(), SIGKILL); - exit(1); - } -} - -#endif /* HARDENING */ - -#if !TRACEABLE - -#define _LINUX_SOURCE_COMPAT -#include -#include -#include -#include -#include -#include -#include - -#if !defined(PT_ATTACHEXC) /* New replacement for PT_ATTACH */ - #if !defined(PTRACE_ATTACH) && defined(PT_ATTACH) - #define PT_ATTACHEXC PT_ATTACH - #elif defined(PTRACE_ATTACH) - #define PT_ATTACHEXC PTRACE_ATTACH - #endif -#endif - -void untraceable(char * argv0) -{ - char proc[80]; - int pid, mine; - - switch(pid = fork()) { - case 0: - pid = getppid(); - /* For problematic SunOS ptrace */ -#if defined(__FreeBSD__) - sprintf(proc, "/proc/%d/mem", (int)pid); -#else - sprintf(proc, "/proc/%d/as", (int)pid); -#endif - close(0); - mine = !open(proc, O_RDWR|O_EXCL); - if (!mine && errno != EBUSY) - mine = !ptrace(PT_ATTACHEXC, pid, 0, 0); - if (mine) { - kill(pid, SIGCONT); - } else { - perror(argv0); - kill(pid, SIGKILL); - } - _exit(mine); - case -1: - break; - default: - if (pid == waitpid(pid, 0, 0)) - return; - } - perror(argv0); - _exit(1); -} -#endif /* !TRACEABLE */ - -char * xsh(int argc, char ** argv) -{ - char * scrpt; - int ret, i, j; - char ** varg; - char * me = argv[0]; - if (me == NULL) { me = getenv("_"); } - if (me == 0) { fprintf(stderr, "E: neither argv[0] nor $_ works."); exit(1); } - - ret = chkenv(argc); - stte_0(); - key(pswd, pswd_z); - arc4(msg1, msg1_z); - arc4(date, date_z); - if (date[0] && (atoll(date) 1) ? ret : 0; /* Args numbering correction */ - while (i < argc) - varg[j++] = argv[i++]; /* Main run-time arguments */ - varg[j] = 0; /* NULL terminated array */ -#if DEBUGEXEC - debugexec(shll, j, varg); -#endif - execvp(shll, varg); - return shll; -} - -int main(int argc, char ** argv) -{ -#if SETUID - setuid(0); -#endif -#if DEBUGEXEC - debugexec("main", argc, argv); -#endif -#if HARDENING - hardening(); -#endif -#if !TRACEABLE - untraceable(argv[0]); -#endif - argv[1] = xsh(argc, argv); - fprintf(stderr, "%s%s%s: %s\n", argv[0], - errno ? ": " : "", - errno ? strerror(errno) : "", - argv[1] ? argv[1] : "" - ); - return 1; -} diff --git a/assets/binaries/helium_launcher_update.sh.x.c b/assets/binaries/helium_launcher_update.sh.x.c deleted file mode 100644 index aeb1cda..0000000 --- a/assets/binaries/helium_launcher_update.sh.x.c +++ /dev/null @@ -1,1262 +0,0 @@ -#if 0 - shc Version 4.0.3, Generic Shell Script Compiler - GNU GPL Version 3 Md Jahidul Hamid - - shc -f helium_launcher_update.sh -o launcher-update-helium -#endif - -static char data [] = -#define msg1_z 65 -#define msg1 ((&data[14])) - "\064\274\304\307\336\131\120\171\232\041\334\374\271\243\205\357" - "\044\024\001\223\040\150\032\227\025\362\072\044\103\070\147\047" - "\310\271\116\064\064\073\342\042\111\070\044\066\036\175\102\060" - "\333\030\033\210\344\152\026\346\132\351\112\131\206\125\263\226" - "\371\345\042\050\017\200\372\326\167\242\306\145\353\101\077\143" - "\121\361\224\116\023\247\030\232\267\004\053\014\236\105" -#define tst2_z 19 -#define tst2 ((&data[96])) - "\244\110\341\151\351\355\157\174\110\025\155\366\036\105\250\222" - "\315\336\156\226\145\101\202" -#define msg2_z 19 -#define msg2 ((&data[119])) - "\074\263\225\363\120\334\216\007\241\370\113\347\311\064\216\156" - "\051\031\107\326\256\330\071\155\173" -#define rlax_z 1 -#define rlax ((&data[142])) - "\270" -#define date_z 1 -#define date ((&data[143])) - "\262" -#define text_z 8598 -#define text ((&data[461])) - "\220\051\106\235\310\214\205\114\005\051\224\107\253\066\331\247" - "\162\214\177\254\372\373\111\271\150\172\306\351\124\354\005\344" - "\026\114\202\336\330\007\053\335\060\277\045\334\366\376\204\151" - "\213\004\025\205\377\136\076\150\331\004\122\055\361\130\022\007" - "\244\224\346\174\234\021\132\315\320\200\251\306\176\055\060\011" - "\062\105\216\062\243\314\232\174\321\355\252\302\106\274\311\352" - "\121\257\147\355\300\302\272\221\102\143\130\300\221\210\312\304" - "\315\130\366\161\045\221\355\366\176\227\271\305\124\202\260\245" - "\062\027\222\363\332\114\204\035\260\335\336\102\146\250\006\063" - "\001\374\244\046\216\222\035\015\052\326\322\176\131\202\044\214" - "\232\266\177\164\003\004\222\264\342\160\366\110\031\375\173\032" - "\372\040\101\210\263\136\225\335\065\147\134\217\352\200\033\204" - "\067\232\370\072\237\213\357\201\373\345\311\024\343\105\056\336" - "\145\160\146\031\316\374\366\004\143\123\223\116\324\256\322\013" - "\111\313\106\351\126\065\153\121\033\064\146\377\172\225\335\340" - "\005\103\371\324\100\360\330\244\103\153\362\030\032\304\043\144" - "\217\152\116\345\240\271\067\273\355\235\272\150\062\230\110\067" - "\333\101\013\034\061\344\300\165\120\262\215\153\166\261\320\005" - "\033\036\353\273\327\042\167\305\300\062\055\363\312\165\052\246" - "\267\066\302\351\033\202\136\153\064\354\327\253\235\317\317\303" - "\366\155\246\312\343\155\347\100\375\320\066\176\233\112\201\066" - "\135\144\347\163\000\216\324\213\012\105\366\215\266\062\175\322" - "\163\175\010\341\034\006\333\324\125\164\221\222\073\123\036\034" - "\117\171\240\025\142\052\231\303\030\251\171\226\367\043\103\270" - "\060\220\366\104\256\044\261\106\176\216\271\113\050\265\370\124" - "\242\250\060\255\302\124\075\131\306\053\077\302\120\176\115\343" - "\264\225\176\076\224\250\241\074\044\237\004\052\033\271\237\275" - "\305\107\216\110\163\302\021\045\004\036\013\055\317\171\346\366" - "\360\206\060\372\045\145\052\346\241\324\107\247\137\153\147\312" - "\136\227\003\071\120\003\252\035\120\132\207\365\237\343\311\052" - "\234\170\340\060\365\265\015\302\226\254\001\362\274\121\240\177" - "\127\354\277\350\222\273\262\131\151\344\242\003\142\021\060\256" - "\151\075\232\361\020\302\004\242\044\024\076\374\311\132\041\357" - "\207\217\132\171\300\272\006\364\301\072\320\275\072\117\235\050" - "\305\022\255\070\353\350\373\165\331\353\112\106\047\220\104\376" - "\206\175\160\036\321\362\261\325\272\367\037\235\041\153\127\321" - "\052\075\234\025\265\332\021\321\210\030\021\063\266\252\270\362" - "\270\042\060\250\154\011\237\337\033\303\241\211\347\136\112\266" - "\044\346\063\170\304\233\164\163\132\321\014\104\073\020\247\354" - "\353\277\275\146\216\271\021\254\373\355\157\366\235\015\250\333" - "\372\230\352\117\325\250\250\077\065\333\224\177\274\271\154\243" - "\101\122\223\011\374\115\375\064\034\130\320\331\145\105\247\313" - "\152\161\005\242\110\122\346\041\351\076\165\066\256\123\122\207" - "\202\034\321\074\057\165\222\172\013\201\123\112\221\061\221\022" - "\067\125\227\341\314\112\304\230\164\055\321\077\311\246\152\037" - "\105\043\272\073\126\031\246\063\033\032\364\027\362\063\316\334" - "\312\010\231\054\353\004\240\222\322\357\017\357\167\222\153\123" - "\177\160\345\200\214\250\370\104\155\060\174\336\327\156\030\105" - "\234\377\263\056\225\223\045\015\260\156\170\362\360\374\012\303" - "\155\173\237\266\123\305\062\142\220\322\013\005\311\354\170\065" - "\251\236\321\264\230\113\201\300\300\175\206\104\066\020\177\143" - "\164\267\355\332\275\076\077\315\116\160\031\351\054\041\254\111" - "\245\007\127\042\127\045\105\216\136\310\307\106\164\304\334\172" - "\307\161\043\147\015\274\246\175\325\122\200\312\037\053\362\026" - "\154\234\106\246\173\150\246\173\020\154\362\342\151\057\331\277" - "\307\122\332\033\165\060\332\216\102\371\266\143\270\076\123\227" - "\231\165\263\201\040\075\134\215\072\355\156\143\203\133\041\006" - "\364\206\176\141\136\150\130\344\372\227\056\045\311\277\107\222" - "\127\045\215\057\205\156\170\345\243\066\260\373\133\314\257\326" - "\313\216\234\100\044\244\276\257\341\137\224\315\342\065\255\202" - "\220\317\162\143\306\210\122\040\264\234\145\017\311\001\142\174" - "\237\323\371\020\324\235\045\265\321\322\021\343\136\067\376\347" - "\262\020\046\176\121\364\316\217\256\231\262\171\116\037\024\074" - "\041\327\045\000\361\010\376\160\301\143\340\061\336\005\060\377" - "\351\061\041\146\334\066\216\157\175\147\213\230\116\335\343\332" - "\304\327\352\005\127\001\011\003\370\074\175\066\114\376\320\055" - "\165\357\352\363\170\234\036\367\274\300\056\105\064\265\252\306" - "\122\321\033\253\373\240\312\117\155\345\266\273\302\256\176\125" - "\175\032\057\263\105\117\254\353\314\277\002\260\132\020\166\003" - "\252\024\352\006\121\006\263\163\325\270\354\256\202\312\177\014" - "\100\173\042\360\144\134\062\230\025\333\211\277\014\071\147\075" - "\267\041\310\012\260\337\175\207\374\314\102\365\100\233\113\222" - "\330\302\064\022\024\303\023\376\361\343\000\366\173\131\157\036" - "\257\350\275\115\276\373\003\331\027\267\016\220\317\340\302\006" - "\126\253\361\313\233\153\116\255\327\245\156\234\067\267\260\130" - "\263\014\371\221\045\052\124\320\334\061\343\103\323\032\271\213" - "\221\222\250\243\070\014\203\206\151\350\321\000\207\055\267\331" - "\166\271\252\013\003\252\132\030\305\113\136\340\062\060\376\122" - "\325\364\334\237\366\276\115\345\257\304\330\046\311\030\337\143" - "\067\376\313\241\043\044\355\123\277\045\046\235\066\100\253\261" - "\172\105\134\271\100\260\015\266\345\356\004\164\373\032\126\202" - "\346\120\262\332\145\013\373\321\172\024\273\147\270\273\216\123" - "\066\013\115\361\173\122\340\373\135\337\042\021\342\161\365\246" - "\010\210\333\241\254\375\122\330\351\203\003\226\043\101\140\374" - "\023\076\060\255\145\023\373\227\170\373\056\206\111\077\312\131" - "\344\273\324\026\315\241\045\046\006\314\017\330\110\376\142\336" - "\031\133\177\015\004\251\122\061\133\116\047\162\371\276\207\260" - "\262\216\067\047\044\126\374\061\250\065\254\357\366\036\007\257" - "\222\123\073\212\144\041\063\352\032\152\131\073\355\042\367\132" - "\200\047\114\146\311\043\072\215\137\370\251\064\016\347\026\007" - "\053\123\101\106\067\314\324\004\052\033\354\065\031\351\227\236" - "\257\004\201\341\003\057\005\111\357\252\241\306\204\021\060\216" - "\365\325\355\341\116\155\206\047\206\076\275\124\364\255\114\132" - "\105\152\052\236\344\054\342\072\106\324\344\302\074\075\036\012" - "\220\322\343\264\073\122\101\112\035\061\051\146\061\120\251\212" - "\107\253\064\355\305\006\004\316\067\057\335\050\141\077\130\222" - "\046\277\261\250\041\212\175\112\323\304\100\233\116\326\173\036" - "\203\343\365\365\371\022\306\367\126\321\361\116\115\032\325\004" - "\154\325\132\026\017\140\234\130\333\314\025\156\112\320\214\367" - "\061\231\317\341\001\125\026\147\202\072\136\073\004\000\074\317" - "\253\242\371\032\166\072\157\346\115\007\315\154\236\075\346\271" - "\374\010\217\222\135\233\231\116\145\352\116\356\350\041\221\003" - "\041\177\212\277\377\221\146\053\143\221\002\260\042\363\041\327" - "\310\242\126\107\371\232\043\162\324\342\072\136\261\356\234\356" - "\120\063\312\365\145\252\133\173\264\052\373\243\164\314\201\024" - "\310\073\357\321\011\133\156\322\137\077\150\306\205\256\065\373" - "\061\100\106\211\104\355\350\302\354\250\145\146\053\241\136\240" - "\346\027\315\123\277\332\353\302\125\262\335\132\001\313\240\165" - "\042\034\041\112\264\307\132\024\240\316\107\145\275\011\234\031" - "\370\134\151\015\322\171\364\220\174\347\047\041\131\100\132\042" - "\335\331\060\201\106\161\025\333\317\015\264\227\057\125\127\356" - "\101\345\321\145\056\316\063\377\373\302\064\031\006\231\123\221" - "\154\101\326\202\114\160\017\053\351\077\006\101\204\323\166\302" - "\356\164\130\216\303\311\156\345\010\150\255\230\056\045\202\277" - "\052\046\016\301\214\373\301\243\145\101\152\367\230\000\320\264" - "\251\146\231\001\071\141\360\004\211\324\126\304\372\266\007\142" - "\161\322\035\156\355\251\013\061\132\254\175\127\304\000\235\032" - "\303\112\205\127\060\057\027\142\335\065\004\167\356\027\326\230" - "\212\126\032\251\146\155\130\360\316\336\073\332\135\317\304\211" - "\247\071\245\366\171\247\150\110\242\246\160\223\070\264\155\160" - "\332\235\122\205\127\333\005\312\132\331\215\375\133\233\367\354" - "\202\331\160\160\216\366\101\000\040\047\115\020\306\067\153\351" - "\371\324\041\051\122\337\001\305\060\321\267\235\027\234\160\334" - "\162\004\357\040\016\137\330\031\004\140\351\126\135\231\350\001" - "\310\231\102\071\144\223\340\364\202\211\115\141\077\256\363\056" - "\312\157\372\174\257\021\023\172\010\050\364\044\273\241\224\320" - "\074\104\210\275\002\320\041\100\065\006\164\243\037\127\345\131" - "\332\061\123\251\102\316\257\066\176\320\332\110\114\251\062\005" - "\115\265\114\216\346\251\001\032\147\162\342\274\233\234\061\221" - "\313\004\137\073\347\262\214\035\306\017\122\365\352\246\027\100" - "\177\203\265\261\266\006\300\360\112\076\377\316\023\140\167\007" - "\165\300\315\342\010\263\013\154\135\204\140\311\025\277\023\221" - "\300\260\274\305\173\336\244\356\001\226\343\050\077\331\102\337" - "\320\216\122\311\021\327\212\041\065\157\235\235\047\271\174\257" - "\303\027\103\347\100\276\242\374\366\030\213\165\033\021\373\143" - "\073\071\242\023\256\041\011\031\111\011\237\103\156\066\076\074" - "\062\320\256\116\136\366\315\136\147\201\152\260\266\355\335\202" - "\104\145\165\213\006\037\073\201\251\144\036\277\006\121\237\303" - "\344\236\031\377\271\135\034\200\250\242\366\042\150\005\117\333" - "\047\246\151\357\344\325\023\334\130\135\160\341\222\360\040\200" - "\355\056\267\144\307\017\354\262\376\104\357\146\043\030\146\224" - "\227\030\140\307\146\136\317\105\374\242\227\061\004\340\074\211" - "\152\043\262\126\055\053\342\100\337\267\020\275\155\111\017\010" - "\332\065\146\130\041\376\212\043\062\015\043\314\254\341\352\244" - "\107\022\324\057\131\155\353\325\006\041\321\011\076\245\344\370" - "\056\143\240\260\341\050\157\332\036\210\202\055\037\303\051\325" - "\262\224\015\131\146\154\076\314\317\322\203\025\275\271\046\346" - "\323\023\231\300\272\001\115\217\040\106\073\375\200\036\340\325" - "\166\347\107\177\220\302\023\361\261\302\375\236\207\045\034\255" - "\304\010\141\130\167\104\020\120\153\172\053\270\117\163\016\263" - "\202\075\326\225\022\155\050\372\120\054\172\135\142\333\264\027" - "\177\230\376\322\233\352\302\277\176\236\175\314\137\316\026\053" - "\251\026\073\340\227\376\033\263\021\166\027\130\141\316\175\362" - "\323\344\103\247\241\051\126\301\070\123\125\115\137\040\323\042" - "\317\160\160\220\062\166\045\066\064\260\270\002\277\047\040\330" - "\132\064\065\016\370\240\040\067\225\311\322\275\075\200\006\270" - "\204\353\005\354\236\136\012\003\203\112\226\325\100\264\340\224" - "\323\023\254\050\125\302\235\323\345\376\207\367\265\222\320\127" - "\137\074\165\276\377\240\170\033\057\311\362\241\011\171\015\374" - "\217\254\025\373\005\042\356\260\147\007\241\243\153\001\012\044" - "\142\332\154\212\366\017\227\221\057\205\163\232\345\033\220\175" - "\061\104\256\241\120\223\273\054\013\144\046\324\042\107\252\371" - "\165\334\012\366\052\164\314\102\207\030\145\360\052\311\275\133" - "\020\364\310\137\101\107\133\003\015\065\243\343\353\244\321\070" - "\231\203\166\176\076\022\073\343\166\350\331\057\253\070\127\144" - "\121\157\224\376\061\216\352\213\171\142\206\302\155\214\236\357" - "\175\115\371\056\354\002\245\376\367\275\016\220\007\233\011\046" - "\217\367\134\305\264\354\325\073\025\105\332\126\243\112\276\317" - "\262\035\244\313\316\174\103\113\120\270\262\372\302\003\244\256" - "\314\227\156\261\103\105\165\272\052\000\167\331\372\115\260\220" - "\372\105\117\212\357\177\342\033\064\301\037\161\075\111\106\331" - "\166\373\074\026\241\176\020\070\361\263\034\167\266\367\126\047" - "\127\273\245\242\366\051\151\062\271\312\343\214\307\274\054\264" - "\170\060\045\301\066\311\335\315\173\110\370\065\024\170\210\154" - "\324\206\115\021\177\274\164\013\376\356\071\272\130\062\103\032" - "\057\051\004\266\376\052\323\213\270\137\137\043\257\232\046\117" - "\265\176\034\127\041\135\277\327\317\043\106\215\313\220\303\244" - "\006\322\110\106\233\073\357\347\361\272\240\215\327\231\015\135" - "\034\311\157\100\053\046\076\154\240\031\243\045\123\232\031\212" - "\231\140\135\275\243\161\275\002\055\016\011\316\331\247\363\111" - "\377\033\252\321\131\064\350\072\372\342\067\200\234\354\137\010" - "\120\172\045\207\134\063\157\263\240\305\243\245\156\135\303\344" - "\150\172\077\371\107\133\074\110\314\053\336\234\016\104\377\352" - "\313\250\062\241\150\211\102\265\201\210\110\063\003\252\161\176" - "\161\201\135\035\136\176\071\335\060\103\165\230\152\064\230\155" - "\363\153\017\370\150\162\110\111\051\074\111\247\375\173\030\375" - "\251\300\375\133\040\306\013\263\046\263\107\221\017\125\074\373" - "\156\134\353\220\307\175\204\270\256\103\155\071\174\173\070\122" - "\172\300\325\331\121\171\077\360\072\001\002\176\227\300\257\276" - "\101\046\334\177\201\102\016\126\024\066\237\302\256\357\256\316" - "\221\325\251\323\134\151\004\020\230\225\227\242\253\006\354\371" - "\340\361\357\145\040\166\326\215\244\367\075\163\306\300\040\306" - "\341\131\057\367\267\257\264\217\025\160\333\132\312\210\164\365" - "\215\245\364\367\211\351\152\076\243\257\121\035\123\011\363\147" - "\203\352\013\240\130\067\360\245\234\050\134\346\334\357\204\271" - "\011\273\354\214\223\027\327\170\123\216\200\171\250\355\375\305" - "\350\257\045\125\003\166\246\360\207\142\077\143\050\327\053\251" - "\022\353\124\155\107\363\342\117\056\051\051\131\351\043\215\321" - "\101\277\056\042\070\063\347\112\061\271\031\352\120\075\131\371" - "\251\171\341\200\135\200\306\052\107\337\272\007\264\171\343\317" - "\245\006\303\166\120\066\264\135\112\174\024\212\017\265\060\131" - "\241\067\365\376\104\344\207\131\130\244\225\012\373\042\215\245" - "\377\346\371\372\352\315\254\240\352\170\161\113\270\304\032\070" - "\157\347\026\147\232\235\254\221\116\357\030\256\141\054\314\075" - "\017\270\271\310\136\255\032\124\043\121\167\244\154\327\122\147" - "\013\045\301\206\345\025\237\163\322\200\132\277\202\016\032\226" - "\107\120\007\177\202\375\150\010\134\054\250\376\111\106\012\016" - "\255\011\050\232\233\012\156\122\240\304\153\355\161\033\156\372" - "\064\320\263\202\014\126\325\137\044\345\233\107\276\274\043\160" - "\227\060\022\054\113\010\250\314\033\261\247\372\117\361\075\170" - "\015\230\142\145\035\250\072\133\172\151\263\201\104\245\027\357" - "\031\025\013\326\241\334\357\375\062\372\226\134\372\115\237\303" - "\201\160\261\105\025\173\077\023\157\367\266\221\342\034\177\146" - "\332\241\131\113\372\014\065\320\202\171\067\035\117\053\352\135" - "\217\152\172\173\256\150\212\146\024\257\200\103\275\200\332\043" - "\222\257\070\117\312\276\315\061\337\011\230\155\032\133\230\244" - "\177\267\320\351\044\250\344\324\333\246\154\323\111\330\357\137" - "\376\071\066\334\377\365\132\070\174\237\057\367\005\071\272\061" - "\001\213\322\163\074\165\162\151\046\262\007\311\224\331\115\152" - "\144\127\123\171\232\176\373\375\021\052\157\112\215\126\113\252" - "\344\100\052\322\220\247\077\157\053\140\126\347\150\141\355\342" - "\216\124\013\065\262\322\212\335\171\066\376\061\142\332\307\071" - "\274\127\023\306\027\375\145\002\330\015\314\262\023\331\110\245" - "\135\324\257\376\331\023\220\305\166\260\271\167\007\162\032\163" - "\053\161\170\007\027\155\266\303\210\130\172\045\350\065\207\220" - "\271\063\177\103\114\374\143\170\053\225\334\274\165\006\142\347" - "\316\207\356\312\151\323\025\026\151\354\133\065\072\224\143\110" - "\056\276\170\247\250\276\205\026\166\161\337\102\006\324\015\030" - "\051\034\326\035\061\275\027\355\002\141\277\163\117\166\366\033" - "\272\303\134\101\221\000\362\165\101\204\150\026\022\326\102\063" - "\332\047\261\117\064\322\036\353\012\336\204\154\173\175\056\246" - "\334\161\116\126\040\055\051\044\277\063\047\117\266\336\301\324" - "\330\302\102\327\330\011\313\327\307\232\021\136\272\043\241\346" - "\200\340\172\320\263\023\317\043\044\030\103\243\345\113\106\216" - "\344\315\224\024\166\270\157\037\052\327\315\273\330\123\026\221" - "\146\204\205\315\350\377\126\100\313\017\101\250\243\351\210\303" - "\133\243\324\045\137\032\332\274\005\241\025\350\115\054\216\237" - "\116\365\166\125\017\265\340\126\336\365\121\331\261\166\073\330" - "\173\301\101\313\124\203\066\215\234\341\163\052\161\074\066\274" - "\356\137\260\361\012\021\254\162\003\174\055\172\234\125\047\154" - "\003\173\236\263\063\353\020\317\240\250\310\214\162\163\047\240" - "\337\145\115\236\217\040\220\141\225\275\106\041\103\041\363\267" - "\141\342\376\102\150\326\041\002\303\371\014\052\037\370\175\323" - "\116\017\362\000\311\052\032\173\136\353\336\207\365\373\350\160" - "\222\212\172\253\352\325\212\176\124\224\310\072\205\264\210\264" - "\014\011\274\342\011\230\267\244\035\164\025\004\152\317\177\233" - "\241\151\140\067\045\307\317\005\205\147\160\110\325\277\043\275" - "\226\076\174\035\240\335\036\257\170\353\064\147\054\006\110\163" - "\240\027\150\302\262\344\210\004\324\156\056\126\052\121\020\275" - "\317\213\116\326\160\217\374\056\352\245\134\213\147\302\144\350" - "\173\022\061\270\175\152\070\312\204\345\140\127\115\322\045\240" - "\070\251\046\121\067\002\031\140\317\064\153\203\353\201\245\277" - "\240\146\203\326\025\031\073\254\300\135\350\106\063\312\274\203" - "\043\010\313\070\036\022\373\203\012\060\264\072\216\051\343\124" - "\204\126\135\243\173\122\263\250\127\326\222\355\242\161\022\272" - "\177\256\231\361\325\322\245\063\123\341\312\115\000\052\013\161" - "\246\200\036\260\155\106\267\104\313\252\336\331\316\145\244\216" - "\025\140\257\274\341\367\025\335\072\355\065\233\250\027\130\242" - "\054\115\320\164\015\045\367\006\331\314\353\321\015\145\335\136" - "\257\370\124\143\223\142\014\020\163\223\023\321\352\256\207\017" - "\023\144\031\116\136\201\206\175\035\332\035\374\126\001\134\353" - "\230\212\316\141\204\171\260\077\137\057\216\304\064\075\103\261" - "\365\203\022\277\016\135\074\030\266\320\335\036\024\130\301\157" - "\051\342\037\377\277\164\263\233\004\247\343\023\336\130\011\124" - "\306\232\151\016\140\124\030\316\277\164\077\170\232\001\311\170" - "\137\372\075\161\216\255\027\043\211\116\235\072\037\157\233\145" - "\325\007\053\067\362\173\122\112\253\007\002\174\317\007\376\123" - "\265\247\001\227\253\361\066\245\175\263\077\270\117\354\254\344" - "\023\350\014\261\037\366\122\162\011\346\363\345\351\042\156\177" - "\236\050\011\040\030\263\332\106\251\223\225\271\346\200\152\152" - "\352\375\237\302\124\223\301\042\317\365\212\035\024\177\042\002" - "\352\116\152\316\126\025\203\342\120\305\001\023\033\343\275\275" - "\141\247\050\311\163\252\167\144\271\050\305\312\151\304\376\236" - "\357\176\055\216\303\074\312\224\142\273\151\126\206\147\207\022" - "\307\361\237\044\305\147\057\334\343\006\210\045\044\315\134\314" - "\072\074\140\014\207\115\100\103\146\014\212\045\053\223\236\345" - "\114\123\345\316\002\274\011\367\272\133\334\073\343\003\176\344" - "\344\020\374\102\370\343\006\116\051\056\163\170\044\030\141\336" - "\204\330\266\253\173\147\301\125\206\223\245\051\160\107\373\132" - "\240\275\217\216\132\115\045\052\304\356\162\134\342\043\022\155" - "\010\065\344\131\220\234\146\240\253\315\136\030\233\216\041\061" - "\301\274\227\210\377\264\202\233\120\371\113\364\257\155\105\051" - "\042\243\246\263\010\336\072\203\322\257\322\121\364\070\112\152" - "\120\253\207\040\157\330\211\073\303\116\166\364\237\332\276\120" - "\125\245\253\366\226\210\162\144\011\275\256\140\127\104\226\066" - "\156\312\350\060\377\067\277\063\272\022\311\002\127\025\175\165" - "\123\020\265\305\307\056\051\015\113\366\047\224\113\014\243\356" - "\142\040\161\021\247\056\012\272\300\175\360\073\033\263\052\006" - "\324\173\155\332\073\210\134\230\317\053\307\240\221\112\045\215" - "\362\164\040\306\114\061\067\032\310\334\176\060\127\340\314\307" - "\076\351\124\027\233\266\100\071\021\054\020\352\171\170\336\021" - "\202\304\307\224\307\234\223\313\352\242\025\350\173\061\125\353" - "\050\075\136\212\006\031\110\043\057\245\000\047\132\243\025\251" - "\276\122\172\264\370\036\027\242\030\142\201\136\372\307\157\361" - "\155\370\002\060\242\303\346\177\122\317\270\336\156\076\141\242" - "\332\376\204\103\061\333\163\066\026\030\227\340\277\201\232\371" - "\204\230\173\343\106\105\107\306\006\330\121\352\013\335\005\153" - "\337\033\010\051\232\225\327\344\241\123\143\311\266\250\153\322" - "\015\166\027\216\065\242\274\311\024\244\306\116\270\337\132\165" - "\331\016\331\355\273\042\326\054\173\144\337\040\136\351\031\364" - "\244\012\166\366\240\340\274\114\213\344\370\047\365\067\336\051" - "\341\016\267\342\155\300\200\240\275\342\212\104\322\120\277\312" - "\174\173\222\160\021\131\231\041\373\223\035\176\142\217\264\163" - "\264\361\167\160\326\011\060\051\117\254\165\351\216\007\324\065" - "\212\104\230\371\320\353\042\365\315\252\206\136\010\336\036\100" - "\140\033\156\340\046\150\063\133\265\113\176\014\101\355\037\270" - "\226\113\030\142\122\335\366\035\372\230\345\115\126\072\360\065" - "\271\351\036\120\167\137\252\045\006\067\172\321\175\300\236\030" - "\013\202\275\017\166\001\113\316\153\224\100\013\115\261\247\124" - "\142\302\164\251\157\225\174\012\241\025\345\257\312\000\077\221" - "\174\370\033\303\236\120\363\162\317\222\323\217\051\220\273\335" - "\203\204\234\267\151\123\264\007\154\257\055\367\340\031\045\353" - "\100\140\337\006\135\100\146\030\313\216\243\303\213\034\261\145" - "\365\306\064\166\205\365\314\007\263\341\027\036\123\261\143\373" - "\144\071\130\312\375\242\012\113\320\307\270\007\363\077\301\337" - "\331\177\254\212\172\006\200\264\354\112\173\302\312\054\302\054" - "\376\054\133\124\307\252\171\222\070\013\243\117\336\172\367\127" - "\012\121\336\344\056\213\144\004\130\034\047\337\252\204\145\225" - "\343\341\311\340\166\202\212\206\060\007\107\346\017\124\035\270" - "\116\372\213\052\262\053\236\342\140\316\036\066\324\311\113\337" - "\105\241\246\157\121\372\135\111\133\152\051\106\034\052\040\151" - "\067\217\022\263\320\136\121\331\257\305\061\153\366\136\001\151" - "\156\213\010\211\126\060\331\276\145\024\267\310\117\227\120\244" - "\137\231\025\012\343\021\325\216\131\132\060\274\062\167\171\354" - "\233\152\046\027\255\011\350\063\304\130\007\177\331\072\176\336" - "\377\026\057\024\215\234\276\340\374\167\345\060\234\236\206\324" - "\042\160\043\337\017\376\042\137\252\353\057\104\101\237\102\352" - "\347\100\214\132\027\065\326\242\120\372\070\005\037\314\331\042" - "\372\270\312\004\110\211\353\071\374\242\317\327\027\167\265\320" - "\276\117\042\211\273\025\332\101\221\027\307\151\232\037\252\233" - "\126\126\212\270\245\225\236\312\311\114\004\101\303\015\374\322" - "\277\055\104\147\362\274\303\151\373\252\156\115\127\134\331\000" - "\115\064\136\021\153\324\221\031\251\250\275\011\175\005\125\166" - "\144\320\221\260\303\247\176\041\215\335\245\161\222\210\117\301" - "\142\004\077\124\210\347\041\154\006\014\055\120\131\335\260\157" - "\105\240\260\236\367\021\201\012\336\273\061\107\162\220\105\011" - "\375\330\224\252\044\166\007\331\300\350\072\103\036\335\324\343" - "\105\013\254\107\253\220\374\227\067\036\057\152\344\011\316\041" - "\222\366\264\230\146\152\375\043\014\020\330\235\160\372\100\371" - "\302\221\266\300\055\300\012\264\110\140\173\230\027\153\013\234" - "\375\174\350\175\244\176\042\223\271\073\152\216\354\024\216\133" - "\337\165\346\213\207\175\263\170\214\067\323\055\117\123\262\223" - "\056\153\333\122\036\004\126\372\207\361\043\047\136\304\151\057" - "\352\234\345\216\140\007\206\374\074\341\216\006\133\101\042\074" - "\043\364\122\007\277\115\174\052\354\232\146\302\335\116\074\231" - "\272\210\332\344\367\131\172\146\374\233\342\036\264\241\355\276" - "\106\102\130\177\140\321\273\137\057\157\302\274\360\041\032\020" - "\061\323\026\241\146\107\013\004\340\042\272\071\151\325\242\255" - "\216\152\205\356\014\346\145\232\005\373\157\146\074\236\160\264" - "\261\014\223\341\343\374\047\212\170\167\256\016\005\012\010\273" - "\061\243\143\253\370\232\055\333\304\315\014\016\035\004\153\317" - "\372\022\127\207\131\353\224\136\055\344\323\023\067\101\333\361" - "\077\076\341\112\066\373\032\304\051\071\212\363\004\136\201\002" - "\026\006\165\142\147\114\101\301\005\122\062\105\004\164\111\135" - "\075\317\001\217\231\207\062\231\054\233\057\254\324\207\162\056" - "\137\166\052\301\343\314\253\125\347\147\061\220\067\126\127\113" - "\017\212\220\356\040\155\067\050\266\345\272\032\241\005\203\215" - "\244\217\276\343\063\326\110\147\026\173\051\260\163\235\205\176" - "\226\032\244\157\054\213\010\214\042\146\167\236\300\011\307\033" - "\172\101\006\144\114\044\041\226\162\322\266\125\061\312\274\067" - "\106\374\320\232\220\142\277\001\154\154\061\253\012\132\204\040" - "\321\255\352\211\002\242\071\044\351\165\357\003\135\163\302\312" - "\254\215\130\106\215\143\336\146\175\252\056\206\210\054\364\035" - "\201\301\124\364\301\070\153\023\302\371\001\204\323\124\033\147" - "\101\345\037\311\265\377\026\346\231\257\211\321\067\066\022\060" - "\061\143\024\303\263\157\145\337\374\054\043\057\153\236\342\217" - "\046\036\246\105\203\004\342\127\317\056\267\165\147\072\130\335" - "\057\247\247\174\107\027\341\173\047\031\051\150\227\351\341\014" - "\303\377\171\116\220\177\217\146\254\136\000\055\162\375\014\072" - "\060\035\231\074\026\320\375\346\070\152\347\223\024\016\376\111" - "\120\025\145\345\164\142\165\215\177\046\312\024\172\142\217\062" - "\256\043\354\133\215\324\112\105\150\273\251\323\007\276\006\170" - "\233\354\206\056\352\223\334\215\210\146\112\272\374\112\053\030" - "\263\172\221\317\007\071\031\316\136\056\107\113\206\375\206\374" - "\007\171\053\152\372\032\017\206\253\166\310\203\375\046\217\370" - "\204\123\101\160\245\240\054\033\274\244\373\344\125\230\172\000" - "\120\357\322\350\045\334\004\074\345\145\302\025\223\303\060\226" - "\326\145\066\000\277\343\371\015\173\107\201\170\372\034\201\204" - "\020\377\272\216\304\142\251\304\346\306\112\042\241\122\107\334" - "\207\164\352\022\137\254\235\311\147\101\266\223\376\335\123\131" - "\376\213\351\140\357\047\257\325\212\170\164\145\220\073\111\055" - "\307\051\344\304\322\142\140\013\043\316\045\233\003\361\332\063" - "\334\106\302\004\353\310\272\264\141\164\076\252\047\056\347\030" - "\004\265\000\073\064\216\317\001\321\211\171\300\055\271\063\327" - "\076\134\136\224\251\111\166\063\010\042\136\325\211\173\040\314" - "\271\047\315\240\011\136\162\375\276\142\062\343\012\337\345\004" - "\153\262\070\121\252\011\122\040\165\077\271\021\133\245\054\307" - "\351\144\374\324\051\261\221\363\301\044\143\004\037\314\324\144" - "\044\325\350\205\104\206\070\356\254\376\036\354\110\052\177\211" - "\156\305\240\033\237\047\010\357\267\160\031\220\266\234\326\125" - "\066\337\105\251\207\044\017\275\365\144\027\256\120\010\214\046" - "\050\336\001\166\261\271\161\051\372\032\313\247\167\002\250\107" - "\221\146\162\314\052\177\220\315\375\316\106\277\372\170\342\360" - "\106\170\360\145\045\124\113\053\334\305\220\217\114\233\155\121" - "\064\062\201\007\105\021\201\245\005\264\114\061\126\140\221\137" - "\007\333\350\125\051\203\121\114\200\360\077\066\053\226\161\143" - "\034\162\344\203\341\375\204\315\145\110\261\037\117\045\041\010" - "\105\160\216\241\262\314\345\030\120\356\052\007\233\257\347\331" - "\200\074\306\151\017\367\374\173\207\130\261\020\004\344\011\016" - "\200\032\110\206\071\114\204\101\367\207\346\352\331\171\362\222" - "\250\330\070\031\301\350\115\337\046\114\056\273\107\072\257\170" - "\377\010\043\176\065\331\013\165\047\363\212\037\205\275\057\244" - "\100\317\255\246\053\032\157\141\251\375\277\156\222\103\166\243" - "\011\223\236\013\341\024\167\312\354\231\151\302\160\314\005\136" - "\132\034\256\066\060\145\001\130\166\042\177\264\013\103\346\361" - "\260\135\212\140\002\233\136\102\005\166\265\252\367\237\355\343" - "\064\073\036\072\076\211\314\062\000\322\212\065\001\174\314\361" - "\067\271\026\127\333\316\146\230\351\177\012\315\321\126\263\003" - "\247\150\262\340\363\123\026\320\151\161\151\224\234\236\355\177" - "\347\371\141\164\074\056\072\034\264\322\141\326\325\244\270\235" - "\377\233\262\271\137\340\123\161\133\001\150\307\275\043\200\204" - "\366\033\331\022\006\025\214\055\336\272\106\015\350\262\104\303" - "\132\315\215\317\311\164\261\246\346\232\140\232\344\076\332\203" - "\266\344\067\323\123\050\307\157\366\007\357\237\041\037\137\026" - "\127\345\316\233\220\375\137\161\164\272\263\243\100\022\275\026" - "\261\351\224\302\126\363\021\271\336\311\143\051\140\045\015\247" - "\013\114\137\347\246\142\101\340\227\225\016\165\152\364\313\160" - "\307\064\042\044\015\133\127\327\215\314\213\053\155\302\132\263" - "\063\352\234\306\361\243\162\161\120\015\267\131\262\005\231\344" - "\374\104\234\021\065\316\367\036\073\272\000\220\022\374\352\204" - "\327\311\134\271\014\343\352\001\077\276\250\071\272\214\026\003" - "\322\123\147\247\053\221\205\230\205\257\036\154\271\135\312\033" - "\360\203\356\315\065\220\145\344\130\075\356\310\351\101\260\024" - "\223\212\123\005\275\220\137\073\337\143\070\025\002\341\143\064" - "\033\225\151\335\207\142\124\254\115\334\203\001\167\164\171\124" - "\150\320\076\203\242\046\203\230\137\335\006\214\303\052\372\055" - "\042\076\243\241\024\326\373\217\157\262\010\353\300\164\271\233" - "\025\154\112\234\010\323\174\277\272\374\111\365\257\313\202\026" - "\065\130\126\041\215\310\134\276\337\161\364\236\115\166\027\244" - "\205\321\011\076\133\373\224\173\326\344\100\253\141\273\372\043" - "\140\272\076\321\235\307\046\322\212\233\012\233\070\054\377\017" - "\370\137\233\244\317\234\323\050\143\203\127\351\131\011\262\067" - "\313\031\063\135\071\140\213\031\136\064\115\075\321\175\253\151" - "\343\325\125\233\256\231\104\202\154\320\143\236\343\070\060\276" - "\261\063\304\164\103\207\302\217\071\147\163\015\206\132\130\201" - "\275\136\156\025\251\214\366\120\273\363\206\031\340\013\360\333" - "\336\010\065\076\050\362\164\277\315\211\022\360\102\026\154\307" - "\132\125\075\173\001\224\213\375\302\237\300\156\204\337\215\265" - "\252\043\256\216\073\374\164\310\371\074\072\337\346\017\366\235" - "\306\015\101\057\165\356\160\061\143\202\246\315\137\347\106\377" - "\071\033\362\105\102\010\032\031\002\107\031\320\046\020\213\377" - "\245\324\340\160\123\264\301\375\177\104\323\001\315\223\330\013" - "\304\301\207\321\176\017\005\355\306\271\170\317\026\343\157\117" - "\051\073\123\161\264\017\150\372\017\366\214\232\065\055\225\214" - "\121\210\024\356\206\355\243\020\170\273\077\330\010\370\221\345" - "\325\317\372\053\213\243\105\370\106\257\022\167\233\002\061\316" - "\015\177\105\113\100\331\110\120\262\245\372\102\271\056\363\037" - "\126\322\007\202\216\054\141\272\036\020\221\117\153\231\142\117" - "\377\006\010\250\302\227\076\214\317\124\120\372\150\331\233\025" - "\350\100\212\204\312\140\246\370\046\040\143\343\102\015\175\343" - "\270\135\140\253\142\024\166\215\025\353\312\114\100\206\376\334" - "\070\055\162\104\376\362\204\070\204\243\147\303\305\140\327\261" - "\323\137\232\350\007\275\054\221\250\012\033\145\367\220\171\173" - "\155\015\316\202\310\352\173\035\277\304\243\275\063\017\363\161" - "\055\337\231\024\056\171\267\173\266\013\205\234\260\356\203\321" - "\324\203\376\356\137\311\071\100\311\101\257\142\262\324\103\343" - "\115\107\223\053\145\111\141\364\377\072\227\077\147\362\007\265" - "\141\020\371\347\242\361\144\332\150\055\347\124\242\175\035\337" - "\324\145\361\262\114\101\112\271\167\356\245\361\373\242\077\123" - "\101\243\137\271\137\070\347\205\167\365\214\367\020\236\045\313" - "\305\265\306\032\157\272\273\210\134\315\144\225\372\313\071\310" - "\032\024\365\042\314\172\103\045\330\005\134\333\242\305\047\371" - "\226\120\001\035\360\130\054\145\374\341\053\050\226\214\146\204" - "\040\104\300\231\245\153\042\215\054\154\330\070\057\124\377\266" - "\052\005\255\056\331\003\156\114\121\177\266\220\034\031\155\342" - "\147\254\321\264\112\004\250\043\234\073\256\300\147\264\023\055" - "\020\053\240\200\361\000\261\362\300\260\110\203\116\105\307\237" - "\063\366\221\117\322\246\015\066\324\212\360\365\263\103\034\355" - "\031\047\211\123\045\123\015\275\050\236\301\135\030\106\152\307" - "\057\315\007\121\004\205\107\076\263\101\173\023\200\026\102\142" - "\041\232\352\332\333\075\371\024\120\362\336\236\172\364\004\067" - "\042\014\143\032\171\007\050\246\342\352\206\073\144\023\254\307" - "\057\216\221\164\226\317\245\372\141\107\002\334\344\330\250\300" - "\310\166\111\241\113\317\351\375\227\144\145\215\046\344\373\312" - "\141\101\177\030\240\147\312\057\060\372\300\035\175\351\377\344" - "\127\251\242\170\244\327\051\335\255\264\362\312\374\315\143\231" - "\264\257\041\312\365\054\370\365\275\016\015\345\170\306\141\277" - "\135\373\343\371\226\032\252\002\062\340\367\165\007\153\261\314" - "\307\230\152\203\202\206\020\257\230\136\014\364\357\254\332\175" - "\266\205\062\221\220\040\103\320\011\341\101\365\032\133\224\260" - "\233\350\062\211\017\321\304\051\364\106\342\371\207\157\174\262" - "\053\062\271\175\323\135\175\340\134\017\367\212\073\356\100\257" - "\307\057\341\203\021\314\123\107\322\301\353\040\222\143\265\120" - "\367\337\377\345\115\345\364\117\301\034\042\034\020\053\151\360" - "\260\217\305\222\240\266\256\046\214\165\114\064\363\350\034\242" - "\167\154\233\352\211\141\035\112\276\336\001\217\126\115\212\057" - "\273\165\142\135\262\232\237\054\330\261\225\231\154\275\075\002" - "\044\323\243\017\353\015\176\357\100\244\334\055\261\171\223\017" - "\277\100\241\010\051\002\365\005\251\334\235\372\136\222\140\317" - "\211\125\240\215\165\205\024\253\367\312\222\364\210\330\371\171" - "\055\103\325\173\227\235\016\273\053\103\013\124\302\253\077\056" - "\241\134\356\222\356\046\036\300\201\346\367\001\047\316\170\354" - "\012\312\053\112\364\017\245\066\315\250\337\120\050\301\325\175" - "\005\214\215\050\232\026\007\271\270\016\364\357\072\334\341\145" - "\200\026\040\245\225\116\156\365\362\320\046\020\040\001\101\166" - "\132\222\312\371\356\321\026\173\051\024\312\265\312\250\216\356" - "\266\075\150\237\372\114\306\166\372\072\206\004\241\030\033\236" - "\011\034\317\316\127\317\006\245\213\073\262\042\211\130\255\144" - "\076\146\333\271\220\121\174\241\101\223\255\251\311\036\331\370" - "\023\333\256\376\374\134\145\015\023\055\203\366\353\134\034\336" - "\062\223\332\354\034\314\337\041\311\141\320\305\002\030\024\171" - "\365\241\375\056\047\175\033\204\374\135\367\364\120\034\017\322" - "\040\004\073\376\340\217\116\154\052\214\054\020\101\024\347\114" - "\220\241\164\123\107\140\050\120\270\025\024\060\240\135\050\102" - "\211\077\307\102\061\357\176\366\033\300\023\356\106\047\135\373" - "\122\316\230\234\315\203\300\030\121\127\375\367\344\212\272\275" - "\362\245\364\147\174\044\002\054\321\002\273\262\202\145\023\271" - "\101\077\233\117\235\120\327\232\270\023\007\217\354\015\026\240" - "\053\136\166\106\340\241\133\343\040\224\315\025\204\034\332\112" - "\263\210\152\146\241\161\157\004\001\267\154\236\236\354\314\036" - "\236\070\243\226\004\322\344\344\143\111\027\167\100\011\174\157" - "\063\150\173\332\002\254\212\015\267\221\236\114\340\301\335\211" - "\160\337\301\336\026\256\214\105\144\213\120\220\076\207\377\153" - "\140\033\271\011\355\226\042\071\257\072\170\361\065\244\155\041" - "\277\035\016\255\123\012\241\155\215\165\346\066\347\075\350\104" - "\047\217\002\150\056\007\271\043\313\065\166\074\327\015\027\017" - "\333\317\114\060\347\127\110\223\023\336\115\327\166\057\324\040" - "\362\052\306\300\071\164\037\150\341\227\021\204\215\261\377\024" - "\074\256\104\227\337\011\261\014\241\110\115\147\227\014\242\013" - "\152\037\234\242\337\131\366\223\065\243\155\032\262\071\113\023" - "\100\310\251\254\000\055\306\240\073\022\372\002\130\151\101\054" - "\310\155\356\173\356\040\176\221\145\033\020\311\116\022\323\376" - "\306\153\126\022\153\013\075\072\055\371\033\114\177\312\055\061" - "\221\344\307\051\236\376\370\311\245\327\345\274\203\315\120\113" - "\376\161\273\251\016\207\324\150\361\055\210\235\343\177\321\021" - "\321\103\170\044\253\140\053\352\076\002\031\272\271\336\024\060" - "\357\376\010\121\077\130\120\107\356\136\357\121\060\065\276\167" - "\342\237\262\227\312\054\077\231\070\376\142\245\265\120\211\072" - "\204\273\310\346\354\104\137\062\371\024\125\223\135\014\173\314" - "\105\357\331\213\047\247\276\254\136\065\071\232\201\357\174\062" - "\054\114\330\045\251\341\265\130\262\103\227\270\062\122\301\365" - "\353\317\125\101\041\372\307\242\321\142\341\207\157\357\347\347" - "\043\300\372\250\266\056\156\232\221\133\242\220\315\370\157\247" - "\040\310\231\264\136\157\255\327\027\342\161\160\302\012\031\226" - "\003\276\363\201\033\240\027\117\160\062\160\077\232\340\065\334" - "\111\373\240\275\017\010\155\245\305\022\007\013\074\347\377\245" - "\355\224\356\331\123\070\060\362\105\141\267\200\045\035\071\362" - "\354\153\012\164\162\332\166\143\310\042\041\106\203\136\110\114" - "\025\220\013\255\066\064\221\371\146\341\333\030\146\370\202\063" - "\361\270\111\133\151\220\265\135\014\206\370\133\342\225\001\014" - "\241\365\277\043\212\206\004\356\055\241\157\150\144\231\360\223" - "\237\207\255\354\331\371\110\336\244\264\016\172\256\370\234\036" - "\260\325\210\110\101\125\351\053\353\153\362\377\133\103\246\031" - "\273\324\225\230\357\314\150\203\147\121\203\346\245\215\226\257" - "\040\221\027\074\240\325\077\252\170\326\045\333\234\254\162\265" - "\123\036\165\046\350\176\274\165\011\270\311\311\255\136\052\212" - "\147\271\057\016\271\144\236\152\166\252\266\050\221\026\272\013" - "\044\156\335\145\156\133\225\122\110\027\117\237\002\016\343\100" - "\055\106\137\131\114\346\357\070\337\312\131\223\223\137\326\027" - "\356\353\142\063\213\211\273\313\334\220\005\361\364\031\107\006" - "\177\220\110\122\224\323\270\322\377\041\041\161\244\055\205\200" - "\210\175\216\116\030\011\271\033\074\066\327\232\144\116\067\051" - "\322\310\231\145\103\010\047\021\060\352\375\310\315\220\164\003" - "\241\120\265\132\121\022\115\306\206\333\103\100\203\000\226\061" - "\357\375\153\267\176\105\252\133\163\221\221\206\154\154\306\076" - "\361\335\031\005\270\336\324\153\255\216\174\035\056\112\173\103" - "\205\060\261\205\111\365\345\024\140\012\210\112\227\273\262\165" - "\377\356\150\247\260\271\305\234\164\234\277\354\142\177\036\217" - "\162\350\005\235\217\274\324\121\245\360\324\004\133\010\360\062" - "\264\215\332\145\106\237\001\273\074\300\247\236\100\306\056\263" - "\257\063\121\076\360\045\220\226\025\144\232\161\155\213\244\041" - "\031\176\206\140\036\210\033\132\111\303\371\211\211\047\075\071" - "\133\216\167\114\264\007\342\312\154\175\074\331\010\340\373\041" - "\137\201\201\175\011\235\327\123\141\320\335\353\370\032\044\123" - "\251\233\237\135\243\202\050\017\377\144\351\007\104\344\051\244" - "\145\252\041\157\110\371\302\251\312\240\224\302\272\270\026\143" - "\124\266\301\367\070\351\007\067\115\360\077\222\324\150\066\072" - "\023\130\252\134\121\155\005\034\015\231\336\310\122\365\053\246" - "\253\355\236\343\327\245\033\044\226\132\267\152\303\356\245\327" - "\106\120\063\230\275\070\264\313\322\223\223\044\210\277\313\064" - "\254\151\027\203\016\063\250\244\216\140\017\121\116\265\051\224" - "\005\134\055\303\225\341\216\150\164\041" -#define chk1_z 22 -#define chk1 ((&data[9295])) - "\127\061\215\301\111\001\157\255\112\074\364\200\241\304\006\054" - "\307\017\037\251\120\001\166\253\121\326\200\021\320\174\272\165" -#define pswd_z 256 -#define pswd ((&data[9328])) - "\134\150\072\205\375\100\371\103\307\271\173\232\075\112\304\265" - "\134\066\363\160\224\311\107\006\023\245\271\317\115\357\312\242" - "\265\144\036\202\327\027\306\237\321\102\071\016\214\375\304\351" - "\064\267\131\310\201\240\316\224\106\210\143\224\167\056\066\055" - "\222\124\257\151\154\166\010\075\271\102\114\105\100\020\056\164" - "\310\207\074\111\050\013\335\156\224\101\003\013\157\071\070\002" - "\216\350\153\373\137\164\070\030\267\205\135\367\225\214\153\136" - "\024\250\247\074\264\205\253\110\306\256\123\066\350\214\070\167" - "\164\244\162\323\031\253\354\320\060\112\307\306\326\063\044\353" - "\333\313\047\220\120\323\330\027\202\054\115\153\270\206\342\055" - "\052\124\001\103\377\355\024\060\067\333\366\016\017\032\371\352" - "\346\041\172\067\364\123\116\167\177\234\342\070\042\304\145\115" - "\031\147\220\031\125\244\111\215\200\100\233\217\132\224\172\101" - "\266\364\170\252\110\307\042\307\144\004\377\206\311\145\324\342" - "\314\144\374\041\011\105\256\212\205\112\031\340\337\223\042\225" - "\210\233\100\320\142\142\230\307\147\227\116\060\375\042\023\311" - "\206\017\353\220\125\232\342\052\003\167\013\221\337\200\263\154" - "\176\224\304\260\041\205\371\063\125\166\355\313\201\007\120\335" - "\160\212\143\155\312\105\227" -#define chk2_z 19 -#define chk2 ((&data[9620])) - "\137\235\044\301\033\363\022\231\324\126\144\371\247\160\117\301" - "\276\105\027\336\210\344\022\011\242" -#define opts_z 1 -#define opts ((&data[9642])) - "\354" -#define shll_z 10 -#define shll ((&data[9643])) - "\026\377\006\331\065\033\265\065\054\040" -#define inlo_z 3 -#define inlo ((&data[9653])) - "\142\260\112" -#define xecc_z 15 -#define xecc ((&data[9657])) - "\360\177\155\100\273\333\214\005\140\237\121\161\006\267\337\167" - "\305" -#define lsto_z 1 -#define lsto ((&data[9673])) - "\353" -#define tst1_z 22 -#define tst1 ((&data[9678])) - "\314\146\350\211\070\236\047\267\006\211\242\131\356\055\216\352" - "\312\231\103\264\307\366\222\057\220\076"/* End of data[] */; -#define hide_z 4096 -#define SETUID 0 /* Define as 1 to call setuid(0) at start of script */ -#define DEBUGEXEC 0 /* Define as 1 to debug execvp calls */ -#define TRACEABLE 1 /* Define as 1 to enable ptrace the executable */ -#define HARDENING 0 /* Define as 1 to disable ptrace/dump the executable */ -#define BUSYBOXON 0 /* Define as 1 to enable work with busybox */ -#define MMAP2 0 /* Define as 1 to use syscall mmap2 */ - -#if HARDENING -static const char * shc_x[] = { -"/*", -" * Copyright 2019 - Intika ", -" * Replace ******** with secret read from fd 21", -" * Also change arguments location of sub commands (sh script commands)", -" * gcc -Wall -fpic -shared -o shc_secret.so shc_secret.c -ldl", -" */", -"", -"#define _GNU_SOURCE /* needed to get RTLD_NEXT defined in dlfcn.h */", -"#define PLACEHOLDER \"********\"", -"#include ", -"#include ", -"#include ", -"#include ", -"#include ", -"#include ", -"", -"static char secret[128000]; //max size", -"typedef int (*pfi)(int, char **, char **);", -"static pfi real_main;", -"", -"// copy argv to new location", -"char **copyargs(int argc, char** argv){", -" char **newargv = malloc((argc+1)*sizeof(*argv));", -" char *from,*to;", -" int i,len;", -"", -" for(i = 0; i 0) {", -" int i;", -"", -" if (secret[n - 1] == '\\n') secret[--n] = '\\0';", -" for (i = 1; i < argc; i++)", -" if (strcmp(argv[i], PLACEHOLDER) == 0)", -" argv[i] = secret;", -" }", -"", -" real_main = main;", -"", -" return real___libc_start_main(mymain, argc, argv, init, fini, rtld_fini, stack_end);", -"}", -"", -0}; -#endif /* HARDENING */ - -/* rtc.c */ - -#include -#include - -#include -#include -#include -#include -#include -#include - -/* 'Alleged RC4' */ - -static unsigned char stte[256], indx, jndx, kndx; - -/* - * Reset arc4 stte. - */ -void stte_0(void) -{ - indx = jndx = kndx = 0; - do { - stte[indx] = indx; - } while (++indx); -} - -/* - * Set key. Can be used more than once. - */ -void key(void * str, int len) -{ - unsigned char tmp, * ptr = (unsigned char *)str; - while (len > 0) { - do { - tmp = stte[indx]; - kndx += tmp; - kndx += ptr[(int)indx % len]; - stte[indx] = stte[kndx]; - stte[kndx] = tmp; - } while (++indx); - ptr += 256; - len -= 256; - } -} - -/* - * Crypt data. - */ -void arc4(void * str, int len) -{ - unsigned char tmp, * ptr = (unsigned char *)str; - while (len > 0) { - indx++; - tmp = stte[indx]; - jndx += tmp; - stte[indx] = stte[jndx]; - stte[jndx] = tmp; - tmp += stte[indx]; - *ptr ^= stte[tmp]; - ptr++; - len--; - } -} - -/* End of ARC4 */ - -#if HARDENING - -#include -#include -#include -#include -#define PR_SET_PTRACER 0x59616d61 - -/* Seccomp Sandboxing Init */ -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include - -#define ArchField offsetof(struct seccomp_data, arch) - -#define Allow(syscall) \ - BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, SYS_##syscall, 0, 1), \ - BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_ALLOW) - -struct sock_filter filter[] = { - /* validate arch */ - BPF_STMT(BPF_LD+BPF_W+BPF_ABS, ArchField), - BPF_JUMP( BPF_JMP+BPF_JEQ+BPF_K, AUDIT_ARCH_X86_64, 1, 0), - BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_KILL), - - /* load syscall */ - BPF_STMT(BPF_LD+BPF_W+BPF_ABS, offsetof(struct seccomp_data, nr)), - - /* list of allowed syscalls */ - Allow(exit_group), /* exits a process */ - Allow(brk), /* for malloc(), inside libc */ -#if MMAP2 - Allow(mmap2), /* also for malloc() */ -#else - Allow(mmap), /* also for malloc() */ -#endif - Allow(munmap), /* for free(), inside libc */ - - /* and if we don't match above, die */ - BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_KILL), -}; -struct sock_fprog filterprog = { - .len = sizeof(filter)/sizeof(filter[0]), - .filter = filter -}; - -/* Seccomp Sandboxing - Set up the restricted environment */ -void seccomp_hardening() { - if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) { - perror("Could not start seccomp:"); - exit(1); - } - if (prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &filterprog) == -1) { - perror("Could not start seccomp:"); - exit(1); - } -} -/* End Seccomp Sandboxing Init */ - -void shc_x_file() { - FILE *fp; - int line = 0; - - if ((fp = fopen("/tmp/shc_x.c", "w")) == NULL ) {exit(1); exit(1);} - for (line = 0; shc_x[line]; line++) fprintf(fp, "%s\n", shc_x[line]); - fflush(fp);fclose(fp); -} - -int make() { - char * cc, * cflags, * ldflags; - char cmd[4096]; - - cc = getenv("CC"); - if (!cc) cc = "cc"; - - sprintf(cmd, "%s %s -o %s %s", cc, "-Wall -fpic -shared", "/tmp/shc_x.so", "/tmp/shc_x.c -ldl"); - if (system(cmd)) {remove("/tmp/shc_x.c"); return -1;} - remove("/tmp/shc_x.c"); return 0; -} - -void arc4_hardrun(void * str, int len) { - //Decode locally - char tmp2[len]; - char tmp3[len+1024]; - memcpy(tmp2, str, len); - - unsigned char tmp, * ptr = (unsigned char *)tmp2; - int lentmp = len; - int pid, status; - pid = fork(); - - shc_x_file(); - if (make()) {exit(1);} - - setenv("LD_PRELOAD","/tmp/shc_x.so",1); - - if(pid==0) { - - //Start tracing to protect from dump & trace - if (ptrace(PTRACE_TRACEME, 0, 0, 0) < 0) { - kill(getpid(), SIGKILL); - _exit(1); - } - - //Decode Bash - while (len > 0) { - indx++; - tmp = stte[indx]; - jndx += tmp; - stte[indx] = stte[jndx]; - stte[jndx] = tmp; - tmp += stte[indx]; - *ptr ^= stte[tmp]; - ptr++; - len--; - } - - //Do the magic - sprintf(tmp3, "%s %s", "'********' 21<<<", tmp2); - - //Exec bash script //fork execl with 'sh -c' - system(tmp2); - - //Empty script variable - memcpy(tmp2, str, lentmp); - - //Clean temp - remove("/tmp/shc_x.so"); - - //Sinal to detach ptrace - ptrace(PTRACE_DETACH, 0, 0, 0); - exit(0); - } - else {wait(&status);} - - /* Seccomp Sandboxing - Start */ - seccomp_hardening(); - - exit(0); -} -#endif /* HARDENING */ - -/* - * Key with file invariants. - */ -int key_with_file(char * file) -{ - struct stat statf[1]; - struct stat control[1]; - - if (stat(file, statf) < 0) - return -1; - - /* Turn on stable fields */ - memset(control, 0, sizeof(control)); - control->st_ino = statf->st_ino; - control->st_dev = statf->st_dev; - control->st_rdev = statf->st_rdev; - control->st_uid = statf->st_uid; - control->st_gid = statf->st_gid; - control->st_size = statf->st_size; - control->st_mtime = statf->st_mtime; - control->st_ctime = statf->st_ctime; - key(control, sizeof(control)); - return 0; -} - -#if DEBUGEXEC -void debugexec(char * sh11, int argc, char ** argv) -{ - int i; - fprintf(stderr, "shll=%s\n", sh11 ? sh11 : ""); - fprintf(stderr, "argc=%d\n", argc); - if (!argv) { - fprintf(stderr, "argv=\n"); - } else { - for (i = 0; i <= argc ; i++) - fprintf(stderr, "argv[%d]=%.60s\n", i, argv[i] ? argv[i] : ""); - } -} -#endif /* DEBUGEXEC */ - -void rmarg(char ** argv, char * arg) -{ - for (; argv && *argv && *argv != arg; argv++); - for (; argv && *argv; argv++) - *argv = argv[1]; -} - -void chkenv_end(void); - -int chkenv(int argc) -{ - char buff[512]; - unsigned long mask, m; - int l, a, c; - char * string; - extern char ** environ; - - mask = (unsigned long)getpid(); - stte_0(); - key(&chkenv, (void*)&chkenv_end - (void*)&chkenv); - key(&data, sizeof(data)); - key(&mask, sizeof(mask)); - arc4(&mask, sizeof(mask)); - sprintf(buff, "x%lx", mask); - string = getenv(buff); -#if DEBUGEXEC - fprintf(stderr, "getenv(%s)=%s\n", buff, string ? string : ""); -#endif - l = strlen(buff); - if (!string) { - /* 1st */ - sprintf(&buff[l], "=%lu %d", mask, argc); - putenv(strdup(buff)); - return 0; - } - c = sscanf(string, "%lu %d%c", &m, &a, buff); - if (c == 2 && m == mask) { - /* 3rd */ - rmarg(environ, &string[-l - 1]); - return 1 + (argc - a); - } - return -1; -} - -void chkenv_end(void){} - -#if HARDENING - -static void gets_process_name(const pid_t pid, char * name) { - char procfile[BUFSIZ]; - sprintf(procfile, "/proc/%d/cmdline", pid); - FILE* f = fopen(procfile, "r"); - if (f) { - size_t size; - size = fread(name, sizeof (char), sizeof (procfile), f); - if (size > 0) { - if ('\n' == name[size - 1]) - name[size - 1] = '\0'; - } - fclose(f); - } -} - -void hardening() { - prctl(PR_SET_DUMPABLE, 0); - prctl(PR_SET_PTRACER, -1); - - int pid = getppid(); - char name[256] = {0}; - gets_process_name(pid, name); - - if ( (strcmp(name, "bash") != 0) - && (strcmp(name, "/bin/bash") != 0) - && (strcmp(name, "sh") != 0) - && (strcmp(name, "/bin/sh") != 0) - && (strcmp(name, "sudo") != 0) - && (strcmp(name, "/bin/sudo") != 0) - && (strcmp(name, "/usr/bin/sudo") != 0) - && (strcmp(name, "gksudo") != 0) - && (strcmp(name, "/bin/gksudo") != 0) - && (strcmp(name, "/usr/bin/gksudo") != 0) - && (strcmp(name, "kdesu") != 0) - && (strcmp(name, "/bin/kdesu") != 0) - && (strcmp(name, "/usr/bin/kdesu") != 0) - ) - { - printf("Operation not permitted\n"); - kill(getpid(), SIGKILL); - exit(1); - } -} - -#endif /* HARDENING */ - -#if !TRACEABLE - -#define _LINUX_SOURCE_COMPAT -#include -#include -#include -#include -#include -#include -#include - -#if !defined(PT_ATTACHEXC) /* New replacement for PT_ATTACH */ - #if !defined(PTRACE_ATTACH) && defined(PT_ATTACH) - #define PT_ATTACHEXC PT_ATTACH - #elif defined(PTRACE_ATTACH) - #define PT_ATTACHEXC PTRACE_ATTACH - #endif -#endif - -void untraceable(char * argv0) -{ - char proc[80]; - int pid, mine; - - switch(pid = fork()) { - case 0: - pid = getppid(); - /* For problematic SunOS ptrace */ -#if defined(__FreeBSD__) - sprintf(proc, "/proc/%d/mem", (int)pid); -#else - sprintf(proc, "/proc/%d/as", (int)pid); -#endif - close(0); - mine = !open(proc, O_RDWR|O_EXCL); - if (!mine && errno != EBUSY) - mine = !ptrace(PT_ATTACHEXC, pid, 0, 0); - if (mine) { - kill(pid, SIGCONT); - } else { - perror(argv0); - kill(pid, SIGKILL); - } - _exit(mine); - case -1: - break; - default: - if (pid == waitpid(pid, 0, 0)) - return; - } - perror(argv0); - _exit(1); -} -#endif /* !TRACEABLE */ - -char * xsh(int argc, char ** argv) -{ - char * scrpt; - int ret, i, j; - char ** varg; - char * me = argv[0]; - if (me == NULL) { me = getenv("_"); } - if (me == 0) { fprintf(stderr, "E: neither argv[0] nor $_ works."); exit(1); } - - ret = chkenv(argc); - stte_0(); - key(pswd, pswd_z); - arc4(msg1, msg1_z); - arc4(date, date_z); - if (date[0] && (atoll(date) 1) ? ret : 0; /* Args numbering correction */ - while (i < argc) - varg[j++] = argv[i++]; /* Main run-time arguments */ - varg[j] = 0; /* NULL terminated array */ -#if DEBUGEXEC - debugexec(shll, j, varg); -#endif - execvp(shll, varg); - return shll; -} - -int main(int argc, char ** argv) -{ -#if SETUID - setuid(0); -#endif -#if DEBUGEXEC - debugexec("main", argc, argv); -#endif -#if HARDENING - hardening(); -#endif -#if !TRACEABLE - untraceable(argv[0]); -#endif - argv[1] = xsh(argc, argv); - fprintf(stderr, "%s%s%s: %s\n", argv[0], - errno ? ": " : "", - errno ? strerror(errno) : "", - argv[1] ? argv[1] : "" - ); - return 1; -} diff --git a/devdoc.md b/devdoc.md index 3a33c1e..87e8051 100644 --- a/devdoc.md +++ b/devdoc.md @@ -28,18 +28,17 @@ - Readme updated - Documentation/Wiki updated --- - +- Shell detection added +- Alias support for fish added +- Removal process refined and adapted to fish +- Browser config backup ## Add/To Do - Architecture detection -- Set alias --> Partially - - active shell recognition missing - Roll back from backup - Config check -- Simplification (more for loops) & Clean Up - Update Readme - Make functional launcher optional -- Backup configuration ## Repo - Merge workflow diff --git a/launcher-update-helium b/launcher-update-helium deleted file mode 100755 index 8d8845e2dbcdc9d473ba189b74b7809db24a40e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24368 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 SeN=TC9iJGZh!+0A!u}7;N8ZT* diff --git a/update-helium b/update-helium deleted file mode 100755 index b19991d91194fde5c1367bc742e87b696d4c8ead..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39976 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 Date: Mon, 5 Jan 2026 11:49:59 -0700 Subject: [PATCH 02/22] binaries ignored --- .gitignore | 3 ++- helium_helper.sh | 16 ++++++++-------- helium_launcher_update.sh | 6 ++++-- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index 61a58b0..ba7230e 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -test.sh \ No newline at end of file +test.sh +binaries \ No newline at end of file diff --git a/helium_helper.sh b/helium_helper.sh index 300a1e4..bf8704f 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -390,13 +390,12 @@ update_script() { read -p " Copy script to $SCRIPT_PATH? (Y/n) : " CONFIRM_SCRIPT_INSTALL if [[ "$CONFIRM_SCRIPT_INSTALL" == "" || "$CONFIRM_SCRIPT_INSTALL" == "y" || "$CONFIRM_SCRIPT_INSTALL" == "Y" ]] ; then - if ! [ -d "$SCRIPT_PATH" ] ; then - mkdir -p $SCRIPT_PATH - fi + mkdir -p $SCRIPT_PATH mkdir -p $TMP wget -P $TMP $REMOTE_SCRIPT_URL -q - chmod +x $TMP/$SCRIPT_FILE_NAME - mv $TMP/$SCRIPT_FILE_NAME $SCRIPT_PATH + wget -P $TMP $REMOTE_REPO_URL/$AUTO_SCRIPT_FILE_NAME -q + chmod +x $TMP/$SCRIPT_FILE_NAME $TMP/$AUTO_SCRIPT_FILE_NAME + mv $TMP/$SCRIPT_FILE_NAME $TMP/$AUTO_SCRIPT_FILE_NAME $SCRIPT_PATH echo -e "\n ${GRN}$SCRIPT_FILE_NAME is up-to-date!${CRS}" exit_clean @@ -443,10 +442,11 @@ update_script() { mkdir -p $BACKUP_PATH fi mv $SCRIPT_PATH/$SCRIPT_FILE_NAME $BACKUP_PATH/$SCRIPT_FILE_NAME.old - mkdir -p $TMP + mv $SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME $BACKUP_PATH/$AUTO_SCRIPT_FILE_NAME.old wget -P $TMP $REMOTE_SCRIPT_URL -q - chmod +x $TMP/$SCRIPT_FILE_NAME - mv $TMP/$SCRIPT_FILE_NAME $SCRIPT_PATH + wget -P $TMP $REMOTE_REPO_URL/$AUTO_SCRIPT_FILE_NAME -q + chmod +x $TMP/$SCRIPT_FILE_NAME $TMP/$AUTO_SCRIPT_FILE_NAME + mv $TMP/$SCRIPT_FILE_NAME $TMP/$AUTO_SCRIPT_FILE_NAME $SCRIPT_PATH echo -e " ${GRN}$SCRIPT_FILE_NAME is up-to-date!${CRS}" break diff --git a/helium_launcher_update.sh b/helium_launcher_update.sh index 2b9f81c..8123131 100755 --- a/helium_launcher_update.sh +++ b/helium_launcher_update.sh @@ -10,6 +10,7 @@ ARCH="x86_64" FILE_EXTENSION="AppImage" APP_SOURCE="GitHub" SCRIPT_NAME="$APP_NAME Launcher Updater" +PARENT_SCRIPT_FILE_NAME="helium_helper.sh" SCRIPT_FILE_NAME="helium_launcher_update.sh" SCRIPT_VERSION="0.5.8" DATE=$(date) @@ -120,8 +121,9 @@ update_script() { mv $SCRIPT_PATH/$SCRIPT_FILE_NAME $BACKUP_PATH/$SCRIPT_FILE_NAME.old mkdir -p $TMP wget -P $TMP $REMOTE_SCRIPT_URL -q - chmod +x $TMP/$SCRIPT_FILE_NAME - mv $TMP/$SCRIPT_FILE_NAME $SCRIPT_PATH + wget -P $TMP $REMOTE_REPO_URL/$PARENT_SCRIPT_FILE_NAME -q + chmod +x $TMP/$SCRIPT_FILE_NAME $TMP/$PARENT_SCRIPT_FILE_NAME + mv $TMP/$SCRIPT_FILE_NAME $TMP/$PARENT_SCRIPT_FILE_NAME $SCRIPT_PATH echo "$DATE | Script updated to version $REMOTE_SCRIPT_VERSION" >> $LOG notify-send --icon="$ICON" --app-name="Helium Helper" "Script updated to version $REMOTE_SCRIPT_VERSION" From f2335fd14857205abbccfb0fcab1204f440eaa3b Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Thu, 8 Jan 2026 23:42:44 +0100 Subject: [PATCH 03/22] Backup function added ; Script output refined ; Custom alias through $2 added; Arch detection added ; Removal Process adatptions ; --- helium_helper.sh | 278 +++++++++++++++++++++++++++++++---------------- 1 file changed, 187 insertions(+), 91 deletions(-) diff --git a/helium_helper.sh b/helium_helper.sh index bf8704f..d13b25f 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -9,19 +9,22 @@ YEL="\e[0;33m" RED="\e[0;31m" GRN="\e[0;32m" LCY="\e[1;36m" +WHT="\e[1;37m" CRS="\e[0m" ## GLOBAL VARIABLES APP_NAME="Helium" APP_NAME_LONG="Helium Web Browser" -ARCH="x86_64" FILE_EXTENSION="AppImage" APP_SOURCE="GitHub" +ARCH_OVERRIDE="" +BACKUP_COMPRESSION_OVERRIDE="" SCRIPT_NAME="$APP_NAME Helper Script" SCRIPT_FILE_NAME="helium_helper.sh" AUTO_SCRIPT_FILE_NAME="helium_launcher_update.sh" SCRIPT_VERSION="0.5.8" ALIAS="update-helium" +DATE=$(date +"%d%m%y") ## LOCATIONS TMP=/tmp/$APP_NAME @@ -52,7 +55,7 @@ cmd_query() { } dependency_check () { - DEPENDENCIES=("curl" "wget") + DEPENDENCIES=("curl" "wget" "tar") mkdir -p $TMP for PACKAGE in "${DEPENDENCIES[@]}" ; do @@ -78,22 +81,39 @@ shell_query() { } shell_check() { - SHELLS=("bash" "fish" "ksh" "zsh") + SHELLS=("bash" "fish" "zsh") for SHELL_OPTION in "${SHELLS[@]}" ; do shell_query "$SHELL_OPTION" done } +### ARCH CHECK + +arch_check() { + if [ "$ARCH_OVERRIDE" ] ; then + ARCH=$ARCH_OVERRIDE + + else + ARCH=$(uname -m) + if [ "$ARCH" == "aarch64" ] ; then + ARCH="arm64" + + elif [ "$ARCH" == "amd64" ] ; then + ARCH="x86_64" + fi + fi +} + ### CHECK LOCAL INSTALL local_check() { if ! [ -d "$INSTALL_PATH" ] ; then - echo -e "\n ${RED}$APP_NAME_LONG directory not found!${CRS}" + echo -e "\n ${YEL}$APP_NAME_LONG directory not found!${CRS}\n" install_helium exit elif ! [ -f "$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" ] ; then - echo -e "\n ${RED}$APP_NAME_LONG directory found but no executable named ${CYN}$APP_NAME.$FILE_EXTENSION${RED}!${CRS}" + echo -e "\n ${YEL}$APP_NAME_LONG directory found but no executable named ${CYN}$APP_NAME.$FILE_EXTENSION${YEL}!${CRS}\n" install_helium exit fi @@ -109,12 +129,12 @@ install_helium() { while true ; do read -p " Download and install $APP_NAME_LONG from $APP_SOURCE? (Y/n) : " CONFIRM_INSTALL - echo if [[ "$CONFIRM_INSTALL" == "" || "$CONFIRM_INSTALL" == "y" || "$CONFIRM_INSTALL" == "Y" ]] ; then DOWNLOAD_URL=$(curl -s $APP_SOURCE_URL | grep "browser_download_url" | grep "$ARCH.$FILE_EXTENSION" | grep -v "zsync" | tr -d \" | awk '{print $2}') APP_SOURCE_FILENAME=$(curl -s $APP_SOURCE_URL | grep "browser_download_url" | grep "$ARCH.$FILE_EXTENSION" | grep -v "zsync" | tr -d \" | awk '{print $2}' | awk -F'/' '{print $9}') - wget -P $TMP $DOWNLOAD_URL -q --show-progress + echo -e "\n - Downloading ${CYN}$APP_SOURCE_FILENAME${CRS}..." + wget -P $TMP $DOWNLOAD_URL -q chmod +x $TMP/$APP_SOURCE_FILENAME mkdir -p $INSTALL_PATH mv $TMP/$APP_SOURCE_FILENAME $INSTALL_PATH/$APP_NAME.$FILE_EXTENSION @@ -123,11 +143,11 @@ install_helium() { break elif [[ "$CONFIRM_INSTALL" == "n" || "$CONFIRM_INSTALL" == "N" ]] ; then - echo -e " ${RED}Cancelled!${CRS}" + echo -e "\n ${RED}Cancelled!${CRS}\n" break else - echo -e " ${YEL}Invalid response!${CRS}\n" + echo -e "\n ${YEL}Invalid response!${CRS}\n" fi done @@ -142,7 +162,6 @@ add_launcher() { while true ; do echo read -p " Add $APP_NAME_LONG launcher to $LAUNCHER_PATH? (Y/n) : " CONFIRM_LAUNCHER - echo if [[ "$CONFIRM_LAUNCHER" == "" || "$CONFIRM_LAUNCHER" == "y" || "$CONFIRM_LAUNCHER" == "Y" ]] ; then LAUNCHER_URL=$REMOTE_REPO_URL/assets/launcher/helium.desktop.template @@ -151,13 +170,15 @@ add_launcher() { LOCAL_VERSION=$($INSTALL_PATH/$APP_NAME.$FILE_EXTENSION --version | awk '{print $2}') mkdir -p $LAUNCHER_PATH $SCRIPT_PATH $BACKUP_PATH $ASSET_PATH/icon if ! [ -f "$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME" ] ; then - wget -P $TMP $AUTO_SCRIPT_URL -q --show-progress + echo -e "\n - Downloading ${CYN}$AUTO_SCRIPT_FILE_NAME${CRS}..." + wget -P $TMP $AUTO_SCRIPT_URL -q chmod +x $TMP/$AUTO_SCRIPT_FILE_NAME mv $TMP/$AUTO_SCRIPT_FILE_NAME $SCRIPT_PATH fi - wget -P $TMP $LAUNCHER_URL -q --show-progress - wget -P $TMP $ICON_URL -q --show-progress + echo -e "\n - Downloading ${CYN}launcher files${CRS}..." + wget -P $TMP $LAUNCHER_URL -q + wget -P $TMP $ICON_URL -q sed -i "s|%APP_LOCATION%|$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION|" $TMP/helium.desktop.template sed -i "s|%ICON_LOCATION%|$ASSET_PATH/icon/helium.png|" $TMP/helium.desktop.template sed -i "s|%APP_VERSION%|$LOCAL_VERSION|" $TMP/helium.desktop.template @@ -197,36 +218,44 @@ add_alias() { if [ "$ACTIVE_SHELL" == "zsh" ] ; then if [ "$(cat $HOME/.zshrc | grep "$ALIAS")" ] ; then - echo -e "\n ${LCY}$ALIAS ${GRN}already present in${CRS} $HOME/.zshrc\n" - exit + echo -e "\n ${LCY}$ALIAS${CRS} already present in ${CYN}$HOME/.zshrc${CRS}\n" + + else + echo "### $APP_NAME_LONG Alias zsh ###" >> $HOME/.zshrc + echo "alias $ALIAS=\"$SCRIPT_PATH/$SCRIPT_FILE_NAME\"" >> $HOME/.zshrc + echo >> $HOME/.zshrc + echo -e "\n ${LCY}$ALIAS${CRS} added to ${CYN}$HOME/.zshrc${CRS}\n" fi - echo "alias $ALIAS=\"$SCRIPT_PATH/$SCRIPT_FILE_NAME\"" >> $HOME/.zshrc - echo -e "\n ${LCY}$ALIAS ${GRN}added to${CRS} $HOME/.zshrc\n" elif [ "$ACTIVE_SHELL" == "bash" ] ; then if [ "$(cat $HOME/.bashrc | grep "$ALIAS")" ] ; then - echo -e "\n ${LCY}$ALIAS ${GRN}already present in${CRS} $HOME/.bashrc\n" - exit + echo -e "\n ${LCY}$ALIAS${CRS} already present in ${CYN}$HOME/.bashrc${CRS}\n" + + else + echo "### $APP_NAME_LONG Alias bash ###" >> $HOME/.bashrc + echo "alias $ALIAS=\"$SCRIPT_PATH/$SCRIPT_FILE_NAME\"" >> $HOME/.bashrc + echo >> $HOME/.bashrc + echo -e "\n ${LCY}$ALIAS${CRS} added to ${CYN}$HOME/.bashrc${CRS}\n" fi - echo "alias $ALIAS=\"$SCRIPT_PATH/$SCRIPT_FILE_NAME\"" >> $HOME/.zshrc - echo -e "\n ${LCY}$ALIAS ${GRN}added to${CRS} $HOME/.bashrc\n" elif [ "$ACTIVE_SHELL" == "fish" ] ; then if [ "$(cat $HOME/.config/fish/config.fish | grep "source $HOME/.config/fish/$ALIAS.fish")" ] ; then - echo -e "\n ${LCY}$ALIAS ${GRN}already present in${CRS} $HOME/.config/fish/config.fish\n" - exit + echo -e "\n ${LCY}$ALIAS${CRS} already present in ${CYN}$HOME/.config/fish/config.fish${CRS}\n" + + else + echo "### $APP_NAME_LONG Alias FISH ###" > $HOME/.config/fish/$ALIAS.fish + echo >> $HOME/.config/fish/$ALIAS.fish + echo "function $ALIAS" >> $HOME/.config/fish/$ALIAS.fish + echo " $SCRIPT_PATH/$SCRIPT_FILE_NAME \$argv" >> $HOME/.config/fish/$ALIAS.fish + echo "end" >> $HOME/.config/fish/$ALIAS.fish + echo >> $HOME/.config/fish/$ALIAS.fish + echo "source $HOME/.config/fish/$ALIAS.fish" >> $HOME/.config/fish/config.fish + echo -e "\n ${LCY}$ALIAS ${CRS}added to ${CYN}$HOME/.config/fish/config.fish${CRS}\n" fi - echo "### Helium Helper Alias FISH ###" > $HOME/.config/fish/$ALIAS.fish - echo >> $HOME/.config/fish/$ALIAS.fish - echo "function $ALIAS" >> $HOME/.config/fish/$ALIAS.fish - echo " $SCRIPT_PATH/$SCRIPT_FILE_NAME \$argv" >> $HOME/.config/fish/$ALIAS.fish - echo "end" >> $HOME/.config/fish/$ALIAS.fish - echo "source $HOME/.config/fish/$ALIAS.fish" >> $HOME/.config/fish/config.fish - echo -e "\n ${LCY}$ALIAS ${GRN}added to${CRS} $HOME/.config/fish/config.fish\n" else - echo -e "\n ${LCY}$ACTIVE_SHELL ${RED}not yet supported!${CRS}\n" - echo -e " ${LCY}Working implementation are available for bash, zsh & fish!${CRS}\n" + echo -e "\n ${LCY}$ACTIVE_SHELL${RED}shell is not yet supported!${CRS}\n" + echo -e " ${CRS}Working implementation are available for bash, zsh & fish!${CRS}\n" fi } @@ -259,37 +288,26 @@ update_helium() { while true ; do read -p " Download and update $APP_NAME_LONG from $APP_SOURCE? (Y/n) : " CONFIRM - echo if [[ "$CONFIRM" == "" || "$CONFIRM" == "y" || "$CONFIRM" == "Y" ]] ; then DOWNLOAD_URL=$(curl -s $APP_SOURCE_URL | grep "browser_download_url" | grep "$ARCH.$FILE_EXTENSION" | grep -v "zsync" | tr -d \" | awk '{print $2}') APP_SOURCE_FILENAME=$(curl -s $APP_SOURCE_URL | grep "browser_download_url" | grep "$ARCH.$FILE_EXTENSION" | grep -v "zsync" | tr -d \" | awk '{print $2}' | awk -F'/' '{print $9}') - mkdir -p $TMP $BACKUP_PATH - wget -P $TMP $DOWNLOAD_URL -q --show-progress + mkdir -p $TMP + echo -e "\n - Downloading ${CYN}$APP_SOURCE_FILENAME${CRS}..." + wget -P $TMP $DOWNLOAD_URL -q + backup_helium chmod +x $TMP/$APP_SOURCE_FILENAME - if [ -f "$BACKUP_PATH/$APP_NAME.old" ] ; then - rm $BACKUP_PATH/$APP_NAME.old - fi - if [ -d "$APP_CONFIG_PATH" ] ; then - if [ -f "$BACKUP_PATH/$APP_NAME.config.tar" ] ; then - rm $BACKUP_PATH/$APP_NAME.config.tar - fi - tar -cf $BACKUP_PATH/$APP_NAME.config.tar $APP_CONFIG_PATH > /dev/null 2>&1 - fi - mv $INSTALL_PATH/$APP_NAME.$FILE_EXTENSION $BACKUP_PATH/$APP_NAME.old mv $TMP/$APP_SOURCE_FILENAME $INSTALL_PATH/$APP_NAME.$FILE_EXTENSION - cp $LAUNCHER_PATH/$APP_NAME.desktop $BACKUP_PATH/$APP_NAME.desktop.old - chmod -x $BACKUP_PATH/*.sh.old $BACKUP_PATH/$APP_NAME.old sed -i "s|X-AppImage-Version=.*|X-AppImage-Version=$($INSTALL_PATH/$APP_NAME.$FILE_EXTENSION --version | awk '{print $2}')|" $LAUNCHER_PATH/$APP_NAME.desktop - echo -e "\n ${GRN}$APP_NAME_LONG is up-to-date !${CRS}\n" + echo -e " ${GRN}$APP_NAME_LONG is up-to-date!${CRS}\n" break elif [[ "$CONFIRM" == "n" || "$CONFIRM" == "N" ]] ; then - echo -e " ${RED}Cancelled!${CRS}\n" + echo -e "\n ${RED}Cancelled!${CRS}\n" exit else - echo -e " ${YEL}Invalid response!${CRS}\n" + echo -e "\n ${YEL}Invalid response!${CRS}\n" fi done @@ -303,14 +321,88 @@ update_helium() { } -### AUTOMATIC UPDATE --> TO DO? -auto_update() { - if ! [ -f "$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" ] ; then - echo -e "\n ${RED}$APP_NAME AppImage not found! Can't add auto update script...${CRS}" - exit - - else - echo -e "\n ${RED}Not implemented yet...${CRS}" +### BACKUP +backup_helium() { + if [[ -d "$INSTALL_PATH" || -d "$SCRIPT_PATH" || -d $APP_CONFIG_PATH ]] ; then + BACKUPABLE=("$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" "$SCRIPT_PATH/$SCRIPT_FILE_NAME" "$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME" "$LAUNCHER_PATH/$APP_NAME.desktop" "$APP_CONFIG_PATH") + echo -e "\n - ${CRS}Collectig files for ${CYN}backup${CRS}...${CRS}" + + for BACKUP_ITEM in ${BACKUPABLE[@]} ; do + if [ -d "$BACKUP_ITEM" ] ; then + mkdir -p $TMP/backup + cp -r $BACKUP_ITEM $TMP/backup + + elif [ -f "$BACKUP_ITEM" ] ; then + mkdir -p $TMP/backup + cp $BACKUP_ITEM $TMP/backup + fi + done + + if [ -d "$TMP/backup" ] ; then + CWD=$(pwd) + cd $TMP/backup + chmod -x *.sh *.$FILE_EXTENSION > /dev/null 2>&1 + + if [ "$BACKUP_COMPRESSION_OVERRIDE" ] ; then + BACKUP_COMPRESSION=$BACKUP_COMPRESSION_OVERRIDE + + elif ! [ "$BACKUP_COMPRESSION_OVERRIDE" ] ; then + COMPRESSION_METHOD=("pbzip2" "gzip" "bzip2" "zip") + + until [ "$BACKUP_COMPRESSION" ] ; do + for COMPRESSION_TYPE in ${COMPRESSION_METHOD[@]} ; do + + if [ "$(command -v $COMPRESSION_TYPE) > /dev/null 2>&1" ] ; then + BACKUP_COMPRESSION=$COMPRESSION_TYPE + break + fi + done + done + fi + + echo -e "\n - ${CRS}Compressing backup archive with ${CYN}$BACKUP_COMPRESSION${CRS}...${CRS}\n" + + if [ "$BACKUP_COMPRESSION" == "pbzip2" ] ; then + tar -cf $APP_NAME.backup_$DATE.tar * > /dev/null 2>&1 + pbzip2 $APP_NAME.backup_$DATE.tar + mkdir -p $BACKUP_PATH + mv $APP_NAME.backup_$DATE.tar.bz2 $BACKUP_PATH + cd $TMP && rm -rf backup + + elif [ "$BACKUP_COMPRESSION" == "gzip" ] ; then + tar -cf $APP_NAME.backup_$DATE.tar * > /dev/null 2>&1 + gzip $APP_NAME.backup_$DATE.tar + mkdir -p $BACKUP_PATH + mv $APP_NAME.backup_$DATE.tar.gz $BACKUP_PATH + cd $TMP && rm -rf backup + + elif [ "$BACKUP_COMPRESSION" == "bzip2" ] ; then + tar -cf $APP_NAME.backup_$DATE.tar * > /dev/null 2>&1 + bzip2 $APP_NAME.backup_$DATE.tar + mkdir -p $BACKUP_PATH + mv $APP_NAME.backup_$DATE.tar.bz2 $BACKUP_PATH + cd $TMP && rm -rf backup + + elif [ "$BACKUP_COMPRESSION" == "zip" ] ; then + tar -cf $APP_NAME.backup_$DATE.tar * > /dev/null 2>&1 + zip -r $APP_NAME.backup_$DATE.tar.zip $APP_NAME.backup_$DATE.tar > /dev/null 2>&1 + mkdir -p $BACKUP_PATH + mv $APP_NAME.backup_$DATE.tar.zip $BACKUP_PATH + cd $TMP && rm -rf backup + + else + echo -e " ${YEL}No supported compression method detected! Copying backup uncompressed...${CRS}\n" + mkdir -p $BACKUP_PATH + mv $TMP/backup $BACKUP_PATH/$APP_NAME.backup_$DATE + cd $TMP && rm -rf backup + fi + + echo -e " - ${CRS}Backup stored in ${CYN}$BACKUP_PATH${CRS}...${CRS}\n" + cd $CWD + fi + + else + echo -e " ${YEL}Nothing to back up...${CRS}" fi } @@ -319,15 +411,14 @@ remove_helium() { if [ -d "$INSTALL_PATH" ] ; then while true ; do - read -p " Remove $APP_NAME_LONG incl. backups and launcher? (Y/n) : " CONFIRM_REMOVE + read -p " Remove $APP_NAME_LONG incl. backups, configuration and launcher? (Y/n) : " CONFIRM_REMOVE if [[ "$CONFIRM_REMOVE" == "" || "$CONFIRM_REMOVE" == "y" || "$CONFIRM_REMOVE" == "Y" ]] ; then - REMOVABLE=("$INSTALL_PATH" "$LAUNCHER_PATH/$APP_NAME.desktop" "$SCRIPT_PATH/$SCRIPT_FILE_NAME" "$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME") - echo + REMOVABLE=("$INSTALL_PATH" "$LAUNCHER_PATH/$APP_NAME.desktop" "$SCRIPT_PATH/$SCRIPT_FILE_NAME" "$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME" "$APP_CONFIG_PATH") + echo -e "\n - ${CRS}Removing ${CYN}$APP_NAME${CRS} directory and configuration...${CRS}" for RM_PATH in "${REMOVABLE[@]}" ; do if [[ -f "$RM_PATH" || -d "$RM_PATH" ]] ; then - echo -e " ${YEL}Removing ${CYN}$RM_PATH ${YEL}...${CRS}" rm -rf "$RM_PATH" fi done @@ -336,26 +427,28 @@ remove_helium() { if [ "$ACTIVE_SHELL" == "zsh" ] ; then if [ "$(cat $HOME/.zshrc | grep "$ALIAS")" ] ; then + sed -i "/$APP_NAME_LONG/d" $HOME/.zshrc sed -i "/$ALIAS/d" $HOME/.zshrc - echo -e "\n ${CYN}$ACTIVE_SHELL ${YEL}alias removed ... ${CRS}" + echo -e "\n - Alias removed from ${CYN}$ACTIVE_SHELL${CRS}" fi elif [ "$ACTIVE_SHELL" == "bash" ] ; then if [ "$(cat $HOME/.bashrc | grep "$ALIAS")" ] ; then + sed -i "/$APP_NAME_LONG/d" $HOME/.bashrc sed -i "/$ALIAS/d" $HOME/.bashrc - echo -e "\n ${CYN}$ACTIVE_SHELL ${YEL}alias removed ... ${CRS}" + echo -e "\n - Alias removed from ${CYN}$ACTIVE_SHELL${CRS}" fi elif [ "$ACTIVE_SHELL" == "fish" ] ; then if [ "$(cat $HOME/.config/fish/config.fish | grep "source $HOME/.config/fish/$ALIAS.fish")" ] ; then sed -i "/$ALIAS/d" $HOME/.config/fish/config.fish rm $HOME/.config/fish/$ALIAS.fish - echo -e "\n ${CYN}$ACTIVE_SHELL ${YEL}alias removed ... ${CRS}" + echo -e "\n - Alias removed from ${CYN}$ACTIVE_SHELL${CRS}" fi fi - echo -e "\n ${RED}$APP_NAME_LONG removed!${CRS}\n" - exit + echo -e "\n ${YEL}$APP_NAME_LONG removed!${CRS}\n" + break elif [[ "$CONFIRM_REMOVE" == "n" || "$CONFIRM_REMOVE" == "N" ]] ; then echo -e " ${RED}Cancelled!${CRS}" @@ -367,16 +460,14 @@ remove_helium() { done else - echo -e "\n ${RED}Can't remove $APP_NAME_LONG! ${YEL}$INSTALL_PATH ${RED}directory not found...${CRS}" + echo -e " ${RED}Can't remove $APP_NAME_LONG! ${CYN}$INSTALL_PATH ${RED}directory not found...${CRS}\n" exit fi } ### SCRIPT VERSION script_version() { - echo -e "\n ${CYN}$APP_NAME_LONG Helper Script Version :${CRS} $SCRIPT_VERSION\n" - exit - + echo -e "\n ${CYN}$APP_NAME_LONG Helper Script Version : ${CRS}$SCRIPT_VERSION\n" } ### UPDATE SCRIPT @@ -397,7 +488,7 @@ update_script() { chmod +x $TMP/$SCRIPT_FILE_NAME $TMP/$AUTO_SCRIPT_FILE_NAME mv $TMP/$SCRIPT_FILE_NAME $TMP/$AUTO_SCRIPT_FILE_NAME $SCRIPT_PATH echo -e "\n ${GRN}$SCRIPT_FILE_NAME is up-to-date!${CRS}" - exit_clean + break elif [[ "$CONFIRM_SCRIPT_INSTALL" == "n" || "$CONFIRM_SCRIPT_INSTALL" == "N" ]] ; then echo -e " ${RED}Cancelled!${CRS}\n" @@ -467,7 +558,7 @@ update_script() { fi } -### COMPARE APPIMAGE VERSION +### COMPARE APPIMAGE VERSIONarch_check compare_version() { LOCAL_VERSION=$($INSTALL_PATH/$APP_NAME.$FILE_EXTENSION --version | awk '{print $2}') APP_SOURCE_VERSION=$(curl -s $APP_SOURCE_URL | grep "tag_name" | tr -d \", | awk '{print $2}') @@ -490,19 +581,17 @@ compare_version() { echo -e "\n ${GRN}$APP_NAME_LONG is up-to-date!${CRS}\n" echo -e " ${CYN}Local Version :\t${CRS}${LOCAL_VERSION}" echo -e " ${CYN}$APP_SOURCE Version :\t${CRS}${APP_SOURCE_VERSION}\n" - exit elif [ "$APP_SOURCE_VERSION_NUM" -gt "$LOCAL_VERSION_NUM" ] ; then echo -e "\n ${YEL}$APP_NAME_LONG is updatable!${CRS}\n" echo -e " ${CYN}Local Version :\t${CRS}${LOCAL_VERSION}" echo -e " ${CYN}$APP_SOURCE Version :\t${CRS}${APP_SOURCE_VERSION}\n" - exit else echo -e "\n ${RED}Version tags malformed or you are using a Beta version!${CRS}\n" echo -e " ${CYN}Local Version :\t${CRS}${LOCAL_VERSION}" echo -e " ${CYN}$APP_SOURCE Version :\t${CRS}${APP_SOURCE_VERSION}\n" - echo -e " ${RED}Update failed ... Exiting ...${CRS}\n" + echo -e " ${RED}Update failed... Exiting...${CRS}\n" exit fi } @@ -517,7 +606,7 @@ help() { echo -e "\t-l\tCreate desktop launcher" echo -e "\t-a\tCreate alias for $SCRIPT_FILE_NAME" echo -e "\t-u\tDownload & update $APP_NAME_LONG from $APP_SOURCE" - #echo -e "\t-U\tEnable automatic updates on login ${RED}--> Not yet working${CRS}" + echo -e "\t-b\tBackup $APP_NAME_LONG & configuration" echo -e "\t-r\tRemove $APP_NAME_LONG" echo -e "\t-c\tCompare local to remote version" echo -e "\t-s\tShow script version" @@ -541,48 +630,54 @@ exit_clean() { ########## MAIN ########## ## GET OPTIONS -while getopts ":i,:l,:a,:u,:U,:r,:c,:s,:S,:h" OPTION ; do +while getopts ":i,:l,:a,:u,:b,:r,:c,:s,:S,:h" OPTION ; do case $OPTION in i) - echo -e "\n ${CYN}Installing $APP_NAME_LONG...${CRS}" + echo -e "\n ${YEL}Installing $APP_NAME_LONG...${CRS}\n" dependency_check + arch_check install_helium exit_clean ;; l) - echo -e "\n ${CYN}Adding $APP_NAME_LONG launcher...${CRS}" + echo -e "\n ${YEL}Adding $APP_NAME_LONG launcher...${CRS}" dependency_check local_check add_launcher exit_clean ;; a) - echo -e "\n ${CYN}Adding alias...${CRS}" + echo -e "\n ${YEL}Adding alias...${CRS}" + if [ "$2" ] ; then + ALIAS=$2 + fi shell_check add_alias exit ;; u) - echo -e "\n ${CYN}Updating $APP_NAME_LONG...${CRS}" + echo -e "\n ${YEL}Updating $APP_NAME_LONG...${CRS}" dependency_check + arch_check local_check update_helium exit_clean ;; - U) - echo -e "\n ${CYN}Enabling automatic updates...${CRS}" - dependency_check - local_check - auto_update - exit_clean ;; + b) + echo -e "\n ${YEL}Backing up $APP_NAME_LONG incl. configuration and script...${CRS}" + if [ "$2" ] ; then + BACKUP_PATH=$2 + fi + backup_helium + exit ;; r) - echo -e "\n ${CYN}Removing $APP_NAME_LONG...${CRS}" + echo -e "\n ${YEL}Removing $APP_NAME_LONG...${CRS}\n" remove_helium exit ;; c) - echo -e "\n ${CYN}Comparing remote to local version...${CRS}" + echo -e "\n ${YEL}Comparing remote to local version...${CRS}" dependency_check local_check compare_version @@ -593,7 +688,7 @@ while getopts ":i,:l,:a,:u,:U,:r,:c,:s,:S,:h" OPTION ; do exit ;; S) - echo -e "\n ${CYN}Updating script...${CRS}" + echo -e "\n ${YEL}Updating script...${CRS}" dependency_check update_script exit_clean ;; @@ -611,6 +706,7 @@ done ## DEPENDENCY CHECK dependency_check +arch_check ## CHECK FOR LOCAL INSTALL local_check From 3d4c84ef6c0e48239d89c7fa04e50462d310c23d Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Thu, 8 Jan 2026 23:43:56 +0100 Subject: [PATCH 04/22] Backup function added --- helium_launcher_update.sh | 131 +++++++++++++++++++++++++++++--------- 1 file changed, 102 insertions(+), 29 deletions(-) diff --git a/helium_launcher_update.sh b/helium_launcher_update.sh index 8123131..9e1e8b2 100755 --- a/helium_launcher_update.sh +++ b/helium_launcher_update.sh @@ -9,6 +9,7 @@ APP_NAME_LONG="Helium Web Browser" ARCH="x86_64" FILE_EXTENSION="AppImage" APP_SOURCE="GitHub" +NOTIFY_NAME="Helium Helper" SCRIPT_NAME="$APP_NAME Launcher Updater" PARENT_SCRIPT_FILE_NAME="helium_helper.sh" SCRIPT_FILE_NAME="helium_launcher_update.sh" @@ -65,7 +66,7 @@ dependency_check () { if [ -f "$TMP/missingDeps" ] ; then MISSING=$(cat $TMP/missingDeps) echo "$DATE | Failed to update - missing dependencies : $MISSING" >> $LOG - notify-send --icon="$ICON" --app-name="Helium Helper" "Update failed! See log for details" + notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Update failed! See log for details" exit_clean fi @@ -73,24 +74,107 @@ dependency_check () { if ! [ -d "$INSTALL_PATH" ] ; then mkdir -p $INSTALL_PATH echo "$DATE | Failed to update - $APP_NAME installation path not present - But created for logging" >> $LOG - notify-send --icon="$ICON" --app-name="Helium Helper" "Update failed! See log for details" + notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Update failed! See log for details" exit elif ! [ -f "$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" ] ; then echo "$DATE | Failed to update - Local $APP_NAME AppImage not found" >> $LOG - notify-send --icon="$ICON" --app-name="Helium Helper" "Update failed! See log for details" + notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Update failed! See log for details" exit fi } +### BACKUP +backup_helium() { + if [[ -d "$INSTALL_PATH" || -d "$SCRIPT_PATH" || -d $APP_CONFIG_PATH ]] ; then + BACKUPABLE=("$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" "$SCRIPT_PATH/$SCRIPT_FILE_NAME" "$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME" "$LAUNCHER_PATH/$APP_NAME.desktop" "$APP_CONFIG_PATH") + + for BACKUP_ITEM in ${BACKUPABLE[@]} ; do + if [ -d "$BACKUP_ITEM" ] ; then + mkdir -p $TMP/backup + cp -r $BACKUP_ITEM $TMP/backup + + elif [ -f "$BACKUP_ITEM" ] ; then + mkdir -p $TMP/backup + cp $BACKUP_ITEM $TMP/backup + fi + done + + if [ -d "$TMP/backup" ] ; then + CWD=$(pwd) + cd $TMP/backup + chmod -x *.sh *.$FILE_EXTENSION > /dev/null 2>&1 + + if [ "$BACKUP_COMPRESSION_OVERRIDE" ] ; then + BACKUP_COMPRESSION=$BACKUP_COMPRESSION_OVERRIDE + + elif ! [ "$BACKUP_COMPRESSION_OVERRIDE" ] ; then + COMPRESSION_METHOD=("pbzip2" "gzip" "bzip2" "zip") + + until [ "$BACKUP_COMPRESSION" ] ; do + for COMPRESSION_TYPE in ${COMPRESSION_METHOD[@]} ; do + + if [ "$(command -v $COMPRESSION_TYPE) > /dev/null 2>&1" ] ; then + BACKUP_COMPRESSION=$COMPRESSION_TYPE + break + fi + done + done + fi + + if [ "$BACKUP_COMPRESSION" == "pbzip2" ] ; then + tar -cf $APP_NAME.backup_$DATE.tar * > /dev/null 2>&1 + pbzip2 $APP_NAME.backup_$DATE.tar + mkdir -p $BACKUP_PATH + mv $APP_NAME.backup_$DATE.tar.bz2 $BACKUP_PATH + cd $TMP && rm -rf backup + + elif [ "$BACKUP_COMPRESSION" == "gzip" ] ; then + tar -cf $APP_NAME.backup_$DATE.tar * > /dev/null 2>&1 + gzip $APP_NAME.backup_$DATE.tar + mkdir -p $BACKUP_PATH + mv $APP_NAME.backup_$DATE.tar.gz $BACKUP_PATH + cd $TMP && rm -rf backup + + elif [ "$BACKUP_COMPRESSION" == "bzip2" ] ; then + tar -cf $APP_NAME.backup_$DATE.tar * > /dev/null 2>&1 + bzip2 $APP_NAME.backup_$DATE.tar + mkdir -p $BACKUP_PATH + mv $APP_NAME.backup_$DATE.tar.bz2 $BACKUP_PATH + cd $TMP && rm -rf backup + + elif [ "$BACKUP_COMPRESSION" == "zip" ] ; then + tar -cf $APP_NAME.backup_$DATE.tar * > /dev/null 2>&1 + zip -r $APP_NAME.backup_$DATE.tar.zip $APP_NAME.backup_$DATE.tar > /dev/null 2>&1 + mkdir -p $BACKUP_PATH + mv $APP_NAME.backup_$DATE.tar.zip $BACKUP_PATH + cd $TMP && rm -rf backup + + else + echo "$DATE | Backup - Backup (uncompressed) written to $BACKUP_PATH" >> $LOG + mkdir -p $BACKUP_PATH + mv $TMP/backup $BACKUP_PATH/$APP_NAME.backup_$DATE + cd $TMP && rm -rf backup + fi + + echo "$DATE | Backup - Backup (compressed $BACKUP_COMPRESSION archive) written to $BACKUP_PATH" >> $LOG + notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Backup created" + cd $CWD + fi + + else + echo "$DATE | Failed to backup - Nothing worth backing up found" >> $LOG + fi +} + ### UPDATE SCRIPT update_script() { ### CHECK FOR LOCAL SCRIPT if ! [ -f "$SCRIPT_PATH/$SCRIPT_FILE_NAME" ] ; then echo "$DATE | Failed to update script - local file not found" >> $LOG - notify-send --icon="$ICON" --app-name="Helium Helper" "Script update failed! See log for details" + notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Script update failed! See log for details" exit fi @@ -100,12 +184,12 @@ update_script() { ### CHECK FOR EMPTY VERSION TAGS if [ -z "$SCRIPT_VERSION" ] ; then echo "$DATE | Failed to update script - Empty version tag --> local" >> $LOG - notify-send --icon="$ICON" --app-name="Helium Helper" "Script update failed! See log for details" + notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Script update failed! See log for details" exit elif [ -z "$REMOTE_SCRIPT_VERSION" ] ; then echo "$DATE | Failed to update script - Empty version tag --> $APP_SOURCE" >> $LOG - notify-send --icon="$ICON" --app-name="Helium Helper" "Script update failed! See log for details" + notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Script update failed! See log for details" exit fi @@ -115,7 +199,7 @@ update_script() { REMOTE_SCRIPT_VERSION_NUM=$(echo $REMOTE_SCRIPT_VERSION | tr -d .) if [ "$REMOTE_SCRIPT_VERSION" == "$SCRIPT_VERSION" ] ; then - notify-send --icon="$ICON" --app-name="Helium Helper" "Script is up-to-date" + notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Script is up-to-date" elif [ "$REMOTE_SCRIPT_VERSION_NUM" -gt "$SCRIPT_VERSION_NUM" ] ; then mv $SCRIPT_PATH/$SCRIPT_FILE_NAME $BACKUP_PATH/$SCRIPT_FILE_NAME.old @@ -125,13 +209,13 @@ update_script() { chmod +x $TMP/$SCRIPT_FILE_NAME $TMP/$PARENT_SCRIPT_FILE_NAME mv $TMP/$SCRIPT_FILE_NAME $TMP/$PARENT_SCRIPT_FILE_NAME $SCRIPT_PATH echo "$DATE | Script updated to version $REMOTE_SCRIPT_VERSION" >> $LOG - notify-send --icon="$ICON" --app-name="Helium Helper" "Script updated to version $REMOTE_SCRIPT_VERSION" + notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Script updated to version $REMOTE_SCRIPT_VERSION" else echo "$DATE | Failed to update - Malformed version tags" >> $LOG echo "$DATE | Remote Version: $REMOTE_SCRIPT_VERSION" >> $LOG echo "$DATE | Local Version: $SCRIPT_VERSION" >> $LOG - notify-send --icon="$ICON" --app-name="Helium Helper" "Script update failed! See log for details" + notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Script update failed! See log for details" fi } @@ -145,12 +229,12 @@ update_helium() { ### CHECK FOR EMPTY VERSION TAGS if [[ -z "$APP_SOURCE_VERSION" ]] ; then echo "$DATE | Failed to update - Empty version tag --> $APP_SOURCE" >> $LOG - notify-send --icon="$ICON" --app-name="Helium Helper" "Browser update failed! See log for details" + notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Browser update failed! See log for details" exit elif [[ -z "$LOCAL_VERSION" ]] ; then echo "$DATE | Failed to update - Empty version tag --> LOCAL" >> $LOG - notify-send --icon="$ICON" --app-name="Helium Helper" "Browser update failed! See log for details" + notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Browser update failed! See log for details" exit fi @@ -160,32 +244,21 @@ update_helium() { APP_SOURCE_VERSION_NUM=$(echo $APP_SOURCE_VERSION | tr -d .) if [ "$APP_SOURCE_VERSION" == "$LOCAL_VERSION" ] ; then - notify-send --icon="$ICON" --app-name="Helium Helper" "Browser is up-to-date" + notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Browser is up-to-date" elif [ "$APP_SOURCE_VERSION_NUM" -gt "$LOCAL_VERSION_NUM" ] ; then - mkdir -p $TMP $BACKUP_PATH - wget -P $TMP $DOWNLOAD_URL -q --show-progress + mkdir -p $TMP + wget -P $TMP $DOWNLOAD_URL -q chmod +x $TMP/$APP_SOURCE_FILENAME - if [ -f "$BACKUP_PATH/$APP_NAME.old" ] ; then - rm $BACKUP_PATH/$APP_NAME.old - fi - if [ -d "$APP_CONFIG_PATH" ] ; then - if [ -f "$BACKUP_PATH/$APP_NAME.config_*.tar" ] ; then - rm $BACKUP_PATH/$APP_NAME.config_*.tar - fi - tar -cf $BACKUP_PATH/$APP_NAME.config_$(date).tar $APP_CONFIG_PATH > /dev/null 2>&1 - fi - mv $INSTALL_PATH/$APP_NAME.$FILE_EXTENSION $BACKUP_PATH/$APP_NAME.$FILE_EXTENSION.old + backup_helium mv $TMP/$APP_SOURCE_FILENAME $INSTALL_PATH/$APP_NAME.$FILE_EXTENSION - cp $LAUNCHER_PATH/$APP_NAME.desktop $BACKUP_PATH/$APP_NAME.desktop.old - chmod -x $BACKUP_PATH/*.sh.old $BACKUP_PATH/$APP_NAME.old sed -i "s|X-AppImage-Version=.*|X-AppImage-Version=$($INSTALL_PATH/$APP_NAME.$FILE_EXTENSION --version | awk '{print $2}')|" $LAUNCHER_PATH/$APP_NAME.desktop echo "$DATE | $APP_NAME updated to version ${APP_SOURCE_VERSION}" >> $LOG - notify-send --icon="$ICON" --app-name="Helium Helper" "Browser updated to version $APP_SOURCE_VERSION" + notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Browser updated to version $APP_SOURCE_VERSION" else echo "$DATE | Failed to update - Version tags malformed" >> $LOG - notify-send --icon="$ICON" --app-name="Helium Helper" "Browser update failed! See log for details" + notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Browser update failed! See log for details" exit fi @@ -204,7 +277,7 @@ show_log() { xdg-open $LOG else - notify-send --icon="$ICON" --app-name="Helium Helper" "No log created yet" + notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "No log created yet" fi } From 6c91e896bc8ae8f43a751703225f9778b130dc61 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Thu, 8 Jan 2026 23:44:14 +0100 Subject: [PATCH 05/22] update --- devdoc.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/devdoc.md b/devdoc.md index 87e8051..33eb1cb 100644 --- a/devdoc.md +++ b/devdoc.md @@ -32,9 +32,16 @@ - Alias support for fish added - Removal process refined and adapted to fish - Browser config backup +--- +- Arch detection working +- Clean Up +- Copy Paste mistake fixed +- Backup process rewritten + - Custom backup path reserved in `$2` + - Default if left blank +- Removal process adjusted ## Add/To Do -- Architecture detection - Roll back from backup - Config check - Update Readme From 90dd1ea68b20c5ac32b5da926429ad2c62243ffb Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Fri, 9 Jan 2026 00:10:56 +0100 Subject: [PATCH 06/22] Readme updated --- README.md | 60 ++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 39 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index f6587f6..b39cc9b 100644 --- a/README.md +++ b/README.md @@ -17,9 +17,14 @@ Run script with install parameter _-i_ ```sh ./helium_helper.sh -i ``` -Add alias to `.shellrc` | _optional_ +OPTIONAL : Add alias to `.shellrc` | _working in zsh, bash & fish_ +- Default alias ```sh -./helium_helper.sh -a ### ONLY TESTED WITH zsh & bash +./helium_helper.sh -a +``` +- Custom alias +```sh +./helium_helper.sh -a ``` --- ### Updating @@ -30,27 +35,40 @@ Checking for the latest version and updating can simply be done for the browser **Terminal** Updating can also be done by running: +- Update Helium Browser ```sh -./helium_helper.sh -u ### UPDATE APP +./helium_helper.sh -u ``` +- Update Helium Helper ```sh -./helium_helper.sh -S ### UPDATE SCRIPT +./helium_helper.sh -S +``` + +### Backing up +Backing up pulls all important files, folders & configuration and compresses an archive. By default it will be stored in `$HOME/.apps/Helium/assets` +- Backup to default path +```sh +./helium_helper.sh -b +``` +- Backup to custom path +```sh +./helium_helper.sh -b ``` Since this script is interactive, it doesn't keep logs. ## Overview ### Helium_Helper.sh - Interactive installer, updater & configuration script -- Installs to `/home//.apps/Helium` | changeable in line 28 `INSTALL_PATH` +- Installs to `$HOME/.apps/Helium` | changeable in line 31 `INSTALL_PATH` - Assumes: - - Presence of `/home//.apps/Helium` when updating | changeable in line 28 `INSTALL_PATH` + - Presence of `$HOME/.apps/Helium` when updating | changeable in line 31 `INSTALL_PATH` - Executable named `Helium.AppImage` -- Keeps backups of - - `Helium.AppImage` --> `Helium.AppImage.old` - - `helium_helper.sh` --> `helium_helper.sh.old` - - `helium_launcher_update.sh` --> `helium_launcher_update.sh.old` - - `Helium.desktop` --> `Helium.desktop.old` - which will be overwritten at every update -- Adds desktop launcher to `/home//.local/share/applications` +- Keeps backup archives from + - `Helium.AppImage` + - `helium_helper.sh` + - `helium_launcher_update.sh` + - `Helium.desktop` + - `net.imput.helium` +- Adds desktop launcher to `$HOME/.local/share/applications` - Adds options to launcher which are run by `helium_launcher_updater.sh` - Update Helium - Update Script @@ -60,14 +78,14 @@ Since this script is interactive, it doesn't keep logs. ### Helium_Launcher_Update.sh - Update Helium from launcher - Assumes: - - Presence of `/home//.apps/Helium` when updating | changeable in line 19 `INSTALL_PATH` + - Presence of `$HOME/.apps/Helium` when updating | changeable in line 21 `INSTALL_PATH` - Executable named `Helium.AppImage` -- Loggs to `/home//.apps/Helium/assets/logs` -- Keeps backups of - - `Helium.AppImage` --> `Helium.AppImage.old` - - `helium_helper.sh` --> `helium_helper.sh.old` - - `helium_launcher_update.sh` --> `helium_launcher_update.sh.old` - - `Helium.desktop` --> `Helium.desktop.old` - which will be overwritten at every update +- Loggs to `$HOME/.apps/Helium/assets/logs` +- Keeps backup archives from + - `Helium.AppImage` + - `helium_helper.sh` + - `helium_launcher_update.sh` + - `Helium.desktop` + - `net.imput.helium` - Run `helium_launcher_update.sh -h` for help   \ No newline at end of file From 6eaf261db2ead95bb83f2565b95e6b4f40432fc8 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Fri, 9 Jan 2026 00:14:29 +0100 Subject: [PATCH 07/22] Readme updated --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b39cc9b..d48821b 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,11 @@ This script was initially designed to just update my Helium browser but over tim With "little" tinkering it should be possible to apply this script to install, update & configure many kinds of releases from source, like Debian packages, AppImages, binaries, etc... ## Usage -Help +### Help ```sh ./helium_helper.sh -h ``` +--- ### First Install To initally install Helium browser via this script, download helium_helper.sh and make it executable: ```sh @@ -43,7 +44,7 @@ Updating can also be done by running: ```sh ./helium_helper.sh -S ``` - +--- ### Backing up Backing up pulls all important files, folders & configuration and compresses an archive. By default it will be stored in `$HOME/.apps/Helium/assets` - Backup to default path From c12ea4e331961db4328909cfa19c9271b9e8b2ab Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Fri, 9 Jan 2026 00:16:24 +0100 Subject: [PATCH 08/22] Readme updated --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d48821b..bc6cf7f 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ Run script with install parameter _-i_ ./helium_helper.sh -i ``` OPTIONAL : Add alias to `.shellrc` | _working in zsh, bash & fish_ -- Default alias +- Default alias = _update-helium_ ```sh ./helium_helper.sh -a ``` From 2cae941eea929fa0f9000c05b444f5cee2e97abd Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Fri, 9 Jan 2026 00:24:30 +0100 Subject: [PATCH 09/22] Typo fixed --- helium_helper.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helium_helper.sh b/helium_helper.sh index d13b25f..53e739f 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -325,7 +325,7 @@ update_helium() { backup_helium() { if [[ -d "$INSTALL_PATH" || -d "$SCRIPT_PATH" || -d $APP_CONFIG_PATH ]] ; then BACKUPABLE=("$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" "$SCRIPT_PATH/$SCRIPT_FILE_NAME" "$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME" "$LAUNCHER_PATH/$APP_NAME.desktop" "$APP_CONFIG_PATH") - echo -e "\n - ${CRS}Collectig files for ${CYN}backup${CRS}...${CRS}" + echo -e "\n - ${CRS}Collecting files for ${CYN}backup${CRS}...${CRS}" for BACKUP_ITEM in ${BACKUPABLE[@]} ; do if [ -d "$BACKUP_ITEM" ] ; then From ebc4809ef3d3839ab23cb47cd009624eaf4f0da3 Mon Sep 17 00:00:00 2001 From: Fr4nzD13trich Date: Sat, 10 Jan 2026 12:06:50 +0100 Subject: [PATCH 10/22] Readme updated --- README.md | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index bc6cf7f..66e4c18 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Helium Bowser installer & updater ## Purpose -This script was initially designed to just update my Helium browser but over time and interest it got more functional and universal. It includes functions to install, update, remove, add launcher, etc... and is distro independent. +This script was initially designed to just update my Helium browser but over time and interest it got more functional and universal. It includes functions to install, update, remove, add launcher, etc... It's supposed to run in user space and is (Linux) distro independent I suppose. With "little" tinkering it should be possible to apply this script to install, update & configure many kinds of releases from source, like Debian packages, AppImages, binaries, etc... ## Usage @@ -15,21 +15,20 @@ To initally install Helium browser via this script, download helium_helper.sh an wget https://lab.c95.org/fr4nz/helium-helper/raw/branch/main/helium_helper.sh && chmod +x helium_helper.sh ``` Run script with install parameter _-i_ +- Default install directory = `$HOME/.apps/Helium` ```sh ./helium_helper.sh -i ``` -OPTIONAL : Add alias to `.shellrc` | _working in zsh, bash & fish_ -- Default alias = _update-helium_ + +**OPTIONAL** : Add alias to `.shellrc` | _working in zsh, bash & fish_ +- Default alias = `update-helium` ```sh ./helium_helper.sh -a ``` -- Custom alias -```sh -./helium_helper.sh -a -``` + --- ### Updating -**From launcher** (if added) +**From launcher** (if added during install or by running `./helium_helper.sh -l`) Checking for the latest version and updating can simply be done for the browser as well as the script by right clicking the app icon and choosing either update option, which will be run by `helium_launcher_update.sh`. This will backup all files that are being updated and write a log. @@ -46,8 +45,8 @@ Updating can also be done by running: ``` --- ### Backing up -Backing up pulls all important files, folders & configuration and compresses an archive. By default it will be stored in `$HOME/.apps/Helium/assets` -- Backup to default path +Backing up, by default, pulls all important files, folders & configuration and compresses an archive, which is stored in `$HOME/.apps/Helium/assets` +- Default backup ```sh ./helium_helper.sh -b ``` @@ -55,13 +54,15 @@ Backing up pulls all important files, folders & configuration and compresses an ```sh ./helium_helper.sh -b ``` -Since this script is interactive, it doesn't keep logs. +**NOTE:** The backup path specified won't be overridden within the script yet. Working on it... + +**Since this script is interactive, it doesn't keep logs.** ## Overview ### Helium_Helper.sh - Interactive installer, updater & configuration script -- Installs to `$HOME/.apps/Helium` | changeable in line 31 `INSTALL_PATH` +- Installs to `$HOME/.apps/Helium` | changeable in line 32 `INSTALL_PATH` - Assumes: - - Presence of `$HOME/.apps/Helium` when updating | changeable in line 31 `INSTALL_PATH` + - Presence of `$HOME/.apps/Helium` when updating | changeable in line 32 `INSTALL_PATH` - Executable named `Helium.AppImage` - Keeps backup archives from - `Helium.AppImage` From 1a253d6de5bde995faea26e01b160673930c0f0b Mon Sep 17 00:00:00 2001 From: Fr4nzD13trich Date: Sat, 10 Jan 2026 12:07:17 +0100 Subject: [PATCH 11/22] Docu updated --- devdoc.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/devdoc.md b/devdoc.md index 33eb1cb..17b5150 100644 --- a/devdoc.md +++ b/devdoc.md @@ -37,13 +37,16 @@ - Clean Up - Copy Paste mistake fixed - Backup process rewritten - - Custom backup path reserved in `$2` + - Custom backup method to pass as argument + - Custom backup path to pass as argument - Default if left blank - Removal process adjusted +- $1 verifier added +- Readme updated + ## Add/To Do - Roll back from backup -- Config check - Update Readme - Make functional launcher optional From 88510e971a3274693e1161a9cfd90453af1534f2 Mon Sep 17 00:00:00 2001 From: Fr4nzD13trich Date: Sat, 10 Jan 2026 12:58:37 +0100 Subject: [PATCH 12/22] Backup process refined --- helium_helper.sh | 367 ++++++++++++++++++++++++-------------- helium_launcher_update.sh | 39 ++-- 2 files changed, 257 insertions(+), 149 deletions(-) diff --git a/helium_helper.sh b/helium_helper.sh index 53e739f..86f99d2 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -18,11 +18,12 @@ APP_NAME_LONG="Helium Web Browser" FILE_EXTENSION="AppImage" APP_SOURCE="GitHub" ARCH_OVERRIDE="" +BACKUP_METHOD="full" BACKUP_COMPRESSION_OVERRIDE="" SCRIPT_NAME="$APP_NAME Helper Script" SCRIPT_FILE_NAME="helium_helper.sh" AUTO_SCRIPT_FILE_NAME="helium_launcher_update.sh" -SCRIPT_VERSION="0.5.8" +SCRIPT_VERSION="0.5.9" ALIAS="update-helium" DATE=$(date +"%d%m%y") @@ -47,10 +48,8 @@ APP_SOURCE_URL=https://api.github.com/repos/imputnet/helium-linux/releases/lates ### DEPENDENCIES cmd_query() { - #local PACKAGE=$1 - - if ! command -v $PACKAGE > /dev/null 2>&1 ; then - echo " - $PACKAGE" >> $TMP/missingDeps + if ! command -v $PACKAGE > /dev/null 2>&1 ; then + echo " - $PACKAGE" >> $TMP/missingDeps fi } @@ -65,15 +64,13 @@ dependency_check () { if [ -f "$TMP/missingDeps" ] ; then MISSING=$(cat $TMP/missingDeps) - echo -e "\n ${RED}Following dependencies are missing :\n\n${CRS}$MISSING\n\n ${CYN}Please install and re-run script !${CRS}" + echo -e " ${RED}Following dependencies are missing :\n\n${CRS}$MISSING\n\n ${CYN}Please install and re-run script !${CRS}\n" exit_clean fi } ### SHELL CHECK shell_query() { - #local SHELL_OPTION=$1 - if [ "$(echo $SHELL | grep "$SHELL_OPTION")" ] ; then ACTIVE_SHELL=$SHELL_OPTION fi @@ -89,7 +86,6 @@ shell_check() { } ### ARCH CHECK - arch_check() { if [ "$ARCH_OVERRIDE" ] ; then ARCH=$ARCH_OVERRIDE @@ -109,21 +105,21 @@ arch_check() { local_check() { if ! [ -d "$INSTALL_PATH" ] ; then echo -e "\n ${YEL}$APP_NAME_LONG directory not found!${CRS}\n" - install_helium + install_application exit elif ! [ -f "$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" ] ; then echo -e "\n ${YEL}$APP_NAME_LONG directory found but no executable named ${CYN}$APP_NAME.$FILE_EXTENSION${YEL}!${CRS}\n" - install_helium + install_application exit fi } ### INSTALL -install_helium() { +install_application() { if [ -f "$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" ] ; then - echo -e "\n ${YEL}$APP_NAME_LONG AppImage found! Trying to update...${CRS}" - update_helium + echo -e " ${YEL}$APP_NAME_LONG AppImage found! Trying to update...${CRS}" + update_application exit fi @@ -149,7 +145,6 @@ install_helium() { else echo -e "\n ${YEL}Invalid response!${CRS}\n" fi - done } @@ -197,12 +192,11 @@ add_launcher() { else echo -e " ${YEL}Invalid response!${CRS}\n" fi - done else echo -e "\n ${RED}$APP_NAME_LONG AppImage not found! Can't add launcher...${CRS}" - install_helium + install_application exit fi } @@ -260,7 +254,7 @@ add_alias() { } ### UPDATE -update_helium() { +update_application() { LOCAL_VERSION=$($INSTALL_PATH/$APP_NAME.$FILE_EXTENSION --version | awk '{print $2}') APP_SOURCE_VERSION=$(curl -s $APP_SOURCE_URL | grep "tag_name" | tr -d \", | awk '{print $2}') @@ -283,8 +277,7 @@ update_helium() { elif [ "$APP_SOURCE_VERSION_NUM" -gt "$LOCAL_VERSION_NUM" ] ; then echo -e "\n ${LCY}$APP_NAME_LONG is updatable!${CRS}\n" - echo -e " ${CYN}Local Version :\t${CRS}${LOCAL_VERSION}" - echo -e " ${CYN}$APP_SOURCE Version :\t${CRS}${APP_SOURCE_VERSION}\n" + app_version_info while true ; do read -p " Download and update $APP_NAME_LONG from $APP_SOURCE? (Y/n) : " CONFIRM @@ -295,7 +288,7 @@ update_helium() { mkdir -p $TMP echo -e "\n - Downloading ${CYN}$APP_SOURCE_FILENAME${CRS}..." wget -P $TMP $DOWNLOAD_URL -q - backup_helium + full_backup chmod +x $TMP/$APP_SOURCE_FILENAME mv $TMP/$APP_SOURCE_FILENAME $INSTALL_PATH/$APP_NAME.$FILE_EXTENSION sed -i "s|X-AppImage-Version=.*|X-AppImage-Version=$($INSTALL_PATH/$APP_NAME.$FILE_EXTENSION --version | awk '{print $2}')|" $LAUNCHER_PATH/$APP_NAME.desktop @@ -313,109 +306,182 @@ update_helium() { else echo -e "\n ${RED}Version tags malformed or you are using a Beta version!${CRS}\n" - echo -e " ${CYN}Local Version :\t${CRS}${LOCAL_VERSION}" - echo -e " ${CYN}$APP_SOURCE Version :\t${CRS}${APP_SOURCE_VERSION}\n" + app_version_info echo -e " ${RED}Update failed... Exiting...${CRS}\n" exit fi - } ### BACKUP -backup_helium() { - if [[ -d "$INSTALL_PATH" || -d "$SCRIPT_PATH" || -d $APP_CONFIG_PATH ]] ; then - BACKUPABLE=("$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" "$SCRIPT_PATH/$SCRIPT_FILE_NAME" "$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME" "$LAUNCHER_PATH/$APP_NAME.desktop" "$APP_CONFIG_PATH") - echo -e "\n - ${CRS}Collecting files for ${CYN}backup${CRS}...${CRS}" +call_backup() { + if [ -f $BACKUP_PATH\/$APP_NAME\.$BACKUP_METHOD\.backup_* ] ; then + echo -e "\n ${CYN}A $BACKUP_METHOD backup already exists!${CRS}\n" - for BACKUP_ITEM in ${BACKUPABLE[@]} ; do - if [ -d "$BACKUP_ITEM" ] ; then - mkdir -p $TMP/backup - cp -r $BACKUP_ITEM $TMP/backup + while true ; do + read -p " Overwrite backup? (y/N) : " OVERWRITE_BACKUP - elif [ -f "$BACKUP_ITEM" ] ; then - mkdir -p $TMP/backup - cp $BACKUP_ITEM $TMP/backup + if [[ "$OVERWRITE_BACKUP" == "" || "$OVERWRITE_BACKUP" == "n" || "$OVERWRITE_BACKUP" == "N" ]] ; then + echo -e "\n ${YEL}Skipping backup process...${CRS}\n" + break + + elif [[ "$OVERWRITE_BACKUP" == "y" || "$OVERWRITE_BACKUP" == "Y" ]] ; then + echo -e "\n ${YEL}Overwriting backup...${CRS}" + rm $BACKUP_PATH/$APP_NAME.$BACKUP_METHOD.backup_* + ${BACKUP_METHOD}_backup + break + + else + echo -e "\n ${YEL}Invalid response!${CRS}\n" fi done - if [ -d "$TMP/backup" ] ; then - CWD=$(pwd) - cd $TMP/backup - chmod -x *.sh *.$FILE_EXTENSION > /dev/null 2>&1 + else + ${BACKUP_METHOD}_backup + fi +} - if [ "$BACKUP_COMPRESSION_OVERRIDE" ] ; then - BACKUP_COMPRESSION=$BACKUP_COMPRESSION_OVERRIDE +backup_file_collector() { + for BACKUP_ITEM in ${BACKUPABLE[@]} ; do - elif ! [ "$BACKUP_COMPRESSION_OVERRIDE" ] ; then - COMPRESSION_METHOD=("pbzip2" "gzip" "bzip2" "zip") + if [ -d "$BACKUP_ITEM" ] ; then + mkdir -p $TMP/backup + cp -r $BACKUP_ITEM $TMP/backup - until [ "$BACKUP_COMPRESSION" ] ; do - for COMPRESSION_TYPE in ${COMPRESSION_METHOD[@]} ; do - - if [ "$(command -v $COMPRESSION_TYPE) > /dev/null 2>&1" ] ; then - BACKUP_COMPRESSION=$COMPRESSION_TYPE - break - fi - done - done - fi - - echo -e "\n - ${CRS}Compressing backup archive with ${CYN}$BACKUP_COMPRESSION${CRS}...${CRS}\n" - - if [ "$BACKUP_COMPRESSION" == "pbzip2" ] ; then - tar -cf $APP_NAME.backup_$DATE.tar * > /dev/null 2>&1 - pbzip2 $APP_NAME.backup_$DATE.tar - mkdir -p $BACKUP_PATH - mv $APP_NAME.backup_$DATE.tar.bz2 $BACKUP_PATH - cd $TMP && rm -rf backup - - elif [ "$BACKUP_COMPRESSION" == "gzip" ] ; then - tar -cf $APP_NAME.backup_$DATE.tar * > /dev/null 2>&1 - gzip $APP_NAME.backup_$DATE.tar - mkdir -p $BACKUP_PATH - mv $APP_NAME.backup_$DATE.tar.gz $BACKUP_PATH - cd $TMP && rm -rf backup - - elif [ "$BACKUP_COMPRESSION" == "bzip2" ] ; then - tar -cf $APP_NAME.backup_$DATE.tar * > /dev/null 2>&1 - bzip2 $APP_NAME.backup_$DATE.tar - mkdir -p $BACKUP_PATH - mv $APP_NAME.backup_$DATE.tar.bz2 $BACKUP_PATH - cd $TMP && rm -rf backup - - elif [ "$BACKUP_COMPRESSION" == "zip" ] ; then - tar -cf $APP_NAME.backup_$DATE.tar * > /dev/null 2>&1 - zip -r $APP_NAME.backup_$DATE.tar.zip $APP_NAME.backup_$DATE.tar > /dev/null 2>&1 - mkdir -p $BACKUP_PATH - mv $APP_NAME.backup_$DATE.tar.zip $BACKUP_PATH - cd $TMP && rm -rf backup - - else - echo -e " ${YEL}No supported compression method detected! Copying backup uncompressed...${CRS}\n" - mkdir -p $BACKUP_PATH - mv $TMP/backup $BACKUP_PATH/$APP_NAME.backup_$DATE - cd $TMP && rm -rf backup - fi - - echo -e " - ${CRS}Backup stored in ${CYN}$BACKUP_PATH${CRS}...${CRS}\n" - cd $CWD + elif [ -f "$BACKUP_ITEM" ] ; then + mkdir -p $TMP/backup + cp $BACKUP_ITEM $TMP/backup fi + done +} + +script_backup() { + if [ -d "$SCRIPT_PATH" ] ; then + BACKUPABLE=("$SCRIPT_PATH/$SCRIPT_FILE_NAME" "$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME") + echo -e "\n - ${CRS}Collecting files for ${CYN}$BACKUP_METHOD${CRS} backup...${CRS}" + backup_file_collector + pack_backup else echo -e " ${YEL}Nothing to back up...${CRS}" fi } +app_backup() { + if [ -f "$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" ] ; then + BACKUPABLE=("$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION") + echo -e "\n - ${CRS}Collecting files for ${CYN}$BACKUP_METHOD${CRS} backup...${CRS}" + backup_file_collector + pack_backup + + else + echo -e " ${YEL}Nothing to back up...${CRS}" + fi +} + +config_backup() { + if [[ -d "$LAUNCHER_PATH" || -d $APP_CONFIG_PATH ]] ; then + BACKUPABLE=("$LAUNCHER_PATH/$APP_NAME.desktop" "$APP_CONFIG_PATH") + echo -e "\n - ${CRS}Collecting files for ${CYN}$BACKUP_METHOD${CRS} backup...${CRS}" + backup_file_collector + pack_backup + + else + echo -e " ${YEL}Nothing to back up...${CRS}" + fi +} + +full_backup() { + if [[ -d "$INSTALL_PATH" || -d "$SCRIPT_PATH" || -d $APP_CONFIG_PATH ]] ; then + BACKUPABLE=("$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" "$SCRIPT_PATH/$SCRIPT_FILE_NAME" "$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME" "$LAUNCHER_PATH/$APP_NAME.desktop" "$APP_CONFIG_PATH") + echo -e "\n - ${CRS}Collecting files for ${CYN}$BACKUP_METHOD${CRS} backup...${CRS}" + backup_file_collector + pack_backup + + else + echo -e " ${YEL}Nothing to back up...${CRS}" + fi +} + +pack_backup() { + if [ -d "$TMP/backup" ] ; then + CWD=$(pwd) + cd $TMP/backup + + if [[ -f "*.sh" ]] ; then + chmod -x *.sh + + elif [[ -f "*.$FILE_EXTENSION" ]] ; then + chmod -x *.$FILE_EXTENSION + fi + + if [ "$BACKUP_COMPRESSION_OVERRIDE" ] ; then + BACKUP_COMPRESSION=$BACKUP_COMPRESSION_OVERRIDE + + else + COMPRESSION_METHOD=("pbzip2" "gzip" "bzip2" "zip") + + until [ "$BACKUP_COMPRESSION" ] ; do + for COMPRESSION_TYPE in ${COMPRESSION_METHOD[@]} ; do + + if [ "$(command -v $COMPRESSION_TYPE) > /dev/null 2>&1" ] ; then + BACKUP_COMPRESSION=$COMPRESSION_TYPE + break + fi + done + done + fi + + echo -e "\n - ${CRS}Compressing backup archive with ${CYN}$BACKUP_COMPRESSION${CRS}...${CRS}\n" + + if [ "$BACKUP_COMPRESSION" == "pbzip2" ] ; then + tar -cf $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar * > /dev/null 2>&1 + pbzip2 $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar + mkdir -p $BACKUP_PATH + mv $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar.bz2 $BACKUP_PATH + cd $TMP && rm -rf backup + + elif [ "$BACKUP_COMPRESSION" == "gzip" ] ; then + tar -cf $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar * > /dev/null 2>&1 + gzip $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar + mkdir -p $BACKUP_PATH + mv $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar.gz $BACKUP_PATH + cd $TMP && rm -rf backup + + elif [ "$BACKUP_COMPRESSION" == "bzip2" ] ; then + tar -cf $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar * > /dev/null 2>&1 + bzip2 $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar + mkdir -p $BACKUP_PATH + mv $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar.bz2 $BACKUP_PATH + cd $TMP && rm -rf backup + + elif [ "$BACKUP_COMPRESSION" == "zip" ] ; then + zip -r $APP_NAME.$BACKUP_METHOD.backup_$DATE.zip $APP_NAME.$BACKUP_METHOD.backup_$DATE > /dev/null 2>&1 + mkdir -p $BACKUP_PATH + mv $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar.zip $BACKUP_PATH + cd $TMP && rm -rf backup + + else + echo -e " ${YEL}No supported compression method detected! Copying backup uncompressed...${CRS}\n" + mkdir -p $BACKUP_PATH + mv $TMP/backup $BACKUP_PATH/$APP_NAME.$BACKUP_METHOD.backup_$DATE + cd $TMP && rm -rf backup + fi + + echo -e " - ${CRS}Backup stored in ${CYN}$BACKUP_PATH${CRS}...${CRS}\n" + cd $CWD + fi +} + ### REMOVE -remove_helium() { +remove_application() { if [ -d "$INSTALL_PATH" ] ; then while true ; do read -p " Remove $APP_NAME_LONG incl. backups, configuration and launcher? (Y/n) : " CONFIRM_REMOVE if [[ "$CONFIRM_REMOVE" == "" || "$CONFIRM_REMOVE" == "y" || "$CONFIRM_REMOVE" == "Y" ]] ; then - REMOVABLE=("$INSTALL_PATH" "$LAUNCHER_PATH/$APP_NAME.desktop" "$SCRIPT_PATH/$SCRIPT_FILE_NAME" "$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME" "$APP_CONFIG_PATH") - echo -e "\n - ${CRS}Removing ${CYN}$APP_NAME${CRS} directory and configuration...${CRS}" + REMOVABLE=("$INSTALL_PATH" "$LAUNCHER_PATH/$APP_NAME.desktop" "$APP_CONFIG_PATH" "$SCRIPT_PATH/$SCRIPT_FILE_NAME" "$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME") + echo -e "\n - ${CRS}Removing ${CYN}$APP_NAME_LONG${CRS} files, directories and configuration...${CRS}" for RM_PATH in "${REMOVABLE[@]}" ; do if [[ -f "$RM_PATH" || -d "$RM_PATH" ]] ; then @@ -471,8 +537,13 @@ script_version() { } ### UPDATE SCRIPT +scrip_version_info() { + echo -e " - ${CYN}Local Version :\t${CRS}$SCRIPT_VERSION" + echo -e " - ${CYN}Remote Version :\t${CRS}$REMOTE_SCRIPT_VERSION" + echo -e " - ${CYN}Update Branch :\t${CRS}$REMOTE_REPO_BRANCH\n" +} + update_script() { - ### CHECK FOR LOCAL SCRIPT if ! [ -f "$SCRIPT_PATH/$SCRIPT_FILE_NAME" ] ; then echo -e "\n ${YEL}$SCRIPT_FILE_NAME not found...${CRS}" @@ -520,9 +591,8 @@ update_script() { echo -e "\n ${GRN}$SCRIPT_FILE_NAME is already up-to-date!${CRS}\n" elif [ "$REMOTE_SCRIPT_VERSION_NUM" -gt "$SCRIPT_VERSION_NUM" ] ; then - echo -e "\n ${YEL}$SCRIPT_FILE_NAME is updatable!${CRS}\n" - echo -e " ${CYN}Local Version :\t${CRS}${SCRIPT_VERSION}" - echo -e " ${CYN}Remote Version :\t${CRS}${REMOTE_SCRIPT_VERSION}\n" + echo -e "\n ${LCY}$SCRIPT_FILE_NAME is updatable!${CRS}\n" + scrip_version_info while true ; do read -p " Update $SCRIPT_FILE_NAME? (Y/n) : " CONFIRM_SCRIPT_UPDATE @@ -542,7 +612,7 @@ update_script() { break elif [[ "$CONFIRM_SCRIPT_UPDATE" == "n" || "$CONFIRM_SCRIPT_UPDATE" == "N" ]] ; then - echo -e " ${RED}Cancelled!${CRS}" + echo -e " ${RED}Cancelled!${CRS}\n" break else @@ -552,18 +622,21 @@ update_script() { else echo -e "\n ${RED}Version tags malformed or you are using a Beta version!${CRS}\n" - echo -e " ${CYN}Local Version :\t${CRS}${SCRIPT_VERSION}" - echo -e " ${CYN}Remote Version :\t${CRS}${REMOTE_SCRIPT_VERSION}\n" + scrip_version_info echo -e " ${RED}Updating script failed...${CRS}\n" fi } -### COMPARE APPIMAGE VERSIONarch_check +### COMPARE APP VERSION +app_version_info() { + echo -e " - ${CYN}Local Version :\t${CRS}$LOCAL_VERSION" + echo -e " - ${CYN}$APP_SOURCE Version :\t${CRS}$APP_SOURCE_VERSION\n" +} + compare_version() { LOCAL_VERSION=$($INSTALL_PATH/$APP_NAME.$FILE_EXTENSION --version | awk '{print $2}') APP_SOURCE_VERSION=$(curl -s $APP_SOURCE_URL | grep "tag_name" | tr -d \", | awk '{print $2}') - ### CHECK FOR EMPTY VERSION TAGS if [ -z "$APP_SOURCE_VERSION" ] ; then echo -e "\n ${RED}Empty version tag from ${CYN}$APP_SOURCE${RED}! Can't compare, exiting...${CRS}\n" exit @@ -573,26 +646,20 @@ compare_version() { exit fi - ### COMPARE LOCAL & REMOTE VERSION LOCAL_VERSION_NUM=$(echo $LOCAL_VERSION | tr -d .) APP_SOURCE_VERSION_NUM=$(echo $APP_SOURCE_VERSION | tr -d .) if [ "$APP_SOURCE_VERSION" == "$LOCAL_VERSION" ] ; then echo -e "\n ${GRN}$APP_NAME_LONG is up-to-date!${CRS}\n" - echo -e " ${CYN}Local Version :\t${CRS}${LOCAL_VERSION}" - echo -e " ${CYN}$APP_SOURCE Version :\t${CRS}${APP_SOURCE_VERSION}\n" + app_version_info elif [ "$APP_SOURCE_VERSION_NUM" -gt "$LOCAL_VERSION_NUM" ] ; then - echo -e "\n ${YEL}$APP_NAME_LONG is updatable!${CRS}\n" - echo -e " ${CYN}Local Version :\t${CRS}${LOCAL_VERSION}" - echo -e " ${CYN}$APP_SOURCE Version :\t${CRS}${APP_SOURCE_VERSION}\n" + echo -e "\n ${LCY}$APP_NAME_LONG is updatable!${CRS}\n" + app_version_info else echo -e "\n ${RED}Version tags malformed or you are using a Beta version!${CRS}\n" - echo -e " ${CYN}Local Version :\t${CRS}${LOCAL_VERSION}" - echo -e " ${CYN}$APP_SOURCE Version :\t${CRS}${APP_SOURCE_VERSION}\n" - echo -e " ${RED}Update failed... Exiting...${CRS}\n" - exit + app_version_info fi } @@ -600,19 +667,19 @@ compare_version() { help() { echo -e "\n${LCY}${SCRIPT_NAME}${CRS}\n" echo -e "$APP_NAME_LONG installer & updater script\n" - echo -e "Syntax: $SCRIPT_FILE_NAME [ -i | -l | -a | -u | -r | -c | -s | -S | -h ]\n" # | -U | + echo -e "Syntax: $SCRIPT_FILE_NAME [ -i | -l | -a | -u | -b | -r | -c | -s | -S | -h ]\n" echo -e "Options:\n" - echo -e "\t-i\tDownload & install $APP_NAME_LONG from $APP_SOURCE" + echo -e "\t-i\tInstall $APP_NAME_LONG from $APP_SOURCE" echo -e "\t-l\tCreate desktop launcher" echo -e "\t-a\tCreate alias for $SCRIPT_FILE_NAME" - echo -e "\t-u\tDownload & update $APP_NAME_LONG from $APP_SOURCE" + echo -e "\t-u\tUpdate $APP_NAME_LONG from $APP_SOURCE" echo -e "\t-b\tBackup $APP_NAME_LONG & configuration" echo -e "\t-r\tRemove $APP_NAME_LONG" echo -e "\t-c\tCompare local to remote version" echo -e "\t-s\tShow script version" echo -e "\t-S\tUpdate $SCRIPT_FILE_NAME" - echo -e "\t-h\tPrint this help page.\n" - echo -e "Configured locations:\n" + echo -e "\t-h\tPrint this help page\n" + echo -e "Configured directories:\n" echo -e "\t${CYN}${INSTALL_PATH}${CRS}\t\tInstall location" echo -e "\t${CYN}${LAUNCHER_PATH}${CRS}\tLauncher location" echo -e "\t${CYN}${SCRIPT_PATH}${CRS}\t\t\tScript location\n" @@ -631,12 +698,28 @@ exit_clean() { ## GET OPTIONS while getopts ":i,:l,:a,:u,:b,:r,:c,:s,:S,:h" OPTION ; do + + if [ "$(echo $1 | wc -m)" -gt "3" ] ; then + echo -e "\n${YEL}Option ${RED}$1${YEL} not valid! Use only one parameter at a time...${CRS}" + help + exit + fi + case $OPTION in i) echo -e "\n ${YEL}Installing $APP_NAME_LONG...${CRS}\n" + if [ "$#" -gt "1" ] ; then + ALL_PARAMETER=$@ + + for PARAMETER in ${ALL_PARAMETER[@]} ; do + if [ -d "$PARAMETER" ] ; then + INSTALL_PATH=$PARAMETER + fi + done + fi dependency_check arch_check - install_helium + install_application exit_clean ;; l) @@ -648,8 +731,14 @@ while getopts ":i,:l,:a,:u,:b,:r,:c,:s,:S,:h" OPTION ; do a) echo -e "\n ${YEL}Adding alias...${CRS}" - if [ "$2" ] ; then - ALIAS=$2 + if [ "$#" -gt "1" ] ; then + ALL_PARAMETER=$@ + + for PARAMETER in ${ALL_PARAMETER[@]} ; do + if [ "$PARAMETER" ] ; then + ALIAS=$PARAMETER + fi + done fi shell_check add_alias @@ -660,20 +749,32 @@ while getopts ":i,:l,:a,:u,:b,:r,:c,:s,:S,:h" OPTION ; do dependency_check arch_check local_check - update_helium + update_application exit_clean ;; b) - echo -e "\n ${YEL}Backing up $APP_NAME_LONG incl. configuration and script...${CRS}" - if [ "$2" ] ; then - BACKUP_PATH=$2 - fi - backup_helium + echo -e "\n ${YEL}Backing up $APP_NAME_LONG...${CRS}" + if [ "$#" -gt "1" ] ; then + ALL_PARAMETER=$@ + + for PARAMETER in ${ALL_PARAMETER[@]} ; do + if [[ "$PARAMETER" == "script" || "$PARAMETER" == "config" || "$PARAMETER" == "app" || "$PARAMETER" == "full" ]] ; then + BACKUP_METHOD=$PARAMETER + + elif [[ "$PARAMETER" == "pbzip2" || "$PARAMETER" == "gzip" || "$PARAMETER" == "bzip2" || "$PARAMETER" == "zip" ]] ; then + BACKUP_COMPRESSION_OVERRIDE=$PARAMETER + + elif [ -d "$PARAMETER" ] ; then + BACKUP_PATH=$PARAMETER + fi + done + fi + call_backup exit ;; r) echo -e "\n ${YEL}Removing $APP_NAME_LONG...${CRS}\n" - remove_helium + remove_application exit ;; c) @@ -704,15 +805,15 @@ while getopts ":i,:l,:a,:u,:b,:r,:c,:s,:S,:h" OPTION ; do esac done -## DEPENDENCY CHECK +## ENVIRONMENT CHECK dependency_check arch_check -## CHECK FOR LOCAL INSTALL +## CHECK LOCAL INSTALL local_check ## UPDATE -update_helium +update_application ## CLEAN exit_clean diff --git a/helium_launcher_update.sh b/helium_launcher_update.sh index 9e1e8b2..78b82b8 100755 --- a/helium_launcher_update.sh +++ b/helium_launcher_update.sh @@ -66,7 +66,7 @@ dependency_check () { if [ -f "$TMP/missingDeps" ] ; then MISSING=$(cat $TMP/missingDeps) echo "$DATE | Failed to update - missing dependencies : $MISSING" >> $LOG - notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Update failed! See log for details" + notify-send --icon="$ICON" "$NOTIFY_NAME" "Update failed! See log for details" exit_clean fi @@ -74,12 +74,12 @@ dependency_check () { if ! [ -d "$INSTALL_PATH" ] ; then mkdir -p $INSTALL_PATH echo "$DATE | Failed to update - $APP_NAME installation path not present - But created for logging" >> $LOG - notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Update failed! See log for details" + notify-send --icon="$ICON" "$NOTIFY_NAME" "Update failed! See log for details" exit elif ! [ -f "$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" ] ; then echo "$DATE | Failed to update - Local $APP_NAME AppImage not found" >> $LOG - notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Update failed! See log for details" + notify-send --icon="$ICON" "$NOTIFY_NAME" "Update failed! See log for details" exit fi @@ -160,7 +160,7 @@ backup_helium() { fi echo "$DATE | Backup - Backup (compressed $BACKUP_COMPRESSION archive) written to $BACKUP_PATH" >> $LOG - notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Backup created" + notify-send --icon="$ICON" "$NOTIFY_NAME" "Backup created" cd $CWD fi @@ -174,7 +174,7 @@ update_script() { ### CHECK FOR LOCAL SCRIPT if ! [ -f "$SCRIPT_PATH/$SCRIPT_FILE_NAME" ] ; then echo "$DATE | Failed to update script - local file not found" >> $LOG - notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Script update failed! See log for details" + notify-send --icon="$ICON" "$NOTIFY_NAME" "Script update failed! See log for details" exit fi @@ -184,12 +184,12 @@ update_script() { ### CHECK FOR EMPTY VERSION TAGS if [ -z "$SCRIPT_VERSION" ] ; then echo "$DATE | Failed to update script - Empty version tag --> local" >> $LOG - notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Script update failed! See log for details" + notify-send --icon="$ICON" "$NOTIFY_NAME" "Script update failed! See log for details" exit elif [ -z "$REMOTE_SCRIPT_VERSION" ] ; then echo "$DATE | Failed to update script - Empty version tag --> $APP_SOURCE" >> $LOG - notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Script update failed! See log for details" + notify-send --icon="$ICON" "$NOTIFY_NAME" "Script update failed! See log for details" exit fi @@ -199,7 +199,7 @@ update_script() { REMOTE_SCRIPT_VERSION_NUM=$(echo $REMOTE_SCRIPT_VERSION | tr -d .) if [ "$REMOTE_SCRIPT_VERSION" == "$SCRIPT_VERSION" ] ; then - notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Script is up-to-date" + notify-send --icon="$ICON" "$NOTIFY_NAME" "Script is up-to-date" elif [ "$REMOTE_SCRIPT_VERSION_NUM" -gt "$SCRIPT_VERSION_NUM" ] ; then mv $SCRIPT_PATH/$SCRIPT_FILE_NAME $BACKUP_PATH/$SCRIPT_FILE_NAME.old @@ -209,13 +209,13 @@ update_script() { chmod +x $TMP/$SCRIPT_FILE_NAME $TMP/$PARENT_SCRIPT_FILE_NAME mv $TMP/$SCRIPT_FILE_NAME $TMP/$PARENT_SCRIPT_FILE_NAME $SCRIPT_PATH echo "$DATE | Script updated to version $REMOTE_SCRIPT_VERSION" >> $LOG - notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Script updated to version $REMOTE_SCRIPT_VERSION" + notify-send --icon="$ICON" "$NOTIFY_NAME" "Script updated to version $REMOTE_SCRIPT_VERSION" else echo "$DATE | Failed to update - Malformed version tags" >> $LOG echo "$DATE | Remote Version: $REMOTE_SCRIPT_VERSION" >> $LOG echo "$DATE | Local Version: $SCRIPT_VERSION" >> $LOG - notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Script update failed! See log for details" + notify-send --icon="$ICON" "$NOTIFY_NAME" "Script update failed! See log for details" fi } @@ -229,12 +229,12 @@ update_helium() { ### CHECK FOR EMPTY VERSION TAGS if [[ -z "$APP_SOURCE_VERSION" ]] ; then echo "$DATE | Failed to update - Empty version tag --> $APP_SOURCE" >> $LOG - notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Browser update failed! See log for details" + notify-send --icon="$ICON" "$NOTIFY_NAME" "Browser update failed! See log for details" exit elif [[ -z "$LOCAL_VERSION" ]] ; then echo "$DATE | Failed to update - Empty version tag --> LOCAL" >> $LOG - notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Browser update failed! See log for details" + notify-send --icon="$ICON" "$NOTIFY_NAME" "Browser update failed! See log for details" exit fi @@ -244,7 +244,7 @@ update_helium() { APP_SOURCE_VERSION_NUM=$(echo $APP_SOURCE_VERSION | tr -d .) if [ "$APP_SOURCE_VERSION" == "$LOCAL_VERSION" ] ; then - notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Browser is up-to-date" + notify-send --icon="$ICON" "$NOTIFY_NAME" "Browser is up-to-date" elif [ "$APP_SOURCE_VERSION_NUM" -gt "$LOCAL_VERSION_NUM" ] ; then mkdir -p $TMP @@ -254,11 +254,11 @@ update_helium() { mv $TMP/$APP_SOURCE_FILENAME $INSTALL_PATH/$APP_NAME.$FILE_EXTENSION sed -i "s|X-AppImage-Version=.*|X-AppImage-Version=$($INSTALL_PATH/$APP_NAME.$FILE_EXTENSION --version | awk '{print $2}')|" $LAUNCHER_PATH/$APP_NAME.desktop echo "$DATE | $APP_NAME updated to version ${APP_SOURCE_VERSION}" >> $LOG - notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Browser updated to version $APP_SOURCE_VERSION" + notify-send --icon="$ICON" "$NOTIFY_NAME" "Browser updated to version $APP_SOURCE_VERSION" else echo "$DATE | Failed to update - Version tags malformed" >> $LOG - notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Browser update failed! See log for details" + notify-send --icon="$ICON" "$NOTIFY_NAME" "Browser update failed! See log for details" exit fi @@ -277,7 +277,7 @@ show_log() { xdg-open $LOG else - notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "No log created yet" + notify-send --icon="$ICON" "$NOTIFY_NAME" "No log created yet" fi } @@ -314,6 +314,13 @@ exit_clean() { ## GET OPTIONS while getopts ":a,:s,:S,:L,:h" OPTION ; do + + if [ "$(echo $1 | wc -m)" -gt "3" ] ; then + echo -e "\n${YEL}Option ${RED}$1${YEL} not valid! Use only one parameter at a time...${CRS}" + help + exit + fi + case $OPTION in S) From 66054bd6b18cd749548a088e151392d56b01e32a Mon Sep 17 00:00:00 2001 From: Fr4nzD13trich Date: Sat, 10 Jan 2026 12:59:59 +0100 Subject: [PATCH 13/22] Prep for workflows --- assets/workflow/merge | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/workflow/merge diff --git a/assets/workflow/merge b/assets/workflow/merge new file mode 100644 index 0000000..e69de29 From e608de8eedb56291bb837cc259095f3970425993 Mon Sep 17 00:00:00 2001 From: Fr4nzD13trich Date: Sat, 10 Jan 2026 14:18:16 +0100 Subject: [PATCH 14/22] Version bumped --> 0.5.9 --- helium_helper.sh | 2 +- helium_launcher_update.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/helium_helper.sh b/helium_helper.sh index 86f99d2..6dfbeb1 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -288,7 +288,7 @@ update_application() { mkdir -p $TMP echo -e "\n - Downloading ${CYN}$APP_SOURCE_FILENAME${CRS}..." wget -P $TMP $DOWNLOAD_URL -q - full_backup + ${BACKUP_METHOD}_backup chmod +x $TMP/$APP_SOURCE_FILENAME mv $TMP/$APP_SOURCE_FILENAME $INSTALL_PATH/$APP_NAME.$FILE_EXTENSION sed -i "s|X-AppImage-Version=.*|X-AppImage-Version=$($INSTALL_PATH/$APP_NAME.$FILE_EXTENSION --version | awk '{print $2}')|" $LAUNCHER_PATH/$APP_NAME.desktop diff --git a/helium_launcher_update.sh b/helium_launcher_update.sh index 78b82b8..88102e6 100755 --- a/helium_launcher_update.sh +++ b/helium_launcher_update.sh @@ -13,7 +13,7 @@ NOTIFY_NAME="Helium Helper" SCRIPT_NAME="$APP_NAME Launcher Updater" PARENT_SCRIPT_FILE_NAME="helium_helper.sh" SCRIPT_FILE_NAME="helium_launcher_update.sh" -SCRIPT_VERSION="0.5.8" +SCRIPT_VERSION="0.5.9" DATE=$(date) ## LOCATIONS From 3fa31db0ff5184f9ae27b7dd5ebf38077091f977 Mon Sep 17 00:00:00 2001 From: Fr4nzD13trich Date: Sat, 10 Jan 2026 14:19:07 +0100 Subject: [PATCH 15/22] More research on workflows --- assets/workflow/merge | 0 assets/workflow/merge.yml | 3 +++ 2 files changed, 3 insertions(+) delete mode 100644 assets/workflow/merge create mode 100644 assets/workflow/merge.yml diff --git a/assets/workflow/merge b/assets/workflow/merge deleted file mode 100644 index e69de29..0000000 diff --git a/assets/workflow/merge.yml b/assets/workflow/merge.yml new file mode 100644 index 0000000..4289a64 --- /dev/null +++ b/assets/workflow/merge.yml @@ -0,0 +1,3 @@ +on: + pull_requests: + pull_request_target: \ No newline at end of file From 69a14a82b60b80c8643367984348cea96e13bc4f Mon Sep 17 00:00:00 2001 From: Fr4nzD13trich Date: Sat, 10 Jan 2026 14:30:04 +0100 Subject: [PATCH 16/22] gitignore updated --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index ba7230e..81e676c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ test.sh +devdoc.md binaries \ No newline at end of file From 685cd7899323f70fd252e8bb29e900afd53eebdf Mon Sep 17 00:00:00 2001 From: fr4nz Date: Sat, 10 Jan 2026 14:45:07 +0100 Subject: [PATCH 17/22] Delete devdoc.md --- devdoc.md | 95 ------------------------------------------------------- 1 file changed, 95 deletions(-) delete mode 100644 devdoc.md diff --git a/devdoc.md b/devdoc.md deleted file mode 100644 index 17b5150..0000000 --- a/devdoc.md +++ /dev/null @@ -1,95 +0,0 @@ -# To Do List Helium installer - -## Last Jobs -- Readme updated -- Desktop Entry updater --> Complete -- Launcher has an update option now -- Launcher installer refined -- Clean Up ---- -- Script updater - - Remote script check simplified -- Remover function extended - - Alias remover added - - Script remover added -- helium_auto_update.sh renamed to helium_launcher_update.sh -- Desktop notifications added -- Launcher functions extended - - Update script option added - - Show log option added -- Variables universalized -- Wiki created ---- -- sed command fixed in remover -- ARCH variable added -- APP_SOURCE variable changed -- BRANCH variable added -- FILE_EXTENSION variable added -- Readme updated -- Documentation/Wiki updated ---- -- Shell detection added -- Alias support for fish added -- Removal process refined and adapted to fish -- Browser config backup ---- -- Arch detection working -- Clean Up -- Copy Paste mistake fixed -- Backup process rewritten - - Custom backup method to pass as argument - - Custom backup path to pass as argument - - Default if left blank -- Removal process adjusted -- $1 verifier added -- Readme updated - - -## Add/To Do -- Roll back from backup -- Update Readme -- Make functional launcher optional - -## Repo -- Merge workflow - - Convert URLs from __main__ to __stable__ - - Remove to do list - - Remove comment from script - -## Fix - -## Notes - -- Auto Update -```sh -while true ; do - read -p " Enable automatic update check on login? (y/N) : " AUTO_UPDATE - - if [[ "$AUTO_UPDATE" == "" || "$AUTO_UPDATE" == "n" || "$AUTO_UPDATE" == "N" ]] ; then - break - - elif [[ "$AUTO_UPDATE" == "y" || "$AUTO_UPDATE" == "Y" ]] ; then - if ! [ -f "$PROFILE" ] ; then - echo -e "\n ${RED}Following file is missing :\n\n${YEL}$PROFILE\n\n ${CYN}Please investigate and re-run script !${CRS}" - exit 1 - - else - wget -P $TMP https://lab.c95.org/fr4nz/shell-scripts/src/branch/main/helium-browser/helium_auto_update.sh -q --show-progress - chmod +x $TMP/helium_auto_update.sh - mv $TMP/helium_auto_update.sh $INSTALL_PATH/helium_auto_update.sh - echo >> $PROFILE - echo "### HELIUM AUTO UPDATE ###" >> $PROFILE - echo "${INSTALL_PATH}/helium_auto_update.sh" >> $PROFILE - echo >> $PROFILE - echo -e "\n ${GRN}Automatic updates enabled ! ${CRS}\n" - break - - fi - - else - echo -e " ${YEL}Invalid response !${CRS}\n" - - fi - -done -``` From 1d8d70c54bdfe89cbb84176d59244e1344b1a931 Mon Sep 17 00:00:00 2001 From: fr4nz Date: Sat, 10 Jan 2026 14:45:32 +0100 Subject: [PATCH 18/22] Update .gitignore --- .gitignore | 3 --- 1 file changed, 3 deletions(-) diff --git a/.gitignore b/.gitignore index b76377e..81e676c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,3 @@ test.sh -<<<<<<< HEAD devdoc.md -======= ->>>>>>> main binaries \ No newline at end of file From 4db4454a9055f6dfc3b9ccade122c2ef53ed37f1 Mon Sep 17 00:00:00 2001 From: Fr4nzD13trich Date: Sat, 10 Jan 2026 15:25:06 +0100 Subject: [PATCH 19/22] Architecture verification added --- helium_helper.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/helium_helper.sh b/helium_helper.sh index 6dfbeb1..ea84e3d 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -99,6 +99,11 @@ arch_check() { ARCH="x86_64" fi fi + + if ! [[ "$ARCH" == "arm64" || "$ARCH" == "x86_64" ]] ; then + echo -e "\n ${CYN}$ARCH ${RED}unsupported! Only ${CYN}x86_68 ${RED}or ${CYN}arm64 ${RED}architecture are supported!${CRS}\n" + exit + fi } ### CHECK LOCAL INSTALL From 969f8b2eb594022f1337858ea03b5a73aa4c8dc9 Mon Sep 17 00:00:00 2001 From: Fr4nzD13trich Date: Sat, 10 Jan 2026 17:02:12 +0100 Subject: [PATCH 20/22] zip hotfix --- helium_helper.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/helium_helper.sh b/helium_helper.sh index ea84e3d..ec36448 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -23,7 +23,7 @@ BACKUP_COMPRESSION_OVERRIDE="" SCRIPT_NAME="$APP_NAME Helper Script" SCRIPT_FILE_NAME="helium_helper.sh" AUTO_SCRIPT_FILE_NAME="helium_launcher_update.sh" -SCRIPT_VERSION="0.5.9" +SCRIPT_VERSION="0.5.9.1" ALIAS="update-helium" DATE=$(date +"%d%m%y") @@ -436,7 +436,7 @@ pack_backup() { done fi - echo -e "\n - ${CRS}Compressing backup archive with ${CYN}$BACKUP_COMPRESSION${CRS}...${CRS}\n" + echo -e "\n - ${CRS}Packing backup archive with ${CYN}$BACKUP_COMPRESSION${CRS}...${CRS}\n" if [ "$BACKUP_COMPRESSION" == "pbzip2" ] ; then tar -cf $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar * > /dev/null 2>&1 @@ -460,7 +460,8 @@ pack_backup() { cd $TMP && rm -rf backup elif [ "$BACKUP_COMPRESSION" == "zip" ] ; then - zip -r $APP_NAME.$BACKUP_METHOD.backup_$DATE.zip $APP_NAME.$BACKUP_METHOD.backup_$DATE > /dev/null 2>&1 + tar -cf $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar * > /dev/null 2>&1 + zip -r $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar.zip $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar > /dev/null 2>&1 mkdir -p $BACKUP_PATH mv $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar.zip $BACKUP_PATH cd $TMP && rm -rf backup From dd615058c4b0a6b50d8b4df20d853c2165647e12 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Sat, 10 Jan 2026 18:22:32 +0100 Subject: [PATCH 21/22] Hotfix date confusion --- helium_launcher_update.sh | 67 ++++++++++++++++++++------------------- 1 file changed, 34 insertions(+), 33 deletions(-) diff --git a/helium_launcher_update.sh b/helium_launcher_update.sh index 88102e6..a1fb03b 100755 --- a/helium_launcher_update.sh +++ b/helium_launcher_update.sh @@ -13,8 +13,9 @@ NOTIFY_NAME="Helium Helper" SCRIPT_NAME="$APP_NAME Launcher Updater" PARENT_SCRIPT_FILE_NAME="helium_helper.sh" SCRIPT_FILE_NAME="helium_launcher_update.sh" -SCRIPT_VERSION="0.5.9" -DATE=$(date) +SCRIPT_VERSION="0.5.9.1" +LOG_DATE=$(date) +DATE=$(date +"%d%m%y") ## LOCATIONS TMP=/tmp/$APP_NAME @@ -59,13 +60,13 @@ dependency_check () { mkdir -p $LOG_PATH echo "########## $APP_NAME_LONG update log ##########" >> $LOG echo >> $LOG - echo "$DATE | Log created" >> $LOG + echo "$LOG_DATE | Log created" >> $LOG fi if [ -f "$TMP/missingDeps" ] ; then MISSING=$(cat $TMP/missingDeps) - echo "$DATE | Failed to update - missing dependencies : $MISSING" >> $LOG + echo "$LOG_DATE | Failed to update - missing dependencies : $MISSING" >> $LOG notify-send --icon="$ICON" "$NOTIFY_NAME" "Update failed! See log for details" exit_clean @@ -73,12 +74,12 @@ dependency_check () { if ! [ -d "$INSTALL_PATH" ] ; then mkdir -p $INSTALL_PATH - echo "$DATE | Failed to update - $APP_NAME installation path not present - But created for logging" >> $LOG + echo "$LOG_DATE | Failed to update - $APP_NAME installation path not present - But created for logging" >> $LOG notify-send --icon="$ICON" "$NOTIFY_NAME" "Update failed! See log for details" exit elif ! [ -f "$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" ] ; then - echo "$DATE | Failed to update - Local $APP_NAME AppImage not found" >> $LOG + echo "$LOG_DATE | Failed to update - Local $APP_NAME AppImage not found" >> $LOG notify-send --icon="$ICON" "$NOTIFY_NAME" "Update failed! See log for details" exit @@ -125,47 +126,47 @@ backup_helium() { fi if [ "$BACKUP_COMPRESSION" == "pbzip2" ] ; then - tar -cf $APP_NAME.backup_$DATE.tar * > /dev/null 2>&1 - pbzip2 $APP_NAME.backup_$DATE.tar + tar -cf $APP_NAME.auto_backup_$DATE.tar * > /dev/null 2>&1 + pbzip2 $APP_NAME.auto_backup_$DATE.tar mkdir -p $BACKUP_PATH - mv $APP_NAME.backup_$DATE.tar.bz2 $BACKUP_PATH + mv $APP_NAME.auto_backup_$DATE.tar.bz2 $BACKUP_PATH cd $TMP && rm -rf backup elif [ "$BACKUP_COMPRESSION" == "gzip" ] ; then - tar -cf $APP_NAME.backup_$DATE.tar * > /dev/null 2>&1 - gzip $APP_NAME.backup_$DATE.tar + tar -cf $APP_NAME.auto_backup_$DATE.tar * > /dev/null 2>&1 + gzip $APP_NAME.auto_backup_$DATE.tar mkdir -p $BACKUP_PATH - mv $APP_NAME.backup_$DATE.tar.gz $BACKUP_PATH + mv $APP_NAME.auto_backup_$DATE.tar.gz $BACKUP_PATH cd $TMP && rm -rf backup elif [ "$BACKUP_COMPRESSION" == "bzip2" ] ; then - tar -cf $APP_NAME.backup_$DATE.tar * > /dev/null 2>&1 - bzip2 $APP_NAME.backup_$DATE.tar + tar -cf $APP_NAME.auto_backup_$DATE.tar * > /dev/null 2>&1 + bzip2 $APP_NAME.auto_backup_$DATE.tar mkdir -p $BACKUP_PATH - mv $APP_NAME.backup_$DATE.tar.bz2 $BACKUP_PATH + mv $APP_NAME.auto_backup_$DATE.tar.bz2 $BACKUP_PATH cd $TMP && rm -rf backup elif [ "$BACKUP_COMPRESSION" == "zip" ] ; then - tar -cf $APP_NAME.backup_$DATE.tar * > /dev/null 2>&1 - zip -r $APP_NAME.backup_$DATE.tar.zip $APP_NAME.backup_$DATE.tar > /dev/null 2>&1 + tar -cf $APP_NAME.auto_backup_$DATE.tar * > /dev/null 2>&1 + zip -r $APP_NAME.auto_backup_$DATE.tar.zip $APP_NAME.auto_backup_$DATE.tar > /dev/null 2>&1 mkdir -p $BACKUP_PATH - mv $APP_NAME.backup_$DATE.tar.zip $BACKUP_PATH + mv $APP_NAME.auto_backup_$DATE.tar.zip $BACKUP_PATH cd $TMP && rm -rf backup else - echo "$DATE | Backup - Backup (uncompressed) written to $BACKUP_PATH" >> $LOG + echo "$LOG_DATE | Backup - Backup (uncompressed) written to $BACKUP_PATH" >> $LOG mkdir -p $BACKUP_PATH - mv $TMP/backup $BACKUP_PATH/$APP_NAME.backup_$DATE + mv $TMP/backup $BACKUP_PATH/$APP_NAME.auto_backup_$DATE cd $TMP && rm -rf backup fi - echo "$DATE | Backup - Backup (compressed $BACKUP_COMPRESSION archive) written to $BACKUP_PATH" >> $LOG + echo "$LOG_DATE | Backup - Backup (compressed $BACKUP_COMPRESSION archive) written to $BACKUP_PATH" >> $LOG notify-send --icon="$ICON" "$NOTIFY_NAME" "Backup created" cd $CWD fi else - echo "$DATE | Failed to backup - Nothing worth backing up found" >> $LOG + echo "$LOG_DATE | Failed to backup - Nothing worth backing up found" >> $LOG fi } @@ -173,7 +174,7 @@ backup_helium() { update_script() { ### CHECK FOR LOCAL SCRIPT if ! [ -f "$SCRIPT_PATH/$SCRIPT_FILE_NAME" ] ; then - echo "$DATE | Failed to update script - local file not found" >> $LOG + echo "$LOG_DATE | Failed to update script - local file not found" >> $LOG notify-send --icon="$ICON" "$NOTIFY_NAME" "Script update failed! See log for details" exit @@ -183,12 +184,12 @@ update_script() { ### CHECK FOR EMPTY VERSION TAGS if [ -z "$SCRIPT_VERSION" ] ; then - echo "$DATE | Failed to update script - Empty version tag --> local" >> $LOG + echo "$LOG_DATE | Failed to update script - Empty version tag --> local" >> $LOG notify-send --icon="$ICON" "$NOTIFY_NAME" "Script update failed! See log for details" exit elif [ -z "$REMOTE_SCRIPT_VERSION" ] ; then - echo "$DATE | Failed to update script - Empty version tag --> $APP_SOURCE" >> $LOG + echo "$LOG_DATE | Failed to update script - Empty version tag --> $APP_SOURCE" >> $LOG notify-send --icon="$ICON" "$NOTIFY_NAME" "Script update failed! See log for details" exit @@ -208,13 +209,13 @@ update_script() { wget -P $TMP $REMOTE_REPO_URL/$PARENT_SCRIPT_FILE_NAME -q chmod +x $TMP/$SCRIPT_FILE_NAME $TMP/$PARENT_SCRIPT_FILE_NAME mv $TMP/$SCRIPT_FILE_NAME $TMP/$PARENT_SCRIPT_FILE_NAME $SCRIPT_PATH - echo "$DATE | Script updated to version $REMOTE_SCRIPT_VERSION" >> $LOG + echo "$LOG_DATE | Script updated to version $REMOTE_SCRIPT_VERSION" >> $LOG notify-send --icon="$ICON" "$NOTIFY_NAME" "Script updated to version $REMOTE_SCRIPT_VERSION" else - echo "$DATE | Failed to update - Malformed version tags" >> $LOG - echo "$DATE | Remote Version: $REMOTE_SCRIPT_VERSION" >> $LOG - echo "$DATE | Local Version: $SCRIPT_VERSION" >> $LOG + echo "$LOG_DATE | Failed to update - Malformed version tags" >> $LOG + echo "$LOG_DATE | Remote Version: $REMOTE_SCRIPT_VERSION" >> $LOG + echo "$LOG_DATE | Local Version: $SCRIPT_VERSION" >> $LOG notify-send --icon="$ICON" "$NOTIFY_NAME" "Script update failed! See log for details" fi } @@ -228,12 +229,12 @@ update_helium() { ### CHECK FOR EMPTY VERSION TAGS if [[ -z "$APP_SOURCE_VERSION" ]] ; then - echo "$DATE | Failed to update - Empty version tag --> $APP_SOURCE" >> $LOG + echo "$LOG_DATE | Failed to update - Empty version tag --> $APP_SOURCE" >> $LOG notify-send --icon="$ICON" "$NOTIFY_NAME" "Browser update failed! See log for details" exit elif [[ -z "$LOCAL_VERSION" ]] ; then - echo "$DATE | Failed to update - Empty version tag --> LOCAL" >> $LOG + echo "$LOG_DATE | Failed to update - Empty version tag --> LOCAL" >> $LOG notify-send --icon="$ICON" "$NOTIFY_NAME" "Browser update failed! See log for details" exit @@ -253,11 +254,11 @@ update_helium() { backup_helium mv $TMP/$APP_SOURCE_FILENAME $INSTALL_PATH/$APP_NAME.$FILE_EXTENSION sed -i "s|X-AppImage-Version=.*|X-AppImage-Version=$($INSTALL_PATH/$APP_NAME.$FILE_EXTENSION --version | awk '{print $2}')|" $LAUNCHER_PATH/$APP_NAME.desktop - echo "$DATE | $APP_NAME updated to version ${APP_SOURCE_VERSION}" >> $LOG + echo "$LOG_DATE | $APP_NAME updated to version ${APP_SOURCE_VERSION}" >> $LOG notify-send --icon="$ICON" "$NOTIFY_NAME" "Browser updated to version $APP_SOURCE_VERSION" else - echo "$DATE | Failed to update - Version tags malformed" >> $LOG + echo "$LOG_DATE | Failed to update - Version tags malformed" >> $LOG notify-send --icon="$ICON" "$NOTIFY_NAME" "Browser update failed! See log for details" exit From f253e8797354de1c67d773b01651f5fe4191d247 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Sat, 10 Jan 2026 18:25:53 +0100 Subject: [PATCH 22/22] Readme update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 66e4c18..b3bc10e 100644 --- a/README.md +++ b/README.md @@ -80,7 +80,7 @@ Backing up, by default, pulls all important files, folders & configuration and c ### Helium_Launcher_Update.sh - Update Helium from launcher - Assumes: - - Presence of `$HOME/.apps/Helium` when updating | changeable in line 21 `INSTALL_PATH` + - Presence of `$HOME/.apps/Helium` when updating | changeable in line 22 `INSTALL_PATH` - Executable named `Helium.AppImage` - Loggs to `$HOME/.apps/Helium/assets/logs` - Keeps backup archives from