diff --git a/README.md b/README.md index 7e5a3e2..2bd5ec7 100644 --- a/README.md +++ b/README.md @@ -1 +1,369 @@ -IyBGYW1pbHkgSHViIC0gSG9tZSBNYW5hZ2VtZW50IFN5c3RlbQoKPiAqKiJTa3lsaWdodCBvbiBTdGVyb2lkcyIqKiAtIEEgY29tcHJlaGVuc2l2ZSBmYW1pbHkgbWFuYWdlbWVudCBzeXN0ZW0gZm9yIGNhbGVuZGFyLCBjaG9yZXMsIG1lbnUgcGxhbm5pbmcsIGFuZCBzaG9wcGluZyBsaXN0cwoKLS0tCgojIyDwn4+gIFByb2plY3QgT3ZlcnZpZXcKCkZhbWlseSBIdWIgaXMgYSBzdGFuZGFsb25lIGhvbWUgbWFuYWdlbWVudCBzeXN0ZW0gZGVzaWduZWQgZm9yIGEgZmFtaWx5IG9mIDUgKExvdSwgSmVzcywgV2lsbGlhbSwgWGFuZGVyLCBCZWxsYSkgdG8gbWFuYWdlIGRhaWx5IGhvdXNlaG9sZCB0YXNrcywgY29vcmRpbmF0ZSBzY2hlZHVsZXMsIHBsYW4gbWVhbHMsIGFuZCB0cmFjayBzaG9wcGluZyBuZWVkcy4KCiMjIyBLZXkgRmVhdHVyZXMKLSAqKvCfk4UgQ2FsZW5kYXIgTWFuYWdlbWVudCoqIC0gR29vZ2xlIENhbGVuZGFyIGludGVncmF0aW9uIGZvciBmYW1pbHkgc2NoZWR1bGluZwotICoq8J+nuSBDaG9yZSBUcmFja2luZyoqIC0gSW50ZWxsaWdlbnQgYXNzaWdubWVudCBhbmQgdHJhY2tpbmcgc3lzdGVtCi0gKirwn43977iPIE1lbnUgUGxhbm5pbmcqKiAtIE1lYWxpZSBpbnRlZ3JhdGlvbiBmb3IgbWVhbCBwbGFubmluZwotICoq8J+bkiBTaG9wcGluZyBMaXN0cyoqIC0gQXV0by1nZW5lcmF0ZWQgZnJvbSBtZWFsIHBsYW5zIHdpdGggbWFudWFsIGFkZGl0aW9ucwotICoq8J+PoSBIb21lIEFzc2lzdGFudCBJbnRlZ3JhdGlvbioqIC0gUHVzaCBub3RpZmljYXRpb25zIGFuZCBkYXNoYm9hcmQgY2FyZHMKLSAqKvCfkaUgTXVsdGktVXNlciBTeXN0ZW0qKiAtIEluZGl2aWR1YWwgcHJvZmlsZXMgd2l0aCByb2xlLWJhc2VkIHZpZXdzCgotLS0KCiMjIPCfkajigI3wn5Gp4oCN8J+Rp+KAjfCfkaYgRmFtaWx5IENvbmZpZ3VyYXRpb24KCiMjIyBNZW1iZXJzCi0gKipMb3UqKiAoUGFyZW50KQotICoqSmVzcyoqIChQYXJlbnQpIC0gTWFzdGVyIEJlZHJvb20gd2l0aCBFbnN1aXRlCi0gKipXaWxsaWFtKiogKENoaWxkKSAtIE93biBCZWRyb29tCi0gKipYYW5kZXIqKiAoQ2hpbGQpIC0gT3duIEJlZHJvb20KLSAqKkJlbGxhKiogKENoaWxkKSAtIE93biBCZWRyb29tCgojIyMgUGV0cwotICoqSGFycGVyKiogKERvZykgLSBGZWVkaW5nLCB3YXRlcmluZwotICoqQ2hpcHMqKiAoQ2F0KSAtIEZlZWRpbmcsIHdhdGVyaW5nLCBsaXR0ZXIgbWFpbnRlbmFuY2UKCiMjIyBIb21lIExheW91dAotIDUgQmVkcm9vbXMgKDEgTWFzdGVyIHdpdGggRW5zdWl0ZSkKLSAyIEJhdGhyb29tcwotIDEgVG9pbGV0Ci0gS2l0Y2hlbiAod2l0aCBkaXNod2FzaGVyKQotIERpbmluZyBSb29tCi0gTGF1bmRyeSAod2FzaGluZyBtYWNoaW5lICsgZHJ5ZXIpCgojIyMgV2Vla2x5IFNjaGVkdWxlIE5vdGVzCi0gKipCaW4gRGF5Kio6IFdlZG5lc2RheSBtb3JuaW5nIHBpY2t1cAotICoqUmVjeWNsaW5nL0dyZWVucyoqOiBBbHRlcm5hdGUgZm9ydG5pZ2h0cyB3aXRoIHJlZ3VsYXIgYmlucwoKLS0tCgojIyDwn5ug77iPIFRlY2ggU3RhY2sKCiMjIyBCYWNrZW5kCi0gKipGcmFtZXdvcmsqKjogRmFzdEFQSSAoUHl0aG9uIDMuMTErKQotICoqRGF0YWJhc2UqKjogU1FMaXRlIChwcm9kdWN0aW9uLXJlYWR5LCBjYW4gbWlncmF0ZSB0byBQb3N0Z3JlU1FMKQotICoqQXV0aGVudGljYXRpb24qKjogSldULWJhc2VkIHdpdGggYmNyeXB0IHBhc3N3b3JkIGhhc2hpbmcKLSAqKkFQSSBEb2N1bWVudGF0aW9uKio6IEF1dG9tYXRpYyBPcGVuQVBJL1N3YWdnZXIKCiMjIyBGcm9udGVuZAotICoqRnJhbWV3b3JrKio6IFJlYWN0IDE4IHdpdGggVHlwZVNjcmlwdAotICoqU3R5bGluZyoqOiBUYWlsd2luZCBDU1MKLSAqKlN0YXRlIE1hbmFnZW1lbnQqKjogUmVhY3QgQ29udGV4dCBBUEkgLyBadXN0YW5kCi0gKipCdWlsZCBUb29sKio6IFZpdGUKCiMjIyBJbnRlZ3JhdGlvbnMKLSAqKkdvb2dsZSBDYWxlbmRhciBBUEkqKiAtIE9BdXRoMiBhdXRoZW50aWNhdGlvbgotICoqTWVhbGllIEFQSSoqIC0gU2VsZi1ob3N0ZWQgcmVjaXBlL21lYWwgcGxhbm5pbmcKLSAqKkhvbWUgQXNzaXN0YW50KiogLSBSRVNUIEFQSSArIFdlYmhvb2tzIGZvciBub3RpZmljYXRpb25zCgojIyMgSW5mcmFzdHJ1Y3R1cmUKLSAqKkNvbnRhaW5lcml6YXRpb24qKjogRG9ja2VyICsgRG9ja2VyIENvbXBvc2UKLSAqKlJldmVyc2UgUHJveHkqKjogTmdpbnggKG9wdGlvbmFsKQotICoqRGF0YWJhc2UgTWlncmF0aW9ucyoqOiBBbGVtYmljCgotLS0KCiMjIPCfk4sgRGV2ZWxvcG1lbnQgUHJvZ3Jlc3MKCiMjIyDinIUgUGhhc2UgMTogRm91bmRhdGlvbiAmIENvcmUgU2V0dXAKLSBbeF0gQ3JlYXRlIEdpdCByZXBvc2l0b3J5Ci0gW3hdIFByb2plY3Qgc3RydWN0dXJlIHNjYWZmb2xkaW5nCi0gWyBdIEJhY2tlbmQgQVBJIGZyYW1ld29yayBzZXR1cAotIFsgXSBGcm9udGVuZCBSZWFjdCBhcHBsaWNhdGlvbiBzZXR1cAotIFsgXSBEYXRhYmFzZSBzY2hlbWEgZGVzaWduCi0gWyBdIERvY2tlciBjb250YWluZXJpemF0aW9uCi0gWyBdIFVzZXIgbWFuYWdlbWVudCBzeXN0ZW0KCiMjIyDirJwgUGhhc2UgMjogQ2hvcmVzIFN5c3RlbQotIFsgXSBEYXRhYmFzZSBtb2RlbHMgZm9yIGNob3JlcwotIFsgXSBDaG9yZSB0eXBlczogRGFpbHksIFdlZWtseSwgRm9ydG5pZ2h0bHksIEFkLWhvYwotIFsgXSBMb2NhdGlvbi1iYXNlZCBjYXRlZ29yaXphdGlvbgotIFsgXSBBc3NpZ25tZW50IGVuZ2luZSAoaW5kaXZpZHVhbC9zaGFyZWQvcm90YXRpbmcpCi0gWyBdIFJlY3VycmluZyBzY2hlZHVsZSBidWlsZGVyCi0gWyBdIENvbXBsZXRpb24gdHJhY2tpbmcgJiBoaXN0b3J5Ci0gWyBdIENob3JlIGRhc2hib2FyZCBVSQotIFsgXSBUb2RheSdzIHRhc2tzIHZpZXcKLSBbIF0gV2Vla2x5IG92ZXJ2aWV3IGNhbGVuZGFyCgojIyMg4qycIFBoYXNlIDM6IENhbGVuZGFyIEludGVncmF0aW9uCi0gWyBdIEdvb2dsZSBDYWxlbmRhciBPQXV0aDIgc2V0dXAKLSBbIF0gUmVhZC9kaXNwbGF5IGZhbWlseSBldmVudHMKLSBbIF0gQ3JlYXRlL2VkaXQgZXZlbnRzIGludGVyZmFjZQotIFsgXSBTeW5jIGNob3JlcyB0byBjYWxlbmRhciAob3B0aW9uYWwpCi0gWyBdIENhbGVuZGFyIHdpZGdldCBmb3IgZGFzaGJvYXJkCgojIyMg4qycIFBoYXNlIDQ6IE1lbnUgUGxhbm5pbmcgJiBTaG9wcGluZwotIFsgXSBNZWFsaWUgQVBJIGludGVncmF0aW9uCi0gWyBdIFdlZWtseSBtZWFsIHBsYW5uZXIgaW50ZXJmYWNlCi0gWyBdIFJlY2lwZSBicm93c2VyCi0gWyBdIEF1dG8tZ2VuZXJhdGUgc2hvcHBpbmcgbGlzdHMgZnJvbSBtZWFscwotIFsgXSBNYW51YWwgc2hvcHBpbmcgbGlzdCBtYW5hZ2VtZW50Ci0gWyBdIEl0ZW0gY2F0ZWdvcml6YXRpb24KLSBbIF0gQ2hlY2stb2ZmIGZ1bmN0aW9uYWxpdHkKLSBbIF0gTW9iaWxlLWZyaWVuZGx5IHNob3BwaW5nIHZpZXcKCiMjIyDirJwgUGhhc2UgNTogUG9saXNoICYgSW50ZWdyYXRpb24KLSBbIF0gVW5pZmllZCBkYXNoYm9hcmQgaG9tZSB2aWV3Ci0gWyBdIFdpZGdldC1zdHlsZSBsYXlvdXQgc3lzdGVtCi0gWyBdIFF1aWNrIHN0YXRzICYgaW5kaWNhdG9ycwotIFsgXSBIb21lIEFzc2lzdGFudCBSRVNUIEFQSSBlbmRwb2ludHMKLSBbIF0gUHVzaCBub3RpZmljYXRpb24gc3lzdGVtCiAgLSBbIF0gT3ZlcmR1ZSBjaG9yZXMKICAtIFsgXSBCaW4gZGF5IHJlbWluZGVycyAoVHVlc2RheSBuaWdodCkKICAtIFsgXSBQZXQgY2FyZSByZW1pbmRlcnMKLSBbIF0gSG9tZSBBc3Npc3RhbnQgZGFzaGJvYXJkIGNhcmQKLSBbIF0gUFdBIGNvbmZpZ3VyYXRpb24KLSBbIF0gTW9iaWxlIG9wdGltaXphdGlvbgotIFsgXSBPZmZsaW5lIGNhcGFiaWxpdHkKCi0tLQoKIyMg8J+TgSBQcm9qZWN0IFN0cnVjdHVyZQoKYGBgCmZhbWlseS1odWIvCuKUnOKUgOKUgCBiYWNrZW5kLyAgICAgICAgICAgICAgICAgIyBGYXN0QVBJIGJhY2tlbmQK4pSCICAg4pSc4pSA4pSAIGFwcC8K4pSCICAg4pSCICAg4pSc4pSA4pSAIGFwaS8gICAgICAgICAgICAjIEFQSSByb3V0ZSBoYW5kbGVycwrilIIgICDilIIgICDilIIgICDilJzilIDilIAgYXV0aC5weQrilIIgICDilIIgICDilIIgICDilJzilIDilIAgdXNlcnMucHkK4pSCICAg4pSCICAg4pSCICAg4pSc4pSA4pSAIGNob3Jlcy5weQrilIIgICDilIIgICDilIIgICDilJzilIDilIAgY2FsZW5kYXIucHkK4pSCICAg4pSCICAg4pSCICAg4pSc4pSA4pSAIG1lYWxzLnB5CuKUgiAgIOKUgiAgIOKUgiAgIOKUlOKUgOKUgCBzaG9wcGluZy5weQrilIIgICDilIIgICDilJzilIDilIAgY29yZS8gICAgICAgICAgICMgQ29yZSBjb25maWd1cmF0aW9uCuKUgiAgIOKUgiAgIOKUgiAgIOKUnOKUgOKUgCBjb25maWcucHkK4pSCICAg4pSCICAg4pSCICAg4pSc4pSA4pSAIHNlY3VyaXR5LnB5CuKUgiAgIOKUgiAgIOKUgiAgIOKUlOKUgOKUgCBkYXRhYmFzZS5weQrilIIgICDilIIgICDilJzilIDilIAgbW9kZWxzLyAgICAgICAgICMgRGF0YWJhc2UgbW9kZWxzCuKUgiAgIOKUgiAgIOKUgiAgIOKUnOKUgOKUgCB1c2VyLnB5CuKUgiAgIOKUgiAgIOKUgiAgIOKUnOKUgOKUgCBjaG9yZS5weQrilIIgICDilIIgICDilIIgICDilJzilIDilIAgbWVhbC5weQrilIIgICDilIIgICDilIIgICDilJTilIDilIAgc2hvcHBpbmcucHkK4pSCICAg4pSCICAg4pSc4pSA4pSAIHNjaGVtYXMvICAgICAgICAjIFB5ZGFudGljIHNjaGVtYXMK4pSCICAg4pSCICAg4pSU4pSA4pSAIHNlcnZpY2VzLyAgICAgICAjIEJ1c2luZXNzIGxvZ2ljCuKUgiAgIOKUnOKUgOKUgCB0ZXN0cy8K4pSCICAg4pSc4pSA4pSAIGFsZW1iaWMvICAgICAgICAgICAgIyBEYXRhYmFzZSBtaWdyYXRpb25zCuKUgiAgIOKUnOKUgOKUgCByZXF1aXJlbWVudHMudHh0CuKUgiAgIOKUlOKUgOKUgCBEb2NrZXJmaWxlCuKUggrilJzilIDilIAgZnJvbnRlbmQvICAgICAgICAgICAgICAgIyBSZWFjdCBmcm9udGVuZArilIIgICDilJzilIDilIAgc3JjLwrilIIgICDilIIgICDilJzilIDilIAgY29tcG9uZW50cy8gICAgIyBSZXVzYWJsZSBjb21wb25lbnRzCuKUgiAgIOKUgiAgIOKUnOKUgOKUgCBwYWdlcy8gICAgICAgICAjIFBhZ2UgY29tcG9uZW50cwrilIIgICDilIIgICDilJzilIDilIAgaG9va3MvICAgICAgICAgIyBDdXN0b20gUmVhY3QgaG9va3MK4pSCICAg4pSCICAg4pSc4pSA4pSAIHNlcnZpY2VzLyAgICAgICMgQVBJIHNlcnZpY2UgbGF5ZXIK4pSCICAg4pSCICAg4pSc4pSA4pSAIGNvbnRleHQvICAgICAgICMgUmVhY3QgY29udGV4dCBwcm92aWRlcnMK4pSCICAg4pSCICAg4pSc4pSA4pSAIHV0aWxzLyAgICAgICAgICMgSGVscGVyIGZ1bmN0aW9ucwrilIIgICDilIIgICDilJTilIDilIAgQXBwLnRzeArilIIgICDilJzilIDilIAgcHVibGljLwrilIIgICDilJzilIDilIAgcGFja2FnZS5qc29uCuKUgiAgIOKUnOKUgOKUgCB2aXRlLmNvbmZpZy50cwrilIIgICDilJTilIDilIAgRG9ja2VyZmlsZQrilIIK4pSc4pSA4pSAIGRvY2tlci1jb21wb3NlLnltbCAgICAgICMgQ29udGFpbmVyIG9yY2hlc3RyYXRpb24K4pSc4pSA4pSAIC5lbnYuZXhhbXBsZSAgICAgICAgICAgIyBFbnZpcm9ubWVudCB2YXJpYWJsZXMgdGVtcGxhdGUK4pSc4pSA4pSAIFBST0pFQ1RfUk9BRE1BUC5tZCAgICAgIyBUaGlzIGZpbGUK4pSU4pSA4pSAIFJFQURNRS5tZApgYGAKCi0tLQoKIyMg8J+XhO+4jyBEYXRhYmFzZSBTY2hlbWEKCiMjIyBDb3JlIFRhYmxlcwoKIyMjIyB1c2VycwotIGBpZGAgKFBLKQotIGB1c2VybmFtZWAgKHVuaXF1ZSkKLSBgZW1haWxgICh1bmlxdWUpCi0gYGhhc2hlZF9wYXNzd29yZGAKLSBgZnVsbF9uYW1lYAotIGBhdmF0YXJfY29sb3JgCi0gYGlzX2FkbWluYAotIGBjcmVhdGVkX2F0YAotIGB1cGRhdGVkX2F0YAoKIyMjIyBjaG9yZXMKLSBgaWRgIChQSykKLSBgdGl0bGVgCi0gYGRlc2NyaXB0aW9uYAotIGBsb2NhdGlvbmAgKGJlZHJvb20sIGJhdGhyb29tLCBraXRjaGVuLCBldGMuKQotIGBmcmVxdWVuY3lfdHlwZWAgKGRhaWx5LCB3ZWVrbHksIGZvcnRuaWdodGx5LCBhZGhvYykKLSBgZnJlcXVlbmN5X3ZhbHVlYCAoSlNPTjogZGF5cyBvZiB3ZWVrLCBpbnRlcnZhbCkKLSBgZXN0aW1hdGVkX21pbnV0ZXNgCi0gYGNyZWF0ZWRfYXRgCi0gYHVwZGF0ZWRfYXRgCgojIyMjIGNob3JlX2Fzc2lnbm1lbnRzCi0gYGlkYCAoUEspCi0gYGNob3JlX2lkYCAoRkspCi0gYHVzZXJfaWRgIChGSykKLSBgYXNzaWduZWRfZGF0ZWAKLSBgZHVlX2RhdGVgCi0gYGNvbXBsZXRlZF9hdGAKLSBgc3RhdHVzYCAocGVuZGluZywgY29tcGxldGVkLCBza2lwcGVkKQoKIyMjIyBtZWFsX3BsYW5zCi0gYGlkYCAoUEspCi0gYGRhdGVgCi0gYG1lYWxfdHlwZWAgKGJyZWFrZmFzdCwgbHVuY2gsIGRpbm5lciwgc25hY2spCi0gYHJlY2lwZV9pZGAgKGZyb20gTWVhbGllKQotIGByZWNpcGVfbmFtZWAKLSBgY3JlYXRlZF9ieWAgKEZLKQoKIyMjIyBzaG9wcGluZ19pdGVtcwotIGBpZGAgKFBLKQotIGBuYW1lYAotIGBjYXRlZ29yeWAKLSBgcXVhbnRpdHlgCi0gYHVuaXRgCi0gYGlzX2NoZWNrZWRgCi0gYGZyb21fbWVhbF9wbGFuYCAoYm9vbGVhbikKLSBgbWVhbF9wbGFuX2lkYCAoRkssIG51bGxhYmxlKQotIGBjcmVhdGVkX2F0YAoKIyMjIyBjYWxlbmRhcl9ldmVudHMKLSBgaWRgIChQSykKLSBgZ29vZ2xlX2V2ZW50X2lkYAotIGB0aXRsZWAKLSBgc3RhcnRfdGltZWAKLSBgZW5kX3RpbWVgCi0gYGFsbF9kYXlgCi0gYGRlc2NyaXB0aW9uYAotIGBsb2NhdGlvbmAKLSBgbGFzdF9zeW5jZWRgCgotLS0KCiMjIPCfmoAgR2V0dGluZyBTdGFydGVkCgojIyMgUHJlcmVxdWlzaXRlcwotIERvY2tlciAmIERvY2tlciBDb21wb3NlCi0gTm9kZS5qcyAxOCsgKGZvciBsb2NhbCBkZXZlbG9wbWVudCkKLSBQeXRob24gMy4xMSsgKGZvciBsb2NhbCBkZXZlbG9wbWVudCkKLSBHb29nbGUgQ2xvdWQgUHJvamVjdCAoZm9yIENhbGVuZGFyIEFQSSkKLSBNZWFsaWUgaW5zdGFuY2UgcnVubmluZwoKIyMjIFF1aWNrIFN0YXJ0CgoxLiAqKkNsb25lIHRoZSByZXBvc2l0b3J5KioKYGBgYmFzaApnaXQgY2xvbmUgaHR0cHM6Ly9naXRlYS5oaWRlYXdheWdhbWluZy5jb20uYXUvamVzc2lraXR0eS9mYW1pbHktaHViLmdpdApjZCBmYW1pbHktaHViCmBgYAoKMi4gKipDb25maWd1cmUgZW52aXJvbm1lbnQqKgpgYGBiYXNoCmNwIC5lbnYuZXhhbXBsZSAuZW52CiMgRWRpdCAuZW52IHdpdGggeW91ciBjb25maWd1cmF0aW9uCmBgYAoKMy4gKipTdGFydCB3aXRoIERvY2tlcioqCmBgYGJhc2gKZG9ja2VyLWNvbXBvc2UgdXAgLWQKYGBgCgo0LiAqKkFjY2VzcyB0aGUgYXBwbGljYXRpb24qKgotIEZyb250ZW5kOiBodHRwOi8vbG9jYWxob3N0OjMwMDAKLSBCYWNrZW5kIEFQSTogaHR0cDovL2xvY2FsaG9zdDo4MDAwCi0gQVBJIERvY3M6IGh0dHA6Ly9sb2NhbGhvc3Q6ODAwMC9kb2NzCgojIyMgRGV2ZWxvcG1lbnQgU2V0dXAKCioqQmFja2VuZCoqCmBgYGJhc2gKY2QgYmFja2VuZApweXRob24gLW0gdmVudiB2ZW52CnNvdXJjZSB2ZW52L2Jpbi9hY3RpdmF0ZSAgIyBvciBgdmVudlxTY3JpcHRzXGFjdGl2YXRlYCBvbiBXaW5kb3dzCnBpcCBpbnN0YWxsIC1yIHJlcXVpcmVtZW50cy50eHQKdXZpY29ybiBhcHAubWFpbjphcHAgLS1yZWxvYWQKYGBgCgoqKkZyb250ZW5kKioKYGBgYmFzaApjZCBmcm9udGVuZApucG0gaW5zdGFsbApucG0gcnVuIGRldgpgYGAKCi0tLQoKIyMg8J+TnSBBUEkgRW5kcG9pbnRzCgojIyMgQXV0aGVudGljYXRpb24KLSBgUE9TVCAvYXBpL2F1dGgvcmVnaXN0ZXJgIC0gQ3JlYXRlIG5ldyB1c2VyCi0gYFBPU1QgL2FwaS9hdXRoL2xvZ2luYCAtIExvZ2luIGFuZCBnZXQgSldUIHRva2VuCi0gYFBPU1QgL2FwaS9hdXRoL3JlZnJlc2hgIC0gUmVmcmVzaCBhY2Nlc3MgdG9rZW4KCiMjIyBVc2VycwotIGBHRVQgL2FwaS91c2Vyc2AgLSBMaXN0IGFsbCB1c2VycwotIGBHRVQgL2FwaS91c2Vycy97aWR9YCAtIEdldCB1c2VyIGRldGFpbHMKLSBgUFVUIC9hcGkvdXNlcnMve2lkfWAgLSBVcGRhdGUgdXNlcgotIGBERUxFVEUgL2FwaS91c2Vycy97aWR9YCAtIERlbGV0ZSB1c2VyCgojIyMgQ2hvcmVzCi0gYEdFVCAvYXBpL2Nob3Jlc2AgLSBMaXN0IGFsbCBjaG9yZXMKLSBgUE9TVCAvYXBpL2Nob3Jlc2AgLSBDcmVhdGUgY2hvcmUKLSBgR0VUIC9hcGkvY2hvcmVzL3tpZH1gIC0gR2V0IGNob3JlIGRldGFpbHMKLSBgUFVUIC9hcGkvY2hvcmVzL3tpZH1gIC0gVXBkYXRlIGNob3JlCi0gYERFTEVURSAvYXBpL2Nob3Jlcy97aWR9YCAtIERlbGV0ZSBjaG9yZQotIGBHRVQgL2FwaS9jaG9yZXMvYXNzaWdubWVudHMvdG9kYXlgIC0gR2V0IHRvZGF5J3MgYXNzaWdubWVudHMKLSBgUE9TVCAvYXBpL2Nob3Jlcy9hc3NpZ25tZW50cy97aWR9L2NvbXBsZXRlYCAtIE1hcmsgY29tcGxldGUKCiMjIyBDYWxlbmRhcgotIGBHRVQgL2FwaS9jYWxlbmRhci9ldmVudHNgIC0gR2V0IGNhbGVuZGFyIGV2ZW50cwotIGBQT1NUIC9hcGkvY2FsZW5kYXIvZXZlbnRzYCAtIENyZWF0ZSBldmVudAotIGBQVVQgL2FwaS9jYWxlbmRhci9ldmVudHMve2lkfWAgLSBVcGRhdGUgZXZlbnQKLSBgREVMRVRFIC9hcGkvY2FsZW5kYXIvZXZlbnRzL3tpZH1gIC0gRGVsZXRlIGV2ZW50Ci0gYFBPU1QgL2FwaS9jYWxlbmRhci9zeW5jYCAtIFN5bmMgd2l0aCBHb29nbGUgQ2FsZW5kYXIKCiMjIyBNZWFscwotIGBHRVQgL2FwaS9tZWFscy9wbGFuc2AgLSBHZXQgbWVhbCBwbGFucwotIGBQT1NUIC9hcGkvbWVhbHMvcGxhbnNgIC0gQ3JlYXRlIG1lYWwgcGxhbgotIGBHRVQgL2FwaS9tZWFscy9yZWNpcGVzYCAtIEJyb3dzZSBNZWFsaWUgcmVjaXBlcwotIGBQT1NUIC9hcGkvbWVhbHMvZ2VuZXJhdGUtc2hvcHBpbmctbGlzdGAgLSBHZW5lcmF0ZSBsaXN0CgojIyMgU2hvcHBpbmcKLSBgR0VUIC9hcGkvc2hvcHBpbmdgIC0gR2V0IHNob3BwaW5nIGxpc3QKLSBgUE9TVCAvYXBpL3Nob3BwaW5nYCAtIEFkZCBpdGVtCi0gYFBVVCAvYXBpL3Nob3BwaW5nL3tpZH1gIC0gVXBkYXRlIGl0ZW0KLSBgREVMRVRFIC9hcGkvc2hvcHBpbmcve2lkfWAgLSBSZW1vdmUgaXRlbQotIGBQT1NUIC9hcGkvc2hvcHBpbmcve2lkfS9jaGVja2AgLSBUb2dnbGUgY2hlY2tlZAoKLS0tCgojIyDwn5SUIEhvbWUgQXNzaXN0YW50IEludGVncmF0aW9uCgojIyMgQ29uZmlndXJhdGlvbgpBZGQgdG8gSG9tZSBBc3Npc3RhbnQgYGNvbmZpZ3VyYXRpb24ueWFtbGA6CmBgYHlhbWwKcmVzdF9jb21tYW5kOgogIGZhbWlseV9odWJfY29tcGxldGVfY2hvcmU6CiAgICB1cmw6ICJodHRwOi8vZmFtaWx5LWh1Yjo4MDAwL2FwaS9jaG9yZXMvYXNzaWdubWVudHMve3sgY2hvcmVfaWQgfX0vY29tcGxldGUiCiAgICBtZXRob2Q6IFBPU1QKICAgIGhlYWRlcnM6CiAgICAgIEF1dGhvcml6YXRpb246ICJCZWFyZXIge3sgc3RhdGVfYXR0cignc2Vuc29yLmZhbWlseV9odWJfdG9rZW4nLCAndG9rZW4nKSB9fSIKYGBgCgojIyMgTm90aWZpY2F0aW9ucwotIEJpbiByZW1pbmRlcjogVHVlc2RheSA4IFBNCi0gT3ZlcmR1ZSBjaG9yZXM6IERhaWx5IDcgUE0KLSBQZXQgY2FyZTogTW9ybmluZy9FdmVuaW5nCgojIyMgRGFzaGJvYXJkIENhcmQKKEN1c3RvbSBjYXJkIGNvbmZpZ3VyYXRpb24gd2lsbCBiZSBwcm92aWRlZCkKCi0tLQoKIyMg8J+OryBOZXh0IFN0ZXBzCgoqKkN1cnJlbnQgRm9jdXMqKjogUGhhc2UgMSAtIEZvdW5kYXRpb24gJiBDb3JlIFNldHVwCgoqKkltbWVkaWF0ZSBUYXNrcyoqOgoxLiBTZXQgdXAgRmFzdEFQSSBiYWNrZW5kIHN0cnVjdHVyZQoyLiBDcmVhdGUgZGF0YWJhc2UgbW9kZWxzIGFuZCBtaWdyYXRpb25zCjMuIEltcGxlbWVudCB1c2VyIGF1dGhlbnRpY2F0aW9uCjQuIEJ1aWxkIGJhc2ljIFJlYWN0IGZyb250ZW5kCjUuIENyZWF0ZSBEb2NrZXIgY29uZmlndXJhdGlvbgoKKipUbyBEaXNjdXNzKio6Ci0gUHJlZmVycmVkIGNvbG9yIHNjaGVtZSBmb3IgVUkKLSBDaG9yZSByb3RhdGlvbiBwcmVmZXJlbmNlcwotIE5vdGlmaWNhdGlvbiB0aW1pbmcgcHJlZmVyZW5jZXMKLSBNb2JpbGUgYXBwIHZzIFBXQSBkZWNpc2lvbgoKLS0tCgojIyDwn5OaIEFkZGl0aW9uYWwgUmVzb3VyY2VzCgotIFtGYXN0QVBJIERvY3VtZW50YXRpb25dKGh0dHBzOi8vZmFzdGFwaS50aWFuZ29sby5jb20vKQotIFtSZWFjdCBEb2N1bWVudGF0aW9uXShodHRwczovL3JlYWN0LmRldi8pCi0gW0dvb2dsZSBDYWxlbmRhciBBUEldKGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL2NhbGVuZGFyKQotIFtNZWFsaWUgQVBJIERvY3NdKGh0dHBzOi8vZG9jcy5tZWFsaWUuaW8vKQotIFtIb21lIEFzc2lzdGFudCBSRVNUIEFQSV0oaHR0cHM6Ly9kZXZlbG9wZXJzLmhvbWUtYXNzaXN0YW50LmlvL2RvY3MvYXBpL3Jlc3QvKQoKLS0tCgojIyDwn6SdIENvbnRyaWJ1dGluZwoKVGhpcyBpcyBhIGZhbWlseSBwcm9qZWN0LCBidXQgc3VnZ2VzdGlvbnMgYW5kIGltcHJvdmVtZW50cyBhcmUgd2VsY29tZSEKCi0tLQoKIyMg8J+ThCBMaWNlbnNlCgpQcml2YXRlIGZhbWlseSBwcm9qZWN0IC0gQWxsIHJpZ2h0cyByZXNlcnZlZAoKLS0tCgoqKkxhc3QgVXBkYXRlZCoqOiBEZWNlbWJlciAxOCwgMjAyNCAgCioqQ3VycmVudCBQaGFzZSoqOiBQaGFzZSAxIC0gRm91bmRhdGlvbiAmIENvcmUgU2V0dXAgIAoqKlN0YXR1cyoqOiDwn5+hIEluIERldmVsb3BtZW50Cg== \ No newline at end of file +# ๐Ÿ  Family Hub - Home Management System + +> A comprehensive family management system for organizing daily life - calendar, chores, meals, and shopping. + +[![Version](https://img.shields.io/badge/version-0.1.0-blue.svg)](https://gitea.hideawaygaming.com.au/jessikitty/family-hub) +[![Python](https://img.shields.io/badge/python-3.11+-green.svg)](https://www.python.org/) +[![React](https://img.shields.io/badge/react-18-blue.svg)](https://react.dev/) +[![Status](https://img.shields.io/badge/status-Phase%201%20Complete-success.svg)](PROJECT_ROADMAP.md) + +--- + +## ๐Ÿ“– About + +Family Hub is a standalone home management system designed for families to coordinate their daily lives in one place. Think of it as "Skylight on steroids" - but self-hosted and customizable for your family's specific needs. + +Built for a family of 5 (Lou, Jess, William, Xander, Bella) plus pets (Chips the cat ๐Ÿฑ and Harper the dog ๐Ÿ•), this system helps manage: + +- ๐Ÿ“… **Family Calendar** - Google Calendar integration +- ๐Ÿงน **Chore Tracking** - Daily, weekly, fortnightly, and ad-hoc tasks +- ๐Ÿฝ๏ธ **Menu Planning** - Mealie integration for meal planning +- ๐Ÿ›’ **Shopping Lists** - Auto-generated from meals + manual items +- ๐Ÿก **Home Assistant** - Push notifications and dashboard integration + +--- + +## โœจ Features + +### โœ… Currently Available (Phase 1 - Complete) + +- **User Management** - 5 family member profiles with roles +- **Authentication** - Secure JWT-based login system +- **Database** - SQLite with models for users, chores, and meals +- **API Backend** - FastAPI with auto-generated documentation +- **Frontend Foundation** - React 18 with Tailwind CSS +- **Docker Setup** - Easy deployment with Docker Compose + +### ๐Ÿšง In Development (Phase 2) + +- **Chore System** - Create, assign, and track household tasks +- **Recurring Schedules** - Daily, weekly, fortnightly patterns +- **Assignment Logic** - Individual, shared, and rotating chores +- **Completion Tracking** - Mark tasks done with history + +### ๐Ÿ”œ Coming Soon + +- **Google Calendar Sync** - Two-way calendar integration (Phase 3) +- **Mealie Integration** - Recipe management and meal planning (Phase 4) +- **Dashboard** - Unified home view with widgets (Phase 5) +- **Home Assistant** - Notifications and dashboard cards (Phase 6) + +--- + +## ๐Ÿš€ Quick Start + +### Prerequisites + +- **Docker & Docker Compose** (recommended) +- OR Python 3.11+ and Node.js 18+ for local development + +### Installation + +1. **Clone the repository** + ```bash + git clone https://gitea.hideawaygaming.com.au/jessikitty/family-hub.git + cd family-hub + ``` + +2. **Configure environment** + ```bash + cp backend/.env.example backend/.env + # Edit backend/.env and set a strong SECRET_KEY + ``` + +3. **Start the application** + ```bash + docker-compose up -d + ``` + +4. **Initialize database** (first run only) + ```bash + docker-compose exec backend python init_db.py + ``` + +5. **Access the application** + - Frontend: http://localhost:5173 + - Backend API: http://localhost:8000 + - API Docs: http://localhost:8000/docs + +### Default Credentials + +| User | Username | Password | Role | +|------|----------|----------|------| +| Lou | `lou` | `changeme123` | User | +| **Jess** | `jess` | `changeme123` | **Admin** | +| William | `william` | `changeme123` | User | +| Xander | `xander` | `changeme123` | User | +| Bella | `bella` | `changeme123` | User | + +โš ๏ธ **Change these passwords immediately after first login!** + +--- + +## ๐Ÿ“ Project Structure + +``` +family-hub/ +โ”œโ”€โ”€ PROJECT_ROADMAP.md # Development tracker (CHECK THIS REGULARLY!) +โ”œโ”€โ”€ SETUP.md # Detailed setup instructions +โ”œโ”€โ”€ README.md # This file +โ”œโ”€โ”€ docker-compose.yml # Container orchestration +โ”‚ +โ”œโ”€โ”€ backend/ # FastAPI Backend +โ”‚ โ”œโ”€โ”€ app/ +โ”‚ โ”‚ โ”œโ”€โ”€ api/ # API endpoints (auth, users, chores) +โ”‚ โ”‚ โ”œโ”€โ”€ core/ # Config, database, security +โ”‚ โ”‚ โ”œโ”€โ”€ models/ # SQLAlchemy database models +โ”‚ โ”‚ โ””โ”€โ”€ schemas/ # Pydantic validation schemas +โ”‚ โ”œโ”€โ”€ init_db.py # Database initialization +โ”‚ โ””โ”€โ”€ requirements.txt # Python dependencies +โ”‚ +โ””โ”€โ”€ frontend/ # React Frontend + โ”œโ”€โ”€ src/ + โ”‚ โ”œโ”€โ”€ App.tsx # Main application + โ”‚ โ””โ”€โ”€ main.tsx # Entry point + โ”œโ”€โ”€ package.json # Node dependencies + โ””โ”€โ”€ vite.config.ts # Build configuration +``` + +--- + +## ๐Ÿ› ๏ธ Tech Stack + +### Backend +- **FastAPI** - Modern Python web framework +- **SQLAlchemy** - SQL toolkit and ORM +- **SQLite** - Lightweight database (PostgreSQL-ready for production) +- **Pydantic** - Data validation using Python type annotations +- **JWT** - Secure authentication with JSON Web Tokens + +### Frontend +- **React 18** - JavaScript library for building user interfaces +- **Vite** - Next generation frontend tooling +- **Tailwind CSS** - Utility-first CSS framework +- **TypeScript** - Typed JavaScript for better development experience + +### DevOps +- **Docker** - Containerization for consistent environments +- **Docker Compose** - Multi-container orchestration +- **Uvicorn** - Lightning-fast ASGI server + +--- + +## ๐Ÿ“– Documentation + +- **[SETUP.md](SETUP.md)** - Complete setup guide with troubleshooting +- **[PROJECT_ROADMAP.md](PROJECT_ROADMAP.md)** - Development progress tracker (โญ **CHECK THIS REGULARLY!**) +- **[SESSION_SUMMARY.md](SESSION_SUMMARY.md)** - Latest development session notes +- **API Docs** - Auto-generated at http://localhost:8000/docs + +--- + +## ๐ŸŽฏ Development Progress + +**Current Status:** Phase 1 Complete โœ… (30% overall progress) + +See [PROJECT_ROADMAP.md](PROJECT_ROADMAP.md) for detailed progress tracking. + +### Completed Phases +- โœ… **Phase 1:** Foundation & Core Setup + +### Current Phase +- ๐Ÿšง **Phase 2:** Chores System (In Planning) + +### Upcoming Phases +- โณ Phase 3: Calendar Integration +- โณ Phase 4: Menu Planning & Shopping +- โณ Phase 5: Dashboard & Home View +- โณ Phase 6: Home Assistant Integration +- โณ Phase 7: Polish & Deployment + +--- + +## ๐Ÿ  Family Configuration + +### Household Layout +- **5 Bedrooms** - Lou, Jess (with Ensuite), William, Xander, Bella +- **2 Bathrooms** - Shared bathroom + Master ensuite +- **Kitchen** - Dishwasher, hand washing area +- **Laundry** - Washing machine, dryer +- **Dining Room** +- **Outdoor Areas** + +### Pets +- **Chips (Cat)** ๐Ÿฑ - Daily feeding, watering, litter maintenance +- **Harper (Dog)** ๐Ÿ• - Daily feeding, watering + +### Weekly Schedule +- **Bins** - Wednesday morning pickup +- **Recycling** - Fortnightly (alternates with greens) +- **Greens Bin** - Fortnightly (alternates with recycling) + +--- + +## ๐Ÿ”ง Configuration + +### Backend Configuration + +Copy `backend/.env.example` to `backend/.env` and customize: + +```env +# Application +APP_NAME=Family Hub +DEBUG=True + +# Database +DATABASE_URL=sqlite:///./family_hub.db + +# Security (CHANGE THIS!) +SECRET_KEY=your-super-secret-key-here +ACCESS_TOKEN_EXPIRE_MINUTES=30 + +# CORS +ALLOWED_ORIGINS=http://localhost:5173,http://localhost:3000 +``` + +### Future Integrations + +The system is designed to integrate with: + +```env +# Google Calendar (Phase 3) +GOOGLE_CLIENT_ID=your-client-id +GOOGLE_CLIENT_SECRET=your-client-secret + +# Mealie (Phase 4) +MEALIE_API_URL=http://your-mealie-instance +MEALIE_API_TOKEN=your-api-token + +# Home Assistant (Phase 6) +HOME_ASSISTANT_URL=http://your-ha-instance +HOME_ASSISTANT_TOKEN=your-long-lived-token +``` + +--- + +## ๐Ÿ’ป Development Commands + +```bash +# Start services with Docker +docker-compose up -d + +# View logs +docker-compose logs -f backend +docker-compose logs -f frontend + +# Stop services +docker-compose down + +# Rebuild containers +docker-compose up -d --build + +# Run backend tests +cd backend && pytest + +# Run frontend tests +cd frontend && npm test + +# Access backend shell +docker-compose exec backend bash + +# Database operations +docker-compose exec backend python init_db.py +``` + +--- + +## ๐Ÿงช API Endpoints + +Once running, explore the API at http://localhost:8000/docs + +### Authentication +- `POST /api/v1/auth/register` - Register new user +- `POST /api/v1/auth/login` - Login and get JWT token +- `POST /api/v1/auth/refresh` - Refresh access token + +### Users +- `GET /api/v1/users` - List all users (admin only) +- `GET /api/v1/users/{id}` - Get user details +- `PUT /api/v1/users/{id}` - Update user +- `DELETE /api/v1/users/{id}` - Delete user (admin only) + +### Chores (In Development) +- `GET /api/v1/chores` - List all chores +- `POST /api/v1/chores` - Create new chore +- `GET /api/v1/chores/{id}` - Get chore details +- `PUT /api/v1/chores/{id}` - Update chore +- `DELETE /api/v1/chores/{id}` - Delete chore + +--- + +## ๐Ÿค Contributing + +This is a family project, but suggestions and improvements are welcome! + +1. Fork the repository +2. Create a feature branch (`git checkout -b feature/amazing-feature`) +3. Commit your changes (`git commit -m 'Add some amazing feature'`) +4. Push to the branch (`git push origin feature/amazing-feature`) +5. Open a Pull Request + +--- + +## ๐Ÿ†˜ Troubleshooting + +### Common Issues + +**Port already in use:** +```bash +# Check what's using the port +sudo lsof -i :8000 +sudo lsof -i :5173 + +# Change ports in docker-compose.yml if needed +``` + +**Database not initializing:** +```bash +docker-compose down -v +docker-compose up -d --build +docker-compose exec backend python init_db.py +``` + +**Frontend not loading:** +```bash +# Rebuild frontend container +docker-compose up -d --build frontend +``` + +For more help, see [SETUP.md](SETUP.md) or check the API docs at `/docs`. + +--- + +## ๐Ÿ“ License + +This project is licensed under the MIT License - feel free to use it as inspiration for your own family management system! + +--- + +## ๐ŸŒŸ Project Status + +- **Created:** December 18, 2025 +- **Current Version:** 0.1.0 +- **Phase:** 1 of 7 Complete +- **Status:** ๐ŸŸข Active Development + +--- + +## ๐Ÿ“ž Links + +- **Repository:** https://gitea.hideawaygaming.com.au/jessikitty/family-hub +- **Development Tracker:** [PROJECT_ROADMAP.md](PROJECT_ROADMAP.md) +- **Setup Guide:** [SETUP.md](SETUP.md) +- **API Documentation:** http://localhost:8000/docs (when running) + +--- + +**Built with โค๏ธ for family organization** + +*Making household management easier, one task at a time!*