-- CeetOS signed release. Generated; do not edit.
-- CEETOS_RELEASE_MANIFEST:e2NoYW5uZWw9InJlbGVhc2UiLHByb2ZpbGU9InJlY2lwZS1zZXJ2ZXIiLHZlcnNpb249IjAuMTkuNTMiLHNpemU9ODMyMDQwLGRpZ2VzdD0iNjQ4Mzc1YWNlMjAxZTc5MzZmOTNhMTM5N2UxNzRkYzliYTk3NjIyNDFjZTcwYmE0Nzc0MmI2ZDhmZTZmZmE1YiIsa2V5X2lkPSJyZWNpcGUtc2VydmVyLXJlbGVhc2UtMC4xOS41MiIsbmV4dF9rZXlfaWQ9InJlY2lwZS1zZXJ2ZXItcmVsZWFzZS0wLjE5LjUzIixuZXh0X3B1YmxpYz0icnZqQ0JvTmYxMHNvajdkSEw4T09sVWZlSTZjQ2h3RmkwL2VpUlR3TGZDVXFvRUlsc05QalJzeVZEUVVMbTlQVzk5TDV6MEFNRC9LSzdINHI5TG1BRHRQeEV2ZVpGQVRHZy9uaU1CWVliOFY2RkVLQThTb01VQXR6WUl3cHNRVFA5N2d0RktDR0NlT1NUTVpQSS9OTmhEdVlUQ08zeUhaUlpxTGVDanFuY0YzVzNuYll1QzNpaFE0UzkzRUFKMFJVNFR4RUxGNjd4NWVNcTBNeW9IREN2aDZEb01UMVQ4dkpkclFyTG9qMkw3djlJZVpwbTZIQ3BiSjY3cTRVaERkK3EvNEhISWFiYjhwWGkrRkRlajFvWlpyZHd5NGVEb0FNRTVxQUVSL3NhQUlsZmQ3dE0zNDlsdXN4aHBGMlBBKzYyUW9vVXp0cjExOXQ2a1dQcUtndHFSeG96R3NjOWY0RFBxM2cyRkllalVPK3U3SUgvK0UvTWYrM0dUSDVSWk1rRDJ3bk5MTzJBWklxY3B4NHRtYkcvVWtXR1lpTG9QK1gxOVcwcVFEQzBBM1NRekNPdFdLalFBV2Y3d3V6RkhCMnpBOU41ZmJCekM0NExZRDAzcVoyMFR3cnlCaXpjMUNxNXI4dThOVW54Y1NrQlFtSkxIeXJ5bXJ1enZSdThxcTZOV3doRHMwcXhWOG55aHRSZHJBcklLcjNXT3F1cGdDZTFPTTVoWHFEQ1F6cm9mamYvYmxlemxkMGlGcnRRM2dXRDRHTFF4aWlRSUN1bGpUa0pXeEh5NUFBMFI4azRvUjIwZndpTU1DUjZvWFJ6TTd5b2pEbzVPVk1QQXZxUzRPOTZWcG5tZmxJc1NNaEpONFdIOVVucmlCazJDaWduUXBNakpjb1RBV2daaTRleGVhdzh1akxkemJpTE9pZDFvc1FIOFRNVzZsTDk5c2EyTVdlS2ovcHp2OXF3ZzdrTXd5L0tpZUlWZVg2OFBpTmxwbVpzbExteEZFR3F5cFVXVndYenZheExJWTlVaGo4OEwvdHhWdTQzWnptNnVOeFJjNUZpaklhYnlQQktObit2S0F3SXdmWkZSbTBIQ1NwN2cvWTQrb2xhZUFnS0dveG45ZWVORFZHWFhvOTdzZUIyQkk5d0FvTTE2Y1NUbEhzOUFZMmphRWRVTTRmalJwQ2wwWUt5cWp0TWhpeUN6WUV0YlBwNCtEVEYwR0d6dkZsMDYzQ0FVU1FrcnZ3UkszdGEwVVJRM2k0OTUvU0w5djlGK2MxVWgxOGpWT0pEVElBQUsyWk1VTW1KNWZ0QVZMWTRJNGV1a2xzOHUvYnQ2ZUdNL0FDWndNNS9hL01IWDlXSEF0T29ySU5rbHQ1cWh1dzZWdmgvRUp0WTNHS2NPUVFoUm5JUzd6M1BrdXVhMVRYcjBDQnhxRUxWOU1WOWduV0trSDg0S3Rocjh0MVhlYWFNNXB5UjBwdnRKRXkwb0htaVZremI0YUtjdmVnUmtYbTB2YWhyYkx1K0NzMHRMRzFvMldpNGJxQ0tQVzFOM2ZVcW9IcFlRY2dlT21FZkFlajFuV3ZaMVdlTFg3OUhJb0JWdVpJOWlxNmhVNzhadllXdlRVRGVKY29LM2VlN0VGemJ5aHYrRmszY0E2TE0xY285NUJDNm55c3F2QlpCUk5yRndzbTBTcTRPa2RTdnYyK3Y0WnZZenFpRi9TdXJMUDlkNVZMakEwT295Vm0rZU1ueC8yL3k3SHU2emhmc1dLSW1GMFJPdFhDMU54RXdWNnBKSjg1b0Y4MEF4a1Q4ZEhCcU91dlpPQUZ2dGEzTWp0OWJZM213WHFoQ0tuNUxNdXJ3Q2cvRU01Uk1EUWdBQXJvbExGeWtMU0ovbVpsOVkwVkZCMGk2Wm1Yc2dLUXdTR1Zhd0pycHB4THAzOHg0UVVody9BRXhqaUlKRU1Yc09YaURPOVUwWEZGY1FueTU2TkFLcWZIVlY0S2xlZmdLSWxOeUVlT1VidjIyQjhQOUVPdWY2SEE4UkVHUGxBVERqT3B5ZnNZalhDQXBzMmlSbGl3SlBMZXZKWkZvcTlEcUNuY2hrL3dxZU9sR09CcUpkRHlLdC9IMmdKTWhnMXVJNzh1YlBVdEFYcDhqT3lNdnEyRkNXSHJKeWNkTWxaYk1jT1hjMFA2TUlNS1ZPai9jK2pTQStqZUFBRjRJTFdwSEY1dVRNMDlZY0JvQkNlWFpscysyQnA5ZXVwSHpwa3luVG5rRGh1UVNzcmJ1d0pqTC9oSkxPREZUYnBDUlozVTNsd3FGK0NKMDkxWE1BK3lhTjZwZEhQZktpaDJrK1BRb2FLblVDMnNFd2NSMFJqQjJrRVBHT2VtQVJFSkNRaTVVOHhIa29VdEFLNDI0b1NObng0cmhVTXJzKys3Y3gxM0c0cFNJQk1LNW1HZlBxWG0vQUdHVUdpTXhxNk5wSXQwUVRWek1tYzdQNWhtczhsaGNGc0tUN1ZlTFR4M1UzWC9IZTNHOFVvU2tPM2psQ2cxTGlNcWt5TStCZHptaXdYUGtjUitveXJpMEdkYWxXZ0xnU1d6TkpQUVkxREd3bVQzVGJka2t3VUhXVTVzanZIVEkvbzV2Q1J1UGZ3ZFFad2ZUV21EZXFyUFBmeVljc0duN1JpSEpSb0hEajI0aGNHV1liQVNtWWtVTkpSbWx5M0RPN3MvblhoRWhtNzJ6NzhFbFBWRjYrdkl0bkMxMU10YmRwd2tKckJJNWxhMnFCTlJLM1lBYXFxMU1oenUrenVXSDIyWndpZkxCMjdSUVR4L2VpSEs0SWtpQ0ZvM1NHby9tVUFSbXlmaEVLbmlCWnpkNEhxbEIwWU03TTVtNGZPOGFlZ1JSc0p0dFhnb1VoRnAwZUdieW5yZ0ZoZXJUcEJqZlhHOXpINElySDBSWGp5MlkwdU4yYmZvUEttUUhjd3JBRHl4TXFzeW9SQUttM0VWOVBjbjlIbjluYml3QWFEd0lJSXptVHp2MmVkbDRPTGZlN0NTVTd5djA1R3phUm9TTS9TcEFNWUQyYi9HcnpoanprUUtidTh2WXZPcVpNaG5vWUhQSnoyU2RRNmJ1ZzdHT0lTUTdyM2FFU0hSK2FzWEFlV0ZwZHM5VmRUT2doam5OUGlBYjREVWw1cW43WTFsVjg0RjdOYkIxKyt6RjF5UGczRVJWSjYwNEhQTmQxVXlseStaSy93VlJhM29aNkNiVmRrSlBMNEo1cG9yMnFmaWZhMm01R01yWUgrTnJDNnhkY2NudjNoaFlDMEt0d0RvTkg0NkoxMWpDK1I4UlRkRVdMUEZJNWJ6RHVIWlEvS0RGeklKVGdXUHpZS3AvUGZaWUZuQys2Qm9qQ3VjbmRyQmh2Q21zNUdjSUd3TU1ZaE9xOU93elkyU1J5UkFHMnNCaUtYSEdxbDFuNlFlVFRCR3dxYjZsR2d1NkZwRlplQi9ZV1k3cS9EcHdLd2JLNXN2dnVLWUxadjJKSFpDcjkzRXo2NjZTd1dVQVZsMjhEZUI4ampTdHdVQ3ZwNTRLRFNxaEhrdlRLTEJocldPS3l1Qzhyd2ZONjhpRTdHc1JJMU9KYURuK1pHTDZ3Smw2SUVtbTdDSVRWUWd1ZGlILzVlUTdOZTJOV1JkK21QZmFFbCtHRUw2MHg0YUIrSFloeUFVcnpoNkYwdlpXUnBsRGNUQ2lXaXVHcy9TNjNESUsrcnVXOTNwQnY3Z3ZqUFJRaDBub2FZdXN5YW1hSjh3WDZMOVhpVGE5c2tGZEdWRkpyU2p2NWlOMkNnRUZwQkJhd0xDcGhDRFhxcnlmMkNlRE1xalFmNHRxSmFsZ2NaZ1RrKzNJaE40TFNkUFh6MytUUjgzM1NkVndVNE1PMklCMWsyZlhaZU1Hdzk4RHEzZ2JaZTRQZG92b3hyUlJXbW9TYnZpQWVIK214bWdhM1V0dHBSa3BYRS9BN1dvMUdHd0FhbEhHMG40ODRqM3puNHA0YU5mV0FHUlpOK3cxdjF2bjBTNnRNOTY3cmNmR05tV1c2RmZveGpTalNac3JhNkk5d2tQMXlpOWpqNGpIVkhwelVrc2NPSXQ2eHR3aWk4SXhhZ0ppTjJDTlRKU0xXekI0ZDRwTWJYOGtOcGNVVE14LzFiWFZQTlhlQWJENkNiRjJOOTNUWWZybnhweGNadlBhVEFsYm1VZ1p3a21saDhMamw0eWhCQUhwTnlrU1RwTCtYd2ozamlnUmd4b3BtSDJ6QVBmZTJzVzRocW5Kck0rVHNjcDZPaVdXeVJEbHlVb1RqWWl0K0ZiM0l3b3RWaEErcUFOUzhueE1COCtXWk9HNXRaNnpQenZWOFBId3NEU2JvM0tEOVpSbUFmM0ttSXBCMDN1L0ZuWkZ2V2w3Uk5zSHVyVS82b1NRdm1kenNORkVuMGZodUNGR21mdUdWN3dWTWRSNXZaNW9EeHNmTk1PNkF5WXFUVTFJNmkzUjlRWklqbi9wSnRkZDBzNzdaVE5qV0ptWm91K1dsa0FVQVRQcHFJOVFmTEFMU1VrRkt5SXVqV2l2dlJpbXNhRTFVUGdKbzVQZXNKOVBNTUgycEhiQzNmY2NaTGgvSU1iSklDaGZBNEkrZnJtajdaTEhzYVZGOXkzeU5pb0k4RnNFUG1JSEt4RitqQ2dvUlZ3bkJMc2p0aWk5cFVtTnNtYWxsbCtMS2krZ2F1cWhSRWJYOTFxR1Fiejl5NWpYWGk3WDd1YWo5K0RjYmJ3c3RkQlVrTHNyL0Rob200LzVsS3R1YUJPMmF0Sit2NVNVWmZmZXhWSThmUHFFNThXQ3N2bDFIMGtZclYzWENlVDVtOUR4YTFtVjVwSklZWmcvdnNIUUw1NU5KS2VPUHdTV1hYY3NTMnpHV0xDV1M0eW5wb0Q2a0ZyZjhSa2h1TUc4Wi9nNk4wMHpxQklBTm9jV2JScUlmbjRyS3BremZ1Z2twK0t0K2ZGZ1BickpWcGljeTE2RFpIRDJhQ2FhTnhJcERYdFp6OWxpd3FkYVhmWThmTThPK0UrVS9UZEJJdzBKbkl1aStqcXIyQUxtMHVFdm1iazRaRDJwOGVGdGxrQ3hxSUt2S2ZCQVFsTXgyWDE2K2lOMFlUOWhxVXhrWEdnNzV6UXZYR3JocTFGVnNPajdxdjJldDZEUHVXN203dzZSMnNickpNdnRvUTJGZDFVT21ucU14MThYbmIra3dzUm1YK0xaRk9QVEEzbWxJeG5zOWNta29WSVFTdmd2NHZ3V0wvQWtVNkF3UVM0M3NqUG1LWXFsdWhQcG5nci9jQmJVZTZNUDcyZW42bTJyQytOdHlheU5BajhycGFmV3c1OEk2MGVQOFBaQ01XdjR0LzRYak9YZzZoV0N5VGgwSm9vMjE3MENJaHRibjFsbkcwdVh5dFhaVjk1RHIxZXNXZGlaTHBvcm9FaVVNWUwvdjJsb042eVJLYjZ6ZFBQeitXTUhQNnVYUEp2Syt4NG1YODdwVWorZFE1TmtZV3UxTGxsQXVxY09jUzNMY1ViL0M0dWdPNmQ1c3oxNWNKL3lFTERPL0dzQTRoY20zVndCOTBtaURPenFqMkVQcmxNT1pxOVdsbE45UTFJN1BlczdHcGZobVVqeWhySVdIVFFnY1FkTjNDcEVxN3VuVHhzOThjVWEzTFRXMmFFYTVyRnNzaU4wQ0RNd2l3eWFUejlwMTZMQWs0R0w1bTJ5MTQxM0N2Nnc3VWFMbnk4QnF5bkxoKzdMM2JlN3R0b1MrL0xlKzUxU2dYYWVCdGVXTTYyVGJOUkJKa0hoNEtqUFplVFVqZkZjNFNldUdhMnlnclBYUnYrcUlaZXBubXFNN0FxL1c0T0lIRFBLV090SzFWQ21vbzEweEhqYm5WZUhHa2pQY1E3WFVrYzJUZkhTVjVxYnN3aUtTeGFTNWdoS3JpTm5oMkZ3VG1xWkw0NFdWT25JWlNJSDlDYVlaWVpORUlWYmoybW5WbE5ieU5iUldhUmt4ejNzTDV0em5mVjZxUEo0dGc4bFQ5VVI5VnpoY1FKRGR4dVlpZlZQcXc2VXg1MHhIVWVMMXk3M1I4M2hlMFh1ZzBMUDRDSW1MRFJUUEcyZzVGTWZYbFhQMHdBWDdOM21IUzVsNnZ5cExKdnB3T0FEVStEZnRYTDEreDB5eDluc25DT3R3REN6aDhqUWhIbU5HTDJzM0RudjNORXhCVThObkxpcnpFTVhUcjZkbVVuTXlQYThDb1Rtb2lqWDJTdmhaTDI1R1p4OHd0YnVwYzZndWpvdHJEVWdXSTFjWDl5bUE5SWlJUjd5eGJrMDVra1RLUmZaVzd0cHRFSWpSTUt6ZzBzTmpwOElybm5kYXlYOHQ1bzA1NCtwajdySmswNkNNTjA0RHNVVGZxMGNuTVVoMFVKbmxKNllCV2lSbjJxbURDSGZYaytsK3hUTEY2UHl3MmdUakpxcDd5NzVBazI3eWdmcjQ2Y0dTdk9UUndtQmlqRzBuOEw1L1pMd3ZPVjZmVGpIRkRTeFVGQmpNOG1WdHFtNzBobjlwTmtYYnJLRm0yenVoVmExOW9uTDc2eUFiTHRYbm5CT3RUZVBTTGh1SlROdlJ0S0JWL1NrbE5KamNxTENSaE9Tb3ZwMlNrQ21WQnlab3Y4bHJ5R1VKMWR5dmZEdDFnZ1ZqNklLWU1wbkl1RHFLYkNDdVd3QWtFeXNsaXY0c3cxQWlWQ1ZYWnhjakNndkZhWk5GQU02Z1EyY0pERldzRXR2Q0YzRHJ4cTNWS2Q3WitObjZ6NmNaNHd1SDJsU0ZiOWtJdjRheVkwSlJsRHhRdU9vNWpiNyt1WDlNRjU1cWs4LzdadG16TklIQTlQRDdVQWpJSjNUaGFmZVZkU043ZVhIalVQQWN6R3FkUWdrc0JtMG41WFFneUZHdlpVQ3JTRE5Tdi9BSm5GU0NhLzMxbHBTTndvRjN6QWdlN2w4b21aQ3ZWcUVHMnRQcmtjenNpanZ3SHJmaWoxcmZib3p4aG1hWURDam5mTjBLSG5RcjlMWTRXbE9aV1hyZTI1Tll3cnhVL3ZGVHVhZ1hOWUZ0eXp6ZGhnYyt1RWNVOUtPeHVUNDhrTlExTlY5L1dHbnpQUHlLai93Q3VzV3phaGlIV2l4cFBZV2Zkbk80QUllV3pYdTRKRlZrRjg2TmlXV2dWRnhjc2RCN2xwSXBJc0ZlZGZYSkhUcmZpMVJpZkJiVmtEemhlcUZXQkNrSy9zR1lkRjZ6TTlqT1I5UjVvbEM3cWxzaXVuQm5lbUFjd3Q2RHltTE9UUkdrajhHc29FYk1JM3NKK0l4dkhZNU9kZEg4elgreGhVVFJsb2RYV0NRR1o5VU4rMWI5N2pud092VFFjRmR4MWtSMklnendZbEZkYzZVU2dQY1dTayt5SndxNXpFb3ZLT0hTSjNaUm90YU1pYlpCRmRsOTUxVGVHQ01EUmRUcStXNkw4N2c3Q2t1VUh5ZE9vYnhwdzlDVW9MRG1ZNE1oZGx0dDB5NGcvaCtraVMvVnFvSEdiMkJaa1d4SjF2QTdBNGpqMWJFSUpyeVF0REd4UkhQbDFVODlhSDd5UW5pcmMraGxOUGZmZ1JRaTdiNXhFd3FoVm9VS3pQK3lNelZUS3plcUhUSWtrN0N0SFlhK1dWMnpBWXBUVi9KMGRZcGF5UU96NkhzaUZnMEt6OWNFZmxLS2lUeVoxNnVLakVJSTRWU09SVG1QejdLb1ExczlIWkpkVER6UVR1UmxpY1ZsMnVIdWlSRU5XSnBXSnBOQVV3UmEvWXRtTnc4MmV5eENDMU1hN0FRVlpnNlJ4Q1hxTUV5ZTN1NkNabXk0ZFR0N1lGMGJ0ZHc4SzRFWE9hMjVFRjlZUHR3Wk54SUx1RTB3YzFMWG9hR3BSdUppeElxTFdERkNlUkp2Wi9kOWYyZkVhMmNFZlV6RDJKeGVrTmZUa2RHQmtwMjFRZ3pzVUF3K3RkUnBpQzJsSTlXT1ZNeWFsNXRoU3o2M1lYT1RJbjR2TjBwT2VTRU1EdDNsK25aaUZxaDJybnVsdnFXMjM5dHZ2SFdyV2xhK1UvVmZkdXNVZDI1bnNxeXh3bzVmT0dKTHBOdEZ3UVBMekRNWGJVdTZYeWF5VHc5NEF6ZW5iMVFFT0ZXT3ptS05QRWtQZTVkOFVib3VTZDdWQklZQXVxTVhGZE1zall3Ty9mMjU3RXNNSnRzcHlYMmoyd3BzRWgrOXBueWVYeVJxeUtCMTJmUERod0FjUTNDc0tEcG1xblpab3hJWjlHdUVDb1V5OS9ZeVM5UG5CNjBneHRhS0NGekVReXM3OUNsMGdrU0VKZWNCOHg2SS9pbm42YnNwQTNYRk4yZ21TUmhWZjYzUWRhRHYzeUwraGFSSm00T1lTeUJvdE1FV1NXamRsOUUrQkpQNjRQdG16WUdMdUhubUozNEpHUjJWaEVQcGFkVW0rc0tlaW5ObzlBeHhrTERtZGdQeWpyZldWUHZqdWtvWUVhUkwrNHpCbGpwcmFGMGVHbUdXS2J2T1JVWHI4Z3AzMFFMR2hyK1NPekdVUHp5TFZXVVlDM0hsd1AzUTZGVmFDN21xZklERXNVa0loRFBEQXpocHZpcU5VQkM1U1R3MzBxN3dRV1NWRkpDZ0o2YUZrOVB0NTVsTjhTLzFEazZGR3JIbHdpSzdXQlY5QzU4L3V6NGZ3SlVDcVlMZmlKK1lFOVRRem9CTG1TNy9VaUcyZVB1K0FaeC96T0t5b3RLa2Zmb3dtOUtFNndMdXF3QXlMak1GQ3YrYSt6d09nUzEwYUtzWjJZZ3BIdlZySmpWRlhpSWx3T1F5NGFQaVdLRFAzbnJ1TlFsWTF0R0RKdEFUSVVyUzY0dGxVWWIrKzNXZitWaFJvUTFWRXlhd2VnR2dhZHlwTExBN0FyZ3NHN2RTN3N3VVN1Tis1Sk93SmZDMXErR2gzVDZXb21QS2JIajkwTnZVaVdKLzc2ZTROUmFFTU95VjA3cTlLNlIxd2pBQjlIWFRzbGM3S2xUSU9VNWxBTTJqeGZjS3RJbFhGU3pxa1kzK0dTQUNCZkxTb0VrM3FHWkd2YmxFdk1nVFR5STdwVjlralN0aExKYVJYMjd2QkVacnhtazY0SlBvWGhibkppWlB1STAwOEcvUTQ3bEs4dUtLUFJjNmc0Z1lOUUdacEdkTXdOdGw2M1YxNWNqR1kzQ2FJK3FHUUJNcTR3UG5oOEdib3ZIQS9xSVF1K3dpVUt4eTdwTTJLaE94d3ZXUmFOTUx4U0VrY2M5M1ovWW5NMDEzMHFZQkNLRVlXWi90QjJOcWF6aDZ6Y2V3ZVB0bVp0Nzc0OWo2TVFDWllkeFdORjF1U2ZhUnEwSGgrM0FuVVVxa0FqR29SZkN5OWV0Nzg4dUtKVklNOUlSTTVRTU9URXpHMmtnWXZFS2dVSGEwN09ZK3Y0U0xtOXR2bENCdndneXp5aCtGbXRzSk1QR05rSTlzd1ZpZ0JseXVrVVFnblhabkNvUWZmcGdQc2R1d0J1KzlLeHFNMlBTTGVTdll6dDR1NkZDZzhMWWczQXJubHhDUWtZU1dZckw5QjFBZ2JJajVBYmhDUkJrek5sMU1rdHJNTmc3Uzh0WVplZWFmOTVFcEFHcERjdkcxWGxqN1d0QjdMTlJibi9iS0U5Z0tMT0k0dTdtVE1kTFdNYmRUMmdnclc5Q2dNak9nOXk5YVR2ZkdMb0dHNUNLdDRqdDNTZFhRRkc0OTAzZS9OSllMWmFaQ1JTTEpiK2FSZ1RmRlhGalpFZ2UyMXV2emR4NnVsUDVOWTM2NjJDUmI5WlRqU0FybnFRdGtZUm9pYlgwQjZ6K2NCVGNsRG1VUmQ1bWJwTDRHZkNEeVd3UHgwdnVabi9mNXl4OTlqNVpsY3lLQllhcmZvUi9HS1ZnK0ovS0FrMWJMS3lTRmZFbEtRdzFHRzZIS2hWQldqdUhvMUUxOFBnMlZZd3Z5UERPSUxkb3V1SE00Z0RxVWRPZnlRdmZsd2cwN1NzMlJwcjlDQS9kVWhlVUlwWFp2WE8xTXBGTjdCMGYwdWtrZmpTYWpMclNNcFVtN0RFazU3RnhZdWU4aE9WS29ZeWxJSlBDc2hWOHd0cUhrei82MFlNRzh1b3pYWlVyaGNLNmJZUUhPT25mVzlCMXovdkluMnBYZUZnUXhFMUZKSVNRdWZSNmdKVndONGRZTTF0OXNvN2cxc3JBVkZSZWQyVkRjTVY1UzJBclZrdjZxTjFxTXh6YlRDWG1xM25iRkN2dE5va0c1Q1lSVEJ1d2daakx5UUV0QXVRdGUxbkRUQXF0Q3B2T1pRclVQK3pJeUo5ak9uYzRzdWRwNFE5Nm5Yem5aWkVlbEhVSmI1eG5OcWxQZWVDZ2tHSUZBdC80VDh3MmVheUlnU0taNjEzclZNVVcxelJKUXdNMjdmVFJXdXFmSmQyZlA2Rmp2QUIwdXEvc0dCeGRDUmZLb0RTZ3NBRE43ZXFmM3JacXJOdzk5ZVRFRUo3L0RkWldRc20wMDJhTHV4OHF6NjJnYUY4N0o4anZ2TnJmWk9DZkx3ZC8vQTF1YTBlVE85d2JJVzRxTndsQ0VOUXdFWWx5cEcyWWFmcEoyKzN1ekhaYnorWDZZR01aSlpQcVZGVHF5VTN0MWY5T1NxbytyMEsvWmx2TUM1b0JMemlZMWZHb0dLSmlTcHdza29DK3RnamZkMUpJYzNuTFpEUTZSV2NWUTBheFZ1bnJNb1ZLRGFMZnB3V1ZFSkxlM1N4UEhmUms3eU1rTkdlcW1tQ0xzTTRnempEdXV3Z2hnTjJZVW9wcFo3RlFsYWo0Ui81QnUzNlpKVGVrNjZGSW0xNW9mWnFWT0VZaXhjNjQ1Q25vZE5RN2N0azRoQUk0WnFiOEp1bG4ybE1ZZFkrTXRhRkEyeDZmNzZ5aWZJVnRlV3RmaU1uVXNKRUNCWjZCUjJLbEl4VUl5Z0VrM2RJTjMvdVZIeTM0c2gyK2RZMndlSWNlZHM0UmR0Q0xPR200NGlZRzVHQTViVW9kSnM3QkQ2cVZQRHZEeXkvRXNjMktDUDQ2VURreUhPSVBhVXc0cE9BYVB0ZGdvWkFYRjhMeWxKcFR6MFBRYTRNMTBER0RHSDFyS042bXhvMHg0SlZ2bnZKdnhubTllRUtQQ1NBR05JRG5TbkVndGg1U3AzaHdFMktzcmxpWkYxeDV6a2REdmZRc2ZvM2hFUlhld25IWUVmZzFMejljYmhSckRqWWZOMHdGaGxGV1hvc2ZocXFnTzRjUTNGZFdPU2xQcTVBTmxwU2ZsSlVrRVh3a0N6UlpablJUS21GQjFSbFkzTlNRclVQY1Q5RDdjYUlLN3VwL2tRRTFZN1c3bUp5QUlXVHY0K2dIa1dnZjZiOFpnSVpJOTRLREx1NjVUc1pEblg4Tm5OQXdzMkJpRW83SXhPOTRBdHZNZVNXU2FHSW9vcmhibUNtUGdvRS9GN1JBbzNmV2lxMVBDaXpyWkZVRVpmTzFWSERyZlI2OUdsZXhud094NVFnbFJ3eHNEcXRJMldKK2lGbW5MS0VBVy9iSnk2VkFDWHNwMFQ2QjMyS0wyWTBmNW5wY3ZQcmFxalFsMVdtR2c4VTk1MXRjQ2dFTjZGVWpKOVZaNklxYTJVSnA4QUE0RG03aTk0QnYrbU93NW9xdnJqRnZ5NlFoZEd4TGxHK0thempXM1V1Q3orK1lKYWViZE8wWGhUUUZvV3M2NzZ0T0Erb2FMb1JJZWpsZTVDUWs4c1BhcFM1Si9LWFl2a0VmaHI1b1RJNWZ1MU9tVGVuNE5GK3llWWozVXBEUGR3NW15cm03SzRtQldvN2kyaDVPRHV1dlJnUys0OUlsZi9ia2VENjlhTjI5TXlGc3BhbE56aVVwSkxPMkMwRUdjdS93QjI4VWppSHBWUFdndkxPd1dKTllJZjE0YVFpbm12Szk3eGJDNGNYYmFMcjZ1SVBqOGNXa09kUDB2NStsZHZSSXNhZFArL1RUVzVxSllNQ0RpU3pHMW9PeFpnK0tJeUdPa2M5WEZaTWh2UDZJeERhR3hGYnRka2xURjQ0NENUbmN5VXZzNExVYUJsM1B3NXJ2NDJKUXF4cFdOUVpOR1E3TGNMSWRDOE4rejBhbitNSlBMako2MnFkZTc2Zm12UkNWZGl2SFBpamZoWmkyUk1BaGNOS2pWTFp3bUYvMzc3Vzl5T1c5R2VCanJVc0JNRDFibGRYcXB6bkhTbzNkczZmN29zWVZveFFrUG4yby9lK0cxM2JKY0J2MHY3T29pSXUrdlhPb2V0dEJ1M1d5L3RJYkI1NlExODRNTlpRZmtvUmpBVjErcE5vMUlwRkQ5WGZ4TjN6VkhyQnZSY2VIOHJzMitXK2p1b0hrMWtoTmlZUys0VTFyYkhkN3N3Q3ZmTk5FU1JSWWFqSFdvQkwvc25lc3NqVTlpSHNDdUtMT3phOXJOQldNaXB2OERwYVJ2MFk5bEd1YkZ1SWtUZTBoaHBtRm41ditkM0FsUGNsOXA0anVaL3o4TWZZV3pWcnk4dGREUUpQOFZ5UWZiR3BRakN3a0I0NVJUaVdKL1hCOFhrSG1qQXNyTmJMZlh6Z3Z1aDF6T2lFQW0rNk1JSlBjOUpaZ2p0eis0MkwzMkkrSFp1VWd6QWdRb1o0RXF3ZSsxQmY2Ly9HTWhVN2djN2hBWnBkUHBZQ0JPcGZFYUpOc3J0MC8rL0dBMS93VklPdTFWTGZFOFI2QVZVaDhVR3ZXa1VJNlRGZDU5QXh3MmtuejdEbzl6Tk9qRGtsZm5JcHp1TFBxa1E1WG1ZN3R0NjNuK3VOYkdESFlLZTZHOTE1WnhCSHpkYjRzSXRTbmQ4MXk0ckIrY1ZJL3JUWWVsR3gvWGR6bzlQZXB0SlFESEVwV2Y1VEd4R05adDZoQk50MUJtR2M5MWRrb3ZmRFNjMkZVbTgwd21lMGhsdnRlVXlTclhud1VVR1RSVjMweVpwUmdpZkFlVTBwZk1ITEVhZjc3KzhFREZZekw1eXB1MXlRN0ZHRVBmcjVpaFdmWlAvY1VhUVBxclFJMFp0TnhReXh3cGt6MDJRbk9IWlNaQW03N3BTNDB0VkczeTRWWHpucDhNakhJREx4UVBRVU5ub1hxLzlPOE43Ti9EejhkMFp0ei9MYnAvdzIzTzB6L0VDaWUyZW54UVJ1amgxUC9aOEo0RytQeG1XR09ta0JhMno3NDJmNVhiRWpkcUVaTExVeTc0R3JSYWpWcDNaRU9xbFJlWVRFUUgrTnZnRkhZL1F1NlpYZERUcjRKdUhFNU5hdThGMVJET1h1L3prVEdtL2pUWkVzYnlpVjZaZWZ6SEFvaWFmdFJxL3lVL2d6N1dzT1NjMW91cndnOU1wa3NyWmhMNnFUZ2hmK1c3dkpBRnVqZHkwM3VkYnZyLzM0U0JrVDBBeW9GdnhqUDZqL2Q2U09lUzhPUXowS1ZqU3FjQnBiZmxFbk9jblAyZTZUUzJsY1l6WkRUK1FJU3gwQndNeCtLbytQMFB0dTBDWjRrVmJLbkREUlVCREN3U2pxdFRXc0ZvWWVXVURpVElsVHRkaG5MTmZXbm9VWlI2MThDM0N0N2R0a0g3V2lZZlpmOXNjNGFyTkR5OUYwcEE3WTlycm9iRG8yQXRxaXI1OUlQV0NzeXFBQVpVTEdVRXU1UWtyV1BPM2JrVmNDc2xBN3FRUVh3OUdRY3VSTXg5QWt5NVJWM3YxYnZZTUJOSkhsMEp6d0ZpeVdpY1FMeExmUVZyS0RmdjBKTmZNV2xhQlRTZ3dmQWNCQ3pPMFB4WTk3VytPenFkM0dTVmkzSnk0MGN5WFE4SlFxNmZDdHZrZ3B3SzZjNzBQVklpUVU4Q1BnUDVpOGxaYVR6Mk1rbkJoSi9RbDBtemQvcTliZldQNlB0UjJncDllWjJQUkt1dnRTNGJiM2E3dmpLR1RMY0toNHFQOGRhUi9ONUt5REkyWkRCMzY5VC9wamZyOWNseDdnVGgzRGpQS2MyMXBlcHNGTkR3TXdZUmdoNjNKVVhPRlhZNjBubEZHc0xhVHRhZnhhekhUR2o2ZGF0bkpkdVJUcTRyeVc5ZCtJblpycWJxd29uMTU3UTd4NVBwYWhtSkNTZmQyVUt0ekEya3FsMnRiOTlQNmRzN1JZdW83K0pTOXp0aVJaWVNNOTVKYnVBMnpVUm1xNHBWaG9MRUFzbkFhYWFzZSs1ZU5Ed0F6SmU0SFRLSFV6NlYrTUwwMVhuek5yaG00RG1lN0EwZllia2lXQmxWT2ZuR256UHVDUGxHK2s5bVAzallUaElPc3VqeWdVK24xK09zeTlKYitYMW1PVGZCNnh5alkvdXBzUzg3aDN0c1U3N2hKT0lBb1p6SEFNSTRXT3dHTmF4dkIwL2NKdUFQZ2FHWDZ4czlEOVdqM1JMeVNXczM0Z2c1d3hHcThhNVpSeGplajYycCs0SXFEZTduVDNranhlZ3p1bmdEb2hnOTQ0MkltQkhFNldkY04wRHk3TFZFdVFrcDVoeEdMVUZKaVRNYllRL0tMQ2xiaU03aG1raDJ1MlVGY2ltOG1ZdGNNdFB4YW5TQ1EvcnFoeSs5OHhVcVVJSW50cTVvakwvV05sRDFIanJ6MkZJamQ3L1JacHhzZVdOZlJTY2xSU2t2OGZ1M2NybnZ1STNIalJjd290TlFZWDZlVjNMZzhzWEs2MVhmcS9oRmRsYm5qZUUrRVJobitZOWxiQXJxbllRL2h6cnFaTUdnSmpESzFqbHAwUUpwOFN0TTNSNEp6WjErM0IxNFBGemx3azR3SHRVTVhCa1R1UDNNVlowT3lOMmk3MGhFbWJWbG5NQWRRaGZmU3M3NmRYcTlzTEw1S1BYL28wT2gyblpBVUtwNTNKejJudHE1MFdSd29wOU13SWtwQjNhSmU3NlhWR0d1aU9nU2pLcnNkK1ZtZ0hsdDBvZWRuS2syRGNHUm91OUZyRkx5T2NKTlNhRjc3NXFIdVJBbUhNL0RQZXJyK2VpVzkzZlRIMjZVMVNjVmhsRDhQMEpSeTZyMHJvQ09MejZiampORjdjSldidEtGSXZNN1cxT3BZTG15UG9zbzRhbXRCRFIvUnVUT1BHRmR3ZGRYNlJQUmFwN3U3SFNzTjhxUGZvMEFhMDBPamlmb2p0aksxclRvVTZPM2JWNUlaSXRUOTZIM2FLNVQ3R29rK3V5NUlRNGtVbDdUaUszNW5MM29CSjNhazk5OGNqcldva05VbzllSlhXT1FpbUNkSnZweWk3V2pPelNMMmJhbVlIejZSbEpHR3c3aUhSQXliYWxncytBc3QzWmNhdlRDVHpGSTcrK0w1Y1dXZytRRVlCeXhRWmZvYjVpeXVPMHRESTZVTDZ6VGVqdGdtNzdNbEN1Y3hkTUpyNVlVUVZnbnlMTitTS3pRSFRpZzBSTE1ITUU5UjByci85eXZJRE9nUEtwcGs3TlQ4TWU1azE3TEFzaE0wSVdUK21wNW8rSW5xNWM1ZDhUWW41cVlOMGhFYWI5T01ZUU9UaHAxam5YNXpNVHc4V2tvN1NaTWtRcFAxMm1TL3p0VDkwTGd0blFmcEtQNGk2TWdUOUtsdmt3OFRBWmZpMmN1RUQ0QW1yVUlFaGpaaXhzbVJSUSt5ajFPci9SclRsWHFlZGVTR1dQL1J0ZzBQbXVPUzNrZ2RGZXk3Vlk2UlBzWEJZVFRwZWNVMjUrQWdudVUxNldyd21sbERXbHppRFhBM1pycVRGNkl3bmM0ZHlmQmU2TU9LRnh6N3ErT2xOMVNORmtmeFJtcjc1dDJMOHplcVBZR0RmYXZhbWl0OTJLRFp0eXduRzhFaGFTVWZVY3JDckpyK2RuY0xyb2h2aGNPZlRYZFNlTVVWQUdXekJIbjc2U3lNbDdtVVA5THkwcUZnb3VRb0tLdGJ5dUxuNlNscGxxZHFyN0Y4anVPQVBMWXhzZjFlV2grSWFsUFZjZmpNNGprSlQ3U01HdC9YMmFvUFpMbGxGYlVuVGhMTXRobUhiMWZNbnVkbXVvbzVrY08rUXo4ZjZmQlJHWGVLLzJKYU1mZHRROUxiQ1pJSFZzL3JMVUVSSEFzSmdFUndjNUdkNjVGVE9LMHJsMmxkbXRQeUZURTVpeWJXK2JIMjNNY09uamxmNU90alNPRXBtRHF6UE9PUkQ1TjB5N2dUelRrQ25MaXdtS1hyUlJYa3hIVmsrRTU3RmduZVQ1ZTFOSVl3R0htMmFSMVBWZlMwOGluYVJESlVJOVNPRGZVNVBvaWdZeXlMY1IrSUs2UGE1Znd1MGxWclljK3JWb3JhbEk1VXViUmsxb3JqU0dGVGwxb1NxY2I3ZUhkcjNDME1IN0lpNno1T1Uwak1oMThpNENlVjNqQWxnaDd6bStRb1N6MzhCMmgwck5Qejh2UHY1SHlhb2diK0pYaG9yVGtXbUhER0gycFN5OTEvcFdpc1VBanpZRlR3RFZJWDV0SHBieVRpUVZmQVdSSXlEZnRkZHFvNmQycmdhNUhFczR2bEpZa0RmbjJCTkVPb045THV1UWcyQnlkUlZvT1Iyc1BWQm5SQVdkV2pKK1o2WExSNkpMYmtEcWtkaXpuc1F0SlJsRjJabVgwdGJycUorS0c2TnRHUW1Ib2ZvcHJpN2N0WFZGdmtHVlNQV0RKS2pwb2Z6elAydkVrQ0pUcmk5U0JxdVMzNndMUHp2TTJwT3J6c2JVeExlQVhLR0hTdzB2anNmaW1mQkcyYWEwVUdxV01MRHRlazh6Ulc4NUFhSEJ1N2ZGejUxdTNEWmUxZ0dJZzNrUUUwVi9MMDlnMHJDMmJGYlVubnkzUUJ4U2NLbVA4ejdUU3Jkd0hIRUIyR3FxZmxBQlZrMEQ0TkxjSzYzN0g4QVZMYi9XY2o2UHVqZHlNd3puL1lGTjhWN3FNb3BDWnN1d3NOQVY5NHJvZjdGQ042Ynp1aWdTWTB3aEY3WlZaNDJaUkVMblUxSlE4Z2RrdU5XU0xvUVE1NXdac2Z4WkFMWWp5UWptNnJYL1o4bWVYMVREOTZPMHZpcEw4NnVPc2k1cDdWNUh3QVRLYkcrSFhxeHRBaU5aRUdlWEZmNVQwQzdIVEx3OGpGQXhaODJ6ejQ4TkR4dzh3YkFud2JTWm1SWFZZZExwRTFYK2tQcm4wTFlrU2FSY2thZjRXenEwbWNyQmxYVzJMOU1zck4xamNKTjJHUGUyU3oxS29OOHRKalpTbjU0NWE5a3RvcXdpUVQ4cE5NK3hYU3F0VlBoRkhlQk1JRk94TktiYXloeFpjQlFIeUVqNjkrWi9UZW9Eb2VjSjM2YmNxQUM1L1VUMGlQSE5hRDI0ZzliL2h6ZG1vY3FHbUh6YWs4eFh6bUxxTUx4Ni9UU0lpYThQQkJydGIzNVdwTDB2ZkNOZjJkcGpidUN3UHFHNEJFR1VKQUtvdEE1clJuWUtkVnB2NGNwUG05VUlSY3pqVUMwcVByYmJtNDNmbHhSUFFrWmp1MG9vQ0x2SFdCNUZ0NTl3M3B5SGRWOVNRdWdVTmxIZDVHK2RPNXpRdFBwMnI2dDNZc2FzVkZ0a2plNm5VdVFoR1JPaXgyM3BmZDVjTVN3R1BEbGsyM3RVcTg3QkhlejdFd3d6Smk3SWNaL0NZcXFJdFQ4NFZiZys0L3h2RndSS1ovWkpOZkRkOGdiQW1KR2FHUVZEZXhWeE5JSlY3WTZxU29wUm5lVjIwa2x4MWY2MlltZHB4akFtOC9hb3VDSmZlSWxLT0tYNStmY0J1ZjdrU2o4S09rTy9QaXRpVWxCdm9IdlJaT0VVZzR4YmNVZkZOQzgxSWpOSERhWlpjcGZxT3JSL3RCdGtzdUtKNW05cHFaaS8vM3pmT0tNSzZwTEtINkIyblVnNE1sUkFNd0JRNGZDWTVkYmpNY1hyL0FMTTNVamNldHNCOTdQaWV5M1NJaXhOY2FKN2tvM1VwYU5FU1ZSTC8wdmYzamJoajhqa3RYdUFZeWZxRnBLd1pkWWY1VThJNmNYYzFtOC8xWUwvY3NvS2krQ2xWeENKa0gxRUZSdGpmUi8wd2U0NXZUTVpzRGdONklLMUlyek1mTGhFVk10NFRxcFhNcEExbG93VG9YTlJlcExvR2pMOWEzVk5Ld3FHYnB3aUdhdnhXbVo0Q044SDJPWnRMNzBBcG0rU25qdDFyRUJFUzFMWC9tVGNhVURhUUVOcFlrbnJ6YWIvZmVkSngrMUxyK0Z4MEJ6UFN1eE5hd2UzTldPOXZZeFJnT2dEck94NzNPdGtlZDRTQWdKUGlmVkpqWC9Ycmp0TVdXdXFubkY3T1NqcER1T3RZZE8wVjVqUXZ5T1Q2QUU3RVZ5TGtRL3d2TkY5eGR4RVZJVDZZcG16bmhrRGNIRDNtUDBqbkMrZFRvZE9ReWJQV2wvODJIRmJhN21icGxxQmxkNUVudXZ1My90akIzcWFzVkRSemZqbnRsSnh2bHoySmZYTHNJUkhBK2dyU0crRTRkaE1JeW5FTUFHZUxaenMzOEh3K2xKWFJLUFliYWVxdmlQelZ5Q1N4L2FLS2FaYW1TRHM5d29tSzVUZkEvM2Rla0R2RmM1clY3MmV2WFhReEl5QTk1WVZab2hSRXVOOVNkL05sNVJncDQzalNGZ3NnY01DVFVKNm81anA2aGFzZWIzMWZiTTlvaEY5MkdwRmlsMlRKWEI1OEcrZDZ4anZaWjdZQXg5SUVnSUtDcy84VkxOYlozeXhqWGdkL2VIcDJ3bC9MS3YraXVPR1MxZzRYOFEyWDBURmNPMEFFeDJqZjhhWFFSZzMzbnhxaSsvLzRDSnp6MjR4TkVKckJsS1VOVm0xTmkxN2hSeUh3d21tZWtWZzVFaFBYSjBBamI5Z096THFCYzlOVnBmU3V5SlJQOG51M1FNWkpRUVdkQjVYUkRFdEgzV0p1ZWl2L01SVU1uM0ZTWEx1c0grM0ZCSjVDYnBPczB3Q05MRGZSdWVsU0h4azVCcVkwLzUvSlZjdmMzRjJidnhhUHU3TW5yQVhHQ2krL2JBSjJQQnN2ejFYUWl0aUt2ck5FYXRMMkpPUmhWYVBJK3grUTRINlRaT2ZUdFJTc1Bid2YwTHZ6dGZscDBEemc1WDlqMG14VUppS2krcXZpYU91NlJXL3JOTERaN3NWZkkvaFAyR3hJeW5wWFg0ZFYwVFFWeFl0b1d3Q0dtYlhZSW5yV21zV2hRcnd4bmJwd0JSMDdLOEd3T1g5Vzh5aGg2SU54bVR0WG1JN1BKejhZWHEwVUxZMHkvdTdpSkJlZk5pSnE1OXNpa3VLSHhSWmtISmE1WVZLNXhUdXNnTXJ5eUpaMnJCd1hhcVdDalRUbE10YUd0Z2lEZ1JLRUpjbzdVdWwwTWFJWkVOWW5kTlhsSVlWRTRYaFlsWGFWM2lDVGgrM2NVZjh4Y2p2bkduZ29jRkxmNmNnWlRYQ2NZQWx3S241V0svVzRpcTJUYStJQ0ZUM1M3bWQzRGtBdGcva2syZk5LQUtEN2FYN3ZFSVpFZldvR3dhKzY0VCtiMGlaMkNkNy9DcEo5a3ErdDBiM0FlTnhkYnprcVMwdUlKSDhrTUNQSllMNHVkRW01WHhqeC9qYmJqNVRlWkVzWHJvR1dCOHFreWpBN3JQcThtQU5HVTl2SzB5eFJkc1p3RUJteGFlQzFWR2NtcUZ1RUprcXgzK2pMS0FOUlJqZXNuSGJqSzd6OURFYXVKYTBwWXFPMjQ4VWFxcEVkaXRCWERTZGdYMXZVdjEyeWtBTk9UbFhJdzJYZUo4YnRlNWltTGpuT3Z6MUpRaEN6QlFFL0gxWTZzWkNCVTM2SDE2bnlnTUVVWGx0SVEyV1ZYbFpFRWo3WWFMbHV3N29PbWhDdS9LVllaZHd2cHlyMVdlV2VqTmFNN3lJQXFhajBjeWs2VnhWV0l3WkVSNGI2cFJkM082UVNPMEJneDhyWnp2ZWZLaUQ0bGc3eVdsMjZRWmdXdmwzblV5ZHcrTkdCTHN6TlRIREtJM1hoNjRoUy9GRklrQzkwdElFaEpNRUlWWHZpRzltOHp5ckhWbEdxNUIzUFhJaW5kdEljMEU0Z1phWkttbmdSOU16cGJLSUtXY0x6eVR4M3h2TlNQTmhET1hPbTNCeW5WRjFXQjF5aXhRaWRCS0tYZmNkS0pjVVB2WHRWNXMxUnZlK1RsVm05N083ZTBjWURYalYzK0o3bSt5TnJYRG1WNGNSb1lYSzA4TjlldGFwMEVxT2hwRjNmRWFudWdWVDIrRlVnWDJyNXR4ZGkvMmdQaW8xTXRJazJmeHNtM1ZSWk8vcTRGc2Y2bmxzZXMvVTh0elkrSWwrSngyVTJhZmZQMTlsYlBCOENzbTdka1Qvc0VDd3FJYzhSdU5GQTBMNkNXMkwyeXY4dWMxd3pzNUdDOW1tM3VDZ0YzcVFqWkVib0dyam96YktMUjNZTzJGRlVjMkFoekFnWm5Mai9BYmE0UzV4anpRbnZkRGM4WXp3L2JrdmhMYzZxRzJidXBHYzErMGxSSzdCaW5RMk4zOVdZN0JyLzZ1RjJEMEhIaFFIU2NLV25OcVBpQUt4c21kQ0x1b0VSLzN6MHFBaFhYaG9TSlk5dGlIRmgvbU1kMHpBOW1IQ1FEdEJnMm5KM0ZNakN2U2pvU0ZmMXc1TERYSUtyaGFKWHJTU2RrUVJxcjdWYWs2OWZ3T2g4eldHYW9ETUtYV3BRd3BFT1MvUG9NTEVWRHFoTXpDNFFNYWNPUlhyQ3JLTjZoN1lyb2hRaEV6L3JtUDZweEVGR2tudFRuWmhyOVdUWTN2c1REUjNWdUVzYjNzVi8xMW81dzdZemtxUkdlK1ltYmNXRDFPSXlTbWh1QVhkSEVYVDh4NWRUV1F1NXR2bFdYOXVyRTRBbk43SDZlTzhhV2FvLysxQTlFMUtUeVlsWERhUVNnNStzeUVVeFZEUW95MERJZ3pWVDNCOGJ4NXNQblpJMnh5UFIwSEdaU2d6VWtNcStGOXdSdWt6Sk85WmhDenRxVjJINnFXNWVIQVlBZHVQYldGdDBTU0pCYlRyUmlUOUdDSU0rWFBvRmF5U0V3UzRZYnNBMy9FVDkzL2FUV1NMMDZBclM4dldHVFZSZCs3RTM1TEZ3UnZTN0Z2Uzg4aHpxeERlaEQ5N0hHZUtlTE1jNy9lTnNOQnJlWExjSnROWDZmTFVJT3JsVUZYVTZvRUkzZFJLT2pWMWhtWHpNVW94M3ZYZGltMjZjQWdQYmxDNDBMY2hUYnJHTmtkdm9tOXAxV0FKRTJEclM2UmM2UjREZ0U2QXozenFrM1c1dWxLS3ZtMG5CNmNZblRYajVWOUtlNlBSeXc4UE41TUM3SmQwUC9MS0Z0MXNScW03Y21uNWhwcXh4SU9TL2FlT3ZlYTlyNXVUQlY2UDNGblRDNnBZYTAvaGRrdmxBN0Y5VXlnSzdkZU5QRFZpb0pmWTdRRk1ubmZDVkkrTFZqbWF0N3N6eDhDQ1RJMlZUVFJkd01MamVPV1hra0hxVFU0YllITHNRRUx0dnZRMCtqQ2dFQ2VzVUkxVUNRVnRkSlBCV0c3cnBmVjFucXN2djB0bFlaczVEY0YxalFnZ2x4YXZ6SDBzclBTTnFjbHJ4akZCNE9Vclc4dC9CTGkraHZuTWJnajdUN21UWXp2cDdJaDdoejZGUjgxU2RpVHkwb1JEMjdvQ1lnbDlpREFjTThDT0tnblFIOEFieG5UaGpKUFlRR3dCamdrMXB4cEk1T2xzaHAxV1pyUy84Qlk4V2RNNmI5M0ErbXJQS1RoMVJabmhtYzlQeDRHdERaVEFlYzk5clZUMHhPa2FUNmIwWVpBTVoybVZ0UjJsVlFyaG1VbERuTGtZYzBoMVZwSDNDaHNFaTNwSi8vQklWRXE5Uml5dE12d1J6Q1BIZ0Y0VjlrbXJUWkdQbUtuZGJUWmxxdDVSTjRRREliRnppby9iY3dRZmFFb0NnVmNpT3ZBS2ZBNUdiTDZBMHhUOFJZeE1vZTlKMks0UVcvRjlpVU8rNVlDai92eGVPVmZWT0J3UU1xdjRzM1VjNk9mUW9zaGpRdCtTRndMbW5kRk5iM0tBbjhpK29OYlBlcnNnWmNvR1lFRjIvcVI3dXRVbkh1UVVQVzJ1K0ZZSXh5Tk9rb3BGbGZHemoxejBSSVA0L1JUQWV2cTFjWjhORXNISHdkTGNwTG1Jd1FXWGF2VCsrRFQ1TWtUOHg5Q29lS21CL3NFZVZDT1AzbnhLR3Qzcy80TjdpamprVENmR2lybVgrRks1Tkg4bDJDTzd0MkxmZ3Ixa2FrdTh4Vm1qVVUyOWZpeHMwMFRRa3dRMEZnYUpTcHVNNzdqUTFsdFpiM2E3dXR0WFFNZGQ2TnBqYmhQeFlBQ3M0d25EV3JvTEpUenB3ZzBSTm5MdmdLRlBGMDZtUEh3ZVM4eGc4dlI1OWgrcHJMdWU4S2srWFcvcUxZQXhYOXQxL1NKdDViSzR3R0kwVGdwYmJNQitHQU1qTVlycHROdUtpSmZIc1dLR2xiRVgrK2YydDdsQXNvMFE3ZFJoMjIvVW9aaXVBVVJFdElodHNScHBONTBPVTF0SlVTUTIyeXBhcWxmUmNuUnNRcEl3Rnp1aU1tQjdqL2M2WW5yYkliK3RSek8vMGdRV1dpOThwUkYxWi9nVlg3RHIySjlOaHBUQndxSy9taDU5VnhGN0xBNi9wbktDeHJ6MHhZRCtKbk13d3NHT1ZacVFtLzVWTU1MRzRBalB2MVdVbmMyRmwyMjVwSmE3b3pzOThEMCtlcTFSRUxCZ3hxY2s3UVlVOVplWkZFTHJGNTV5emg0cWNiVGdSa1JmUUN3eTk4YnVKL0RSc1JTNkREWFFMM1llVGJiZGtjRmtRdEt2d3NyaTJhc2VOMDFFek0vQTVLNnpJMzQwMC85RTIzRTBPUDJIR2xUekJ2OFk2bURNelZ1bDZPaFY0N3VodjJwSFh5SGJta0xCRlo5S0dXdTlkRkJCSVhZc2gyL0NLWkpQTUF3cThzRlVrbWNXWWNOYmZ3bFJSTDRzR3AveDBQczI0ajErREFkRDFraE13VUNXdXhjaFh2cXY5NUV2MDdORExlZXdWRVZlait3K1hLWlhmeW82VXNDWG9DSWt5YjluN2RHOWVzL3ZHQlp1VnNIQkFPS0VGYWY5Ty93UWIwWnAwVndDY1RIUWx1VnNLVkVmRy9WckNLR3VEVHUydGUxcmVtNWtyMEUxZGZkczFCc21KZXNPemdHanU0U3Vaald1VHB1NGd4SXFCMG9zR1dpYUl5bmFKWmwxbkFIYmtJUGo1RTNCaEpOWEh5ODZuZ1Nzb08rUEVRRklWUy94Yi9PTWVTK2gxWm5KekNpRExER2ZiUElDVllIdEV5R011Y2lYMVYydUt4alY1djR2cjZ0Zm9RcDhFdUh4ZVZmd1IyYlk5RlpDRVlTTURhVUNtRDBBLzNaU1VlK0dZUnpkYmx0VllGZHRkYXVwMWpWTU0xQmVhU1FhNXhHM0JBeTlTOEUyWGVNLytuOW5TZGRBaGNIYmRXWC9nSUN6Sm9aMXArUzExMmU0YXVlcUMzQmF5d01LQ0E4WTk4RDRUNVZOUWtlLzlnYXY3ZUN5QXNZc1hvWnEzbmhhVWQrdjF5eEdWUkpwcHE1ZEF0QzN5OHdFckpJRmZmN1dyNmYvcXRBSzRtNVIyZ2FRekNSbitPbGFBNm9lM0toc1BEOGVxSmh6VzREQ2hjQU5xdVhoWlp6cUJYbTRyWWdUU0xvRVpCMmsvcGExVm1DZUxNNWg1RFVPSGJqRU5EVUtlb3VqOHEwZjZWYkRmRTlxbWh1R3c3WG02Mk9MNW8zdXg1VlArcDV6cTJ0cE1DY1REeG5nbjVjYVI0eUE1RjgzeFpVS0gwcHBMWTVtVjBsNjBLNDFac2RFVlBqMjBNWnA1SnVGQzMzRGRWR1hRaTdQOStQWlYyZlkyaXlsUHM0Mzh4Z2tROTZVOXl5NlBXTzNmQVlhckJTeGlxcGUwUTI4WU5aMWlkSSs3U21MWW5HbFNlWmZxVENwNzZkMWsrYUJENmFiV3lKVFhqUVMzL2U2MnlHNEVWdlJiY3lFUno5VjQ2Sjh3SGdyZERkNjlEdDBTeVF4S3U5R3pPd01USkt1cUlLeEcrMFlmL2t6bWNJWm9kUWkwaW9idTNNcXNpNTd4MXdNVkI5OW8yY2FoRmdwUEN3SmNNZ3ZXMEFBYUVDb2k4Z2lQU3M3NGF4UkZEbW12VU9odFh3M2lKV2NhemYxeXFJYVJXcGx5MUc3MHRWSEMzWThZTitxUkpuNitVcFhlWDJFZ3haZVUrYWE3ZmZ6aEtYSmVldU10RHVlV2VWbVFBaUpVZXhnRnMxUUR6Vk1XcDdCMXRWUnhTVW9wY3MvMUowbGFTb3AzdTdOTmdUYUlIZnBlRFR5OXpFQ09nWkI3anpUTVRId08yOWVtV0dhMGFsNFJiZm01QjdZNnhqK1lnTW45OU8wN2hFeHg2Mkh4NkxwR2xvVXNsL0hMdWpIQTZIVkxDQWNMQkErckduZkFFbk90VXRDeFFnWlBFalQ1TXYyNnk5T09nejBkcWF5cmlReWF4S3pTY0V6aER1dnJpR25ROGNQa3gxTStxSndtZitBQ3ZhK2d0NmNzU1VnYzRVK0tkd09SdFgvamNDeDVHczJlMFB6dzFqQ25iMjh5SlJpdEVPcU9nck1GbU1xQ1JqQXA5VjI3OVVhUThHeEJmdkliZGZ5Y2lPQU4wcTBnbGhaS1VQQ0Q3QjV5U1AyVW8zdHZiZWRBKzJ5dmJhYjJEMXE3K2gzMkIwYWFYTHJjQ2pnQnBTNUNaY3d2WFVOZFYrWCtwdEc1SHRLWEZ5RlJBei9xRmNNUkFxckQ2MzdWRjZEQUFGVklTM0haRVJ2bnlwc2gxUHQvYXREenlpYkFFMkNxbHJxMUpwSDBhaWd4SFVZWXBGblRDaXMyMFkwQTVDZTkyczB2dUcxZFdZc3U4NVh5RW5aNXh5L2QwZVRLK1dIbU1pUStnVkEwOXBNcWhUZ3o0SCsxZnRxanJNeERwamtxRE4vN3d3OU9EbzUyZzI2MXE3RlNFOGVwdm9aMDQ2WWFSZ1JvM3Y2MHBzVmt3SnlnWk1iQ0lvQkhvaVloSDh4MmJsNEVERUxQRW5tbGtERWE2d21RMHhqYnhQbFF4d3orN2xwQ3d6Ym82RWRuVXhIMlYyTysrN2h4ZUFMbGY1Qm83cklvOGZsU1lwU0IzUlhicEhnZ1NpS1llSEdzck1PRkVOSWI1Z1luTW1oL2h6dE9iSUNuZUpiRktMaXBuVGVLZUV4M1Nlbkw1QURRWEJvQ3NhMnFmTnJIZ2JZVGdFSDZIOHJ0K1JKUjlsVUNpWUx0OVlWaWlnOGNic1h2WEN2ckxEUFBVNHdPbzE2NGV6M2ZhemJxV1E3WE5GbmhubTl0VFFXRDhBR2d0Rit6YndkTGR1Snpzd3FHSWxYbGtKNWF4NnNJZ0ZyeXJqQysrYlFpMUdhdG8ycHBZT01ueXNrTWdLalJodFkzYjMzQzV3V2pkOFBsUysyYVZjblJLc3h2SVJKTXVMbE8zNE50Nk5PYUkzaVd1dkljWWRQdkc1cnliTEwrTm9CKzYzNUF4UlMwcklNeTI2eUNCNG5tZzNpTHViMzVuT1JHMGdPa21oM0VtRnc3SEI1SjdCZnpNVWRmcVpwUlJIdVBCZXJkWjluYkFrNXJFRFRranB2ZVcyM0hOc05aYnF4Z2ZnZGxxQnMvZ0o1dnIya3oxQ0ozVGh3cUVKeEllM2p3aTlBb3RKdXBaVEw3Y3U3V1RhSFZ3Ni94UkhHRVpyTEE0dHlGSlRCVzJnM0pEbUxIdzFncjdNTFdMbWtrTUNqQkhmWWZ2eEU4WTVHNUVJdGVxQ3FuMUtteDhIRTM2cGxiYzA2MVpKYytwakQ1ajRJNWI1SmpsVmhSdTVCYkxRMEtHSDBnUHBSSGFUTEtIUFJKVVQ3R0dQQXY3SFdlT1oyeEhnbld0eUhnblhnRDI2S1FiS1NKRkV4RnhPVy9EUUlCbkdLdmhtSGt2M0VKYktoQ1ZZYnVlbXF5dkV3RTRUZ0RHT0t3VnNCeGVPSjg4b1o2WkE4SG1wRDdMTEZoS2xTdWgzTXRuaTBybFI3b0wxK0c4c0RQczB6UlBVVzZyS2FIZVArRjNuMndxbmVqL0pFelZleUdpK3VIMFBIa0JlMXpLY2JkY2JiR2FQT3ZGcUZYUEFFdlpocGpSU2UvaGViRDRpRDJjSUdYZU4vWlNPL0szcWRORjBWc1hCR1puQWJhS2F0alFHczZjZG1HQjRJZHhHeXQ4Vm9PWG90MTBTWTBEZFgxcFpDTExocFlBZWd4ODBOaEs4UXozRTduU2UyZ3F6NzBqbUg2NE8zSnByY0FiWVpxVkZ4QkRFd2FSK05aVlMvMnJGOGJaUkdncmVjcmZja2paUERKZVBZbncrSy8yVFRva2czbEVUcytTZG0xa21hbXQ5K25ReHVla2tQZ2VaQXBKVGdld2J6UWQwQU5NMnJONytsbG4rZlhYUllSYS9WWFlEcGpEYkJrME5GdUJRaUlMR0xjYlNaNEhWcjVwZDZEb3ZqSjIzcFU1WDNuK3pveFJIUU51WDJydGRnYW4yWTJ0RmJsNENIUWl6cTZ2Q1RKMjlCTEpnT2g1Z0xqa0Y4MGhhUUt0S0xlSUl4Wnk3cUdocWI1S0ROdTdVOXBsT01KY2s3VWZmSWxCbVNNUXFSazRjT3pIRVc2OGZkVmQ1cnB5QzR5ZU5JQXg1TExmTThLL2dkblhpWVZIMnVKMk1xWWxNVmYzdDZFWVlkcytXTWRtc3BhaVRibTEvdWlzZDM5dUhHWjQ0a2NFb3d1S0dUOExFN3RpbUtiK29PTVkraW5aR2pJMW1QWFA3UFo5a0p0MG0yQ1NydmVKczJodThJR0R3WElHeWt1SkllV1lrZHFqdjdtVzViYytlY0xpRW1iZWM2SUtkSFJsdFArU2xmeEc0ZSthOVYza0JUUWdLUitiOWs3cktWVGRlOW1GMSsyT3VtdTN1L0RrRkVWY1NUQ2M1KzZyc3hQUDR1U0p3d2NWMzhjTUQ3YUw2TlFIWkhxeDlrSjMvSHBFZGZnenNuMU10bXdraDJNbzFXSi82MTJXMEVuUkEwK2tQanRndVNTNUl3blczTnR3enVVMEdrSTdvcTBWQk0rR0VkakxzbVI0VXRqQmJ6T0tXMWZxcWloVGhXTzFFNWNPVU0vaVBkS3pFMEhnMVFzTE9xWGVGZ3dQTVhUU04wSmFtL004ZlhmSGNXS3gwcExEblJtQUQwc3cxY0hUQWU3M2FSYnU0WVRXUmJxdlVHR0JzQXNNZHBuT28yL083WSthbmJtVWYrVlhiRnpOdlJ5emk0aVhJOHZHb3pZenFxaGNJRm5sU1RoeVdTY0N4S1cvUmQxUS90citKYW1oUElyelFETVNUT0VDN0oyUnI5SDNXWUdEd2E2TkM0a1dnemx2eU05N29wdTJrU0dXYm56NmMxYjhlTjhjQXlPVHVjQlRYZ21JUzEwOGZ1WU9xNHpLWjZqZXBBbDN5MXBadytBbGw1SEVZaTE0cmttTWVieGZQUExOay9ZNHFjVnR4K0Yvakg4NHRqaGp3WURPSXpleko1M01mRFM1QUVtY2w3dG1oKzE3TGU2MWE3U2NML29ZRXB4cDZJMi9uelp2anQ1VzdjcFJ0ay9KYmdIK1AvY3ZaNUt2QWFwVkpoRDFBcFVxSEFlUFJNc1FMNlhpcFNqaGp0bmtFVE00cUNCM0xCenFILy9zRGIzcWlodytCblkzUW5SbXpta0RPeDNtdkV5ekxoRkZTMk5UNjl5RTdQcDhxTDVtVm5Edm9yMHlPR0xxQU5EbitoSjJUaUJHNTQzZ0EyZndPdFRMbWZQaWdGREdnNGdIQzhrV1J1dFh3VVdjQ2ZheXNPSms3QUdRanV3UjBNR1Zqek5ZditWNTIyb2xLWk0rcWR4SzFqN3F4VTkvc0crcitoUE9EQWZnS2srRTNZdFFiRlJCU1JWd0E3d3o4cWNFaDFwWFpkcGI5R0FjRDlmZTh6dnNHWEdhRWpSVzU0MUk4U2gyR0JidWN0R0FGMGRtUlBVMGwzN1RwMW0vcld0anpScnVRUmkvSCtwZXdjamFmYzhmTDZHaGtRb3hqZC9OZHdBbkNURWphT1UrejNpdm50RVpZbmZOR05RTE1kWWg5ZFZnNmRWVG9xV0lyeVRqSk5VZW5NRjNiSEZxc2laZ09sSjhIdlZvekp2K0M3N0dkeFl4OXBtKytiZWJjUnVwaGFpdlZWTDVreHoyS08yS3QveVcwV0tXVmV0TDkzUlYwS0dGRk5MallkdGZ4ZWlMNG0zY3gxSjlIUTc0VnRzVWlaSFdNZVJXczBjSHhYMGd3VEtvaG9jQTB2ZHM5c09heHNFamU0aXNSbnMxWDg4QjB5VXRQWmJaVEtwNWd2TS9iYVZEWFU5cUVkbWZqQTJrS1o4dWl2Q1QxZWx4VzJ0NThieFo2eVhIVUV5bU81eHI2V1FvQWN5TDY4TVB4UXFET05KU05ZWlE1SzlYaWw5SWFCQXZKbkEzUWdYK0pMM2MxV2xhZzNhSUZRZ1dpR3ZFMitMdklNTGV6a0NLZzFGM205M01RZWVTb1piQjdHK1BqOElkQXMxTU0yVmowNkNwM1R6SCtZQUdwY2U3K2VMVmFKcFdLSWJBbFpxNkFsYkZoejVoS2M1eXYyb3VlQXNVSjg0VG1Fcmlsc1BhejdtbzBONW1tSjFudU5SVjREdEtLMUJsKzBHTE5KY1dQckRDTDFhSVJpOWV2bkhpb2N4UDB4YmhDVitWY3VkMFJXVUN4Um01cjNMNjVRdzdheUJzMXJYcGQ5TXZENVdXT0ZBQmYxMGtRWjdRWWdXMnoyYUN4TGM3MVZEYUZvTWVDZzJWMlZNZUxMekQyT05SSW5xQ3NHVTQySDlDdjhRZHdyckJqQTFjQmtKRnNNMVlXejNPNmFRPT0ifQ==
-- CEETOS_RELEASE_SIGNATURE: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
-- CEETOS_RELEASE_PAYLOAD_BEGIN
-- CeetOS installer. Generated; do not edit.
local files = {
  ["startup.lua"] = "local pendingPath,releasePath=\"/ceetos-updates/pending.lua\",\"/ceetos-updates/release.lua\"local pending if fs.exists(pendingPath)then local loader=loadfile(pendingPath)if loader then local ok,value=pcall(loader)if ok and type(value)==\"table\"then pending=value end end end local function checksum(text)local hash=2166136261 for index=1,#text do hash=(hash*31+text:byte(index))%4294967296 end return string.format(\"%08x\",hash)end local function recoveryAgent()local root,descriptor=\"/ceetos-dev/recovery\",\"/ceetos-dev/recovery/slots.lua\"local source=\"/ceetos/recovery/agent.lua\"if not fs.exists(source)then return nil end if not fs.exists(root)then fs.makeDir(root)end local slots={}if fs.exists(descriptor)then local handle=fs.open(descriptor,\"r\")if handle then slots=textutils.unserialise(handle.readAll())or{};handle.close()end end slots.active=slots.active==\"a\"and\"a\"or\"b\"local inactive=slots.active==\"a\"and\"b\"or\"a\"local candidatePending=false local transactionPath=root..\"/transaction.lua\"if fs.exists(transactionPath)then local transactionFile=fs.open(transactionPath,\"r\")local transaction=transactionFile and textutils.unserialise(transactionFile.readAll())or nil if transactionFile then transactionFile.close()end candidatePending=type(transaction)==\"table\"and transaction.state==\"candidate\"end local input=fs.open(source,\"r\")local text=input and input.readAll()or nil if input then input.close()end if not text then return nil end local candidate=root..\"/agent-\"..inactive..\".lua\"if not candidatePending and(slots[inactive]or\"\")~=checksum(text)and load(text,candidate,\"t\")then local temporary=candidate..\".tmp\"local output=fs.open(temporary,\"w\")if output then output.write(text);output.close();if fs.exists(candidate)then fs.delete(candidate)end;fs.move(temporary,candidate);slots[inactive]=checksum(text)end end local active=root..\"/agent-\"..slots.active..\".lua\"local fallback=root..\"/agent-\"..inactive..\".lua\"local activeSlot,fallbackSlot=slots.active,inactive local function validSlot(path,expected)if not fs.exists(path)then return false end local handle=fs.open(path,\"r\");local body=handle and handle.readAll()or nil if handle then handle.close()end return body~=nil and(expected==nil or expected==checksum(body))and load(body,path,\"t\")~=nil end if not validSlot(active,slots[slots.active])then if validSlot(fallback,slots[inactive])then active,fallback,slots.active=fallback,active,inactive activeSlot,fallbackSlot=inactive,activeSlot else return nil end end local out=fs.open(descriptor..\".tmp\",\"w\")if out then out.write(textutils.serialise(slots));out.close();if fs.exists(descriptor)then fs.delete(descriptor)end;fs.move(descriptor..\".tmp\",descriptor)end return{primary=active,fallback=validSlot(fallback,slots[fallbackSlot])and fallback or nil}end local recovery=recoveryAgent()if pending and pending.state==\"apply\"and fs.exists(releasePath)then shell.run(releasePath,\"--ceetos-apply\")elseif recovery then local ok=shell.run(recovery.primary)if ok==false and recovery.fallback then shell.run(recovery.fallback)end elseif fs.exists(\"/ceetos/startup.lua\")then shell.run(\"/ceetos/startup.lua\")else shell.run(\"shell\")end",
  ["ceetos/startup.lua"] = "local root=\"/ceetos\"local handoffPath=\"/ceetos-dev/recovery/restart-request.lua\"package.path=\"/?.lua;/?/init.lua;\"..package.path while true do if fs.exists(handoffPath)then fs.delete(handoffPath)end local profile={id=\"desktop\"}local loaded,profileService=pcall(require,\"ceetos.lib.profile\")if loaded and type(profileService)==\"table\"and type(profileService.current)==\"function\"then local ok,value=pcall(profileService.current)if ok and type(value)==\"table\"then profile=value end end if profile.id~=\"desktop\"and fs.exists(root..\"/server.lua\")then shell.run(root..\"/server.lua\")elseif fs.exists(root..\"/ceet.lua\")then shell.run(root..\"/ceet.lua\")else printError(\"CeetOS is incomplete; starting CraftOS shell.\")shell.run(\"shell\")end sleep(0.1)end",
  ["ceetos/profile.lua"] = "return {schema=1,id=\"recipe-server\"}",
  ["ceetos/lib/store.lua"] = "local M={}local cache={}local function internalPath(path)return type(path)~=\"string\"or path:sub(-4)==\".new\"or path:sub(-4)==\".bak\"end local function call(fn,...)local result={pcall(fn,...)}if not result[1]then return false,tostring(result[2])end if result[2]==false then return false,tostring(result[3]or\"operation failed\")end return true,result[2],result[3]end local function exists(path)local ok,value=call(fs.exists,path)return ok and value==true end local function remove(path)if not exists(path)then return true end local ok,err=call(fs.delete,path)return ok,err end local function ensureDirectory(path)local dir=fs.getDir(path)if dir==\"\"or exists(dir)then return true end local ok,err=call(fs.makeDir,dir)return ok,err end local function readRaw(path)local ok,handleOrErr=call(fs.open,path,\"r\")if not ok or not handleOrErr then return false,nil,tostring(handleOrErr or\"could not open file\")end local handle=handleOrErr local readOk,content=call(handle.readAll)local closeOk,closeErr=call(handle.close)if not readOk then return false,nil,content end if not closeOk then return false,nil,closeErr end return true,content end local function writeRaw(path,content)local ok,handleOrErr=call(fs.open,path,\"w\")if not ok or not handleOrErr then return false,tostring(handleOrErr or\"could not open file\")end local handle=handleOrErr local writeOk,writeErr=call(handle.write,content)local closeOk,closeErr=call(handle.close)if not writeOk then return false,writeErr end if not closeOk then return false,closeErr end return true end local function move(source,destination)local ok,err=call(fs.move,source,destination)return ok,err end local function decode(raw)local ok,value=pcall(textutils.unserialise,raw)if not ok or value==nil then return false,nil,\"invalid serialised value\"end return true,value end local function readValue(path)local ok,raw,err=readRaw(path)if not ok then return false,nil,err end return decode(raw)end local function recoverValue(path)local activeOk,activeValue=false,nil if exists(path)then activeOk,activeValue=readValue(path)end if activeOk then remove(path..\".new\")remove(path..\".bak\")return true,activeValue end local backupOk,backupValue=false,nil if exists(path..\".bak\")then backupOk,backupValue=readValue(path..\".bak\")end if backupOk then if exists(path)then remove(path)end if not exists(path)then move(path..\".bak\",path)end remove(path..\".new\")return true,backupValue end remove(path..\".new\")return false,nil end local function validLines(raw)for line in(raw..\"\\n\"):gmatch(\"(.-)\\n\")do if line~=\"\"then local ok,value=pcall(textutils.unserialise,line)if not ok or value==nil then return false,\"invalid appended value\"end end end return true end local function recoverAppend(path)if exists(path)then local activeOk,raw=readRaw(path)if activeOk then local valid=validLines(raw)if valid then remove(path..\".new\")remove(path..\".bak\")return true,raw end end end if exists(path..\".bak\")then local backupOk,raw=readRaw(path..\".bak\")if backupOk and validLines(raw)then if exists(path)then remove(path)end if not exists(path)then move(path..\".bak\",path)end remove(path..\".new\")return true,raw end end remove(path..\".new\")return false,\"no valid appended value\"end local function commitRaw(path,raw,validator)local dirOk,dirErr=ensureDirectory(path)if not dirOk then return false,dirErr end local temporary,backup=path..\".new\",path..\".bak\"local removeOk,removeErr=remove(temporary)if not removeOk then return false,removeErr end local writeOk,writeErr=writeRaw(temporary,raw)if not writeOk then remove(temporary);return false,writeErr end local checkOk,checkedRaw,checkErr=readRaw(temporary)if not checkOk then remove(temporary);return false,checkErr end local valid,validErr=validator(checkedRaw)if not valid then remove(temporary);return false,validErr or\"temporary validation failed\"end local backupRemoveOk,backupRemoveErr=remove(backup)if not backupRemoveOk then remove(temporary);return false,backupRemoveErr end if exists(path)then local backupOk,backupErr=move(path,backup)if not backupOk then remove(temporary);return false,backupErr end local activateOk,activateErr=move(temporary,path)if not activateOk then if not exists(path)then move(backup,path)end remove(temporary)return false,activateErr end else local activateOk,activateErr=move(temporary,path)if not activateOk then remove(temporary);return false,activateErr end end return true end function M.readCached(path,fallback)if internalPath(path)then return fallback end local entry=cache[path]if entry~=nil then return entry.value end return M.readFresh(path,fallback)end function M.readFresh(path,fallback)if internalPath(path)then return fallback end local ok,value=recoverValue(path)if not ok then value=fallback end cache[path]={value=value}return value end function M.readStable(path,fallback)if internalPath(path)then return fallback end local ok,value=readValue(path)if not ok then return fallback end return value end function M.read(path,fallback)return M.readCached(path,fallback)end function M.writeAtomic(path,value)if internalPath(path)then return false,\"cannot write store temporary or backup path\"end if value==nil then return false,\"cannot store nil\"end local serialisedOk,raw=pcall(textutils.serialise,value,{compact=true})if not serialisedOk or type(raw)~=\"string\"then return false,tostring(raw or\"could not serialise value\")end local valid=decode(raw)if not valid then return false,\"could not validate serialised value\"end recoverValue(path)local ok,err=commitRaw(path,raw,decode)if ok then cache[path]={value=value}end return ok,err end function M.write(path,value)return M.writeAtomic(path,value)end function M.append(path,value,limits)if internalPath(path)then return false,\"cannot append to store temporary or backup path\"end if value==nil then return false,\"cannot append nil\"end local serialisedOk,line=pcall(textutils.serialise,value,{compact=true})if not serialisedOk or type(line)~=\"string\"then return false,tostring(line or\"could not serialise value\")end local valid=validLines(line..\"\\n\")if not valid then return false,\"could not validate appended value\"end local recovered,current=recoverAppend(path)if not recovered then if exists(path)or exists(path..\".bak\")then return false,current end current=\"\"end local lines={}for existing in(current..\"\\n\"):gmatch(\"(.-)\\n\")do if existing~=\"\"then lines[#lines+1]=existing end end lines[#lines+1]=line local maxEntries=limits and tonumber(limits.maxEntries)local maxBytes=limits and tonumber(limits.maxBytes)if maxEntries then maxEntries=math.max(1,math.floor(maxEntries))end if maxBytes then maxBytes=math.max(1,math.floor(maxBytes))end while maxEntries and#lines>maxEntries do table.remove(lines,1)end local raw=table.concat(lines,\"\\n\")if#raw>0 then raw=raw..\"\\n\"end while maxBytes and#raw>maxBytes and#lines>1 do table.remove(lines,1)raw=table.concat(lines,\"\\n\")..\"\\n\"end if maxBytes and#raw>maxBytes then return false,\"appended value exceeds byte limit\"end local ok,err=commitRaw(path,raw,validLines)if ok then cache[path]=nil end return ok,err end function M.readAppend(path)if internalPath(path)then return\"\"end local ok,raw=recoverAppend(path)return ok and raw or\"\"end function M.invalidate(path)cache[path]=nil end return M",
  ["ceetos/lib/runtime_modules.lua"] = "local M={}function M.refresh()local loaded=package and package.loaded if type(loaded)~=\"table\"then return 0 end local names={}for name in pairs(loaded)do if type(name)==\"string\"and name:sub(1,7)==\"ceetos.\"then names[#names+1]=name end end for _,name in ipairs(names)do loaded[name]=nil end return#names end return M",
  ["ceetos/lib/supervisor.lua"] = "local M={}local Supervisor={}Supervisor.__index=Supervisor local function clamp(value,minimum,maximum)value=tonumber(value)or minimum if value<minimum then return minimum end if value>maximum then return maximum end return value end local function bounded(value,maximum)value=tostring(value or\"worker returned\")return value:sub(1,maximum or 240)end function M.new(options)options=options or{}assert(type(options.now)==\"function\",\"supervisor requires a clock\")assert(type(options.sleep)==\"function\",\"supervisor requires a sleep function\")return setmetatable({now=options.now,sleep=options.sleep,record=type(options.record)==\"function\"and options.record or function()end,baseDelay=clamp(options.baseDelay,0.1,60),maxDelay=clamp(options.maxDelay,0.1,300),failures={},},Supervisor)end function Supervisor:attempt(name,worker)assert(type(name)==\"string\"and#name>0 and#name<=48,\"invalid worker name\")assert(type(worker)==\"function\",\"worker must be a function\")local previous=self.failures[name]or 0 pcall(self.record,name,{state=\"running\",failures=previous,at=self.now()})local ok,value=xpcall(worker,function(errorText)return bounded(errorText)end)local failures=previous+1 local delay=math.min(self.maxDelay,self.baseDelay*(2^math.min(failures-1,10)))failures=math.min(failures,1024)self.failures[name]=failures local status={state=\"backoff\",failures=failures,delay=delay,error=ok and\"worker returned\"or bounded(value),at=self.now(),}pcall(self.record,name,status)return false,status end function Supervisor:run(name,worker)while true do local _,status=self:attempt(name,worker)self.sleep(status.delay)end end function Supervisor:status(name)return self.failures[name]or 0 end return M",
  ["ceetos/lib/profile.lua"] = "local store=require(\"ceetos.lib.store\")local M={}M.PATH=\"/ceetos/data/profile.lua\"M.INSTALLED_PATH=\"/ceetos/profile.lua\"M.IDS={desktop=true,[\"recipe-server\"]=true,[\"router-server\"]=true,[\"auth-server\"]=true}local cache local function normalise(value)if type(value)~=\"table\"then value={}end local id=tostring(value.id or value.profile or\"desktop\")if not M.IDS[id]then id=\"desktop\"end return{schema=1,id=id,installedAt=tonumber(value.installedAt)or 0}end function M.parse(raw)if type(raw)~=\"string\"or#raw>1024 then return nil,\"invalid profile data\"end local ok,value=pcall(textutils.unserialise,raw)if ok and type(value)==\"table\"then return normalise(value)end local schema,id=raw:match('^%s*return%s*%{%s*schema%s*=%s*(%d+)%s*,%s*id%s*=%s*[\"\\']([%w%-]+)[\"\\']%s*,?%s*%}%s*$')if schema and M.IDS[id]then return normalise({schema=tonumber(schema),id=id})end return nil,\"invalid profile data\"end local function readPath(path)if not fs.exists(path)then return nil end local handle=fs.open(path,\"r\")if not handle then return normalise({id=\"desktop\"})end local raw=handle.readAll()handle.close()return M.parse(raw)end local function readCurrent()return readPath(M.PATH)or readPath(M.INSTALLED_PATH)or normalise({id=\"desktop\"})end function M.current()if not cache then cache=readCurrent()end return cache end function M.id()return M.current().id end function M.is(id)return M.id()==id end function M.isServer()return M.id()~=\"desktop\"end function M.set(id)assert(M.IDS[id],\"invalid CeetOS profile\")cache={schema=1,id=id,installedAt=os.epoch(\"utc\")}return store.writeAtomic(M.PATH,cache)end function M.capability(name)local id=M.id()local tableFor={desktop={desktop=true,craftingClient=true,orders=true},[\"recipe-server\"]={server=true,recipes=true,recipeImport=true,recipePlan=true},[\"router-server\"]={server=true,routing=true},[\"auth-server\"]={server=true,authAuthority=true},}return tableFor[id][name]==true end return M",
  ["ceetos/lib/auth.lua"] = "local store=require(\"ceetos.lib.store\")local password=require(\"ceetos.lib.password\")local audit=require(\"ceetos.lib.audit\")local M={current=nil}local USERS=\"/ceetos/data/users.lua\"local SESSION=\"/ceetos/data/session.lua\"local TOMBSTONES=\"/ceetos/data/user-tombstones.lua\"local CONFLICTS=\"/ceetos/data/account-conflicts.lua\"local THROTTLE=\"/ceetos/data/login-throttle.lua\"local RECOVERY=\"/ceetos/data/recovery.lua\"local AUTHORITY=\"/ceetos/data/auth-authority.lua\"local CENTRAL_SESSION=\"/ceetos/data/auth-session.lua\"local DIRECTORY=\"/ceetos/data/auth-directory.lua\"local rank={viewer=1,operator=2,admin=3}M.SESSION_TTL_MS=8*60*60*1000 M.LOGIN_THROTTLE={failures=5,windowMs=5*60*1000,lockMs=60*1000,maxEntries=64}local configuredWorkFactor=password.DEFAULT_WORK_FACTOR local sessionPathDelete local function now()return os.epoch(\"utc\")end local function accountName(name)return type(name)==\"string\"and name:match(\"^[%w_%-]+$\")and#name<=32 end local function users()store.invalidate(USERS);return store.read(USERS,{})end local function save(value)return store.write(USERS,value)end local function tombstones()store.invalidate(TOMBSTONES);return store.read(TOMBSTONES,{})end local function saveTombstones(value)return store.write(TOMBSTONES,value)end local function conflicts()store.invalidate(CONFLICTS)local value=store.read(CONFLICTS,{})return type(value)==\"table\"and value or{}end local function saveConflicts(value)return store.write(CONFLICTS,value)end local function sameSecurityRecord(left,right)if type(left)~=\"table\"or type(right)~=\"table\"then return false end return left.role==right.role and left.salt==right.salt and left.verifier==right.verifier and left.passwordVersion==right.passwordVersion and left.scheme==right.scheme and tonumber(left.workFactor)==tonumber(right.workFactor)and(left.disabled==true)==(right.disabled==true)end local function recordConflict(name,localAccount,incoming,localOrigin,incomingOrigin)local entries=conflicts()local previous=type(entries[name])==\"table\"and entries[name]or{}entries[name]={name=name,detected=now(),occurrences=math.min(999,math.max(0,math.floor(tonumber(previous.occurrences)or 0))+1),localOrigin=tostring(localOrigin):sub(1,64),incomingOrigin=tostring(incomingOrigin):sub(1,64),localRole=tostring(localAccount.role),incomingRole=tostring(incoming.role),localDisabled=localAccount.disabled==true,incomingDisabled=incoming.disabled==true,localRevision=math.max(0,math.floor(tonumber(localAccount.revision)or 0)),incomingRevision=math.max(0,math.floor(tonumber(incoming.revision)or 0)),localUpdated=math.max(0,math.floor(tonumber(localAccount.updated)or 0)),incomingUpdated=math.max(0,math.floor(tonumber(incoming.updated)or 0)),}local ordered={}for entryName,entry in pairs(entries)do if accountName(entryName)and type(entry)==\"table\"then ordered[#ordered+1]={name=entryName,at=tonumber(entry.detected)or 0}end end table.sort(ordered,function(a,b)return a.at>b.at end)for index=33,#ordered do entries[ordered[index].name]=nil end return saveConflicts(entries)end local function authority()store.invalidate(AUTHORITY)local value=store.read(AUTHORITY,nil)return type(value)==\"table\"and value.active==true and type(value.id)==\"string\"and value or nil end function M.authority()return authority()end function M.centralActive()return authority()~=nil end local function centralDirectory()store.invalidate(DIRECTORY)local value=store.read(DIRECTORY,{})return type(value)==\"table\"and type(value.users)==\"table\"and value or{users={}}end function M.acceptAuthority(record,context)assert(type(record)==\"table\"and type(record.id)==\"string\"and#record.id<=64,\"invalid auth authority\")assert(type(context)==\"table\"and context.direct==true and tostring(context.from)==record.id,\"untrusted auth authority advertisement\")local incoming={schema=1,active=true,id=record.id,term=math.max(0,math.floor(tonumber(record.term)or 0)),revision=math.max(0,math.floor(tonumber(record.revision)or 0)),seen=now(),}local current=store.readFresh(AUTHORITY,nil)assert(type(current)==\"table\"and current.active==true,\"new auth authority requires local administrator enrollment\")assert(incoming.id==current.id,\"auth authority identity is pinned\")if type(current)==\"table\"and current.active==true then local currentTerm,currentRevision=math.max(0,math.floor(tonumber(current.term)or 0)),math.max(0,math.floor(tonumber(current.revision)or 0))if incoming.term<currentTerm or(incoming.term==currentTerm and incoming.id~=current.id)or(incoming.term==currentTerm and incoming.id==current.id and incoming.revision<currentRevision)then current.seen=incoming.seen assert(store.write(AUTHORITY,current),\"could not refresh auth authority\")return current,\"stale authority advertisement ignored\"end end assert(store.write(AUTHORITY,incoming),\"could not save auth authority\")return incoming end function M.acceptCloudAuthority(record,endpoint)assert(type(record)==\"table\"and type(record.id)==\"string\",\"invalid cloud auth authority\")assert(type(endpoint)==\"string\"and endpoint:match(\"^https://\"),\"invalid cloud auth endpoint\")assert(record.id==\"cloud:\"..endpoint,\"cloud authority endpoint mismatch\")local current=store.readFresh(AUTHORITY,nil)if type(current)==\"table\"and current.active==true and current.id~=record.id then error(\"auth authority identity is pinned\")end local incoming={schema=1,active=true,id=record.id,term=math.max(0,math.floor(tonumber(record.term)or 0)),revision=math.max(0,math.floor(tonumber(record.revision)or 0)),seen=now(),source=\"cloud\",}if type(current)==\"table\"and current.active==true then local currentTerm=math.max(0,math.floor(tonumber(current.term)or 0))local currentRevision=math.max(0,math.floor(tonumber(current.revision)or 0))if incoming.term<currentTerm or(incoming.term==currentTerm and incoming.revision<currentRevision)then current.seen=incoming.seen assert(store.write(AUTHORITY,current),\"could not refresh cloud auth authority\")return current,\"stale cloud authority response ignored\"end end assert(store.write(AUTHORITY,incoming),\"could not save cloud auth authority\")return incoming end function M.updateDirectory(directory,revision)if type(directory)~=\"table\"then return false,\"invalid account directory\"end local incomingRevision=math.max(0,math.floor(tonumber(revision)or 0))local current=store.readFresh(DIRECTORY,nil)local currentRevision=type(current)==\"table\"and math.max(0,math.floor(tonumber(current.revision)or 0))or-1 if currentRevision>incomingRevision then return true,\"stale directory update ignored\"end return store.write(DIRECTORY,{schema=1,revision=incomingRevision,users=directory})end function M.saveCentralSession(value)if type(value)~=\"table\"or not accountName(value.name)or type(value.role)~=\"string\"then return false,\"invalid central session\"end local session={sessionVersion=3,name=value.name,role=value.role,token=value.token,issued=value.issued,expires=value.expires,accountRevision=value.accountRevision,authority=value.authority}if type(session.token)~=\"string\"or#session.token<16 then return false,\"invalid central session token\"end store.write(CENTRAL_SESSION,session)M.current=nil return true end local function safeAudit(action,detail)pcall(audit.log,\"auth\",action,detail or{})end local function stamp(account)account.updated=now()account.origin=tostring(os.getComputerID())account.revision=math.max(0,math.floor(tonumber(account.revision)or 0))+1 return account end local function makeAccount(role,plainPassword,context)local record,err=password.record(plainPassword,password.newSalt(context),configuredWorkFactor)assert(record,err)record.role=role return stamp(record)end sessionPathDelete=function()if fs.exists(SESSION)then fs.delete(SESSION)end store.invalidate(SESSION)end local function saveSession()if M.current==nil then sessionPathDelete();return end local durable={sessionVersion=2,name=M.current.name,nonce=M.current.nonce,issued=M.current.issued,expires=M.current.expires,accountRevision=M.current.accountRevision,}store.write(SESSION,durable)end local function makeSession(name,account)local issued=now()M.current={name=name,role=account.role,nonce=password.newSalt(\"session:\"..name),issued=issued,expires=issued+M.SESSION_TTL_MS,accountRevision=tonumber(account.revision)or 0,}saveSession()return M.current end local function liveAccount(name)local all=users()return all[name],all end local function normaliseSession(saved,account)if type(saved)~=\"table\"or not account or account.disabled then return nil end if saved.sessionVersion==2 then local issued,expires,revision=tonumber(saved.issued),tonumber(saved.expires),tonumber(saved.accountRevision)if type(saved.nonce)~=\"string\"or#saved.nonce<16 or not issued or not expires or not revision then return nil end if expires<=now()or revision~=(tonumber(account.revision)or 0)then return nil end return{name=saved.name,role=account.role,nonce=saved.nonce,issued=issued,expires=expires,accountRevision=revision}end if saved.sessionVersion==nil and type(saved.role)==\"string\"then return\"legacy\"end return nil end function M.refreshSession()local central=authority()if central then store.invalidate(CENTRAL_SESSION)local saved=store.read(CENTRAL_SESSION,nil)local entry=type(saved)==\"table\"and centralDirectory().users[saved.name]or nil if type(saved)~=\"table\"or saved.sessionVersion~=3 or saved.authority~=central.id or type(saved.token)~=\"string\"or(tonumber(saved.expires)or 0)<=now()or type(entry)~=\"table\"or entry.disabled==true or saved.accountRevision~=entry.revision then M.current=nil if fs.exists(CENTRAL_SESSION)then fs.delete(CENTRAL_SESSION)end return nil end M.current={name=saved.name,role=entry.role,nonce=saved.token,issued=saved.issued,expires=saved.expires,accountRevision=saved.accountRevision,authority=central.id,central=true}return M.current end store.invalidate(SESSION)local saved=store.read(SESSION,nil)if type(saved)~=\"table\"or not accountName(saved.name)then M.current=nil;return nil end local account=liveAccount(saved.name)local session=normaliseSession(saved,account)if session==\"legacy\"then return makeSession(saved.name,account)end if not session then M.current=nil sessionPathDelete()return nil end M.current=session return M.current end local function throttleState()store.invalidate(THROTTLE)local data=store.read(THROTTLE,{})return type(data)==\"table\"and data or{}end local function saveThrottle(data)local entries={}for name,entry in pairs(data)do if accountName(name)and type(entry)==\"table\"and type(entry.last)==\"number\"then entries[#entries+1]={name=name,last=entry.last}end end table.sort(entries,function(a,b)return a.last>b.last end)local kept={}for index,entry in ipairs(entries)do if index<=M.LOGIN_THROTTLE.maxEntries then kept[entry.name]=data[entry.name]end end store.write(THROTTLE,kept)end local function locked(name)if not accountName(name)then return false end local entry=throttleState()[name]return entry and(tonumber(entry.lockedUntil)or 0)>now()or false end local function noteFailure(name,reason)if not accountName(name)then return end local data,entry,time=throttleState(),nil,now()entry=data[name]or{failures=0,first=time}if time-(tonumber(entry.first)or 0)>M.LOGIN_THROTTLE.windowMs then entry.failures,entry.first=0,time end entry.failures=math.max(0,math.floor(tonumber(entry.failures)or 0))+1 entry.last=time if entry.failures>=M.LOGIN_THROTTLE.failures then entry.lockedUntil=time+M.LOGIN_THROTTLE.lockMs end data[name]=entry saveThrottle(data)safeAudit(\"login.failure\",{account=name,reason=reason or\"invalid\",throttled=(entry.lockedUntil or 0)>time})end local function clearFailures(name)local data=throttleState()if data[name]~=nil then data[name]=nil;saveThrottle(data)end end function M.throttleStatus(name)local entry=accountName(name)and throttleState()[name]or nil if not entry then return{failures=0,lockedUntil=0}end return{failures=tonumber(entry.failures)or 0,lockedUntil=tonumber(entry.lockedUntil)or 0}end function M.setPasswordWorkFactor(value)local work,err=password.normaliseWorkFactor(value)assert(work,err)configuredWorkFactor=work return work end function M.passwordWorkFactor()return configuredWorkFactor end function M.bootstrap(initialPassword)if authority()then return false end local all=users()if next(all)then return false end local plainPassword=initialPassword if plainPassword==nil then term.write(\"Create CeetOS admin password: \");plainPassword=read(\"*\")end local account=makeAccount(\"admin\",plainPassword,\"admin\")all.admin=account assert(save(all),\"could not save administrator account\")makeSession(\"admin\",account)safeAudit(\"bootstrap\",{account=\"admin\"})return true end function M.login(name,plainPassword)if authority()then local client=require((\"ceetos.lib.auth_client\"))return client.login(name,plainPassword)end if not accountName(name)or type(plainPassword)~=\"string\"then noteFailure(name,\"invalid\")return false,\"invalid credentials\"end if locked(name)then safeAudit(\"login.failure\",{account=name,reason=\"throttled\",throttled=true})return false,\"too many failed attempts; try again later\"end local account,all=liveAccount(name)if not account or account.disabled then noteFailure(name,\"invalid\")return false,\"invalid credentials\"end local valid,state=password.verify(account,plainPassword)if not valid then noteFailure(name,\"invalid\")return false,\"invalid credentials\"end if state==\"legacy\"then local upgraded=makeAccount(account.role,plainPassword,\"upgrade:\"..name)upgraded.updated=account.updated or upgraded.updated upgraded.origin=account.origin or upgraded.origin upgraded.revision=math.max(tonumber(account.revision)or 0,upgraded.revision)stamp(upgraded)all[name]=upgraded assert(save(all),\"could not upgrade password record\")account=upgraded safeAudit(\"password.upgraded\",{account=name})end clearFailures(name)makeSession(name,account)safeAudit(\"login.success\",{account=name})return true end function M.startLogin(name,plainPassword)if not authority()then return{done=true,ok=false,error=\"an Auth Server login is required\"}end return require(\"ceetos.lib.auth_client\").startLogin(name,plainPassword)end function M.step(task,event,eventId)if type(task)~=\"table\"then return true,false,\"invalid authentication transaction\"end if task.done then return true,task.ok==true,task.error end if not authority()then return true,false,\"an Auth Server login is required\"end return require(\"ceetos.lib.auth_client\").step(task,event,eventId)end function M.logout()M.current=nil sessionPathDelete()if fs.exists(CENTRAL_SESSION)then fs.delete(CENTRAL_SESSION)end end function M.add(name,role,plainPassword)if authority()then assert(rank[role]and accountName(name),\"invalid user or role\")local record,err=makeAccount(role,plainPassword,\"central:\"..name)assert(record,err)return require((\"ceetos.lib.auth_client\")).mutate(\"add\",{name=name,role=role,record=record})end M.require(\"operator\")assert(rank[role],\"invalid role\")if role==\"admin\"then M.require(\"admin\")end assert(accountName(name),\"invalid user name\")local all=users()assert(not all[name],\"user exists\")all[name]=makeAccount(role,plainPassword,name)assert(save(all),\"could not save user\")safeAudit(\"user.add\",{account=name,role=role})end local function adminCount(all)local count=0 for _,account in pairs(all)do if account.role==\"admin\"and not account.disabled then count=count+1 end end return count end function M.setRole(name,role)if authority()then return require((\"ceetos.lib.auth_client\")).mutate(\"role\",{name=name,role=role})end M.require(\"operator\")assert(accountName(name)and rank[role],\"invalid user or role\")local all,account=users(),users()[name]assert(account,\"unknown user\")if role==\"admin\"or account.role==\"admin\"then M.require(\"admin\")end assert(not(M.current and M.current.name==name),\"cannot change the active account role\")assert(not(account.role==\"admin\"and role~=\"admin\"and adminCount(all)<=1),\"cannot remove the last administrator\")account.role=role stamp(account)all[name]=account assert(save(all),\"could not save account role\")safeAudit(\"user.role\",{account=name,role=role})end function M.setDisabled(name,disabled)if authority()then return require((\"ceetos.lib.auth_client\")).mutate(\"disable\",{name=name,disabled=disabled==true})end M.require(\"admin\")assert(accountName(name),\"invalid user name\")local all,account=users(),users()[name]assert(account,\"unknown user\")assert(not(M.current and M.current.name==name),\"cannot disable the active account\")if disabled then assert(not(account.role==\"admin\"and adminCount(all)<=1),\"cannot disable the last administrator\")end account.disabled=disabled==true stamp(account)all[name]=account assert(save(all),\"could not save account state\")safeAudit(\"user.disabled\",{account=name,disabled=account.disabled})end function M.remove(name)if authority()then return require((\"ceetos.lib.auth_client\")).mutate(\"remove\",{name=name})end M.require(\"operator\")assert(accountName(name),\"invalid user name\")local all,account=users(),users()[name]assert(account,\"unknown user\")if account.role==\"admin\"then M.require(\"admin\")end assert(not(M.current and M.current.name==name),\"cannot delete the active account\")assert(not(account.role==\"admin\"and adminCount(all)<=1),\"cannot delete the last administrator\")all[name]=nil local removed=tombstones()removed[name]=now()assert(saveTombstones(removed),\"could not save account tombstone\")assert(save(all),\"could not remove account\")safeAudit(\"user.remove\",{account=name})end local function recoveryActive()store.invalidate(RECOVERY)local recovery=store.read(RECOVERY,{})return type(recovery)==\"table\"and(tonumber(recovery.until_ts)or 0)>now()end local function setPassword(name,plainPassword)assert(accountName(name),\"invalid user name\")local all,account=users(),users()[name]assert(account,\"unknown user\")local replacement=makeAccount(account.role,plainPassword,\"reset:\"..name)replacement.updated=account.updated or replacement.updated replacement.origin=account.origin or replacement.origin replacement.revision=math.max(tonumber(account.revision)or 0,replacement.revision)replacement.disabled=account.disabled==true stamp(replacement)all[name]=replacement assert(save(all),\"could not save password\")if M.current and M.current.name==name then M.current=nil;sessionPathDelete()end safeAudit(\"password.reset\",{account=name})return true end function M.resetPassword(name,plainPassword)if authority()then local account=centralDirectory().users[name];assert(account,\"unknown user\")local record,err=makeAccount(account.role,plainPassword,\"central-reset:\"..name);assert(record,err)return require((\"ceetos.lib.auth_client\")).mutate(\"reset\",{name=name,record=record})end if not M.allowed(\"admin\")and not recoveryActive()then error(\"permission denied (requires admin or active recovery window)\",2)end return setPassword(name,plainPassword)end function M.adminResetPassword(name,plainPassword)if authority()then local account=centralDirectory().users[name];assert(account,\"unknown user\")local record,err=makeAccount(account.role,plainPassword,\"central-reset:\"..name);assert(record,err)return require((\"ceetos.lib.auth_client\")).mutate(\"reset\",{name=name,record=record})end M.require(\"operator\")local account=users()[name]assert(account,\"unknown user\")if account.role==\"admin\"then M.require(\"admin\")end return setPassword(name,plainPassword)end function M.allowed(role)if not rank[role]then return false end local current=M.refreshSession()return current~=nil and rank[current.role]>=rank[role]end function M.sessionStatus()local current=M.refreshSession()if not current then return{active=false,central=authority()~=nil}end return{active=true,name=current.name,role=current.role,central=current.central==true,authority=current.authority,expires=tonumber(current.expires),accountRevision=tonumber(current.accountRevision),}end function M.canExitOs()return M.allowed(\"admin\")end function M.require(role)if not M.allowed(role)then error(\"permission denied (requires \"..tostring(role)..\")\",2)end end function M.list()local out={}local source=authority()and centralDirectory().users or users()for name,account in pairs(source)do out[#out+1]={name=name,role=account.role,disabled=account.disabled==true,revision=account.revision}end table.sort(out,function(a,b)return a.name<b.name end)return out end function M.conflicts()local out={}for name,entry in pairs(conflicts())do if accountName(name)and type(entry)==\"table\"then out[#out+1]={name=name,detected=tonumber(entry.detected)or 0,occurrences=tonumber(entry.occurrences)or 1,localOrigin=entry.localOrigin,incomingOrigin=entry.incomingOrigin,localRole=entry.localRole,incomingRole=entry.incomingRole,localDisabled=entry.localDisabled==true,incomingDisabled=entry.incomingDisabled==true,localRevision=tonumber(entry.localRevision)or 0,incomingRevision=tonumber(entry.incomingRevision)or 0,}end end table.sort(out,function(a,b)return a.name<b.name end)return out end function M.dismissConflict(name)M.require(\"admin\")assert(accountName(name),\"invalid user name\")local entries=conflicts()if entries[name]==nil then return false,\"no account conflict for user\"end entries[name]=nil assert(saveConflicts(entries),\"could not resolve account conflict\")safeAudit(\"accounts.conflict_dismissed\",{account=name})return true end function M.snapshot()if authority()then return{users={},tombstones={},source=tostring(os.getComputerID()),schema=3,central=true}end return M.authoritySnapshot()end function M.authoritySnapshot()local copy={users={},tombstones={},source=tostring(os.getComputerID()),schema=2}for name,account in pairs(users())do copy.users[name]={role=account.role,salt=account.salt,verifier=account.verifier,passwordVersion=account.passwordVersion,scheme=account.scheme,workFactor=account.workFactor,revision=tonumber(account.revision)or 0,disabled=account.disabled==true,updated=account.updated or 0,origin=account.origin or copy.source,}end for name,removed in pairs(tombstones())do copy.tombstones[name]=removed end return copy end local function validIncomingPassword(account)if password.isModern(account)then local work=password.normaliseWorkFactor(account.workFactor)return work~=nil and type(account.verifier)==\"string\"and#account.verifier==64 and account.verifier:match(\"^[0-9a-f]+$\")~=nil end return type(account.salt)==\"string\"and#account.salt>0 and#account.salt<=256 and type(account.verifier)==\"string\"and account.verifier:match(\"^[0-9a-fA-F]+$\")~=nil and#account.verifier==8 end function M.merge(snapshot,authoritySeed)if authority()and authoritySeed~=true then return false,\"distributed account sync is disabled by central authority\"end if type(snapshot)~=\"table\"or type(snapshot.users)~=\"table\"then return false,\"invalid account sync\"end local all,removed,changed,conflicted=users(),tombstones(),false,false for name,deletedAt in pairs(snapshot.tombstones or{})do if accountName(name)and type(deletedAt)==\"number\"and deletedAt>(removed[name]or 0)then local localAccount=all[name]if not localAccount or(localAccount.updated or 0)<=deletedAt then all[name],removed[name],changed=nil,deletedAt,true end end end for name,account in pairs(snapshot.users)do if accountName(name)and type(account)==\"table\"and rank[account.role]and validIncomingPassword(account)then local updated=tonumber(account.updated)or 0 local localAccount,incomingOrigin=all[name],tostring(account.origin or snapshot.source or\"\")local localOrigin=localAccount and tostring(localAccount.origin or os.getComputerID())or\"\"if localAccount and incomingOrigin~=\"\"and localOrigin~=\"\"and incomingOrigin~=localOrigin and not sameSecurityRecord(localAccount,account)then local saved,conflictErr=recordConflict(name,localAccount,account,localOrigin,incomingOrigin)if saved then conflicted=true safeAudit(\"accounts.conflict_quarantined\",{account=name,localOrigin=localOrigin,incomingOrigin=incomingOrigin})else return false,\"could not persist account conflict: \"..tostring(conflictErr)end else local wins=not localAccount or updated>(localAccount.updated or 0)or(updated==(localAccount.updated or 0)and incomingOrigin~=\"\"and incomingOrigin<localOrigin)if(removed[name]==nil or updated>removed[name])and wins then all[name]={role=account.role,salt=account.salt,verifier=account.verifier,passwordVersion=account.passwordVersion,scheme=account.scheme,workFactor=account.workFactor,revision=math.max(0,math.floor(tonumber(account.revision)or 0)),disabled=account.disabled==true,updated=updated,origin=incomingOrigin,}changed=true end end end end if changed then assert(save(all),\"could not save account sync\")assert(saveTombstones(removed),\"could not save account tombstones\")M.refreshSession()end if conflicted then return changed,\"account conflict quarantined for administrator review\"end return changed end function M.authorityAccount(name)if not accountName(name)then return nil end return users()[name]end function M.authorityDirectory()local out={}for name,account in pairs(users())do out[name]={role=account.role,disabled=account.disabled==true,revision=tonumber(account.revision)or 0}end return out end function M.authorityMutate(action,fields)fields=type(fields)==\"table\"and fields or{}local name=fields.name assert(accountName(name),\"invalid user name\")local all,account=users(),users()[name]if action==\"add\"then assert(not account,\"user exists\")assert(rank[fields.role],\"invalid role\")local record=fields.record assert(type(record)==\"table\"and password.isModern(record),\"central account mutation requires a verifier record\")record.role,record.disabled=fields.role,false;all[name]=stamp(record);assert(save(all),\"could not save user\")elseif action==\"role\"then assert(account and rank[fields.role],\"unknown user or invalid role\")if account.role==\"admin\"and fields.role~=\"admin\"then local admins=0;for _,candidate in pairs(all)do if candidate.role==\"admin\"and not candidate.disabled then admins=admins+1 end end assert(admins>1,\"cannot demote the last active admin\")end account.role=fields.role;stamp(account);all[name]=account;assert(save(all),\"could not save role\")elseif action==\"disable\"then if account and account.role==\"admin\"and fields.disabled==true then local admins=0;for _,candidate in pairs(all)do if candidate.role==\"admin\"and not candidate.disabled then admins=admins+1 end end assert(admins>1,\"cannot disable the last active admin\")end assert(account,\"unknown user\");account.disabled=fields.disabled==true;stamp(account);all[name]=account;assert(save(all),\"could not save user state\")elseif action==\"remove\"then assert(account,\"unknown user\")if account.role==\"admin\"and not account.disabled then local admins=0;for _,candidate in pairs(all)do if candidate.role==\"admin\"and not candidate.disabled then admins=admins+1 end end assert(admins>1,\"cannot remove the last active admin\")end all[name]=nil;local removed=tombstones();removed[name]=now();assert(saveTombstones(removed),\"could not save tombstone\");assert(save(all),\"could not remove user\")elseif action==\"reset\"then assert(account,\"unknown user\")local replacement=fields.record assert(type(replacement)==\"table\"and password.isModern(replacement),\"central password reset requires a verifier record\")replacement.role,replacement.disabled=account.role,account.disabled==true;all[name]=stamp(replacement);assert(save(all),\"could not save password\")else error(\"unsupported account mutation\")end safeAudit(\"authority.\"..action,{account=name})return M.authorityDirectory()end M.refreshSession()return M",
  ["ceetos/lib/auth_transport_policy.lua"] = "local M={}function M.isLogin(typeName)return typeName==\"auth_login_begin\"or typeName==\"auth_login_proof\"end function M.canSend(typeName,directTrusted)return M.isLogin(typeName)or directTrusted==true end function M.denial(typeName)if M.isLogin(typeName)then return nil end return\"central Auth Server account changes require a direct trusted link during security migration\"end return M",
  ["ceetos/lib/account_sync.lua"] = "local M={}function M.broadcast(auth,net,observe)if not auth or not net then return{sent=0,failed=0,total=0}end if auth.centralActive and auth.centralActive()then return{sent=0,failed=0,total=0,central=true}end local peers=type(net.directPeers)==\"function\"and net.directPeers()or{}local snapshot=type(auth.snapshot)==\"function\"and auth.snapshot()or nil if type(snapshot)~=\"table\"then return{sent=0,failed=#peers,total=#peers,error=\"account snapshot is unavailable\"}end local sent,failed,total=0,0,#peers if observe then observe({phase=\"starting\",completed=0,total=total})end for index,peer in ipairs(peers)do local ok=false if type(peer)==\"table\"and peer.id~=nil and type(net.request)==\"function\"then ok=net.request(peer.id,\"account_sync\",snapshot,{confidential=true})==true end if ok then sent=sent+1 else failed=failed+1 end if observe then observe({phase=\"sending\",completed=index,total=total,sent=sent,failed=failed})end end if observe then observe({phase=\"complete\",completed=total,total=total,sent=sent,failed=failed})end return{sent=sent,failed=failed,total=total}end function M.receive(auth,packet)if type(packet)~=\"table\"or packet.confidential~=true then return false,\"confidential account sync is required\"end if not auth or type(auth.merge)~=\"function\"then return false,\"account service is unavailable\"end return auth.merge(packet.body)end return M",
  ["ceetos/lib/password.lua"] = "local M={}M.SCHEME=\"pbkdf2-hmac-sha256\"M.PASSWORD_VERSION=2 M.DEFAULT_WORK_FACTOR=256 M.MIN_WORK_FACTOR=64 M.MAX_WORK_FACTOR=2048 M.MIN_LENGTH=8 M.MAX_LENGTH=128 local MOD=4294967296 local band,bor,bxor,bnot=bit32.band,bit32.bor,bit32.bxor,bit32.bnot local rshift,lshift=bit32.rshift,bit32.lshift local unpack=table.unpack or unpack local K={0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174,0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967,0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85,0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070,0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2,}local initial={0x6a09e667,0xbb67ae85,0x3c6ef372,0xa54ff53a,0x510e527f,0x9b05688c,0x1f83d9ab,0x5be0cd19,}local function add(...)local value=0 for i=1,select(\"#\",...)do value=(value+(select(i,...)or 0))%MOD end return value end local function rrotate(value,amount)if bit32.rrotate then return bit32.rrotate(value,amount)end return bor(rshift(value,amount),lshift(value,32-amount))end local function word(bytes,index)return bytes:byte(index)*16777216+bytes:byte(index+1)*65536+bytes:byte(index+2)*256+bytes:byte(index+3)end local function packWord(value)return string.char(band(rshift(value,24),0xff),band(rshift(value,16),0xff),band(rshift(value,8),0xff),band(value,0xff))end local function sha256Raw(value)local bitLength=#value*8 value=value..string.char(0x80)value=value..string.rep(\"\\0\",(56-(#value%64))%64)value=value..packWord(math.floor(bitLength/MOD))..packWord(bitLength%MOD)local h={unpack(initial)}for offset=1,#value,64 do if#value>16384 and offset>1 and((offset-1)/64)%128==0 and type(sleep)==\"function\"then sleep(0)end local w={}for i=1,16 do w[i]=word(value,offset+(i-1)*4)end for i=17,64 do local x,y=w[i-15],w[i-2]local s0=bxor(rrotate(x,7),rrotate(x,18),rshift(x,3))local s1=bxor(rrotate(y,17),rrotate(y,19),rshift(y,10))w[i]=add(w[i-16],s0,w[i-7],s1)end local a,b,c,d,e,f,g,hh=unpack(h)for i=1,64 do local s1=bxor(rrotate(e,6),rrotate(e,11),rrotate(e,25))local choice=bxor(band(e,f),band(bnot(e),g))local t1=add(hh,s1,choice,K[i],w[i])local s0=bxor(rrotate(a,2),rrotate(a,13),rrotate(a,22))local majority=bxor(band(a,b),band(a,c),band(b,c))local t2=add(s0,majority)hh,g,f,e,d,c,b,a=g,f,e,add(d,t1),c,b,a,add(t1,t2)end h[1],h[2],h[3],h[4]=add(h[1],a),add(h[2],b),add(h[3],c),add(h[4],d)h[5],h[6],h[7],h[8]=add(h[5],e),add(h[6],f),add(h[7],g),add(h[8],hh)end local result={}for i=1,8 do result[i]=packWord(h[i])end return table.concat(result)end local function hmac(key,message)if#key>64 then key=sha256Raw(key)end key=key..string.rep(\"\\0\",64-#key)local inner,outer={},{}for i=1,64 do local byte=key:byte(i)inner[i],outer[i]=string.char(bxor(byte,0x36)),string.char(bxor(byte,0x5c))end return sha256Raw(table.concat(outer)..sha256Raw(table.concat(inner)..message))end local function xorBytes(left,right)local out={}for i=1,#left do out[i]=string.char(bxor(left:byte(i),right:byte(i)))end return table.concat(out)end local function cooperate(round)if round%32~=0 or not(os and os.queueEvent and os.pullEvent)then return end os.queueEvent(\"ceetos_password_yield\")os.pullEvent(\"ceetos_password_yield\")end local function toHex(value)return(value:gsub(\".\",function(byte)return string.format(\"%02x\",byte:byte())end))end local function constantEqual(left,right)if type(left)~=\"string\"or type(right)~=\"string\"then return false end local differing=bxor(#left,#right)local length=math.max(#left,#right)for i=1,length do differing=bor(differing,bxor(left:byte(i)or 0,right:byte(i)or 0))end return differing==0 end function M.hmacSha256(key,message)if type(key)~=\"string\"or type(message)~=\"string\"then return nil,\"HMAC key and message must be strings\"end return toHex(hmac(key,message))end function M.sha256(value)if type(value)~=\"string\"then return nil,\"SHA-256 input must be a string\"end return toHex(sha256Raw(value))end function M.constantTimeEqual(left,right)return constantEqual(left,right)end function M.legacyDigest(value)local h=2166136261 for i=1,#value do h=bxor(h,value:byte(i))h=(h*16777619)%MOD end return string.format(\"%08x\",h)end function M.normaliseWorkFactor(value)value=tonumber(value)if not value or value%1~=0 then return nil,\"invalid password work factor\"end if value<M.MIN_WORK_FACTOR or value>M.MAX_WORK_FACTOR then return nil,\"password work factor must be \"..M.MIN_WORK_FACTOR..\"-\"..M.MAX_WORK_FACTOR end return value end function M.policy(password)if type(password)~=\"string\"then return false,\"password is required\"end if#password<M.MIN_LENGTH or#password>M.MAX_LENGTH then return false,\"password must contain \"..M.MIN_LENGTH..\"-\"..M.MAX_LENGTH..\" characters\"end if password:find(\"[%z\\1-\\31\\127]\")then return false,\"password contains control characters\"end return true end function M.derive(password,salt,workFactor)local work,err=M.normaliseWorkFactor(workFactor)if not work then return nil,err end if type(password)~=\"string\"or type(salt)~=\"string\"or#salt<16 or#salt>256 then return nil,\"invalid password record\"end local block=string.char(0,0,0,1)local value=hmac(password,salt..block)local result=value for _=2,work do value=hmac(password,value)result=xorBytes(result,value)cooperate(_)end return toHex(result)end local saltCounter=0 function M.newSalt(context)saltCounter=saltCounter+1 local now=os.epoch and os.epoch(\"utc\")or 0 local computer=os.getComputerID and os.getComputerID()or 0 local label=os.getComputerLabel and os.getComputerLabel()or\"\"local random=math.random and math.random(0,2147483647)or 0 return toHex(sha256Raw(table.concat({tostring(now),tostring(computer),tostring(label),tostring(context or\"\"),tostring(saltCounter),tostring(random)},\":\"))):sub(1,32)end function M.record(password,salt,workFactor)local valid,err=M.policy(password)if not valid then return nil,err end local work,workErr=M.normaliseWorkFactor(workFactor or M.DEFAULT_WORK_FACTOR)if not work then return nil,workErr end salt=salt or M.newSalt()local verifier,deriveErr=M.derive(password,salt,work)if not verifier then return nil,deriveErr end return{passwordVersion=M.PASSWORD_VERSION,scheme=M.SCHEME,salt=salt,verifier=verifier,workFactor=work,}end function M.isModern(record)return type(record)==\"table\"and record.passwordVersion==M.PASSWORD_VERSION and record.scheme==M.SCHEME end function M.verify(record,password)if type(record)~=\"table\"or type(password)~=\"string\"or type(record.salt)~=\"string\"or type(record.verifier)~=\"string\"then return false,\"invalid password record\"end if M.isModern(record)then local verifier,err=M.derive(password,record.salt,record.workFactor)if not verifier then return false,err end return constantEqual(record.verifier,verifier),nil end return constantEqual(record.verifier,M.legacyDigest(record.salt..password)),\"legacy\"end return M",
  ["ceetos/lib/release_keys.lua"] = "return{algorithm=\"lamport-sha256-v1\",roots={[\"recipe-server-release-0.19.51\"]={public=\"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\",profile=\"recipe-server\"},[\"recipe-server-release-0.19.52\"]={public=\"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\",profile=\"recipe-server\"},},}",
  ["ceetos/lib/release_verify.lua"] = "local password=require(\"ceetos.lib.password\")local roots=require(\"ceetos.lib.release_keys\")local profile=require(\"ceetos.lib.profile\")local M={}M.CACHE_ROOT=\"/ceetos-updates\"M.CACHE_FILE=\"/ceetos-updates/release.lua\"M.META_FILE=\"/ceetos-updates/cache.lua\"M.PART_FILE=\"/ceetos-updates/release.part\"M.PENDING_FILE=\"/ceetos-updates/pending.lua\"M.MAX_PACKAGE_BYTES=1024*1024 M.MAX_MANIFEST_BYTES=48*1024 M.CHUNK_BYTES=3072 M.KEY_PARTS=256 local alphabet=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\"local decodeMap={}for i=1,#alphabet do decodeMap[alphabet:sub(i,i)]=i-1 end local function read(path)if not fs.exists(path)or fs.isDir(path)then return nil end local handle=fs.open(path,\"r\")if not handle then return nil end local value=handle.readAll();handle.close()return value end local function write(path,value)local parent=fs.getDir(path)if parent~=\"\"and not fs.exists(parent)then fs.makeDir(parent)end local temporary=path..\".tmp\"if fs.exists(temporary)then fs.delete(temporary)end local handle=assert(fs.open(temporary,\"w\"),\"could not create temporary release state\")handle.write(value);handle.close()if fs.exists(path)then fs.delete(path)end fs.move(temporary,path)end local function encode(value)local out,index={},1 while index<=#value do local a,b,c=value:byte(index,index+2)local n=(a or 0)*65536+(b or 0)*256+(c or 0)out[#out+1]=alphabet:sub(math.floor(n/262144)%64+1,math.floor(n/262144)%64+1)out[#out+1]=alphabet:sub(math.floor(n/4096)%64+1,math.floor(n/4096)%64+1)out[#out+1]=b and alphabet:sub(math.floor(n/64)%64+1,math.floor(n/64)%64+1)or\"=\"out[#out+1]=c and alphabet:sub(n%64+1,n%64+1)or\"=\"index=index+3 end return table.concat(out)end local function decode(value)if type(value)~=\"string\"or#value%4~=0 or#value>M.MAX_MANIFEST_BYTES*2 then return nil,\"invalid base64\"end local out={}for index=1,#value,4 do local a,b,c,d=value:sub(index,index),value:sub(index+1,index+1),value:sub(index+2,index+2),value:sub(index+3,index+3)if not decodeMap[a]or not decodeMap[b]or(c~=\"=\"and not decodeMap[c])or(d~=\"=\"and not decodeMap[d])then return nil,\"invalid base64\"end if(c==\"=\"and d~=\"=\")or((c==\"=\"or d==\"=\")and index+3~=#value)then return nil,\"invalid base64 padding\"end local n=decodeMap[a]*262144+decodeMap[b]*4096+(decodeMap[c]or 0)*64+(decodeMap[d]or 0)out[#out+1]=string.char(math.floor(n/65536)%256)if c~=\"=\"then out[#out+1]=string.char(math.floor(n/256)%256)end if d~=\"=\"then out[#out+1]=string.char(n%256)end end return table.concat(out)end local function unhex(value)if type(value)~=\"string\"or#value%2~=0 or value:find(\"[^%x]\")then return nil end return(value:gsub(\"..\",function(pair)return string.char(tonumber(pair,16))end))end local function semver(value)if type(value)~=\"string\"then return nil end local major,minor,patch=value:match(\"^(%d+)%.(%d+)%.(%d+)$\")if not major then return nil end return tonumber(major),tonumber(minor),tonumber(patch)end function M.compareVersions(left,right)local a,b,c=semver(left);local x,y,z=semver(right)if not a or not x then return nil,\"invalid semantic version\"end if a~=x then return a<x and-1 or 1 end if b~=y then return b<y and-1 or 1 end if c~=z then return c<z and-1 or 1 end return 0 end local function canonical(manifest)if manifest._legacyProfile==true then return table.concat({\"ceetos-release-v1\",tostring(manifest.channel),tostring(manifest.version),tostring(manifest.size),tostring(manifest.digest),tostring(manifest.key_id),tostring(manifest.next_key_id),tostring(manifest.next_public),},\"|\")end return table.concat({\"ceetos-release-v2\",tostring(manifest.channel),tostring(manifest.profile),tostring(manifest.version),tostring(manifest.size),tostring(manifest.digest),tostring(manifest.key_id),tostring(manifest.next_key_id),tostring(manifest.next_public),},\"|\")end local function unpackKey(value)local raw,err=decode(value)if not raw or#raw~=M.KEY_PARTS*2*32 then return nil,err or\"invalid public key\"end local parts={}for index=1,M.KEY_PARTS*2 do parts[index]=raw:sub((index-1)*32+1,index*32)end return parts end function M.validPublicKey(value)return unpackKey(value)end local function lookupKey(keyId)local saved=M.trustedKeys()local value=saved[keyId]if value then return unpackKey(value)end value=roots.roots and roots.roots[keyId]if type(value)==\"table\"and type(value.public)==\"string\"then value=value.public end return unpackKey(value)end local function bitAt(digest,index)local byte=digest:byte(math.floor((index-1)/8)+1)return bit32.band(bit32.rshift(byte,7-((index-1)%8)),1)end local function decodeSignature(value)local raw,err=decode(value)if not raw or#raw~=M.KEY_PARTS*32 then return nil,err or\"invalid signature\"end local parts={}for index=1,M.KEY_PARTS do parts[index]=raw:sub((index-1)*32+1,index*32)end return parts end local function verifySignature(manifest,signature)if roots.algorithm~=\"lamport-sha256-v1\"then return false,\"unsupported release signing algorithm\"end local public,publicErr=lookupKey(manifest.key_id)local parts,signatureErr=decodeSignature(signature)if not public or not parts then local prefix=not public and\"invalid release public key: \"or\"invalid release signature: \"return false,prefix..tostring(publicErr or signatureErr or\"unknown release key\")end local digest=unhex(password.sha256(canonical(manifest))or\"\")if not digest then return false,\"could not hash release manifest\"end for index=1,M.KEY_PARTS do local expected=public[(index-1)*2+bitAt(digest,index)+1]local candidate=unhex(password.sha256(parts[index])or\"\")if not candidate or not password.constantTimeEqual(candidate,expected)then return false,\"invalid release signature\"end end return true end local function validateManifest(manifest)if type(manifest)~=\"table\"or manifest.channel~=\"release\"then return nil,\"only signed release packages are accepted\"end if manifest.profile==nil then manifest.profile,manifest._legacyProfile=\"desktop\",true end if type(manifest.profile)~=\"string\"or not profile.IDS[manifest.profile]then return nil,\"invalid release profile\"end if not semver(manifest.version)or type(manifest.size)~=\"number\"or manifest.size<1 or manifest.size>M.MAX_PACKAGE_BYTES then return nil,\"invalid release manifest size or version\"end if type(manifest.digest)~=\"string\"or#manifest.digest~=64 or manifest.digest:find(\"[^%x]\")then return nil,\"invalid release digest\"end if type(manifest.key_id)~=\"string\"or#manifest.key_id<1 or#manifest.key_id>64 then return nil,\"invalid release key id\"end if type(manifest.next_key_id)~=\"string\"or#manifest.next_key_id<1 or#manifest.next_key_id>64 then return nil,\"invalid next release key id\"end local nextKey=unpackKey(manifest.next_public)if not nextKey then return nil,\"invalid successor release key\"end return manifest end function M.parse(source)if type(source)~=\"string\"or#source>M.MAX_PACKAGE_BYTES then return nil,\"release package is too large\"end local encodedManifest,encodedSignature=source:match(\"^%-%- CEETOS_RELEASE_MANIFEST:([^\\r\\n]+)[\\r\\n]+%-%- CEETOS_RELEASE_SIGNATURE:([^\\r\\n]+)\")if not encodedManifest then encodedManifest,encodedSignature=source:match(\"^%-%- CeetOS signed release%. Generated; do not edit%.[\\r\\n]+%-%- CEETOS_RELEASE_MANIFEST:([^\\r\\n]+)[\\r\\n]+%-%- CEETOS_RELEASE_SIGNATURE:([^\\r\\n]+)\")end local first=source:find(\"%-%- CEETOS_RELEASE_PAYLOAD_BEGIN[\\r\\n]+\")if not encodedManifest or not encodedSignature or not first then return nil,\"not a signed CeetOS release package\"end local decoded,decodeErr=decode(encodedManifest)if not decoded then return nil,\"invalid release manifest encoding: \"..tostring(decodeErr)end local loader=load(\"return \"..decoded,\"=release-manifest\",\"t\",{})if not loader then return nil,\"invalid release manifest\"end local ok,manifest=pcall(loader)if not ok then return nil,\"invalid release manifest\"end local valid,manifestErr=validateManifest(manifest)if not valid then return nil,manifestErr end local start=source:find(\"\\n\",first)+1 local finish=start+valid.size-1 local payload=source:sub(start,finish)local suffix=source:sub(finish+1)if suffix~=\"\\n-- CEETOS_RELEASE_PAYLOAD_END\\n\"and suffix~=\"\\n-- CEETOS_RELEASE_PAYLOAD_END\"and suffix~=\"\\r\\n-- CEETOS_RELEASE_PAYLOAD_END\\r\\n\"and suffix~=\"\\r\\n-- CEETOS_RELEASE_PAYLOAD_END\"then return nil,\"release payload boundary mismatch\"end if#payload~=valid.size or not password.constantTimeEqual(password.sha256(payload)or\"\",valid.digest)then return nil,\"release payload digest mismatch\"end local signed,signatureErr=verifySignature(valid,encodedSignature)if not signed then return nil,signatureErr end return{manifest=valid,signature=encodedSignature,payload=payload,source=source}end function M.trustedKeys()local raw=read(M.CACHE_ROOT..\"/trusted-keys.lua\")if not raw then return{}end local loader=load(raw,\"=trusted-release-keys\",\"t\",{})if not loader then return{}end local ok,value=pcall(loader)return ok and type(value)==\"table\"and value or{}end local function saveKeys(value)local encoded=textutils.serialise(value,{compact=true})write(M.CACHE_ROOT..\"/trusted-keys.lua\",\"return \"..encoded)end function M.metadata()local raw=read(M.META_FILE)if not raw then return nil end local loader=load(raw,\"=release-cache\",\"t\",{})if not loader then return nil end local ok,value=pcall(loader)return ok and type(value)==\"table\"and value or nil end function M.cache(source,provider)local package,err=M.parse(source)if not package then return nil,err end if fs.exists(M.CACHE_ROOT)and fs.isDir(M.CACHE_ROOT)then if fs.exists(M.PART_FILE)then fs.delete(M.PART_FILE)end elseif not fs.exists(M.CACHE_ROOT)then fs.makeDir(M.CACHE_ROOT)end write(M.CACHE_FILE,package.source)local metadata={schema=2,channel=package.manifest.channel,profile=package.manifest.profile,version=package.manifest.version,size=package.manifest.size,digest=package.manifest.digest,keyId=package.manifest.key_id,nextKeyId=package.manifest.next_key_id,source=provider and tostring(provider)or\"local\",cachedAt=os.epoch(\"utc\"),}write(M.META_FILE,\"return \"..textutils.serialise(metadata,{compact=true}))local keys=M.trustedKeys();keys[package.manifest.next_key_id]=package.manifest.next_public;saveKeys(keys)return metadata end function M.promotePart(path,provider)if type(path)~=\"string\"or path~=M.PART_FILE then return nil,\"invalid release staging path\"end local source=read(path)local package,err=M.parse(source)if not package then return nil,err end if not fs.exists(M.CACHE_ROOT)then fs.makeDir(M.CACHE_ROOT)end if fs.exists(M.CACHE_FILE)then fs.delete(M.CACHE_FILE)end fs.move(M.PART_FILE,M.CACHE_FILE)local metadata={schema=2,channel=package.manifest.channel,profile=package.manifest.profile,version=package.manifest.version,size=package.manifest.size,digest=package.manifest.digest,keyId=package.manifest.key_id,nextKeyId=package.manifest.next_key_id,source=provider and tostring(provider)or\"local\",cachedAt=os.epoch(\"utc\"),}write(M.META_FILE,\"return \"..textutils.serialise(metadata,{compact=true}))M.adopt(package)return metadata end function M.adopt(package)if type(package)~=\"table\"or type(package.manifest)~=\"table\"then return false,\"invalid verified package\"end local keys=M.trustedKeys()keys[package.manifest.next_key_id]=package.manifest.next_public saveKeys(keys)return true end function M.cachedPackage()local source,metadata=read(M.CACHE_FILE),M.metadata()if not source then return nil end local package,err=M.parse(source)if not package then return nil,err end if not metadata then metadata={schema=2,channel=package.manifest.channel,profile=package.manifest.profile,version=package.manifest.version,size=package.manifest.size,digest=package.manifest.digest,keyId=package.manifest.key_id,nextKeyId=package.manifest.next_key_id,source=\"local installer\",cachedAt=os.epoch(\"utc\"),}write(M.META_FILE,\"return \"..textutils.serialise(metadata,{compact=true}))end M.adopt(package)return package,metadata end function M.clear()if fs.exists(M.PART_FILE)then fs.delete(M.PART_FILE)end if fs.exists(M.CACHE_FILE)then fs.delete(M.CACHE_FILE)end if fs.exists(M.META_FILE)then fs.delete(M.META_FILE)end return true end function M.encode(value)return encode(value)end function M.decode(value)return decode(value)end function M.canonical(manifest)return canonical(manifest)end return M",
  ["ceetos/lib/updater.lua"] = "local store=require(\"ceetos.lib.store\")local release=require(\"ceetos.lib.release_verify\")local version=require(\"ceetos.lib.version\")local net=require(\"ceetos.lib.net\")local profile=require(\"ceetos.lib.profile\")local M={}local STATE_PATH=\"/ceetos/data/update-status.lua\"local OFFER_LIMIT,HISTORY_LIMIT=20,16 local BEACON_INTERVAL,REQUEST_TIMEOUT,REQUEST_LIMIT=30000,3500,3 local MAX_OFFER_AGE=5*60*1000 local CLOUD_RELEASE_ORIGIN=\"https://releases.ceet.uk\"local CLOUD_MANIFEST_URL=CLOUD_RELEASE_ORIGIN..\"/manifest.json\"local CLOUD_SOURCE_ID=\"cloud.releases.ceet.uk\"local state=nil local lastBeacon,lastCacheRead=0,0 local cached=nil local publicChunkWindows={}local PUBLIC_CHUNK_WINDOW_MS,PUBLIC_CHUNK_LIMIT,PUBLIC_CHUNK_CLIENTS=3000,8,32 local publicChunkEligibility={}local PUBLIC_TRANSFER_ELIGIBILITY_MS,PUBLIC_TRANSFER_ELIGIBILITY_LIMIT=15000,32 local function now()return os.epoch(\"utc\")end local function localId()return tostring(os.getComputerID())end local function localLabel()return os.getComputerLabel()or(\"Computer \"..localId())end local function publicChunkAllowed(source,transfer)source,transfer=tostring(source or\"\"),tostring(transfer or\"\")if#source==0 or#source>64 or not transfer:match(\"^[%w_%-%.]+$\")or#transfer>128 then return false,\"invalid public update transfer\"end local timestamp,row=now(),publicChunkWindows[source]if not row or timestamp-row.started>=PUBLIC_CHUNK_WINDOW_MS then row={started=timestamp,count=0,transfers={}}publicChunkWindows[source]=row end row.transfers[transfer]=timestamp row.count=row.count+1 if row.count>PUBLIC_CHUNK_LIMIT then return false,\"public update chunk rate limit exceeded\"end local clients={}for client,state in pairs(publicChunkWindows)do clients[#clients+1]={id=client,at=tonumber(state.started)or 0}end table.sort(clients,function(a,b)return a.at>b.at end)for index=PUBLIC_CHUNK_CLIENTS+1,#clients do publicChunkWindows[clients[index].id]=nil end return true end local function grantPublicTransferEligibility(source,requestedProfile)local timestamp=now()source=tostring(source or\"\")if#source==0 or#source>64 or requestedProfile~=profile.id()then return end publicChunkEligibility[source]=timestamp+PUBLIC_TRANSFER_ELIGIBILITY_MS local rows={}for client,expires in pairs(publicChunkEligibility)do if tonumber(expires)and expires>timestamp then rows[#rows+1]={id=client,expires=expires}else publicChunkEligibility[client]=nil end end table.sort(rows,function(a,b)return a.expires>b.expires end)for index=PUBLIC_TRANSFER_ELIGIBILITY_LIMIT+1,#rows do publicChunkEligibility[rows[index].id]=nil end end local function defaults()return{schema=1,offers={},history={},revision=0,status=\"idle\",message=nil,transfer=nil,cache=nil}end local function loadState()if state then return state end state=store.read(STATE_PATH,defaults())for key,value in pairs(defaults())do if state[key]==nil then state[key]=value end end state.offers=type(state.offers)==\"table\"and state.offers or{}state.history=type(state.history)==\"table\"and state.history or{}return state end local function save()local value=loadState()value.revision=(tonumber(value.revision)or 0)+1 local ok,err=store.write(STATE_PATH,value)if ok and os and os.queueEvent then pcall(os.queueEvent,\"ceetos_state_changed\",\"updates\",value.revision)end return ok,err end local function record(kind,fields)local value=loadState()local row={at=now(),kind=tostring(kind):sub(1,48)}for key,item in pairs(fields or{})do if key~=\"data\"and key~=\"source\"and key~=\"signature\"then row[key]=item end end value.history[#value.history+1]=row while#value.history>HISTORY_LIMIT do table.remove(value.history,1)end end local function setStatus(status,message)local value=loadState()value.status,value.message=status,message and tostring(message):sub(1,180)or nil end local function validId(value)return type(value)==\"string\"and value:match(\"^[%w_%-%.]+$\")and#value<=96 end local function releaseFilename(profileId,releaseVersion)if profileId==\"desktop\"then return\"desktop/ceetos-release\"..releaseVersion..\".lua\"end return profileId..\"/ceetos-\"..profileId..\"-release\"..releaseVersion..\".lua\"end local function readHttp(url,limit)if not http or type(http.get)~=\"function\"then return nil,\"HTTP is unavailable; enable it to check releases.ceet.uk\"end local ok,response,requestErr=pcall(http.get,url,{[\"Accept\"]=\"application/json\"})if not ok or not response then return nil,tostring(requestErr or\"release server request failed\")end local chunks,total={},0 while true do local part=response.read(math.min(4096,limit-total+1))if not part or part==\"\"then break end total=total+#part if total>limit then pcall(response.close);return nil,\"release server response is too large\"end chunks[#chunks+1]=part end pcall(response.close)return table.concat(chunks)end local function validOffer(body)if type(body)~=\"table\"or type(body.version)~=\"string\"or type(body.size)~=\"number\"or type(body.digest)~=\"string\"or type(body.keyId)~=\"string\"or type(body.profile)~=\"string\"then return nil,\"malformed release offer\"end if body.profile~=profile.id()then return nil,\"release profile does not match this installation\"end local compare=release.compareVersions(body.version,version.string)if compare==nil then return nil,\"invalid release version\"end if body.size<1 or body.size>release.MAX_PACKAGE_BYTES then return nil,\"invalid release size\"end if#body.digest~=64 or body.digest:find(\"[^%x]\")then return nil,\"invalid release digest\"end if#body.keyId<1 or#body.keyId>64 then return nil,\"invalid release key ID\"end local filename=body.filename if filename~=nil and filename~=releaseFilename(body.profile,body.version)then return nil,\"invalid release filename\"end return{profile=body.profile,version=body.version,size=math.floor(body.size),digest=body.digest:lower(),keyId=body.keyId,filename=filename,fingerprint=body.digest:sub(1,16),newer=compare>0}end local function refreshCached()local timestamp=now()if cached and timestamp-lastCacheRead<5000 then return cached end lastCacheRead=timestamp local value=loadState()local previous=value.cache and(tostring(value.cache.version)..\":\"..tostring(value.cache.digest))or nil local package,metadata=release.cachedPackage()if package and package.manifest.profile==profile.id()then cached={package=package,metadata=metadata,offer={version=package.manifest.version,size=#package.source,digest=package.manifest.digest,profile=package.manifest.profile,keyId=package.manifest.key_id,fingerprint=package.manifest.digest:sub(1,16),}}value.cache={profile=package.manifest.profile,version=package.manifest.version,size=#package.source,digest=package.manifest.digest,keyId=package.manifest.key_id,fingerprint=package.manifest.digest:sub(1,16),source=metadata and metadata.source or\"local\",verifiedAt=timestamp}else cached=nil value.cache=nil end local current=value.cache and(tostring(value.cache.version)..\":\"..tostring(value.cache.digest))or nil if current~=previous then save()end return cached end local function providerOffer()local available=refreshCached()if not available then return nil end return{version=available.offer.version,size=available.offer.size,digest=available.offer.digest,profile=available.offer.profile,keyId=available.offer.keyId,label=localLabel(),id=localId(),}end local function upsertOffer(source,body,transport,distance)source=tostring(source)if source==localId()then return false,\"ignored own release offer\"end local offer,err=validOffer(body)if not offer then return false,err end if not offer.newer then return false,\"offered release is not newer\"end local value=loadState()local key=source..\":\"..offer.version..\":\"..offer.digest:sub(1,16)value.offers[key]={id=source,label=tostring(body.label or(\"Computer \"..source)):sub(1,96),version=offer.version,profile=offer.profile,size=offer.size,digest=offer.digest,fingerprint=offer.fingerprint,keyId=offer.keyId,filename=offer.filename,transport=transport,distance=tonumber(distance),seen=now(),key=key,}local rows={}for entryKey,item in pairs(value.offers)do rows[#rows+1]={key=entryKey,seen=tonumber(item.seen)or 0}end table.sort(rows,function(a,b)return a.seen>b.seen end)while#rows>OFFER_LIMIT do value.offers[table.remove(rows).key]=nil end setStatus(\"offers\",\"Signed release \"..offer.version..\" available from \"..tostring(body.label or source))record(\"offer\",{id=source,version=offer.version,transport=transport,distance=distance})save()return true end local function checkCloudManifest()local raw,readErr=readHttp(CLOUD_MANIFEST_URL,release.MAX_MANIFEST_BYTES)if not raw then return 0,readErr end local ok,catalogue=pcall(textutils.unserialiseJSON,raw)if not ok or type(catalogue)~=\"table\"or catalogue.schema~=1 or type(catalogue.releases)~=\"table\"or#catalogue.releases>OFFER_LIMIT then return 0,\"invalid signed-release catalogue\"end local count=0 for index=1,#catalogue.releases do local entry=catalogue.releases[index]if type(entry)==\"table\"and entry.profile==profile.id()then local accepted=upsertOffer(CLOUD_SOURCE_ID,entry,\"cloud\")if accepted then count=count+1 end end end return count end local function offers()local value,timestamp,rows=loadState(),now(),{}for key,item in pairs(value.offers)do if type(item)==\"table\"and timestamp-(tonumber(item.seen)or 0)<=MAX_OFFER_AGE then rows[#rows+1]=item else value.offers[key]=nil end end table.sort(rows,function(left,right)local compare=release.compareVersions(left.version,right.version)or 0 if compare~=0 then return compare>0 end return tostring(left.id)<tostring(right.id)end)return rows end local function findOffer(source)source=tostring(source)for _,item in ipairs(offers())do if item.key==source or tostring(item.id)==source then return item end end return nil,\"release source is unavailable; run update check first\"end local function removePart()if fs.exists(release.PART_FILE)then fs.delete(release.PART_FILE)end end local function appendPart(data)local handle,err=fs.open(release.PART_FILE,\"a\")if not handle then return false,err or\"could not open update staging file\"end handle.write(data);handle.close()return true end local function cachedSource()local available=refreshCached()return available and available.package and available.package.source end local function transferRequest(transfer)local length=math.min(release.CHUNK_BYTES,transfer.size-transfer.offset+1)if length<1 then return false,\"transfer is already complete\"end transfer.awaiting,transfer.requestedAt=true,now()local body={transfer=transfer.id,offset=transfer.offset,length=length}local sent,err if transfer.transport==\"routed\"then sent,err=net.request(transfer.source,\"update_chunk_request\",body,{safe=true})else sent,err=net.publicSend(transfer.source,\"update_chunk_request\",body)end if not sent then transfer.awaiting=false;return false,err end return true end local function beginDownload(source)local offer,err=findOffer(source)if not offer then return false,err end local compare=release.compareVersions(offer.version,version.string)if not compare or compare<=0 then return false,\"refusing a downgrade or current release\"end local free=fs.getFreeSpace and fs.getFreeSpace(\"/\")or nil if type(free)==\"number\"and free<offer.size+4096 then return false,\"not enough free space for one verified release cache\"end removePart()release.clear();cached=nil local value=loadState()if offer.transport==\"cloud\"then setStatus(\"downloading\",\"Downloading signed release \"..offer.version..\" from releases.ceet.uk\")save()local sourceText,readErr=readHttp(CLOUD_RELEASE_ORIGIN..\"/\"..tostring(offer.filename or\"\"),release.MAX_PACKAGE_BYTES)if not sourceText then setStatus(\"error\",readErr);record(\"download_failed\",{id=CLOUD_SOURCE_ID,error=readErr});save();return false,readErr end local parsed,parseErr=release.parse(sourceText)if not parsed or parsed.manifest.profile~=offer.profile or parsed.manifest.version~=offer.version or parsed.manifest.digest:lower()~=offer.digest or parsed.manifest.key_id~=offer.keyId then local reason=parseErr or\"verified package did not match selected release offer\"setStatus(\"error\",reason);record(\"download_failed\",{id=CLOUD_SOURCE_ID,error=reason});save();return false,reason end local metadata,cacheErr=release.cache(sourceText,\"releases.ceet.uk\")if not metadata then setStatus(\"error\",cacheErr);record(\"download_failed\",{id=CLOUD_SOURCE_ID,error=cacheErr});save();return false,cacheErr end cached=nil;refreshCached()setStatus(\"downloaded\",\"Verified release \"..metadata.version..\" is ready for local confirmation\")record(\"download_verified\",{id=CLOUD_SOURCE_ID,version=metadata.version,digest=metadata.digest:sub(1,16)})save()return true,metadata end value.transfer={id=\"update-\"..localId()..\"-\"..tostring(now())..\"-\"..tostring(math.random(1000,9999)),source=tostring(offer.id),label=offer.label,transport=offer.transport==\"routed\"and\"routed\"or\"direct\",profile=offer.profile,version=offer.version,size=offer.size,digest=offer.digest,keyId=offer.keyId,offset=1,received=0,retries=0,awaiting=false,started=now(),}setStatus(\"downloading\",\"Downloading signed release \"..offer.version..\" from \"..offer.label)record(\"download_started\",{id=offer.id,version=offer.version,transport=value.transfer.transport})local sent,sendErr=transferRequest(value.transfer)if not sent then value.transfer=nil;setStatus(\"error\",sendErr);record(\"download_failed\",{id=offer.id,error=sendErr})end save()return sent,sendErr end local function finishTransfer(transfer)local handle=fs.open(release.PART_FILE,\"r\")local source=handle and handle.readAll()or nil if handle then handle.close()end if not source or#source~=transfer.size then return false,\"download size did not match offer\"end local parsed,parseErr=release.parse(source)if not parsed then return false,parseErr end if parsed.manifest.profile~=profile.id()or parsed.manifest.profile~=transfer.profile or parsed.manifest.version~=transfer.version or parsed.manifest.digest:lower()~=transfer.digest:lower()or parsed.manifest.key_id~=transfer.keyId then return false,\"verified package did not match selected release offer\"end local metadata,promoteErr=release.promotePart(release.PART_FILE,transfer.label)if not metadata then return false,promoteErr end cached=nil;refreshCached()local value=loadState();value.transfer=nil setStatus(\"downloaded\",\"Verified release \"..metadata.version..\" is ready for local confirmation\")record(\"download_verified\",{id=transfer.source,version=metadata.version,digest=metadata.digest:sub(1,16)})save()return true,metadata end local function acceptChunk(source,body,transport)local value,transfer=loadState(),loadState().transfer if not transfer or transfer.transport~=transport or tostring(source)~=tostring(transfer.source)then return false,\"unexpected update chunk\"end if type(body)~=\"table\"or body.transfer~=transfer.id or math.floor(tonumber(body.offset)or 0)~=transfer.offset or type(body.data)~=\"string\"then return false,\"malformed update chunk\"end local remaining=transfer.size-transfer.offset+1 if#body.data<1 or#body.data>math.min(release.CHUNK_BYTES,remaining)then return false,\"invalid update chunk length\"end local ok,err=appendPart(body.data)if not ok then transfer.awaiting=false;setStatus(\"error\",err);record(\"download_failed\",{error=err});save();return false,err end transfer.offset,transfer.received,transfer.awaiting,transfer.retries=transfer.offset+#body.data,(transfer.received or 0)+#body.data,false,0 if transfer.offset>transfer.size then local complete,result=finishTransfer(transfer)if not complete then removePart();value.transfer=nil;setStatus(\"error\",result);record(\"download_failed\",{id=source,error=result});save()end return complete,result end local sent,sendErr=transferRequest(transfer)if not sent then setStatus(\"error\",sendErr);record(\"download_failed\",{id=source,error=sendErr});value.transfer=nil;removePart()end save()return sent,sendErr end local function serveChunk(target,body,routed,request)if type(body)~=\"table\"or not validId(body.transfer)or math.floor(tonumber(body.offset)or 0)<1 or math.floor(tonumber(body.length)or 0)<1 or tonumber(body.length)>release.CHUNK_BYTES then return false,\"invalid update chunk request\"end if not routed then if(tonumber(publicChunkEligibility[tostring(target)])or 0)<=now()then return false,\"public update transfer was not recently offered\"end local permitted,permitErr=publicChunkAllowed(target,body.transfer)if not permitted then return false,permitErr end end local source=cachedSource()if not source then return false,\"no verified newer signed release is cached\"end local offset,length=math.floor(body.offset),math.floor(body.length)if offset>#source then return false,\"requested update offset is beyond package\"end local data=source:sub(offset,math.min(#source,offset+length-1))local response={transfer=body.transfer,offset=offset,data=data}if routed then return net.reply(request,\"update_chunk\",response,{safe=true})end return net.publicSend(target,\"update_chunk\",response)end function M.publicPacket(packet,distance)local source,body=tostring(packet.from),packet.body or{}if packet.type==\"update_query\"then if body.profile~=profile.id()then return false,\"release profile does not match this installation\"end local offer=providerOffer()local compare=offer and release.compareVersions(offer.version,body.version or\"\")if offer and compare and compare>0 then grantPublicTransferEligibility(source,body.profile)net.publicSend(source,\"update_offer\",offer)end return elseif packet.type==\"update_offer\"then return upsertOffer(source,body,\"direct\",distance)elseif packet.type==\"update_chunk_request\"then return serveChunk(source,body,false)elseif packet.type==\"update_chunk\"then return acceptChunk(source,body,\"direct\")end end function M.authenticatedPacket(from,peer,packet)local body=packet.body or{}if packet.type==\"update_query\"then if body.profile~=profile.id()then return false,\"release profile does not match this installation\"end local offer=providerOffer()local compare=offer and release.compareVersions(offer.version,body.version or\"\")if offer and compare and compare>0 then return net.reply(packet,\"update_offer\",offer,{safe=true})end elseif packet.type==\"update_offer\"then return upsertOffer(from,body,\"routed\")elseif packet.type==\"update_chunk_request\"then return serveChunk(from,body,true,packet)elseif packet.type==\"update_chunk\"then return acceptChunk(from,body,\"routed\")end end function M.check()local value=loadState()for key in pairs(value.offers)do value.offers[key]=nil end setStatus(\"checking\",\"Looking for newer signed releases\")local cloudOffers,cloudErr=checkCloudManifest()local sent,err=net.publicBroadcast(\"update_query\",{version=version.string,profile=profile.id()})local routed=0 for _,peer in ipairs(net.peers())do if not peer.rekeyRequired then local ok=net.request(peer.id,\"update_query\",{version=version.string,profile=profile.id()},{safe=true})if ok then routed=routed+1 end end end if cloudErr then setStatus(\"warning\",\"Cloud release check failed: \"..tostring(cloudErr):sub(1,120))elseif cloudOffers==0 and not(sent or routed>0)then setStatus(\"idle\",\"No newer signed release is available\")elseif cloudOffers>0 then setStatus(\"offers\",tostring(cloudOffers)..\" signed cloud release offer\"..(cloudOffers==1 and\"\"or\"s\")..\" available\")end record(\"check\",{cloud=cloudOffers,direct=sent==true,routed=routed,cloudError=cloudErr,error=(not sent)and err or nil})save()if cloudErr and not sent and routed==0 then return false,cloudErr end return true,{cloud=cloudOffers,direct=sent==true,routed=routed,cloudError=cloudErr}end function M.download(source)return beginDownload(source)end function M.installLatest()local checked,err=M.check()if not checked then return false,err end local rows=offers()if#rows==0 then return false,\"no newer compatible signed release is available\"end table.sort(rows,function(a,b)local comparison=release.compareVersions(a.version,b.version)or 0 return comparison==0 and tostring(a.id)<tostring(b.id)or comparison>0 end)return beginDownload(rows[1].id)end function M.cancel()local value=loadState()if not value.transfer then return false,\"no update transfer is active\"end record(\"download_cancelled\",{id=value.transfer.source,version=value.transfer.version})value.transfer=nil;removePart();setStatus(\"cancelled\",\"Update download cancelled\");save()return true end function M.clearCache()local value=loadState()if value.transfer then return false,\"cancel the active download first\"end release.clear();cached=nil;value.cache=nil;setStatus(\"idle\",\"Verified release cache cleared\");record(\"cache_cleared\");save()return true end function M.prepareApply()local package,metadata=release.cachedPackage()if not package then return false,metadata or\"no verified signed release is cached\"end local compare=release.compareVersions(package.manifest.version,version.string)if not compare or compare<=0 then return false,\"cached release is not newer than this CeetOS installation\"end if package.manifest.profile~=profile.id()then return false,\"cached release profile does not match this installation\"end local marker={schema=2,state=\"apply\",profile=package.manifest.profile,version=package.manifest.version,digest=package.manifest.digest,keyId=package.manifest.key_id,approvedAt=now()}store.write(release.PENDING_FILE,marker)local value=loadState();setStatus(\"applying\",\"Applying verified release \"..package.manifest.version..\" after reboot\");record(\"apply_approved\",{version=package.manifest.version,digest=package.manifest.digest:sub(1,16),keyId=package.manifest.key_id});save()return true,{version=package.manifest.version,fingerprint=package.manifest.digest:sub(1,16),keyId=package.manifest.key_id}end function M.recover()local marker=store.read(release.PENDING_FILE,nil)if type(marker)~=\"table\"or marker.state~=\"verify\"then return end local value=loadState()if marker.version==version.string and(marker.profile==nil or marker.profile==profile.id())then if fs.exists(release.PENDING_FILE)then fs.delete(release.PENDING_FILE)end setStatus(\"applied\",\"Verified release \"..version.string..\" is now active\")record(\"apply_verified\",{version=version.string})else setStatus(\"error\",\"Update installed but running version did not match \"..tostring(marker.version))record(\"apply_version_mismatch\",{expected=marker.version,actual=version.string})end save()end function M.tick()local value,timestamp=loadState(),now()local offer=providerOffer()if offer and timestamp-lastBeacon>=BEACON_INTERVAL then net.publicBroadcast(\"update_offer\",offer)lastBeacon=timestamp end local transfer=value.transfer if transfer and transfer.awaiting and timestamp-(transfer.requestedAt or timestamp)>=REQUEST_TIMEOUT then transfer.awaiting,transfer.retries=false,(transfer.retries or 0)+1 if transfer.retries>REQUEST_LIMIT then record(\"download_timeout\",{id=transfer.source,version=transfer.version})value.transfer=nil;removePart();setStatus(\"error\",\"Update source timed out\");save()else local sent,err=transferRequest(transfer)if not sent then value.transfer=nil;removePart();setStatus(\"error\",err);record(\"download_failed\",{id=transfer.source,error=err});save()end end end end function M.status()local value=loadState()return{profile=profile.id(),version=version.string,status=value.status,message=value.message,revision=value.revision,offers=offers(),transfer=value.transfer,cache=value.cache,history=value.history,cacheRoot=release.CACHE_ROOT,maxPackageBytes=release.MAX_PACKAGE_BYTES,}end return M",
  ["ceetos/lib/release_broker.lua"] = "local store=require(\"ceetos.lib.store\")local password=require(\"ceetos.lib.password\")local crypto=require(\"ceetos.lib.mesh_crypto\")local cloud=require(\"ceetos.lib.cloud\")local net=require(\"ceetos.lib.net\")local profile=require(\"ceetos.lib.profile\")local M={}local PATH,LIMIT,LIFE=\"/ceetos/data/release-broker.lua\",8,120000 local pending={}local function now()return os.epoch(\"utc\")end local function localId()return tostring(os.getComputerID())end local function localLabel()return os.getComputerLabel()or(\"Computer \"..localId())end local function clean(v,n)return type(v)==\"string\"and#v>0 and#v<=n and not v:find(\"[%z\\1-\\31\\127]\")end local function state()local value=store.read(PATH,{})return{schema=1,enabled=value.enabled==true,promotedAt=tonumber(value.promotedAt)}end local function save(value)return store.write(PATH,value)end local function key(session,target,targetNonce,phrase)return password.hmacSha256(phrase,table.concat({\"ceetos/release-broker/v1\",session,target,localId(),targetNonce},\"|\"))end local function mac(secret,label,value)return password.hmacSha256(secret,label..\"|\"..value)end local function expiry()return now()+LIFE end local function pendingCount()local count=0 for _,row in pairs(pending)do if row.expires>now()then count=count+1 end end return count end function M.status()local value,cloudState=state(),cloud.publicStatus()local rows={}for id,row in pairs(pending)do if row.expires>now()then rows[#rows+1]={id=id,target=row.target,label=row.label,profile=row.profile,expires=row.expires,state=row.state}end end table.sort(rows,function(a,b)return a.expires<b.expires end)return{enabled=value.enabled,enrolled=cloudState.enrolled,pending=rows}end function M.promote(ownerKey)if not clean(ownerKey,256)then return false,\"owner enrollment key is required\"end local result,err=cloud.call(\"auth\",\"/v1/broker/promote\",{ownerKey=ownerKey})if not result then return false,err end save({schema=1,enabled=true,promotedAt=now()})return true,result end function M.revoke(ownerKey)if not clean(ownerKey,256)then return false,\"owner enrollment key is required\"end local result,err=cloud.call(\"auth\",\"/v1/broker/revoke\",{ownerKey=ownerKey})if not result then return false,err end save({schema=1,enabled=false})for id in pairs(pending)do pending[id]=nil end return true,result end function M.handle(packet)local body,source=packet.body or{},tostring(packet.from or\"\")if packet.type==\"broker_query\"then if not state().enabled or not cloud.publicStatus().enrolled then return end if not clean(body.session,96)or not clean(body.nonce,128)or not clean(body.profile,32)or not clean(body.label,96)or body.profile~=profile.id()then return end if pendingCount()>=LIMIT and not pending[body.session]then return end pending[body.session]={session=body.session,target=source,targetNonce=body.nonce,profile=body.profile,label=body.label,expires=expiry(),state=\"waiting\"}return net.publicSend(source,\"broker_offer\",{session=body.session,broker=localId(),label=localLabel(),profile=profile.id(),expires=pending[body.session].expires})elseif packet.type==\"broker_proof\"then local row=pending[body.session]if not row or row.expires<=now()or row.target~=source or row.state~=\"challenged\"or not clean(body.proof,128)then return end if not password.constantTimeEqual(row.expected,body.proof)then pending[body.session]=nil;return net.publicSend(source,\"broker_reject\",{session=body.session,reason=\"phrase proof rejected\"})end local result,err=cloud.call(\"auth\",\"/v1/broker/enroll\",{session=row.session,targetComputerId=row.target,targetLabel=row.label,targetProfile=row.profile,expires=row.expires})if not result or type(result.node)~=\"table\"then pending[body.session]=nil;return net.publicSend(source,\"broker_reject\",{session=body.session,reason=tostring(err or\"cloud provisioning failed\"):sub(1,96)})end local aad=\"ceetos/release-broker/grant/v1|\"..row.session..\"|\"..row.target..\"|\"..localId()local nonce=crypto.nonce(row.key,1,aad)local envelope=nonce and crypto.seal(row.key,nonce,aad,textutils.serialise({node=result.node,urls=cloud.publicStatus().urls}))pending[body.session]=nil if not envelope then return net.publicSend(source,\"broker_reject\",{session=body.session,reason=\"could not secure enrollment\"})end return net.publicSend(source,\"broker_grant\",{session=body.session,broker=localId(),envelope=envelope})end end function M.approve(session,phrase)local row=pending[tostring(session or\"\")]if not row or row.expires<=now()then return false,\"bootstrap session is unavailable or expired\"end if not clean(phrase,128)then return false,\"invalid bootstrap phrase\"end row.key=key(row.session,row.target,row.targetNonce,phrase)row.brokerNonce=password.newSalt(\"broker:\"..row.session)row.expected=mac(row.key,\"proof\",row.brokerNonce)row.state,row.expires=\"challenged\",expiry()local challenge=mac(row.key,\"challenge\",row.brokerNonce)local sent,err=net.publicSend(row.target,\"broker_challenge\",{session=row.session,broker=localId(),nonce=row.brokerNonce,mac=challenge,expires=row.expires})if not sent then row.state=\"waiting\";return false,err end return true end function M.tick()for id,row in pairs(pending)do if row.expires<=now()then pending[id]=nil end end end return M",
  ["ceetos/lib/broker_bootstrap.lua"] = "local password=require(\"ceetos.lib.password\")local crypto=require(\"ceetos.lib.mesh_crypto\")local M={}local CHANNEL,LIFE=45731,120 local function label()return os.getComputerLabel()or(\"Computer \"..tostring(os.getComputerID()))end local function valid(v,n)return type(v)==\"string\"and#v>0 and#v<=n end local function modem()for _,name in ipairs(peripheral.getNames())do if peripheral.getType(name)==\"modem\"then local wrapped=peripheral.wrap(name)if wrapped and wrapped.isWireless and wrapped.isWireless()then return wrapped end end end end local function random(context)return password.newSalt(context..\":\"..tostring(os.epoch(\"utc\")))end function M.enroll(profile)local link=modem()if not link then return nil,\"No wireless modem is attached; a trusted release broker must be directly reachable.\"end link.open(CHANNEL)local session,target,targetNonce=random(\"session\"),tostring(os.getComputerID()),random(\"target\")local phrase=random(\"phrase\"):sub(1,20)print(\"Trusted broker enrollment required.\")print(\"On an enrolled broker run: nx broker approve \"..session..\" \"..phrase)link.transmit(CHANNEL,CHANNEL,{protocol=\"ceetos/update/1\",type=\"broker_query\",from=target,to=\"0\",body={session=session,nonce=targetNonce,profile=profile,label=label()}})local deadline,broker,linkKey=os.epoch(\"utc\")+LIFE*1000,nil,nil while os.epoch(\"utc\")<deadline do local timer=os.startTimer(2)local event={os.pullEventRaw()}if event[1]==\"timer\"and event[2]==timer then link.transmit(CHANNEL,CHANNEL,{protocol=\"ceetos/update/1\",type=\"broker_query\",from=target,to=\"0\",body={session=session,nonce=targetNonce,profile=profile,label=label()}})elseif event[1]==\"modem_message\"and event[3]==CHANNEL and type(event[5])==\"table\"then local packet,body=event[5],event[5].body or{}if packet.protocol==\"ceetos/update/1\"and tostring(packet.to)==target and body.session==session then if packet.type==\"broker_offer\"then broker=tostring(body.broker)elseif packet.type==\"broker_challenge\"and broker and tostring(body.broker)==broker and valid(body.nonce,128)and valid(body.mac,128)then linkKey=password.hmacSha256(phrase,table.concat({\"ceetos/release-broker/v1\",session,target,broker,targetNonce},\"|\"))if password.constantTimeEqual(password.hmacSha256(linkKey,\"challenge|\"..body.nonce),body.mac)then link.transmit(CHANNEL,CHANNEL,{protocol=\"ceetos/update/1\",type=\"broker_proof\",from=target,to=broker,body={session=session,proof=password.hmacSha256(linkKey,\"proof|\"..body.nonce)}})end elseif packet.type==\"broker_grant\"and linkKey and tostring(body.broker)==broker then local aad=\"ceetos/release-broker/grant/v1|\"..session..\"|\"..target..\"|\"..broker local opened=crypto.open(linkKey,body.envelope,aad)local grant=opened and textutils.unserialise(opened)if type(grant)==\"table\"and type(grant.node)==\"table\"and valid(grant.node.id,96)and valid(grant.node.secret,192)then return grant end elseif packet.type==\"broker_reject\"then return nil,tostring(body.reason or\"broker rejected enrollment\")end end end end return nil,broker and\"Broker did not complete enrollment in time.\"or\"No trusted release broker answered. Installation was not changed.\"end return M",
  ["ceetos/lib/mesh_crypto.lua"] = "local password=require(\"ceetos.lib.password\")local M={}local band,bor,bxor=bit32.band,bit32.bor,bit32.bxor local lshift,rshift=bit32.lshift,bit32.rshift local MOD32,LIMB=4294967296,67108864 local function add32(...)local n=0 for i=1,select(\"#\",...)do n=(n+(select(i,...)or 0))%MOD32 end return n end local function rotl(v,bits)return bor(lshift(v,bits),rshift(v,32-bits))end local function le32(data,index)local a,b,c,d=data:byte(index,index+3)return(a or 0)+(b or 0)*256+(c or 0)*65536+(d or 0)*16777216 end local function put32(value)value=value%MOD32 return string.char(value%256,math.floor(value/256)%256,math.floor(value/65536)%256,math.floor(value/16777216)%256)end local function le64(value)value=math.max(0,math.floor(tonumber(value)or 0))local low,high=value%MOD32,math.floor(value/MOD32)%MOD32 return put32(low)..put32(high)end local function hexToRaw(value)if type(value)~=\"string\"or#value%2~=0 or value:find(\"[^%x]\")then return nil end return(value:gsub(\"..\",function(pair)return string.char(tonumber(pair,16))end))end local function rawToHex(value)return(value:gsub(\".\",function(byte)return string.format(\"%02x\",byte:byte())end))end local function xorBytes(left,right)local out={}for i=1,#left do out[i]=string.char(bxor(left:byte(i),right:byte(i)))end return table.concat(out)end local function quarter(x,a,b,c,d)x[a]=add32(x[a],x[b]);x[d]=rotl(bxor(x[d],x[a]),16)x[c]=add32(x[c],x[d]);x[b]=rotl(bxor(x[b],x[c]),12)x[a]=add32(x[a],x[b]);x[d]=rotl(bxor(x[d],x[a]),8)x[c]=add32(x[c],x[d]);x[b]=rotl(bxor(x[b],x[c]),7)end local function chachaBlock(key,counter,nonce)local state={0x61707865,0x3320646e,0x79622d32,0x6b206574}for i=1,8 do state[4+i]=le32(key,(i-1)*4+1)end state[13],state[14],state[15],state[16]=counter%MOD32,le32(nonce,1),le32(nonce,5),le32(nonce,9)local x={}for i=1,16 do x[i]=state[i]end for _=1,10 do quarter(x,1,5,9,13);quarter(x,2,6,10,14);quarter(x,3,7,11,15);quarter(x,4,8,12,16)quarter(x,1,6,11,16);quarter(x,2,7,12,13);quarter(x,3,8,9,14);quarter(x,4,5,10,15)end local out={}for i=1,16 do out[i]=put32(add32(x[i],state[i]))end return table.concat(out)end local function chachaXor(key,nonce,counter,plaintext)local out,position={},1 while position<=#plaintext do local block=chachaBlock(key,counter,nonce)local part=plaintext:sub(position,position+63)out[#out+1]=xorBytes(part,block:sub(1,#part))position,counter=position+#part,(counter+1)%MOD32 end return table.concat(out)end local function poly1305(message,key)local function zero(length)local out={};for i=1,length do out[i]=0 end;return out end local function normalise(value)local carry=0 for i=1,#value do local n=(value[i]or 0)+carry value[i],carry=n%256,math.floor(n/256)end while carry>0 do value[#value+1],carry=carry%256,math.floor(carry/256)end return value end local function add(left,right)local out=zero(math.max(#left,#right)+1)for i=1,#left do out[i]=out[i]+left[i]end for i=1,#right do out[i]=out[i]+right[i]end return normalise(out)end local function multiply(left,right)local out=zero(#left+#right+1)for i=1,#left do for j=1,#right do out[i+j-1]=out[i+j-1]+left[i]*right[j]end end return normalise(out)end local function high130(value)local out={}for i=1,#value-16 do local low=value[i+16]or 0 local high=value[i+17]or 0 out[i]=math.floor(low/4)+(high%4)*64 end return normalise(out)end local function hasHigh(value)if#value>17 then for i=18,#value do if value[i]~=0 then return true end end end return(value[17]or 0)>=4 end local function reduce(value)while hasHigh(value)do local low,high=zero(17),high130(value)for i=1,17 do low[i]=value[i]or 0 end low[17]=low[17]%4 for i=1,#high do high[i]=high[i]*5 end value=add(low,high)end local prime={251}for i=2,16 do prime[i]=255 end prime[17]=3 local greater=false for i=17,1,-1 do if(value[i]or 0)~=prime[i]then greater=(value[i]or 0)>prime[i];break end end if greater then local borrow=0 for i=1,17 do local n=(value[i]or 0)-prime[i]-borrow if n<0 then n,borrow=n+256,1 else borrow=0 end value[i]=n end end return value end local r,h=zero(17),zero(17)for i=1,16 do r[i]=key:byte(i)end r[4],r[8],r[12],r[16]=band(r[4],15),band(r[8],15),band(r[12],15),band(r[16],15)r[5],r[9],r[13]=band(r[5],252),band(r[9],252),band(r[13],252)for at=1,#message,16 do local part,n=message:sub(at,at+15),zero(17)for i=1,#part do n[i]=part:byte(i)end n[#part+1]=1 h=reduce(multiply(add(h,n),r))end local pad,out,carry={},{},0 for i=1,16 do pad[i]=key:byte(i+16)end for i=1,16 do local n=(h[i]or 0)+pad[i]+carry out[i],carry=n%256,math.floor(n/256)end return string.char(table.unpack(out))end local function padded(value)return value..string.rep(\"\\0\",(16-(#value%16))%16)end local function derive(linkKey)local raw=hexToRaw(password.hmacSha256(linkKey,\"ceetos/mesh/aead-key/v1\")or\"\")return raw end function M.nonce(linkKey,counter,context)local raw=hexToRaw(password.hmacSha256(linkKey,\"ceetos/mesh/aead-nonce/v1|\"..tostring(counter)..\"|\"..tostring(context or\"\"))or\"\")return raw and raw:sub(1,12)or nil end function M.seal(linkKey,nonce,aad,plaintext)if type(linkKey)~=\"string\"or type(nonce)~=\"string\"or#nonce~=12 or type(aad)~=\"string\"or type(plaintext)~=\"string\"then return nil,\"invalid mesh envelope input\"end local key=derive(linkKey);if not key or#key~=32 then return nil,\"could not derive mesh envelope key\"end local polyKey=chachaBlock(key,0,nonce):sub(1,32)local ciphertext=chachaXor(key,nonce,1,plaintext)local tag=poly1305(padded(aad)..padded(ciphertext)..le64(#aad)..le64(#ciphertext),polyKey)return{nonce=rawToHex(nonce),ciphertext=rawToHex(ciphertext),tag=rawToHex(tag)}end function M.open(linkKey,envelope,aad)if type(linkKey)~=\"string\"or type(envelope)~=\"table\"or type(aad)~=\"string\"then return nil,\"invalid mesh envelope\"end local nonce,ciphertext,tag=hexToRaw(envelope.nonce or\"\"),hexToRaw(envelope.ciphertext or\"\"),hexToRaw(envelope.tag or\"\")if not nonce or#nonce~=12 or not ciphertext or not tag or#tag~=16 then return nil,\"invalid mesh envelope encoding\"end local key=derive(linkKey);if not key or#key~=32 then return nil,\"could not derive mesh envelope key\"end local polyKey=chachaBlock(key,0,nonce):sub(1,32)local expected=rawToHex(poly1305(padded(aad)..padded(ciphertext)..le64(#aad)..le64(#ciphertext),polyKey))if not password.constantTimeEqual(expected,envelope.tag)then return nil,\"mesh envelope authentication failed\"end return chachaXor(key,nonce,1,ciphertext)end function M.selfTest()local key=hexToRaw(\"85d6be7857556d337f4452fe42d506a80103808afb0db2fd4abff6af4149f51b\")local tag=poly1305(\"Cryptographic Forum Research Group\",key)return rawToHex(tag)==\"a8061dc1305136c6c22b8baf0c0127a9\"end return M",
  ["ceetos/lib/audit.lua"] = "local store=require(\"ceetos.lib.store\")local M={}local PATH=\"/ceetos/data/audit.log\"M.LIMITS={maxEntries=250,maxBytes=64*1024}function M.log(actor,action,detail)return store.append(PATH,{ts=os.epoch(\"utc\"),actor=actor or\"system\",action=action,detail=detail,},M.LIMITS)end function M.recent(limit)limit=math.max(1,math.min(50,tonumber(limit)or 10))local raw=store.readAppend(PATH)local result={}for line in(raw..\"\\n\"):gmatch(\"(.-)\\n\")do if line~=\"\"then local entry=textutils.unserialise(line)if entry then result[#result+1]=entry if#result>limit then table.remove(result,1)end end end end return result end return M",
  ["ceetos/lib/net.lua"] = "local store=require(\"ceetos.lib.store\")local audit=require(\"ceetos.lib.audit\")local password=require(\"ceetos.lib.password\")local meshCrypto=require(\"ceetos.lib.mesh_crypto\")local M={handler=nil,publicHandler=nil}local PATH=\"/ceetos/data/network.lua\"local SECURITY_PATH=\"/ceetos/data/network-security.lua\"local SEEN_PATH=\"/ceetos/data/seen-peers.lua\"local CHANNEL,PROTOCOL=45731,\"ceetos/2\"local PUBLIC_UPDATE_PROTOCOL=\"ceetos/update/1\"local PUBLIC_UPDATE_TYPES={update_query=true,update_offer=true,update_chunk_request=true,update_chunk=true,broker_query=true,broker_offer=true,broker_challenge=true,broker_proof=true,broker_grant=true,broker_reject=true,}local DISCOVERY_CHANNEL=CHANNEL local DISCOVERY_TTL,ROUTE_TTL,PACKET_TTL=300000,120000,8 local DISCOVERY_INTERVAL,PAIR_RETRY,ROUTE_INTERVAL=2000,2000,15000 local MESH_BEACON_INTERVAL,MESH_FULL_INTERVAL=15000,30000 local PROBE_INTERVAL,PROBE_DEGRADED,PROBE_OFFLINE,PROBE_RECOVERY=5000,3,6,10000 local ROUTE_CANDIDATE_LIMIT,ROUTE_BUCKET_LIMIT=4,96 local DISCOVERY_CANDIDATE_LIMIT,SEEN_PACKET_LIMIT=32,1024 local SEEN_PEER_LIMIT,SEEN_PEER_TTL=128,24*60*60*1000 local SAFE_READ_WINDOW,SAFE_READ_LIMIT=1000,16 local MAX_PACKET_STRING,MAX_PACKET_TABLE,MAX_PACKET_DEPTH=8192,128,6 local COUNTER_RESERVATION,MAX_RX_EPOCHS,MAX_REVERSE_ROUTES=64,3,128 local REPLAY_WINDOW,MAX_COUNTER_JUMP=64,4096 local routes,discovered,confirmations,seenPackets,reverseRoutes={},{},{},{},{}local routeSequence,lastRouteAdvertisement,routesDirty=0,0,false local routeSession local discovery,lastDiscovery=nil,{state=\"inactive\"}local configCache,modemCache,modemCacheAt=nil,nil,0 local security={tx={},rx={}}local autoEdges,linkHealth,meshOffers,meshSeen,advertisedRoutes,meshEnrollmentSends={},{},{},{},{},{}local lastMeshBeacon,lastMeshFull,meshDirty=0,0,false local transport={modem=false,wireless=false,name=nil,channels={},lastTransmit=nil,lastReceive=nil,lastDistance=nil,lastError=nil,rejected=0,requestAdmissions=0,requestDuplicates=0,requestEvictions=0,}local traces={discovery={},routing={},transport={}}local TRACE_LIMIT=48 local MESH_STATE_LIMIT=128 local rejectPacket local function now()return os.epoch(\"utc\")end local function id()return tostring(os.getComputerID())end local function label()return os.getComputerLabel()or(\"Computer \"..id())end routeSession=password.newSalt(\"route-session:\"..id())local function isBroadcast(value)return tostring(value)==\"0\"end local function isForUs(value)return tostring(value)==id()end local function copy(value,depth)if type(value)~=\"table\"then return value end if(depth or 0)>MAX_PACKET_DEPTH then return nil end local out={}for k,v in pairs(value)do out[k]=copy(v,(depth or 0)+1)end return out end local function trace(kind,phase,fields)local bucket=traces[kind]or traces.transport local row={time=now(),phase=phase}for key,value in pairs(fields or{})do if key~=\"phrase\"and key~=\"proof\"and key~=\"key\"and key~=\"secret\"and key~=\"mac\"and key~=\"packet\"and key~=\"tag\"then row[key]=value end end bucket[#bucket+1]=row while#bucket>TRACE_LIMIT do table.remove(bucket,1)end end local function read(path,fallback)return store.read(path,fallback)end local function config()local value=configCache or read(PATH,{peers={},channel=CHANNEL})value.peers=type(value.peers)==\"table\"and value.peers or{}value.channel=tonumber(value.channel)or CHANNEL configCache=value return value end local function save(value)configCache=value local ok,err=store.write(PATH,value)if ok==false then error(err or\"could not save network configuration\",0)end end local function migrateV1Links()local value,changed=config(),false for _,peer in pairs(value.peers)do if peer.protocol~=2 or peer.rekeyRequired or type(peer.key)~=\"string\"or#peer.key<32 then peer.protocol,peer.rekeyRequired,peer.key=1,true,nil peer.secret=nil changed=true end end if changed then save(value)end return value end local function activePeer(value,peerId)local peer=value.peers[tostring(peerId)]if peer and peer.protocol==2 and peer.rekeyRequired~=true and type(peer.key)==\"string\"and#peer.key>=32 then return peer end return nil end local function activeLink(value,peerId)local manual=activePeer(value,peerId)if manual then return manual,\"direct\"end local edge=autoEdges[tostring(peerId)]if edge and type(edge.key)==\"string\"and#edge.key>=32 and(edge.expires or 0)>now()then return edge,\"mesh\"end return nil end function M.isDirectPeer(peerId)return activePeer(config(),tostring(peerId))~=nil end function M.isTrustedDirectLink(peerId)return activeLink(config(),tostring(peerId))~=nil end local function healthFor(peerId)peerId=tostring(peerId)local state=linkHealth[peerId]if not state then state={state=\"healthy\",successes=0,misses=0,lastAuthenticated=now(),stableSince=now(),inFlight=0}linkHealth[peerId]=state end return state end local function linkState(peerId)return healthFor(peerId).state or\"healthy\"end local function currentInFlight(state,timestamp)state.inFlightUntil=type(state.inFlightUntil)==\"table\"and state.inFlightUntil or{}local kept={}for _,expires in ipairs(state.inFlightUntil)do if expires>timestamp then kept[#kept+1]=expires end end state.inFlightUntil,state.inFlight=kept,#kept return state.inFlight end local function markInFlight(state)local timestamp=now()currentInFlight(state,timestamp)state.inFlightUntil[#state.inFlightUntil+1]=timestamp+SAFE_READ_WINDOW table.sort(state.inFlightUntil)while#state.inFlightUntil>SAFE_READ_LIMIT do table.remove(state.inFlightUntil,1)end state.inFlight=#state.inFlightUntil end local function linkUsable(value,peerId,allowDegraded)if not activeLink(value,peerId)then return false end local state=linkState(peerId)return state==\"healthy\"or(allowDegraded and state==\"degraded\")end local function touchLink(peerId,distance,source)local state,timestamp=healthFor(peerId),now()state.lastAuthenticated,state.lastDistance,state.lastSource=timestamp,distance,source or\"traffic\"state.misses,state.awaiting,state.probeToken=0,false,nil state.loss=math.max(0,(state.loss or 0)*0.5)if state.state~=\"healthy\"then state.successes=(state.successes or 0)+1 if state.successes>=2 then state.state,state.stableSince,state.recoveredAt=\"healthy\",timestamp,timestamp routesDirty=true trace(\"routing\",\"link_recovered\",{peer=peerId,source=source})end else state.successes=math.min(2,(state.successes or 0)+1)end end local function allDirectLinks(value)local out,seen={},{}for peerId in pairs(value.peers)do if activePeer(value,peerId)then out[#out+1],seen[peerId]=tostring(peerId),true end end for peerId,edge in pairs(autoEdges)do if not seen[peerId]and edge.expires>now()then out[#out+1]=tostring(peerId)end end table.sort(out,function(a,b)return tonumber(a)<tonumber(b)end)return out end local function remember(peer,peerLabel,extra)local value=read(SEEN_PATH,{})local timestamp,retained=now(),{}for key,item in pairs(value)do local seen=type(item)==\"table\"and tonumber(item.seen)or nil if not seen or seen+SEEN_PEER_TTL<=timestamp then value[key]=nil else retained[#retained+1]={key=key,seen=seen}end end table.sort(retained,function(a,b)return a.seen<b.seen end)local limit=value[tostring(peer)]and SEEN_PEER_LIMIT or SEEN_PEER_LIMIT-1 while#retained>limit do value[table.remove(retained,1).key]=nil end local old=value[tostring(peer)]or{}old.label,old.seen=peerLabel or old.label or(\"Computer \"..tostring(peer)),timestamp if extra then for key,item in pairs(extra)do if key~=\"tag\"and key~=\"proof\"then old[key]=item end end end value[tostring(peer)]=old store.write(SEEN_PATH,value)end local function admitSeenPacket(requestId)local timestamp,oldestKey,oldestAt,count=now(),nil,nil,0 for key,seenAt in pairs(seenPackets)do if seenAt+ROUTE_TTL<=timestamp then seenPackets[key]=nil else count=count+1 if not oldestAt or seenAt<oldestAt then oldestKey,oldestAt=key,seenAt end end end if seenPackets[requestId]then transport.requestDuplicates=transport.requestDuplicates+1;return false end if count>=SEEN_PACKET_LIMIT and oldestKey then seenPackets[oldestKey],transport.requestEvictions=nil,transport.requestEvictions+1 end seenPackets[requestId]=timestamp transport.requestAdmissions=transport.requestAdmissions+1 return true end local function modem(requireWireless)local candidates,used={},{}local sides=rs and rs.getSides and rs.getSides()or{}for _,name in ipairs(sides)do if peripheral.getType(name)==\"modem\"and not used[name]then candidates[#candidates+1],used[name]=name,true end end if peripheral.getNames then for _,name in ipairs(peripheral.getNames())do if peripheral.getType(name)==\"modem\"and not used[name]then candidates[#candidates+1],used[name]=name,true end end end local fallback for _,name in ipairs(candidates)do local wrapped=peripheral.wrap(name)if wrapped then fallback=fallback or wrapped local ok,wireless=pcall(function()return not wrapped.isWireless or wrapped.isWireless()end)if ok and wireless then return wrapped end end end if requireWireless then return nil end return fallback end local function modems()if modemCache and now()-modemCacheAt<1000 then return modemCache end local out,seen={},{}local function add(name)if not seen[name]and peripheral.getType(name)==\"modem\"then local wrapped=peripheral.wrap(name)if wrapped then out[#out+1],seen[name]={name=name,modem=wrapped},true end end end for _,name in ipairs(rs and rs.getSides and rs.getSides()or{})do add(name)end for _,name in ipairs(peripheral.getNames and peripheral.getNames()or{})do add(name)end modemCache,modemCacheAt=out,now()return out end function M.invalidateTransport()modemCache,modemCacheAt=nil,0 end local function wirelessModems()local out={}for _,item in ipairs(modems())do local ok,wireless=pcall(function()return not item.modem.isWireless or item.modem.isWireless()end)if ok and wireless then out[#out+1]=item end end return out end local function openChannels(value)local channels={value.channel or CHANNEL}if channels[1]~=DISCOVERY_CHANNEL then channels[#channels+1]=DISCOVERY_CHANNEL end transport.channels=channels local all=modems()if#all==0 then transport.lastError=\"no modem attached\";trace(\"transport\",\"modem_missing\");return channels end for _,item in ipairs(all)do for _,channel in ipairs(channels)do local ok,err=pcall(item.modem.open,channel)if not ok then transport.lastError=tostring(err)trace(\"transport\",\"channel_open_failed\",{channel=channel,error=transport.lastError,modem=item.name})end end end return channels end local function canonical(value,depth)depth=depth or 0 local kind=type(value)if kind==\"nil\"then return\"n\"end if kind==\"boolean\"then return value and\"b1\"or\"b0\"end if kind==\"number\"then if value~=value or value==math.huge or value==-math.huge then return nil,\"invalid numeric packet value\"end return\"d\"..string.format(\"%.17g\",value)..\";\"end if kind==\"string\"then if#value>MAX_PACKET_STRING then return nil,\"packet string exceeds limit\"end return\"s\"..tostring(#value)..\":\"..value end if kind~=\"table\"then return nil,\"unsupported packet value\"end if depth>=MAX_PACKET_DEPTH then return nil,\"packet nesting exceeds limit\"end local entries={}for key,item in pairs(value)do if#entries>=MAX_PACKET_TABLE then return nil,\"packet table exceeds limit\"end local encodedKey,keyErr=canonical(key,depth+1);if not encodedKey then return nil,keyErr end local encodedValue,valueErr=canonical(item,depth+1);if not encodedValue then return nil,valueErr end entries[#entries+1]=encodedKey..\"=\"..encodedValue end table.sort(entries)return\"t\"..tostring(#entries)..\"{\"..table.concat(entries,\",\")..\"}\"end local function packetMaterial(packet)return canonical({protocol=packet.protocol,type=packet.type,from=packet.from,to=packet.to,origin=packet.origin,destination=packet.destination,ttl=packet.ttl,request_id=packet.request_id,timestamp=packet.timestamp,reply_to=packet.reply_to,auth=packet.auth and{epoch=packet.auth.epoch,counter=packet.auth.counter}or nil,confidential=packet.confidential==true,body=packet.body,})end local function confidentialAad(packet)return table.concat({\"ceetos/confidential/v1\",tostring(packet.type),tostring(packet.origin),tostring(packet.destination),tostring(packet.request_id)},\"|\")end local function sealBody(peer,packet)local encoded=textutils.serialise(packet.body or{},{compact=true})if#encoded>6144 then return nil,\"confidential payload exceeds limit\"end local nonce=meshCrypto.nonce(peer.key,password.newSalt(\"confidential:\"..tostring(packet.request_id)),confidentialAad(packet))if not nonce then return nil,\"could not create confidential nonce\"end local envelope,err=meshCrypto.seal(peer.key,nonce,confidentialAad(packet),encoded)if not envelope then return nil,err end return{envelope=envelope}end local function openBody(peer,packet)if type(packet.body)~=\"table\"or type(packet.body.envelope)~=\"table\"then return nil,\"malformed confidential envelope\"end local decoded,err=meshCrypto.open(peer.key,packet.body.envelope,confidentialAad(packet))if not decoded or#decoded>6144 then return nil,err or\"invalid confidential payload\"end local ok,value=pcall(textutils.unserialise,decoded)if not ok or type(value)~=\"table\"then return nil,\"invalid confidential payload\"end return value end local function loadSecurity()security=read(SECURITY_PATH,{tx={},rx={}})security.tx=type(security.tx)==\"table\"and security.tx or{}security.rx=type(security.rx)==\"table\"and security.rx or{}end local function saveSecurity()local ok,err=store.write(SECURITY_PATH,security)if ok==false then error(err or\"could not persist peer replay state\",0)end end local function counter(peerId)local key=tostring(peerId)local tx=security.tx[key]if not tx then tx={epoch=password.newSalt(\"peer-tx:\"..key),reserved=0};security.tx[key]=tx end tx.next=tonumber(tx.next)or((tonumber(tx.reserved)or 0)+1)if tx.next>(tonumber(tx.reserved)or 0)then tx.reserved=tx.next+COUNTER_RESERVATION-1 saveSecurity()end local value=tx.next;tx.next=value+1 return tx.epoch,value end local function verifyReplay(from,auth)if type(auth)~=\"table\"or type(auth.epoch)~=\"string\"or#auth.epoch<16 or#auth.epoch>128 then return false,\"invalid packet epoch\"end local sequence=tonumber(auth.counter)if not sequence or sequence<1 or sequence%1~=0 then return false,\"invalid packet counter\"end local key=tostring(from)local row=security.rx[key]or{epochs={}}row.epochs=type(row.epochs)==\"table\"and row.epochs or{}local epochState=row.epochs[auth.epoch]if type(epochState)~=\"table\"then local legacy=tonumber(epochState)epochState={max=legacy or 0,seen={}}if legacy and legacy>0 then epochState.seen[tostring(legacy)]=true end end epochState.max=math.max(0,math.floor(tonumber(epochState.max)or 0))epochState.seen=type(epochState.seen)==\"table\"and epochState.seen or{}if epochState.max>0 and sequence>epochState.max+MAX_COUNTER_JUMP then return false,\"packet counter jump requires rekey or resynchronization\"end if sequence<=epochState.max-REPLAY_WINDOW then return false,\"stale packet counter\"end local sequenceKey=tostring(sequence)if epochState.seen[sequenceKey]then return false,\"replayed packet counter\"end if sequence>epochState.max then epochState.max=sequence end epochState.seen[sequenceKey]=true for seenCounter in pairs(epochState.seen)do local numeric=tonumber(seenCounter)if not numeric or numeric<=epochState.max-REPLAY_WINDOW then epochState.seen[seenCounter]=nil end end row.epochs[auth.epoch]=epochState local order={}for epoch,epochValue in pairs(row.epochs)do local maximum=type(epochValue)==\"table\"and tonumber(epochValue.max)or tonumber(epochValue)order[#order+1]={epoch=epoch,max=maximum or 0}end table.sort(order,function(a,b)return a.max>b.max end)while#order>MAX_RX_EPOCHS do row.epochs[table.remove(order).epoch]=nil end security.rx[key]=row saveSecurity()return true end local function newRequestId()return id()..\":\"..password.newSalt(\"peer-request\")end local function sign(peerId,peer,packet)local epoch,sequence=counter(peerId)packet.auth={epoch=epoch,counter=sequence}local material,err=packetMaterial(packet)if not material then return false,err end local mac,macErr=password.hmacSha256(peer.key,material)if not mac then return false,macErr end packet.auth.mac=mac return true end local function verifyPacket(packet,value)if type(packet)~=\"table\"then return false,\"packet is not a table\"end if packet.protocol~=PROTOCOL then return false,packet.protocol==\"ceetos/1\"and\"v1 packet rejected; rekey required\"or\"invalid packet protocol\"end if type(packet.type)~=\"string\"or#packet.type==0 or#packet.type>64 then return false,\"invalid packet type\"end if type(packet.from)~=\"string\"and type(packet.from)~=\"number\"then return false,\"invalid packet sender\"end local from=tostring(packet.from)local peer=activeLink(value,from)if not peer then return false,\"sender is not an active direct or mesh peer\"end if not isForUs(packet.to)then return false,\"packet addressed to another hop\"end if type(packet.origin)~=\"string\"and type(packet.origin)~=\"number\"then return false,\"invalid packet origin\"end if type(packet.destination)~=\"string\"and type(packet.destination)~=\"number\"then return false,\"invalid packet destination\"end if type(packet.request_id)~=\"string\"or#packet.request_id==0 or#packet.request_id>128 then return false,\"invalid packet request ID\"end if packet.reply_to~=nil and(type(packet.reply_to)~=\"string\"or#packet.reply_to==0 or#packet.reply_to>128)then return false,\"invalid reply correlation ID\"end local ttl=tonumber(packet.ttl)if not ttl or ttl%1~=0 or ttl<1 or ttl>PACKET_TTL then return false,\"invalid packet TTL\"end local timestamp=tonumber(packet.timestamp)if not timestamp or math.abs(now()-timestamp)>ROUTE_TTL then return false,\"stale packet timestamp\"end if type(packet.auth)~=\"table\"or type(packet.auth.mac)~=\"string\"or#packet.auth.mac~=64 then return false,\"missing packet MAC\"end local receivedMac=packet.auth.mac packet.auth.mac=nil local material,materialErr=packetMaterial(packet)packet.auth.mac=receivedMac if not material then return false,materialErr end local expected,macErr=password.hmacSha256(peer.key,material)if not expected or not password.constantTimeEqual(expected,receivedMac)then return false,macErr or\"invalid packet MAC\"end local replayOk,replayErr=verifyReplay(from,packet.auth)if not replayOk then return false,replayErr end return true,peer end local function routeBucket(targetId)local bucket=routes[tostring(targetId)]if bucket and bucket.next then bucket={candidates={{next=tostring(bucket.next),hops=tonumber(bucket.hops)or PACKET_TTL,expires=tonumber(bucket.expires)or 0,label=bucket.label,mode=bucket.mode,masterId=bucket.masterId,legacy=true,loss=1,}},primary=tostring(bucket.next),changedAt=now(),reason=\"legacy route\"}routes[tostring(targetId)]=bucket end if not bucket then bucket={candidates={},changedAt=now(),reason=\"new\"}routes[tostring(targetId)]=bucket end bucket.candidates=type(bucket.candidates)==\"table\"and bucket.candidates or{}return bucket end local function candidateHealth(candidate)local state=healthFor(candidate.next)local rank=state.state==\"healthy\"and 0 or(state.state==\"degraded\"and 1 or 2)return rank,state end local function directCandidate(value,targetId)local link,kind=activeLink(value,targetId)if link then return{next=targetId,hops=1,expires=now()+ROUTE_TTL,kind=kind,direct=true,label=link.label,mode=link.mode,masterId=link.masterId}end end local function validCandidates(targetId,value)local timestamp,out,seen=now(),{},{}local direct=directCandidate(value,targetId)if direct then out[#out+1],seen[direct.next..\":\"..direct.kind]=direct,true end local bucket=routes[tostring(targetId)]if bucket then for _,candidate in ipairs(routeBucket(targetId).candidates)do local key=tostring(candidate.next)..\":\"..tostring(candidate.kind or\"route\")if not seen[key]and candidate.expires>timestamp and candidate.hops>=1 and candidate.hops<=PACKET_TTL and activeLink(value,candidate.next)then out[#out+1],seen[key]=candidate,true end end end return out end local function compareCandidates(a,b)local ar,ah=candidateHealth(a)local br,bh=candidateHealth(b)if ar~=br then return ar<br end if(a.hops or PACKET_TTL)~=(b.hops or PACKET_TTL)then return(a.hops or PACKET_TTL)<(b.hops or PACKET_TTL)end if(ah.loss or 0)~=(bh.loss or 0)then return(ah.loss or 0)<(bh.loss or 0)end if(ah.rtt or 0)~=(bh.rtt or 0)then return(ah.rtt or 0)<(bh.rtt or 0)end return tostring(a.next)<tostring(b.next)end local function primaryCandidate(targetId,value,safe)local candidates=validCandidates(targetId,value)if#candidates==0 then return nil end table.sort(candidates,compareCandidates)local target,bucket,selected=tostring(targetId),routeBucket(targetId),candidates[1]local existing for _,item in ipairs(candidates)do if tostring(item.next)==tostring(bucket.primary)then existing=item;break end end if existing then local oldRank,newRank=candidateHealth(existing),candidateHealth(selected)if oldRank<newRank then selected=existing elseif oldRank==newRank and oldRank==0 and(selected.hops or 99)<(existing.hops or 99)then local health=healthFor(selected.next)if(health.successes or 0)<2 or(health.recoveredAt and now()-(health.stableSince or now())<PROBE_RECOVERY)then selected=existing end end end if safe then local rank,_,choices=candidateHealth(selected),nil,{}for _,item in ipairs(candidates)do local itemRank=candidateHealth(item)if itemRank==rank and item.hops==selected.hops then choices[#choices+1]=item end end if#choices>1 then table.sort(choices,function(a,b)local ah,bh=healthFor(a.next),healthFor(b.next)local aLoad,bLoad=currentInFlight(ah,now()),currentInFlight(bh,now())if aLoad~=bLoad then return aLoad<bLoad end return tostring(a.next)<tostring(b.next)end)selected=choices[1]end end if bucket.primary~=tostring(selected.next)then bucket.primary,bucket.changedAt,bucket.reason=tostring(selected.next),now(),existing and\"health/hop selection\"or\"initial selection\"trace(\"routing\",\"route_selected\",{destination=target,next=selected.next,hops=selected.hops,reason=bucket.reason})end return selected end local function nextHop(target,safe)local candidate=primaryCandidate(target,config(),safe)if candidate then local health=healthFor(candidate.next)if safe then markInFlight(health)end health.lastSelected=now()return candidate.next,candidate end routes[tostring(target)]=nil end local function transmit(items,channel,packet)if#items==0 then return false,\"no compatible modem attached\"end local sent,lastError=false,nil for _,item in ipairs(items)do local ok,err=pcall(item.modem.transmit,channel,channel,packet)if ok then sent=true else lastError=tostring(err)end end if not sent then transport.lastError=lastError or\"modem transmit failed\"end return sent,transport.lastError end local function send(target,input,forcedHop)local hop=forcedHop or nextHop(target,input.routeSafe==true and input.balanceSafe==true)if not hop then return false,\"peer is unreachable or requires rekey\"end local value,peer=config(),activeLink(config(),hop)if not peer then return false,\"direct route is unavailable\"end local packet=copy(input)packet.auth,packet.protocol,packet.from,packet.to=nil,PROTOCOL,id(),hop packet.origin,packet.destination=tostring(packet.origin or id()),tostring(packet.destination or target)packet.ttl=math.floor(tonumber(packet.ttl)or PACKET_TTL)packet.timestamp=now()if packet.ttl<1 or packet.ttl>PACKET_TTL then return false,\"invalid packet TTL\"end if type(packet.request_id)~=\"string\"or#packet.request_id==0 then packet.request_id=newRequestId()end if packet.confidential==true then local sealed,sealErr=sealBody(peer,packet)if not sealed then return false,sealErr end packet.body=sealed end local signed,signErr=sign(hop,peer,packet)if not signed then return false,signErr end openChannels(value)local links=wirelessModems()if#links==0 then return false,\"no wireless modem attached\"end local sent,err=transmit(links,value.channel or CHANNEL,packet)if not sent then trace(\"transport\",\"transmit_failed\",{type=packet.type,to=hop,error=err});return false,err end transport.lastTransmit,transport.lastError=now(),nil healthFor(hop).lastTransmit=now()trace(\"routing\",\"packet_sent\",{type=packet.type,to=hop,destination=packet.destination,links=#links})return true end local function rememberReverse(packet,previousHop)if type(packet)~=\"table\"or type(packet.request_id)~=\"string\"or#packet.request_id==0 then return false end local requestId,origin=packet.request_id,tostring(packet.origin)local existing=reverseRoutes[requestId]if existing and(existing.previous~=tostring(previousHop)or existing.origin~=origin)then return false,\"reverse route collision\"end reverseRoutes[requestId]={previous=tostring(previousHop),origin=origin,expires=now()+ROUTE_TTL}local entries={}for key,route in pairs(reverseRoutes)do entries[#entries+1]={id=key,expires=route.expires or 0}end table.sort(entries,function(a,b)return a.expires<b.expires end)while#entries>MAX_REVERSE_ROUTES do reverseRoutes[table.remove(entries,1).id]=nil end return true end local function broadcast(packet)local links=wirelessModems()if#links==0 then transport.lastError=\"no wireless modem attached\";trace(\"discovery\",\"wireless_missing\");return false,transport.lastError end local out=copy(packet)out.protocol,out.from,out.to=PROTOCOL,id(),0 out.timestamp=now()openChannels(config())local sent,err=transmit(links,DISCOVERY_CHANNEL,out)if not sent then trace(\"discovery\",\"transmit_failed\",{type=out.type,error=err});return false,err end transport.lastTransmit,transport.lastError=now(),nil trace(\"discovery\",out.type==\"discover\"and\"announcement_sent\"or\"discovery_packet_sent\",{type=out.type})return true end local function publicTransmit(target,typeName,body)if not PUBLIC_UPDATE_TYPES[typeName]then return false,\"invalid public update packet type\"end local encoded,encodeErr=canonical(body or{})if not encoded then return false,encodeErr or\"invalid public update body\"end local links=wirelessModems()if#links==0 then transport.lastError=\"no wireless modem attached\";return false,transport.lastError end openChannels(config())local packet={protocol=PUBLIC_UPDATE_PROTOCOL,type=typeName,from=id(),to=tostring(target),timestamp=now(),request_id=newRequestId(),body=body or{},}local sent,err=transmit(links,DISCOVERY_CHANNEL,packet)if not sent then transport.lastError=err or\"public update transmit failed\"trace(\"transport\",\"public_update_transmit_failed\",{type=typeName,to=target,error=transport.lastError})return false,transport.lastError end transport.lastTransmit,transport.lastError=now(),nil trace(\"transport\",\"public_update_sent\",{type=typeName,to=target,bytes=#encoded})return true end function M.publicSend(target,typeName,body)if tostring(target)==\"0\"or tostring(target)==\"\"then return false,\"public update target must be a computer ID\"end return publicTransmit(target,typeName,body)end function M.publicBroadcast(typeName,body)return publicTransmit(\"0\",typeName,body)end local function handshake(target,packet)local links=wirelessModems()if#links==0 then transport.lastError=\"no wireless modem attached\";return false,transport.lastError end local out=copy(packet)out.protocol,out.from,out.to,out.timestamp=PROTOCOL,id(),tostring(target),now()out.destination,out.ttl=tostring(target),1 openChannels(config())local sent,err=transmit(links,DISCOVERY_CHANNEL,out)if not sent then trace(\"discovery\",\"handshake_transmit_failed\",{type=out.type,to=target,error=err});return false,err end transport.lastTransmit=now()trace(\"discovery\",out.type..\"_sent\",{to=target})return true end local function phraseTag(phrase,sessionId,hostId)return password.hmacSha256(phrase,\"ceetos/discovery/v2|\"..sessionId..\"|\"..tostring(hostId))end local function joinProof(phrase,sessionId,hostId,joinerId,nonce)return password.hmacSha256(phrase,\"ceetos/pair/join/v2|\"..sessionId..\"|\"..tostring(hostId)..\"|\"..tostring(joinerId)..\"|\"..nonce)end local function confirmProof(phrase,sessionId,hostId,joinerId,nonce,mode,master)return password.hmacSha256(phrase,\"ceetos/pair/confirm/v2|\"..sessionId..\"|\"..tostring(hostId)..\"|\"..tostring(joinerId)..\"|\"..nonce..\"|\"..tostring(mode)..\"|\"..tostring(master or\"\"))end local function linkKey(phrase,sessionId,hostId,joinerId,nonce)return password.derive(phrase,\"ceetos/link/v2|\"..sessionId..\"|\"..tostring(hostId)..\"|\"..tostring(joinerId)..\"|\"..nonce,64)end local function keyId(key)local value=password.hmacSha256(key,\"ceetos/key-id/v2\")return value and value:sub(1,16)or\"\"end local function activeSession()return discovery and(discovery.state==\"hosting\"or discovery.state==\"searching\"or discovery.state==\"candidate\"or discovery.state==\"confirming\")end local function setLast(state,message)lastDiscovery={state=state,message=message,at=now()}end local function persistPair(peerId,key,metadata,masterId)local value=config()local previous=value.peers[tostring(peerId)]value.peers[tostring(peerId)]={protocol=2,rekeyRequired=false,key=key,keyId=keyId(key),role=\"operator\",mode=metadata.mode or\"peer\",master=tostring(masterId or\"\")==id(),masterId=tostring(masterId or\"\"),label=metadata.label,}local saved,saveErr=pcall(save,value)if not saved then value.peers[tostring(peerId)]=previous configCache=value return false,tostring(saveErr or\"could not save network configuration\")end local health=healthFor(peerId)health.state,health.misses,health.awaiting,health.probeToken=\"healthy\",0,false,nil health.lastAuthenticated,health.stableSince=now(),now()remember(peerId,metadata.label,{mode=metadata.mode,masterId=masterId})routes[tostring(peerId)]=nil meshEnrollmentSends[tostring(peerId)]=nil meshDirty,routesDirty=true,true audit.log(\"local\",\"peer.rekeyed\",{peer=peerId,mode=metadata.mode})return true end local function markRejected(reason)if discovery then discovery=nil end setLast(\"cancelled\",reason)end local function discoveryAnnouncement()if not discovery or discovery.state~=\"hosting\"then return false,\"no active host discovery\"end return broadcast({type=\"discover\",session=discovery.id,tag=discovery.tag,label=discovery.label,mode=discovery.mode,master=discovery.masterSide,expires=discovery.expires,})end local function queueConfirmation(peerId,host)confirmations[host.id]=host local sent,err=handshake(peerId,{type=\"pair_confirm\",session=host.id,nonce=host.joinNonce,proof=host.confirmProof,label=host.label,mode=host.mode,master=host.masterId,})host.lastSent,host.retries=now(),0 if not sent then host.error=err end return sent,err end local function rollbackPendingConfirmation(packet)local sessionId,from=tostring(packet.session or\"\"),tostring(packet.from or\"\")local record=confirmations[sessionId]if not record or tostring(record.peer)~=from or type(record.keyId)~=\"string\"or type(record.key)~=\"string\"then return false end local expected=password.hmacSha256(record.key,\"ceetos/pair/reject/v2|\"..sessionId..\"|\"..from..\"|\"..id()..\"|persistence_failed\")if type(packet.proof)~=\"string\"or not password.constantTimeEqual(expected,packet.proof)then trace(\"discovery\",\"pair_rollback_rejected\",{from=from,reason=\"invalid_reject_proof\"})return false end local value,peer=config(),activePeer(config(),from)if not peer or peer.keyId~=record.keyId then return false end local previous=value.peers[from]value.peers[from]=nil local saved,saveErr=pcall(save,value)if not saved then value.peers[from],configCache=previous,value trace(\"discovery\",\"pair_rollback_failed\",{from=from,error=saveErr})return false end confirmations[sessionId],routes[from],meshEnrollmentSends[from]=nil,nil,nil setLast(\"cancelled\",\"pairing rejected: persistence failed on remote peer\")trace(\"discovery\",\"pair_rolled_back\",{from=from,reason=\"persistence_failed\"})return true end local function expireState(timestamp)if discovery and discovery.expires<=timestamp then local old=discovery.state discovery=nil setLast(\"expired\",old==\"searching\"and\"no matching discovery announcement received\"or\"discovery session expired\")trace(\"discovery\",\"session_expired\",{previous=old})end end local function boundMap(value,limit,timestamp)local entries={}for key,row in pairs(value)do entries[#entries+1]={key=key,at=type(row)==\"number\"and row or(type(row)==\"table\"and(row.expires or row.time or row.seen or row.lastAuthenticated or 0)or 0)}end table.sort(entries,function(a,b)if a.at~=b.at then return a.at<b.at end return tostring(a.key)<tostring(b.key)end)while#entries>limit do value[table.remove(entries,1).key]=nil end end local function pruneRouteBuckets(timestamp)local value=config()local entries={}for peerId,bucket in pairs(routes)do local latest=tonumber(bucket.changedAt)or 0 for _,candidate in ipairs(type(bucket.candidates)==\"table\"and bucket.candidates or{})do latest=math.max(latest,tonumber(candidate.expires)or 0)end entries[#entries+1]={peer=peerId,latest=latest}end table.sort(entries,function(a,b)if a.latest~=b.latest then return a.latest<b.latest end return tostring(a.peer)<tostring(b.peer)end)while#entries>ROUTE_BUCKET_LIMIT do local old=table.remove(entries,1)routes[old.peer],routesDirty=nil,true trace(\"routing\",\"route_bucket_evicted\",{destination=old.peer})end for peerId,state in pairs(linkHealth)do if not activeLink(value,peerId)and not routes[peerId]then linkHealth[peerId]=nil end end for peerId in pairs(advertisedRoutes)do if not activeLink(value,peerId)then advertisedRoutes[peerId]=nil end end boundMap(meshOffers,MESH_STATE_LIMIT,timestamp)boundMap(meshSeen,MESH_STATE_LIMIT,timestamp)end local function controller(value)value=value or config()if value.controller and tostring(value.controller)~=\"\"then local chosen=tostring(value.controller)if chosen==id()or activeLink(value,chosen)then return chosen end local known=routes[chosen]if known then if known.expires and known.expires>now()then return chosen end if type(known.candidates)==\"table\"then for _,candidate in ipairs(known.candidates)do if(candidate.expires or 0)>now()and activeLink(value,candidate.next)then return chosen end end end end trace(\"routing\",\"controller_unreachable\",{controller=chosen})end local selected=tonumber(id())or 0 for peerId in pairs(value.peers)do if activePeer(value,peerId)then local n=tonumber(peerId);if n and n<selected then selected=n end end end for peerId,route in pairs(routes)do local reachable=route.expires and route.expires>now()if type(route.candidates)==\"table\"then reachable=false for _,candidate in ipairs(route.candidates)do if(candidate.expires or 0)>now()then reachable=true;break end end end if reachable then local n=tonumber(peerId);if n and n<selected then selected=n end end end return tostring(selected)end local function meshConfig(value)value=value or config()local mesh=value.mesh if type(mesh)==\"table\"and type(mesh.id)==\"string\"and#mesh.id>=16 and type(mesh.root)==\"string\"and#mesh.root>=32 and tonumber(mesh.epoch)then return mesh end return nil end local function meshAuthority(mesh,fallback)local candidate=type(mesh)==\"table\"and mesh.controller or fallback if type(candidate)~=\"string\"and type(candidate)~=\"number\"then return nil end candidate=tostring(candidate)if#candidate==0 or#candidate>32 or not candidate:match(\"^%-?%d+$\")then return nil end return candidate end local function compareMeshAuthority(left,right)local leftNumber,rightNumber=tonumber(left),tonumber(right)if leftNumber and rightNumber and leftNumber~=rightNumber then return leftNumber<rightNumber and-1 or 1 end left,right=tostring(left or\"\"),tostring(right or\"\")if left==right then return 0 end return left<right and-1 or 1 end local function acceptPreferredMesh(existing,incoming,fallbackAuthority)if not existing then return true,\"first mesh enrollment\"end if existing.id==incoming.id then if tonumber(incoming.epoch)>=tonumber(existing.epoch)then return true,\"same mesh refresh\"end return false,\"existing mesh has a newer epoch\"end local existingAuthority=meshAuthority(existing,fallbackAuthority)local incomingAuthority=meshAuthority(incoming,fallbackAuthority)if not incomingAuthority then return false,\"incoming mesh has no valid controller\"end if not existingAuthority then return true,\"legacy mesh has no controller\"end local authorityOrder=compareMeshAuthority(incomingAuthority,existingAuthority)if authorityOrder<0 then return true,\"lower controller mesh wins\"end if authorityOrder>0 then return false,\"existing lower controller mesh wins\"end if tonumber(incoming.epoch)~=tonumber(existing.epoch)then return tonumber(incoming.epoch)>tonumber(existing.epoch),\"same controller epoch comparison\"end return tostring(incoming.id)<tostring(existing.id),\"same controller mesh ID comparison\"end local function meshMaterial(packet)return canonical({protocol=packet.protocol,type=packet.type,from=packet.from,to=packet.to,mesh=packet.mesh,epoch=packet.epoch,nonce=packet.nonce,offer=packet.offer,timestamp=packet.timestamp})end local function meshTag(mesh,packet)local material=meshMaterial(packet)return material and password.hmacSha256(mesh.root,material)or nil end local function meshPacket(typeName,target,fields)local value,mesh=config(),meshConfig()if not mesh then return false,\"mesh enrollment is pending\"end local packet=copy(fields or{})packet.protocol,packet.type,packet.from,packet.to=PROTOCOL,typeName,id(),target and tostring(target)or 0 packet.mesh,packet.epoch,packet.timestamp=mesh.id,mesh.epoch,now()packet.tag=meshTag(mesh,packet)if not packet.tag then return false,\"could not authenticate mesh packet\"end openChannels(value)local links=wirelessModems()if#links==0 then return false,\"no wireless modem attached\"end local sent,err=transmit(links,value.channel or CHANNEL,packet)if sent then trace(\"routing\",typeName..\"_sent\",{to=packet.to,mesh=mesh.id:sub(1,8)})end return sent,err end local function deriveAutoEdge(mesh,peerId,firstNonce,secondNonce)local left,right=tostring(id()),tostring(peerId)if left>right then left,right=right,left end return password.hmacSha256(mesh.root,\"ceetos/mesh-edge/v1|\"..tostring(mesh.epoch)..\"|\"..left..\"|\"..right..\"|\"..tostring(firstNonce)..\"|\"..tostring(secondNonce))end local function ownsMeshOffer(peerId)local ours,theirs=tonumber(id()),tonumber(peerId)if ours and theirs then return ours<theirs end return tostring(id())<tostring(peerId)end local function installAutoEdge(mesh,peerId,firstNonce,secondNonce,peerLabel)peerId=tostring(peerId)local value=config()if activePeer(value,peerId)then return false,\"manual direct link already exists\"end local key=deriveAutoEdge(mesh,peerId,firstNonce,secondNonce)if not key then return false,\"could not derive mesh edge\"end autoEdges[peerId]={key=key,label=peerLabel,mesh=mesh.id,epoch=mesh.epoch,expires=now()+ROUTE_TTL,firstNonce=firstNonce,secondNonce=secondNonce}local state=healthFor(peerId)state.state,state.successes,state.misses,state.lastAuthenticated,state.stableSince=\"healthy\",2,0,now(),now()routesDirty,meshDirty=true,true trace(\"routing\",\"mesh_edge_active\",{peer=peerId,mesh=mesh.id:sub(1,8)})return true end local function meshEnrollmentAad(from,to,meshId,epoch,nonceCounter)return canonical({protocol=PROTOCOL,type=\"mesh_enroll\",from=tostring(from),to=tostring(to),mesh=meshId,epoch=tonumber(epoch),counter=tonumber(nonceCounter)})end local function sendEnrollment(peerId)local value,mesh,peer=config(),meshConfig(),activePeer(config(),peerId)if not mesh or not peer then return false,\"mesh or direct link unavailable\"end local authority=meshAuthority(mesh,controller(value))if not authority then return false,\"mesh controller is invalid\"end local _,nonceCounter=counter(peerId)local aad=meshEnrollmentAad(id(),peerId,mesh.id,mesh.epoch,nonceCounter)local nonce=meshCrypto.nonce(peer.key,nonceCounter,\"mesh-enroll|\"..id()..\"|\"..tostring(peerId))local plaintext=textutils.serialise({id=mesh.id,epoch=mesh.epoch,root=mesh.root,controller=authority},{compact=true})local envelope,err=meshCrypto.seal(peer.key,nonce,aad,plaintext)if not envelope then return false,err end local sent,sendErr=send(peerId,{type=\"mesh_enroll\",body={mesh=mesh.id,epoch=mesh.epoch,counter=nonceCounter,envelope=envelope},request_id=newRequestId()},peerId)if sent then trace(\"routing\",\"mesh_enrollment_sent\",{to=peerId,mesh=mesh.id:sub(1,8),controller=authority,epoch=mesh.epoch})else trace(\"routing\",\"mesh_enrollment_failed\",{to=peerId,error=sendErr})end return sent,sendErr end local function acceptEnrollment(from,peer,packet)if not activePeer(config(),from)then return rejectPacket(\"mesh enrollment requires a manual direct link\",packet)end local body=packet.body if type(body)~=\"table\"or type(body.mesh)~=\"string\"or type(body.envelope)~=\"table\"or not tonumber(body.epoch)or not tonumber(body.counter)then return rejectPacket(\"malformed_mesh_enrollment\",packet)end local aad=meshEnrollmentAad(from,id(),body.mesh,body.epoch,body.counter)local plaintext,err=meshCrypto.open(peer.key,body.envelope,aad)if not plaintext then return rejectPacket(err or\"mesh enrollment authentication failed\",packet)end local ok,mesh=pcall(textutils.unserialise,plaintext)if not ok or type(mesh)~=\"table\"or mesh.id~=body.mesh or tonumber(mesh.epoch)~=tonumber(body.epoch)or type(mesh.root)~=\"string\"or#mesh.root<32 or not meshAuthority(mesh)then return rejectPacket(\"invalid_mesh_enrollment\",packet)end local value,existing=config(),meshConfig()if existing and existing.id==mesh.id then if existing.root~=mesh.root then return rejectPacket(\"conflicting_mesh_root\",packet)end local currentAuthority=meshAuthority(existing,controller(value))local incomingAuthority=meshAuthority(mesh,controller(value))if currentAuthority and incomingAuthority and compareMeshAuthority(currentAuthority,incomingAuthority)<0 then mesh.controller=currentAuthority elseif currentAuthority then mesh.controller=incomingAuthority or currentAuthority end mesh.epoch=math.max(tonumber(existing.epoch)or 0,tonumber(mesh.epoch)or 0)end local accepted,reason=acceptPreferredMesh(existing,mesh,controller(value))if not accepted then trace(\"routing\",\"mesh_enrollment_kept\",{from=from,reason=reason,mesh=existing and existing.id:sub(1,8)});return end local changedRoot=not existing or existing.id~=mesh.id or tonumber(existing.epoch)~=tonumber(mesh.epoch)or tostring(meshAuthority(existing,controller(value))or\"\")~=tostring(meshAuthority(mesh,controller(value))or\"\")value.mesh={id=mesh.id,epoch=tonumber(mesh.epoch),root=mesh.root,controller=meshAuthority(mesh),enrolledAt=now(),enrolledBy=tostring(from)}save(value)if changedRoot then meshEnrollmentSends={}end meshDirty,routesDirty=true,true trace(\"routing\",\"mesh_enrolled\",{from=from,mesh=mesh.id:sub(1,8),controller=mesh.controller,epoch=mesh.epoch,reason=reason})end local function ensureMeshEnrollment(timestamp)local value,mesh=config(),meshConfig()if not mesh then if(M._meshBootstrapAt or 0)>timestamp or controller(value)~=id()then return end value.mesh={id=password.newSalt(\"mesh-id:\"..id()),root=password.newSalt(\"mesh-root:\"..id()),epoch=1,createdAt=timestamp,controller=id()}save(value);mesh,meshDirty,routesDirty=value.mesh,true,true trace(\"routing\",\"mesh_created\",{mesh=mesh.id:sub(1,8),epoch=mesh.epoch})elseif not meshAuthority(mesh)then mesh.controller=controller(value)value.mesh,mesh=mesh,mesh save(value)trace(\"routing\",\"mesh_controller_migrated\",{mesh=mesh.id:sub(1,8),controller=mesh.controller})end for _,peerId in ipairs(allDirectLinks(value))do if activePeer(value,peerId)then local previous=meshEnrollmentSends[peerId]if not previous or previous.mesh~=mesh.id or previous.epoch~=mesh.epoch or timestamp-previous.at>=MESH_FULL_INTERVAL then local sent=sendEnrollment(peerId)if sent then meshEnrollmentSends[peerId]={mesh=mesh.id,epoch=mesh.epoch,at=timestamp}end end end end end local function meshBeacon(timestamp)local mesh=meshConfig()if not mesh or timestamp-lastMeshBeacon<MESH_BEACON_INTERVAL then return end lastMeshBeacon=timestamp meshPacket(\"mesh_beacon\",nil,{nonce=password.newSalt(\"mesh-beacon:\"..id()),label=label()})end local function meshEdgeRefreshReason(mesh,peerId,timestamp)local edge=autoEdges[peerId]if not edge then return\"missing\"end if edge.mesh~=mesh.id or tonumber(edge.epoch)~=tonumber(mesh.epoch)then return\"mesh_epoch_changed\"end local health=linkHealth[peerId]if not health then return\"unobserved\"end if health.state~=\"healthy\"then return\"link_\"..tostring(health.state)end if timestamp-(tonumber(health.lastAuthenticated)or 0)>=MESH_BEACON_INTERVAL then return\"authentication_stale\"end return nil end local function offerMeshEdge(mesh,peerId,reason)local pending=meshOffers[peerId]if pending and pending.expires>now()then return false,\"mesh edge offer already pending\"end local nonce=password.newSalt(\"mesh-offer:\"..peerId)local sent,err=meshPacket(\"mesh_edge_offer\",peerId,{nonce=nonce,label=label()})if not sent then trace(\"routing\",\"mesh_edge_offer_failed\",{peer=peerId,reason=reason,error=err})return false,err end meshOffers[peerId]={offer=nonce,expires=now()+DISCOVERY_TTL}trace(\"routing\",\"mesh_edge_offer_sent\",{peer=peerId,reason=reason})return true end local function verifyMeshPacket(packet)local mesh=meshConfig()if not mesh or type(packet)~=\"table\"or packet.protocol~=PROTOCOL or packet.mesh~=mesh.id or tonumber(packet.epoch)~=tonumber(mesh.epoch)then return false,\"mesh membership proof failed\"end if type(packet.from)~=\"string\"and type(packet.from)~=\"number\"then return false,\"invalid mesh sender\"end if type(packet.nonce)~=\"string\"or#packet.nonce<16 or#packet.nonce>128 then return false,\"invalid mesh nonce\"end if math.abs(now()-(tonumber(packet.timestamp)or 0))>ROUTE_TTL then return false,\"stale mesh packet\"end local material,tag=meshMaterial(packet),packet.tag local expected=material and password.hmacSha256(mesh.root,material)if type(tag)~=\"string\"or not expected or not password.constantTimeEqual(expected,tag)then return false,\"invalid mesh packet tag\"end local replay=tostring(packet.from)..\"|\"..tostring(packet.type)..\"|\"..tostring(packet.nonce)..\"|\"..tostring(packet.offer or\"\")if meshSeen[replay]and meshSeen[replay]+ROUTE_TTL>now()then return false,\"replayed mesh packet\"end meshSeen[replay]=now()return true,mesh end local function handleMeshPacket(packet,distance)local valid,meshOrErr=verifyMeshPacket(packet)if not valid then return rejectPacket(meshOrErr,packet,nil,distance)end local mesh,from=meshOrErr,tostring(packet.from)if from==id()then return end if packet.type==\"mesh_beacon\"then remember(from,packet.label,{mesh=mesh.id})trace(\"routing\",\"mesh_beacon_received\",{peer=from,mesh=mesh.id:sub(1,8),distance=distance})if not activePeer(config(),from)and ownsMeshOffer(from)then local reason=meshEdgeRefreshReason(mesh,from,now())if reason then offerMeshEdge(mesh,from,reason)end end return end if not isForUs(packet.to)then return rejectPacket(\"mesh packet addressed to another peer\",packet,nil,distance)end if packet.type==\"mesh_edge_offer\"then if activePeer(config(),from)then return end trace(\"routing\",\"mesh_edge_offer_received\",{peer=from,mesh=mesh.id:sub(1,8),distance=distance})local response=password.newSalt(\"mesh-accept:\"..from)local installed,err=installAutoEdge(mesh,from,packet.nonce,response,packet.label)if not installed then return rejectPacket(err or\"could not install mesh edge\",packet,nil,distance)end local sent,sendErr=meshPacket(\"mesh_edge_accept\",from,{nonce=response,offer=packet.nonce,label=label()})if sent then trace(\"routing\",\"mesh_edge_accept_sent\",{peer=from})end return sent,sendErr end if packet.type==\"mesh_edge_accept\"then local offer=meshOffers[from]if not offer or offer.expires<=now()or offer.offer~=packet.offer then return rejectPacket(\"unexpected mesh edge acceptance\",packet,nil,distance)end meshOffers[from]=nil local installed,err=installAutoEdge(mesh,from,offer.offer,packet.nonce,packet.label)if installed then trace(\"routing\",\"mesh_edge_accept_received\",{peer=from})end return installed,err end end local function probeLinks(timestamp)local value=config()for _,peerId in ipairs(allDirectLinks(value))do local health=healthFor(peerId)local interval=health.state==\"offline\"and PROBE_INTERVAL*3 or PROBE_INTERVAL if timestamp-(health.lastAuthenticated or 0)>=interval and timestamp-(health.lastProbe or 0)>=interval then if health.awaiting then health.misses=(health.misses or 0)+1 health.loss=math.min(1,((health.loss or 0)*3+1)/4)local nextState=health.misses>=PROBE_OFFLINE and\"offline\"or(health.misses>=PROBE_DEGRADED and\"degraded\"or health.state)if nextState~=health.state then health.state,health.successes,health.recoveredAt=nextState,0,nil trace(\"routing\",\"link_\"..nextState,{peer=peerId,misses=health.misses})end routesDirty=true end health.awaiting,health.lastProbe,health.probeToken=true,timestamp,password.newSalt(\"mesh-probe:\"..peerId)send(peerId,{type=\"mesh_probe\",body={token=health.probeToken},request_id=newRequestId()},peerId)end end end local function advertisedMembers(value,peerId,timestamp)local members={}for other,manual in pairs(value.peers)do if other~=peerId and activeLink(value,other)and linkState(other)==\"healthy\"then members[other]={label=manual.label,mode=manual.mode,masterId=manual.masterId,hops=1,kind=\"direct\"}end end for other,edge in pairs(autoEdges)do if other~=peerId and edge.expires>timestamp and linkState(other)==\"healthy\"then members[other]={label=edge.label,mode=\"peer\",hops=1,kind=\"mesh\"}end end for other in pairs(routes)do if other~=peerId and not members[other]then local candidate=primaryCandidate(other,value,false)if candidate and candidate.next~=peerId and linkState(candidate.next)==\"healthy\"then members[other]={label=candidate.label,mode=candidate.mode,masterId=candidate.masterId,hops=candidate.hops,kind=candidate.kind or\"route\"}end end end return members end local function sameAdvertisement(left,right)local leftValue,leftErr=canonical(left)local rightValue,rightErr=canonical(right)return leftValue~=nil and rightValue~=nil and not leftErr and not rightErr and leftValue==rightValue end local function advertiseRoutes(force)local timestamp,value=now(),config()if not force and not routesDirty and timestamp-lastRouteAdvertisement<ROUTE_INTERVAL then return end lastRouteAdvertisement,routesDirty=timestamp,false local full=timestamp-lastMeshFull>=MESH_FULL_INTERVAL if full then lastMeshFull=timestamp end for _,peerId in ipairs(allDirectLinks(value))do if linkUsable(value,peerId,false)then local desired,previous=advertisedMembers(value,peerId,timestamp),advertisedRoutes[peerId]or{}local members,withdrawals={},{}if full then members=desired else for target,meta in pairs(desired)do if not sameAdvertisement(meta,previous[target])then members[target]=meta end end for target in pairs(previous)do if not desired[target]then withdrawals[#withdrawals+1]=target end end end table.sort(withdrawals,function(a,b)return tostring(a)<tostring(b)end)if full or next(members)~=nil or#withdrawals>0 then routeSequence=routeSequence+1 local body={sequence=routeSequence,routeVersion=2,session=routeSession,full=full,controller=controller(value),members=members,withdrawals=withdrawals,}if send(peerId,{type=\"route_advertise\",body=body,routeSafe=true,request_id=newRequestId()})then advertisedRoutes[peerId]=copy(desired)trace(\"routing\",full and\"route_snapshot_sent\"or\"route_delta_sent\",{to=peerId,changes=(full and 0 or#withdrawals)})end end else advertisedRoutes[peerId]=nil end end end function M.start()migrateV1Links()loadSecurity()assert(meshCrypto.selfTest(),\"CeetOS mesh cryptography self-test failed\")openChannels(config())local status=M.transportStatus()trace(\"transport\",status.wireless and\"wireless_modem_detected\"or\"wireless_modem_missing\",{name=status.name})routesDirty,M._meshBootstrapAt=true,now()end function M.transportStatus(value)local wireless=wirelessModems()transport.modem,transport.wireless=#modems()>0,#wireless>0 transport.name=wireless[1]and wireless[1].name or nil local out=copy(transport)out.wirelessLinks,out.wirelessLinkCount={},#wireless for _,item in ipairs(wireless)do out.wirelessLinks[#out.wirelessLinks+1]=item.name end out.usesAllWirelessLinks,out.protocol=true,2 out.directPeers,out.manualDirectPeers,out.meshPeers,out.rekeyRequiredPeers,out.routedPeers=0,0,0,0,0 out.healthyLinks,out.degradedLinks,out.offlineLinks=0,0,0 value=value or config()for peerId,peer in pairs(value.peers)do if activePeer(value,peerId)then out.directPeers,out.manualDirectPeers=out.directPeers+1,out.manualDirectPeers+1 elseif peer.rekeyRequired then out.rekeyRequiredPeers=out.rekeyRequiredPeers+1 end end for peerId,edge in pairs(autoEdges)do if edge.expires>now()then out.meshPeers,out.directPeers=out.meshPeers+1,out.directPeers+1 end end for peerId,health in pairs(linkHealth)do if health.state==\"healthy\"then out.healthyLinks=out.healthyLinks+1 elseif health.state==\"degraded\"then out.degradedLinks=out.degradedLinks+1 elseif health.state==\"offline\"then out.offlineLinks=out.offlineLinks+1 end end for peerId,bucket in pairs(routes)do local usable=primaryCandidate(peerId,value,false)if usable and not value.peers[peerId]and not autoEdges[peerId]then out.routedPeers=out.routedPeers+1 end end local mesh=meshConfig(value)out.mesh=mesh and{id=mesh.id:sub(1,8),epoch=mesh.epoch,controller=meshAuthority(mesh,controller(value)),enrolled=true}or{enrolled=false}out.health={healthy=out.healthyLinks,degraded=out.degradedLinks,offline=out.offlineLinks}return out end function M.transportTrace(kind)if kind==\"discovery\"or kind==\"routing\"or kind==\"transport\"then return copy(traces[kind])end return{discovery=copy(traces.discovery),routing=copy(traces.routing),transport=copy(traces.transport)}end function M.discovery()expireState(now())return copy(discovery)end function M.discoveryStatus(transportStatus)expireState(now())local candidate=discovery and discovery.candidate and{id=discovery.candidate.from,label=discovery.candidate.label,mode=discovery.candidate.mode,master=discovery.candidate.master,}or nil local session=discovery and{session=discovery.id,state=discovery.state,mode=discovery.mode,master=discovery.masterSide,control=discovery.control,expires=discovery.expires,retries=discovery.retries or 0,candidate=candidate and copy(candidate)or nil,}or nil local state=session and session.state or(lastDiscovery and lastDiscovery.state or\"inactive\")return{state=state,active=session~=nil,lastState=lastDiscovery and lastDiscovery.state or\"inactive\",lastMessage=lastDiscovery and lastDiscovery.message or nil,session=session,searching=session and session.state==\"searching\"or false,candidate=candidate,discovered=#M.seenPeers(),transport=transportStatus and copy(transportStatus)or M.transportStatus(),message=(discovery and discovery.error)or(lastDiscovery and lastDiscovery.message),}end function M.startDiscovery(mode,masterSide,phrase)if activeSession()then return false,\"cancel the active discovery session first\"end local normalized,phraseErr=M.normalizePhrase(phrase)if not normalized then return false,phraseErr end mode=mode==\"master\"and\"master\"or\"peer\"masterSide=masterSide==\"joiner\"and\"joiner\"or\"initiator\"local sessionId=password.newSalt(\"discovery:\"..id())discovery={id=sessionId,state=\"hosting\",phrase=normalized,tag=phraseTag(normalized,sessionId,id()),mode=mode,masterSide=masterSide,label=label(),initiator=id(),expires=now()+DISCOVERY_TTL,control=password.newSalt(\"discovery-control:\"..id()),retries=0,lastBroadcast=0,}local sent,err=discoveryAnnouncement()if not sent then discovery=nil;setLast(\"cancelled\",err);return false,err end discovery.lastBroadcast=now()setLast(\"hosting\")return true,{state=\"hosting\",session=sessionId,expires=discovery.expires}end function M.joinDiscovery(phrase)if activeSession()then return false,\"cancel the active discovery session first\"end local normalized,phraseErr=M.normalizePhrase(phrase)if not normalized then return false,phraseErr end local candidate for _,item in pairs(discovered)do if item.expires>now()and password.constantTimeEqual(item.tag or\"\",phraseTag(normalized,item.session,item.from))then candidate=item;break end end discovery={state=\"searching\",phrase=normalized,expires=now()+DISCOVERY_TTL,control=password.newSalt(\"discovery-control:\"..id()),retries=0,lastQuery=0,}if candidate then discovery.state,discovery.candidate=\"candidate\",candidate return true,{state=\"candidate\",candidate={id=candidate.from,label=candidate.label,mode=candidate.mode,master=candidate.master}}end local sent,err=broadcast({type=\"discover_query\"})if not sent then discovery=nil;setLast(\"cancelled\",err);return false,err end discovery.lastQuery=now()setLast(\"searching\",\"waiting for matching discovery announcement\")return true,{state=\"searching\"}end function M.confirmDiscovery()if not discovery or discovery.state~=\"candidate\"or not discovery.candidate then return false,\"no discovery candidate is awaiting confirmation\"end local candidate,value=discovery.candidate,config()local existing=value.peers[tostring(candidate.from)]if existing and not existing.rekeyRequired then return false,\"computer is already a network member\"end if routes[tostring(candidate.from)]and not existing then return false,\"computer is already a routed network member\"end local nonce=password.newSalt(\"pair-join:\"..candidate.session)local proof=joinProof(discovery.phrase,candidate.session,candidate.from,id(),nonce)discovery.state,discovery.joinNonce,discovery.joinProof,discovery.lastSent,discovery.retries=\"confirming\",nonce,proof,now(),0 local sent,err=handshake(candidate.from,{type=\"pair_join\",session=candidate.session,nonce=nonce,proof=proof,label=label()})if not sent then discovery.error=err;return false,err end trace(\"discovery\",\"pair_confirmation_requested\",{peer=candidate.from})return true,{state=\"confirming\",peer=tostring(candidate.from),label=candidate.label,expires=discovery.expires}end function M.cancelDiscovery(expectedControl,source)if not discovery then return false,\"no active discovery session\"end if type(expectedControl)~=\"string\"or expectedControl==\"\"then return false,\"discovery cancellation requires the active session control token\"end if not password.constantTimeEqual(expectedControl,discovery.control or\"\")then trace(\"discovery\",\"stale_cancel_rejected\",{source=tostring(source or\"unknown\"):sub(1,32)})return false,\"discovery session changed; refresh before cancelling\"end if discovery and discovery.state==\"hosting\"then broadcast({type=\"discover_cancel\",session=discovery.id})end discovery=nil setLast(\"cancelled\",\"discovery cancelled\")trace(\"discovery\",\"session_cancelled\",{source=tostring(source or\"unknown\"):sub(1,32)})return true end function M.normalizePhrase(value)if type(value)~=\"string\"then return nil,\"phrase is required\"end if value:find(\"[%z\\1-\\31\\127]\")then return nil,\"phrase contains control characters\"end value=value:gsub(\"^%s+\",\"\"):gsub(\"%s+$\",\"\")if#value<8 then return nil,\"phrase must be at least 8 characters\"end if#value>128 then return nil,\"phrase must be at most 128 characters\"end return value end function M.tick()local timestamp=now()expireState(timestamp)if discovery then if discovery.state==\"hosting\"and timestamp-(discovery.lastBroadcast or 0)>=math.min(30000,DISCOVERY_INTERVAL*(2^math.min(discovery.retries or 0,4)))then local sent,err=discoveryAnnouncement()discovery.lastBroadcast=timestamp discovery.retries=(discovery.retries or 0)+1 if not sent then discovery.error=err end elseif discovery.state==\"searching\"and timestamp-(discovery.lastQuery or 0)>=DISCOVERY_INTERVAL then local sent,err=broadcast({type=\"discover_query\"})discovery.lastQuery,discovery.retries=timestamp,(discovery.retries or 0)+1 if not sent then discovery.error=err end elseif discovery.state==\"confirming\"and timestamp-(discovery.lastSent or 0)>=PAIR_RETRY then local candidate=discovery.candidate local sent,err=handshake(candidate.from,{type=\"pair_join\",session=candidate.session,nonce=discovery.joinNonce,proof=discovery.joinProof,label=label()})discovery.lastSent,discovery.retries=timestamp,(discovery.retries or 0)+1 if not sent then discovery.error=err end end end for sessionId,item in pairs(discovered)do if item.expires<=timestamp then discovered[sessionId]=nil end end for sessionId,record in pairs(confirmations)do if record.expires<=timestamp then confirmations[sessionId]=nil elseif timestamp-(record.lastSent or 0)>=PAIR_RETRY then queueConfirmation(record.peer,record)end end for peerId,bucket in pairs(routes)do local kept={}for _,candidate in ipairs(routeBucket(peerId).candidates)do if candidate.expires>timestamp then kept[#kept+1]=candidate end end bucket.candidates=kept if#kept==0 and not activeLink(config(),peerId)then routes[peerId],routesDirty=nil,true end end for peerId,edge in pairs(autoEdges)do if edge.expires<=timestamp then autoEdges[peerId],routesDirty=nil,true;trace(\"routing\",\"mesh_edge_expired\",{peer=peerId})end end for key,seenAt in pairs(meshSeen)do if seenAt+ROUTE_TTL<=timestamp then meshSeen[key]=nil end end for peerId,offer in pairs(meshOffers)do if offer.expires<=timestamp then meshOffers[peerId]=nil end end for requestId,seenAt in pairs(seenPackets)do if seenAt+ROUTE_TTL<=timestamp then seenPackets[requestId]=nil end end for requestId,route in pairs(reverseRoutes)do if route.expires<=timestamp then reverseRoutes[requestId]=nil end end boundMap(meshSeen,MESH_STATE_LIMIT,timestamp)boundMap(meshOffers,MESH_STATE_LIMIT,timestamp)pruneRouteBuckets(timestamp)ensureMeshEnrollment(timestamp)meshBeacon(timestamp)probeLinks(timestamp)advertiseRoutes(false)end function M.peers(value,seen)local out={}value,seen=value or config(),seen or read(SEEN_PATH,{})for peerId,peer in pairs(value.peers)do out[#out+1]={id=peerId,label=peer.label or(seen[peerId]and seen[peerId].label),role=peer.role or\"operator\",mode=peer.mode or\"peer\",master=peer.master==true,masterId=peer.masterId,direct=true,active=activePeer(value,peerId)~=nil,rekeyRequired=peer.rekeyRequired==true or peer.protocol~=2,health=linkState(peerId),auto=false,}end for peerId,edge in pairs(autoEdges)do if not value.peers[peerId]and edge.expires>now()then out[#out+1]={id=peerId,label=edge.label or(seen[peerId]and seen[peerId].label),role=\"mesh\",mode=\"peer\",direct=true,auto=true,active=true,health=linkState(peerId)}end end for peerId in pairs(routes)do if not value.peers[peerId]and not autoEdges[peerId]then local route=primaryCandidate(peerId,value,false)if route then out[#out+1]={id=peerId,label=route.label or(seen[peerId]and seen[peerId].label),role=\"routed\",mode=route.mode or\"peer\",masterId=route.masterId,routed=true,hops=route.hops,next=route.next,health=linkState(route.next),alternates=#routeBucket(peerId).candidates-1}end end end table.sort(out,function(a,b)return tonumber(a.id)<tonumber(b.id)end)return out end function M.directPeers()local out={}for _,peer in ipairs(M.peers())do if peer.direct and peer.active then out[#out+1]=peer end end return out end function M.seenPeers()local out,timestamp={},now()for peerId,item in pairs(read(SEEN_PATH,{}))do if type(item)==\"table\"and tonumber(item.seen)and tonumber(item.seen)+SEEN_PEER_TTL>timestamp then out[#out+1]={id=peerId,label=item.label,seen=item.seen,session=item.session}end end table.sort(out,function(a,b)return tonumber(a.seen)>tonumber(b.seen)end)while#out>SEEN_PEER_LIMIT do table.remove(out)end table.sort(out,function(a,b)return tonumber(a.id)<tonumber(b.id)end)return out end function M.routeStatus(target,value)value,out=value or config(),{}local function row(peerId)local selected=primaryCandidate(peerId,value,false)if not selected then return end local health=healthFor(selected.next)local alternates={}for _,candidate in ipairs(validCandidates(peerId,value))do if tostring(candidate.next)~=tostring(selected.next)then local state=healthFor(candidate.next)alternates[#alternates+1]={next=candidate.next,hops=candidate.hops,kind=candidate.kind or\"route\",health=state.state,loss=state.loss or 0,rtt=state.rtt,distance=state.lastDistance}end end table.sort(alternates,compareCandidates)while#alternates>ROUTE_CANDIDATE_LIMIT-1 do table.remove(alternates)end out[#out+1]={id=tostring(peerId),label=selected.label,next=selected.next,hops=selected.hops,kind=selected.kind or\"route\",health=health.state,loss=health.loss or 0,rtt=health.rtt,distance=health.lastDistance,selectedAt=routeBucket(peerId).changedAt,reason=routeBucket(peerId).reason,alternates=alternates,}end if target then row(tostring(target))else local ids,seen={},{}for peerId in pairs(value.peers)do ids[#ids+1],seen[peerId]=peerId,true end for peerId in pairs(autoEdges)do if not seen[peerId]then ids[#ids+1],seen[peerId]=peerId,true end end for peerId in pairs(routes)do if not seen[peerId]then ids[#ids+1],seen[peerId]=peerId,true end end table.sort(ids,function(a,b)return tonumber(a)<tonumber(b)end)for _,peerId in ipairs(ids)do row(peerId)end end return out end function M.statusSnapshot(compact)local value,seen=config(),read(SEEN_PATH,{})local transport=M.transportStatus(value)local snapshot={protocol=2,transport=transport,discovery=M.discoveryStatus(transport),peers=M.peers(value,seen),routes=M.routeStatus(nil,value),controller=M.controller(),}if compact~=true then snapshot.trace=M.transportTrace()end return snapshot end function M.controller()return controller()end function M.isDirectController(from,packet)return tostring(from)==tostring(controller())and type(packet)==\"table\"and tostring(packet.origin or\"\")==tostring(from)end function M.setController(value)assert(tonumber(value),\"controller must be a computer ID\")local saved=config();saved.controller=tostring(value);save(saved);routesDirty=true audit.log(\"local\",\"jobs.controller\",{controller=saved.controller})return saved.controller end function M.request(target,typeName,body,options)if type(typeName)~=\"string\"or#typeName==0 or#typeName>64 then return false,\"invalid request type\"end local destination=tostring(target)local value=config()if not primaryCandidate(destination,value,options and options.safe==true)then return false,\"peer is unreachable, degraded, or requires rekey\"end return send(destination,{type=typeName,body=body or{},origin=id(),routeSafe=options and options.safe==true,balanceSafe=options and options.safe==true,confidential=options and options.confidential==true,request_id=newRequestId()})end function M.reply(request,typeName,body,options)if type(request)~=\"table\"or type(typeName)~=\"string\"or#typeName==0 or#typeName>64 then return false,\"invalid reply\"end local requestId,destination=request.request_id,tostring(request.origin or\"\")local reverse=type(requestId)==\"string\"and reverseRoutes[requestId]or nil if destination==\"\"or not reverse or reverse.expires<=now()or reverse.origin~=destination then return false,\"reverse reply route is unavailable\"end return send(destination,{type=typeName,body=body or{},origin=id(),destination=destination,reply_to=requestId,routeSafe=options and options.safe==true,confidential=options and options.confidential==true,request_id=newRequestId(),},reverse.previous)end function M.offer()return false,\"legacy pairing is disabled; use phrase discovery\"end function M.accept()return false,\"legacy pairing is disabled; use phrase discovery\"end function M.discover()return broadcast({type=\"discover_query\"})end rejectPacket=function(reason,packet,channel,distance)transport.rejected=transport.rejected+1 trace(\"transport\",\"packet_rejected\",{reason=reason,type=type(packet)==\"table\"and packet.type or nil,channel=channel,distance=distance,from=type(packet)==\"table\"and packet.from or nil})end local function handleDiscovery(packet,channel,distance)local from=tostring(packet.from)if packet.type==\"discover_cancel\"and isBroadcast(packet.to)then discovered[tostring(packet.session)]=nil trace(\"discovery\",\"cancel_received\",{from=from,distance=distance})return end if packet.type==\"discover_query\"and isBroadcast(packet.to)and discovery and discovery.state==\"hosting\"then discoveryAnnouncement()trace(\"discovery\",\"query_answered\",{from=from,distance=distance})return end if packet.type==\"discover\"and isBroadcast(packet.to)and from~=id()then if type(packet.session)~=\"string\"or#packet.session<16 or type(packet.tag)~=\"string\"or#packet.tag~=64 then return rejectPacket(\"malformed_discovery\",packet,channel,distance)end local timestamp=now()for sessionId,item in pairs(discovered)do if item.expires<=timestamp then discovered[sessionId]=nil end end if discovery and(discovery.state==\"searching\"or discovery.state==\"candidate\")and password.constantTimeEqual(packet.tag,phraseTag(discovery.phrase,packet.session,from))then local expires,candidates=tonumber(packet.expires)or(timestamp+DISCOVERY_TTL),0 for _ in pairs(discovered)do candidates=candidates+1 end if not discovered[packet.session]and candidates>=DISCOVERY_CANDIDATE_LIMIT then return rejectPacket(\"discovery candidate capacity reached\",packet,channel,distance)end discovered[packet.session]={session=packet.session,from=from,tag=packet.tag,label=tostring(packet.label or(\"Computer \"..from)):sub(1,128),mode=packet.mode==\"master\"and\"master\"or\"peer\",master=packet.master==\"joiner\"and\"joiner\"or\"initiator\",expires=math.min(expires,timestamp+DISCOVERY_TTL)}trace(\"discovery\",\"announcement_received\",{from=from,label=packet.label,distance=distance})local value,existing=config(),config().peers[from]if existing and not existing.rekeyRequired then markRejected(\"computer is already a direct peer\")elseif routes[from]and not existing then markRejected(\"computer is already a routed network member\")elseif discovery.state==\"searching\"then discovery.state,discovery.candidate,discovery.error=\"candidate\",discovered[packet.session],nil setLast(\"candidate\",\"matching computer found; confirm pairing\")trace(\"discovery\",\"candidate_found\",{from=from,label=packet.label,distance=distance})end end return end end local function handlePairJoin(packet,distance)if not discovery or discovery.state~=\"hosting\"or packet.session~=discovery.id then return end local from=tostring(packet.from)local value,existing=config(),config().peers[from]local repairingOfflineLink=existing and not existing.rekeyRequired and linkState(from)==\"offline\"if((existing and not existing.rekeyRequired and not repairingOfflineLink)or(routes[from]and not existing))then handshake(from,{type=\"pair_reject\",session=packet.session,reason=\"already_network_member\"})trace(\"discovery\",\"pair_rejected\",{from=from,reason=\"already_network_member\"})return end if type(packet.nonce)~=\"string\"or#packet.nonce<16 or#packet.nonce>128 or type(packet.proof)~=\"string\"or#packet.proof~=64 then return rejectPacket(\"malformed_pair_join\",packet,nil,distance)end local expected=joinProof(discovery.phrase,discovery.id,id(),from,packet.nonce)if not password.constantTimeEqual(expected,packet.proof)then discovery.failures=(discovery.failures or 0)+1 if discovery.failures>=5 then markRejected(\"too many invalid pairing proofs\")end handshake(from,{type=\"pair_reject\",session=packet.session,reason=\"phrase_mismatch\"})trace(\"discovery\",\"pair_rejected\",{from=from,reason=\"phrase_mismatch\"})return end local masterId=discovery.mode==\"master\"and(discovery.masterSide==\"initiator\"and id()or from)or\"\"local key,keyErr=linkKey(discovery.phrase,discovery.id,id(),from,packet.nonce)if not key then return markRejected(keyErr)end local persisted,persistErr=persistPair(from,key,{mode=discovery.mode,label=packet.label},masterId)if not persisted then handshake(from,{type=\"pair_reject\",session=packet.session,reason=\"persistence_failed\"})trace(\"discovery\",\"pair_rejected\",{from=from,reason=\"persistence_failed\",error=persistErr})markRejected(\"could not save pairing\")return false end local record={id=discovery.id,peer=from,joinNonce=packet.nonce,mode=discovery.mode,masterId=masterId,label=label(),key=key,keyId=keyId(key),expires=now()+DISCOVERY_TTL}record.confirmProof=confirmProof(discovery.phrase,record.id,id(),from,record.joinNonce,record.mode,record.masterId)discovery=nil setLast(\"paired\",\"awaiting pairing acknowledgement\")trace(\"discovery\",repairingOfflineLink and\"pair_repair_verified\"or\"pair_join_verified\",{from=from,distance=distance})return queueConfirmation(from,record)end local function handlePairConfirm(packet,distance)if not discovery or discovery.state~=\"confirming\"or not discovery.candidate or packet.session~=discovery.candidate.session then return end local from=tostring(packet.from)if from~=tostring(discovery.candidate.from)or packet.nonce~=discovery.joinNonce then return rejectPacket(\"unexpected_pair_confirmation\",packet,nil,distance)end local expected=confirmProof(discovery.phrase,packet.session,from,id(),discovery.joinNonce,packet.mode==\"master\"and\"master\"or\"peer\",packet.master or\"\")if not password.constantTimeEqual(expected,packet.proof or\"\")then return markRejected(\"pair confirmation proof did not match\")end local key,err=linkKey(discovery.phrase,packet.session,from,id(),discovery.joinNonce)if not key then return markRejected(err)end local persisted,persistErr=persistPair(from,key,{mode=packet.mode,label=packet.label},packet.master)if not persisted then handshake(from,{type=\"pair_reject\",session=packet.session,reason=\"persistence_failed\",proof=password.hmacSha256(key,\"ceetos/pair/reject/v2|\"..packet.session..\"|\"..id()..\"|\"..from..\"|persistence_failed\")})trace(\"discovery\",\"pair_persistence_failed\",{from=from,error=persistErr})markRejected(\"could not save pairing\")return false end local sessionId=packet.session discovery=nil setLast(\"paired\",\"paired with \"..tostring(packet.label or from))handshake(from,{type=\"pair_ack\",session=sessionId,proof=password.hmacSha256(key,\"ceetos/pair/ack/v2|\"..sessionId)})meshEnrollmentSends[tostring(from)]=nil ensureMeshEnrollment(now())trace(\"discovery\",\"pair_confirmed\",{from=from,distance=distance})return true end local function handlePairAck(packet)local record=confirmations[packet.session]if not record or tostring(record.peer)~=tostring(packet.from)then return end local value,peer=config(),activePeer(config(),record.peer)if not peer then return end local expected=password.hmacSha256(peer.key,\"ceetos/pair/ack/v2|\"..packet.session)if password.constantTimeEqual(expected,packet.proof or\"\")then confirmations[packet.session]=nil setLast(\"paired\",\"paired with \"..tostring(record.peer))meshEnrollmentSends[tostring(record.peer)]=nil ensureMeshEnrollment(now())routesDirty=true trace(\"discovery\",\"pair_acknowledged\",{from=packet.from})end end local function handleRouteAdvertisement(from,packet)local body=packet.body if type(body)~=\"table\"or type(body.sequence)~=\"number\"or type(body.members)~=\"table\"or(body.withdrawals~=nil and type(body.withdrawals)~=\"table\")then return rejectPacket(\"malformed_route_advertisement\",packet)end local key=tostring(from)M._routeSequences=M._routeSequences or{}local session=body.session if session~=nil and(type(session)~=\"string\"or#session<16 or#session>128)then return rejectPacket(\"invalid_route_advertisement_session\",packet)end session=session or\"legacy\"local previous=M._routeSequences[key]local sessionChanged=type(previous)==\"table\"and previous.session~=session if sessionChanged and body.full~=true then return rejectPacket(\"route_advertisement_session_requires_full_snapshot\",packet)end if type(previous)==\"table\"and previous.session==session and previous.sequence>=body.sequence then return end if type(previous)==\"number\"and session==\"legacy\"and previous>=body.sequence then return end M._routeSequences[key]={session=session,sequence=body.sequence}local value,changed,count=config(),false,0 if sessionChanged then for _,bucket in pairs(routes)do if type(bucket.candidates)==\"table\"then local kept={}for _,candidate in ipairs(bucket.candidates)do if tostring(candidate.next)~=key then kept[#kept+1]=candidate else changed=true end end bucket.candidates=kept end end trace(\"routing\",\"route_advertisement_session_reset\",{from=from})end if body.controller and not value.controller then value.controller,changed=tostring(body.controller),true end local announced={}for advertisedId,meta in pairs(body.members)do count=count+1 if count>MAX_PACKET_TABLE then return rejectPacket(\"route_advertisement_too_large\",packet)end local peerId=tostring(advertisedId)announced[peerId]=true if peerId~=id()and peerId~=key and type(meta)==\"table\"then local hops=math.floor(tonumber(meta.hops)or 0)+1 if hops>1 and hops<=PACKET_TTL and type(meta.label)~=\"table\"and type(meta.mode)~=\"table\"then local bucket,found=routeBucket(peerId),nil for _,candidate in ipairs(bucket.candidates)do if tostring(candidate.next)==key then found=candidate;break end end if found then local metadataChanged=found.hops~=hops or found.label~=meta.label or found.mode~=meta.mode or tostring(found.masterId or\"\")~=tostring(meta.masterId or\"\")or found.kind~=(meta.kind or\"route\")found.hops,found.expires=hops,now()+ROUTE_TTL found.label,found.mode,found.masterId,found.kind=meta.label,meta.mode,meta.masterId,meta.kind or\"route\"if metadataChanged then changed=true end else bucket.candidates[#bucket.candidates+1]={next=key,hops=hops,expires=now()+ROUTE_TTL,label=type(meta.label)==\"string\"and meta.label:sub(1,128)or nil,mode=meta.mode==\"master\"and\"master\"or\"peer\",masterId=meta.masterId and tostring(meta.masterId)or nil,kind=meta.kind==\"mesh\"and\"mesh\"or\"route\"}table.sort(bucket.candidates,compareCandidates)while#bucket.candidates>ROUTE_CANDIDATE_LIMIT do table.remove(bucket.candidates)end changed=true end end end end local withdrawals=body.withdrawals or{}for _,withdrawnId in pairs(withdrawals)do count=count+1 if count>MAX_PACKET_TABLE then return rejectPacket(\"route_advertisement_too_large\",packet)end local bucket=routes[tostring(withdrawnId)]if bucket and type(bucket.candidates)==\"table\"then local kept={}for _,candidate in ipairs(bucket.candidates)do if tostring(candidate.next)~=key then kept[#kept+1]=candidate else changed=true end end bucket.candidates=kept end end if body.full==true then for peerId,bucket in pairs(routes)do if type(bucket.candidates)==\"table\"and not announced[tostring(peerId)]then local kept={}for _,candidate in ipairs(bucket.candidates)do if tostring(candidate.next)~=key then kept[#kept+1]=candidate else changed=true end end bucket.candidates=kept end end end if changed then if value.controller then save(value)end;routesDirty=true;trace(\"routing\",\"route_table_updated\",{from=from})end end local function handleProbe(from,packet)local token=type(packet.body)==\"table\"and packet.body.token if type(token)~=\"string\"or#token<16 or#token>128 then return rejectPacket(\"malformed link probe\",packet)end touchLink(from,nil,\"probe\")return send(from,{type=\"mesh_probe_ack\",body={token=token},request_id=newRequestId()},from)end local function handleProbeAck(from,packet,distance)local health,token=healthFor(from),type(packet.body)==\"table\"and packet.body.token if not health.awaiting or token~=health.probeToken then return rejectPacket(\"unexpected link probe acknowledgement\",packet)end local sample=math.max(0,now()-(health.lastProbe or now()))health.rtt=health.rtt and math.floor((health.rtt*3+sample)/4)or sample health.awaiting,health.misses,health.probeToken=false,0,nil touchLink(from,distance,\"probe_ack\")if autoEdges[from]then autoEdges[from].expires=now()+ROUTE_TTL end trace(\"routing\",\"packet_received\",{type=packet.type,from=from,destination=packet.destination,distance=distance})end function M.handle(event)if event[1]==\"peripheral\"or event[1]==\"peripheral_detach\"then M.invalidateTransport()openChannels(config())return true end if event[1]~=\"modem_message\"then return end local channel,packet,distance=event[3],event[5],event[6]local expected=false for _,item in ipairs(transport.channels or{})do if channel==item then expected=true;break end end if not expected then return rejectPacket(\"unexpected_channel\",packet,channel,distance)end transport.lastReceive,transport.lastDistance=now(),distance if type(packet)~=\"table\"then return rejectPacket(\"packet_not_table\",packet,channel,distance)end if packet.protocol==PUBLIC_UPDATE_PROTOCOL then if channel~=DISCOVERY_CHANNEL or not PUBLIC_UPDATE_TYPES[packet.type]or type(packet.from)~=\"string\"and type(packet.from)~=\"number\"or not(isForUs(packet.to)or isBroadcast(packet.to))then return rejectPacket(\"invalid_public_update_packet\",packet,channel,distance)end local encoded,encodeErr=canonical(packet.body or{})if not encoded then return rejectPacket(\"invalid_public_update_body:\"..tostring(encodeErr),packet,channel,distance)end trace(\"transport\",\"public_update_received\",{type=packet.type,from=packet.from,distance=distance,bytes=#encoded})if M.publicHandler then return M.publicHandler(packet,distance)end return end local discoveryPacket=packet.type==\"discover\"or packet.type==\"discover_query\"or packet.type==\"discover_cancel\"local handshakePacket=packet.type==\"pair_join\"or packet.type==\"pair_confirm\"or packet.type==\"pair_ack\"or packet.type==\"pair_reject\"local meshPacketType=packet.type==\"mesh_beacon\"or packet.type==\"mesh_edge_offer\"or packet.type==\"mesh_edge_accept\"if discoveryPacket then if packet.protocol~=PROTOCOL or channel~=DISCOVERY_CHANNEL then return rejectPacket(\"invalid_discovery_transport\",packet,channel,distance)end return handleDiscovery(packet,channel,distance)end if handshakePacket then if not isForUs(packet.to)then return end if packet.protocol~=PROTOCOL or channel~=DISCOVERY_CHANNEL then return rejectPacket(\"invalid_handshake_transport\",packet,channel,distance)end if packet.type==\"pair_join\"then return handlePairJoin(packet,distance)elseif packet.type==\"pair_confirm\"then return handlePairConfirm(packet,distance)elseif packet.type==\"pair_ack\"then return handlePairAck(packet)elseif packet.type==\"pair_reject\"then if packet.reason==\"persistence_failed\"and rollbackPendingConfirmation(packet)then return end if discovery then markRejected(\"pairing rejected: \"..tostring(packet.reason or\"remote peer rejected it\"));return end end return end if meshPacketType then if packet.protocol~=PROTOCOL or channel~=(config().channel or CHANNEL)then return rejectPacket(\"invalid mesh transport\",packet,channel,distance)end if packet.type~=\"mesh_beacon\"and not isForUs(packet.to)then return end return handleMeshPacket(packet,distance)end if not isForUs(packet.to)then return end local value=config()local valid,peerOrReason=verifyPacket(packet,value)if not valid then return rejectPacket(peerOrReason,packet,channel,distance)end local peer,from=peerOrReason,tostring(packet.from)if packet.confidential==true then local opened,openErr=openBody(peer,packet)if not opened then return rejectPacket(openErr or\"could not open confidential packet\",packet,channel,distance)end packet.body=opened end if packet.type==\"mesh_probe_ack\"then return handleProbeAck(from,packet,distance)end touchLink(from,distance,\"authenticated_packet\")if autoEdges[from]then autoEdges[from].expires=now()+ROUTE_TTL end trace(\"routing\",\"packet_received\",{type=packet.type,from=from,destination=packet.destination,distance=distance})if packet.type==\"mesh_enroll\"then return acceptEnrollment(from,peer,packet)end if packet.type==\"mesh_probe\"then return handleProbe(from,packet)end if packet.type==\"route_advertise\"then return handleRouteAdvertisement(from,packet)end if packet.reply_to and packet.destination and tostring(packet.destination)~=id()then local reverse=reverseRoutes[packet.reply_to]if not reverse or reverse.expires<=now()or reverse.origin~=tostring(packet.destination)then return rejectPacket(\"reverse reply route unavailable\",packet,channel,distance)end local requestId=tostring(packet.request_id or\"\")if requestId==\"\"or not admitSeenPacket(requestId)then return trace(\"routing\",\"forward_duplicate\",{from=from,type=packet.type})end if(tonumber(packet.ttl)or 0)<=1 then return rejectPacket(\"TTL exhausted\",packet,channel,distance)end packet.ttl=packet.ttl-1 trace(\"routing\",\"reverse_reply_forwarded\",{from=from,to=reverse.previous,type=packet.type})return send(packet.destination,packet,reverse.previous)end if packet.destination and tostring(packet.destination)~=id()then local requestId=tostring(packet.request_id or\"\")if requestId==\"\"or not admitSeenPacket(requestId)then return trace(\"routing\",\"forward_duplicate\",{from=from,type=packet.type})end local remembered,rememberErr=rememberReverse(packet,from)if not remembered then return rejectPacket(rememberErr or\"could not record reverse route\",packet,channel,distance)end if(tonumber(packet.ttl)or 0)<=1 then return rejectPacket(\"TTL exhausted\",packet,channel,distance)end packet.ttl=packet.ttl-1 return send(packet.destination,packet)end local requestId=tostring(packet.request_id or\"\")if requestId==\"\"then return rejectPacket(\"missing request ID\",packet,channel,distance)end if not admitSeenPacket(requestId)then return trace(\"routing\",\"destination_duplicate\",{from=from,type=packet.type})end local remembered,rememberErr=rememberReverse(packet,from)if not remembered then return rejectPacket(rememberErr or\"could not record reverse route\",packet,channel,distance)end packet.authenticatedHop,packet.originVerified=from,false if M.handler then local handled,handlerErr=M.handler(from,peer,packet)if handled==false then trace(\"routing\",\"handler_rejected\",{type=packet.type,from=from,error=tostring(handlerErr or\"handler rejected\"):sub(1,120)})elseif handled==nil then trace(\"routing\",\"handler_unhandled\",{type=packet.type,from=from})end return handled,handlerErr end end return M",
  ["ceetos/lib/network_ipc.lua"] = "local store=require(\"ceetos.lib.store\")local M={}local ROOT=\"/ceetos/data/network-ipc\"local COMMANDS=ROOT..\"/commands\"local RESULTS=ROOT..\"/results\"M.EVENT=\"ceetos_network_ipc\"M.RESULT_EVENT=\"ceetos_network_ipc_result\"local function ensure(path)if not fs.exists(path)then fs.makeDir(path)end end local function safeId(value)return type(value)==\"string\"and value:match(\"^[%w_%-%.]+$\")and#value<=160 end local function path(directory,requestId)return fs.combine(directory,requestId..\".lua\")end function M.submit(request)if type(request)~=\"table\"or not safeId(request.id)then return false,\"invalid IPC request ID\"end ensure(ROOT);ensure(COMMANDS);ensure(RESULTS)local target=path(COMMANDS,request.id)if fs.exists(target)then return false,\"IPC request already exists\"end local ok,err=store.write(target,request)if ok and os and os.queueEvent then pcall(os.queueEvent,M.EVENT,request.id)end return ok,err end function M.take()ensure(ROOT);ensure(COMMANDS);ensure(RESULTS)local names=fs.list(COMMANDS)table.sort(names)for _,name in ipairs(names)do local requestId=name:match(\"^([%w_%-%.]+)%.lua$\")if requestId and safeId(requestId)then local target=fs.combine(COMMANDS,name)store.invalidate(target)local request=store.readFresh(target,nil)fs.delete(target)if type(request)==\"table\"and request.id==requestId then return request end end end end function M.pending()ensure(ROOT);ensure(COMMANDS);ensure(RESULTS)for _,name in ipairs(fs.list(COMMANDS))do local requestId=name:match(\"^([%w_%-%.]+)%.lua$\")if requestId and safeId(requestId)then return true end end return false end function M.reply(requestId,value)if not safeId(requestId)or type(value)~=\"table\"then return false,\"invalid IPC result\"end ensure(ROOT);ensure(COMMANDS);ensure(RESULTS)local ok,err=store.write(path(RESULTS,requestId),value)if ok then if os and os.queueEvent then pcall(os.queueEvent,M.RESULT_EVENT,requestId)end return true end local compact={id=requestId,ok=false,error=\"could not encode IPC result: \"..tostring(err or\"unknown error\"):sub(1,160),}local fallbackOk,fallbackErr=store.write(path(RESULTS,requestId),compact)if fallbackOk then if os and os.queueEvent then pcall(os.queueEvent,M.RESULT_EVENT,requestId)end return true end return false,tostring(err or fallbackErr or\"could not commit IPC result\")end local function readResult(target,expectedId)local handle=fs.open(target,\"r\")if not handle then return nil,\"could not open committed IPC result\"end local raw=handle.readAll()handle.close()local ok,result=pcall(textutils.unserialise,raw)if not ok or type(result)~=\"table\"then return nil,\"invalid committed IPC result encoding\"end if result.id~=expectedId then return nil,\"IPC result request ID mismatch\"end return result end function M.poll(requestId,consume)if not safeId(requestId)then return nil,\"invalid IPC request ID\"end local target=path(RESULTS,requestId)local result,directErr=readResult(target,requestId)if result then if consume then fs.delete(target)end return result end if fs.exists(target)then return nil,directErr end for _,name in ipairs(fs.list(RESULTS))do if name:match(\"^[%w_%-%.]+%.lua$\")then local candidate=fs.combine(RESULTS,name)local handle=fs.open(candidate,\"r\")local raw=handle and handle.readAll()or nil if handle then handle.close()end local decoded,result=pcall(textutils.unserialise,raw or\"\")if decoded and type(result)==\"table\"and result.id==requestId then if consume then fs.delete(candidate)end return result end end end return nil end function M.await(requestId,timeout,options)if not safeId(requestId)then return nil,\"invalid IPC request ID\"end ensure(ROOT);ensure(COMMANDS);ensure(RESULTS)options=type(options)==\"table\"and options or{}local pullEvent=options.pullEvent or(os and os.pullEventRaw)local startTimer=options.startTimer or(os and os.startTimer)local now=options.now or function()return os.epoch(\"utc\")end if type(pullEvent)~=\"function\"or type(startTimer)~=\"function\"then return nil,\"event wait is unavailable\"end local duration=math.max(1,math.floor(tonumber(timeout)or 5000))local deadline=now()+duration local result,err=M.poll(requestId,true)if result or err then return result,err end local timer=startTimer(duration/1000)while true do local event={pullEvent()}if event[1]==M.RESULT_EVENT and tostring(event[2]or\"\")==requestId then result,err=M.poll(requestId,true)if result or err then return result,err end elseif event[1]==\"timer\"and event[2]==timer then result,err=M.poll(requestId,true)if result or err then return result,err end return nil,\"CeetOS network service did not respond\"end if now()>=deadline then result,err=M.poll(requestId,true)if result or err then return result,err end return nil,\"CeetOS network service did not respond\"end end end function M.prune(limit)ensure(ROOT);ensure(COMMANDS);ensure(RESULTS)limit=math.max(1,math.floor(tonumber(limit)or 32))local names={}for _,name in ipairs(fs.list(RESULTS))do if name:match(\"^[%w_%-%.]+%.lua$\")then names[#names+1]=name end end table.sort(names)while#names>limit do fs.delete(fs.combine(RESULTS,table.remove(names,1)))end end function M.status()ensure(ROOT);ensure(COMMANDS);ensure(RESULTS)local function count(directory)local total=0 for _,name in ipairs(fs.list(directory))do if name:match(\"^[%w_%-%.]+%.lua$\")then total=total+1 end end return total end return{commands=count(COMMANDS),results=count(RESULTS)}end function M.inspect(limit)ensure(ROOT);ensure(COMMANDS);ensure(RESULTS)limit=math.max(1,math.min(16,math.floor(tonumber(limit)or 8)))local function ids(directory)local out={}for _,name in ipairs(fs.list(directory))do local requestId=name:match(\"^([%w_%-%.]+)%.lua$\")if requestId and safeId(requestId)then out[#out+1]=requestId end end table.sort(out)while#out>limit do table.remove(out,1)end return out end local commandIds,resultIds=ids(COMMANDS),ids(RESULTS)return{commands=#commandIds,results=#resultIds,commandIds=commandIds,resultIds=resultIds}end return M",
  ["ceetos/lib/devbridge_policy.lua"] = "local M={}function M.isLoopbackUrl(url)return type(url)==\"string\"and(url:match(\"^wss?://127%.0%.0%.1[:/]\")or url:match(\"^wss?://localhost[:/]\")or url:match(\"^wss?://%[::1%][:/]\"))~=nil end function M.allowsUnattendedCraftProbe(connection,lease,profileId,now)if profileId~=\"desktop\"or type(connection)~=\"table\"or type(lease)~=\"table\"then return false end if connection.autoConnect~=true or(connection.source~=\"devbuild-installer\"and connection.source~=\"devbuild-recovery\")then return false end if connection.token~=nil and connection.token~=\"\"then return false end if not M.isLoopbackUrl(connection.url)then return false end return tonumber(lease.untilAt or 0)>tonumber(now or 0)end function M.isCraftProbeCommand(command)if type(command)~=\"table\"or command.devProbe~=true or type(command.token)~=\"string\"then return false end if not command.token:match(\"^dev%-e2e%-%d+%-%d+%-%d%d$\")then return false end if command.action==\"mode\"then return command.value==true end if command.action==\"destination\"then return type(command.value)==\"string\"and#command.value>0 and#command.value<=64 and not command.value:find(\"[%c]\")end if command.action==\"add\"then local count=tonumber(command.count)return type(command.name)==\"string\"and command.name:match(\"^[%w_.%-]+:[%w_./%-]+$\")~=nil and count and count>=1 and count<=256 and count==math.floor(count)end return command.action==\"submit\"end return M",
  ["ceetos/lib/service_tick.lua"] = "local M={}function M.new(intervalMs)return{interval=math.max(25,math.min(1000,math.floor(tonumber(intervalMs)or 250))),next=0,}end function M.due(state,timestamp,force)if type(state)~=\"table\"then return false end timestamp=math.max(0,math.floor(tonumber(timestamp)or 0))if force or timestamp>=(tonumber(state.next)or 0)then state.next=timestamp+math.max(25,math.floor(tonumber(state.interval)or 250))return true end return false end function M.claim(state,timestamp,explicit,pending,claim)if type(pending)~=\"function\"or type(claim)~=\"function\"then return false end if not M.due(state,timestamp,explicit)then return false end if not explicit and not pending()then return false end claim()return true end return M",
  ["ceetos/lib/network_runtime.lua"] = "local serviceTick=require(\"ceetos.lib.service_tick\")local M={}local Runtime={}Runtime.__index=Runtime local function interval(value,fallback)value=tonumber(value)or fallback return math.max(0.05,math.min(value,60))end local function bounded(value)return tostring(value or\"runtime callback failed\"):sub(1,240)end function M.new(options)options=options or{}assert(type(options.now)==\"function\",\"network runtime requires now\")assert(type(options.startTimer)==\"function\",\"network runtime requires startTimer\")assert(type(options.handle)==\"function\",\"network runtime requires a packet handler\")local tasks={}for _,task in ipairs(options.tasks or{})do assert(type(task)==\"table\"and type(task.name)==\"string\"and task.name~=\"\",\"invalid network runtime task\")assert(type(task.run)==\"function\",\"network runtime task requires run\")tasks[#tasks+1]={name=task.name,initial=interval(task.initial,task.interval or 1),interval=interval(task.interval,1),run=task.run,dueAt=0,runs=0,lastRun=nil,}end local ipc=options.ipc or{}local runtime=setmetatable({now=options.now,startTimer=options.startTimer,pullEvent=options.pullEvent,handle=options.handle,onEvent=type(options.onEvent)==\"function\"and options.onEvent or nil,onFault=type(options.onFault)==\"function\"and options.onFault or function()end,tasks=tasks,tasksByName={},taskTimers={},started=false,events=0,ipc={event=ipc.event,interval=interval(ipc.interval,0.5),timer=nil,pump=serviceTick.new(ipc.cadence or 250),pending=type(ipc.pending)==\"function\"and ipc.pending or function()return false end,claim=type(ipc.claim)==\"function\"and ipc.claim or function()end,},},Runtime)for _,task in ipairs(tasks)do runtime.tasksByName[task.name]=task end return runtime end function Runtime:report(scope,errorText)pcall(self.onFault,tostring(scope),bounded(errorText))end function Runtime:invoke(scope,callback,...)local arguments={...}local unpackArguments=table.unpack or unpack local ok,result=xpcall(function()return callback(unpackArguments(arguments))end,bounded)if not ok then self:report(scope,result)end return ok,result end function Runtime:schedule(task,delay)local seconds=interval(delay,task.interval)self.taskTimers[task.name]=self.startTimer(seconds)task.dueAt=self.now()+math.floor(seconds*1000)end function Runtime:reschedule(name,delay)local task=self.tasksByName[tostring(name or\"\")]if not task then return false,\"unknown network runtime task\"end self:schedule(task,delay)return true end function Runtime:start()if self.started then return end self.started=true self.ipc.timer=self.startTimer(self.ipc.interval)for _,task in ipairs(self.tasks)do self:schedule(task,task.initial)end end function Runtime:step(event)assert(type(event)==\"table\",\"network runtime event must be a table\")self:start()self.events=self.events+1 local explicitIpc=event[1]==self.ipc.event or(event[1]==\"timer\"and event[2]==self.ipc.timer)local function claim()local ok,result=self:invoke(\"ipc\",self.ipc.claim)return ok and result end local function pending()local ok,result=self:invoke(\"ipc.pending\",self.ipc.pending)return ok and result==true end serviceTick.claim(self.ipc.pump,self.now(),explicitIpc,pending,claim)self:invoke(\"packet\",self.handle,event)if event[1]==\"timer\"and event[2]==self.ipc.timer then self.ipc.timer=self.startTimer(self.ipc.interval)end if self.onEvent then self:invoke(\"event\",self.onEvent,event)end local timestamp=self.now()for _,task in ipairs(self.tasks)do local fired=event[1]==\"timer\"and event[2]==self.taskTimers[task.name]if fired or timestamp>=(tonumber(task.dueAt)or 0)then local ok,delay=self:invoke(\"task.\"..task.name,task.run,event)task.runs,task.lastRun=task.runs+1,timestamp self:schedule(task,ok and delay or task.interval)end end return true end function Runtime:run()assert(type(self.pullEvent)==\"function\",\"network runtime requires pullEvent to run\")self:start()while true do self:step({self.pullEvent()})end end function Runtime:status()local timers={}local tasks={}for name,timer in pairs(self.taskTimers)do timers[name]=timer end for _,task in ipairs(self.tasks)do tasks[task.name]={dueAt=task.dueAt,runs=task.runs,lastRun=task.lastRun}end return{started=self.started,events=self.events,ipcTimer=self.ipc.timer,taskTimers=timers,tasks=tasks}end return M",
  ["ceetos/lib/auth_client.lua"] = "local store=require(\"ceetos.lib.store\")local password=require(\"ceetos.lib.password\")local networkIpc=require(\"ceetos.lib.network_ipc\")local meshCrypto=require(\"ceetos.lib.mesh_crypto\")local M={}local REPLIES=\"/ceetos/data/auth-replies\"local DEFERRED=REPLIES..\"/deferred\"local PENDING_MARKERS=REPLIES..\"/pending\"local AUTH_REPLY_TIMEOUT,AUTH_BEGIN_ATTEMPTS,REPLY_RETENTION_MS=15000,3,90000 local AUTH_BEGIN_TIMEOUT=4000 local AUTH_SEND_ATTEMPTS,AUTH_SEND_RETRY_MS=3,1200 local DEFERRED_RETENTION_MS,DEFERRED_LIMIT=20000,16 local sequence=0 local pending={}local PENDING_LIMIT=32 local delivery={received=0,stored=0,pending=0,lastId=nil,lastAt=0,lastError=nil}local function now()return os.epoch(\"utc\")end local function authority()store.invalidate(\"/ceetos/data/auth-authority.lua\")local value=store.read(\"/ceetos/data/auth-authority.lua\",nil)return type(value)==\"table\"and value.active==true and value or nil end local function requestId(kind)sequence=sequence+1 return table.concat({\"auth\",kind,tostring(os.getComputerID()),tostring(now()),tostring(sequence)},\"-\")end local function validId(id)return type(id)==\"string\"and id:match(\"^[%w_%-%.]+$\")and#id<=160 end local function replyPath(id)return validId(id)and fs.combine(REPLIES,id..\".lua\")or nil end local function proofResultAad(authorityId,nodeId,requestId,challengeId,challenge)return table.concat({\"ceetos/auth/login/result/v2\",tostring(authorityId),tostring(nodeId),tostring(requestId),tostring(challengeId),tostring(challenge),},\"|\")end local function openRoutedLoginResult(body,expected)if tostring(body.authority or\"\")~=tostring(expected.authority)or tostring(body.node or\"\")~=tostring(expected.node)or tostring(body.challenge_id or\"\")~=tostring(expected.challengeId)then return nil,\"routed login reply does not match its request\"end if body.ok~=true then return false,tostring(body.error or\"Auth Server rejected login\"):sub(1,160)end if type(body.sealed)~=\"table\"then return nil,\"missing sealed routed login result\"end local envelope=body.sealed if type(envelope.nonce)~=\"string\"or#envelope.nonce~=24 or type(envelope.tag)~=\"string\"or#envelope.tag~=32 or type(envelope.ciphertext)~=\"string\"or#envelope.ciphertext>8192 then return nil,\"invalid routed login envelope\"end local aad=proofResultAad(expected.authority,expected.node,body.request_id,expected.challengeId,expected.challenge)local plaintext,err=meshCrypto.open(expected.verifier,envelope,aad)if not plaintext or#plaintext>4096 then return nil,err or\"could not open routed login result\"end local ok,result=pcall(textutils.unserialise,plaintext)if not ok or type(result)~=\"table\"or type(result.session)~=\"table\"then return nil,\"invalid routed login result\"end return result end local function ensureReplies()if not fs.exists(REPLIES)then fs.makeDir(REPLIES)end if not fs.exists(DEFERRED)then fs.makeDir(DEFERRED)end if not fs.exists(PENDING_MARKERS)then fs.makeDir(PENDING_MARKERS)end end local function markerPath(id)return validId(id)and fs.combine(PENDING_MARKERS,id..\".lua\")or nil end local function clearMarker(id)local path=markerPath(id)if path and fs.exists(path)then pcall(fs.delete,path)end end local function readMarker(id)local path=markerPath(id)if not path or not fs.exists(path)then return nil end local handle=fs.open(path,\"r\")local raw=handle and handle.readAll()or nil if handle then handle.close()end local ok,marker=pcall(textutils.unserialise,raw or\"\")if not ok or type(marker)~=\"table\"or marker.schema~=1 or marker.request_id~=id or type(marker.type)~=\"string\"or type(marker.authority)~=\"string\"or(tonumber(marker.expires)or 0)<=now()then clearMarker(id)return nil end return marker end local function writeMarker(id,expected)ensureReplies()local path=markerPath(id)if not path or type(expected)~=\"table\"then return false,\"invalid authority request marker\"end local marker={schema=1,request_id=id,type=expected.type,authority=tostring(expected.authority),expires=tonumber(expected.expires)or 0}if(marker.type~=\"auth_login_begin_result\"and marker.type~=\"auth_login_proof_result\"and marker.type~=\"auth_mutate_result\")or marker.expires<=now()then return false,\"invalid authority request marker\"end local temporary=path..\".tmp\"if fs.exists(temporary)then fs.delete(temporary)end local handle=fs.open(temporary,\"w\")if not handle then return false,\"could not store authority request marker\"end handle.write(textutils.serialise(marker));handle.close()if fs.exists(path)then fs.delete(path)end fs.move(temporary,path)return true end local function pruneDeferred()local timestamp,markerRows,rows=now(),{},{}if fs.exists(PENDING_MARKERS)then for _,name in ipairs(fs.list(PENDING_MARKERS))do local id=name:match(\"^([%w_%-%.]+)%.lua$\")if id then local marker=readMarker(id)if marker then markerRows[#markerRows+1]={id=id,expires=tonumber(marker.expires)or 0}end end end end table.sort(markerRows,function(a,b)return a.expires>b.expires end)for index=PENDING_LIMIT+1,#markerRows do clearMarker(markerRows[index].id)end if not fs.exists(DEFERRED)then return end for _,name in ipairs(fs.list(DEFERRED))do local id=name:match(\"^([%w_%-%.]+)%.lua$\")if id then local path=fs.combine(DEFERRED,name)local handle=fs.open(path,\"r\")local raw=handle and handle.readAll()or nil if handle then handle.close()end local ok,row=pcall(textutils.unserialise,raw or\"\")local valid=ok and type(row)==\"table\"and row.schema==1 and row.request_id==id and type(row.body)==\"table\"and row.body.request_id==id and type(row.context)==\"table\"and type(row.context.type)==\"string\"and tonumber(row.at)and tonumber(row.at)+DEFERRED_RETENTION_MS>timestamp and readMarker(id)~=nil if valid then rows[#rows+1]={path=path,at=tonumber(row.at)}else fs.delete(path)end end end table.sort(rows,function(a,b)return a.at>b.at end)for index=DEFERRED_LIMIT+1,#rows do fs.delete(rows[index].path)end end local function prunePending()local timestamp,rows=now(),{}for id,entry in pairs(pending)do if type(entry)~=\"table\"or(tonumber(entry.expires)or 0)<=timestamp then pending[id]=nil clearMarker(id)else rows[#rows+1]={id=id,expires=tonumber(entry.expires)or 0}end end table.sort(rows,function(a,b)return a.expires>b.expires end)for index=PENDING_LIMIT+1,#rows do pending[rows[index].id]=nil;clearMarker(rows[index].id)end end local function pruneReplies()if not fs.exists(REPLIES)then return end local rows={}for _,name in ipairs(fs.list(REPLIES))do local id=name:match(\"^([%w_%-%.]+)%.lua$\")if id then local path=fs.combine(REPLIES,name)local handle=fs.open(path,\"r\")local raw=handle and handle.readAll()or nil if handle then handle.close()end local ok,decoded=pcall(textutils.unserialise,raw or\"\")local at=ok and type(decoded)==\"table\"and tonumber(decoded.at)or 0 if at<=0 or at+REPLY_RETENTION_MS<=now()then fs.delete(path)else rows[#rows+1]={path=path,at=at}end end end table.sort(rows,function(a,b)return a.at>b.at end)for index=17,#rows do fs.delete(rows[index].path)end end local function take(id)local path=replyPath(id)if not path or not fs.exists(path)then return nil end local handle=fs.open(path,\"r\")if not handle then return nil end local raw=handle.readAll();handle.close()local ok,row=pcall(textutils.unserialise,raw)if not ok or type(row)~=\"table\"or row.request_id~=id then return nil end fs.delete(path)return row end local function deferredPath(id)return validId(id)and fs.combine(DEFERRED,id..\".lua\")or nil end local function clearDeferred(id)local path=deferredPath(id)if path and fs.exists(path)then fs.delete(path)end end local function safeReplyContext(context)context=type(context)==\"table\"and context or{}return{from=type(context.from)==\"string\"and context.from:sub(1,64)or\"\",direct=context.direct==true,routed=context.routed==true,type=type(context.type)==\"string\"and context.type:sub(1,64)or\"\",deferred=false,}end local function deferInbound(body,context)if type(body)~=\"table\"or type(body.request_id)~=\"string\"or not validId(body.request_id)then return false,\"invalid authority reply\"end local typeName=type(context)==\"table\"and context.type or nil if typeName~=\"auth_login_begin_result\"and typeName~=\"auth_login_proof_result\"and typeName~=\"auth_mutate_result\"then return false,\"invalid authority reply type\"end ensureReplies()pruneDeferred()local path=deferredPath(body.request_id)if not path then return false,\"invalid authority reply ID\"end local marker=readMarker(body.request_id)if not marker or marker.type~=typeName then return false,\"unsolicited authority reply\"end if context.routed~=true and(context.direct~=true or tostring(context.from or\"\")~=marker.authority)then return false,\"untrusted authority reply\"end local envelope={schema=1,request_id=body.request_id,body=body,context=safeReplyContext(context),at=now()}local serialOk,encoded=pcall(textutils.serialise,envelope)if not serialOk or type(encoded)~=\"string\"or#encoded>12288 then return false,\"authority reply exceeds hand-off limit\"end if fs.exists(path)then return true end local temporary=path..\".tmp\"if fs.exists(temporary)then fs.delete(temporary)end local handle=fs.open(temporary,\"w\")if not handle then return false,\"could not store authority reply\"end handle.write(encoded);handle.close()if fs.exists(path)then fs.delete(temporary);return true end fs.move(temporary,path)return true end local function takeDeferred(id)pruneDeferred()local path=deferredPath(id)if not path or not fs.exists(path)then return nil end local handle=fs.open(path,\"r\")if not handle then return nil end local raw=handle.readAll();handle.close()fs.delete(path)local ok,row=pcall(textutils.unserialise,raw)if not ok or type(row)~=\"table\"or row.schema~=1 or row.request_id~=id or type(row.body)~=\"table\"or row.body.request_id~=id or type(row.context)~=\"table\"then return nil end return row end function M.receive(body,context)delivery.received=delivery.received+1 delivery.lastAt=now()if type(body)~=\"table\"or type(body.request_id)~=\"string\"or#body.request_id>160 then delivery.lastError=\"invalid authority reply\"return false,delivery.lastError end local path=replyPath(body.request_id)delivery.lastId=body.request_id if not path then delivery.lastError=\"invalid authority reply ID\"return false,delivery.lastError end prunePending()local expected=pending[body.request_id]if not expected then if type(context)==\"table\"and context.deferred==true then local stored,storeErr=deferInbound(body,context)if stored then if os and os.queueEvent then pcall(os.queueEvent,\"ceetos_auth_reply\",body.request_id)end delivery.stored,delivery.pending,delivery.lastError=delivery.stored+1,delivery.pending+1,nil return true end delivery.lastError=storeErr or\"could not defer authority reply\"return false,delivery.lastError end delivery.lastError=\"unsolicited authority reply\"return false,delivery.lastError end if(tonumber(expected.expires)or 0)<=now()then pending[body.request_id]=nil clearMarker(body.request_id)delivery.lastError=\"expired authority reply\"return false,delivery.lastError end if type(context)~=\"table\"or context.type~=expected.type then delivery.lastError=\"untrusted authority reply\"return false,delivery.lastError end if expected.routedLogin==true and context.routed==true then local result,openErr=openRoutedLoginResult(body,expected)if result==false then pending[body.request_id]=nil clearMarker(body.request_id)ensureReplies()local ok,err=store.write(path,{request_id=body.request_id,ok=false,error=openErr,at=now()})if not ok then delivery.lastError=tostring(err or\"could not store authority reply\");return false,delivery.lastError end delivery.stored,delivery.pending,delivery.lastError=delivery.stored+1,delivery.pending+1,nil return true end if not result then delivery.lastError=openErr return false,delivery.lastError end body={request_id=body.request_id,ok=true,result=result}elseif expected.routedChallenge==true and context.routed==true then if body.ok==true and(type(body.result)~=\"table\"or tostring(body.result.authority or\"\")~=tostring(expected.authority))then delivery.lastError=\"routed login challenge does not match authority\"return false,delivery.lastError end elseif context.direct~=true or tostring(context.from)~=tostring(expected.authority)then delivery.lastError=\"untrusted authority reply\"return false,delivery.lastError end pending[body.request_id]=nil clearMarker(body.request_id)ensureReplies()pruneReplies()local ok,err=store.write(path,{request_id=body.request_id,ok=body.ok==true,result=body.result,error=body.error,at=now()})if not ok then delivery.lastError=tostring(err or\"could not store authority reply\")return false,delivery.lastError end if os and os.queueEvent then pcall(os.queueEvent,\"ceetos_auth_reply\",body.request_id)end delivery.stored,delivery.pending,delivery.lastError=delivery.stored+1,delivery.pending+1,nil local rows={}for _,name in ipairs(fs.list(REPLIES))do local id=name:match(\"^([%w_%-%.]+)%.lua$\")if id then local candidate=fs.combine(REPLIES,name)local handle=fs.open(candidate,\"r\")local raw=handle and handle.readAll()or nil if handle then handle.close()end local decoded,parsed=pcall(textutils.unserialise,raw or\"\")if not decoded then parsed=nil end rows[#rows+1]={path=candidate,at=type(parsed)==\"table\"and tonumber(parsed.at)or 0}end end table.sort(rows,function(a,b)return a.at>b.at end)for index=33,#rows do fs.delete(rows[index].path)end return true end function M.deliveryStatus()pruneReplies()pruneDeferred()local pending,deferred=0,0 if fs.exists(REPLIES)then for _,name in ipairs(fs.list(REPLIES))do if name:match(\"^[%w_%-%.]+%.lua$\")then pending=pending+1 end end end if fs.exists(DEFERRED)then for _,name in ipairs(fs.list(DEFERRED))do if name:match(\"^[%w_%-%.]+%.lua$\")then deferred=deferred+1 end end end delivery.pending=pending return{received=delivery.received,stored=delivery.stored,pending=pending,lastId=delivery.lastId,lastAt=delivery.lastAt,lastError=delivery.lastError,deferred=deferred,}end local function send(typeName,body,timeout,expectation,retryAttempts)local server=authority()if not server then return nil,\"no Auth Server is reachable\"end local id=body.request_id or requestId(typeName)body.request_id=id prunePending()local expectedType=typeName..\"_result\"local pendingRecord={authority=tostring(server.id),type=expectedType,expires=now()+(timeout or AUTH_REPLY_TIMEOUT)}if type(expectation)==\"table\"then for key,value in pairs(expectation)do pendingRecord[key]=value end end local marked,markerErr=writeMarker(id,pendingRecord)if not marked then return nil,markerErr or\"could not prepare authority request\"end pending[id]=pendingRecord local deadline=now()+(timeout or AUTH_REPLY_TIMEOUT)local maxAttempts=math.max(1,math.min(AUTH_SEND_ATTEMPTS,tonumber(retryAttempts)or 1))local attempts,commandIds,nextAttemptAt,lastSendError=0,{},now(),nil local function submitAttempt()if attempts>=maxAttempts then return end attempts=attempts+1 local commandId=\"auth-\"..id..(attempts==1 and\"\"or(\"-retry-\"..attempts))local command={id=commandId,action=\"auth_send\",target=server.id,type=typeName,body=body}local ok,err=networkIpc.submit(command)if ok then commandIds[#commandIds+1]=commandId else lastSendError=err or\"could not reach CeetOS network service\"end nextAttemptAt=now()+AUTH_SEND_RETRY_MS end while now()<deadline do if attempts==0 or(attempts<maxAttempts and now()>=nextAttemptAt)then submitAttempt()end for index=#commandIds,1,-1 do local commandId=commandIds[index]local ack,pollErr=networkIpc.poll(commandId,true)if pollErr then pending[id]=nil;clearMarker(id);clearDeferred(id)return nil,pollErr end if ack then table.remove(commandIds,index)if ack.ok~=true then lastSendError=ack.error or\"Auth Server request was not sent\"end end end local reply=take(id)if reply then delivery.pending=math.max(0,delivery.pending-1)return reply.ok and reply.result or nil,reply.error or\"Auth Server rejected request\"end local deferred=takeDeferred(id)if deferred then M.receive(deferred.body,deferred.context)end sleep(0.05)end pending[id]=nil clearMarker(id)clearDeferred(id)return nil,lastSendError or\"Auth Server did not respond\"end local loginProof local function startRequest(typeName,body,timeout,expectation,retryAttempts)local server=authority()if not server then return nil,\"no Auth Server is reachable\"end local id=body.request_id or requestId(typeName)body.request_id=id prunePending()local duration=timeout or AUTH_REPLY_TIMEOUT local pendingRecord={authority=tostring(server.id),type=typeName..\"_result\",expires=now()+duration}if type(expectation)==\"table\"then for key,value in pairs(expectation)do pendingRecord[key]=value end end local marked,markerErr=writeMarker(id,pendingRecord)if not marked then return nil,markerErr or\"could not prepare authority request\"end pending[id]=pendingRecord return{id=id,type=typeName,body=body,server=server,pending=pendingRecord,deadline=now()+duration,attempts=0,commandIds={},maxAttempts=math.max(1,math.min(AUTH_SEND_ATTEMPTS,tonumber(retryAttempts)or 1)),nextAttemptAt=now(),lastSendError=nil,}end local function finishRequest(state,result,errorText)pending[state.id]=nil clearMarker(state.id)clearDeferred(state.id)state.done,state.result,state.error=true,result,errorText return result,errorText end local function tickRequest(state,event,eventId)if state.done then return state.result,state.error end local timestamp=now()local submittedNow=false if state.attempts<state.maxAttempts and timestamp>=state.nextAttemptAt then state.attempts=state.attempts+1 local commandId=\"auth-\"..state.id..(state.attempts==1 and\"\"or(\"-retry-\"..state.attempts))local submitted,submitErr=networkIpc.submit({id=commandId,action=\"auth_send\",target=state.server.id,type=state.type,body=state.body})if submitted then state.commandIds[#state.commandIds+1]=commandId else state.lastSendError=submitErr or\"could not reach CeetOS network service\"end state.nextAttemptAt=timestamp+AUTH_SEND_RETRY_MS submittedNow=true end local shouldRead=event==nil or submittedNow or event==\"ceetos_auth_reply\"and tostring(eventId or\"\")==tostring(state.id)if event==networkIpc.RESULT_EVENT then for _,commandId in ipairs(state.commandIds)do if tostring(eventId or\"\")==tostring(commandId)then shouldRead=true;break end end end if shouldRead then for index=#state.commandIds,1,-1 do local commandId=state.commandIds[index]local acknowledgement,pollErr=networkIpc.poll(commandId,true)if pollErr then return finishRequest(state,nil,pollErr)end if acknowledgement then table.remove(state.commandIds,index)if acknowledgement.ok~=true then state.lastSendError=acknowledgement.error or\"Auth Server request was not sent\"end end end local reply=take(state.id)if reply then delivery.pending=math.max(0,delivery.pending-1)return finishRequest(state,reply.ok and reply.result or nil,reply.error or\"Auth Server rejected request\")end local deferred=takeDeferred(state.id)if deferred then M.receive(deferred.body,deferred.context)reply=take(state.id)if reply then delivery.pending=math.max(0,delivery.pending-1)return finishRequest(state,reply.ok and reply.result or nil,reply.error or\"Auth Server rejected request\")end end end if timestamp>=state.deadline then return finishRequest(state,nil,state.lastSendError or\"Auth Server did not respond\")end return nil,nil end function M.startLogin(name,plainPassword)if type(name)~=\"string\"or type(plainPassword)~=\"string\"then return{done=true,error=\"invalid credentials\"}end local cloud=require(\"ceetos.lib.cloud_sync\")if cloud.authOnline()then return{done=true,error=\"cloud login requires the normal terminal path\"}end local request,err=startRequest(\"auth_login_begin\",{request_id=requestId(\"begin\"),username=name,node=tostring(os.getComputerID())},AUTH_BEGIN_TIMEOUT,{routedChallenge=true,node=tostring(os.getComputerID()),})if not request then return{done=true,error=err}end return{kind=\"login\",name=name,password=plainPassword,phase=\"begin\",request=request,beginAttempts=1}end function M.startProbe()local request,err=startRequest(\"auth_login_begin\",{request_id=requestId(\"begin\"),username=\"ceetos_probe\",node=tostring(os.getComputerID())},AUTH_BEGIN_TIMEOUT,{routedChallenge=true,node=tostring(os.getComputerID()),})if not request then return{kind=\"probe\",done=true,error=err}end return{kind=\"probe\",phase=\"begin\",request=request,beginAttempts=1}end function M.step(task,event,eventId)if type(task)~=\"table\"then return true,false,\"invalid authentication transaction\"end if task.done then return true,task.ok==true,task.error end local result,err=tickRequest(task.request,event,eventId)if not task.request.done then return false end if task.kind==\"probe\"then if err==\"invalid credentials\"then task.done,task.ok,task.result=true,true,{authority=task.request.server.id,request=task.request.id};return true,true end task.done,task.ok,task.error=true,false,err or\"Auth Server probe returned an unexpected response\"return true,false,task.error end if task.phase==\"begin\"then if not result then if err==\"Auth Server did not respond\"and task.beginAttempts<AUTH_BEGIN_ATTEMPTS then task.beginAttempts=task.beginAttempts+1 local request,startErr=startRequest(\"auth_login_begin\",{request_id=requestId(\"begin\"),username=task.name,node=tostring(os.getComputerID())},AUTH_BEGIN_TIMEOUT,{routedChallenge=true,node=tostring(os.getComputerID()),})if request then task.request=request;return false end task.done,task.ok,task.error=true,false,startErr;return true,false,startErr end task.done,task.ok,task.error=true,false,err or\"Auth Server did not respond\";return true,false,task.error end local verifier,deriveErr=password.derive(task.password,result.salt,result.workFactor)if not verifier then task.done,task.ok,task.error=true,false,deriveErr;return true,false,deriveErr end local proofId=requestId(\"proof\")local proof=loginProof(verifier,result.authority,task.request.id,result.challenge,result.expires)local request,startErr=startRequest(\"auth_login_proof\",{request_id=proofId,challenge_id=task.request.id,username=task.name,node=tostring(os.getComputerID()),challenge=result.challenge,proof=proof},nil,{routedLogin=true,verifier=verifier,node=tostring(os.getComputerID()),challengeId=task.request.id,challenge=result.challenge,},AUTH_SEND_ATTEMPTS)if not request then task.done,task.ok,task.error=true,false,startErr;return true,false,startErr end task.phase,task.request=\"proof\",request return false end if not result then task.done,task.ok,task.error=true,false,err or\"Auth Server rejected login\";return true,false,task.error end local auth=require((\"ceetos.lib.auth\"))local saved,saveErr=auth.saveCentralSession(result.session)if not saved then task.done,task.ok,task.error=true,false,saveErr;return true,false,saveErr end if type(result.directory)==\"table\"then auth.updateDirectory(result.directory,result.revision)end task.done,task.ok,task.result=true,true,true return true,true end loginProof=function(verifier,server,request,challenge,expires)return password.hmacSha256(verifier,table.concat({\"ceetos/auth/login/v1\",tostring(server),tostring(os.getComputerID()),tostring(request),tostring(challenge),tostring(expires)},\"|\"))end local function beginLogin(name)local challengeId,begin,beginErr for attempt=1,AUTH_BEGIN_ATTEMPTS do challengeId=requestId(\"begin\")begin,beginErr=send(\"auth_login_begin\",{request_id=challengeId,username=name,node=tostring(os.getComputerID())},AUTH_BEGIN_TIMEOUT,{routedChallenge=true,node=tostring(os.getComputerID()),})if begin or beginErr~=\"Auth Server did not respond\"then break end if attempt<AUTH_BEGIN_ATTEMPTS then sleep(0.1)end end return begin,beginErr,challengeId end function M.login(name,plainPassword)if type(name)~=\"string\"or type(plainPassword)~=\"string\"then return false,\"invalid credentials\"end local cloud=require(\"ceetos.lib.cloud_sync\")if cloud.authOnline()then return cloud.login(name,plainPassword)end local begin,beginErr,challengeId=beginLogin(name)if not begin then return false,beginErr end local verifier,deriveErr=password.derive(plainPassword,begin.salt,begin.workFactor)if not verifier then return false,deriveErr end local proof=loginProof(verifier,begin.authority,challengeId,begin.challenge,begin.expires)local proofId=requestId(\"proof\")local result,proofErr=send(\"auth_login_proof\",{request_id=proofId,challenge_id=challengeId,username=name,node=tostring(os.getComputerID()),challenge=begin.challenge,proof=proof},nil,{routedLogin=true,verifier=verifier,node=tostring(os.getComputerID()),challengeId=challengeId,challenge=begin.challenge,},AUTH_SEND_ATTEMPTS)if not result then return false,proofErr end local auth=require((\"ceetos.lib.auth\"))local saved,saveErr=auth.saveCentralSession(result.session)if not saved then return false,saveErr end if type(result.directory)==\"table\"then auth.updateDirectory(result.directory,result.revision)end return true end function M.probe()local server=authority()if not server then return false,\"no Auth Server is reachable\"end local _,err,probeId=beginLogin(\"ceetos_probe\")if err==\"invalid credentials\"then return true,{authority=server.id,request=probeId}end return false,err or\"Auth Server probe returned an unexpected response\"end function M.mutate(action,fields)local auth=require((\"ceetos.lib.auth\"))local cloud=require(\"ceetos.lib.cloud_sync\")if cloud.authOnline()then return cloud.mutate(action,fields)end local current,server=auth.refreshSession(),authority()if not current or not current.central or not server then return false,\"an Auth Server login is required\"end local result,err=send(\"auth_mutate\",{action=action,fields=fields,session=current.nonce,node=tostring(os.getComputerID()),revision=current.accountRevision})if not result then return false,err end if type(result.directory)==\"table\"then auth.updateDirectory(result.directory,result.revision)end return true end return M",
  ["ceetos/lib/telemetry.lua"] = "local store=require(\"ceetos.lib.store\")local M={}local PATH=\"/ceetos/data/config.lua\"local activity=\"desktop\"local function text(value,limit)if type(value)~=\"string\"then return nil end value=value:gsub(\"[%z\\1-\\31\\127]\",\" \")if value==\"\"then return nil end return value:sub(1,limit)end local function config()local value=store.read(PATH,{})if type(value)~=\"table\"then value={}end if value.telemetry==nil then value.telemetry=true store.write(PATH,value)end return value end function M.setEnabled(value)assert(type(value)==\"boolean\",\"telemetry state must be boolean\")require(\"ceetos.lib.auth\").require(\"admin\")local valueForSave=config()valueForSave.telemetry=value return store.write(PATH,valueForSave)end function M.status()return config().telemetry==true end function M.configuration()return{enabled=M.status()}end function M.markActivity(value)activity=text(value,48)or activity return activity end function M.activity()return activity end function M.snapshot(currentActivity)if currentActivity then M.markActivity(currentActivity)end local data={ts=os.epoch(\"utc\"),id=os.getComputerID(),label=text(os.getComputerLabel(),96),activity=activity,}if turtle and type(turtle.getFuelLevel)==\"function\"then local ok,fuel=pcall(turtle.getFuelLevel)if ok and type(fuel)==\"number\"then data.fuel=fuel end end if gps and type(gps.locate)==\"function\"then local ok,x,y,z=pcall(gps.locate,0.2)if ok and type(x)==\"number\"and type(y)==\"number\"and type(z)==\"number\"then data.gps={x=x,y=y,z=z}end end return data end return M",
  ["ceetos/lib/cloud.lua"] = "local store=require(\"ceetos.lib.store\")local password=require(\"ceetos.lib.password\")local profile=require(\"ceetos.lib.profile\")local M={}M.PATH=\"/ceetos/data/cloud.lua\"M.MAX_BODY=48*1024 M.MAX_RESPONSE=64*1024 M.DEFAULTS={auth=\"https://auth.ceet.uk\",recipe=\"https://recipe.ceet.uk\",dashboard=\"https://dash.ceet.uk\",}local function now()return os.epoch(\"utc\")end local function validUrl(value)if type(value)~=\"string\"or#value>160 then return false end return value:match(\"^https://[%w%-%.]+%.ceet%.uk$\")~=nil end local function validId(value)return type(value)==\"string\"and value:match(\"^[%w_.%-]+$\")~=nil and#value<=96 end local function copy(value)local out={}for key,item in pairs(value or{})do out[key]=item end return out end local function normalise(value)value=type(value)==\"table\"and value or{}local urls=type(value.urls)==\"table\"and value.urls or{}local result={schema=1,enabled=value.enabled==true,urls={auth=validUrl(urls.auth)and urls.auth or M.DEFAULTS.auth,recipe=validUrl(urls.recipe)and urls.recipe or M.DEFAULTS.recipe,dashboard=validUrl(urls.dashboard)and urls.dashboard or M.DEFAULTS.dashboard,},node=type(value.node)==\"table\"and copy(value.node)or nil,}if result.node and(not validId(result.node.id)or type(result.node.secret)~=\"string\"or#result.node.secret<32 or#result.node.secret>192)then result.node=nil end return result end function M.load()store.invalidate(M.PATH)return normalise(store.read(M.PATH,{}))end function M.save(value)local clean=normalise(value)return store.write(M.PATH,clean)end function M.configure(urls)local value=M.load()urls=type(urls)==\"table\"and urls or{}for key in pairs(M.DEFAULTS)do if urls[key]~=nil then if not validUrl(urls[key])then return false,\"invalid \"..key..\" cloud URL\"end value.urls[key]=urls[key]end end return M.save(value)end function M.clear()local value=M.load();value.enabled,value.node=false,nil return M.save(value)end function M.publicStatus()local value=M.load()return{enabled=value.enabled,enrolled=value.node~=nil,node=value.node and value.node.id or nil,urls=copy(value.urls),profile=profile.id()}end local function readBounded(handle,limit)local chunks,total={},0 while true do local part=handle.read(math.min(4096,limit-total+1))if not part or part==\"\"then break end total=total+#part if total>limit then return nil,\"cloud response is too large\"end chunks[#chunks+1]=part end return table.concat(chunks)end local function json(value)local ok,result=pcall(textutils.unserialiseJSON,value)return ok and type(result)==\"table\"and result or nil end local function canonical(node,timestamp,nonce,method,path,body)local digest=assert(password.sha256(body))return table.concat({\"ceetos-cloud-node-v1\",node,tostring(timestamp),nonce,method,path,digest},\"\\n\")end local nonceCounter=0 local function nonce()nonceCounter=nonceCounter+1 return password.newSalt(\"cloud:\"..tostring(nonceCounter))end local function perform(url,method,path,body,headers)if not http or type(http.post)~=\"function\"then return nil,\"HTTP is unavailable\"end local response local ok,err=pcall(function()response=http.post(url..path,body,headers)end)if not ok or not response then return nil,tostring(err or\"cloud request failed\")end local raw,readErr=readBounded(response,M.MAX_RESPONSE)pcall(response.close)if not raw then return nil,readErr end local decoded=json(raw)if not decoded then return nil,\"cloud returned invalid JSON\"end if decoded.ok==false then return nil,tostring(decoded.error or\"cloud rejected request\"):sub(1,180)end return decoded end function M.enroll(code)if type(code)~=\"string\"or#code<12 or#code>128 or code:find(\"[%z\\1-\\31\\127]\")then return nil,\"invalid enrollment code\"end local value=M.load()local payload=textutils.serialiseJSON({code=code,profile=profile.id(),label=os.getComputerLabel()or(\"Computer \"..tostring(os.getComputerID())),computerId=tostring(os.getComputerID())})if#payload>M.MAX_BODY then return nil,\"enrollment request is too large\"end local result,err=perform(value.urls.auth,\"POST\",\"/v1/nodes/enroll\",payload,{[\"Content-Type\"]=\"application/json\"})if not result then return nil,err end if type(result.node)~=\"table\"or not validId(result.node.id)or type(result.node.secret)~=\"string\"or#result.node.secret<32 then return nil,\"cloud returned invalid enrollment\"end value.enabled,value.node=true,{id=result.node.id,secret=result.node.secret,enrolledAt=now()}local saved,saveErr=M.save(value)if not saved then return nil,saveErr or\"could not save cloud enrollment\"end return M.publicStatus()end function M.call(service,path,payload)local value=M.load()if not value.enabled or not value.node then return nil,\"cloud node is not enrolled\"end if not M.DEFAULTS[service]or type(path)~=\"string\"or not path:match(\"^/v1/[%w%-%._/]+$\")or#path>128 then return nil,\"invalid cloud endpoint\"end local body=textutils.serialiseJSON(type(payload)==\"table\"and payload or{})if#body>M.MAX_BODY then return nil,\"cloud request is too large\"end local timestamp,requestNonce=now(),nonce()local signature=password.hmacSha256(value.node.secret,canonical(value.node.id,timestamp,requestNonce,\"POST\",path,body))if not signature then return nil,\"could not sign cloud request\"end return perform(value.urls[service],\"POST\",path,body,{[\"Content-Type\"]=\"application/json\",[\"X-CeetOS-Node\"]=value.node.id,[\"X-CeetOS-Time\"]=tostring(timestamp),[\"X-CeetOS-Nonce\"]=requestNonce,[\"X-CeetOS-Signature\"]=signature,})end return M",
  ["ceetos/lib/cloud_sync.lua"] = "local cloud=require(\"ceetos.lib.cloud\")local store=require(\"ceetos.lib.store\")local password=require(\"ceetos.lib.password\")local profile=require(\"ceetos.lib.profile\")local telemetryService=require(\"ceetos.lib.telemetry\")local RECIPE_SERVICE_MODULE=\"ceetos.lib.\"..\"recipe_service\"local M={}local STATE=\"/ceetos/data/cloud-state.lua\"local INTERVALS={telemetry=24*60*60*1000,authority=30000,recipes=30000}local TELEMETRY_RETRIES={15*60*1000,60*60*1000,4*60*60*1000}local function now()return os.epoch(\"utc\")end local function defaults()return{schema=2,revision=0,auth={online=false,next=0},recipe={online=false,next=0,revision=0},telemetry={enabled=nil,next=0,lastSuccess=nil,failures=0,lastError=nil},lastError=nil}end local function state()store.invalidate(STATE)local value=store.read(STATE,defaults())if type(value)~=\"table\"then value=defaults()end if type(value.auth)~=\"table\"then value.auth={}end if type(value.recipe)~=\"table\"then value.recipe={}end if type(value.telemetry)~=\"table\"then value.telemetry={}end for key,fallback in pairs(defaults())do if value[key]==nil then value[key]=fallback end end for key,fallback in pairs(defaults().recipe)do if value.recipe[key]==nil then value.recipe[key]=fallback end end for key,fallback in pairs(defaults().telemetry)do if value.telemetry[key]==nil then value.telemetry[key]=fallback end end return value end local function save(value)value.revision=(tonumber(value.revision)or 0)+1 return store.write(STATE,value)end local function errorState(value,message)value.lastError=tostring(message or\"cloud request failed\"):sub(1,180)end function M.status()local value,cfg=state(),cloud.publicStatus()return{enabled=cfg.enabled,enrolled=cfg.enrolled,node=cfg.node,urls=cfg.urls,authOnline=value.auth.online==true,recipeOnline=value.recipe.online==true,telemetryNext=tonumber(value.telemetry and value.telemetry.next)or 0,telemetryInterval=INTERVALS.telemetry,telemetryEnabled=telemetryService.status(),telemetryLastSuccess=value.telemetry and value.telemetry.lastSuccess or nil,telemetryLastError=value.telemetry and value.telemetry.lastError or nil,telemetryFailures=math.max(0,math.floor(tonumber(value.telemetry and value.telemetry.failures)or 0)),lastSync=value.lastSync,lastError=value.lastError,}end function M.configure(urls)return cloud.configure(urls)end function M.enroll(code)local enrolled,err=cloud.enroll(code)if not enrolled then return nil,err end local value=state()value.telemetry.next,value.telemetry.failures,value.telemetry.lastError=0,0,nil save(value)return enrolled end function M.clear()local ok,err=cloud.clear();if ok then store.write(STATE,defaults())end return ok,err end function M.authOnline()return M.status().authOnline==true end function M.recipeOnline()return M.status().recipeOnline==true end local function cloudAuthority(result)local auth=require(\"ceetos.lib.auth\")if type(result)~=\"table\"or type(result.directory)~=\"table\"then return false,\"invalid cloud authority response\"end local cfg=cloud.publicStatus()local endpoint=type(cfg.urls)==\"table\"and cfg.urls.auth or nil if type(endpoint)~=\"string\"then return false,\"cloud auth endpoint is unavailable\"end local record={id=\"cloud:\"..endpoint,term=tonumber(result.term)or 0,revision=tonumber(result.revision)or 0}local ok,accepted,reason=pcall(auth.acceptCloudAuthority,record,endpoint)if not ok then return false,accepted end if not accepted then return false,reason or\"cloud authority was rejected\"end local directoryOk,directoryErr=auth.updateDirectory(result.directory,record.revision)if not directoryOk then return false,directoryErr end return true end function M.login(name,plainPassword)if type(name)~=\"string\"or type(plainPassword)~=\"string\"then return false,\"invalid credentials\"end local begin,beginErr=cloud.call(\"auth\",\"/v1/auth/login/begin\",{username=name,node=tostring(os.getComputerID())})if not begin then return false,beginErr end if type(begin.salt)~=\"string\"or type(begin.workFactor)~=\"number\"or type(begin.challenge)~=\"string\"or type(begin.expires)~=\"number\"then return false,\"invalid cloud login challenge\"end local verifier,deriveErr=password.derive(plainPassword,begin.salt,begin.workFactor)if not verifier then return false,deriveErr end local proof=password.hmacSha256(verifier,table.concat({\"ceetos/auth/login/v1\",tostring(begin.authority),tostring(os.getComputerID()),tostring(begin.requestId),tostring(begin.challenge),tostring(begin.expires)},\"|\"))local result,resultErr=cloud.call(\"auth\",\"/v1/auth/login/proof\",{username=name,node=tostring(os.getComputerID()),requestId=begin.requestId,challenge=begin.challenge,proof=proof})if not result then return false,resultErr end local auth=require(\"ceetos.lib.auth\")local saved,saveErr=auth.saveCentralSession(result.session)if not saved then return false,saveErr end if type(result.directory)==\"table\"then auth.updateDirectory(result.directory,result.revision)end return true end function M.mutate(action,fields)local auth=require(\"ceetos.lib.auth\")local current=auth.refreshSession()if not current or not current.central then return false,\"cloud login is required\"end local result,err=cloud.call(\"auth\",\"/v1/auth/mutate\",{action=action,fields=fields,session=current.nonce,node=tostring(os.getComputerID()),revision=current.accountRevision})if not result then return false,err end if type(result.directory)==\"table\"then auth.updateDirectory(result.directory,result.revision)end return true end function M.recipePlan(item,quantity,stock)if not M.recipeOnline()then return nil,\"cloud Recipe Server is unavailable\"end local result,err=cloud.call(\"recipe\",\"/v1/recipe/plan\",{item=item,quantity=quantity,stock=stock})if not result then return nil,err end return result.plan,result.error end local function telemetry()local snapshot=telemetryService.snapshot()local net=require(\"ceetos.lib.net\")local transport=net.statusSnapshot and net.statusSnapshot().transport or{}snapshot.health={profile=profile.id(),version=require(\"ceetos.lib.version\").string,uptime=os.clock(),freeSpace=fs.getFreeSpace(\"/\"),peers=#(net.peers and net.peers()or{}),healthyLinks=transport and transport.healthyLinks or 0,lastError=M.status().lastError,}local result,err=cloud.call(\"dashboard\",\"/v1/telemetry/ingest\",snapshot)return result~=nil,err end local function syncAuth()if profile.is(\"auth-server\")then local auth=require(\"ceetos.lib.auth\")local snapshot=auth.authoritySnapshot()local pushed,pushErr=cloud.call(\"auth\",\"/v1/auth/replica/merge\",{snapshot=snapshot,source=\"mesh\"})if not pushed then return false,pushErr end if type(pushed.snapshot)==\"table\"then auth.merge(pushed.snapshot,true)end local ok,authErr=cloudAuthority(pushed)if not ok then return false,authErr end return true end local result,err=cloud.call(\"auth\",\"/v1/auth/directory\",{})if not result then return false,err end local ok,authErr=cloudAuthority(result)if not ok then return false,authErr end return true end local function syncRecipes()if not profile.is(\"recipe-server\")then local result,err=cloud.call(\"recipe\",\"/v1/recipe/status\",{})return result~=nil,err end local service=require(RECIPE_SERVICE_MODULE)if type(service.exportOverlay)~=\"function\"then return false,\"recipe export unavailable\"end local payload,exportErr=service.exportOverlay()if not payload then return false,exportErr end local value=state()value.recipe=value.recipe or{revision=0}local result,err=cloud.call(\"recipe\",\"/v1/recipe/replica/merge\",{overlay=payload,baseRevision=math.max(0,math.floor(tonumber(value.recipe.revision)or 0)),})if not result then return false,err end if type(result.overlay)==\"table\"and type(service.replaceOverlay)==\"function\"then local applied,applyErr=service.replaceOverlay(result.overlay)if not applied then return false,applyErr end end return true,nil,math.max(0,math.floor(tonumber(result.revision)or 0))end function M.tick(activity,timestampOverride)local cfg=cloud.publicStatus();if not cfg.enabled or not cfg.enrolled then return false,\"cloud node is not enrolled\"end local value,timestamp=state(),tonumber(timestampOverride)or now()local changed=false if timestamp>=(tonumber(value.auth.next)or 0)then local ok,err=syncAuth();value.auth.online,value.auth.next=ok==true,timestamp+INTERVALS.authority if not ok then errorState(value,err)else value.lastError=nil end changed=true end if timestamp>=(tonumber(value.recipe.next)or 0)then local ok,err,recipeRevision=syncRecipes();value.recipe.online,value.recipe.next=ok==true,timestamp+INTERVALS.recipes if recipeRevision~=nil then value.recipe.revision=recipeRevision end if not ok then errorState(value,err)end changed=true end local telemetryEnabled=telemetryService.status()if not telemetryEnabled then if value.telemetry.enabled~=false or value.telemetry.next~=0 then value.telemetry.enabled,value.telemetry.next,value.telemetry.failures,value.telemetry.lastError=false,0,0,nil changed=true end elseif value.telemetry.enabled~=true then value.telemetry.enabled,value.telemetry.next,value.telemetry.failures,value.telemetry.lastError=true,0,0,nil changed=true elseif timestamp>=(tonumber(value.telemetry.next)or 0)then local ok,err=telemetry()if ok then value.telemetry.next,value.telemetry.lastSuccess,value.telemetry.failures,value.telemetry.lastError=timestamp+INTERVALS.telemetry,timestamp,0,nil else local failures=math.max(0,math.floor(tonumber(value.telemetry.failures)or 0))+1 value.telemetry.failures,value.telemetry.lastError=failures,tostring(err or\"telemetry upload failed\"):sub(1,180)value.telemetry.next=timestamp+(TELEMETRY_RETRIES[failures]or INTERVALS.telemetry)errorState(value,value.telemetry.lastError)end changed=true end if changed then value.lastSync=timestamp;save(value)end return true end return M",
  ["ceetos/lib/cloud_service.lua"] = "local M={}M.EVENT=\"ceetos_cloud_sync\"local Service={}Service.__index=Service local function delay(value)value=tonumber(value)or 5 return math.max(0.5,math.min(value,60))end function M.new(options)options=options or{}assert(type(options.tick)==\"function\",\"cloud service requires tick\")assert(type(options.startTimer)==\"function\",\"cloud service requires startTimer\")return setmetatable({tick=options.tick,startTimer=options.startTimer,pullEvent=options.pullEvent,interval=delay(options.interval),timer=nil,runs=0,lastManual=false,},Service)end function Service:start()if not self.timer then self.timer=self.startTimer(self.interval)end end function Service:step(event)assert(type(event)==\"table\",\"cloud service event must be a table\")self:start()local manual=event[1]==M.EVENT if not manual and not(event[1]==\"timer\"and event[2]==self.timer)then return false end self.lastManual=manual self.tick(manual and\"manual\"or\"scheduled\")self.runs=self.runs+1 self.timer=self.startTimer(self.interval)return true end function Service:run()assert(type(self.pullEvent)==\"function\",\"cloud service requires pullEvent\")self:start()while true do self:step({self.pullEvent()})end end return M",
  ["ceetos/lib/terminal_ui.lua"] = "local M={}local function size()local width,height=term.getSize()return math.max(1,width or 1),math.max(1,height or 1)end function M.clean(value)return tostring(value or\"\"):gsub(\"%c\",\" \")end function M.clip(value,width,suffix)value,width=M.clean(value),math.max(0,math.floor(tonumber(width)or 0))if width==0 then return\"\"end if#value<=width then return value end suffix=suffix==nil and\"...\"or tostring(suffix)if#suffix>=width then return suffix:sub(1,width)end return value:sub(1,width-#suffix)..suffix end function M.write(x,y,value,foreground,background,width)local terminalWidth,terminalHeight=size()x,y=math.floor(tonumber(x)or 1),math.floor(tonumber(y)or 1)if y<1 or y>terminalHeight or x>terminalWidth then return false end if x<1 then value=M.clean(value):sub(2-x)x=1 end local available=math.max(0,terminalWidth-x+1)if width~=nil then available=math.min(available,math.max(0,math.floor(width)))end if available<=0 then return false end if foreground then term.setTextColor(foreground)end if background then term.setBackgroundColor(background)end term.setCursorPos(x,y)term.write(M.clip(value,available,\"\"))return true end function M.clearLine(y,background)local width,height=size()y=math.floor(tonumber(y)or 0)if y<1 or y>height then return false end term.setCursorPos(1,y)if background then term.setBackgroundColor(background)end term.clearLine()return width>0 end function M.header(title,progress)local width=size()local value=math.max(0,math.min(1,tonumber(progress)or 0))M.clearLine(1,colors.blue)local filled=math.floor(width*value)if filled>0 then M.fill(1,1,filled,1,colors.green)end local text=M.clip(title or\"CeetOS\",math.max(0,width-2),\"\")if text==\"\"then return end local foreground=(colors.toBlit and colors.toBlit(colors.white))or\"0\"local blue=(colors.toBlit and colors.toBlit(colors.blue))or\"b\"local green=(colors.toBlit and colors.toBlit(colors.green))or\"d\"local background={}for index=1,#text do background[index]=index+1<=filled and green or blue end term.setCursorPos(2,1)if term.blit then term.blit(text,foreground:rep(#text),table.concat(background))else M.write(2,1,text,colors.white,colors.blue,width-2)end end function M.fill(x,y,width,height,background)local terminalWidth,terminalHeight=size()x,y=math.max(1,math.floor(tonumber(x)or 1)),math.max(1,math.floor(tonumber(y)or 1))width,height=math.max(0,math.floor(tonumber(width)or 0)),math.max(0,math.floor(tonumber(height)or 0))width,height=math.min(width,terminalWidth-x+1),math.min(height,terminalHeight-y+1)if width<=0 or height<=0 then return false end term.setBackgroundColor(background or colors.black)for row=y,y+height-1 do term.setCursorPos(x,row);term.write((\" \"):rep(width))end return true end function M.box(x1,y1,x2,y2,title,border,titleColour)local width,height=size()x1,y1=math.max(1,math.floor(x1 or 1)),math.max(1,math.floor(y1 or 1))x2,y2=math.min(width,math.floor(x2 or width)),math.min(height,math.floor(y2 or height))if x2-x1<2 or y2-y1<2 then return false end border=border or colors.gray term.setBackgroundColor(colors.black);term.setTextColor(border)M.write(x1,y1,\"+\"..(\"-\"):rep(x2-x1-1)..\"+\",border,colors.black)for row=y1+1,y2-1 do M.write(x1,row,\"|\",border,colors.black);M.write(x2,row,\"|\",border,colors.black)end M.write(x1,y2,\"+\"..(\"-\"):rep(x2-x1-1)..\"+\",border,colors.black)if title and title~=\"\"then M.write(x1+2,y1,\" \"..M.clean(title)..\" \",titleColour or colors.lightBlue,colors.black,math.max(0,x2-x1-3))end return true end function M.minimum(title,message,footer)local width,height=size()term.setBackgroundColor(colors.black);term.setTextColor(colors.white);term.clear()M.clearLine(1,colors.blue);M.write(2,1,title or\"CeetOS\",colors.white,colors.blue,width-2)M.write(2,math.max(2,math.floor(height/2)),message or\"Terminal is too small\",colors.red,colors.black,width-2)M.write(2,height,footer or\"Resize terminal or press Backspace\",colors.gray,colors.black,width-2)return{}end function M.hit(targets,x,y)for index=#(targets or{}),1,-1 do local target=targets[index]if x>=target.x1 and x<=target.x2 and y>=target.y1 and y<=target.y2 then return target end end end return M",
  ["ceetos/lib/sounds.lua"] = "local M={}local POLICY={boot={instrument=\"chime\",volume=0.22,root=0.78,motif=\"047\",cooldown=1500},confirmation={instrument=\"bell\",volume=0.20,root=0.96,motif=\"07\",cooldown=500},reconnect={instrument=\"flute\",volume=0.17,root=0.82,motif=\"037\",cooldown=2500},warning={instrument=\"bass\",volume=0.22,root=0.72,motif=\"03\",cooldown=3000},error={instrument=\"didgeridoo\",volume=0.20,root=0.56,motif=\"036\",cooldown=3500},}local function generatedCue(event)local policy=POLICY[tostring(event or\"\")]if not policy then return nil end local notes={}for index=1,#policy.motif do local semitones=tonumber(policy.motif:sub(index,index))or 0 notes[#notes+1]={instrument=policy.instrument,volume=policy.volume*(1-((index-1)*0.12)),pitch=policy.root*(2^(semitones/12)),}end return notes end local function now()if not os or type(os.epoch)~=\"function\"then return 0 end local ok,value=pcall(os.epoch,\"utc\")return ok and math.max(0,math.floor(tonumber(value)or 0))or 0 end local function speakerNames()if not peripheral or type(peripheral.getNames)~=\"function\"or type(peripheral.getType)~=\"function\"then return{}end local ok,names=pcall(peripheral.getNames)if not ok or type(names)~=\"table\"then return{}end local found={}for _,name in ipairs(names)do local typed,kind=pcall(peripheral.getType,name)if typed and tostring(kind or\"\"):lower()==\"speaker\"then found[#found+1]=tostring(name)end end table.sort(found)return found end local SoundService={}SoundService.__index=SoundService function SoundService:refresh()self.speaker,self.name,self.checked=nil,nil,true if not peripheral or type(peripheral.wrap)~=\"function\"then return false,\"no peripheral API\"end for _,name in ipairs(speakerNames())do local ok,wrapped=pcall(peripheral.wrap,name)if ok and type(wrapped)==\"table\"and type(wrapped.playNote)==\"function\"then self.speaker,self.name=wrapped,name return true,name end end return false,\"no supported speaker\"end function SoundService:invalidate()self.checked,self.speaker,self.name=false,nil,nil end function SoundService:status()if not self.checked then self:refresh()end return{available=self.speaker~=nil,name=self.name}end function SoundService:play(event)local policy=POLICY[tostring(event or\"\")]if not policy then return false,\"unknown sound event\"end local timestamp=self.now()local previous=self.last[event]if previous and timestamp-previous<policy.cooldown then return false,\"cooldown\"end if not self.checked then self:refresh()end if not self.speaker then return false,\"no supported speaker\"end for _,note in ipairs(generatedCue(event)or{})do local ok,result=pcall(self.speaker.playNote,note.instrument,note.volume,note.pitch)if not ok or result==false then self:invalidate()return false,ok and\"speaker rejected note\"or tostring(result)end end self.last[event]=timestamp return true end function M.new(options)options=options or{}return setmetatable({now=type(options.now)==\"function\"and options.now or now,last={},speaker=nil,name=nil,checked=false,},SoundService)end M.policy=POLICY M.cue=generatedCue local default=M.new()function M.refresh()return default:refresh()end function M.invalidate()return default:invalidate()end function M.status()return default:status()end function M.play(event)return default:play(event)end return M",
  ["ceetos/lib/input.lua"] = "local M={}function M.modifiers()return{ctrl=false,shift=false}end local function nameOf(name)name=tostring(name or\"\")local lower=name:lower()if lower==\"leftctrl\"or lower==\"rightctrl\"or lower==\"ctrl\"then return\"ctrl\"end if lower==\"leftshift\"or lower==\"rightshift\"or lower==\"shift\"then return\"shift\"end return lower end function M.key(state,name)name=nameOf(name)if name==\"ctrl\"then state.ctrl=true elseif name==\"shift\"then state.shift=true end return state end function M.keyUp(state,name)name=nameOf(name)if name==\"ctrl\"then state.ctrl=false elseif name==\"shift\"then state.shift=false end return state end function M.shortcut(state,name)name=nameOf(name)local active=state.ctrl and state.shift and(name==\"c\"or name==\"v\")if active then state.ctrl,state.shift=false,false end return active,name end function M.navigation(name)name=nameOf(name)return({w=\"up\",a=\"left\",s=\"down\",d=\"right\"})[name]or name end return M",
  ["ceetos/lib/pairing_monitor.lua"] = "local M={}function M.begin(detail,now,maximumWait)detail=type(detail)==\"table\"and detail or{}local peer=tostring(detail.peer or\"\")if peer==\"\"then return nil,\"Pairing request was sent; waiting for confirmation\"end now=tonumber(now)or 0 maximumWait=math.max(1000,tonumber(maximumWait)or 120000)local expiry=tonumber(detail.expires)or(now+maximumWait)return{peer=peer,label=tostring(detail.label or(\"Computer \"..peer)),deadline=math.min(expiry,now+maximumWait),},nil end function M.poll(pending,snapshot,now)if type(pending)~=\"table\"then return false end if type(snapshot)==\"table\"then for _,peer in ipairs(snapshot.peers or{})do if tostring(peer.id)==tostring(pending.peer)and not peer.rekeyRequired then return true,\"Paired with \"..tostring(peer.label or pending.label),false end end local discovery=snapshot.discovery or{}if discovery.active==false and discovery.lastState==\"paired\"then return true,\"Paired with \"..tostring(pending.label or pending.peer),false end if discovery.active==false and discovery.lastState and discovery.lastState~=\"paired\"and discovery.lastState~=\"inactive\"then return true,\"Pairing did not complete: \"..tostring(discovery.lastMessage or discovery.lastState),true end end if(tonumber(now)or 0)>=(tonumber(pending.deadline)or 0)then return true,\"Pairing timed out before \"..tostring(pending.label or pending.peer)..\" confirmed. Check Peers diagnostics.\",true end return false end return M",
  ["ceetos/lib/version.lua"] = "return{major=0,minor=19,patch=53,string=\"0.19.53\"}",
  ["ceetos/lib/crafting.lua"] = "local M={}M.RECIPE_PACK_MAX_BYTES=64*1024 function M.isLocalPeer(peer,computerId)return tostring(peer)==tostring(computerId)end function M.normalise(rows)local out={}for _,row in pairs(type(rows)==\"table\"and rows or{})do if type(row)==\"table\"then local name,count=row.name or row.id,tonumber(row.count or row.amount or row.quantity or 0)or 0 if type(name)==\"string\"and count>0 then out[name]=(out[name]or 0)+math.floor(count)end end end return out end function M.recipeStockSnapshot(rows,maximum)maximum=math.max(1,math.min(512,math.floor(tonumber(maximum)or 512)))local counts={}for _,row in pairs(type(rows)==\"table\"and rows or{})do if type(row)==\"table\"then local name=row.name or row.id local count=tonumber(row.count or row.amount or row.quantity or 0)if type(name)==\"string\"and name:match(\"^[%w_.:%-]+$\")and count and count==count and count~=math.huge and count~=-math.huge and count>0 then counts[name]=math.min(2147483647,(counts[name]or 0)+math.floor(count))end end end local names,snapshot={},{}for name in pairs(counts)do names[#names+1]=name end table.sort(names)for index=1,math.min(#names,maximum)do local name=names[index]snapshot[#snapshot+1]={name=name,count=counts[name]}end return snapshot end function M.readTickerStock(ticker,maximum)if type(ticker)~=\"table\"or type(ticker.stock)~=\"function\"then return nil,\"Selected Stock Ticker does not expose stock()\"end local ok,rows=pcall(ticker.stock)if not ok then return nil,tostring(rows)end if type(rows)~=\"table\"then return nil,\"Stock Ticker returned invalid stock data\"end return M.recipeStockSnapshot(rows,maximum)end function M.shouldRefreshStock(state)return type(state)==\"table\"and(state.stockRefreshRequested==true or type(state.active)==\"table\")or false end local RECOVERABLE_RECIPE_ERRORS={[\"peer is unreachable, degraded, or requires rekey\"]=true,[\"could not reach recipe server\"]=true,[\"recipe server did not respond to catalogue request\"]=true,[\"recipe server rejected catalogue request\"]=true,[\"recipe database did not respond\"]=true,}function M.clearRecoveredRecipeError(state)if type(state)~=\"table\"or type(state.active)==\"table\"or type(state.error)~=\"string\"then return false end local key=state.error:lower():gsub(\"^%s+\",\"\"):gsub(\"%s+$\",\"\")if not RECOVERABLE_RECIPE_ERRORS[key]then return false end state.error=nil return true end function M.persistenceAction(lastEncoded,durableEncoded,now,lastVerifiedAt,interval)now=math.max(0,math.floor(tonumber(now)or 0))lastVerifiedAt=math.max(0,math.floor(tonumber(lastVerifiedAt)or 0))interval=math.max(250,math.min(60000,math.floor(tonumber(interval)or 5000)))if type(lastEncoded)~=\"string\"then return\"write\"end if now<lastVerifiedAt+interval then return\"skip\"end if type(durableEncoded)~=\"string\"then return\"verify\"end return durableEncoded==lastEncoded and\"skip\"or\"write\"end local TRANSIENT_QUEUE_STATE={recipes=true,recipeTags=true,recipeOverlay=true,stockRequest=true,catalogRequest=true,tagOptionsRequest=true,commandLedger=true,}function M.durableQueueSnapshot(state)local snapshot={}for key,value in pairs(type(state)==\"table\"and state or{})do if not TRANSIENT_QUEUE_STATE[key]then snapshot[key]=value end end return snapshot end function M.pruneReplyMailbox(replies,maximum)if type(replies)~=\"table\"then return{}end maximum=math.max(1,math.min(256,math.floor(tonumber(maximum)or 64)))local rows={}for requestId,reply in pairs(replies)do if type(requestId)==\"string\"and type(reply)==\"table\"then rows[#rows+1]={id=requestId,received=math.floor(tonumber(reply.received)or 0)}else replies[requestId]=nil end end table.sort(rows,function(left,right)if left.received~=right.received then return left.received<right.received end return left.id<right.id end)while#rows>maximum do replies[table.remove(rows,1).id]=nil end return replies end function M.commandCreatedAt(command)local value=type(command)==\"table\"and tonumber(command.createdAt)or nil if value and value==value and value>0 and value<10000000000000000 then return math.floor(value)end local token=type(command)==\"table\"and command.token or nil if type(token)~=\"string\"then return nil end local encoded=token:match(\"^craft%-ui%-(%d+)%-\")or token:match(\"^dev%-e2e%-(%d+)%-\")value=tonumber(encoded)if value and value==value and value>0 and value<10000000000000000 then return math.floor(value)end return nil end function M.commandIsStale(command,runtimeStartedAt)local started=tonumber(runtimeStartedAt)if not started or started<=0 then return false end local created=M.commandCreatedAt(command)return not created or created<math.floor(started)end function M.displayName(name)name=tostring(name or\"\")return name:match(\"^[^:]+:(.+)$\")or name end function M.formatCount(count)count=math.max(0,math.floor(tonumber(count)or 0))if count>=10000000 then return tostring(math.floor(count/1000000))..\"M\"end if count>=10000 then return tostring(math.floor(count/1000))..\"k\"end return tostring(count)end local function catalogMap(catalog)local out,input={},type(catalog)==\"table\"and(catalog.rows or catalog)or{}for _,row in ipairs(input)do if type(row)==\"table\"and type(row.name)==\"string\"and row.name:match(\"^[%w_.:%-]+$\")and row.name:sub(1,1)~=\"#\"then local tags={}for _,tag in ipairs(type(row.tags)==\"table\"and row.tags or{})do if type(tag)==\"string\"and tag:match(\"^#[%w_.:%-]+$\")then tags[#tags+1]=tag end end table.sort(tags)out[row.name]={tags=tags}end end return out end function M.rows(stock,query,filter,recipes,catalog)local output,needle,available={},tostring(query or\"\"):lower(),M.normalise(stock)local names,remote={},catalogMap(catalog)for name in pairs(available)do names[name]=true end for name in pairs(type(recipes)==\"table\"and recipes or{})do names[name]=true end for name in pairs(remote)do names[name]=true end for name in pairs(names)do local count=available[name]or 0 local craftable=(type(recipes)==\"table\"and recipes[name]~=nil)or remote[name]~=nil local display=M.displayName(name):lower()local include=needle==\"\"or name:lower():find(needle,1,true)or display:find(needle,1,true)if filter==\"craftable\"or filter==\"recipes\"then include=include and craftable elseif filter==\"stocked\"then include=include and count>0 end local recipeTags=remote[name]and remote[name].tags or((type(recipes)==\"table\"and recipes[name]and M.recipeTagReferences(recipes[name]))or{})if include then output[#output+1]={name=name,count=count,craftable=craftable,stocked=count>0,tags=recipeTags}end end table.sort(output,function(a,b)if a.craftable~=b.craftable then return a.craftable end return a.name<b.name end)return output end function M.addToCart(cart,name,count)if type(cart)~=\"table\"or type(name)~=\"string\"or name==\"\"then return nil,\"invalid cart item\"end count=tonumber(count)if not count or count<1 then return nil,\"invalid cart quantity\"end count=math.floor(count)for _,row in ipairs(cart)do if row.name==name then row.count=count;return row,\"updated\"end end local row={name=name,count=count}cart[#cart+1]=row return row,\"added\"end function M.cartTotals(cart)local items,quantity=0,0 for _,row in ipairs(type(cart)==\"table\"and cart or{})do items=items+1 quantity=quantity+math.max(0,math.floor(tonumber(row.count)or 0))end return items,quantity end function M.requesterCheckpointDue(pending,nextCheckpoint,now)pending=math.max(0,math.floor(tonumber(pending)or 0))if pending==0 then return true end return(tonumber(now)or 0)>=(tonumber(nextCheckpoint)or 0)end function M.acceptedCount(result,requested)local accepted=tonumber(result)requested=tonumber(requested)if not accepted or not requested or requested<1 then return nil,\"invalid request result\"end accepted=math.floor(accepted)if accepted<1 then return nil,\"Stock Ticker accepted no items\"end return math.min(accepted,math.floor(requested))end function M.confirmRequesterBatch(baseline,observed,output)baseline,observed,output=tonumber(baseline),tonumber(observed),tonumber(output)if not baseline or not observed or not output or output<1 or output~=math.floor(output)then return nil,\"invalid requester batch progress\"end return observed>=baseline+output end function M.requesterStepProgress(batches,issued,output)batches,issued,output=tonumber(batches),tonumber(issued),tonumber(output)if not batches or not issued or not output or batches<1 or issued<0 or issued>batches or output<1 then return nil,\"invalid requester step progress\"end batches,issued,output=math.floor(batches),math.floor(issued),math.floor(output)return{remaining=batches-issued,expectedOutput=issued*output}end function M.requesterBatchBaseline(stock,outputName)if type(outputName)~=\"string\"or outputName==\"\"then return nil,\"invalid requester output\"end return M.normalise(stock)[outputName]or 0 end function M.displayRow(name,count,width)name=M.displayName(name)local suffix=\" x\"..M.formatCount(count)width=math.max(#suffix+1,math.floor(tonumber(width)or#suffix+1))if#name+#suffix<=width then return name..suffix end return name:sub(1,math.max(1,width-#suffix-3))..\"...\"..suffix end function M.cancellationStatus(issued)return issued and\"cancelled-unconfirmed\"or\"cancelled\"end local function validReference(name)return type(name)==\"string\"and name:match(\"^#?[%w_.:%-]+$\")~=nil and not name:find(\"##\",1,true)end local function recipeIngredients(recipe,batches)local combined={}local declared=type(recipe.ingredients)==\"table\"and#recipe.ingredients>0 if declared then for _,ingredient in ipairs(recipe.ingredients)do local name=type(ingredient)==\"table\"and ingredient.id or ingredient local count=type(ingredient)==\"table\"and tonumber(ingredient.count or 1)or 1 if validReference(name)then combined[name]=(combined[name]or 0)+batches*math.max(1,math.floor(count or 1))end end else for slot=1,9 do local name=recipe.grid and recipe.grid[slot]if name and name~=false then combined[name]=(combined[name]or 0)+batches end end end local out={}for name,count in pairs(combined)do out[#out+1]={name=name,count=count}end table.sort(out,function(a,b)return a.name<b.name end)return out end function M.recipeInputs(recipe,batches)return recipeIngredients(recipe or{},math.max(1,math.floor(tonumber(batches)or 1)))end function M.validateRecipes(recipes)if type(recipes)~=\"table\"then return nil,\"recipes must return a table\"end for name,recipe in pairs(recipes)do if type(name)~=\"string\"or not name:match(\"^[%w_.:%-]+$\")or type(recipe)~=\"table\"then return nil,\"invalid recipe item id\"end if type(recipe.alternatives)==\"table\"then if#recipe.alternatives<1 then return nil,\"recipe \"..name..\" has no alternatives\"end for _,alternative in ipairs(recipe.alternatives)do local valid,err=M.validateRecipes({[name]=alternative});if not valid then return nil,err end end else if recipe.mode~=\"crafting\"then return nil,\"recipe \"..name..\" must use mode = crafting\"end if type(recipe.address)~=\"string\"or recipe.address==\"\"or#recipe.address>64 then return nil,\"recipe \"..name..\" requires an address\"end local crafter=recipe.address==\"Crafter\"if crafter and type(recipe.grid)~=\"table\"then return nil,\"recipe \"..name..\" requires a 9-slot grid for Crafter\"end if not crafter and type(recipe.ingredients)~=\"table\"and type(recipe.grid)~=\"table\"then return nil,\"recipe \"..name..\" requires ingredients\"end local output=tonumber(recipe.output or 1)if not output or output<1 or output~=math.floor(output)then return nil,\"invalid output for \"..name end for slot=1,9 do local value=recipe.grid and recipe.grid[slot]if value~=nil and value~=false and not validReference(value)then return nil,\"invalid grid slot in \"..name end end for _,ingredient in ipairs(type(recipe.ingredients)==\"table\"and recipe.ingredients or{})do local id,count=type(ingredient)==\"table\"and ingredient.id or ingredient,type(ingredient)==\"table\"and ingredient.count or 1 if not validReference(id)or not tonumber(count)or tonumber(count)<1 then return nil,\"invalid ingredient in \"..name end end end end return recipes end local function dataParser(source,maximum)if type(source)~=\"string\"then return nil,\"recipe data must be text\"end if#source==0 or#source>(maximum or M.RECIPE_PACK_MAX_BYTES)then return nil,\"recipe data exceeds the 64 KiB import limit\"end local state={source=source,index=1,length=#source,depth=0,nodes=0}local function skip()while state.index<=state.length do local char=state.source:sub(state.index,state.index)if char:match(\"%s\")then state.index=state.index+1 elseif state.source:sub(state.index,state.index+1)==\"--\"then local ending=state.source:find(\"\\n\",state.index+2,true)state.index=ending and ending+1 or state.length+1 else return true end end return true end local function fail(message)return nil,message..\" near byte \"..tostring(state.index)end local function identifier()local name=state.source:match(\"^[%a_][%w_]*\",state.index)if name then state.index=state.index+#name end return name end local parseValue local function parseString()local quote=state.source:sub(state.index,state.index);state.index=state.index+1 local out={}while state.index<=state.length do local char=state.source:sub(state.index,state.index);state.index=state.index+1 if char==quote then return table.concat(out)end if char==\"\\\\\"then local escaped=state.source:sub(state.index,state.index);state.index=state.index+1 local values={n=\"\\n\",r=\"\\r\",t=\"\\t\",[\"\\\\\"]=\"\\\\\",[\"\\\"\"]=\"\\\"\",[\"'\"]=\"'\"}if not values[escaped]then return fail(\"unsupported string escape\")end out[#out+1]=values[escaped]elseif char:byte()<32 then return fail(\"control character in string\")else out[#out+1]=char end end return fail(\"unterminated string\")end local function parseTable()state.depth=state.depth+1 if state.depth>32 then return fail(\"recipe data is nested too deeply\")end state.index=state.index+1 local out,nextIndex,keys={},1,{}skip()while state.index<=state.length and state.source:sub(state.index,state.index)~=\"}\"do state.nodes=state.nodes+1 if state.nodes>4096 then return fail(\"recipe data has too many values\")end local key,value,err local start=state.index if state.source:sub(state.index,state.index)==\"[\"then state.index=state.index+1;key,err=parseValue();if err then return nil,err end skip();if state.source:sub(state.index,state.index)~=\"]\"then return fail(\"missing closing recipe key bracket\")end state.index=state.index+1;skip();if state.source:sub(state.index,state.index)~=\"=\"then return fail(\"missing recipe key assignment\")end state.index=state.index+1;skip();value,err=parseValue();if err then return nil,err end else local named=identifier();skip()if named and state.source:sub(state.index,state.index)==\"=\"then key,state.index=named,state.index+1;skip();value,err=parseValue();if err then return nil,err end else state.index=start;value,err=parseValue();if err then return nil,err end key,nextIndex=nextIndex,nextIndex+1 end end if type(key)~=\"string\"and type(key)~=\"number\"then return fail(\"recipe table key must be text or a number\")end local signature=type(key)..\":\"..tostring(key)if keys[signature]then return fail(\"duplicate recipe table key\")end keys[signature],out[key]=true,value skip();local separator=state.source:sub(state.index,state.index)if separator==\",\"or separator==\";\"then state.index=state.index+1;skip()elseif separator~=\"}\"then return fail(\"expected recipe table separator\")end end if state.source:sub(state.index,state.index)~=\"}\"then return fail(\"unterminated recipe table\")end state.index,state.depth=state.index+1,state.depth-1 return out end parseValue=function()skip();local char=state.source:sub(state.index,state.index)if char==\"{\"then return parseTable()end if char==\"\\\"\"or char==\"'\"then return parseString()end local number=state.source:match(\"^-?%d+\",state.index)if number then state.index=state.index+#number;return tonumber(number)end local name=identifier()if name==\"true\"then return true elseif name==\"false\"then return false elseif name==\"nil\"then return nil elseif name then return fail(\"bare recipe values are not allowed\")end return fail(\"invalid recipe value\")end skip()if identifier()~=\"return\"then return fail(\"recipe data must start with return\")end local value,err=parseValue();if err then return nil,err end skip();if state.index<=state.length then return fail(\"unexpected content after recipe table\")end return value end local function validTags(tags)if tags==nil then return{}end if type(tags)~=\"table\"then return nil,\"recipe tags must be a table\"end local out={}for tag,members in pairs(tags)do local key=tostring(tag):gsub(\"^#\",\"\")if not key:match(\"^[%w_.:%-]+$\")or type(members)~=\"table\"or#members<1 then return nil,\"invalid recipe tag \"..tostring(tag)end out[key]={}for _,member in ipairs(members)do if not validReference(member)or tostring(member):sub(1,1)==\"#\"then return nil,\"invalid member of #\"..key end out[key][#out[key]+1]=member end table.sort(out[key])end return out end function M.validateRecipeGraph(recipes,tags)local tagMap,tagErr=validTags(tags);if not tagMap then return nil,tagErr end local visiting,complete={},{}local function visit(name)if complete[name]then return true end if visiting[name]then return nil,\"recipe cycle at \"..name end local recipe=recipes[name]if type(recipe)==\"table\"and type(recipe.alternatives)==\"table\"then recipe=recipe.alternatives[1]end if not recipe then return true end visiting[name]=true for _,input in ipairs(recipeIngredients(recipe,1))do local ingredient=input.name local members=ingredient:sub(1,1)==\"#\"and tagMap[ingredient:sub(2)]or{ingredient}for _,member in ipairs(members or{})do if recipes[member]then local ok,err=visit(member);if not ok then return nil,err end end end end visiting[name],complete[name]=nil,true return true end for name in pairs(recipes)do local ok,err=visit(name);if not ok then return nil,err end end return true end function M.parseRecipeOverlay(source)local value,err=dataParser(source,M.RECIPE_PACK_MAX_BYTES)if not value then return nil,err end if type(value)~=\"table\"then return nil,\"recipe overlay must return a table\"end local recipes,tags if value.schema==1 and type(value.recipes)==\"table\"then recipes,tags=value.recipes,value.tags or{}else recipes,tags=value,{}end local valid,validationErr=M.validateRecipes(recipes)if not valid then return nil,validationErr end local tagMap,tagsErr=validTags(tags);if not tagMap then return nil,tagsErr end local graphOk,graphErr=M.validateRecipeGraph(recipes,tagMap)if not graphOk then return nil,graphErr end return{schema=1,recipes=recipes,tags=tagMap}end function M.parseRecipeFile(source)local overlay,err=M.parseRecipeOverlay(source)return overlay and overlay.recipes or nil,err end function M.parseRecipePack(source)local pack,err=dataParser(source,M.RECIPE_PACK_MAX_BYTES)if not pack then return nil,err end if type(pack)~=\"table\"or pack.schema~=1 or type(pack.recipes)~=\"table\"then return nil,\"recipe pack must return { schema = 1, recipes = { ... } }\"end local valid,validationErr=M.validateRecipes(pack.recipes)if not valid then return nil,validationErr end local tagMap,tagsErr=validTags(pack.tags or{});if not tagMap then return nil,tagsErr end local graphOk,graphErr=M.validateRecipeGraph(pack.recipes,tagMap)if not graphOk then return nil,graphErr end return{schema=1,recipes=pack.recipes,tags=tagMap}end function M.recipeEqual(left,right)if type(left)~=\"table\"or type(right)~=\"table\"then return false end if type(left.alternatives)==\"table\"then left=left.alternatives[1]end if type(right.alternatives)==\"table\"then right=right.alternatives[1]end if not left or not right or left.mode~=right.mode or left.kind~=right.kind or left.output~=right.output or left.address~=right.address then return false end for slot=1,9 do if left.grid and right.grid and left.grid[slot]~=right.grid[slot]then return false end end local a,b=recipeIngredients(left,1),recipeIngredients(right,1)if#a~=#b then return false end for index=1,#a do if a[index].name~=b[index].name or a[index].count~=b[index].count then return false end end return true end function M.reviewRecipePack(existing,incoming)local validExisting,existingErr=M.validateRecipes(existing)if not validExisting then return nil,existingErr end local validIncoming,incomingErr=M.validateRecipes(incoming)if not validIncoming then return nil,incomingErr end local rows,counts={},{new=0,unchanged=0,conflict=0,invalid=0}for name,recipe in pairs(incoming)do local prior=existing[name]local status=not prior and\"new\"or(M.recipeEqual(prior,recipe)and\"unchanged\"or\"conflict\")counts[status]=counts[status]+1 rows[#rows+1]={name=name,status=status,incoming=recipe,existing=prior,selected=status==\"new\"}end table.sort(rows,function(a,b)return a.name<b.name end)return{rows=rows,counts=counts}end local function cloneRecipe(recipe)if type(recipe)==\"table\"and type(recipe.alternatives)==\"table\"then recipe=recipe.alternatives[1]end local copy={mode=recipe.mode,kind=recipe.kind,output=recipe.output,address=recipe.address,grid={},ingredients={}}for slot=1,9 do copy.grid[slot]=recipe.grid and recipe.grid[slot]end for _,input in ipairs(recipe.ingredients or{})do copy.ingredients[#copy.ingredients+1]={id=input.id,count=input.count,tag=input.tag}end return copy end function M.mergeRecipePack(existing,review,existingTags,incomingTags)if type(existing)~=\"table\"or type(review)~=\"table\"or type(review.rows)~=\"table\"then return nil,\"invalid recipe import review\"end local merged,imported={},0 for name,recipe in pairs(existing)do merged[name]=cloneRecipe(recipe)end for _,row in ipairs(review.rows)do if row.status==\"new\"and row.selected==true then merged[row.name],imported=cloneRecipe(row.incoming),imported+1 elseif row.status==\"conflict\"and row.selected==true then merged[row.name],imported=cloneRecipe(row.incoming),imported+1 end end local tags={}for name,members in pairs(existingTags or{})do tags[name]=members end for name,members in pairs(incomingTags or{})do tags[name]=members end local valid,err=M.validateRecipes(merged);if not valid then return nil,err end local graphOk,graphErr=M.validateRecipeGraph(merged,tags);if not graphOk then return nil,graphErr end return merged,imported,tags end function M.encodeRecipeFile(recipes,tags)local valid,err=M.validateRecipes(recipes);if not valid then return nil,err end local tagMap,tagsErr=validTags(tags or{});if not tagMap then return nil,tagsErr end local graphOk,graphErr=M.validateRecipeGraph(recipes,tagMap);if not graphOk then return nil,graphErr end local ok,encoded=pcall(textutils.serialise,{schema=1,recipes=recipes,tags=tagMap},{compact=true})if not ok or type(encoded)~=\"string\"then return nil,\"could not serialise recipes\"end return\"return \"..encoded..\"\\n\"end function M.writeRecipeFile(path,recipes,tags)if type(path)~=\"string\"or path==\"\"then return false,\"invalid recipe file path\"end local raw,encodeErr=M.encodeRecipeFile(recipes,tags);if not raw then return false,encodeErr end local parent=fs.getDir(path);if parent~=\"\"and not fs.exists(parent)then fs.makeDir(parent)end local temporary,backup=path..\".new\",path..\".bak\"if fs.exists(temporary)then fs.delete(temporary)end local handle=fs.open(temporary,\"w\");if not handle then return false,\"could not stage recipes\"end handle.write(raw);handle.close()local check=fs.open(temporary,\"r\");local staged=check and check.readAll()or nil;if check then check.close()end if not M.parseRecipeOverlay(staged or\"\")then if fs.exists(temporary)then fs.delete(temporary)end;return false,\"could not validate staged recipes\"end if fs.exists(backup)then fs.delete(backup)end if fs.exists(path)then fs.move(path,backup)end local moved,moveErr=pcall(fs.move,temporary,path)if not moved then if fs.exists(backup)and not fs.exists(path)then fs.move(backup,path)end;if fs.exists(temporary)then fs.delete(temporary)end;return false,tostring(moveErr)end if fs.exists(backup)then fs.delete(backup)end return true end local function selectedRecipe(entry)if type(entry)==\"table\"and type(entry.alternatives)==\"table\"then return entry.alternatives[1]end return entry end local function tagMembers(tags,reference)if reference:sub(1,1)~=\"#\"then return{reference}end local members=tags[reference:sub(2)]if type(members)~=\"table\"or#members==0 then return nil,\"no known members for \"..reference end return members end function M.normaliseTagChoices(input)if input==nil then return{}end if type(input)~=\"table\"then return nil,\"invalid tag choices\"end local out,count={},0 for tag,member in pairs(input)do count=count+1 if count>32 or not validReference(tag)or tostring(tag):sub(1,1)~=\"#\"or not validReference(member)or tostring(member):sub(1,1)==\"#\"then return nil,\"invalid tag choice\"end out[tag]=member end return out end local function recipeTags(recipe)local seen,out={},{}local function add(value)if type(value)==\"string\"and value:sub(1,1)==\"#\"and validReference(value)and not seen[value]then seen[value],out[#out+1]=true,value end end recipe=selectedRecipe(recipe)for _,ingredient in ipairs(type(recipe)==\"table\"and recipeIngredients(recipe,1)or{})do add(ingredient.name)end for slot=1,9 do add(type(recipe)==\"table\"and recipe.grid and recipe.grid[slot])end table.sort(out)return out end function M.recipeTagReferences(recipe)return recipeTags(recipe)end function M.recipeTagOptions(recipes,tags,item,stock)if type(item)~=\"string\"or not validReference(item)or item:sub(1,1)==\"#\"then return nil,\"invalid recipe item\"end local recipe=selectedRecipe(type(recipes)==\"table\"and recipes[item])if type(recipe)~=\"table\"then return nil,\"recipe is unavailable\"end local available,rows=M.normalise(stock),{}for _,tag in ipairs(recipeTags(recipe))do local members,err=tagMembers(type(tags)==\"table\"and tags or{},tag)if not members then return nil,err end local options={}for _,name in ipairs(members)do if validReference(name)and tostring(name):sub(1,1)~=\"#\"then options[#options+1]={name=name,count=available[name]or 0,craftable=type(recipes)==\"table\"and recipes[name]~=nil}end end table.sort(options,function(a,b)if a.count~=b.count then return a.count>b.count end if a.craftable~=b.craftable then return a.craftable end return a.name<b.name end)if#options==0 then return nil,\"no known members for \"..tag end rows[#rows+1]={tag=tag,options=options,default=options[1].name}end return{item=item,tags=rows}end local function availabilityScore(name,tags,available,recipes,visiting,memo)if type(name)~=\"string\"or not validReference(name)or name:sub(1,1)==\"#\"then return-math.huge end local stocked=tonumber(available[name])or 0 if stocked>0 then return 1000000000+math.min(stocked,1000000)end memo=memo or{}if memo[name]~=nil then return memo[name]end visiting=visiting or{}if visiting[name]then return-math.huge end local recipe=selectedRecipe(recipes[name])if type(recipe)~=\"table\"or recipe.special or not recipe.output or not recipe.address then memo[name]=-math.huge;return memo[name]end visiting[name]=true local score for _,ingredient in ipairs(recipeIngredients(recipe,1))do local candidate=-math.huge if ingredient.name:sub(1,1)==\"#\"then local members=tagMembers(tags,ingredient.name)if members then for _,member in ipairs(members)do candidate=math.max(candidate,availabilityScore(member,tags,available,recipes,visiting,memo))end end else candidate=availabilityScore(ingredient.name,tags,available,recipes,visiting,memo)end if candidate==-math.huge then score=-math.huge;break end score=score and math.min(score,candidate)or candidate end visiting[name]=nil if score==nil then score=-math.huge end if score>-math.huge then score=score-1 end memo[name]=score return score end local function chooseMember(reference,tags,available,recipes,choices,scores)local members,err=tagMembers(tags,reference);if not members then return nil,err end local chosen=choices and choices[reference]if chosen then local present=false for _,member in ipairs(members)do if member==chosen then present=true;break end end if not present then return nil,\"selected item is not a member of \"..reference end if(available[chosen]or 0)>0 or availabilityScore(chosen,tags,available,recipes,{},scores or{})>-math.huge then return chosen end return nil,\"selected item is neither stocked nor craftable: \"..chosen end local best,bestCount=nil,-1 for _,member in ipairs(members)do local count=available[member]or 0 if count>bestCount or(count==bestCount and(not best or member<best))then best,bestCount=member,count end end if best and bestCount>0 then return best end best,bestCount=nil,-math.huge for _,member in ipairs(members)do local score=availabilityScore(member,tags,available,recipes,{},scores or{})if score>bestCount or(score==bestCount and score>-math.huge and(not best or member<best))then best,bestCount=member,score end end if best then return best end return nil,\"no stocked or craftable member for \"..reference end local function requesterGrid(recipe,resolved,tags,available,recipes,choices,scores)local grid={}for slot=1,9 do local value=recipe.grid and recipe.grid[slot]if type(value)==\"string\"and value:sub(1,1)==\"#\"then local concrete=resolved[value]if not concrete then concrete=select(1,chooseMember(value,tags,available,recipes,choices,scores))end if not concrete then return nil,\"no concrete item available for requester tag \"..value end grid[slot]=concrete else grid[slot]=value end end return grid end function M.plan(recipes,stock,item,quantity,options)quantity=tonumber(quantity)if type(item)~=\"string\"or item==\"\"or not quantity or quantity<1 or quantity~=math.floor(quantity)then return nil,\"invalid item or quantity\"end local valid,errorText=M.validateRecipes(recipes)if not valid then return nil,errorText end options=type(options)==\"table\"and options or{}local choices,choiceErr=M.normaliseTagChoices(options.tagChoices)if not choices then return nil,choiceErr end local available,plan,visiting,tags,choiceScores=M.normalise(stock),{},{},type(options.tags)==\"table\"and options.tags or{},{}local function requireItem(name,needed)local used=options.forceRoot==true and name==item and 0 or math.min(available[name]or 0,needed)available[name]=(available[name]or 0)-used local missing=needed-used if missing<=0 then return true end if visiting[name]then return nil,\"recipe cycle at \"..name end local recipe=selectedRecipe(recipes[name])if not recipe then return nil,\"missing recipe for \"..name..\" (need \"..tostring(missing)..\")\"end if recipe.special or not recipe.output or not recipe.address then return nil,\"recipe \"..name..\" is not supported by Crafting Queue\"end visiting[name]=true local batches=math.ceil(missing/recipe.output)local inputs,resolved={},{}for _,ingredient in ipairs(recipeIngredients(recipe,batches))do local concrete,resolveErr=chooseMember(ingredient.name,tags,available,recipes,choices,choiceScores)if not concrete then return nil,resolveErr end inputs[#inputs+1]={name=concrete,count=ingredient.count,source=ingredient.name,tag=ingredient.name:sub(1,1)==\"#\"and ingredient.name or nil}if ingredient.name:sub(1,1)==\"#\"then resolved[ingredient.name]=concrete end local ok,err=requireItem(concrete,ingredient.count)if not ok then return nil,err end end visiting[name]=nil local produced=batches*recipe.output available[name]=(available[name]or 0)+produced-missing local dispatch=recipe.address==\"Crafter\"and\"requester\"or\"package\"if dispatch==\"requester\"and type(recipe.grid)~=\"table\"then return nil,\"Crafter recipe \"..name..\" has no 3x3 grid\"end local grid,gridErr=recipe.grid,nil if dispatch==\"requester\"then grid,gridErr=requesterGrid(recipe,resolved,tags,available,recipes,choices,choiceScores)if not grid then return nil,gridErr end end plan[#plan+1]={name=name,output=recipe.output,batches=batches,produced=produced,requested=missing,address=recipe.address,kind=recipe.kind,dispatch=dispatch,grid=grid,sourceGrid=recipe.grid,inputs=inputs,}return true end local ok,err=requireItem(item,quantity)return ok and plan or nil,err end function M.validateExecutionPlan(plan)if type(plan)~=\"table\"or#plan<1 or#plan>96 then return nil,\"invalid remote recipe plan\"end for _,step in ipairs(plan)do if type(step)~=\"table\"or not validReference(step.name)or tostring(step.name):sub(1,1)==\"#\"then return nil,\"invalid remote recipe output\"end if type(step.address)~=\"string\"or step.address==\"\"or#step.address>64 or step.address:find(\"[%c]\")then return nil,\"invalid remote recipe address\"end if step.dispatch~=\"requester\"and step.dispatch~=\"package\"then return nil,\"invalid remote recipe route\"end if(step.address==\"Crafter\")~=(step.dispatch==\"requester\")then return nil,\"invalid remote recipe executor\"end for _,field in ipairs({\"output\",\"batches\",\"produced\",\"requested\"})do local value=tonumber(step[field])if not value or value<1 or value~=math.floor(value)or value>65536 then return nil,\"invalid remote recipe quantity\"end end if step.produced~=step.batches*step.output then return nil,\"remote recipe output does not match its batch count\"end if step.dispatch==\"requester\"then if type(step.grid)~=\"table\"then return nil,\"remote Crafter recipe has no grid\"end for slot=1,9 do local value=step.grid[slot]if value~=nil and value~=false and not validReference(value)then return nil,\"invalid remote recipe grid\"end if type(value)==\"string\"and value:sub(1,1)==\"#\"then return nil,\"remote requester grid contains unresolved tag\"end end end if type(step.inputs)~=\"table\"or#step.inputs>64 then return nil,\"invalid remote recipe inputs\"end for _,input in ipairs(step.inputs)do if type(input)~=\"table\"or not validReference(input.name)or tostring(input.name):sub(1,1)==\"#\"then return nil,\"invalid remote recipe input\"end local count=tonumber(input.count)if not count or count<1 or count~=math.floor(count)or count>65536 then return nil,\"invalid remote recipe input quantity\"end if input.source~=nil and not validReference(input.source)then return nil,\"invalid remote recipe input source\"end end end return plan end return M",
  ["ceetos/lib/recipe_db.lua"] = "local M={}local BASE=\"/ceetos/recipes/vanilla-recipes-1.21.1-\"local ITEMS=\"/ceetos/recipes/vanilla-items-1.21.1.lua\"local TAGS=\"/ceetos/recipes/vanilla-tags-1.21.1.lua\"local AERO=\"/ceetos/recipes/aero-recipes-1.21.1.lua\"local baseCache={recipes=nil,database=nil,loads=0,hits=0}local function installed(path)if fs.exists(path)then return path end return\"/ceetos/ceetos/\"..path:sub(#\"/ceetos/\"+1)end local function loadTrusted(path,message)local loader,err=loadfile(installed(path))if not loader then return nil,message..\": \"..tostring(err)end local ok,value=pcall(loader)if not ok or type(value)~=\"table\"or value.schema~=1 then return nil,message end return value end local function loadOptionalTrusted(path,message)local tail=path:sub(#\"/ceetos/\"+1)local candidates={path,\"/ceetos/ceetos/\"..tail,\"/rom/modules/main/ceetos/\"..tail,\"/rom/modules/main/ceetos/ceetos/\"..tail,}local seen={}for _,candidate in ipairs(candidates)do if not seen[candidate]then seen[candidate]=true if fs.exists(candidate)then local loader,err=loadfile(candidate)if not loader then return nil,message..\": \"..tostring(err)end local ok,value=pcall(loader)if not ok or type(value)~=\"table\"or value.schema~=1 then return nil,message end return value end end end return{schema=1,recipes={},provenance={}}end local function trustedBase()local itemData,itemErr=loadTrusted(ITEMS,\"vanilla recipe items are unavailable\")if not itemData or type(itemData.items)~=\"table\"then return nil,itemErr or\"vanilla recipe items are corrupt\"end local combined for index=1,8 do local value,err=loadTrusted(BASE..tostring(index)..\".lua\",\"vanilla recipe base is unavailable\")if not value or type(value.recipes)~=\"table\"then return nil,err or\"vanilla recipe base is corrupt\"end combined=combined or{schema=1,minecraft=value.minecraft,items=itemData.items,recipes={},counts=value.counts}for id,row in pairs(value.recipes)do combined.recipes[id]=row end end local tags,err=loadTrusted(TAGS,\"vanilla item tags are unavailable\")if not tags or type(tags.tags)~=\"table\"then return nil,err or\"vanilla item tags are corrupt\"end combined.tags=tags.tags return combined end local function reference(db,value)value=tonumber(value)if not value or value==0 then return false end local name=db.items[math.abs(value)]if not name then return false end return value<0 and(\"#\"..name)or name end local function normaliseIngredients(db,rows)local ingredients={}for _,row in ipairs(rows or{})do local id=reference(db,row[1])if id then if row[3]==true and id:sub(1,1)~=\"#\"then id=\"#\"..id end ingredients[#ingredients+1]={id=id,count=tonumber(row[2])or 1,tag=id:sub(1,1)==\"#\"}end end return ingredients end local function shapelessGrid(ingredients)local grid,slot={},1 for _,ingredient in ipairs(ingredients)do for _=1,math.max(1,math.floor(tonumber(ingredient.count)or 1))do if slot>9 then return nil end grid[slot],slot=ingredient.id,slot+1 end end return grid end local function alternativeSignature(recipe)local grid,ingredients,metadata={},{},{}for slot=1,9 do grid[#grid+1]=tostring(recipe.grid and recipe.grid[slot]or\"\")end for _,ingredient in ipairs(recipe.ingredients or{})do ingredients[#ingredients+1]=table.concat({tostring(ingredient.id or\"\"),tostring(math.floor(tonumber(ingredient.count)or 1)),ingredient.tag and\"tag\"or\"item\",},\"\\30\")end table.sort(ingredients)for key,value in pairs(recipe.metadata or{})do if type(value)==\"string\"or type(value)==\"number\"or type(value)==\"boolean\"then metadata[#metadata+1]=tostring(key)..\"\\30\"..tostring(value)end end table.sort(metadata)return table.concat({tostring(recipe.mode or\"\"),tostring(recipe.kind or\"\"),tostring(recipe.address or\"\"),tostring(recipe.output or\"\"),recipe.special and\"special\"or\"normal\",table.concat(grid,\"\\31\"),table.concat(ingredients,\"\\31\"),table.concat(metadata,\"\\31\"),},\"\\29\")end local function appendAlternative(entry,recipe)local signature=alternativeSignature(recipe)entry._ceetosSignatures=entry._ceetosSignatures or{}if entry._ceetosSignatures[signature]then return false end entry._ceetosSignatures[signature]=true entry.alternatives[#entry.alternatives+1]=recipe return true end function M.loadBase()if baseCache.recipes and baseCache.database then baseCache.hits=baseCache.hits+1 return baseCache.recipes,baseCache.database end local db,err=trustedBase();if not db then return nil,err end local out,ids={},{}for id in pairs(db.recipes)do ids[#ids+1]=id end table.sort(ids)for _,id in ipairs(ids)do local row=db.recipes[id]local output=db.items[row.output]if output and not row.special then local recipe={id=id,mode=row.mode,kind=row.kind,output=row.count,address=row.address,grid={},ingredients={},metadata=row.metadata,special=row.special}for slot,value in pairs(row.grid or{})do recipe.grid[slot]=reference(db,value)end recipe.ingredients=normaliseIngredients(db,row.ingredients)if recipe.kind==\"crafting_shapeless\"and recipe.address==\"Crafter\"and next(recipe.grid)==nil then recipe.grid=shapelessGrid(recipe.ingredients)or{}end local entry=out[output]or{alternatives={}};out[output]=entry appendAlternative(entry,recipe)end end for _,entry in pairs(out)do entry._ceetosSignatures=nil table.sort(entry.alternatives,function(a,b)return a.id<b.id end)end local aero,aeroErr=loadOptionalTrusted(AERO,\"Aero recipe overlay is corrupt\")if not aero or type(aero.recipes)~=\"table\"then return nil,aeroErr or\"Aero recipe overlay is corrupt\"end for name,entry in pairs(aero.recipes)do out[name]=entry end db.aero={provenance=aero.provenance or{},recipes=aero.recipes}baseCache.recipes,baseCache.database=out,db baseCache.loads=baseCache.loads+1 return out,db end function M.invalidate()baseCache.recipes,baseCache.database=nil,nil end function M.cacheStatus()return{loaded=baseCache.recipes~=nil,loads=baseCache.loads,hits=baseCache.hits,}end function M.mergeOverlay(base,overlay)local merged={}for name,entry in pairs(base or{})do merged[name]=entry end for name,recipe in pairs(overlay or{})do merged[name]=recipe end return merged end function M.mergeTags(base,overlay)local merged={}for name,members in pairs(base or{})do merged[name]=members end for name,members in pairs(overlay or{})do merged[name]=members end return merged end return M",
  ["ceetos/recipes/aero-recipes-1.21.1.lua"] = "return{schema=1,minecraft=\"1.21.1\",provenance={pack=\"Aero\",inspected=\"2026-07-22\",archives={[\"mods/create-aeronautics-bundled-1.21.1-1.2.1.jar\"]=\"sha256:5a8c6d168ec1b47ecee7f2e83a93accbca71544d2b14ca1ca1b1271855f26248\",[\"mods/createthrusters-bundled-0.1.10.jar\"]=\"sha256:c1d528230dbc9f3034fd191c479c1b624b350d57275c978cb0f1f28bb18bfbc6\",},containers={aeronautics=\"META-INF/jarjar/dev.eriksonn.aeronautics.aeronautics-neoforge-1.21.1-1.2.1.jar\",simulated=\"META-INF/jarjar/dev.simulated_team.simulated.simulated-neoforge-1.21.1-1.2.1.jar\",createthrusters=\"mods/createthrusters-bundled-0.1.10.jar\",},sources={[\"aeronautics:andesite_propeller\"]=\"data/aeronautics/recipe/andesite_propeller.json\",[\"aeronautics:propeller_bearing\"]=\"data/aeronautics/recipe/propeller_bearing.json\",[\"aeronautics:smart_propeller\"]=\"data/aeronautics/recipe/smart_propeller.json\",[\"simulated:gimbal_sensor\"]=\"data/simulated/recipe/gimbal_sensor.json\",[\"simulated:altitude_sensor\"]=\"data/simulated/recipe/altitude_sensor.json\",[\"simulated:velocity_sensor\"]=\"data/simulated/recipe/velocity_sensor.json\",[\"simulated:optical_sensor\"]=\"data/simulated/recipe/optical_sensor.json\",[\"simulated:swivel_bearing\"]=\"data/simulated/recipe/swivel_bearing.json\",[\"simulated:throttle_lever\"]=\"data/simulated/recipe/throttle_lever.json\",[\"createthrusters:alternator\"]=\"data/createthrusters/recipe/alternator.json\",[\"createthrusters:industrial_motor\"]=\"data/createthrusters/recipe/industrial_motor.json\",[\"createthrusters:thruster_bearing\"]=\"data/createthrusters/recipe/thruster_bearing.json\",[\"createthrusters:analogue_joystick\"]=\"data/createthrusters/recipe/analogue_joystick.json\",},},recipes={[\"aeronautics:andesite_propeller\"]={mode=\"crafting\",kind=\"crafting_shaped\",output=1,address=\"Crafter\",grid={\"create:propeller\",false,false,\"#minecraft:wooden_slabs\",false,false,\"create:shaft\",false,false}},[\"aeronautics:propeller_bearing\"]={mode=\"crafting\",kind=\"crafting_shaped\",output=1,address=\"Crafter\",grid={false,\"#minecraft:wooden_slabs\",false,false,\"create:iron_sheet\",false,false,\"create:brass_casing\",false}},[\"aeronautics:smart_propeller\"]={mode=\"crafting\",kind=\"crafting_shaped\",output=2,address=\"Crafter\",grid={\"create:propeller\",false,false,\"simulated:gyroscopic_mechanism\",false,false,\"create:brass_casing\",false,false}},[\"simulated:gimbal_sensor\"]={mode=\"crafting\",kind=\"crafting_shaped\",output=1,address=\"Crafter\",grid={\"minecraft:compass\",false,false,\"simulated:gyroscopic_mechanism\",false,false,\"create:brass_casing\",false,false}},[\"simulated:altitude_sensor\"]={mode=\"crafting\",kind=\"crafting_shaped\",output=1,address=\"Crafter\",grid={\"minecraft:paper\",false,false,\"create:iron_sheet\",false,false,\"create:andesite_casing\",false,false}},[\"simulated:velocity_sensor\"]={mode=\"crafting\",kind=\"crafting_shaped\",output=1,address=\"Crafter\",grid={\"create:propeller\",false,false,\"minecraft:barrel\",false,false,\"create:andesite_casing\",false,false}},[\"simulated:optical_sensor\"]={mode=\"crafting\",kind=\"crafting_shaped\",output=1,address=\"Crafter\",grid={false,\"minecraft:amethyst_shard\",false,false,\"create:electron_tube\",false,false,\"create:brass_casing\",false}},[\"simulated:swivel_bearing\"]={mode=\"crafting\",kind=\"crafting_shaped\",output=1,address=\"Crafter\",grid={false,\"#minecraft:wooden_slabs\",false,false,\"create:industrial_iron_block\",false,false,\"create:cogwheel\",false}},[\"simulated:throttle_lever\"]={mode=\"crafting\",kind=\"crafting_shaped\",output=1,address=\"Crafter\",grid={\"minecraft:stick\",false,false,\"create:brass_casing\",false,false}},[\"createthrusters:alternator\"]={mode=\"crafting\",kind=\"crafting_shaped\",output=1,address=\"Crafter\",grid={\"create:industrial_iron_block\",\"create:copper_casing\",\"create:industrial_iron_block\",\"minecraft:redstone\",\"minecraft:gold_ingot\",\"minecraft:redstone\",\"create:industrial_iron_block\",\"create:shaft\",\"create:industrial_iron_block\"}},[\"createthrusters:industrial_motor\"]={mode=\"crafting\",kind=\"crafting_shaped\",output=1,address=\"Crafter\",grid={\"create:industrial_iron_block\",\"create:brass_casing\",\"create:industrial_iron_block\",\"create:andesite_alloy\",\"createthrusters:andesite_cable\",\"create:andesite_alloy\",\"create:industrial_iron_block\",\"create:shaft\",\"create:industrial_iron_block\"}},[\"createthrusters:thruster_bearing\"]={mode=\"crafting\",kind=\"crafting_shapeless\",output=1,address=\"Crafter\",grid={\"simulated:swivel_bearing\",\"create:precision_mechanism\"},ingredients={{id=\"simulated:swivel_bearing\",count=1},{id=\"create:precision_mechanism\",count=1}}},[\"createthrusters:analogue_joystick\"]={mode=\"crafting\",kind=\"crafting_shapeless\",output=1,address=\"Crafter\",grid={\"simulated:throttle_lever\",\"simulated:throttle_lever\"},ingredients={{id=\"simulated:throttle_lever\",count=2}}},},}",
  ["ceetos/recipes/vanilla-items-1.21.1.lua"] = "return{[\"schema\"]=1,[\"minecraft\"]=\"1.21.1\",[\"items\"]={[1]=\"minecraft:acacia_boat\",[2]=\"minecraft:acacia_planks\",[3]=\"minecraft:acacia_button\",[4]=\"minecraft:acacia_chest_boat\",[5]=\"minecraft:chest\",[6]=\"minecraft:acacia_door\",[7]=\"minecraft:acacia_fence\",[8]=\"minecraft:stick\",[9]=\"minecraft:acacia_fence_gate\",[10]=\"minecraft:acacia_hanging_sign\",[11]=\"minecraft:chain\",[12]=\"minecraft:stripped_acacia_log\",[13]=\"minecraft:acacia_logs\",[14]=\"minecraft:acacia_pressure_plate\",[15]=\"minecraft:acacia_sign\",[16]=\"minecraft:acacia_slab\",[17]=\"minecraft:acacia_stairs\",[18]=\"minecraft:acacia_trapdoor\",[19]=\"minecraft:acacia_wood\",[20]=\"minecraft:acacia_log\",[21]=\"minecraft:activator_rail\",[22]=\"minecraft:iron_ingot\",[23]=\"minecraft:redstone_torch\",[24]=\"minecraft:amethyst_block\",[25]=\"minecraft:amethyst_shard\",[26]=\"minecraft:andesite\",[27]=\"minecraft:diorite\",[28]=\"minecraft:cobblestone\",[29]=\"minecraft:andesite_slab\",[30]=\"minecraft:andesite_stairs\",[31]=\"minecraft:andesite_wall\",[32]=\"minecraft:anvil\",[33]=\"minecraft:iron_block\",[34]=\"minecraft:armor_stand\",[35]=\"minecraft:smooth_stone_slab\",[36]=\"minecraft:arrow\",[37]=\"minecraft:flint\",[38]=\"minecraft:feather\",[39]=\"minecraft:baked_potato\",[40]=\"minecraft:potato\",[41]=\"minecraft:bamboo_block\",[42]=\"minecraft:bamboo\",[43]=\"minecraft:bamboo_button\",[44]=\"minecraft:bamboo_planks\",[45]=\"minecraft:bamboo_chest_raft\",[46]=\"minecraft:bamboo_raft\",[47]=\"minecraft:bamboo_door\",[48]=\"minecraft:bamboo_fence\",[49]=\"minecraft:bamboo_fence_gate\",[50]=\"minecraft:bamboo_hanging_sign\",[51]=\"minecraft:stripped_bamboo_block\",[52]=\"minecraft:bamboo_mosaic\",[53]=\"minecraft:bamboo_slab\",[54]=\"minecraft:bamboo_mosaic_slab\",[55]=\"minecraft:bamboo_mosaic_stairs\",[56]=\"minecraft:bamboo_blocks\",[57]=\"minecraft:bamboo_pressure_plate\",[58]=\"minecraft:bamboo_sign\",[59]=\"minecraft:bamboo_stairs\",[60]=\"minecraft:bamboo_trapdoor\",[61]=\"minecraft:barrel\",[62]=\"minecraft:planks\",[63]=\"minecraft:wooden_slabs\",[64]=\"minecraft:beacon\",[65]=\"minecraft:glass\",[66]=\"minecraft:nether_star\",[67]=\"minecraft:obsidian\",[68]=\"minecraft:beehive\",[69]=\"minecraft:honeycomb\",[70]=\"minecraft:beetroot_soup\",[71]=\"minecraft:bowl\",[72]=\"minecraft:beetroot\",[73]=\"minecraft:birch_boat\",[74]=\"minecraft:birch_planks\",[75]=\"minecraft:birch_button\",[76]=\"minecraft:birch_chest_boat\",[77]=\"minecraft:birch_door\",[78]=\"minecraft:birch_fence\",[79]=\"minecraft:birch_fence_gate\",[80]=\"minecraft:birch_hanging_sign\",[81]=\"minecraft:stripped_birch_log\",[82]=\"minecraft:birch_logs\",[83]=\"minecraft:birch_pressure_plate\",[84]=\"minecraft:birch_sign\",[85]=\"minecraft:birch_slab\",[86]=\"minecraft:birch_stairs\",[87]=\"minecraft:birch_trapdoor\",[88]=\"minecraft:birch_wood\",[89]=\"minecraft:birch_log\",[90]=\"minecraft:black_banner\",[91]=\"minecraft:black_wool\",[92]=\"minecraft:black_bed\",[93]=\"minecraft:black_candle\",[94]=\"minecraft:candle\",[95]=\"minecraft:black_dye\",[96]=\"minecraft:black_carpet\",[97]=\"minecraft:black_concrete_powder\",[98]=\"minecraft:sand\",[99]=\"minecraft:gravel\",[100]=\"minecraft:ink_sac\",[101]=\"minecraft:wither_rose\",[102]=\"minecraft:black_glazed_terracotta\",[103]=\"minecraft:black_terracotta\",[104]=\"minecraft:black_stained_glass\",[105]=\"minecraft:black_stained_glass_pane\",[106]=\"minecraft:glass_pane\",[107]=\"minecraft:terracotta\",[108]=\"minecraft:blackstone_slab\",[109]=\"minecraft:blackstone\",[110]=\"minecraft:blackstone_stairs\",[111]=\"minecraft:blackstone_wall\",[112]=\"minecraft:blast_furnace\",[113]=\"minecraft:furnace\",[114]=\"minecraft:smooth_stone\",[115]=\"minecraft:blaze_powder\",[116]=\"minecraft:blaze_rod\",[117]=\"minecraft:blue_banner\",[118]=\"minecraft:blue_wool\",[119]=\"minecraft:blue_bed\",[120]=\"minecraft:blue_candle\",[121]=\"minecraft:blue_dye\",[122]=\"minecraft:blue_carpet\",[123]=\"minecraft:blue_concrete_powder\",[124]=\"minecraft:lapis_lazuli\",[125]=\"minecraft:cornflower\",[126]=\"minecraft:blue_glazed_terracotta\",[127]=\"minecraft:blue_terracotta\",[128]=\"minecraft:blue_ice\",[129]=\"minecraft:packed_ice\",[130]=\"minecraft:blue_stained_glass\",[131]=\"minecraft:blue_stained_glass_pane\",[132]=\"minecraft:bolt_armor_trim_smithing_template\",[133]=\"minecraft:diamond\",[134]=\"minecraft:trimmable_armor\",[135]=\"minecraft:trim_materials\",[136]=\"minecraft:bone_block\",[137]=\"minecraft:bone_meal\",[138]=\"minecraft:bone\",[139]=\"minecraft:book\",[140]=\"minecraft:paper\",[141]=\"minecraft:leather\",[142]=\"minecraft:bookshelf\",[143]=\"minecraft:bow\",[144]=\"minecraft:string\",[145]=\"minecraft:bread\",[146]=\"minecraft:wheat\",[147]=\"minecraft:brewing_stand\",[148]=\"minecraft:stone_crafting_materials\",[149]=\"minecraft:brick\",[150]=\"minecraft:clay_ball\",[151]=\"minecraft:brick_slab\",[152]=\"minecraft:bricks\",[153]=\"minecraft:brick_stairs\",[154]=\"minecraft:brick_wall\",[155]=\"minecraft:brown_banner\",[156]=\"minecraft:brown_wool\",[157]=\"minecraft:brown_bed\",[158]=\"minecraft:brown_candle\",[159]=\"minecraft:brown_dye\",[160]=\"minecraft:brown_carpet\",[161]=\"minecraft:brown_concrete_powder\",[162]=\"minecraft:cocoa_beans\",[163]=\"minecraft:brown_glazed_terracotta\",[164]=\"minecraft:brown_terracotta\",[165]=\"minecraft:brown_stained_glass\",[166]=\"minecraft:brown_stained_glass_pane\",[167]=\"minecraft:brush\",[168]=\"minecraft:copper_ingot\",[169]=\"minecraft:bucket\",[170]=\"minecraft:cake\",[171]=\"minecraft:milk_bucket\",[172]=\"minecraft:sugar\",[173]=\"minecraft:egg\",[174]=\"minecraft:calibrated_sculk_sensor\",[175]=\"minecraft:sculk_sensor\",[176]=\"minecraft:campfire\",[177]=\"minecraft:coals\",[178]=\"minecraft:logs\",[179]=\"minecraft:carrot_on_a_stick\",[180]=\"minecraft:fishing_rod\",[181]=\"minecraft:carrot\",[182]=\"minecraft:cartography_table\",[183]=\"minecraft:cauldron\",[184]=\"minecraft:iron_nugget\",[185]=\"minecraft:charcoal\",[186]=\"minecraft:logs_that_burn\",[187]=\"minecraft:cherry_boat\",[188]=\"minecraft:cherry_planks\",[189]=\"minecraft:cherry_button\",[190]=\"minecraft:cherry_chest_boat\",[191]=\"minecraft:cherry_door\",[192]=\"minecraft:cherry_fence\",[193]=\"minecraft:cherry_fence_gate\",[194]=\"minecraft:cherry_hanging_sign\",[195]=\"minecraft:stripped_cherry_log\",[196]=\"minecraft:cherry_logs\",[197]=\"minecraft:cherry_pressure_plate\",[198]=\"minecraft:cherry_sign\",[199]=\"minecraft:cherry_slab\",[200]=\"minecraft:cherry_stairs\",[201]=\"minecraft:cherry_trapdoor\",[202]=\"minecraft:cherry_wood\",[203]=\"minecraft:cherry_log\",[204]=\"minecraft:chest_minecart\",[205]=\"minecraft:minecart\",[206]=\"minecraft:chiseled_bookshelf\",[207]=\"minecraft:chiseled_copper\",[208]=\"minecraft:cut_copper_slab\",[209]=\"minecraft:copper_block\",[210]=\"minecraft:cut_copper\",[211]=\"minecraft:chiseled_deepslate\",[212]=\"minecraft:cobbled_deepslate_slab\",[213]=\"minecraft:cobbled_deepslate\",[214]=\"minecraft:chiseled_nether_bricks\",[215]=\"minecraft:nether_brick_slab\",[216]=\"minecraft:nether_bricks\",[217]=\"minecraft:chiseled_polished_blackstone\",[218]=\"minecraft:polished_blackstone_slab\",[219]=\"minecraft:polished_blackstone\",[220]=\"minecraft:chiseled_quartz_block\",[221]=\"minecraft:quartz_slab\",[222]=\"minecraft:quartz_block\",[223]=\"minecraft:chiseled_red_sandstone\",[224]=\"minecraft:red_sandstone_slab\",[225]=\"minecraft:red_sandstone\",[226]=\"minecraft:chiseled_sandstone\",[227]=\"minecraft:sandstone_slab\",[228]=\"minecraft:sandstone\",[229]=\"minecraft:chiseled_stone_bricks\",[230]=\"minecraft:stone_brick_slab\",[231]=\"minecraft:stone_bricks\",[232]=\"minecraft:stone\",[233]=\"minecraft:chiseled_tuff\",[234]=\"minecraft:tuff_slab\",[235]=\"minecraft:chiseled_tuff_bricks\",[236]=\"minecraft:tuff_brick_slab\",[237]=\"minecraft:polished_tuff\",[238]=\"minecraft:tuff_bricks\",[239]=\"minecraft:tuff\",[240]=\"minecraft:clay\",[241]=\"minecraft:clock\",[242]=\"minecraft:gold_ingot\",[243]=\"minecraft:redstone\",[244]=\"minecraft:coal\",[245]=\"minecraft:coal_block\",[246]=\"minecraft:coal_ore\",[247]=\"minecraft:deepslate_coal_ore\",[248]=\"minecraft:coarse_dirt\",[249]=\"minecraft:dirt\",[250]=\"minecraft:coast_armor_trim_smithing_template\",[251]=\"minecraft:cobbled_deepslate_stairs\",[252]=\"minecraft:cobbled_deepslate_wall\",[253]=\"minecraft:cobblestone_slab\",[254]=\"minecraft:cobblestone_stairs\",[255]=\"minecraft:cobblestone_wall\",[256]=\"minecraft:comparator\",[257]=\"minecraft:quartz\",[258]=\"minecraft:compass\",[259]=\"minecraft:composter\",[260]=\"minecraft:conduit\",[261]=\"minecraft:nautilus_shell\",[262]=\"minecraft:heart_of_the_sea\",[263]=\"minecraft:cooked_beef\",[264]=\"minecraft:beef\",[265]=\"minecraft:cooked_chicken\",[266]=\"minecraft:chicken\",[267]=\"minecraft:cooked_cod\",[268]=\"minecraft:cod\",[269]=\"minecraft:cooked_mutton\",[270]=\"minecraft:mutton\",[271]=\"minecraft:cooked_porkchop\",[272]=\"minecraft:porkchop\",[273]=\"minecraft:cooked_rabbit\",[274]=\"minecraft:rabbit\",[275]=\"minecraft:cooked_salmon\",[276]=\"minecraft:salmon\",[277]=\"minecraft:cookie\",[278]=\"minecraft:copper_bulb\",[279]=\"minecraft:copper_door\",[280]=\"minecraft:copper_grate\",[281]=\"minecraft:copper_ore\",[282]=\"minecraft:deepslate_copper_ore\",[283]=\"minecraft:raw_copper\",[284]=\"minecraft:waxed_copper_block\",[285]=\"minecraft:copper_trapdoor\",[286]=\"minecraft:cracked_deepslate_bricks\",[287]=\"minecraft:deepslate_bricks\",[288]=\"minecraft:cracked_deepslate_tiles\",[289]=\"minecraft:deepslate_tiles\",[290]=\"minecraft:cracked_nether_bricks\",[291]=\"minecraft:cracked_polished_blackstone_bricks\",[292]=\"minecraft:polished_blackstone_bricks\",[293]=\"minecraft:cracked_stone_bricks\",[294]=\"minecraft:crafter\",[295]=\"minecraft:crafting_table\",[296]=\"minecraft:dropper\",[297]=\"minecraft:creeper_banner_pattern\",[298]=\"minecraft:creeper_head\",[299]=\"minecraft:crimson_button\",[300]=\"minecraft:crimson_planks\",[301]=\"minecraft:crimson_door\",[302]=\"minecraft:crimson_fence\",[303]=\"minecraft:crimson_fence_gate\",[304]=\"minecraft:crimson_hanging_sign\",[305]=\"minecraft:stripped_crimson_stem\",[306]=\"minecraft:crimson_hyphae\",[307]=\"minecraft:crimson_stem\",[308]=\"minecraft:crimson_stems\",[309]=\"minecraft:crimson_pressure_plate\",[310]=\"minecraft:crimson_sign\",[311]=\"minecraft:crimson_slab\",[312]=\"minecraft:crimson_stairs\",[313]=\"minecraft:crimson_trapdoor\",[314]=\"minecraft:crossbow\",[315]=\"minecraft:tripwire_hook\",[316]=\"minecraft:cut_copper_stairs\",[317]=\"minecraft:cut_red_sandstone\",[318]=\"minecraft:cut_red_sandstone_slab\",[319]=\"minecraft:cut_sandstone\",[320]=\"minecraft:cut_sandstone_slab\",[321]=\"minecraft:cyan_banner\",[322]=\"minecraft:cyan_wool\",[323]=\"minecraft:cyan_bed\",[324]=\"minecraft:cyan_candle\",[325]=\"minecraft:cyan_dye\",[326]=\"minecraft:cyan_carpet\",[327]=\"minecraft:cyan_concrete_powder\",[328]=\"minecraft:green_dye\",[329]=\"minecraft:pitcher_plant\",[330]=\"minecraft:cyan_glazed_terracotta\",[331]=\"minecraft:cyan_terracotta\",[332]=\"minecraft:cyan_stained_glass\",[333]=\"minecraft:cyan_stained_glass_pane\",[334]=\"minecraft:dark_oak_boat\",[335]=\"minecraft:dark_oak_planks\",[336]=\"minecraft:dark_oak_button\",[337]=\"minecraft:dark_oak_chest_boat\",[338]=\"minecraft:dark_oak_door\",[339]=\"minecraft:dark_oak_fence\",[340]=\"minecraft:dark_oak_fence_gate\",[341]=\"minecraft:dark_oak_hanging_sign\",[342]=\"minecraft:stripped_dark_oak_log\",[343]=\"minecraft:dark_oak_logs\",[344]=\"minecraft:dark_oak_pressure_plate\",[345]=\"minecraft:dark_oak_sign\",[346]=\"minecraft:dark_oak_slab\",[347]=\"minecraft:dark_oak_stairs\",[348]=\"minecraft:dark_oak_trapdoor\",[349]=\"minecraft:dark_oak_wood\",[350]=\"minecraft:dark_oak_log\",[351]=\"minecraft:dark_prismarine\",[352]=\"minecraft:prismarine_shard\",[353]=\"minecraft:dark_prismarine_slab\",[354]=\"minecraft:dark_prismarine_stairs\",[355]=\"minecraft:daylight_detector\",[356]=\"minecraft:decorated_pot\",[357]=\"minecraft:deepslate\",[358]=\"minecraft:deepslate_brick_slab\",[359]=\"minecraft:polished_deepslate\",[360]=\"minecraft:deepslate_brick_stairs\",[361]=\"minecraft:deepslate_brick_wall\",[362]=\"minecraft:deepslate_tile_slab\",[363]=\"minecraft:deepslate_tile_stairs\",[364]=\"minecraft:deepslate_tile_wall\",[365]=\"minecraft:detector_rail\",[366]=\"minecraft:stone_pressure_plate\",[367]=\"minecraft:diamond_block\",[368]=\"minecraft:diamond_axe\",[369]=\"minecraft:diamond_boots\",[370]=\"minecraft:diamond_chestplate\",[371]=\"minecraft:deepslate_diamond_ore\",[372]=\"minecraft:diamond_ore\",[373]=\"minecraft:diamond_helmet\",[374]=\"minecraft:diamond_hoe\",[375]=\"minecraft:diamond_leggings\",[376]=\"minecraft:diamond_pickaxe\",[377]=\"minecraft:diamond_shovel\",[378]=\"minecraft:diamond_sword\",[379]=\"minecraft:diorite_slab\",[380]=\"minecraft:diorite_stairs\",[381]=\"minecraft:diorite_wall\",[382]=\"minecraft:dispenser\",[383]=\"minecraft:dried_kelp\",[384]=\"minecraft:dried_kelp_block\",[385]=\"minecraft:kelp\",[386]=\"minecraft:dripstone_block\",[387]=\"minecraft:pointed_dripstone\",[388]=\"minecraft:dune_armor_trim_smithing_template\",[389]=\"minecraft:gray_bed\",[390]=\"minecraft:gray_dye\",[391]=\"minecraft:gray_carpet\",[392]=\"minecraft:gray_wool\",[393]=\"minecraft:green_bed\",[394]=\"minecraft:green_carpet\",[395]=\"minecraft:green_wool\",[396]=\"minecraft:light_blue_bed\",[397]=\"minecraft:light_blue_dye\",[398]=\"minecraft:light_blue_carpet\",[399]=\"minecraft:light_blue_wool\",[400]=\"minecraft:light_gray_bed\",[401]=\"minecraft:light_gray_dye\",[402]=\"minecraft:light_gray_carpet\",[403]=\"minecraft:light_gray_wool\",[404]=\"minecraft:lime_bed\",[405]=\"minecraft:lime_dye\",[406]=\"minecraft:lime_carpet\",[407]=\"minecraft:lime_wool\",[408]=\"minecraft:magenta_bed\",[409]=\"minecraft:magenta_dye\",[410]=\"minecraft:magenta_carpet\",[411]=\"minecraft:magenta_wool\",[412]=\"minecraft:orange_bed\",[413]=\"minecraft:orange_dye\",[414]=\"minecraft:orange_carpet\",[415]=\"minecraft:orange_wool\",[416]=\"minecraft:pink_bed\",[417]=\"minecraft:pink_dye\",[418]=\"minecraft:pink_carpet\",[419]=\"minecraft:pink_wool\",[420]=\"minecraft:purple_bed\",[421]=\"minecraft:purple_dye\",[422]=\"minecraft:purple_carpet\",[423]=\"minecraft:purple_wool\",[424]=\"minecraft:red_bed\",[425]=\"minecraft:red_dye\",[426]=\"minecraft:red_carpet\",[427]=\"minecraft:red_wool\",[428]=\"minecraft:white_bed\",[429]=\"minecraft:white_dye\",[430]=\"minecraft:white_carpet\",[431]=\"minecraft:white_wool\",[432]=\"minecraft:yellow_bed\",[433]=\"minecraft:yellow_dye\",[434]=\"minecraft:yellow_carpet\",[435]=\"minecraft:yellow_wool\",[436]=\"minecraft:emerald\",[437]=\"minecraft:emerald_block\",[438]=\"minecraft:deepslate_emerald_ore\",[439]=\"minecraft:emerald_ore\",[440]=\"minecraft:enchanting_table\",[441]=\"minecraft:end_crystal\",[442]=\"minecraft:ender_eye\",[443]=\"minecraft:ghast_tear\",[444]=\"minecraft:end_rod\",[445]=\"minecraft:popped_chorus_fruit\",[446]=\"minecraft:end_stone_brick_slab\",[447]=\"minecraft:end_stone_bricks\",[448]=\"minecraft:end_stone\",[449]=\"minecraft:end_stone_brick_stairs\",[450]=\"minecraft:end_stone_brick_wall\",[451]=\"minecraft:ender_chest\",[452]=\"minecraft:ender_pearl\",[453]=\"minecraft:exposed_chiseled_copper\",[454]=\"minecraft:exposed_cut_copper_slab\",[455]=\"minecraft:exposed_copper\",[456]=\"minecraft:exposed_cut_copper\",[457]=\"minecraft:exposed_copper_bulb\",[458]=\"minecraft:exposed_copper_grate\",[459]=\"minecraft:exposed_cut_copper_stairs\",[460]=\"minecraft:eye_armor_trim_smithing_template\",[461]=\"minecraft:fermented_spider_eye\",[462]=\"minecraft:spider_eye\",[463]=\"minecraft:brown_mushroom\",[464]=\"minecraft:fire_charge\",[465]=\"minecraft:gunpowder\",[466]=\"minecraft:firework_rocket\",[467]=\"minecraft:fletching_table\",[468]=\"minecraft:flint_and_steel\",[469]=\"minecraft:flow_armor_trim_smithing_template\",[470]=\"minecraft:breeze_rod\",[471]=\"minecraft:flower_banner_pattern\",[472]=\"minecraft:oxeye_daisy\",[473]=\"minecraft:flower_pot\",[474]=\"minecraft:furnace_minecart\",[475]=\"minecraft:smelts_to_glass\",[476]=\"minecraft:glass_bottle\",[477]=\"minecraft:glistering_melon_slice\",[478]=\"minecraft:gold_nugget\",[479]=\"minecraft:melon_slice\",[480]=\"minecraft:glow_item_frame\",[481]=\"minecraft:item_frame\",[482]=\"minecraft:glow_ink_sac\",[483]=\"minecraft:glowstone\",[484]=\"minecraft:glowstone_dust\",[485]=\"minecraft:gold_block\",[486]=\"minecraft:deepslate_gold_ore\",[487]=\"minecraft:gold_ore\",[488]=\"minecraft:nether_gold_ore\",[489]=\"minecraft:raw_gold\",[490]=\"minecraft:golden_apple\",[491]=\"minecraft:apple\",[492]=\"minecraft:golden_axe\",[493]=\"minecraft:golden_boots\",[494]=\"minecraft:golden_carrot\",[495]=\"minecraft:golden_chestplate\",[496]=\"minecraft:golden_helmet\",[497]=\"minecraft:golden_hoe\",[498]=\"minecraft:golden_leggings\",[499]=\"minecraft:golden_pickaxe\",[500]=\"minecraft:golden_shovel\",[501]=\"minecraft:golden_sword\",[502]=\"minecraft:granite\",[503]=\"minecraft:granite_slab\",[504]=\"minecraft:granite_stairs\",[505]=\"minecraft:granite_wall\",[506]=\"minecraft:gray_banner\",[507]=\"minecraft:gray_candle\",[508]=\"minecraft:gray_concrete_powder\",[509]=\"minecraft:gray_glazed_terracotta\",[510]=\"minecraft:gray_terracotta\",[511]=\"minecraft:gray_stained_glass\",[512]=\"minecraft:gray_stained_glass_pane\",[513]=\"minecraft:green_banner\",[514]=\"minecraft:green_candle\",[515]=\"minecraft:green_concrete_powder\",[516]=\"minecraft:cactus\",[517]=\"minecraft:green_glazed_terracotta\",[518]=\"minecraft:green_terracotta\",[519]=\"minecraft:green_stained_glass\",[520]=\"minecraft:green_stained_glass_pane\",[521]=\"minecraft:grindstone\",[522]=\"minecraft:stone_slab\",[523]=\"minecraft:hay_block\",[524]=\"minecraft:heavy_weighted_pressure_plate\",[525]=\"minecraft:honey_block\",[526]=\"minecraft:honey_bottle\",[527]=\"minecraft:honeycomb_block\",[528]=\"minecraft:hopper\",[529]=\"minecraft:hopper_minecart\",[530]=\"minecraft:host_armor_trim_smithing_template\",[531]=\"minecraft:iron_axe\",[532]=\"minecraft:iron_bars\",[533]=\"minecraft:iron_boots\",[534]=\"minecraft:iron_chestplate\",[535]=\"minecraft:iron_door\",[536]=\"minecraft:iron_helmet\",[537]=\"minecraft:iron_hoe\",[538]=\"minecraft:deepslate_iron_ore\",[539]=\"minecraft:iron_ore\",[540]=\"minecraft:raw_iron\",[541]=\"minecraft:iron_leggings\",[542]=\"minecraft:iron_pickaxe\",[543]=\"minecraft:iron_shovel\",[544]=\"minecraft:iron_sword\",[545]=\"minecraft:iron_trapdoor\",[546]=\"minecraft:jack_o_lantern\",[547]=\"minecraft:carved_pumpkin\",[548]=\"minecraft:torch\",[549]=\"minecraft:jukebox\",[550]=\"minecraft:jungle_boat\",[551]=\"minecraft:jungle_planks\",[552]=\"minecraft:jungle_button\",[553]=\"minecraft:jungle_chest_boat\",[554]=\"minecraft:jungle_door\",[555]=\"minecraft:jungle_fence\",[556]=\"minecraft:jungle_fence_gate\",[557]=\"minecraft:jungle_hanging_sign\",[558]=\"minecraft:stripped_jungle_log\",[559]=\"minecraft:jungle_logs\",[560]=\"minecraft:jungle_pressure_plate\",[561]=\"minecraft:jungle_sign\",[562]=\"minecraft:jungle_slab\",[563]=\"minecraft:jungle_stairs\",[564]=\"minecraft:jungle_trapdoor\",[565]=\"minecraft:jungle_wood\",[566]=\"minecraft:jungle_log\",[567]=\"minecraft:ladder\",[568]=\"minecraft:lantern\",[569]=\"minecraft:lapis_block\",[570]=\"minecraft:deepslate_lapis_ore\",[571]=\"minecraft:lapis_ore\",[572]=\"minecraft:lead\",[573]=\"minecraft:slime_ball\",[574]=\"minecraft:rabbit_hide\",[575]=\"minecraft:leather_boots\",[576]=\"minecraft:leather_chestplate\",[577]=\"minecraft:leather_helmet\",[578]=\"minecraft:leather_horse_armor\",[579]=\"minecraft:leather_leggings\",[580]=\"minecraft:lectern\",[581]=\"minecraft:lever\",[582]=\"minecraft:light_blue_banner\",[583]=\"minecraft:light_blue_candle\",[584]=\"minecraft:light_blue_concrete_powder\",[585]=\"minecraft:blue_orchid\",[586]=\"minecraft:light_blue_glazed_terracotta\",[587]=\"minecraft:light_blue_terracotta\",[588]=\"minecraft:light_blue_stained_glass\",[589]=\"minecraft:light_blue_stained_glass_pane\",[590]=\"minecraft:light_gray_banner\",[591]=\"minecraft:light_gray_candle\",[592]=\"minecraft:light_gray_concrete_powder\",[593]=\"minecraft:azure_bluet\",[594]=\"minecraft:white_tulip\",[595]=\"minecraft:light_gray_glazed_terracotta\",[596]=\"minecraft:light_gray_terracotta\",[597]=\"minecraft:light_gray_stained_glass\",[598]=\"minecraft:light_gray_stained_glass_pane\",[599]=\"minecraft:light_weighted_pressure_plate\",[600]=\"minecraft:lightning_rod\",[601]=\"minecraft:lime_banner\",[602]=\"minecraft:lime_candle\",[603]=\"minecraft:lime_concrete_powder\",[604]=\"minecraft:sea_pickle\",[605]=\"minecraft:lime_glazed_terracotta\",[606]=\"minecraft:lime_terracotta\",[607]=\"minecraft:lime_stained_glass\",[608]=\"minecraft:lime_stained_glass_pane\",[609]=\"minecraft:lodestone\",[610]=\"minecraft:netherite_ingot\",[611]=\"minecraft:loom\",[612]=\"minecraft:mace\",[613]=\"minecraft:heavy_core\",[614]=\"minecraft:magenta_banner\",[615]=\"minecraft:magenta_candle\",[616]=\"minecraft:magenta_concrete_powder\",[617]=\"minecraft:allium\",[618]=\"minecraft:lilac\",[619]=\"minecraft:magenta_glazed_terracotta\",[620]=\"minecraft:magenta_terracotta\",[621]=\"minecraft:magenta_stained_glass\",[622]=\"minecraft:magenta_stained_glass_pane\",[623]=\"minecraft:magma_block\",[624]=\"minecraft:magma_cream\",[625]=\"minecraft:mangrove_boat\",[626]=\"minecraft:mangrove_planks\",[627]=\"minecraft:mangrove_button\",[628]=\"minecraft:mangrove_chest_boat\",[629]=\"minecraft:mangrove_door\",[630]=\"minecraft:mangrove_fence\",[631]=\"minecraft:mangrove_fence_gate\",[632]=\"minecraft:mangrove_hanging_sign\",[633]=\"minecraft:stripped_mangrove_log\",[634]=\"minecraft:mangrove_logs\",[635]=\"minecraft:mangrove_pressure_plate\",[636]=\"minecraft:mangrove_sign\",[637]=\"minecraft:mangrove_slab\",[638]=\"minecraft:mangrove_stairs\",[639]=\"minecraft:mangrove_trapdoor\",[640]=\"minecraft:mangrove_wood\",[641]=\"minecraft:mangrove_log\",[642]=\"minecraft:map\",[643]=\"minecraft:melon\",[644]=\"minecraft:melon_seeds\",[645]=\"minecraft:mojang_banner_pattern\",[646]=\"minecraft:enchanted_golden_apple\",[647]=\"minecraft:moss_carpet\",[648]=\"minecraft:moss_block\",[649]=\"minecraft:mossy_cobblestone\",[650]=\"minecraft:vine\",[651]=\"minecraft:mossy_cobblestone_slab\",[652]=\"minecraft:mossy_cobblestone_stairs\",[653]=\"minecraft:mossy_cobblestone_wall\",[654]=\"minecraft:mossy_stone_brick_slab\",[655]=\"minecraft:mossy_stone_bricks\",[656]=\"minecraft:mossy_stone_brick_stairs\",[657]=\"minecraft:mossy_stone_brick_wall\",[658]=\"minecraft:mud_brick_slab\",[659]=\"minecraft:mud_bricks\",[660]=\"minecraft:mud_brick_stairs\",[661]=\"minecraft:mud_brick_wall\",[662]=\"minecraft:packed_mud\",[663]=\"minecraft:muddy_mangrove_roots\",[664]=\"minecraft:mud\",[665]=\"minecraft:mangrove_roots\",[666]=\"minecraft:mushroom_stew\",[667]=\"minecraft:red_mushroom\",[668]=\"minecraft:music_disc_5\",[669]=\"minecraft:disc_fragment_5\",[670]=\"minecraft:nether_brick\",[671]=\"minecraft:netherrack\",[672]=\"minecraft:nether_brick_fence\",[673]=\"minecraft:nether_brick_stairs\",[674]=\"minecraft:nether_brick_wall\",[675]=\"minecraft:nether_wart_block\",[676]=\"minecraft:nether_wart\",[677]=\"minecraft:netherite_axe\",[678]=\"minecraft:netherite_upgrade_smithing_template\",[679]=\"minecraft:netherite_block\",[680]=\"minecraft:netherite_boots\",[681]=\"minecraft:netherite_chestplate\",[682]=\"minecraft:netherite_helmet\",[683]=\"minecraft:netherite_hoe\",[684]=\"minecraft:netherite_scrap\",[685]=\"minecraft:netherite_leggings\",[686]=\"minecraft:netherite_pickaxe\",[687]=\"minecraft:ancient_debris\",[688]=\"minecraft:netherite_shovel\",[689]=\"minecraft:netherite_sword\",[690]=\"minecraft:note_block\",[691]=\"minecraft:oak_boat\",[692]=\"minecraft:oak_planks\",[693]=\"minecraft:oak_button\",[694]=\"minecraft:oak_chest_boat\",[695]=\"minecraft:oak_door\",[696]=\"minecraft:oak_fence\",[697]=\"minecraft:oak_fence_gate\",[698]=\"minecraft:oak_hanging_sign\",[699]=\"minecraft:stripped_oak_log\",[700]=\"minecraft:oak_logs\",[701]=\"minecraft:oak_pressure_plate\",[702]=\"minecraft:oak_sign\",[703]=\"minecraft:oak_slab\",[704]=\"minecraft:oak_stairs\",[705]=\"minecraft:oak_trapdoor\",[706]=\"minecraft:oak_wood\",[707]=\"minecraft:oak_log\",[708]=\"minecraft:observer\",[709]=\"minecraft:orange_banner\",[710]=\"minecraft:orange_candle\",[711]=\"minecraft:orange_concrete_powder\",[712]=\"minecraft:orange_tulip\",[713]=\"minecraft:torchflower\",[714]=\"minecraft:orange_glazed_terracotta\",[715]=\"minecraft:orange_terracotta\",[716]=\"minecraft:orange_stained_glass\",[717]=\"minecraft:orange_stained_glass_pane\",[718]=\"minecraft:oxidized_chiseled_copper\",[719]=\"minecraft:oxidized_cut_copper_slab\",[720]=\"minecraft:oxidized_copper\",[721]=\"minecraft:oxidized_cut_copper\",[722]=\"minecraft:oxidized_copper_bulb\",[723]=\"minecraft:oxidized_copper_grate\",[724]=\"minecraft:oxidized_cut_copper_stairs\",[725]=\"minecraft:ice\",[726]=\"minecraft:painting\",[727]=\"minecraft:wool\",[728]=\"minecraft:sugar_cane\",[729]=\"minecraft:pink_banner\",[730]=\"minecraft:pink_candle\",[731]=\"minecraft:pink_concrete_powder\",[732]=\"minecraft:peony\",[733]=\"minecraft:pink_petals\",[734]=\"minecraft:pink_tulip\",[735]=\"minecraft:pink_glazed_terracotta\",[736]=\"minecraft:pink_terracotta\",[737]=\"minecraft:pink_stained_glass\",[738]=\"minecraft:pink_stained_glass_pane\",[739]=\"minecraft:piston\",[740]=\"minecraft:polished_andesite\",[741]=\"minecraft:polished_andesite_slab\",[742]=\"minecraft:polished_andesite_stairs\",[743]=\"minecraft:polished_basalt\",[744]=\"minecraft:basalt\",[745]=\"minecraft:polished_blackstone_brick_slab\",[746]=\"minecraft:polished_blackstone_brick_stairs\",[747]=\"minecraft:polished_blackstone_brick_wall\",[748]=\"minecraft:polished_blackstone_button\",[749]=\"minecraft:polished_blackstone_pressure_plate\",[750]=\"minecraft:polished_blackstone_stairs\",[751]=\"minecraft:polished_blackstone_wall\",[752]=\"minecraft:polished_deepslate_slab\",[753]=\"minecraft:polished_deepslate_stairs\",[754]=\"minecraft:polished_deepslate_wall\",[755]=\"minecraft:polished_diorite\",[756]=\"minecraft:polished_diorite_slab\",[757]=\"minecraft:polished_diorite_stairs\",[758]=\"minecraft:polished_granite\",[759]=\"minecraft:polished_granite_slab\",[760]=\"minecraft:polished_granite_stairs\",[761]=\"minecraft:polished_tuff_slab\",[762]=\"minecraft:polished_tuff_stairs\",[763]=\"minecraft:polished_tuff_wall\",[764]=\"minecraft:chorus_fruit\",[765]=\"minecraft:powered_rail\",[766]=\"minecraft:prismarine\",[767]=\"minecraft:prismarine_brick_slab\",[768]=\"minecraft:prismarine_bricks\",[769]=\"minecraft:prismarine_brick_stairs\",[770]=\"minecraft:prismarine_slab\",[771]=\"minecraft:prismarine_stairs\",[772]=\"minecraft:prismarine_wall\",[773]=\"minecraft:pumpkin_pie\",[774]=\"minecraft:pumpkin\",[775]=\"minecraft:pumpkin_seeds\",[776]=\"minecraft:purple_banner\",[777]=\"minecraft:purple_candle\",[778]=\"minecraft:purple_concrete_powder\",[779]=\"minecraft:purple_glazed_terracotta\",[780]=\"minecraft:purple_terracotta\",[781]=\"minecraft:purple_stained_glass\",[782]=\"minecraft:purple_stained_glass_pane\",[783]=\"minecraft:purpur_block\",[784]=\"minecraft:purpur_pillar\",[785]=\"minecraft:purpur_slab\",[786]=\"minecraft:purpur_stairs\",[787]=\"minecraft:nether_quartz_ore\",[788]=\"minecraft:quartz_bricks\",[789]=\"minecraft:quartz_pillar\",[790]=\"minecraft:quartz_stairs\",[791]=\"minecraft:rabbit_stew\",[792]=\"minecraft:rail\",[793]=\"minecraft:raiser_armor_trim_smithing_template\",[794]=\"minecraft:raw_copper_block\",[795]=\"minecraft:raw_gold_block\",[796]=\"minecraft:raw_iron_block\",[797]=\"minecraft:recovery_compass\",[798]=\"minecraft:echo_shard\",[799]=\"minecraft:red_banner\",[800]=\"minecraft:red_candle\",[801]=\"minecraft:red_concrete_powder\",[802]=\"minecraft:poppy\",[803]=\"minecraft:rose_bush\",[804]=\"minecraft:red_tulip\",[805]=\"minecraft:red_glazed_terracotta\",[806]=\"minecraft:red_terracotta\",[807]=\"minecraft:red_nether_brick_slab\",[808]=\"minecraft:red_nether_bricks\",[809]=\"minecraft:red_nether_brick_stairs\",[810]=\"minecraft:red_nether_brick_wall\",[811]=\"minecraft:red_sand\",[812]=\"minecraft:red_sandstone_stairs\",[813]=\"minecraft:red_sandstone_wall\",[814]=\"minecraft:red_stained_glass\",[815]=\"minecraft:red_stained_glass_pane\",[816]=\"minecraft:redstone_block\",[817]=\"minecraft:deepslate_redstone_ore\",[818]=\"minecraft:redstone_ore\",[819]=\"minecraft:redstone_lamp\",[820]=\"minecraft:repeater\",[821]=\"minecraft:respawn_anchor\",[822]=\"minecraft:crying_obsidian\",[823]=\"minecraft:rib_armor_trim_smithing_template\",[824]=\"minecraft:sandstone_stairs\",[825]=\"minecraft:sandstone_wall\",[826]=\"minecraft:scaffolding\",[827]=\"minecraft:sea_lantern\",[828]=\"minecraft:prismarine_crystals\",[829]=\"minecraft:sentry_armor_trim_smithing_template\",[830]=\"minecraft:shaper_armor_trim_smithing_template\",[831]=\"minecraft:shears\",[832]=\"minecraft:shield\",[833]=\"minecraft:shulker_box\",[834]=\"minecraft:shulker_shell\",[835]=\"minecraft:silence_armor_trim_smithing_template\",[836]=\"minecraft:skull_banner_pattern\",[837]=\"minecraft:wither_skeleton_skull\",[838]=\"minecraft:slime_block\",[839]=\"minecraft:smithing_table\",[840]=\"minecraft:smoker\",[841]=\"minecraft:smooth_basalt\",[842]=\"minecraft:smooth_quartz\",[843]=\"minecraft:smooth_quartz_slab\",[844]=\"minecraft:smooth_quartz_stairs\",[845]=\"minecraft:smooth_red_sandstone\",[846]=\"minecraft:smooth_red_sandstone_slab\",[847]=\"minecraft:smooth_red_sandstone_stairs\",[848]=\"minecraft:smooth_sandstone\",[849]=\"minecraft:smooth_sandstone_slab\",[850]=\"minecraft:smooth_sandstone_stairs\",[851]=\"minecraft:snout_armor_trim_smithing_template\",[852]=\"minecraft:snow\",[853]=\"minecraft:snow_block\",[854]=\"minecraft:snowball\",[855]=\"minecraft:soul_campfire\",[856]=\"minecraft:soul_fire_base_blocks\",[857]=\"minecraft:soul_lantern\",[858]=\"minecraft:soul_torch\",[859]=\"minecraft:spectral_arrow\",[860]=\"minecraft:spire_armor_trim_smithing_template\",[861]=\"minecraft:sponge\",[862]=\"minecraft:wet_sponge\",[863]=\"minecraft:spruce_boat\",[864]=\"minecraft:spruce_planks\",[865]=\"minecraft:spruce_button\",[866]=\"minecraft:spruce_chest_boat\",[867]=\"minecraft:spruce_door\",[868]=\"minecraft:spruce_fence\",[869]=\"minecraft:spruce_fence_gate\",[870]=\"minecraft:spruce_hanging_sign\",[871]=\"minecraft:stripped_spruce_log\",[872]=\"minecraft:spruce_logs\",[873]=\"minecraft:spruce_pressure_plate\",[874]=\"minecraft:spruce_sign\",[875]=\"minecraft:spruce_slab\",[876]=\"minecraft:spruce_stairs\",[877]=\"minecraft:spruce_trapdoor\",[878]=\"minecraft:spruce_wood\",[879]=\"minecraft:spruce_log\",[880]=\"minecraft:spyglass\",[881]=\"minecraft:sticky_piston\",[882]=\"minecraft:stone_axe\",[883]=\"minecraft:stone_tool_materials\",[884]=\"minecraft:stone_brick_stairs\",[885]=\"minecraft:stone_brick_wall\",[886]=\"minecraft:stone_button\",[887]=\"minecraft:stone_hoe\",[888]=\"minecraft:stone_pickaxe\",[889]=\"minecraft:stone_shovel\",[890]=\"minecraft:stone_stairs\",[891]=\"minecraft:stone_sword\",[892]=\"minecraft:stonecutter\",[893]=\"minecraft:stripped_acacia_wood\",[894]=\"minecraft:stripped_birch_wood\",[895]=\"minecraft:stripped_cherry_wood\",[896]=\"minecraft:stripped_crimson_hyphae\",[897]=\"minecraft:stripped_dark_oak_wood\",[898]=\"minecraft:stripped_jungle_wood\",[899]=\"minecraft:stripped_mangrove_wood\",[900]=\"minecraft:stripped_oak_wood\",[901]=\"minecraft:stripped_spruce_wood\",[902]=\"minecraft:stripped_warped_hyphae\",[903]=\"minecraft:stripped_warped_stem\",[904]=\"minecraft:target\",[905]=\"minecraft:tide_armor_trim_smithing_template\",[906]=\"minecraft:tinted_glass\",[907]=\"minecraft:tnt\",[908]=\"minecraft:tnt_minecart\",[909]=\"minecraft:trapped_chest\",[910]=\"minecraft:tuff_brick_stairs\",[911]=\"minecraft:tuff_brick_wall\",[912]=\"minecraft:tuff_stairs\",[913]=\"minecraft:tuff_wall\",[914]=\"minecraft:turtle_helmet\",[915]=\"minecraft:turtle_scute\",[916]=\"minecraft:vex_armor_trim_smithing_template\",[917]=\"minecraft:ward_armor_trim_smithing_template\",[918]=\"minecraft:warped_button\",[919]=\"minecraft:warped_planks\",[920]=\"minecraft:warped_door\",[921]=\"minecraft:warped_fence\",[922]=\"minecraft:warped_fence_gate\",[923]=\"minecraft:warped_fungus_on_a_stick\",[924]=\"minecraft:warped_fungus\",[925]=\"minecraft:warped_hanging_sign\",[926]=\"minecraft:warped_hyphae\",[927]=\"minecraft:warped_stem\",[928]=\"minecraft:warped_stems\",[929]=\"minecraft:warped_pressure_plate\",[930]=\"minecraft:warped_sign\",[931]=\"minecraft:warped_slab\",[932]=\"minecraft:warped_stairs\",[933]=\"minecraft:warped_trapdoor\",[934]=\"minecraft:waxed_chiseled_copper\",[935]=\"minecraft:waxed_cut_copper_slab\",[936]=\"minecraft:waxed_cut_copper\",[937]=\"minecraft:waxed_copper_bulb\",[938]=\"minecraft:waxed_copper_door\",[939]=\"minecraft:waxed_copper_grate\",[940]=\"minecraft:waxed_copper_trapdoor\",[941]=\"minecraft:waxed_cut_copper_stairs\",[942]=\"minecraft:waxed_exposed_chiseled_copper\",[943]=\"minecraft:waxed_exposed_cut_copper_slab\",[944]=\"minecraft:waxed_exposed_copper\",[945]=\"minecraft:waxed_exposed_cut_copper\",[946]=\"minecraft:waxed_exposed_copper_bulb\",[947]=\"minecraft:waxed_exposed_copper_door\",[948]=\"minecraft:exposed_copper_door\",[949]=\"minecraft:waxed_exposed_copper_grate\",[950]=\"minecraft:waxed_exposed_copper_trapdoor\",[951]=\"minecraft:exposed_copper_trapdoor\",[952]=\"minecraft:waxed_exposed_cut_copper_stairs\",[953]=\"minecraft:waxed_oxidized_chiseled_copper\",[954]=\"minecraft:waxed_oxidized_cut_copper_slab\",[955]=\"minecraft:waxed_oxidized_copper\",[956]=\"minecraft:waxed_oxidized_cut_copper\",[957]=\"minecraft:waxed_oxidized_copper_bulb\",[958]=\"minecraft:waxed_oxidized_copper_door\",[959]=\"minecraft:oxidized_copper_door\",[960]=\"minecraft:waxed_oxidized_copper_grate\",[961]=\"minecraft:waxed_oxidized_copper_trapdoor\",[962]=\"minecraft:oxidized_copper_trapdoor\",[963]=\"minecraft:waxed_oxidized_cut_copper_stairs\",[964]=\"minecraft:waxed_weathered_chiseled_copper\",[965]=\"minecraft:waxed_weathered_cut_copper_slab\",[966]=\"minecraft:weathered_chiseled_copper\",[967]=\"minecraft:waxed_weathered_copper\",[968]=\"minecraft:waxed_weathered_cut_copper\",[969]=\"minecraft:waxed_weathered_copper_bulb\",[970]=\"minecraft:weathered_copper_bulb\",[971]=\"minecraft:waxed_weathered_copper_door\",[972]=\"minecraft:weathered_copper_door\",[973]=\"minecraft:weathered_copper\",[974]=\"minecraft:waxed_weathered_copper_grate\",[975]=\"minecraft:weathered_copper_grate\",[976]=\"minecraft:waxed_weathered_copper_trapdoor\",[977]=\"minecraft:weathered_copper_trapdoor\",[978]=\"minecraft:weathered_cut_copper\",[979]=\"minecraft:weathered_cut_copper_slab\",[980]=\"minecraft:waxed_weathered_cut_copper_stairs\",[981]=\"minecraft:weathered_cut_copper_stairs\",[982]=\"minecraft:wayfinder_armor_trim_smithing_template\",[983]=\"minecraft:white_banner\",[984]=\"minecraft:white_candle\",[985]=\"minecraft:white_concrete_powder\",[986]=\"minecraft:lily_of_the_valley\",[987]=\"minecraft:white_glazed_terracotta\",[988]=\"minecraft:white_terracotta\",[989]=\"minecraft:white_stained_glass\",[990]=\"minecraft:white_stained_glass_pane\",[991]=\"minecraft:wild_armor_trim_smithing_template\",[992]=\"minecraft:wind_charge\",[993]=\"minecraft:wolf_armor\",[994]=\"minecraft:armadillo_scute\",[995]=\"minecraft:wooden_axe\",[996]=\"minecraft:wooden_hoe\",[997]=\"minecraft:wooden_pickaxe\",[998]=\"minecraft:wooden_shovel\",[999]=\"minecraft:wooden_sword\",[1000]=\"minecraft:writable_book\",[1001]=\"minecraft:yellow_banner\",[1002]=\"minecraft:yellow_candle\",[1003]=\"minecraft:yellow_concrete_powder\",[1004]=\"minecraft:dandelion\",[1005]=\"minecraft:sunflower\",[1006]=\"minecraft:yellow_glazed_terracotta\",[1007]=\"minecraft:yellow_terracotta\",[1008]=\"minecraft:yellow_stained_glass\",[1009]=\"minecraft:yellow_stained_glass_pane\"}}",
  ["ceetos/recipes/vanilla-recipes-1.21.1-1.lua"] = "return{[\"schema\"]=1,[\"minecraft\"]=\"1.21.1\",[\"recipes\"]={[\"minecraft:acacia_boat\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=1,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=2,[3]=2,[4]=2,[5]=2,[6]=2},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"boat\"},[\"special\"]=false},[\"minecraft:acacia_pressure_plate\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=14,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=2,[2]=2},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_pressure_plate\"},[\"special\"]=false},[\"minecraft:andesite\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=26,[\"count\"]=2,[\"ingredients\"]={{27,1,false},{28,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:armor_dye\"]={[\"kind\"]=\"crafting_special_armordye\",[\"mode\"]=\"special\",[\"address\"]=\"Crafter\",[\"output\"]=0,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=true},[\"minecraft:bamboo_chest_raft\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=45,[\"count\"]=1,[\"ingredients\"]={{5,1,false},{46,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"chest_boat\"},[\"special\"]=false},[\"minecraft:bamboo_planks\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=44,[\"count\"]=2,[\"ingredients\"]={{56,1,true}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"planks\"},[\"special\"]=false},[\"minecraft:barrel\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=61,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=-62,[2]=-63,[3]=-62,[4]=-62,[6]=-62,[7]=-62,[8]=-63,[9]=-62},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:birch_fence\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=78,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=74,[2]=8,[3]=74,[4]=74,[5]=8,[6]=74},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"wooden_fence\"},[\"special\"]=false},[\"minecraft:birch_trapdoor\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=87,[\"count\"]=2,[\"ingredients\"]={},[\"grid\"]={[1]=74,[2]=74,[3]=74,[4]=74,[5]=74,[6]=74},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_trapdoor\"},[\"special\"]=false},[\"minecraft:black_dye_from_wither_rose\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=95,[\"count\"]=1,[\"ingredients\"]={{101,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"black_dye\"},[\"special\"]=false},[\"minecraft:blackstone_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=110,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=109,[4]=109,[5]=109,[7]=109,[8]=109,[9]=109},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:blue_candle\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=120,[\"count\"]=1,[\"ingredients\"]={{94,1,false},{121,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"dyed_candle\"},[\"special\"]=false},[\"minecraft:blue_stained_glass_pane\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=131,[\"count\"]=16,[\"ingredients\"]={},[\"grid\"]={[1]=130,[2]=130,[3]=130,[4]=130,[5]=130,[6]=130},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"stained_glass_pane\"},[\"special\"]=false},[\"minecraft:book\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=139,[\"count\"]=1,[\"ingredients\"]={{140,1,false},{140,1,false},{140,1,false},{141,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:brick_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=151,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=152,[2]=152,[3]=152},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:brown_bed\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=157,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=156,[2]=156,[3]=156,[4]=-62,[5]=-62,[6]=-62},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"bed\"},[\"special\"]=false},[\"minecraft:brown_stained_glass_pane_from_glass_pane\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=166,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=106,[2]=106,[3]=106,[4]=106,[5]=159,[6]=106,[7]=106,[8]=106,[9]=106},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"stained_glass_pane\"},[\"special\"]=false},[\"minecraft:carrot_on_a_stick\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=179,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=180,[5]=181},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:cherry_door\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=191,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=188,[2]=188,[4]=188,[5]=188,[7]=188,[8]=188},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_door\"},[\"special\"]=false},[\"minecraft:cherry_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=200,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=188,[4]=188,[5]=188,[7]=188,[8]=188,[9]=188},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"wooden_stairs\"},[\"special\"]=false},[\"minecraft:chiseled_copper_from_cut_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=207,[\"count\"]=1,[\"ingredients\"]={{210,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:chiseled_quartz_block\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=220,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=221,[4]=221},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:chiseled_stone_bricks_stone_from_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=229,[\"count\"]=1,[\"ingredients\"]={{232,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:clock\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=241,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[2]=242,[4]=242,[5]=243,[6]=242,[8]=242},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:coast_armor_trim_smithing_template\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=250,[\"count\"]=2,[\"ingredients\"]={},[\"grid\"]={[1]=133,[2]=250,[3]=133,[4]=133,[5]=28,[6]=133,[7]=133,[8]=133,[9]=133},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:cobblestone_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=253,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=28,[2]=28,[3]=28},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:composter\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=259,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=-63,[3]=-63,[4]=-63,[6]=-63,[7]=-63,[8]=-63,[9]=-63},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:cooked_cod\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=267,[\"count\"]=1,[\"ingredients\"]={{268,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.35,[\"category\"]=\"food\"},[\"special\"]=false},[\"minecraft:cooked_porkchop_from_smoking\"]={[\"kind\"]=\"smoking\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smoke\",[\"output\"]=271,[\"count\"]=1,[\"ingredients\"]={{272,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=100,[\"experience\"]=0.35,[\"category\"]=\"food\"},[\"special\"]=false},[\"minecraft:copper_block\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=209,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=168,[2]=168,[3]=168,[4]=168,[5]=168,[6]=168,[7]=168,[8]=168,[9]=168},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:copper_ingot_from_blasting_raw_copper\"]={[\"kind\"]=\"blasting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Blast\",[\"output\"]=168,[\"count\"]=1,[\"ingredients\"]={{283,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=100,[\"experience\"]=0.7,[\"category\"]=\"misc\",[\"group\"]=\"copper_ingot\"},[\"special\"]=false},[\"minecraft:cracked_nether_bricks\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=290,[\"count\"]=1,[\"ingredients\"]={{216,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.1,[\"category\"]=\"blocks\"},[\"special\"]=false},[\"minecraft:crimson_fence\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=302,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=300,[2]=8,[3]=300,[4]=300,[5]=8,[6]=300},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"wooden_fence\"},[\"special\"]=false},[\"minecraft:crimson_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=312,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=300,[4]=300,[5]=300,[7]=300,[8]=300,[9]=300},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"wooden_stairs\"},[\"special\"]=false},[\"minecraft:cut_copper_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=316,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=210,[4]=210,[5]=210,[7]=210,[8]=210,[9]=210},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:cut_sandstone\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=319,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=228,[2]=228,[4]=228,[5]=228},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:cyan_carpet\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=326,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=322,[2]=322},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"carpet\"},[\"special\"]=false},[\"minecraft:cyan_terracotta\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=331,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=107,[2]=107,[3]=107,[4]=107,[5]=325,[6]=107,[7]=107,[8]=107,[9]=107},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"stained_terracotta\"},[\"special\"]=false},[\"minecraft:dark_oak_planks\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=335,[\"count\"]=4,[\"ingredients\"]={{343,1,true}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"planks\"},[\"special\"]=false},[\"minecraft:dark_prismarine_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=353,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=351,[2]=351,[3]=351},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:deepslate_brick_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=358,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=287,[2]=287,[3]=287},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:deepslate_brick_wall\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=361,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=287,[2]=287,[3]=287,[4]=287,[5]=287,[6]=287},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:deepslate_tile_slab_from_cobbled_deepslate_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=362,[\"count\"]=2,[\"ingredients\"]={{213,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:deepslate_tile_stairs_from_polished_deepslate_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=363,[\"count\"]=1,[\"ingredients\"]={{359,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:deepslate_tiles_from_deepslate_bricks_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=289,[\"count\"]=1,[\"ingredients\"]={{287,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:diamond_from_blasting_deepslate_diamond_ore\"]={[\"kind\"]=\"blasting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Blast\",[\"output\"]=133,[\"count\"]=1,[\"ingredients\"]={{371,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=100,[\"experience\"]=1,[\"category\"]=\"misc\",[\"group\"]=\"diamond\"},[\"special\"]=false},[\"minecraft:diamond_shovel\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=377,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=133,[4]=8,[7]=8},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:diorite_wall_from_diorite_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=381,[\"count\"]=1,[\"ingredients\"]={{27,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:dropper\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=296,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=28,[2]=28,[3]=28,[4]=28,[6]=28,[7]=28,[8]=243,[9]=28},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:dye_blue_wool\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=118,[\"count\"]=1,[\"ingredients\"]={{121,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"wool\"},[\"special\"]=false},[\"minecraft:dye_gray_carpet\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=391,[\"count\"]=1,[\"ingredients\"]={{390,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"carpet\"},[\"special\"]=false},[\"minecraft:dye_light_gray_bed\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=400,[\"count\"]=1,[\"ingredients\"]={{401,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"bed\"},[\"special\"]=false},[\"minecraft:dye_magenta_wool\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=411,[\"count\"]=1,[\"ingredients\"]={{409,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"wool\"},[\"special\"]=false},[\"minecraft:dye_purple_carpet\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=422,[\"count\"]=1,[\"ingredients\"]={{421,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"carpet\"},[\"special\"]=false},[\"minecraft:dye_yellow_bed\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=432,[\"count\"]=1,[\"ingredients\"]={{433,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"bed\"},[\"special\"]=false},[\"minecraft:emerald_from_smelting_emerald_ore\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=436,[\"count\"]=1,[\"ingredients\"]={{439,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=1,[\"category\"]=\"misc\",[\"group\"]=\"emerald\"},[\"special\"]=false},[\"minecraft:end_stone_brick_stairs_from_end_stone_brick_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=449,[\"count\"]=1,[\"ingredients\"]={{447,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:ender_eye\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=442,[\"count\"]=1,[\"ingredients\"]={{452,1,false},{115,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:exposed_cut_copper_from_exposed_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=456,[\"count\"]=4,[\"ingredients\"]={{455,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:eye_armor_trim_smithing_template_smithing_trim\"]={[\"kind\"]=\"smithing_trim\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smith\",[\"output\"]=0,[\"count\"]=1,[\"ingredients\"]={{134,1,true},{135,1,true},{460,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=true},[\"minecraft:fletching_table\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=467,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=37,[2]=37,[4]=-62,[5]=-62,[7]=-62,[8]=-62},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:glass\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=65,[\"count\"]=1,[\"ingredients\"]={{475,1,true}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.1,[\"category\"]=\"blocks\"},[\"special\"]=false},[\"minecraft:gold_ingot_from_blasting_gold_ore\"]={[\"kind\"]=\"blasting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Blast\",[\"output\"]=242,[\"count\"]=1,[\"ingredients\"]={{487,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=100,[\"experience\"]=1,[\"category\"]=\"misc\",[\"group\"]=\"gold_ingot\"},[\"special\"]=false},[\"minecraft:gold_ingot_from_smelting_raw_gold\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=242,[\"count\"]=1,[\"ingredients\"]={{489,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=1,[\"category\"]=\"misc\",[\"group\"]=\"gold_ingot\"},[\"special\"]=false},[\"minecraft:golden_chestplate\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=495,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=242,[3]=242,[4]=242,[5]=242,[6]=242,[7]=242,[8]=242,[9]=242},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:granite_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=503,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=502,[2]=502,[3]=502},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:gray_candle\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=507,[\"count\"]=1,[\"ingredients\"]={{94,1,false},{390,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"dyed_candle\"},[\"special\"]=false},[\"minecraft:gray_terracotta\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=510,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=107,[2]=107,[3]=107,[4]=107,[5]=390,[6]=107,[7]=107,[8]=107,[9]=107},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"stained_terracotta\"},[\"special\"]=false},[\"minecraft:green_stained_glass\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=519,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=65,[2]=65,[3]=65,[4]=65,[5]=328,[6]=65,[7]=65,[8]=65,[9]=65},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"stained_glass\"},[\"special\"]=false},[\"minecraft:honey_bottle\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=526,[\"count\"]=4,[\"ingredients\"]={{525,1,false},{476,1,false},{476,1,false},{476,1,false},{476,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:iron_block\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=33,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=22,[2]=22,[3]=22,[4]=22,[5]=22,[6]=22,[7]=22,[8]=22,[9]=22},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:iron_ingot_from_blasting_raw_iron\"]={[\"kind\"]=\"blasting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Blast\",[\"output\"]=22,[\"count\"]=1,[\"ingredients\"]={{540,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=100,[\"experience\"]=0.7,[\"category\"]=\"misc\",[\"group\"]=\"iron_ingot\"},[\"special\"]=false},[\"minecraft:iron_nugget_from_blasting\"]={[\"kind\"]=\"blasting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Blast\",[\"output\"]=184,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=100,[\"experience\"]=0.1,[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:jukebox\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=549,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=-62,[2]=-62,[3]=-62,[4]=-62,[5]=133,[6]=-62,[7]=-62,[8]=-62,[9]=-62},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:jungle_planks\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=551,[\"count\"]=4,[\"ingredients\"]={{559,1,true}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"planks\"},[\"special\"]=false},[\"minecraft:lantern\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=568,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=184,[2]=184,[3]=184,[4]=184,[5]=548,[6]=184,[7]=184,[8]=184,[9]=184},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:leather\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=141,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=574,[2]=574,[4]=574,[5]=574},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:light_blue_banner\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=582,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=399,[2]=399,[3]=399,[4]=399,[5]=399,[6]=399,[8]=8},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"banner\"},[\"special\"]=false},[\"minecraft:light_blue_stained_glass\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=588,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=65,[2]=65,[3]=65,[4]=65,[5]=397,[6]=65,[7]=65,[8]=65,[9]=65},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"stained_glass\"},[\"special\"]=false},[\"minecraft:light_gray_concrete_powder\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=592,[\"count\"]=8,[\"ingredients\"]={{401,1,false},{98,1,false},{98,1,false},{98,1,false},{98,1,false},{99,1,false},{99,1,false},{99,1,false},{99,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"concrete_powder\"},[\"special\"]=false},[\"minecraft:light_gray_stained_glass_pane\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=598,[\"count\"]=16,[\"ingredients\"]={},[\"grid\"]={[1]=597,[2]=597,[3]=597,[4]=597,[5]=597,[6]=597},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"stained_glass_pane\"},[\"special\"]=false},[\"minecraft:lime_carpet\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=406,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=407,[2]=407},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"carpet\"},[\"special\"]=false},[\"minecraft:lime_terracotta\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=606,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=107,[2]=107,[3]=107,[4]=107,[5]=405,[6]=107,[7]=107,[8]=107,[9]=107},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"stained_terracotta\"},[\"special\"]=false},[\"minecraft:magenta_concrete_powder\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=616,[\"count\"]=8,[\"ingredients\"]={{409,1,false},{98,1,false},{98,1,false},{98,1,false},{98,1,false},{99,1,false},{99,1,false},{99,1,false},{99,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"concrete_powder\"},[\"special\"]=false},[\"minecraft:magenta_stained_glass_pane\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=622,[\"count\"]=16,[\"ingredients\"]={},[\"grid\"]={[1]=621,[2]=621,[3]=621,[4]=621,[5]=621,[6]=621},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"stained_glass_pane\"},[\"special\"]=false},[\"minecraft:mangrove_door\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=629,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=626,[2]=626,[4]=626,[5]=626,[7]=626,[8]=626},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_door\"},[\"special\"]=false},[\"minecraft:mangrove_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=638,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=626,[4]=626,[5]=626,[7]=626,[8]=626,[9]=626},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"wooden_stairs\"},[\"special\"]=false},[\"minecraft:minecart\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=205,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=22,[3]=22,[4]=22,[5]=22,[6]=22},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:mossy_cobblestone_stairs_from_mossy_cobblestone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=652,[\"count\"]=1,[\"ingredients\"]={{649,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:mossy_stone_brick_wall_from_mossy_stone_brick_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=657,[\"count\"]=1,[\"ingredients\"]={{655,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:mud_brick_wall_from_mud_bricks_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=661,[\"count\"]=1,[\"ingredients\"]={{659,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:nether_brick_slab_from_nether_bricks_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=215,[\"count\"]=2,[\"ingredients\"]={{216,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:netherite_block\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=679,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=610,[2]=610,[3]=610,[4]=610,[5]=610,[6]=610,[7]=610,[8]=610,[9]=610},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:netherite_pickaxe_smithing\"]={[\"kind\"]=\"smithing_transform\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smith\",[\"output\"]=686,[\"count\"]=1,[\"ingredients\"]={{376,1,false},{610,1,false},{678,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:oak_button\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=693,[\"count\"]=1,[\"ingredients\"]={{692,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_button\"},[\"special\"]=false},[\"minecraft:oak_sign\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=702,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=692,[2]=692,[3]=692,[4]=692,[5]=692,[6]=692,[8]=8},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"wooden_sign\"},[\"special\"]=false},[\"minecraft:orange_candle\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=710,[\"count\"]=1,[\"ingredients\"]={{94,1,false},{413,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"dyed_candle\"},[\"special\"]=false},[\"minecraft:orange_stained_glass_pane\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=717,[\"count\"]=16,[\"ingredients\"]={},[\"grid\"]={[1]=716,[2]=716,[3]=716,[4]=716,[5]=716,[6]=716},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"stained_glass_pane\"},[\"special\"]=false},[\"minecraft:oxidized_copper_grate_from_oxidized_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=723,[\"count\"]=4,[\"ingredients\"]={{720,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:oxidized_cut_copper_stairs_from_oxidized_cut_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=724,[\"count\"]=1,[\"ingredients\"]={{721,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:pink_carpet\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=418,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=419,[2]=419},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"carpet\"},[\"special\"]=false},[\"minecraft:pink_stained_glass_pane\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=738,[\"count\"]=16,[\"ingredients\"]={},[\"grid\"]={[1]=737,[2]=737,[3]=737,[4]=737,[5]=737,[6]=737},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"stained_glass_pane\"},[\"special\"]=false},[\"minecraft:polished_andesite_slab_from_polished_andesite_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=741,[\"count\"]=2,[\"ingredients\"]={{740,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:polished_blackstone_brick_slab_from_blackstone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=745,[\"count\"]=2,[\"ingredients\"]={{109,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:polished_blackstone_brick_wall_from_blackstone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=747,[\"count\"]=1,[\"ingredients\"]={{109,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:polished_blackstone_pressure_plate\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=749,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=219,[2]=219},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:polished_blackstone_wall_from_blackstone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=751,[\"count\"]=1,[\"ingredients\"]={{109,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:polished_deepslate_stairs_from_cobbled_deepslate_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=753,[\"count\"]=1,[\"ingredients\"]={{213,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:polished_diorite_slab_from_diorite_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=756,[\"count\"]=2,[\"ingredients\"]={{27,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:polished_granite_slab_from_granite_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=759,[\"count\"]=2,[\"ingredients\"]={{502,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:polished_tuff_slab_from_polished_tuff_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=761,[\"count\"]=2,[\"ingredients\"]={{237,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:popped_chorus_fruit\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=445,[\"count\"]=1,[\"ingredients\"]={{764,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.1,[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:prismarine_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=770,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=766,[2]=766,[3]=766},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:purple_banner\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=776,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=423,[2]=423,[3]=423,[4]=423,[5]=423,[6]=423,[8]=8},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"banner\"},[\"special\"]=false},[\"minecraft:purple_stained_glass_pane\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=782,[\"count\"]=16,[\"ingredients\"]={},[\"grid\"]={[1]=781,[2]=781,[3]=781,[4]=781,[5]=781,[6]=781},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"stained_glass_pane\"},[\"special\"]=false},[\"minecraft:purpur_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=786,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:quartz_pillar_from_quartz_block_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=789,[\"count\"]=1,[\"ingredients\"]={{222,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:raiser_armor_trim_smithing_template\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=793,[\"count\"]=2,[\"ingredients\"]={},[\"grid\"]={[1]=133,[2]=793,[3]=133,[4]=133,[5]=107,[6]=133,[7]=133,[8]=133,[9]=133},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:recovery_compass\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=797,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=798,[2]=798,[3]=798,[4]=798,[5]=258,[6]=798,[7]=798,[8]=798,[9]=798},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:red_dye_from_rose_bush\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=425,[\"count\"]=2,[\"ingredients\"]={{803,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"red_dye\"},[\"special\"]=false},[\"minecraft:red_nether_brick_wall_from_red_nether_bricks_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=810,[\"count\"]=1,[\"ingredients\"]={{808,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:red_sandstone_wall_from_red_sandstone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=813,[\"count\"]=1,[\"ingredients\"]={{225,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:redstone_from_blasting_redstone_ore\"]={[\"kind\"]=\"blasting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Blast\",[\"output\"]=243,[\"count\"]=1,[\"ingredients\"]={{818,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=100,[\"experience\"]=0.7,[\"category\"]=\"blocks\",[\"group\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:rib_armor_trim_smithing_template\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=823,[\"count\"]=2,[\"ingredients\"]={},[\"grid\"]={[1]=133,[2]=823,[3]=133,[4]=133,[5]=671,[6]=133,[7]=133,[8]=133,[9]=133},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:sandstone_wall_from_sandstone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=825,[\"count\"]=1,[\"ingredients\"]={{228,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:shield\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=832,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=-62,[2]=22,[3]=-62,[4]=-62,[5]=-62,[6]=-62,[8]=-62},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:slime_block\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=838,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=573,[2]=573,[3]=573,[4]=573,[5]=573,[6]=573,[7]=573,[8]=573,[9]=573},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:smooth_quartz_stairs_from_smooth_quartz_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=844,[\"count\"]=1,[\"ingredients\"]={{842,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:smooth_sandstone_slab_from_smooth_sandstone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=849,[\"count\"]=2,[\"ingredients\"]={{848,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:snow\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=852,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=853,[2]=853,[3]=853},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:sponge\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=861,[\"count\"]=1,[\"ingredients\"]={{862,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.15,[\"category\"]=\"blocks\"},[\"special\"]=false},[\"minecraft:spruce_planks\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=864,[\"count\"]=4,[\"ingredients\"]={{872,1,true}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"planks\"},[\"special\"]=false},[\"minecraft:stick\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=8,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=-62,[4]=-62},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"sticks\"},[\"special\"]=false},[\"minecraft:stone_brick_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=884,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=231,[4]=231,[5]=231,[7]=231,[8]=231,[9]=231},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:stone_button\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=886,[\"count\"]=1,[\"ingredients\"]={{232,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:stone_stairs_from_stone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=890,[\"count\"]=1,[\"ingredients\"]={{232,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:stripped_jungle_wood\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=898,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=558,[2]=558,[4]=558,[5]=558},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"bark\"},[\"special\"]=false},[\"minecraft:target\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=904,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[2]=243,[4]=243,[5]=523,[6]=243,[8]=243},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:torch\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=548,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[4]=8},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:tuff_brick_stairs_from_polished_tuff_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=910,[\"count\"]=1,[\"ingredients\"]={{237,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:tuff_bricks_from_polished_tuff_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=238,[\"count\"]=1,[\"ingredients\"]={{237,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:turtle_helmet\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=914,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=915,[2]=915,[3]=915,[4]=915,[6]=915},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:warped_fence_gate\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=922,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=8,[2]=919,[3]=8,[4]=8,[5]=919,[6]=8},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_fence_gate\"},[\"special\"]=false},[\"minecraft:warped_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=932,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=919,[4]=919,[5]=919,[7]=919,[8]=919,[9]=919},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"wooden_stairs\"},[\"special\"]=false},[\"minecraft:waxed_copper_bulb_from_honeycomb\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=937,[\"count\"]=1,[\"ingredients\"]={{278,1,false},{69,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_copper_bulb\"},[\"special\"]=false},[\"minecraft:waxed_cut_copper_from_waxed_copper_block_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=936,[\"count\"]=4,[\"ingredients\"]={{284,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:waxed_cut_copper_stairs_from_waxed_cut_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=941,[\"count\"]=1,[\"ingredients\"]={{936,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:waxed_exposed_copper_from_honeycomb\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=944,[\"count\"]=1,[\"ingredients\"]={{455,1,false},{69,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_exposed_copper\"},[\"special\"]=false},[\"minecraft:waxed_exposed_cut_copper_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=943,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=945,[2]=945,[3]=945},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_exposed_cut_copper_slab\"},[\"special\"]=false},[\"minecraft:waxed_oxidized_chiseled_copper\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=953,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=954,[4]=954},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_oxidized_cut_copper_chiseled\"},[\"special\"]=false},[\"minecraft:waxed_oxidized_copper_grate\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=960,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[2]=955,[4]=955,[6]=955,[8]=955},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:waxed_oxidized_cut_copper_slab_from_honeycomb\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=954,[\"count\"]=1,[\"ingredients\"]={{719,1,false},{69,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_oxidized_cut_copper_slab\"},[\"special\"]=false},[\"minecraft:waxed_weathered_chiseled_copper_from_honeycomb\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=964,[\"count\"]=1,[\"ingredients\"]={{966,1,false},{69,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_weathered_chiseled_copper\"},[\"special\"]=false},[\"minecraft:waxed_weathered_copper_grate_from_honeycomb\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=974,[\"count\"]=1,[\"ingredients\"]={{975,1,false},{69,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_weathered_copper_grate\"},[\"special\"]=false},[\"minecraft:waxed_weathered_cut_copper_slab_from_waxed_weathered_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=965,[\"count\"]=8,[\"ingredients\"]={{967,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:weathered_chiseled_copper\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=966,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=979,[4]=979},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:weathered_cut_copper_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=979,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=978,[2]=978,[3]=978},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:white_bed\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=428,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=431,[2]=431,[3]=431,[4]=-62,[5]=-62,[6]=-62},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"bed\"},[\"special\"]=false},[\"minecraft:white_stained_glass_pane\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=990,[\"count\"]=16,[\"ingredients\"]={},[\"grid\"]={[1]=989,[2]=989,[3]=989,[4]=989,[5]=989,[6]=989},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"stained_glass_pane\"},[\"special\"]=false},[\"minecraft:wooden_axe\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=995,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=-62,[2]=-62,[4]=-62,[5]=8,[8]=8},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:yellow_candle\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=1002,[\"count\"]=1,[\"ingredients\"]={{94,1,false},{433,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"dyed_candle\"},[\"special\"]=false},[\"minecraft:yellow_stained_glass_pane_from_glass_pane\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=1009,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=106,[2]=106,[3]=106,[4]=106,[5]=433,[6]=106,[7]=106,[8]=106,[9]=106},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"stained_glass_pane\"},[\"special\"]=false}},[\"counts\"]={[\"crafting_shaped\"]=634,[\"crafting_shapeless\"]=253,[\"stonecutting\"]=250,[\"crafting_special_armordye\"]=1,[\"smelting\"]=70,[\"campfire_cooking\"]=9,[\"smoking\"]=9,[\"crafting_special_bannerduplicate\"]=1,[\"smithing_trim\"]=18,[\"crafting_special_bookcloning\"]=1,[\"blasting\"]=24,[\"crafting_decorated_pot\"]=1,[\"crafting_special_firework_rocket\"]=1,[\"crafting_special_firework_star\"]=1,[\"crafting_special_firework_star_fade\"]=1,[\"crafting_special_mapcloning\"]=1,[\"crafting_special_mapextending\"]=1,[\"smithing_transform\"]=9,[\"crafting_special_repairitem\"]=1,[\"crafting_special_shielddecoration\"]=1,[\"crafting_special_shulkerboxcoloring\"]=1,[\"crafting_special_suspiciousstew\"]=1,[\"crafting_special_tippedarrow\"]=1}}",
  ["ceetos/recipes/vanilla-recipes-1.21.1-2.lua"] = "return{[\"schema\"]=1,[\"minecraft\"]=\"1.21.1\",[\"recipes\"]={[\"minecraft:acacia_button\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=3,[\"count\"]=1,[\"ingredients\"]={{2,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_button\"},[\"special\"]=false},[\"minecraft:acacia_sign\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=15,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=2,[2]=2,[3]=2,[4]=2,[5]=2,[6]=2,[8]=8},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"wooden_sign\"},[\"special\"]=false},[\"minecraft:andesite_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=29,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=26,[2]=26,[3]=26},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:armor_stand\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=34,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=8,[2]=8,[3]=8,[5]=8,[7]=8,[8]=35,[9]=8},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:bamboo_door\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=47,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=44,[2]=44,[4]=44,[5]=44,[7]=44,[8]=44},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_door\"},[\"special\"]=false},[\"minecraft:bamboo_pressure_plate\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=57,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=44,[2]=44},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_pressure_plate\"},[\"special\"]=false},[\"minecraft:beacon\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=64,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=65,[2]=65,[3]=65,[4]=65,[5]=66,[6]=65,[7]=67,[8]=67,[9]=67},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:birch_fence_gate\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=79,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=8,[2]=74,[3]=8,[4]=8,[5]=74,[6]=8},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_fence_gate\"},[\"special\"]=false},[\"minecraft:birch_wood\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=88,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=89,[2]=89,[4]=89,[5]=89},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"bark\"},[\"special\"]=false},[\"minecraft:black_glazed_terracotta\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=102,[\"count\"]=1,[\"ingredients\"]={{103,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.1,[\"category\"]=\"blocks\"},[\"special\"]=false},[\"minecraft:blackstone_stairs_from_blackstone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=110,[\"count\"]=1,[\"ingredients\"]={{109,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:blue_carpet\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=122,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=118,[2]=118},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"carpet\"},[\"special\"]=false},[\"minecraft:blue_stained_glass_pane_from_glass_pane\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=131,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=106,[2]=106,[3]=106,[4]=106,[5]=121,[6]=106,[7]=106,[8]=106,[9]=106},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"stained_glass_pane\"},[\"special\"]=false},[\"minecraft:book_cloning\"]={[\"kind\"]=\"crafting_special_bookcloning\",[\"mode\"]=\"special\",[\"address\"]=\"Crafter\",[\"output\"]=0,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=true},[\"minecraft:brick_slab_from_bricks_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=151,[\"count\"]=2,[\"ingredients\"]={{152,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:brown_candle\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=158,[\"count\"]=1,[\"ingredients\"]={{94,1,false},{159,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"dyed_candle\"},[\"special\"]=false},[\"minecraft:brown_terracotta\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=164,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=107,[2]=107,[3]=107,[4]=107,[5]=159,[6]=107,[7]=107,[8]=107,[9]=107},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"stained_terracotta\"},[\"special\"]=false},[\"minecraft:cartography_table\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=182,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=140,[2]=140,[4]=-62,[5]=-62,[7]=-62,[8]=-62},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:cherry_fence\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=192,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=188,[2]=8,[3]=188,[4]=188,[5]=8,[6]=188},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"wooden_fence\"},[\"special\"]=false},[\"minecraft:cherry_trapdoor\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=201,[\"count\"]=2,[\"ingredients\"]={},[\"grid\"]={[1]=188,[2]=188,[3]=188,[4]=188,[5]=188,[6]=188},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_trapdoor\"},[\"special\"]=false},[\"minecraft:chiseled_deepslate\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=211,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=212,[4]=212},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:chiseled_quartz_block_from_quartz_block_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=220,[\"count\"]=1,[\"ingredients\"]={{222,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:chiseled_tuff\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=233,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=234,[4]=234},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:coal\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=244,[\"count\"]=9,[\"ingredients\"]={{245,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:coast_armor_trim_smithing_template_smithing_trim\"]={[\"kind\"]=\"smithing_trim\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smith\",[\"output\"]=0,[\"count\"]=1,[\"ingredients\"]={{134,1,true},{135,1,true},{250,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=true},[\"minecraft:cobblestone_slab_from_cobblestone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=253,[\"count\"]=2,[\"ingredients\"]={{28,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:conduit\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=260,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=261,[2]=261,[3]=261,[4]=261,[5]=262,[6]=261,[7]=261,[8]=261,[9]=261},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:cooked_cod_from_campfire_cooking\"]={[\"kind\"]=\"campfire_cooking\",[\"mode\"]=\"crafting\",[\"address\"]=\"Campfire\",[\"output\"]=267,[\"count\"]=1,[\"ingredients\"]={{268,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=600,[\"experience\"]=0.35,[\"category\"]=\"food\"},[\"special\"]=false},[\"minecraft:cooked_rabbit\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=273,[\"count\"]=1,[\"ingredients\"]={{274,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.35,[\"category\"]=\"food\"},[\"special\"]=false},[\"minecraft:copper_bulb\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=278,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[2]=209,[4]=209,[5]=116,[6]=209,[8]=243},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:copper_ingot_from_smelting_copper_ore\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=168,[\"count\"]=1,[\"ingredients\"]={{281,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.7,[\"category\"]=\"misc\",[\"group\"]=\"copper_ingot\"},[\"special\"]=false},[\"minecraft:cracked_polished_blackstone_bricks\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=291,[\"count\"]=1,[\"ingredients\"]={{292,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.1,[\"category\"]=\"blocks\"},[\"special\"]=false},[\"minecraft:crimson_fence_gate\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=303,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=8,[2]=300,[3]=8,[4]=8,[5]=300,[6]=8},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_fence_gate\"},[\"special\"]=false},[\"minecraft:crimson_trapdoor\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=313,[\"count\"]=2,[\"ingredients\"]={},[\"grid\"]={[1]=300,[2]=300,[3]=300,[4]=300,[5]=300,[6]=300},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_trapdoor\"},[\"special\"]=false},[\"minecraft:cut_copper_stairs_from_copper_block_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=316,[\"count\"]=4,[\"ingredients\"]={{209,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:cut_sandstone_from_sandstone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=319,[\"count\"]=1,[\"ingredients\"]={{228,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:cyan_concrete_powder\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=327,[\"count\"]=8,[\"ingredients\"]={{325,1,false},{98,1,false},{98,1,false},{98,1,false},{98,1,false},{99,1,false},{99,1,false},{99,1,false},{99,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"concrete_powder\"},[\"special\"]=false},[\"minecraft:dark_oak_boat\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=334,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=335,[3]=335,[4]=335,[5]=335,[6]=335},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"boat\"},[\"special\"]=false},[\"minecraft:dark_oak_pressure_plate\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=344,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=335,[2]=335},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_pressure_plate\"},[\"special\"]=false},[\"minecraft:dark_prismarine_slab_from_dark_prismarine_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=353,[\"count\"]=2,[\"ingredients\"]={{351,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:deepslate_brick_slab_from_cobbled_deepslate_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=358,[\"count\"]=2,[\"ingredients\"]={{213,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:deepslate_brick_wall_from_cobbled_deepslate_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=361,[\"count\"]=1,[\"ingredients\"]={{213,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:deepslate_tile_slab_from_deepslate_bricks_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=362,[\"count\"]=2,[\"ingredients\"]={{287,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:deepslate_tile_wall\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=364,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=289,[2]=289,[3]=289,[4]=289,[5]=289,[6]=289},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:deepslate_tiles_from_polished_deepslate_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=289,[\"count\"]=1,[\"ingredients\"]={{359,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:diamond_from_blasting_diamond_ore\"]={[\"kind\"]=\"blasting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Blast\",[\"output\"]=133,[\"count\"]=1,[\"ingredients\"]={{372,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=100,[\"experience\"]=1,[\"category\"]=\"misc\",[\"group\"]=\"diamond\"},[\"special\"]=false},[\"minecraft:diamond_sword\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=378,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=133,[4]=133,[7]=8},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:dispenser\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=382,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=28,[2]=28,[3]=28,[4]=28,[5]=143,[6]=28,[7]=28,[8]=243,[9]=28},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:dune_armor_trim_smithing_template\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=388,[\"count\"]=2,[\"ingredients\"]={},[\"grid\"]={[1]=133,[2]=388,[3]=133,[4]=133,[5]=228,[6]=133,[7]=133,[8]=133,[9]=133},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:dye_brown_bed\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=157,[\"count\"]=1,[\"ingredients\"]={{159,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"bed\"},[\"special\"]=false},[\"minecraft:dye_gray_wool\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=392,[\"count\"]=1,[\"ingredients\"]={{390,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"wool\"},[\"special\"]=false},[\"minecraft:dye_light_gray_carpet\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=402,[\"count\"]=1,[\"ingredients\"]={{401,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"carpet\"},[\"special\"]=false},[\"minecraft:dye_orange_bed\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=412,[\"count\"]=1,[\"ingredients\"]={{413,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"bed\"},[\"special\"]=false},[\"minecraft:dye_purple_wool\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=423,[\"count\"]=1,[\"ingredients\"]={{421,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"wool\"},[\"special\"]=false},[\"minecraft:dye_yellow_carpet\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=434,[\"count\"]=1,[\"ingredients\"]={{433,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"carpet\"},[\"special\"]=false},[\"minecraft:enchanting_table\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=440,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[2]=139,[4]=133,[5]=67,[6]=133,[7]=67,[8]=67,[9]=67},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:end_stone_brick_stairs_from_end_stone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=449,[\"count\"]=1,[\"ingredients\"]={{448,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:exposed_chiseled_copper\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=453,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=454,[4]=454},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:exposed_cut_copper_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=454,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=456,[2]=456,[3]=456},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:fermented_spider_eye\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=461,[\"count\"]=1,[\"ingredients\"]={{462,1,false},{463,1,false},{172,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:flint_and_steel\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=468,[\"count\"]=1,[\"ingredients\"]={{22,1,false},{37,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:glass_bottle\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=476,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=65,[3]=65,[5]=65},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:gold_ingot_from_blasting_nether_gold_ore\"]={[\"kind\"]=\"blasting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Blast\",[\"output\"]=242,[\"count\"]=1,[\"ingredients\"]={{488,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=100,[\"experience\"]=1,[\"category\"]=\"misc\",[\"group\"]=\"gold_ingot\"},[\"special\"]=false},[\"minecraft:gold_nugget\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=478,[\"count\"]=9,[\"ingredients\"]={{242,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:golden_helmet\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=496,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=242,[2]=242,[3]=242,[4]=242,[6]=242},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:granite_slab_from_granite_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=503,[\"count\"]=2,[\"ingredients\"]={{502,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:gray_carpet\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=391,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=392,[2]=392},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"carpet\"},[\"special\"]=false},[\"minecraft:green_banner\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=513,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=395,[2]=395,[3]=395,[4]=395,[5]=395,[6]=395,[8]=8},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"banner\"},[\"special\"]=false},[\"minecraft:green_stained_glass_pane\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=520,[\"count\"]=16,[\"ingredients\"]={},[\"grid\"]={[1]=519,[2]=519,[3]=519,[4]=519,[5]=519,[6]=519},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"stained_glass_pane\"},[\"special\"]=false},[\"minecraft:honeycomb_block\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=527,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=69,[2]=69,[4]=69,[5]=69},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:iron_boots\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=533,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=22,[3]=22,[4]=22,[6]=22},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:iron_ingot_from_iron_block\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=22,[\"count\"]=9,[\"ingredients\"]={{33,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"iron_ingot\"},[\"special\"]=false},[\"minecraft:iron_nugget_from_smelting\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=184,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.1,[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:jungle_boat\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=550,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=551,[3]=551,[4]=551,[5]=551,[6]=551},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"boat\"},[\"special\"]=false},[\"minecraft:jungle_pressure_plate\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=560,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=551,[2]=551},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_pressure_plate\"},[\"special\"]=false},[\"minecraft:lapis_block\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=569,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=124,[2]=124,[3]=124,[4]=124,[5]=124,[6]=124,[7]=124,[8]=124,[9]=124},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:leather_boots\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=575,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=141,[3]=141,[4]=141,[6]=141},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:light_blue_bed\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=396,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=399,[2]=399,[3]=399,[4]=-62,[5]=-62,[6]=-62},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"bed\"},[\"special\"]=false},[\"minecraft:light_blue_stained_glass_pane\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=589,[\"count\"]=16,[\"ingredients\"]={},[\"grid\"]={[1]=588,[2]=588,[3]=588,[4]=588,[5]=588,[6]=588},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"stained_glass_pane\"},[\"special\"]=false},[\"minecraft:light_gray_dye_from_azure_bluet\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=401,[\"count\"]=1,[\"ingredients\"]={{593,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"light_gray_dye\"},[\"special\"]=false},[\"minecraft:light_gray_stained_glass_pane_from_glass_pane\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=598,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=106,[2]=106,[3]=106,[4]=106,[5]=401,[6]=106,[7]=106,[8]=106,[9]=106},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"stained_glass_pane\"},[\"special\"]=false},[\"minecraft:lime_concrete_powder\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=603,[\"count\"]=8,[\"ingredients\"]={{405,1,false},{98,1,false},{98,1,false},{98,1,false},{98,1,false},{99,1,false},{99,1,false},{99,1,false},{99,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"concrete_powder\"},[\"special\"]=false},[\"minecraft:lodestone\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=609,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=229,[2]=229,[3]=229,[4]=229,[5]=610,[6]=229,[7]=229,[8]=229,[9]=229},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:magenta_dye_from_allium\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=409,[\"count\"]=1,[\"ingredients\"]={{617,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"magenta_dye\"},[\"special\"]=false},[\"minecraft:magenta_stained_glass_pane_from_glass_pane\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=622,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=106,[2]=106,[3]=106,[4]=106,[5]=409,[6]=106,[7]=106,[8]=106,[9]=106},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"stained_glass_pane\"},[\"special\"]=false},[\"minecraft:mangrove_fence\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=630,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=626,[2]=8,[3]=626,[4]=626,[5]=8,[6]=626},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"wooden_fence\"},[\"special\"]=false},[\"minecraft:mangrove_trapdoor\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=639,[\"count\"]=2,[\"ingredients\"]={},[\"grid\"]={[1]=626,[2]=626,[3]=626,[4]=626,[5]=626,[6]=626},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_trapdoor\"},[\"special\"]=false},[\"minecraft:mojang_banner_pattern\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=645,[\"count\"]=1,[\"ingredients\"]={{140,1,false},{646,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:mossy_cobblestone_wall\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=653,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=649,[2]=649,[3]=649,[4]=649,[5]=649,[6]=649},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:mossy_stone_bricks_from_moss_block\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=655,[\"count\"]=1,[\"ingredients\"]={{231,1,false},{648,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"mossy_stone_bricks\"},[\"special\"]=false},[\"minecraft:mud_bricks\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=659,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=662,[2]=662,[4]=662,[5]=662},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:nether_brick_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=673,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=216,[4]=216,[5]=216,[7]=216,[8]=216,[9]=216},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:netherite_boots_smithing\"]={[\"kind\"]=\"smithing_transform\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smith\",[\"output\"]=680,[\"count\"]=1,[\"ingredients\"]={{369,1,false},{610,1,false},{678,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:netherite_scrap\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=684,[\"count\"]=1,[\"ingredients\"]={{687,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=2,[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:oak_chest_boat\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=694,[\"count\"]=1,[\"ingredients\"]={{5,1,false},{691,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"chest_boat\"},[\"special\"]=false},[\"minecraft:oak_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=703,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=692,[2]=692,[3]=692},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"wooden_slab\"},[\"special\"]=false},[\"minecraft:orange_carpet\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=414,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=415,[2]=415},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"carpet\"},[\"special\"]=false},[\"minecraft:orange_stained_glass_pane_from_glass_pane\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=717,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=106,[2]=106,[3]=106,[4]=106,[5]=413,[6]=106,[7]=106,[8]=106,[9]=106},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"stained_glass_pane\"},[\"special\"]=false},[\"minecraft:oxidized_cut_copper\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=721,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=720,[2]=720,[4]=720,[5]=720},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:packed_ice\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=129,[\"count\"]=1,[\"ingredients\"]={{725,1,false},{725,1,false},{725,1,false},{725,1,false},{725,1,false},{725,1,false},{725,1,false},{725,1,false},{725,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:pink_concrete_powder\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=731,[\"count\"]=8,[\"ingredients\"]={{417,1,false},{98,1,false},{98,1,false},{98,1,false},{98,1,false},{99,1,false},{99,1,false},{99,1,false},{99,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"concrete_powder\"},[\"special\"]=false},[\"minecraft:pink_stained_glass_pane_from_glass_pane\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=738,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=106,[2]=106,[3]=106,[4]=106,[5]=417,[6]=106,[7]=106,[8]=106,[9]=106},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"stained_glass_pane\"},[\"special\"]=false},[\"minecraft:polished_andesite_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=742,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=740,[4]=740,[5]=740,[7]=740,[8]=740,[9]=740},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:polished_blackstone_brick_slab_from_polished_blackstone_bricks_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=745,[\"count\"]=2,[\"ingredients\"]={{292,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:polished_blackstone_brick_wall_from_polished_blackstone_bricks_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=747,[\"count\"]=1,[\"ingredients\"]={{292,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:polished_blackstone_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=218,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=219,[2]=219,[3]=219},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:polished_blackstone_wall_from_polished_blackstone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=751,[\"count\"]=1,[\"ingredients\"]={{219,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:polished_deepslate_stairs_from_polished_deepslate_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=753,[\"count\"]=1,[\"ingredients\"]={{359,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:polished_diorite_slab_from_polished_diorite_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=756,[\"count\"]=2,[\"ingredients\"]={{755,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:polished_granite_slab_from_polished_granite_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=759,[\"count\"]=2,[\"ingredients\"]={{758,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:polished_tuff_slab_from_tuff_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=761,[\"count\"]=2,[\"ingredients\"]={{239,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:powered_rail\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=765,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=242,[3]=242,[4]=242,[5]=8,[6]=242,[7]=242,[8]=243,[9]=242},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:prismarine_slab_from_prismarine_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=770,[\"count\"]=2,[\"ingredients\"]={{766,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:purple_bed\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=420,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=423,[2]=423,[3]=423,[4]=-62,[5]=-62,[6]=-62},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"bed\"},[\"special\"]=false},[\"minecraft:purple_stained_glass_pane_from_glass_pane\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=782,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=106,[2]=106,[3]=106,[4]=106,[5]=421,[6]=106,[7]=106,[8]=106,[9]=106},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"stained_glass_pane\"},[\"special\"]=false},[\"minecraft:purpur_stairs_from_purpur_block_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=786,[\"count\"]=1,[\"ingredients\"]={{783,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:quartz_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=221,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:raiser_armor_trim_smithing_template_smithing_trim\"]={[\"kind\"]=\"smithing_trim\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smith\",[\"output\"]=0,[\"count\"]=1,[\"ingredients\"]={{134,1,true},{135,1,true},{793,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=true},[\"minecraft:red_banner\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=799,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=427,[2]=427,[3]=427,[4]=427,[5]=427,[6]=427,[8]=8},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"banner\"},[\"special\"]=false},[\"minecraft:red_dye_from_tulip\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=425,[\"count\"]=1,[\"ingredients\"]={{804,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"red_dye\"},[\"special\"]=false},[\"minecraft:red_nether_bricks\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=808,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=670,[2]=676,[4]=676,[5]=670},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:red_stained_glass\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=814,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=65,[2]=65,[3]=65,[4]=65,[5]=425,[6]=65,[7]=65,[8]=65,[9]=65},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"stained_glass\"},[\"special\"]=false},[\"minecraft:redstone_from_smelting_deepslate_redstone_ore\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=243,[\"count\"]=1,[\"ingredients\"]={{817,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.7,[\"category\"]=\"blocks\",[\"group\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:rib_armor_trim_smithing_template_smithing_trim\"]={[\"kind\"]=\"smithing_trim\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smith\",[\"output\"]=0,[\"count\"]=1,[\"ingredients\"]={{134,1,true},{135,1,true},{823,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=true},[\"minecraft:scaffolding\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=826,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=42,[2]=144,[3]=42,[4]=42,[6]=42,[7]=42,[9]=42},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:shield_decoration\"]={[\"kind\"]=\"crafting_special_shielddecoration\",[\"mode\"]=\"special\",[\"address\"]=\"Crafter\",[\"output\"]=0,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=true},[\"minecraft:smithing_table\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=839,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=22,[2]=22,[4]=-62,[5]=-62,[7]=-62,[8]=-62},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:smooth_red_sandstone\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=845,[\"count\"]=1,[\"ingredients\"]={{225,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.1,[\"category\"]=\"blocks\"},[\"special\"]=false},[\"minecraft:smooth_sandstone_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=850,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=848,[4]=848,[5]=848,[7]=848,[8]=848,[9]=848},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:snow_block\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=853,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=854,[2]=854,[4]=854,[5]=854},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:spruce_boat\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=863,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=864,[3]=864,[4]=864,[5]=864,[6]=864},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"boat\"},[\"special\"]=false},[\"minecraft:spruce_pressure_plate\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=873,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=864,[2]=864},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_pressure_plate\"},[\"special\"]=false},[\"minecraft:stick_from_bamboo_item\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=8,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=42,[4]=42},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"sticks\"},[\"special\"]=false},[\"minecraft:stone_brick_stairs_from_stone_bricks_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=884,[\"count\"]=1,[\"ingredients\"]={{231,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:stone_hoe\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=887,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=-883,[2]=-883,[5]=8,[8]=8},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:stone_sword\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=891,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=-883,[4]=-883,[7]=8},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:stripped_mangrove_wood\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=899,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=633,[2]=633,[4]=633,[5]=633},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"bark\"},[\"special\"]=false},[\"minecraft:terracotta\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=107,[\"count\"]=1,[\"ingredients\"]={{240,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.35,[\"category\"]=\"blocks\"},[\"special\"]=false},[\"minecraft:trapped_chest\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=909,[\"count\"]=1,[\"ingredients\"]={{5,1,false},{315,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:tuff_brick_stairs_from_tuff_bricks_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=910,[\"count\"]=1,[\"ingredients\"]={{238,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:tuff_bricks_from_tuff_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=238,[\"count\"]=1,[\"ingredients\"]={{239,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:vex_armor_trim_smithing_template\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=916,[\"count\"]=2,[\"ingredients\"]={},[\"grid\"]={[1]=133,[2]=916,[3]=133,[4]=133,[5]=28,[6]=133,[7]=133,[8]=133,[9]=133},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:warped_fungus_on_a_stick\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=923,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=180,[5]=924},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:warped_trapdoor\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=933,[\"count\"]=2,[\"ingredients\"]={},[\"grid\"]={[1]=919,[2]=919,[3]=919,[4]=919,[5]=919,[6]=919},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_trapdoor\"},[\"special\"]=false},[\"minecraft:waxed_copper_door_from_honeycomb\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=938,[\"count\"]=1,[\"ingredients\"]={{279,1,false},{69,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_copper_door\"},[\"special\"]=false},[\"minecraft:waxed_cut_copper_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=935,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=936,[2]=936,[3]=936},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_cut_copper_slab\"},[\"special\"]=false},[\"minecraft:waxed_exposed_chiseled_copper\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=942,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=943,[4]=943},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_exposed_cut_copper_chiseled\"},[\"special\"]=false},[\"minecraft:waxed_exposed_copper_grate\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=949,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[2]=944,[4]=944,[6]=944,[8]=944},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:waxed_exposed_cut_copper_slab_from_honeycomb\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=943,[\"count\"]=1,[\"ingredients\"]={{454,1,false},{69,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_exposed_cut_copper_slab\"},[\"special\"]=false},[\"minecraft:waxed_oxidized_chiseled_copper_from_honeycomb\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=953,[\"count\"]=1,[\"ingredients\"]={{718,1,false},{69,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_oxidized_chiseled_copper\"},[\"special\"]=false},[\"minecraft:waxed_oxidized_copper_grate_from_honeycomb\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=960,[\"count\"]=1,[\"ingredients\"]={{723,1,false},{69,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_oxidized_copper_grate\"},[\"special\"]=false},[\"minecraft:waxed_oxidized_cut_copper_slab_from_waxed_oxidized_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=954,[\"count\"]=8,[\"ingredients\"]={{955,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:waxed_weathered_chiseled_copper_from_waxed_weathered_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=964,[\"count\"]=4,[\"ingredients\"]={{967,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:waxed_weathered_copper_grate_from_waxed_weathered_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=974,[\"count\"]=4,[\"ingredients\"]={{967,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:waxed_weathered_cut_copper_slab_from_waxed_weathered_cut_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=965,[\"count\"]=2,[\"ingredients\"]={{968,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:weathered_chiseled_copper_from_weathered_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=966,[\"count\"]=4,[\"ingredients\"]={{973,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:weathered_cut_copper_slab_from_weathered_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=979,[\"count\"]=8,[\"ingredients\"]={{973,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:white_candle\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=984,[\"count\"]=1,[\"ingredients\"]={{94,1,false},{429,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"dyed_candle\"},[\"special\"]=false},[\"minecraft:white_stained_glass_pane_from_glass_pane\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=990,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=106,[2]=106,[3]=106,[4]=106,[5]=429,[6]=106,[7]=106,[8]=106,[9]=106},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"stained_glass_pane\"},[\"special\"]=false},[\"minecraft:wooden_hoe\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=996,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=-62,[2]=-62,[5]=8,[8]=8},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:yellow_carpet\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=434,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=435,[2]=435},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"carpet\"},[\"special\"]=false},[\"minecraft:yellow_terracotta\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=1007,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=107,[2]=107,[3]=107,[4]=107,[5]=433,[6]=107,[7]=107,[8]=107,[9]=107},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"stained_terracotta\"},[\"special\"]=false}},[\"counts\"]={}}",
  ["ceetos/recipes/vanilla-recipes-1.21.1-3.lua"] = "return{[\"schema\"]=1,[\"minecraft\"]=\"1.21.1\",[\"recipes\"]={[\"minecraft:acacia_chest_boat\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=4,[\"count\"]=1,[\"ingredients\"]={{5,1,false},{1,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"chest_boat\"},[\"special\"]=false},[\"minecraft:acacia_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=16,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=2,[2]=2,[3]=2},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"wooden_slab\"},[\"special\"]=false},[\"minecraft:andesite_slab_from_andesite_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=29,[\"count\"]=2,[\"ingredients\"]={{26,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:arrow\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=36,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=37,[4]=8,[7]=38},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:bamboo_fence\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=48,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=44,[2]=8,[3]=44,[4]=44,[5]=8,[6]=44},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"wooden_fence\"},[\"special\"]=false},[\"minecraft:bamboo_raft\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=46,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=44,[3]=44,[4]=44,[5]=44,[6]=44},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"boat\"},[\"special\"]=false},[\"minecraft:beehive\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=68,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=-62,[2]=-62,[3]=-62,[4]=69,[5]=69,[6]=69,[7]=-62,[8]=-62,[9]=-62},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:birch_hanging_sign\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=80,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=11,[3]=11,[4]=81,[5]=81,[6]=81,[7]=81,[8]=81,[9]=81},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"hanging_sign\"},[\"special\"]=false},[\"minecraft:black_banner\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=90,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=91,[2]=91,[3]=91,[4]=91,[5]=91,[6]=91,[8]=8},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"banner\"},[\"special\"]=false},[\"minecraft:black_stained_glass\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=104,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=65,[2]=65,[3]=65,[4]=65,[5]=95,[6]=65,[7]=65,[8]=65,[9]=65},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"stained_glass\"},[\"special\"]=false},[\"minecraft:blackstone_wall\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=111,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=109,[2]=109,[3]=109,[4]=109,[5]=109,[6]=109},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:blue_concrete_powder\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=123,[\"count\"]=8,[\"ingredients\"]={{121,1,false},{98,1,false},{98,1,false},{98,1,false},{98,1,false},{99,1,false},{99,1,false},{99,1,false},{99,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"concrete_powder\"},[\"special\"]=false},[\"minecraft:blue_terracotta\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=127,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=107,[2]=107,[3]=107,[4]=107,[5]=121,[6]=107,[7]=107,[8]=107,[9]=107},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"stained_terracotta\"},[\"special\"]=false},[\"minecraft:bookshelf\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=142,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=-62,[2]=-62,[3]=-62,[4]=139,[5]=139,[6]=139,[7]=-62,[8]=-62,[9]=-62},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:brick_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=153,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=152,[4]=152,[5]=152,[7]=152,[8]=152,[9]=152},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:brown_carpet\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=160,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=156,[2]=156},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"carpet\"},[\"special\"]=false},[\"minecraft:brush\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=167,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=38,[4]=168,[7]=8},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:cauldron\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=183,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=22,[3]=22,[4]=22,[6]=22,[7]=22,[8]=22,[9]=22},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:cherry_fence_gate\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=193,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=8,[2]=188,[3]=8,[4]=8,[5]=188,[6]=8},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_fence_gate\"},[\"special\"]=false},[\"minecraft:cherry_wood\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=202,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=203,[2]=203,[4]=203,[5]=203},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"bark\"},[\"special\"]=false},[\"minecraft:chiseled_deepslate_from_cobbled_deepslate_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=211,[\"count\"]=1,[\"ingredients\"]={{213,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:chiseled_red_sandstone\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=223,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=224,[4]=224},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:chiseled_tuff_bricks\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=235,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=236,[4]=236},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:coal_block\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=245,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=244,[2]=244,[3]=244,[4]=244,[5]=244,[6]=244,[7]=244,[8]=244,[9]=244},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:cobbled_deepslate_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=212,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=213,[2]=213,[3]=213},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:cobblestone_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=254,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=28,[4]=28,[5]=28,[7]=28,[8]=28,[9]=28},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:cooked_beef\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=263,[\"count\"]=1,[\"ingredients\"]={{264,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.35,[\"category\"]=\"food\"},[\"special\"]=false},[\"minecraft:cooked_cod_from_smoking\"]={[\"kind\"]=\"smoking\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smoke\",[\"output\"]=267,[\"count\"]=1,[\"ingredients\"]={{268,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=100,[\"experience\"]=0.35,[\"category\"]=\"food\"},[\"special\"]=false},[\"minecraft:cooked_rabbit_from_campfire_cooking\"]={[\"kind\"]=\"campfire_cooking\",[\"mode\"]=\"crafting\",[\"address\"]=\"Campfire\",[\"output\"]=273,[\"count\"]=1,[\"ingredients\"]={{274,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=600,[\"experience\"]=0.35,[\"category\"]=\"food\"},[\"special\"]=false},[\"minecraft:copper_door\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=279,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=168,[2]=168,[4]=168,[5]=168,[7]=168,[8]=168},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:copper_ingot_from_smelting_deepslate_copper_ore\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=168,[\"count\"]=1,[\"ingredients\"]={{282,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.7,[\"category\"]=\"misc\",[\"group\"]=\"copper_ingot\"},[\"special\"]=false},[\"minecraft:cracked_stone_bricks\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=293,[\"count\"]=1,[\"ingredients\"]={{231,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.1,[\"category\"]=\"blocks\"},[\"special\"]=false},[\"minecraft:crimson_hanging_sign\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=304,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=11,[3]=11,[4]=305,[5]=305,[6]=305,[7]=305,[8]=305,[9]=305},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"hanging_sign\"},[\"special\"]=false},[\"minecraft:crossbow\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=314,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=8,[2]=22,[3]=8,[4]=144,[5]=315,[6]=144,[8]=8},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:cut_copper_stairs_from_cut_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=316,[\"count\"]=1,[\"ingredients\"]={{210,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:cut_sandstone_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=320,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=319,[2]=319,[3]=319},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:cyan_dye\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=325,[\"count\"]=2,[\"ingredients\"]={{121,1,false},{328,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"cyan_dye\"},[\"special\"]=false},[\"minecraft:dark_oak_button\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=336,[\"count\"]=1,[\"ingredients\"]={{335,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_button\"},[\"special\"]=false},[\"minecraft:dark_oak_sign\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=345,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=335,[2]=335,[3]=335,[4]=335,[5]=335,[6]=335,[8]=8},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"wooden_sign\"},[\"special\"]=false},[\"minecraft:dark_prismarine_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=354,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=351,[4]=351,[5]=351,[7]=351,[8]=351,[9]=351},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:deepslate_brick_slab_from_deepslate_bricks_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=358,[\"count\"]=2,[\"ingredients\"]={{287,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:deepslate_brick_wall_from_deepslate_bricks_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=361,[\"count\"]=1,[\"ingredients\"]={{287,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:deepslate_tile_slab_from_deepslate_tiles_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=362,[\"count\"]=2,[\"ingredients\"]={{289,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:deepslate_tile_wall_from_cobbled_deepslate_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=364,[\"count\"]=1,[\"ingredients\"]={{213,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:detector_rail\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=365,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=22,[3]=22,[4]=22,[5]=366,[6]=22,[7]=22,[8]=243,[9]=22},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:diamond_from_smelting_deepslate_diamond_ore\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=133,[\"count\"]=1,[\"ingredients\"]={{371,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=1,[\"category\"]=\"misc\",[\"group\"]=\"diamond\"},[\"special\"]=false},[\"minecraft:diorite\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=27,[\"count\"]=2,[\"ingredients\"]={},[\"grid\"]={[1]=28,[2]=257,[4]=257,[5]=28},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:dried_kelp\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=383,[\"count\"]=9,[\"ingredients\"]={{384,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:dune_armor_trim_smithing_template_smithing_trim\"]={[\"kind\"]=\"smithing_trim\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smith\",[\"output\"]=0,[\"count\"]=1,[\"ingredients\"]={{134,1,true},{135,1,true},{388,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=true},[\"minecraft:dye_brown_carpet\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=160,[\"count\"]=1,[\"ingredients\"]={{159,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"carpet\"},[\"special\"]=false},[\"minecraft:dye_green_bed\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=393,[\"count\"]=1,[\"ingredients\"]={{328,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"bed\"},[\"special\"]=false},[\"minecraft:dye_light_gray_wool\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=403,[\"count\"]=1,[\"ingredients\"]={{401,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"wool\"},[\"special\"]=false},[\"minecraft:dye_orange_carpet\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=414,[\"count\"]=1,[\"ingredients\"]={{413,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"carpet\"},[\"special\"]=false},[\"minecraft:dye_red_bed\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=424,[\"count\"]=1,[\"ingredients\"]={{425,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"bed\"},[\"special\"]=false},[\"minecraft:dye_yellow_wool\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=435,[\"count\"]=1,[\"ingredients\"]={{433,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"wool\"},[\"special\"]=false},[\"minecraft:end_crystal\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=441,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=65,[2]=65,[3]=65,[4]=65,[5]=442,[6]=65,[7]=65,[8]=443,[9]=65},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:end_stone_brick_wall\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=450,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=447,[2]=447,[3]=447,[4]=447,[5]=447,[6]=447},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:exposed_chiseled_copper_from_exposed_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=453,[\"count\"]=4,[\"ingredients\"]={{455,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:exposed_cut_copper_slab_from_exposed_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=454,[\"count\"]=8,[\"ingredients\"]={{455,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:fire_charge\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=464,[\"count\"]=3,[\"ingredients\"]={{465,1,false},{115,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:flow_armor_trim_smithing_template\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=469,[\"count\"]=2,[\"ingredients\"]={},[\"grid\"]={[1]=133,[2]=469,[3]=133,[4]=133,[5]=470,[6]=133,[7]=133,[8]=133,[9]=133},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:glass_pane\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=106,[\"count\"]=16,[\"ingredients\"]={},[\"grid\"]={[1]=65,[2]=65,[3]=65,[4]=65,[5]=65,[6]=65},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:gold_ingot_from_blasting_raw_gold\"]={[\"kind\"]=\"blasting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Blast\",[\"output\"]=242,[\"count\"]=1,[\"ingredients\"]={{489,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=100,[\"experience\"]=1,[\"category\"]=\"misc\",[\"group\"]=\"gold_ingot\"},[\"special\"]=false},[\"minecraft:gold_nugget_from_blasting\"]={[\"kind\"]=\"blasting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Blast\",[\"output\"]=478,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=100,[\"experience\"]=0.1,[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:golden_hoe\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=497,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=242,[2]=242,[5]=8,[8]=8},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:granite_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=504,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=502,[4]=502,[5]=502,[7]=502,[8]=502,[9]=502},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:gray_concrete_powder\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=508,[\"count\"]=8,[\"ingredients\"]={{390,1,false},{98,1,false},{98,1,false},{98,1,false},{98,1,false},{99,1,false},{99,1,false},{99,1,false},{99,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"concrete_powder\"},[\"special\"]=false},[\"minecraft:green_bed\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=393,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=395,[2]=395,[3]=395,[4]=-62,[5]=-62,[6]=-62},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"bed\"},[\"special\"]=false},[\"minecraft:green_stained_glass_pane_from_glass_pane\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=520,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=106,[2]=106,[3]=106,[4]=106,[5]=328,[6]=106,[7]=106,[8]=106,[9]=106},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"stained_glass_pane\"},[\"special\"]=false},[\"minecraft:hopper\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=528,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=22,[3]=22,[4]=22,[5]=5,[6]=22,[8]=22},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:iron_chestplate\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=534,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=22,[3]=22,[4]=22,[5]=22,[6]=22,[7]=22,[8]=22,[9]=22},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:iron_ingot_from_nuggets\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=22,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=184,[2]=184,[3]=184,[4]=184,[5]=184,[6]=184,[7]=184,[8]=184,[9]=184},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"iron_ingot\"},[\"special\"]=false},[\"minecraft:iron_pickaxe\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=542,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=22,[2]=22,[3]=22,[5]=8,[8]=8},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:jungle_button\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=552,[\"count\"]=1,[\"ingredients\"]={{551,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_button\"},[\"special\"]=false},[\"minecraft:jungle_sign\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=561,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=551,[2]=551,[3]=551,[4]=551,[5]=551,[6]=551,[8]=8},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"wooden_sign\"},[\"special\"]=false},[\"minecraft:lapis_lazuli\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=124,[\"count\"]=9,[\"ingredients\"]={{569,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:leather_chestplate\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=576,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=141,[3]=141,[4]=141,[5]=141,[6]=141,[7]=141,[8]=141,[9]=141},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:light_blue_candle\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=583,[\"count\"]=1,[\"ingredients\"]={{94,1,false},{397,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"dyed_candle\"},[\"special\"]=false},[\"minecraft:light_blue_stained_glass_pane_from_glass_pane\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=589,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=106,[2]=106,[3]=106,[4]=106,[5]=397,[6]=106,[7]=106,[8]=106,[9]=106},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"stained_glass_pane\"},[\"special\"]=false},[\"minecraft:light_gray_dye_from_black_white_dye\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=401,[\"count\"]=3,[\"ingredients\"]={{95,1,false},{429,1,false},{429,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"light_gray_dye\"},[\"special\"]=false},[\"minecraft:light_gray_terracotta\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=596,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=107,[2]=107,[3]=107,[4]=107,[5]=401,[6]=107,[7]=107,[8]=107,[9]=107},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"stained_terracotta\"},[\"special\"]=false},[\"minecraft:lime_dye\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=405,[\"count\"]=2,[\"ingredients\"]={{328,1,false},{429,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:loom\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=611,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=144,[2]=144,[4]=-62,[5]=-62},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:magenta_dye_from_blue_red_pink\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=409,[\"count\"]=3,[\"ingredients\"]={{121,1,false},{425,1,false},{417,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"magenta_dye\"},[\"special\"]=false},[\"minecraft:magenta_terracotta\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=620,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=107,[2]=107,[3]=107,[4]=107,[5]=409,[6]=107,[7]=107,[8]=107,[9]=107},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"stained_terracotta\"},[\"special\"]=false},[\"minecraft:mangrove_fence_gate\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=631,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=8,[2]=626,[3]=8,[4]=8,[5]=626,[6]=8},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_fence_gate\"},[\"special\"]=false},[\"minecraft:mangrove_wood\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=640,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=641,[2]=641,[4]=641,[5]=641},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"bark\"},[\"special\"]=false},[\"minecraft:moss_carpet\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=647,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=648,[2]=648},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"carpet\"},[\"special\"]=false},[\"minecraft:mossy_cobblestone_wall_from_mossy_cobblestone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=653,[\"count\"]=1,[\"ingredients\"]={{649,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:mossy_stone_bricks_from_vine\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=655,[\"count\"]=1,[\"ingredients\"]={{231,1,false},{650,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"mossy_stone_bricks\"},[\"special\"]=false},[\"minecraft:muddy_mangrove_roots\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=663,[\"count\"]=1,[\"ingredients\"]={{664,1,false},{665,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:nether_brick_stairs_from_nether_bricks_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=673,[\"count\"]=1,[\"ingredients\"]={{216,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:netherite_chestplate_smithing\"]={[\"kind\"]=\"smithing_transform\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smith\",[\"output\"]=681,[\"count\"]=1,[\"ingredients\"]={{370,1,false},{610,1,false},{678,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:netherite_scrap_from_blasting\"]={[\"kind\"]=\"blasting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Blast\",[\"output\"]=684,[\"count\"]=1,[\"ingredients\"]={{687,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=100,[\"experience\"]=2,[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:oak_door\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=695,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=692,[2]=692,[4]=692,[5]=692,[7]=692,[8]=692},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_door\"},[\"special\"]=false},[\"minecraft:oak_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=704,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=692,[4]=692,[5]=692,[7]=692,[8]=692,[9]=692},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"wooden_stairs\"},[\"special\"]=false},[\"minecraft:orange_concrete_powder\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=711,[\"count\"]=8,[\"ingredients\"]={{413,1,false},{98,1,false},{98,1,false},{98,1,false},{98,1,false},{99,1,false},{99,1,false},{99,1,false},{99,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"concrete_powder\"},[\"special\"]=false},[\"minecraft:orange_terracotta\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=715,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=107,[2]=107,[3]=107,[4]=107,[5]=413,[6]=107,[7]=107,[8]=107,[9]=107},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"stained_terracotta\"},[\"special\"]=false},[\"minecraft:oxidized_cut_copper_from_oxidized_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=721,[\"count\"]=4,[\"ingredients\"]={{720,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:packed_mud\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=662,[\"count\"]=1,[\"ingredients\"]={{664,1,false},{146,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:pink_dye_from_peony\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=417,[\"count\"]=2,[\"ingredients\"]={{732,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"pink_dye\"},[\"special\"]=false},[\"minecraft:pink_terracotta\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=736,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=107,[2]=107,[3]=107,[4]=107,[5]=417,[6]=107,[7]=107,[8]=107,[9]=107},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"stained_terracotta\"},[\"special\"]=false},[\"minecraft:polished_andesite_stairs_from_andesite_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=742,[\"count\"]=1,[\"ingredients\"]={{26,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:polished_blackstone_brick_slab_from_polished_blackstone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=745,[\"count\"]=2,[\"ingredients\"]={{219,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:polished_blackstone_brick_wall_from_polished_blackstone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=747,[\"count\"]=1,[\"ingredients\"]={{219,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:polished_blackstone_slab_from_blackstone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=218,[\"count\"]=2,[\"ingredients\"]={{109,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:polished_deepslate\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=359,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=213,[2]=213,[4]=213,[5]=213},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:polished_deepslate_wall\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=754,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=359,[2]=359,[3]=359,[4]=359,[5]=359,[6]=359},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:polished_diorite_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=757,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=755,[4]=755,[5]=755,[7]=755,[8]=755,[9]=755},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:polished_granite_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=760,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=758,[4]=758,[5]=758,[7]=758,[8]=758,[9]=758},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:polished_tuff_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=762,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=237,[4]=237,[5]=237,[7]=237,[8]=237,[9]=237},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:prismarine\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=766,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=352,[2]=352,[4]=352,[5]=352},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:prismarine_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=771,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=766,[4]=766,[5]=766,[7]=766,[8]=766,[9]=766},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:purple_candle\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=777,[\"count\"]=1,[\"ingredients\"]={{94,1,false},{421,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"dyed_candle\"},[\"special\"]=false},[\"minecraft:purple_terracotta\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=780,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=107,[2]=107,[3]=107,[4]=107,[5]=421,[6]=107,[7]=107,[8]=107,[9]=107},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"stained_terracotta\"},[\"special\"]=false},[\"minecraft:quartz\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=257,[\"count\"]=1,[\"ingredients\"]={{787,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.2,[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:quartz_slab_from_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=221,[\"count\"]=2,[\"ingredients\"]={{222,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:raw_copper\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=283,[\"count\"]=9,[\"ingredients\"]={{794,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:red_bed\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=424,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=427,[2]=427,[3]=427,[4]=-62,[5]=-62,[6]=-62},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"bed\"},[\"special\"]=false},[\"minecraft:red_glazed_terracotta\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=805,[\"count\"]=1,[\"ingredients\"]={{806,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.1,[\"category\"]=\"blocks\"},[\"special\"]=false},[\"minecraft:red_sandstone\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=225,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=811,[2]=811,[4]=811,[5]=811},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:red_stained_glass_pane\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=815,[\"count\"]=16,[\"ingredients\"]={},[\"grid\"]={[1]=814,[2]=814,[3]=814,[4]=814,[5]=814,[6]=814},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"stained_glass_pane\"},[\"special\"]=false},[\"minecraft:redstone_from_smelting_redstone_ore\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=243,[\"count\"]=1,[\"ingredients\"]={{818,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.7,[\"category\"]=\"blocks\",[\"group\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:sandstone\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=228,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=98,[2]=98,[4]=98,[5]=98},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:sea_lantern\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=827,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=352,[2]=828,[3]=352,[4]=828,[5]=828,[6]=828,[7]=352,[8]=828,[9]=352},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:shulker_box\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=833,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=834,[4]=5,[7]=834},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:smoker\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=840,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[2]=-178,[4]=-178,[5]=113,[6]=-178,[8]=-178},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:smooth_red_sandstone_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=846,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=845,[2]=845,[3]=845},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:smooth_sandstone_stairs_from_smooth_sandstone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=850,[\"count\"]=1,[\"ingredients\"]={{848,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:soul_campfire\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=855,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[2]=8,[4]=8,[5]=-856,[6]=8,[7]=-178,[8]=-178,[9]=-178},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:spruce_button\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=865,[\"count\"]=1,[\"ingredients\"]={{864,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_button\"},[\"special\"]=false},[\"minecraft:spruce_sign\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=874,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=864,[2]=864,[3]=864,[4]=864,[5]=864,[6]=864,[8]=8},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"wooden_sign\"},[\"special\"]=false},[\"minecraft:sticky_piston\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=881,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=573,[4]=739},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:stone_brick_stairs_from_stone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=884,[\"count\"]=1,[\"ingredients\"]={{232,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:stone_pickaxe\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=888,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=-883,[2]=-883,[3]=-883,[5]=8,[8]=8},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:stonecutter\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=892,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[2]=22,[4]=232,[5]=232,[6]=232},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:stripped_oak_wood\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=900,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=699,[2]=699,[4]=699,[5]=699},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"bark\"},[\"special\"]=false},[\"minecraft:tide_armor_trim_smithing_template\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=905,[\"count\"]=2,[\"ingredients\"]={},[\"grid\"]={[1]=133,[2]=905,[3]=133,[4]=133,[5]=766,[6]=133,[7]=133,[8]=133,[9]=133},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:tripwire_hook\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=315,[\"count\"]=2,[\"ingredients\"]={},[\"grid\"]={[1]=22,[4]=8,[7]=-62},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:tuff_brick_stairs_from_tuff_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=910,[\"count\"]=1,[\"ingredients\"]={{239,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:tuff_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=234,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=239,[2]=239,[3]=239},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:vex_armor_trim_smithing_template_smithing_trim\"]={[\"kind\"]=\"smithing_trim\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smith\",[\"output\"]=0,[\"count\"]=1,[\"ingredients\"]={{134,1,true},{135,1,true},{916,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=true},[\"minecraft:warped_hanging_sign\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=925,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=11,[3]=11,[4]=903,[5]=903,[6]=903,[7]=903,[8]=903,[9]=903},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"hanging_sign\"},[\"special\"]=false},[\"minecraft:waxed_chiseled_copper\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=934,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=935,[4]=935},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_cut_copper_chiseled\"},[\"special\"]=false},[\"minecraft:waxed_copper_grate\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=939,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[2]=284,[4]=284,[6]=284,[8]=284},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:waxed_cut_copper_slab_from_honeycomb\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=935,[\"count\"]=1,[\"ingredients\"]={{208,1,false},{69,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_cut_copper_slab\"},[\"special\"]=false},[\"minecraft:waxed_exposed_chiseled_copper_from_honeycomb\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=942,[\"count\"]=1,[\"ingredients\"]={{453,1,false},{69,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_exposed_chiseled_copper\"},[\"special\"]=false},[\"minecraft:waxed_exposed_copper_grate_from_honeycomb\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=949,[\"count\"]=1,[\"ingredients\"]={{458,1,false},{69,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_exposed_copper_grate\"},[\"special\"]=false},[\"minecraft:waxed_exposed_cut_copper_slab_from_waxed_exposed_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=943,[\"count\"]=8,[\"ingredients\"]={{944,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:waxed_oxidized_chiseled_copper_from_waxed_oxidized_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=953,[\"count\"]=4,[\"ingredients\"]={{955,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:waxed_oxidized_copper_grate_from_waxed_oxidized_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=960,[\"count\"]=4,[\"ingredients\"]={{955,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:waxed_oxidized_cut_copper_slab_from_waxed_oxidized_cut_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=954,[\"count\"]=2,[\"ingredients\"]={{956,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:waxed_weathered_chiseled_copper_from_waxed_weathered_cut_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=964,[\"count\"]=1,[\"ingredients\"]={{968,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:waxed_weathered_copper_trapdoor_from_honeycomb\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=976,[\"count\"]=1,[\"ingredients\"]={{977,1,false},{69,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_weathered_copper_trapdoor\"},[\"special\"]=false},[\"minecraft:waxed_weathered_cut_copper_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=980,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=968,[4]=968,[5]=968,[7]=968,[8]=968,[9]=968},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_weathered_cut_copper_stairs\"},[\"special\"]=false},[\"minecraft:weathered_chiseled_copper_from_weathered_cut_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=966,[\"count\"]=1,[\"ingredients\"]={{978,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:weathered_cut_copper_slab_from_weathered_cut_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=979,[\"count\"]=2,[\"ingredients\"]={{978,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:white_carpet\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=430,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=431,[2]=431},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"carpet\"},[\"special\"]=false},[\"minecraft:white_terracotta\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=988,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=107,[2]=107,[3]=107,[4]=107,[5]=429,[6]=107,[7]=107,[8]=107,[9]=107},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"stained_terracotta\"},[\"special\"]=false},[\"minecraft:wooden_pickaxe\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=997,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=-62,[2]=-62,[3]=-62,[5]=8,[8]=8},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:yellow_concrete_powder\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=1003,[\"count\"]=8,[\"ingredients\"]={{433,1,false},{98,1,false},{98,1,false},{98,1,false},{98,1,false},{99,1,false},{99,1,false},{99,1,false},{99,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"concrete_powder\"},[\"special\"]=false}},[\"counts\"]={}}",
  ["ceetos/recipes/vanilla-recipes-1.21.1-4.lua"] = "return{[\"schema\"]=1,[\"minecraft\"]=\"1.21.1\",[\"recipes\"]={[\"minecraft:acacia_door\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=6,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=2,[2]=2,[4]=2,[5]=2,[7]=2,[8]=2},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_door\"},[\"special\"]=false},[\"minecraft:acacia_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=17,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=2,[4]=2,[5]=2,[7]=2,[8]=2,[9]=2},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"wooden_stairs\"},[\"special\"]=false},[\"minecraft:andesite_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=30,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=26,[4]=26,[5]=26,[7]=26,[8]=26,[9]=26},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:baked_potato\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=39,[\"count\"]=1,[\"ingredients\"]={{40,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.35,[\"category\"]=\"food\"},[\"special\"]=false},[\"minecraft:bamboo_fence_gate\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=49,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=8,[2]=44,[3]=8,[4]=8,[5]=44,[6]=8},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_fence_gate\"},[\"special\"]=false},[\"minecraft:bamboo_sign\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=58,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=44,[2]=44,[3]=44,[4]=44,[5]=44,[6]=44,[8]=8},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"wooden_sign\"},[\"special\"]=false},[\"minecraft:beetroot_soup\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=70,[\"count\"]=1,[\"ingredients\"]={{71,1,false},{72,1,false},{72,1,false},{72,1,false},{72,1,false},{72,1,false},{72,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:birch_planks\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=74,[\"count\"]=4,[\"ingredients\"]={{82,1,true}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"planks\"},[\"special\"]=false},[\"minecraft:black_bed\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=92,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=91,[2]=91,[3]=91,[4]=-62,[5]=-62,[6]=-62},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"bed\"},[\"special\"]=false},[\"minecraft:black_stained_glass_pane\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=105,[\"count\"]=16,[\"ingredients\"]={},[\"grid\"]={[1]=104,[2]=104,[3]=104,[4]=104,[5]=104,[6]=104},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"stained_glass_pane\"},[\"special\"]=false},[\"minecraft:blackstone_wall_from_blackstone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=111,[\"count\"]=1,[\"ingredients\"]={{109,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:blue_dye\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=121,[\"count\"]=1,[\"ingredients\"]={{124,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"blue_dye\"},[\"special\"]=false},[\"minecraft:bolt_armor_trim_smithing_template\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=132,[\"count\"]=2,[\"ingredients\"]={},[\"grid\"]={[1]=133,[2]=132,[3]=133,[4]=133,[6]=133,[7]=133,[8]=133,[9]=133},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:bow\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=143,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[2]=8,[3]=144,[4]=8,[6]=144,[8]=8,[9]=144},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:brick_stairs_from_bricks_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=153,[\"count\"]=1,[\"ingredients\"]={{152,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:brown_concrete_powder\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=161,[\"count\"]=8,[\"ingredients\"]={{159,1,false},{98,1,false},{98,1,false},{98,1,false},{98,1,false},{99,1,false},{99,1,false},{99,1,false},{99,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"concrete_powder\"},[\"special\"]=false},[\"minecraft:bucket\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=169,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=22,[3]=22,[5]=22},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:chain\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=11,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=184,[4]=22,[7]=184},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:cherry_hanging_sign\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=194,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=11,[3]=11,[4]=195,[5]=195,[6]=195,[7]=195,[8]=195,[9]=195},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"hanging_sign\"},[\"special\"]=false},[\"minecraft:chest\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=5,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=-62,[2]=-62,[3]=-62,[4]=-62,[6]=-62,[7]=-62,[8]=-62,[9]=-62},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:chiseled_nether_bricks\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=214,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=215,[4]=215},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:chiseled_red_sandstone_from_red_sandstone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=223,[\"count\"]=1,[\"ingredients\"]={{225,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:chiseled_tuff_bricks_from_polished_tuff_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=235,[\"count\"]=1,[\"ingredients\"]={{237,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:coal_from_blasting_coal_ore\"]={[\"kind\"]=\"blasting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Blast\",[\"output\"]=244,[\"count\"]=1,[\"ingredients\"]={{246,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=100,[\"experience\"]=0.1,[\"category\"]=\"misc\",[\"group\"]=\"coal\"},[\"special\"]=false},[\"minecraft:cobbled_deepslate_slab_from_cobbled_deepslate_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=212,[\"count\"]=2,[\"ingredients\"]={{213,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:cobblestone_stairs_from_cobblestone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=254,[\"count\"]=1,[\"ingredients\"]={{28,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:cooked_beef_from_campfire_cooking\"]={[\"kind\"]=\"campfire_cooking\",[\"mode\"]=\"crafting\",[\"address\"]=\"Campfire\",[\"output\"]=263,[\"count\"]=1,[\"ingredients\"]={{264,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=600,[\"experience\"]=0.35,[\"category\"]=\"food\"},[\"special\"]=false},[\"minecraft:cooked_mutton\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=269,[\"count\"]=1,[\"ingredients\"]={{270,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.35,[\"category\"]=\"food\"},[\"special\"]=false},[\"minecraft:cooked_rabbit_from_smoking\"]={[\"kind\"]=\"smoking\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smoke\",[\"output\"]=273,[\"count\"]=1,[\"ingredients\"]={{274,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=100,[\"experience\"]=0.35,[\"category\"]=\"food\"},[\"special\"]=false},[\"minecraft:copper_grate\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=280,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[2]=209,[4]=209,[6]=209,[8]=209},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:copper_ingot_from_smelting_raw_copper\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=168,[\"count\"]=1,[\"ingredients\"]={{283,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.7,[\"category\"]=\"misc\",[\"group\"]=\"copper_ingot\"},[\"special\"]=false},[\"minecraft:crafter\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=294,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=22,[2]=22,[3]=22,[4]=22,[5]=295,[6]=22,[7]=243,[8]=296,[9]=243},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:crimson_hyphae\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=306,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=307,[2]=307,[4]=307,[5]=307},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"bark\"},[\"special\"]=false},[\"minecraft:cut_copper\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=210,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=209,[2]=209,[4]=209,[5]=209},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:cut_red_sandstone\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=317,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=225,[2]=225,[4]=225,[5]=225},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:cut_sandstone_slab_from_cut_sandstone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=320,[\"count\"]=2,[\"ingredients\"]={{319,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:cyan_dye_from_pitcher_plant\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=325,[\"count\"]=2,[\"ingredients\"]={{329,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"cyan_dye\"},[\"special\"]=false},[\"minecraft:dark_oak_chest_boat\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=337,[\"count\"]=1,[\"ingredients\"]={{5,1,false},{334,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"chest_boat\"},[\"special\"]=false},[\"minecraft:dark_oak_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=346,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=335,[2]=335,[3]=335},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"wooden_slab\"},[\"special\"]=false},[\"minecraft:dark_prismarine_stairs_from_dark_prismarine_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=354,[\"count\"]=1,[\"ingredients\"]={{351,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:deepslate_brick_slab_from_polished_deepslate_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=358,[\"count\"]=2,[\"ingredients\"]={{359,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:deepslate_brick_wall_from_polished_deepslate_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=361,[\"count\"]=1,[\"ingredients\"]={{359,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:deepslate_tile_slab_from_polished_deepslate_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=362,[\"count\"]=2,[\"ingredients\"]={{359,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:deepslate_tile_wall_from_deepslate_bricks_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=364,[\"count\"]=1,[\"ingredients\"]={{287,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:diamond\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=133,[\"count\"]=9,[\"ingredients\"]={{367,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:diamond_from_smelting_diamond_ore\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=133,[\"count\"]=1,[\"ingredients\"]={{372,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=1,[\"category\"]=\"misc\",[\"group\"]=\"diamond\"},[\"special\"]=false},[\"minecraft:diorite_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=379,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=27,[2]=27,[3]=27},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:dried_kelp_block\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=384,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=383,[2]=383,[3]=383,[4]=383,[5]=383,[6]=383,[7]=383,[8]=383,[9]=383},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:dye_black_bed\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=92,[\"count\"]=1,[\"ingredients\"]={{95,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"bed\"},[\"special\"]=false},[\"minecraft:dye_brown_wool\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=156,[\"count\"]=1,[\"ingredients\"]={{159,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"wool\"},[\"special\"]=false},[\"minecraft:dye_green_carpet\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=394,[\"count\"]=1,[\"ingredients\"]={{328,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"carpet\"},[\"special\"]=false},[\"minecraft:dye_lime_bed\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=404,[\"count\"]=1,[\"ingredients\"]={{405,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"bed\"},[\"special\"]=false},[\"minecraft:dye_orange_wool\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=415,[\"count\"]=1,[\"ingredients\"]={{413,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"wool\"},[\"special\"]=false},[\"minecraft:dye_red_carpet\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=426,[\"count\"]=1,[\"ingredients\"]={{425,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"carpet\"},[\"special\"]=false},[\"minecraft:emerald\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=436,[\"count\"]=9,[\"ingredients\"]={{437,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:end_rod\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=444,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=116,[4]=445},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:end_stone_brick_wall_from_end_stone_brick_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=450,[\"count\"]=1,[\"ingredients\"]={{447,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:exposed_chiseled_copper_from_exposed_cut_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=453,[\"count\"]=1,[\"ingredients\"]={{456,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:exposed_cut_copper_slab_from_exposed_cut_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=454,[\"count\"]=2,[\"ingredients\"]={{456,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:firework_rocket\"]={[\"kind\"]=\"crafting_special_firework_rocket\",[\"mode\"]=\"special\",[\"address\"]=\"Crafter\",[\"output\"]=0,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=true},[\"minecraft:flow_armor_trim_smithing_template_smithing_trim\"]={[\"kind\"]=\"smithing_trim\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smith\",[\"output\"]=0,[\"count\"]=1,[\"ingredients\"]={{134,1,true},{135,1,true},{469,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=true},[\"minecraft:glistering_melon_slice\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=477,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=478,[2]=478,[3]=478,[4]=478,[5]=479,[6]=478,[7]=478,[8]=478,[9]=478},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:gold_ingot_from_gold_block\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=242,[\"count\"]=9,[\"ingredients\"]={{485,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"gold_ingot\"},[\"special\"]=false},[\"minecraft:gold_nugget_from_smelting\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=478,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.1,[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:golden_leggings\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=498,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=242,[2]=242,[3]=242,[4]=242,[6]=242,[7]=242,[9]=242},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:granite_stairs_from_granite_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=504,[\"count\"]=1,[\"ingredients\"]={{502,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:gray_dye\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=390,[\"count\"]=2,[\"ingredients\"]={{95,1,false},{429,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:green_candle\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=514,[\"count\"]=1,[\"ingredients\"]={{94,1,false},{328,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"dyed_candle\"},[\"special\"]=false},[\"minecraft:green_terracotta\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=518,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=107,[2]=107,[3]=107,[4]=107,[5]=328,[6]=107,[7]=107,[8]=107,[9]=107},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"stained_terracotta\"},[\"special\"]=false},[\"minecraft:hopper_minecart\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=529,[\"count\"]=1,[\"ingredients\"]={{528,1,false},{205,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:iron_door\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=535,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=22,[2]=22,[4]=22,[5]=22,[7]=22,[8]=22},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:iron_ingot_from_smelting_deepslate_iron_ore\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=22,[\"count\"]=1,[\"ingredients\"]={{538,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.7,[\"category\"]=\"misc\",[\"group\"]=\"iron_ingot\"},[\"special\"]=false},[\"minecraft:iron_shovel\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=543,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=22,[4]=8,[7]=8},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:jungle_chest_boat\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=553,[\"count\"]=1,[\"ingredients\"]={{5,1,false},{550,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"chest_boat\"},[\"special\"]=false},[\"minecraft:jungle_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=562,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=551,[2]=551,[3]=551},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"wooden_slab\"},[\"special\"]=false},[\"minecraft:lapis_lazuli_from_blasting_deepslate_lapis_ore\"]={[\"kind\"]=\"blasting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Blast\",[\"output\"]=124,[\"count\"]=1,[\"ingredients\"]={{570,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=100,[\"experience\"]=0.2,[\"category\"]=\"misc\",[\"group\"]=\"lapis_lazuli\"},[\"special\"]=false},[\"minecraft:leather_helmet\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=577,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=141,[2]=141,[3]=141,[4]=141,[6]=141},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:light_blue_carpet\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=398,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=399,[2]=399},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"carpet\"},[\"special\"]=false},[\"minecraft:light_blue_terracotta\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=587,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=107,[2]=107,[3]=107,[4]=107,[5]=397,[6]=107,[7]=107,[8]=107,[9]=107},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"stained_terracotta\"},[\"special\"]=false},[\"minecraft:light_gray_dye_from_gray_white_dye\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=401,[\"count\"]=2,[\"ingredients\"]={{390,1,false},{429,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"light_gray_dye\"},[\"special\"]=false},[\"minecraft:light_weighted_pressure_plate\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=599,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=242,[2]=242},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:lime_dye_from_smelting\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=405,[\"count\"]=1,[\"ingredients\"]={{604,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.1,[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:mace\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=612,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[2]=613,[5]=470},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:magenta_dye_from_blue_red_white_dye\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=409,[\"count\"]=4,[\"ingredients\"]={{121,1,false},{425,1,false},{425,1,false},{429,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"magenta_dye\"},[\"special\"]=false},[\"minecraft:magma_block\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=623,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=624,[2]=624,[4]=624,[5]=624},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:mangrove_hanging_sign\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=632,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=11,[3]=11,[4]=633,[5]=633,[6]=633,[7]=633,[8]=633,[9]=633},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"hanging_sign\"},[\"special\"]=false},[\"minecraft:map\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=642,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=140,[2]=140,[3]=140,[4]=140,[5]=258,[6]=140,[7]=140,[8]=140,[9]=140},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:mossy_cobblestone_from_moss_block\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=649,[\"count\"]=1,[\"ingredients\"]={{28,1,false},{648,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"mossy_cobblestone\"},[\"special\"]=false},[\"minecraft:mossy_stone_brick_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=654,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=655,[2]=655,[3]=655},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:mud_brick_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=658,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=659,[2]=659,[3]=659},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:mushroom_stew\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=666,[\"count\"]=1,[\"ingredients\"]={{463,1,false},{667,1,false},{71,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:nether_brick_wall\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=674,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=216,[2]=216,[3]=216,[4]=216,[5]=216,[6]=216},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:netherite_helmet_smithing\"]={[\"kind\"]=\"smithing_transform\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smith\",[\"output\"]=682,[\"count\"]=1,[\"ingredients\"]={{373,1,false},{610,1,false},{678,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:netherite_shovel_smithing\"]={[\"kind\"]=\"smithing_transform\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smith\",[\"output\"]=688,[\"count\"]=1,[\"ingredients\"]={{377,1,false},{610,1,false},{678,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:oak_fence\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=696,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=692,[2]=8,[3]=692,[4]=692,[5]=8,[6]=692},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"wooden_fence\"},[\"special\"]=false},[\"minecraft:oak_trapdoor\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=705,[\"count\"]=2,[\"ingredients\"]={},[\"grid\"]={[1]=692,[2]=692,[3]=692,[4]=692,[5]=692,[6]=692},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_trapdoor\"},[\"special\"]=false},[\"minecraft:orange_dye_from_orange_tulip\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=413,[\"count\"]=1,[\"ingredients\"]={{712,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"orange_dye\"},[\"special\"]=false},[\"minecraft:oxidized_chiseled_copper\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=718,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=719,[4]=719},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:oxidized_cut_copper_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=719,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=721,[2]=721,[3]=721},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:painting\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=726,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=8,[2]=8,[3]=8,[4]=8,[5]=-727,[6]=8,[7]=8,[8]=8,[9]=8},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:pink_dye_from_pink_petals\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=417,[\"count\"]=1,[\"ingredients\"]={{733,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"pink_dye\"},[\"special\"]=false},[\"minecraft:piston\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=739,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=-62,[2]=-62,[3]=-62,[4]=28,[5]=22,[6]=28,[7]=28,[8]=243,[9]=28},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:polished_andesite_stairs_from_polished_andesite_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=742,[\"count\"]=1,[\"ingredients\"]={{740,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:polished_blackstone_brick_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=746,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=292,[4]=292,[5]=292,[7]=292,[8]=292,[9]=292},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:polished_blackstone_bricks\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=292,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=219,[2]=219,[4]=219,[5]=219},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:polished_blackstone_slab_from_polished_blackstone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=218,[\"count\"]=2,[\"ingredients\"]={{219,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:polished_deepslate_from_cobbled_deepslate_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=359,[\"count\"]=1,[\"ingredients\"]={{213,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:polished_deepslate_wall_from_cobbled_deepslate_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=754,[\"count\"]=1,[\"ingredients\"]={{213,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:polished_diorite_stairs_from_diorite_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=757,[\"count\"]=1,[\"ingredients\"]={{27,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:polished_granite_stairs_from_granite_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=760,[\"count\"]=1,[\"ingredients\"]={{502,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:polished_tuff_stairs_from_polished_tuff_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=762,[\"count\"]=1,[\"ingredients\"]={{237,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:prismarine_brick_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=767,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=768,[2]=768,[3]=768},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:prismarine_stairs_from_prismarine_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=771,[\"count\"]=1,[\"ingredients\"]={{766,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:purple_carpet\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=422,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=423,[2]=423},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"carpet\"},[\"special\"]=false},[\"minecraft:purpur_block\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=783,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=445,[2]=445,[4]=445,[5]=445},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:quartz_block\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=222,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=257,[2]=257,[4]=257,[5]=257},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:quartz_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=790,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:raw_copper_block\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=794,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=283,[2]=283,[3]=283,[4]=283,[5]=283,[6]=283,[7]=283,[8]=283,[9]=283},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:red_candle\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=800,[\"count\"]=1,[\"ingredients\"]={{94,1,false},{425,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"dyed_candle\"},[\"special\"]=false},[\"minecraft:red_nether_brick_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=807,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=808,[2]=808,[3]=808},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:red_sandstone_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=224,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:red_stained_glass_pane_from_glass_pane\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=815,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=106,[2]=106,[3]=106,[4]=106,[5]=425,[6]=106,[7]=106,[8]=106,[9]=106},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"stained_glass_pane\"},[\"special\"]=false},[\"minecraft:redstone_lamp\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=819,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[2]=243,[4]=243,[5]=483,[6]=243,[8]=243},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:sandstone_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=227,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:sentry_armor_trim_smithing_template\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=829,[\"count\"]=2,[\"ingredients\"]={},[\"grid\"]={[1]=133,[2]=829,[3]=133,[4]=133,[5]=28,[6]=133,[7]=133,[8]=133,[9]=133},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:shulker_box_coloring\"]={[\"kind\"]=\"crafting_special_shulkerboxcoloring\",[\"mode\"]=\"special\",[\"address\"]=\"Crafter\",[\"output\"]=0,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=true},[\"minecraft:smooth_basalt\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=841,[\"count\"]=1,[\"ingredients\"]={{744,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.1,[\"category\"]=\"blocks\"},[\"special\"]=false},[\"minecraft:smooth_red_sandstone_slab_from_smooth_red_sandstone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=846,[\"count\"]=2,[\"ingredients\"]={{845,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:smooth_stone\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=114,[\"count\"]=1,[\"ingredients\"]={{232,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.1,[\"category\"]=\"blocks\"},[\"special\"]=false},[\"minecraft:soul_lantern\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=857,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=184,[2]=184,[3]=184,[4]=184,[5]=858,[6]=184,[7]=184,[8]=184,[9]=184},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:spruce_chest_boat\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=866,[\"count\"]=1,[\"ingredients\"]={{5,1,false},{863,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"chest_boat\"},[\"special\"]=false},[\"minecraft:spruce_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=875,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=864,[2]=864,[3]=864},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"wooden_slab\"},[\"special\"]=false},[\"minecraft:stone\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=232,[\"count\"]=1,[\"ingredients\"]={{28,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.1,[\"category\"]=\"blocks\"},[\"special\"]=false},[\"minecraft:stone_brick_wall\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=885,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=231,[2]=231,[3]=231,[4]=231,[5]=231,[6]=231},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:stone_pressure_plate\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=366,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=232,[2]=232},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:stripped_acacia_wood\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=893,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=12,[2]=12,[4]=12,[5]=12},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"bark\"},[\"special\"]=false},[\"minecraft:stripped_spruce_wood\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=901,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=871,[2]=871,[4]=871,[5]=871},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"bark\"},[\"special\"]=false},[\"minecraft:tide_armor_trim_smithing_template_smithing_trim\"]={[\"kind\"]=\"smithing_trim\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smith\",[\"output\"]=0,[\"count\"]=1,[\"ingredients\"]={{134,1,true},{135,1,true},{905,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=true},[\"minecraft:tuff_brick_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=236,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=238,[2]=238,[3]=238},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:tuff_brick_wall\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=911,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=238,[2]=238,[3]=238,[4]=238,[5]=238,[6]=238},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:tuff_slab_from_tuff_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=234,[\"count\"]=2,[\"ingredients\"]={{239,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:ward_armor_trim_smithing_template\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=917,[\"count\"]=2,[\"ingredients\"]={},[\"grid\"]={[1]=133,[2]=917,[3]=133,[4]=133,[5]=213,[6]=133,[7]=133,[8]=133,[9]=133},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:warped_hyphae\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=926,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=927,[2]=927,[4]=927,[5]=927},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"bark\"},[\"special\"]=false},[\"minecraft:waxed_chiseled_copper_from_honeycomb\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=934,[\"count\"]=1,[\"ingredients\"]={{207,1,false},{69,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_chiseled_copper\"},[\"special\"]=false},[\"minecraft:waxed_copper_grate_from_honeycomb\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=939,[\"count\"]=1,[\"ingredients\"]={{280,1,false},{69,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_copper_grate\"},[\"special\"]=false},[\"minecraft:waxed_cut_copper_slab_from_waxed_copper_block_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=935,[\"count\"]=8,[\"ingredients\"]={{284,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:waxed_exposed_chiseled_copper_from_waxed_exposed_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=942,[\"count\"]=4,[\"ingredients\"]={{944,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:waxed_exposed_copper_grate_from_waxed_exposed_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=949,[\"count\"]=4,[\"ingredients\"]={{944,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:waxed_exposed_cut_copper_slab_from_waxed_exposed_cut_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=943,[\"count\"]=2,[\"ingredients\"]={{945,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:waxed_oxidized_chiseled_copper_from_waxed_oxidized_cut_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=953,[\"count\"]=1,[\"ingredients\"]={{956,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:waxed_oxidized_copper_trapdoor_from_honeycomb\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=961,[\"count\"]=1,[\"ingredients\"]={{962,1,false},{69,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_oxidized_copper_trapdoor\"},[\"special\"]=false},[\"minecraft:waxed_oxidized_cut_copper_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=963,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=956,[4]=956,[5]=956,[7]=956,[8]=956,[9]=956},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_oxidized_cut_copper_stairs\"},[\"special\"]=false},[\"minecraft:waxed_weathered_copper_bulb\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=969,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[2]=967,[4]=967,[5]=116,[6]=967,[8]=243},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:waxed_weathered_cut_copper\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=968,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=967,[2]=967,[4]=967,[5]=967},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_weathered_cut_copper\"},[\"special\"]=false},[\"minecraft:waxed_weathered_cut_copper_stairs_from_honeycomb\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=980,[\"count\"]=1,[\"ingredients\"]={{981,1,false},{69,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_weathered_cut_copper_stairs\"},[\"special\"]=false},[\"minecraft:weathered_copper_bulb\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=970,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[2]=973,[4]=973,[5]=116,[6]=973,[8]=243},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:weathered_cut_copper_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=981,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=978,[4]=978,[5]=978,[7]=978,[8]=978,[9]=978},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:white_concrete_powder\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=985,[\"count\"]=8,[\"ingredients\"]={{429,1,false},{98,1,false},{98,1,false},{98,1,false},{98,1,false},{99,1,false},{99,1,false},{99,1,false},{99,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"concrete_powder\"},[\"special\"]=false},[\"minecraft:white_wool_from_string\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=431,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=144,[2]=144,[4]=144,[5]=144},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:wooden_shovel\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=998,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=-62,[4]=8,[7]=8},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:yellow_dye_from_dandelion\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=433,[\"count\"]=1,[\"ingredients\"]={{1004,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"yellow_dye\"},[\"special\"]=false}},[\"counts\"]={}}",
  ["ceetos/recipes/vanilla-recipes-1.21.1-5.lua"] = "return{[\"schema\"]=1,[\"minecraft\"]=\"1.21.1\",[\"recipes\"]={[\"minecraft:acacia_fence\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=7,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=2,[2]=8,[3]=2,[4]=2,[5]=8,[6]=2},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"wooden_fence\"},[\"special\"]=false},[\"minecraft:acacia_trapdoor\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=18,[\"count\"]=2,[\"ingredients\"]={},[\"grid\"]={[1]=2,[2]=2,[3]=2,[4]=2,[5]=2,[6]=2},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_trapdoor\"},[\"special\"]=false},[\"minecraft:andesite_stairs_from_andesite_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=30,[\"count\"]=1,[\"ingredients\"]={{26,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:baked_potato_from_campfire_cooking\"]={[\"kind\"]=\"campfire_cooking\",[\"mode\"]=\"crafting\",[\"address\"]=\"Campfire\",[\"output\"]=39,[\"count\"]=1,[\"ingredients\"]={{40,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=600,[\"experience\"]=0.35,[\"category\"]=\"food\"},[\"special\"]=false},[\"minecraft:bamboo_hanging_sign\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=50,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=11,[3]=11,[4]=51,[5]=51,[6]=51,[7]=51,[8]=51,[9]=51},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"hanging_sign\"},[\"special\"]=false},[\"minecraft:bamboo_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=53,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=44,[2]=44,[3]=44},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"wooden_slab\"},[\"special\"]=false},[\"minecraft:birch_boat\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=73,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=74,[3]=74,[4]=74,[5]=74,[6]=74},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"boat\"},[\"special\"]=false},[\"minecraft:birch_pressure_plate\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=83,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=74,[2]=74},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_pressure_plate\"},[\"special\"]=false},[\"minecraft:black_candle\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=93,[\"count\"]=1,[\"ingredients\"]={{94,1,false},{95,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"dyed_candle\"},[\"special\"]=false},[\"minecraft:black_stained_glass_pane_from_glass_pane\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=105,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=106,[2]=106,[3]=106,[4]=106,[5]=95,[6]=106,[7]=106,[8]=106,[9]=106},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"stained_glass_pane\"},[\"special\"]=false},[\"minecraft:blast_furnace\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=112,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=22,[2]=22,[3]=22,[4]=22,[5]=113,[6]=22,[7]=114,[8]=114,[9]=114},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:blue_dye_from_cornflower\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=121,[\"count\"]=1,[\"ingredients\"]={{125,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"blue_dye\"},[\"special\"]=false},[\"minecraft:bolt_armor_trim_smithing_template_smithing_trim\"]={[\"kind\"]=\"smithing_trim\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smith\",[\"output\"]=0,[\"count\"]=1,[\"ingredients\"]={{134,1,true},{135,1,true},{132,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=true},[\"minecraft:bowl\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=71,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=-62,[3]=-62,[5]=-62},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:brick_wall\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=154,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=152,[2]=152,[3]=152,[4]=152,[5]=152,[6]=152},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:brown_dye\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=159,[\"count\"]=1,[\"ingredients\"]={{162,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"brown_dye\"},[\"special\"]=false},[\"minecraft:cake\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=170,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=171,[2]=171,[3]=171,[4]=172,[5]=173,[6]=172,[7]=146,[8]=146,[9]=146},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:charcoal\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=185,[\"count\"]=1,[\"ingredients\"]={{186,1,true}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.15,[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:cherry_planks\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=188,[\"count\"]=4,[\"ingredients\"]={{196,1,true}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"planks\"},[\"special\"]=false},[\"minecraft:chest_minecart\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=204,[\"count\"]=1,[\"ingredients\"]={{5,1,false},{205,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:chiseled_nether_bricks_from_nether_bricks_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=214,[\"count\"]=1,[\"ingredients\"]={{216,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:chiseled_sandstone\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=226,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=227,[4]=227},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:chiseled_tuff_bricks_from_tuff_bricks_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=235,[\"count\"]=1,[\"ingredients\"]={{238,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:coal_from_blasting_deepslate_coal_ore\"]={[\"kind\"]=\"blasting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Blast\",[\"output\"]=244,[\"count\"]=1,[\"ingredients\"]={{247,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=100,[\"experience\"]=0.1,[\"category\"]=\"misc\",[\"group\"]=\"coal\"},[\"special\"]=false},[\"minecraft:cobbled_deepslate_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=251,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=213,[4]=213,[5]=213,[7]=213,[8]=213,[9]=213},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:cobblestone_wall\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=255,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=28,[2]=28,[3]=28,[4]=28,[5]=28,[6]=28},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:cooked_beef_from_smoking\"]={[\"kind\"]=\"smoking\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smoke\",[\"output\"]=263,[\"count\"]=1,[\"ingredients\"]={{264,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=100,[\"experience\"]=0.35,[\"category\"]=\"food\"},[\"special\"]=false},[\"minecraft:cooked_mutton_from_campfire_cooking\"]={[\"kind\"]=\"campfire_cooking\",[\"mode\"]=\"crafting\",[\"address\"]=\"Campfire\",[\"output\"]=269,[\"count\"]=1,[\"ingredients\"]={{270,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=600,[\"experience\"]=0.35,[\"category\"]=\"food\"},[\"special\"]=false},[\"minecraft:cooked_salmon\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=275,[\"count\"]=1,[\"ingredients\"]={{276,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.35,[\"category\"]=\"food\"},[\"special\"]=false},[\"minecraft:copper_grate_from_copper_block_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=280,[\"count\"]=4,[\"ingredients\"]={{209,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:copper_ingot_from_waxed_copper_block\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=168,[\"count\"]=9,[\"ingredients\"]={{284,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"copper_ingot\"},[\"special\"]=false},[\"minecraft:crafting_table\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=295,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=-62,[2]=-62,[4]=-62,[5]=-62},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:crimson_planks\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=300,[\"count\"]=4,[\"ingredients\"]={{308,1,true}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"planks\"},[\"special\"]=false},[\"minecraft:cut_copper_from_copper_block_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=210,[\"count\"]=4,[\"ingredients\"]={{209,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:cut_red_sandstone_from_red_sandstone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=317,[\"count\"]=1,[\"ingredients\"]={{225,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:cut_sandstone_slab_from_sandstone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=320,[\"count\"]=2,[\"ingredients\"]={{228,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:cyan_glazed_terracotta\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=330,[\"count\"]=1,[\"ingredients\"]={{331,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.1,[\"category\"]=\"blocks\"},[\"special\"]=false},[\"minecraft:dark_oak_door\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=338,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=335,[2]=335,[4]=335,[5]=335,[7]=335,[8]=335},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_door\"},[\"special\"]=false},[\"minecraft:dark_oak_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=347,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=335,[4]=335,[5]=335,[7]=335,[8]=335,[9]=335},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"wooden_stairs\"},[\"special\"]=false},[\"minecraft:daylight_detector\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=355,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=65,[2]=65,[3]=65,[4]=257,[5]=257,[6]=257,[7]=-63,[8]=-63,[9]=-63},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:deepslate_brick_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=360,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=287,[4]=287,[5]=287,[7]=287,[8]=287,[9]=287},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:deepslate_bricks\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=287,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=359,[2]=359,[4]=359,[5]=359},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:deepslate_tile_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=363,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=289,[4]=289,[5]=289,[7]=289,[8]=289,[9]=289},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:deepslate_tile_wall_from_deepslate_tiles_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=364,[\"count\"]=1,[\"ingredients\"]={{289,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:diamond_axe\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=368,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=133,[2]=133,[4]=133,[5]=8,[8]=8},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:diamond_helmet\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=373,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=133,[2]=133,[3]=133,[4]=133,[6]=133},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:diorite_slab_from_diorite_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=379,[\"count\"]=2,[\"ingredients\"]={{27,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:dried_kelp_from_campfire_cooking\"]={[\"kind\"]=\"campfire_cooking\",[\"mode\"]=\"crafting\",[\"address\"]=\"Campfire\",[\"output\"]=383,[\"count\"]=1,[\"ingredients\"]={{385,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=600,[\"experience\"]=0.1,[\"category\"]=\"food\"},[\"special\"]=false},[\"minecraft:dye_black_carpet\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=96,[\"count\"]=1,[\"ingredients\"]={{95,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"carpet\"},[\"special\"]=false},[\"minecraft:dye_cyan_bed\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=323,[\"count\"]=1,[\"ingredients\"]={{325,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"bed\"},[\"special\"]=false},[\"minecraft:dye_green_wool\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=395,[\"count\"]=1,[\"ingredients\"]={{328,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"wool\"},[\"special\"]=false},[\"minecraft:dye_lime_carpet\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=406,[\"count\"]=1,[\"ingredients\"]={{405,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"carpet\"},[\"special\"]=false},[\"minecraft:dye_pink_bed\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=416,[\"count\"]=1,[\"ingredients\"]={{417,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"bed\"},[\"special\"]=false},[\"minecraft:dye_red_wool\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=427,[\"count\"]=1,[\"ingredients\"]={{425,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"wool\"},[\"special\"]=false},[\"minecraft:emerald_block\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=437,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=436,[2]=436,[3]=436,[4]=436,[5]=436,[6]=436,[7]=436,[8]=436,[9]=436},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:end_stone_brick_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=446,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=447,[2]=447,[3]=447},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:end_stone_brick_wall_from_end_stone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=450,[\"count\"]=1,[\"ingredients\"]={{448,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:exposed_copper_bulb\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=457,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[2]=455,[4]=455,[5]=116,[6]=455,[8]=243},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:exposed_cut_copper_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=459,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=456,[4]=456,[5]=456,[7]=456,[8]=456,[9]=456},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:firework_rocket_simple\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=466,[\"count\"]=3,[\"ingredients\"]={{465,1,false},{140,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:flower_banner_pattern\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=471,[\"count\"]=1,[\"ingredients\"]={{140,1,false},{472,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:glow_item_frame\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=480,[\"count\"]=1,[\"ingredients\"]={{481,1,false},{482,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:gold_ingot_from_nuggets\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=242,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=478,[2]=478,[3]=478,[4]=478,[5]=478,[6]=478,[7]=478,[8]=478,[9]=478},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"gold_ingot\"},[\"special\"]=false},[\"minecraft:golden_apple\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=490,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=242,[2]=242,[3]=242,[4]=242,[5]=491,[6]=242,[7]=242,[8]=242,[9]=242},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:golden_pickaxe\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=499,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=242,[2]=242,[3]=242,[5]=8,[8]=8},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:granite_wall\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=505,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=502,[2]=502,[3]=502,[4]=502,[5]=502,[6]=502},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:gray_glazed_terracotta\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=509,[\"count\"]=1,[\"ingredients\"]={{510,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.1,[\"category\"]=\"blocks\"},[\"special\"]=false},[\"minecraft:green_carpet\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=394,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=395,[2]=395},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"carpet\"},[\"special\"]=false},[\"minecraft:grindstone\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=521,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=8,[2]=522,[3]=8,[4]=-62,[6]=-62},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:host_armor_trim_smithing_template\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=530,[\"count\"]=2,[\"ingredients\"]={},[\"grid\"]={[1]=133,[2]=530,[3]=133,[4]=133,[5]=107,[6]=133,[7]=133,[8]=133,[9]=133},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:iron_helmet\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=536,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=22,[2]=22,[3]=22,[4]=22,[6]=22},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:iron_ingot_from_smelting_iron_ore\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=22,[\"count\"]=1,[\"ingredients\"]={{539,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.7,[\"category\"]=\"misc\",[\"group\"]=\"iron_ingot\"},[\"special\"]=false},[\"minecraft:iron_sword\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=544,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=22,[4]=22,[7]=8},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:jungle_door\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=554,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=551,[2]=551,[4]=551,[5]=551,[7]=551,[8]=551},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_door\"},[\"special\"]=false},[\"minecraft:jungle_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=563,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=551,[4]=551,[5]=551,[7]=551,[8]=551,[9]=551},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"wooden_stairs\"},[\"special\"]=false},[\"minecraft:lapis_lazuli_from_blasting_lapis_ore\"]={[\"kind\"]=\"blasting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Blast\",[\"output\"]=124,[\"count\"]=1,[\"ingredients\"]={{571,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=100,[\"experience\"]=0.2,[\"category\"]=\"misc\",[\"group\"]=\"lapis_lazuli\"},[\"special\"]=false},[\"minecraft:leather_horse_armor\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=578,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=141,[3]=141,[4]=141,[5]=141,[6]=141,[7]=141,[9]=141},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:light_blue_concrete_powder\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=584,[\"count\"]=8,[\"ingredients\"]={{397,1,false},{98,1,false},{98,1,false},{98,1,false},{98,1,false},{99,1,false},{99,1,false},{99,1,false},{99,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"concrete_powder\"},[\"special\"]=false},[\"minecraft:light_gray_banner\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=590,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=403,[2]=403,[3]=403,[4]=403,[5]=403,[6]=403,[8]=8},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"banner\"},[\"special\"]=false},[\"minecraft:light_gray_dye_from_oxeye_daisy\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=401,[\"count\"]=1,[\"ingredients\"]={{472,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"light_gray_dye\"},[\"special\"]=false},[\"minecraft:lightning_rod\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=600,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=168,[4]=168,[7]=168},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:lime_glazed_terracotta\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=605,[\"count\"]=1,[\"ingredients\"]={{606,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.1,[\"category\"]=\"blocks\"},[\"special\"]=false},[\"minecraft:magenta_banner\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=614,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=411,[2]=411,[3]=411,[4]=411,[5]=411,[6]=411,[8]=8},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"banner\"},[\"special\"]=false},[\"minecraft:magenta_dye_from_lilac\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=409,[\"count\"]=2,[\"ingredients\"]={{618,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"magenta_dye\"},[\"special\"]=false},[\"minecraft:magma_cream\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=624,[\"count\"]=1,[\"ingredients\"]={{115,1,false},{573,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:mangrove_planks\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=626,[\"count\"]=4,[\"ingredients\"]={{634,1,true}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"planks\"},[\"special\"]=false},[\"minecraft:map_cloning\"]={[\"kind\"]=\"crafting_special_mapcloning\",[\"mode\"]=\"special\",[\"address\"]=\"Crafter\",[\"output\"]=0,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=true},[\"minecraft:mossy_cobblestone_from_vine\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=649,[\"count\"]=1,[\"ingredients\"]={{28,1,false},{650,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"mossy_cobblestone\"},[\"special\"]=false},[\"minecraft:mossy_stone_brick_slab_from_mossy_stone_brick_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=654,[\"count\"]=2,[\"ingredients\"]={{655,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:mud_brick_slab_from_mud_bricks_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=658,[\"count\"]=2,[\"ingredients\"]={{659,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:music_disc_5\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=668,[\"count\"]=1,[\"ingredients\"]={{669,1,false},{669,1,false},{669,1,false},{669,1,false},{669,1,false},{669,1,false},{669,1,false},{669,1,false},{669,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:nether_brick_wall_from_nether_bricks_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=674,[\"count\"]=1,[\"ingredients\"]={{216,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:netherite_hoe_smithing\"]={[\"kind\"]=\"smithing_transform\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smith\",[\"output\"]=683,[\"count\"]=1,[\"ingredients\"]={{374,1,false},{610,1,false},{678,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:netherite_sword_smithing\"]={[\"kind\"]=\"smithing_transform\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smith\",[\"output\"]=689,[\"count\"]=1,[\"ingredients\"]={{378,1,false},{610,1,false},{678,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:oak_fence_gate\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=697,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=8,[2]=692,[3]=8,[4]=8,[5]=692,[6]=8},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_fence_gate\"},[\"special\"]=false},[\"minecraft:oak_wood\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=706,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=707,[2]=707,[4]=707,[5]=707},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"bark\"},[\"special\"]=false},[\"minecraft:orange_dye_from_red_yellow\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=413,[\"count\"]=2,[\"ingredients\"]={{425,1,false},{433,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"orange_dye\"},[\"special\"]=false},[\"minecraft:oxidized_chiseled_copper_from_oxidized_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=718,[\"count\"]=4,[\"ingredients\"]={{720,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:oxidized_cut_copper_slab_from_oxidized_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=719,[\"count\"]=8,[\"ingredients\"]={{720,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:paper\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=140,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=728,[2]=728,[3]=728},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:pink_dye_from_pink_tulip\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=417,[\"count\"]=1,[\"ingredients\"]={{734,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"pink_dye\"},[\"special\"]=false},[\"minecraft:polished_andesite\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=740,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=26,[2]=26,[4]=26,[5]=26},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:polished_basalt\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=743,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=744,[2]=744,[4]=744,[5]=744},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:polished_blackstone_brick_stairs_from_blackstone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=746,[\"count\"]=1,[\"ingredients\"]={{109,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:polished_blackstone_bricks_from_blackstone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=292,[\"count\"]=1,[\"ingredients\"]={{109,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:polished_blackstone_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=750,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=219,[4]=219,[5]=219,[7]=219,[8]=219,[9]=219},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:polished_deepslate_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=752,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=359,[2]=359,[3]=359},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:polished_deepslate_wall_from_polished_deepslate_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=754,[\"count\"]=1,[\"ingredients\"]={{359,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:polished_diorite_stairs_from_polished_diorite_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=757,[\"count\"]=1,[\"ingredients\"]={{755,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:polished_granite_stairs_from_polished_granite_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=760,[\"count\"]=1,[\"ingredients\"]={{758,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:polished_tuff_stairs_from_tuff_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=762,[\"count\"]=1,[\"ingredients\"]={{239,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:prismarine_brick_slab_from_prismarine_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=767,[\"count\"]=2,[\"ingredients\"]={{768,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:prismarine_wall\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=772,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=766,[2]=766,[3]=766,[4]=766,[5]=766,[6]=766},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:purple_concrete_powder\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=778,[\"count\"]=8,[\"ingredients\"]={{421,1,false},{98,1,false},{98,1,false},{98,1,false},{98,1,false},{99,1,false},{99,1,false},{99,1,false},{99,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"concrete_powder\"},[\"special\"]=false},[\"minecraft:purpur_pillar\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=784,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=785,[4]=785},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:quartz_bricks\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=788,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=222,[2]=222,[4]=222,[5]=222},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:quartz_stairs_from_quartz_block_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=790,[\"count\"]=1,[\"ingredients\"]={{222,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:raw_gold\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=489,[\"count\"]=9,[\"ingredients\"]={{795,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:red_carpet\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=426,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=427,[2]=427},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"carpet\"},[\"special\"]=false},[\"minecraft:red_nether_brick_slab_from_red_nether_bricks_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=807,[\"count\"]=2,[\"ingredients\"]={{808,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:red_sandstone_slab_from_red_sandstone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=224,[\"count\"]=2,[\"ingredients\"]={{225,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:red_terracotta\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=806,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=107,[2]=107,[3]=107,[4]=107,[5]=425,[6]=107,[7]=107,[8]=107,[9]=107},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"stained_terracotta\"},[\"special\"]=false},[\"minecraft:redstone_torch\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=23,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=243,[4]=8},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:sandstone_slab_from_sandstone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=227,[\"count\"]=2,[\"ingredients\"]={{228,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:sentry_armor_trim_smithing_template_smithing_trim\"]={[\"kind\"]=\"smithing_trim\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smith\",[\"output\"]=0,[\"count\"]=1,[\"ingredients\"]={{134,1,true},{135,1,true},{829,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=true},[\"minecraft:silence_armor_trim_smithing_template\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=835,[\"count\"]=2,[\"ingredients\"]={},[\"grid\"]={[1]=133,[2]=835,[3]=133,[4]=133,[5]=213,[6]=133,[7]=133,[8]=133,[9]=133},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:smooth_quartz\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=842,[\"count\"]=1,[\"ingredients\"]={{222,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.1,[\"category\"]=\"blocks\"},[\"special\"]=false},[\"minecraft:smooth_red_sandstone_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=847,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=845,[4]=845,[5]=845,[7]=845,[8]=845,[9]=845},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:smooth_stone_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=35,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=114,[2]=114,[3]=114},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:soul_torch\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=858,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[4]=8,[7]=-856},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:spruce_door\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=867,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=864,[2]=864,[4]=864,[5]=864,[7]=864,[8]=864},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_door\"},[\"special\"]=false},[\"minecraft:spruce_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=876,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=864,[4]=864,[5]=864,[7]=864,[8]=864,[9]=864},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"wooden_stairs\"},[\"special\"]=false},[\"minecraft:stone_axe\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=882,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=-883,[2]=-883,[4]=-883,[5]=8,[8]=8},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:stone_brick_wall_from_stone_bricks_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=885,[\"count\"]=1,[\"ingredients\"]={{231,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:stone_shovel\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=889,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=-883,[4]=8,[7]=8},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:stripped_birch_wood\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=894,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=81,[2]=81,[4]=81,[5]=81},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"bark\"},[\"special\"]=false},[\"minecraft:stripped_warped_hyphae\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=902,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=903,[2]=903,[4]=903,[5]=903},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"bark\"},[\"special\"]=false},[\"minecraft:tinted_glass\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=906,[\"count\"]=2,[\"ingredients\"]={},[\"grid\"]={[2]=25,[4]=25,[5]=65,[6]=25,[8]=25},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:tuff_brick_slab_from_polished_tuff_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=236,[\"count\"]=2,[\"ingredients\"]={{237,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:tuff_brick_wall_from_polished_tuff_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=911,[\"count\"]=1,[\"ingredients\"]={{237,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:tuff_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=912,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=239,[4]=239,[5]=239,[7]=239,[8]=239,[9]=239},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:ward_armor_trim_smithing_template_smithing_trim\"]={[\"kind\"]=\"smithing_trim\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smith\",[\"output\"]=0,[\"count\"]=1,[\"ingredients\"]={{134,1,true},{135,1,true},{917,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=true},[\"minecraft:warped_planks\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=919,[\"count\"]=4,[\"ingredients\"]={{928,1,true}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"planks\"},[\"special\"]=false},[\"minecraft:waxed_chiseled_copper_from_waxed_copper_block_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=934,[\"count\"]=4,[\"ingredients\"]={{284,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:waxed_copper_grate_from_waxed_copper_block_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=939,[\"count\"]=4,[\"ingredients\"]={{284,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:waxed_cut_copper_slab_from_waxed_cut_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=935,[\"count\"]=2,[\"ingredients\"]={{936,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:waxed_exposed_chiseled_copper_from_waxed_exposed_cut_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=942,[\"count\"]=1,[\"ingredients\"]={{945,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:waxed_exposed_copper_trapdoor_from_honeycomb\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=950,[\"count\"]=1,[\"ingredients\"]={{951,1,false},{69,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_exposed_copper_trapdoor\"},[\"special\"]=false},[\"minecraft:waxed_exposed_cut_copper_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=952,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=945,[4]=945,[5]=945,[7]=945,[8]=945,[9]=945},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_exposed_cut_copper_stairs\"},[\"special\"]=false},[\"minecraft:waxed_oxidized_copper_bulb\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=957,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[2]=955,[4]=955,[5]=116,[6]=955,[8]=243},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:waxed_oxidized_cut_copper\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=956,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=955,[2]=955,[4]=955,[5]=955},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_oxidized_cut_copper\"},[\"special\"]=false},[\"minecraft:waxed_oxidized_cut_copper_stairs_from_honeycomb\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=963,[\"count\"]=1,[\"ingredients\"]={{724,1,false},{69,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_oxidized_cut_copper_stairs\"},[\"special\"]=false},[\"minecraft:waxed_weathered_copper_bulb_from_honeycomb\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=969,[\"count\"]=1,[\"ingredients\"]={{970,1,false},{69,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_weathered_copper_bulb\"},[\"special\"]=false},[\"minecraft:waxed_weathered_cut_copper_from_honeycomb\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=968,[\"count\"]=1,[\"ingredients\"]={{978,1,false},{69,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_weathered_cut_copper\"},[\"special\"]=false},[\"minecraft:waxed_weathered_cut_copper_stairs_from_waxed_weathered_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=980,[\"count\"]=4,[\"ingredients\"]={{967,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:weathered_copper_grate\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=975,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[2]=973,[4]=973,[6]=973,[8]=973},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:weathered_cut_copper_stairs_from_weathered_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=981,[\"count\"]=4,[\"ingredients\"]={{973,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:white_dye\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=429,[\"count\"]=1,[\"ingredients\"]={{137,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"white_dye\"},[\"special\"]=false},[\"minecraft:wild_armor_trim_smithing_template\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=991,[\"count\"]=2,[\"ingredients\"]={},[\"grid\"]={[1]=133,[2]=991,[3]=133,[4]=133,[5]=649,[6]=133,[7]=133,[8]=133,[9]=133},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:wooden_sword\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=999,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=-62,[4]=-62,[7]=8},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:yellow_dye_from_sunflower\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=433,[\"count\"]=2,[\"ingredients\"]={{1005,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"yellow_dye\"},[\"special\"]=false}},[\"counts\"]={}}",
  ["ceetos/recipes/vanilla-recipes-1.21.1-6.lua"] = "return{[\"schema\"]=1,[\"minecraft\"]=\"1.21.1\",[\"recipes\"]={[\"minecraft:acacia_fence_gate\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=9,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=8,[2]=2,[3]=8,[4]=8,[5]=2,[6]=8},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_fence_gate\"},[\"special\"]=false},[\"minecraft:acacia_wood\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=19,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=20,[2]=20,[4]=20,[5]=20},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"bark\"},[\"special\"]=false},[\"minecraft:andesite_wall\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=31,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=26,[2]=26,[3]=26,[4]=26,[5]=26,[6]=26},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:baked_potato_from_smoking\"]={[\"kind\"]=\"smoking\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smoke\",[\"output\"]=39,[\"count\"]=1,[\"ingredients\"]={{40,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=100,[\"experience\"]=0.35,[\"category\"]=\"food\"},[\"special\"]=false},[\"minecraft:bamboo_mosaic\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=52,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=53,[4]=53},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:bamboo_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=59,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=44,[4]=44,[5]=44,[7]=44,[8]=44,[9]=44},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"wooden_stairs\"},[\"special\"]=false},[\"minecraft:birch_button\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=75,[\"count\"]=1,[\"ingredients\"]={{74,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_button\"},[\"special\"]=false},[\"minecraft:birch_sign\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=84,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=74,[2]=74,[3]=74,[4]=74,[5]=74,[6]=74,[8]=8},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"wooden_sign\"},[\"special\"]=false},[\"minecraft:black_carpet\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=96,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=91,[2]=91},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"carpet\"},[\"special\"]=false},[\"minecraft:black_terracotta\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=103,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=107,[2]=107,[3]=107,[4]=107,[5]=95,[6]=107,[7]=107,[8]=107,[9]=107},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"stained_terracotta\"},[\"special\"]=false},[\"minecraft:blaze_powder\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=115,[\"count\"]=2,[\"ingredients\"]={{116,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:blue_glazed_terracotta\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=126,[\"count\"]=1,[\"ingredients\"]={{127,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.1,[\"category\"]=\"blocks\"},[\"special\"]=false},[\"minecraft:bone_block\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=136,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=137,[2]=137,[3]=137,[4]=137,[5]=137,[6]=137,[7]=137,[8]=137,[9]=137},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:bread\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=145,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=146,[2]=146,[3]=146},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:brick_wall_from_bricks_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=154,[\"count\"]=1,[\"ingredients\"]={{152,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:brown_glazed_terracotta\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=163,[\"count\"]=1,[\"ingredients\"]={{164,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.1,[\"category\"]=\"blocks\"},[\"special\"]=false},[\"minecraft:calibrated_sculk_sensor\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=174,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[2]=25,[4]=25,[5]=175,[6]=25},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:cherry_boat\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=187,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=188,[3]=188,[4]=188,[5]=188,[6]=188},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"boat\"},[\"special\"]=false},[\"minecraft:cherry_pressure_plate\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=197,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=188,[2]=188},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_pressure_plate\"},[\"special\"]=false},[\"minecraft:chiseled_bookshelf\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=206,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=-62,[2]=-62,[3]=-62,[4]=-63,[5]=-63,[6]=-63,[7]=-62,[8]=-62,[9]=-62},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:chiseled_polished_blackstone\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=217,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=218,[4]=218},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:chiseled_sandstone_from_sandstone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=226,[\"count\"]=1,[\"ingredients\"]={{228,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:chiseled_tuff_bricks_from_tuff_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=235,[\"count\"]=1,[\"ingredients\"]={{239,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:coal_from_smelting_coal_ore\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=244,[\"count\"]=1,[\"ingredients\"]={{246,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.1,[\"category\"]=\"misc\",[\"group\"]=\"coal\"},[\"special\"]=false},[\"minecraft:cobbled_deepslate_stairs_from_cobbled_deepslate_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=251,[\"count\"]=1,[\"ingredients\"]={{213,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:cobblestone_wall_from_cobblestone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=255,[\"count\"]=1,[\"ingredients\"]={{28,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:cooked_chicken\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=265,[\"count\"]=1,[\"ingredients\"]={{266,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.35,[\"category\"]=\"food\"},[\"special\"]=false},[\"minecraft:cooked_mutton_from_smoking\"]={[\"kind\"]=\"smoking\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smoke\",[\"output\"]=269,[\"count\"]=1,[\"ingredients\"]={{270,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=100,[\"experience\"]=0.35,[\"category\"]=\"food\"},[\"special\"]=false},[\"minecraft:cooked_salmon_from_campfire_cooking\"]={[\"kind\"]=\"campfire_cooking\",[\"mode\"]=\"crafting\",[\"address\"]=\"Campfire\",[\"output\"]=275,[\"count\"]=1,[\"ingredients\"]={{276,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=600,[\"experience\"]=0.35,[\"category\"]=\"food\"},[\"special\"]=false},[\"minecraft:copper_ingot\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=168,[\"count\"]=9,[\"ingredients\"]={{209,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"copper_ingot\"},[\"special\"]=false},[\"minecraft:copper_trapdoor\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=285,[\"count\"]=2,[\"ingredients\"]={},[\"grid\"]={[1]=168,[2]=168,[3]=168,[4]=168,[5]=168,[6]=168},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:creeper_banner_pattern\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=297,[\"count\"]=1,[\"ingredients\"]={{140,1,false},{298,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:crimson_pressure_plate\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=309,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=300,[2]=300},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_pressure_plate\"},[\"special\"]=false},[\"minecraft:cut_copper_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=208,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=210,[2]=210,[3]=210},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:cut_red_sandstone_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=318,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=317,[2]=317,[3]=317},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:cyan_banner\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=321,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=322,[2]=322,[3]=322,[4]=322,[5]=322,[6]=322,[8]=8},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"banner\"},[\"special\"]=false},[\"minecraft:cyan_stained_glass\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=332,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=65,[2]=65,[3]=65,[4]=65,[5]=325,[6]=65,[7]=65,[8]=65,[9]=65},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"stained_glass\"},[\"special\"]=false},[\"minecraft:dark_oak_fence\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=339,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=335,[2]=8,[3]=335,[4]=335,[5]=8,[6]=335},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"wooden_fence\"},[\"special\"]=false},[\"minecraft:dark_oak_trapdoor\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=348,[\"count\"]=2,[\"ingredients\"]={},[\"grid\"]={[1]=335,[2]=335,[3]=335,[4]=335,[5]=335,[6]=335},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_trapdoor\"},[\"special\"]=false},[\"minecraft:decorated_pot\"]={[\"kind\"]=\"crafting_decorated_pot\",[\"mode\"]=\"special\",[\"address\"]=\"Crafter\",[\"output\"]=0,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=true},[\"minecraft:deepslate_brick_stairs_from_cobbled_deepslate_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=360,[\"count\"]=1,[\"ingredients\"]={{213,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:deepslate_bricks_from_cobbled_deepslate_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=287,[\"count\"]=1,[\"ingredients\"]={{213,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:deepslate_tile_stairs_from_cobbled_deepslate_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=363,[\"count\"]=1,[\"ingredients\"]={{213,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:deepslate_tile_wall_from_polished_deepslate_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=364,[\"count\"]=1,[\"ingredients\"]={{359,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:diamond_block\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=367,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=133,[2]=133,[3]=133,[4]=133,[5]=133,[6]=133,[7]=133,[8]=133,[9]=133},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:diamond_hoe\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=374,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=133,[2]=133,[5]=8,[8]=8},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:diorite_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=380,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=27,[4]=27,[5]=27,[7]=27,[8]=27,[9]=27},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:dried_kelp_from_smelting\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=383,[\"count\"]=1,[\"ingredients\"]={{385,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.1,[\"category\"]=\"food\"},[\"special\"]=false},[\"minecraft:dye_black_wool\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=91,[\"count\"]=1,[\"ingredients\"]={{95,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"wool\"},[\"special\"]=false},[\"minecraft:dye_cyan_carpet\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=326,[\"count\"]=1,[\"ingredients\"]={{325,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"carpet\"},[\"special\"]=false},[\"minecraft:dye_light_blue_bed\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=396,[\"count\"]=1,[\"ingredients\"]={{397,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"bed\"},[\"special\"]=false},[\"minecraft:dye_lime_wool\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=407,[\"count\"]=1,[\"ingredients\"]={{405,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"wool\"},[\"special\"]=false},[\"minecraft:dye_pink_carpet\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=418,[\"count\"]=1,[\"ingredients\"]={{417,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"carpet\"},[\"special\"]=false},[\"minecraft:dye_white_bed\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=428,[\"count\"]=1,[\"ingredients\"]={{429,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"bed\"},[\"special\"]=false},[\"minecraft:emerald_from_blasting_deepslate_emerald_ore\"]={[\"kind\"]=\"blasting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Blast\",[\"output\"]=436,[\"count\"]=1,[\"ingredients\"]={{438,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=100,[\"experience\"]=1,[\"category\"]=\"misc\",[\"group\"]=\"emerald\"},[\"special\"]=false},[\"minecraft:end_stone_brick_slab_from_end_stone_brick_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=446,[\"count\"]=2,[\"ingredients\"]={{447,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:end_stone_bricks\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=447,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=448,[2]=448,[4]=448,[5]=448},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:exposed_copper_grate\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=458,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[2]=455,[4]=455,[6]=455,[8]=455},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:exposed_cut_copper_stairs_from_exposed_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=459,[\"count\"]=4,[\"ingredients\"]={{455,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:firework_star\"]={[\"kind\"]=\"crafting_special_firework_star\",[\"mode\"]=\"special\",[\"address\"]=\"Crafter\",[\"output\"]=0,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=true},[\"minecraft:flower_pot\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=473,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=149,[3]=149,[5]=149},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:glowstone\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=483,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=484,[2]=484,[4]=484,[5]=484},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:gold_ingot_from_smelting_deepslate_gold_ore\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=242,[\"count\"]=1,[\"ingredients\"]={{486,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=1,[\"category\"]=\"misc\",[\"group\"]=\"gold_ingot\"},[\"special\"]=false},[\"minecraft:golden_axe\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=492,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=242,[2]=242,[4]=242,[5]=8,[8]=8},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:golden_shovel\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=500,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=242,[4]=8,[7]=8},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:granite_wall_from_granite_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=505,[\"count\"]=1,[\"ingredients\"]={{502,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:gray_stained_glass\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=511,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=65,[2]=65,[3]=65,[4]=65,[5]=390,[6]=65,[7]=65,[8]=65,[9]=65},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"stained_glass\"},[\"special\"]=false},[\"minecraft:green_concrete_powder\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=515,[\"count\"]=8,[\"ingredients\"]={{328,1,false},{98,1,false},{98,1,false},{98,1,false},{98,1,false},{99,1,false},{99,1,false},{99,1,false},{99,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"concrete_powder\"},[\"special\"]=false},[\"minecraft:hay_block\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=523,[\"count\"]=1,[\"ingredients\"]={{146,1,false},{146,1,false},{146,1,false},{146,1,false},{146,1,false},{146,1,false},{146,1,false},{146,1,false},{146,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:host_armor_trim_smithing_template_smithing_trim\"]={[\"kind\"]=\"smithing_trim\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smith\",[\"output\"]=0,[\"count\"]=1,[\"ingredients\"]={{134,1,true},{135,1,true},{530,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=true},[\"minecraft:iron_hoe\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=537,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=22,[2]=22,[5]=8,[8]=8},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:iron_ingot_from_smelting_raw_iron\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=22,[\"count\"]=1,[\"ingredients\"]={{540,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.7,[\"category\"]=\"misc\",[\"group\"]=\"iron_ingot\"},[\"special\"]=false},[\"minecraft:iron_trapdoor\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=545,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=22,[2]=22,[4]=22,[5]=22},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:jungle_fence\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=555,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=551,[2]=8,[3]=551,[4]=551,[5]=8,[6]=551},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"wooden_fence\"},[\"special\"]=false},[\"minecraft:jungle_trapdoor\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=564,[\"count\"]=2,[\"ingredients\"]={},[\"grid\"]={[1]=551,[2]=551,[3]=551,[4]=551,[5]=551,[6]=551},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_trapdoor\"},[\"special\"]=false},[\"minecraft:lapis_lazuli_from_smelting_deepslate_lapis_ore\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=124,[\"count\"]=1,[\"ingredients\"]={{570,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.2,[\"category\"]=\"misc\",[\"group\"]=\"lapis_lazuli\"},[\"special\"]=false},[\"minecraft:leather_leggings\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=579,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=141,[2]=141,[3]=141,[4]=141,[6]=141,[7]=141,[9]=141},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:light_blue_dye_from_blue_orchid\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=397,[\"count\"]=1,[\"ingredients\"]={{585,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"light_blue_dye\"},[\"special\"]=false},[\"minecraft:light_gray_bed\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=400,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=403,[2]=403,[3]=403,[4]=-62,[5]=-62,[6]=-62},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"bed\"},[\"special\"]=false},[\"minecraft:light_gray_dye_from_white_tulip\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=401,[\"count\"]=1,[\"ingredients\"]={{594,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"light_gray_dye\"},[\"special\"]=false},[\"minecraft:lime_banner\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=601,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=407,[2]=407,[3]=407,[4]=407,[5]=407,[6]=407,[8]=8},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"banner\"},[\"special\"]=false},[\"minecraft:lime_stained_glass\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=607,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=65,[2]=65,[3]=65,[4]=65,[5]=405,[6]=65,[7]=65,[8]=65,[9]=65},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"stained_glass\"},[\"special\"]=false},[\"minecraft:magenta_bed\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=408,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=411,[2]=411,[3]=411,[4]=-62,[5]=-62,[6]=-62},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"bed\"},[\"special\"]=false},[\"minecraft:magenta_dye_from_purple_and_pink\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=409,[\"count\"]=2,[\"ingredients\"]={{421,1,false},{417,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"magenta_dye\"},[\"special\"]=false},[\"minecraft:mangrove_boat\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=625,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=626,[3]=626,[4]=626,[5]=626,[6]=626},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"boat\"},[\"special\"]=false},[\"minecraft:mangrove_pressure_plate\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=635,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=626,[2]=626},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_pressure_plate\"},[\"special\"]=false},[\"minecraft:map_extending\"]={[\"kind\"]=\"crafting_special_mapextending\",[\"mode\"]=\"special\",[\"address\"]=\"Crafter\",[\"output\"]=0,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=true},[\"minecraft:mossy_cobblestone_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=651,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=649,[2]=649,[3]=649},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:mossy_stone_brick_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=656,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=655,[4]=655,[5]=655,[7]=655,[8]=655,[9]=655},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:mud_brick_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=660,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=659,[4]=659,[5]=659,[7]=659,[8]=659,[9]=659},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:nether_brick\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=670,[\"count\"]=1,[\"ingredients\"]={{671,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.1,[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:nether_bricks\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=216,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=670,[2]=670,[4]=670,[5]=670},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:netherite_ingot\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=610,[\"count\"]=1,[\"ingredients\"]={{684,1,false},{684,1,false},{684,1,false},{684,1,false},{242,1,false},{242,1,false},{242,1,false},{242,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"netherite_ingot\"},[\"special\"]=false},[\"minecraft:netherite_upgrade_smithing_template\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=678,[\"count\"]=2,[\"ingredients\"]={},[\"grid\"]={[1]=133,[2]=678,[3]=133,[4]=133,[5]=671,[6]=133,[7]=133,[8]=133,[9]=133},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:oak_hanging_sign\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=698,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=11,[3]=11,[4]=699,[5]=699,[6]=699,[7]=699,[8]=699,[9]=699},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"hanging_sign\"},[\"special\"]=false},[\"minecraft:observer\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=708,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=28,[2]=28,[3]=28,[4]=243,[5]=243,[6]=257,[7]=28,[8]=28,[9]=28},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:orange_dye_from_torchflower\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=413,[\"count\"]=1,[\"ingredients\"]={{713,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"orange_dye\"},[\"special\"]=false},[\"minecraft:oxidized_chiseled_copper_from_oxidized_cut_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=718,[\"count\"]=1,[\"ingredients\"]={{721,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:oxidized_cut_copper_slab_from_oxidized_cut_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=719,[\"count\"]=2,[\"ingredients\"]={{721,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:pink_banner\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=729,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=419,[2]=419,[3]=419,[4]=419,[5]=419,[6]=419,[8]=8},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"banner\"},[\"special\"]=false},[\"minecraft:pink_dye_from_red_white_dye\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=417,[\"count\"]=2,[\"ingredients\"]={{425,1,false},{429,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"pink_dye\"},[\"special\"]=false},[\"minecraft:polished_andesite_from_andesite_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=740,[\"count\"]=1,[\"ingredients\"]={{26,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:polished_basalt_from_basalt_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=743,[\"count\"]=1,[\"ingredients\"]={{744,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:polished_blackstone_brick_stairs_from_polished_blackstone_bricks_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=746,[\"count\"]=1,[\"ingredients\"]={{292,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:polished_blackstone_bricks_from_polished_blackstone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=292,[\"count\"]=1,[\"ingredients\"]={{219,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:polished_blackstone_stairs_from_blackstone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=750,[\"count\"]=1,[\"ingredients\"]={{109,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:polished_deepslate_slab_from_cobbled_deepslate_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=752,[\"count\"]=2,[\"ingredients\"]={{213,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:polished_diorite\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=755,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=27,[2]=27,[4]=27,[5]=27},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:polished_granite\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=758,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=502,[2]=502,[4]=502,[5]=502},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:polished_tuff\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=237,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=239,[2]=239,[4]=239,[5]=239},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:polished_tuff_wall\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=763,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=237,[2]=237,[3]=237,[4]=237,[5]=237,[6]=237},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:prismarine_brick_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=769,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=768,[4]=768,[5]=768,[7]=768,[8]=768,[9]=768},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:prismarine_wall_from_prismarine_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=772,[\"count\"]=1,[\"ingredients\"]={{766,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:purple_dye\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=421,[\"count\"]=2,[\"ingredients\"]={{121,1,false},{425,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:purpur_pillar_from_purpur_block_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=784,[\"count\"]=1,[\"ingredients\"]={{783,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:quartz_bricks_from_quartz_block_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=788,[\"count\"]=1,[\"ingredients\"]={{222,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:rabbit_stew_from_brown_mushroom\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=791,[\"count\"]=1,[\"ingredients\"]={{39,1,false},{273,1,false},{71,1,false},{181,1,false},{463,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"rabbit_stew\"},[\"special\"]=false},[\"minecraft:raw_gold_block\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=795,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=489,[2]=489,[3]=489,[4]=489,[5]=489,[6]=489,[7]=489,[8]=489,[9]=489},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:red_concrete_powder\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=801,[\"count\"]=8,[\"ingredients\"]={{425,1,false},{98,1,false},{98,1,false},{98,1,false},{98,1,false},{99,1,false},{99,1,false},{99,1,false},{99,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"concrete_powder\"},[\"special\"]=false},[\"minecraft:red_nether_brick_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=809,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=808,[4]=808,[5]=808,[7]=808,[8]=808,[9]=808},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:red_sandstone_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=812,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:redstone\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=243,[\"count\"]=9,[\"ingredients\"]={{816,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:repair_item\"]={[\"kind\"]=\"crafting_special_repairitem\",[\"mode\"]=\"special\",[\"address\"]=\"Crafter\",[\"output\"]=0,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=true},[\"minecraft:sandstone_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=824,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:shaper_armor_trim_smithing_template\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=830,[\"count\"]=2,[\"ingredients\"]={},[\"grid\"]={[1]=133,[2]=830,[3]=133,[4]=133,[5]=107,[6]=133,[7]=133,[8]=133,[9]=133},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:silence_armor_trim_smithing_template_smithing_trim\"]={[\"kind\"]=\"smithing_trim\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smith\",[\"output\"]=0,[\"count\"]=1,[\"ingredients\"]={{134,1,true},{135,1,true},{835,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=true},[\"minecraft:smooth_quartz_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=843,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=842,[2]=842,[3]=842},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:smooth_red_sandstone_stairs_from_smooth_red_sandstone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=847,[\"count\"]=1,[\"ingredients\"]={{845,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:smooth_stone_slab_from_smooth_stone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=35,[\"count\"]=2,[\"ingredients\"]={{114,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:spectral_arrow\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=859,[\"count\"]=2,[\"ingredients\"]={},[\"grid\"]={[2]=484,[4]=484,[5]=36,[6]=484,[8]=484},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:spruce_fence\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=868,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=864,[2]=8,[3]=864,[4]=864,[5]=8,[6]=864},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"wooden_fence\"},[\"special\"]=false},[\"minecraft:spruce_trapdoor\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=877,[\"count\"]=2,[\"ingredients\"]={},[\"grid\"]={[1]=864,[2]=864,[3]=864,[4]=864,[5]=864,[6]=864},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_trapdoor\"},[\"special\"]=false},[\"minecraft:stone_brick_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=230,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=231,[2]=231,[3]=231},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:stone_brick_walls_from_stone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=885,[\"count\"]=1,[\"ingredients\"]={{232,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:stone_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=522,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=232,[2]=232,[3]=232},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:stripped_cherry_wood\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=895,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=195,[2]=195,[4]=195,[5]=195},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"bark\"},[\"special\"]=false},[\"minecraft:sugar_from_honey_bottle\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=172,[\"count\"]=3,[\"ingredients\"]={{526,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"sugar\"},[\"special\"]=false},[\"minecraft:tipped_arrow\"]={[\"kind\"]=\"crafting_special_tippedarrow\",[\"mode\"]=\"special\",[\"address\"]=\"Crafter\",[\"output\"]=0,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=true},[\"minecraft:tuff_brick_slab_from_tuff_bricks_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=236,[\"count\"]=2,[\"ingredients\"]={{238,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:tuff_brick_wall_from_tuff_bricks_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=911,[\"count\"]=1,[\"ingredients\"]={{238,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:tuff_stairs_from_tuff_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=912,[\"count\"]=1,[\"ingredients\"]={{239,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:warped_button\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=918,[\"count\"]=1,[\"ingredients\"]={{919,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_button\"},[\"special\"]=false},[\"minecraft:warped_pressure_plate\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=929,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=919,[2]=919},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_pressure_plate\"},[\"special\"]=false},[\"minecraft:waxed_chiseled_copper_from_waxed_cut_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=934,[\"count\"]=1,[\"ingredients\"]={{936,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:waxed_copper_trapdoor_from_honeycomb\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=940,[\"count\"]=1,[\"ingredients\"]={{285,1,false},{69,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_copper_trapdoor\"},[\"special\"]=false},[\"minecraft:waxed_cut_copper_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=941,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=936,[4]=936,[5]=936,[7]=936,[8]=936,[9]=936},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_cut_copper_stairs\"},[\"special\"]=false},[\"minecraft:waxed_exposed_copper_bulb\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=946,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[2]=944,[4]=944,[5]=116,[6]=944,[8]=243},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:waxed_exposed_cut_copper\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=945,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=944,[2]=944,[4]=944,[5]=944},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_exposed_cut_copper\"},[\"special\"]=false},[\"minecraft:waxed_exposed_cut_copper_stairs_from_honeycomb\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=952,[\"count\"]=1,[\"ingredients\"]={{459,1,false},{69,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_exposed_cut_copper_stairs\"},[\"special\"]=false},[\"minecraft:waxed_oxidized_copper_bulb_from_honeycomb\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=957,[\"count\"]=1,[\"ingredients\"]={{722,1,false},{69,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_oxidized_copper_bulb\"},[\"special\"]=false},[\"minecraft:waxed_oxidized_cut_copper_from_honeycomb\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=956,[\"count\"]=1,[\"ingredients\"]={{721,1,false},{69,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_oxidized_cut_copper\"},[\"special\"]=false},[\"minecraft:waxed_oxidized_cut_copper_stairs_from_waxed_oxidized_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=963,[\"count\"]=4,[\"ingredients\"]={{955,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:waxed_weathered_copper_door_from_honeycomb\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=971,[\"count\"]=1,[\"ingredients\"]={{972,1,false},{69,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_weathered_copper_door\"},[\"special\"]=false},[\"minecraft:waxed_weathered_cut_copper_from_waxed_weathered_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=968,[\"count\"]=4,[\"ingredients\"]={{967,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:waxed_weathered_cut_copper_stairs_from_waxed_weathered_cut_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=980,[\"count\"]=1,[\"ingredients\"]={{968,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:weathered_copper_grate_from_weathered_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=975,[\"count\"]=4,[\"ingredients\"]={{973,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:weathered_cut_copper_stairs_from_weathered_cut_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=981,[\"count\"]=1,[\"ingredients\"]={{978,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:white_dye_from_lily_of_the_valley\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=429,[\"count\"]=1,[\"ingredients\"]={{986,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"white_dye\"},[\"special\"]=false},[\"minecraft:wild_armor_trim_smithing_template_smithing_trim\"]={[\"kind\"]=\"smithing_trim\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smith\",[\"output\"]=0,[\"count\"]=1,[\"ingredients\"]={{134,1,true},{135,1,true},{991,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=true},[\"minecraft:writable_book\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=1000,[\"count\"]=1,[\"ingredients\"]={{139,1,false},{100,1,false},{38,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:yellow_glazed_terracotta\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=1006,[\"count\"]=1,[\"ingredients\"]={{1007,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.1,[\"category\"]=\"blocks\"},[\"special\"]=false}},[\"counts\"]={}}",
  ["ceetos/recipes/vanilla-recipes-1.21.1-7.lua"] = "return{[\"schema\"]=1,[\"minecraft\"]=\"1.21.1\",[\"recipes\"]={[\"minecraft:acacia_hanging_sign\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=10,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=11,[3]=11,[4]=12,[5]=12,[6]=12,[7]=12,[8]=12,[9]=12},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"hanging_sign\"},[\"special\"]=false},[\"minecraft:activator_rail\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=21,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=22,[2]=8,[3]=22,[4]=22,[5]=23,[6]=22,[7]=22,[8]=8,[9]=22},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:andesite_wall_from_andesite_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=31,[\"count\"]=1,[\"ingredients\"]={{26,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:bamboo_block\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=41,[\"count\"]=1,[\"ingredients\"]={{42,1,false},{42,1,false},{42,1,false},{42,1,false},{42,1,false},{42,1,false},{42,1,false},{42,1,false},{42,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:bamboo_mosaic_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=54,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=52,[2]=52,[3]=52},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:bamboo_trapdoor\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=60,[\"count\"]=2,[\"ingredients\"]={},[\"grid\"]={[1]=44,[2]=44,[3]=44,[4]=44,[5]=44,[6]=44},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_trapdoor\"},[\"special\"]=false},[\"minecraft:birch_chest_boat\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=76,[\"count\"]=1,[\"ingredients\"]={{5,1,false},{73,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"chest_boat\"},[\"special\"]=false},[\"minecraft:birch_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=85,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=74,[2]=74,[3]=74},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"wooden_slab\"},[\"special\"]=false},[\"minecraft:black_concrete_powder\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=97,[\"count\"]=8,[\"ingredients\"]={{95,1,false},{98,1,false},{98,1,false},{98,1,false},{98,1,false},{99,1,false},{99,1,false},{99,1,false},{99,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"concrete_powder\"},[\"special\"]=false},[\"minecraft:blackstone_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=108,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=109,[2]=109,[3]=109},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:blue_banner\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=117,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=118,[2]=118,[3]=118,[4]=118,[5]=118,[6]=118,[8]=8},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"banner\"},[\"special\"]=false},[\"minecraft:blue_ice\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=128,[\"count\"]=1,[\"ingredients\"]={{129,1,false},{129,1,false},{129,1,false},{129,1,false},{129,1,false},{129,1,false},{129,1,false},{129,1,false},{129,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:bone_meal\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=137,[\"count\"]=3,[\"ingredients\"]={{138,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"bonemeal\"},[\"special\"]=false},[\"minecraft:brewing_stand\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=147,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[2]=116,[4]=-148,[5]=-148,[6]=-148},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:bricks\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=152,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=149,[2]=149,[4]=149,[5]=149},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:brown_stained_glass\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=165,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=65,[2]=65,[3]=65,[4]=65,[5]=159,[6]=65,[7]=65,[8]=65,[9]=65},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"stained_glass\"},[\"special\"]=false},[\"minecraft:campfire\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=176,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[2]=8,[4]=8,[5]=-177,[6]=8,[7]=-178,[8]=-178,[9]=-178},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:cherry_button\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=189,[\"count\"]=1,[\"ingredients\"]={{188,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_button\"},[\"special\"]=false},[\"minecraft:cherry_sign\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=198,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=188,[2]=188,[3]=188,[4]=188,[5]=188,[6]=188,[8]=8},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"wooden_sign\"},[\"special\"]=false},[\"minecraft:chiseled_copper\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=207,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=208,[4]=208},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:chiseled_polished_blackstone_from_blackstone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=217,[\"count\"]=1,[\"ingredients\"]={{109,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:chiseled_stone_bricks\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=229,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=230,[4]=230},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:chiseled_tuff_from_tuff_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=233,[\"count\"]=1,[\"ingredients\"]={{239,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:coal_from_smelting_deepslate_coal_ore\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=244,[\"count\"]=1,[\"ingredients\"]={{247,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.1,[\"category\"]=\"misc\",[\"group\"]=\"coal\"},[\"special\"]=false},[\"minecraft:cobbled_deepslate_wall\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=252,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=213,[2]=213,[3]=213,[4]=213,[5]=213,[6]=213},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:comparator\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=256,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[2]=23,[4]=23,[5]=257,[6]=23,[7]=232,[8]=232,[9]=232},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:cooked_chicken_from_campfire_cooking\"]={[\"kind\"]=\"campfire_cooking\",[\"mode\"]=\"crafting\",[\"address\"]=\"Campfire\",[\"output\"]=265,[\"count\"]=1,[\"ingredients\"]={{266,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=600,[\"experience\"]=0.35,[\"category\"]=\"food\"},[\"special\"]=false},[\"minecraft:cooked_porkchop\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=271,[\"count\"]=1,[\"ingredients\"]={{272,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.35,[\"category\"]=\"food\"},[\"special\"]=false},[\"minecraft:cooked_salmon_from_smoking\"]={[\"kind\"]=\"smoking\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smoke\",[\"output\"]=275,[\"count\"]=1,[\"ingredients\"]={{276,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=100,[\"experience\"]=0.35,[\"category\"]=\"food\"},[\"special\"]=false},[\"minecraft:copper_ingot_from_blasting_copper_ore\"]={[\"kind\"]=\"blasting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Blast\",[\"output\"]=168,[\"count\"]=1,[\"ingredients\"]={{281,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=100,[\"experience\"]=0.7,[\"category\"]=\"misc\",[\"group\"]=\"copper_ingot\"},[\"special\"]=false},[\"minecraft:cracked_deepslate_bricks\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=286,[\"count\"]=1,[\"ingredients\"]={{287,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.1,[\"category\"]=\"blocks\"},[\"special\"]=false},[\"minecraft:crimson_button\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=299,[\"count\"]=1,[\"ingredients\"]={{300,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_button\"},[\"special\"]=false},[\"minecraft:crimson_sign\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=310,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=300,[2]=300,[3]=300,[4]=300,[5]=300,[6]=300,[8]=8},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"wooden_sign\"},[\"special\"]=false},[\"minecraft:cut_copper_slab_from_copper_block_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=208,[\"count\"]=8,[\"ingredients\"]={{209,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:cut_red_sandstone_slab_from_cut_red_sandstone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=318,[\"count\"]=2,[\"ingredients\"]={{317,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:cyan_bed\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=323,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=322,[2]=322,[3]=322,[4]=-62,[5]=-62,[6]=-62},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"bed\"},[\"special\"]=false},[\"minecraft:cyan_stained_glass_pane\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=333,[\"count\"]=16,[\"ingredients\"]={},[\"grid\"]={[1]=332,[2]=332,[3]=332,[4]=332,[5]=332,[6]=332},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"stained_glass_pane\"},[\"special\"]=false},[\"minecraft:dark_oak_fence_gate\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=340,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=8,[2]=335,[3]=8,[4]=8,[5]=335,[6]=8},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_fence_gate\"},[\"special\"]=false},[\"minecraft:dark_oak_wood\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=349,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=350,[2]=350,[4]=350,[5]=350},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"bark\"},[\"special\"]=false},[\"minecraft:decorated_pot_simple\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=356,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[2]=149,[4]=149,[6]=149,[8]=149},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:deepslate_brick_stairs_from_deepslate_bricks_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=360,[\"count\"]=1,[\"ingredients\"]={{287,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:deepslate_bricks_from_polished_deepslate_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=287,[\"count\"]=1,[\"ingredients\"]={{359,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:deepslate_tile_stairs_from_deepslate_bricks_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=363,[\"count\"]=1,[\"ingredients\"]={{287,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:deepslate_tiles\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=289,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=287,[2]=287,[4]=287,[5]=287},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:diamond_boots\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=369,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=133,[3]=133,[4]=133,[6]=133},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:diamond_leggings\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=375,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=133,[2]=133,[3]=133,[4]=133,[6]=133,[7]=133,[9]=133},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:diorite_stairs_from_diorite_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=380,[\"count\"]=1,[\"ingredients\"]={{27,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:dried_kelp_from_smoking\"]={[\"kind\"]=\"smoking\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smoke\",[\"output\"]=383,[\"count\"]=1,[\"ingredients\"]={{385,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=100,[\"experience\"]=0.1,[\"category\"]=\"food\"},[\"special\"]=false},[\"minecraft:dye_blue_bed\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=119,[\"count\"]=1,[\"ingredients\"]={{121,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"bed\"},[\"special\"]=false},[\"minecraft:dye_cyan_wool\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=322,[\"count\"]=1,[\"ingredients\"]={{325,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"wool\"},[\"special\"]=false},[\"minecraft:dye_light_blue_carpet\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=398,[\"count\"]=1,[\"ingredients\"]={{397,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"carpet\"},[\"special\"]=false},[\"minecraft:dye_magenta_bed\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=408,[\"count\"]=1,[\"ingredients\"]={{409,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"bed\"},[\"special\"]=false},[\"minecraft:dye_pink_wool\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=419,[\"count\"]=1,[\"ingredients\"]={{417,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"wool\"},[\"special\"]=false},[\"minecraft:dye_white_carpet\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=430,[\"count\"]=1,[\"ingredients\"]={{429,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"carpet\"},[\"special\"]=false},[\"minecraft:emerald_from_blasting_emerald_ore\"]={[\"kind\"]=\"blasting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Blast\",[\"output\"]=436,[\"count\"]=1,[\"ingredients\"]={{439,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=100,[\"experience\"]=1,[\"category\"]=\"misc\",[\"group\"]=\"emerald\"},[\"special\"]=false},[\"minecraft:end_stone_brick_slab_from_end_stone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=446,[\"count\"]=2,[\"ingredients\"]={{448,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:end_stone_bricks_from_end_stone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=447,[\"count\"]=1,[\"ingredients\"]={{448,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:exposed_copper_grate_from_exposed_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=458,[\"count\"]=4,[\"ingredients\"]={{455,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:exposed_cut_copper_stairs_from_exposed_cut_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=459,[\"count\"]=1,[\"ingredients\"]={{456,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:firework_star_fade\"]={[\"kind\"]=\"crafting_special_firework_star_fade\",[\"mode\"]=\"special\",[\"address\"]=\"Crafter\",[\"output\"]=0,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=true},[\"minecraft:furnace\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=113,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=-148,[2]=-148,[3]=-148,[4]=-148,[6]=-148,[7]=-148,[8]=-148,[9]=-148},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:gold_block\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=485,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=242,[2]=242,[3]=242,[4]=242,[5]=242,[6]=242,[7]=242,[8]=242,[9]=242},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:gold_ingot_from_smelting_gold_ore\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=242,[\"count\"]=1,[\"ingredients\"]={{487,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=1,[\"category\"]=\"misc\",[\"group\"]=\"gold_ingot\"},[\"special\"]=false},[\"minecraft:golden_boots\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=493,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=242,[3]=242,[4]=242,[6]=242},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:golden_sword\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=501,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=242,[4]=242,[7]=8},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:gray_banner\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=506,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=392,[2]=392,[3]=392,[4]=392,[5]=392,[6]=392,[8]=8},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"banner\"},[\"special\"]=false},[\"minecraft:gray_stained_glass_pane\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=512,[\"count\"]=16,[\"ingredients\"]={},[\"grid\"]={[1]=511,[2]=511,[3]=511,[4]=511,[5]=511,[6]=511},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"stained_glass_pane\"},[\"special\"]=false},[\"minecraft:green_dye\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=328,[\"count\"]=1,[\"ingredients\"]={{516,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=1,[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:heavy_weighted_pressure_plate\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=524,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=22,[2]=22},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:iron_axe\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=531,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=22,[2]=22,[4]=22,[5]=8,[8]=8},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:iron_ingot_from_blasting_deepslate_iron_ore\"]={[\"kind\"]=\"blasting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Blast\",[\"output\"]=22,[\"count\"]=1,[\"ingredients\"]={{538,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=100,[\"experience\"]=0.7,[\"category\"]=\"misc\",[\"group\"]=\"iron_ingot\"},[\"special\"]=false},[\"minecraft:iron_leggings\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=541,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=22,[2]=22,[3]=22,[4]=22,[6]=22,[7]=22,[9]=22},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:item_frame\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=481,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=8,[2]=8,[3]=8,[4]=8,[5]=141,[6]=8,[7]=8,[8]=8,[9]=8},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:jungle_fence_gate\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=556,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=8,[2]=551,[3]=8,[4]=8,[5]=551,[6]=8},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_fence_gate\"},[\"special\"]=false},[\"minecraft:jungle_wood\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=565,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=566,[2]=566,[4]=566,[5]=566},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"bark\"},[\"special\"]=false},[\"minecraft:lapis_lazuli_from_smelting_lapis_ore\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=124,[\"count\"]=1,[\"ingredients\"]={{571,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.2,[\"category\"]=\"misc\",[\"group\"]=\"lapis_lazuli\"},[\"special\"]=false},[\"minecraft:lectern\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=580,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=-63,[2]=-63,[3]=-63,[5]=142,[8]=-63},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:light_blue_dye_from_blue_white_dye\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=397,[\"count\"]=2,[\"ingredients\"]={{121,1,false},{429,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"light_blue_dye\"},[\"special\"]=false},[\"minecraft:light_gray_candle\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=591,[\"count\"]=1,[\"ingredients\"]={{94,1,false},{401,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"dyed_candle\"},[\"special\"]=false},[\"minecraft:light_gray_glazed_terracotta\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=595,[\"count\"]=1,[\"ingredients\"]={{596,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.1,[\"category\"]=\"blocks\"},[\"special\"]=false},[\"minecraft:lime_bed\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=404,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=407,[2]=407,[3]=407,[4]=-62,[5]=-62,[6]=-62},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"bed\"},[\"special\"]=false},[\"minecraft:lime_stained_glass_pane\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=608,[\"count\"]=16,[\"ingredients\"]={},[\"grid\"]={[1]=607,[2]=607,[3]=607,[4]=607,[5]=607,[6]=607},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"stained_glass_pane\"},[\"special\"]=false},[\"minecraft:magenta_candle\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=615,[\"count\"]=1,[\"ingredients\"]={{94,1,false},{409,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"dyed_candle\"},[\"special\"]=false},[\"minecraft:magenta_glazed_terracotta\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=619,[\"count\"]=1,[\"ingredients\"]={{620,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.1,[\"category\"]=\"blocks\"},[\"special\"]=false},[\"minecraft:mangrove_button\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=627,[\"count\"]=1,[\"ingredients\"]={{626,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_button\"},[\"special\"]=false},[\"minecraft:mangrove_sign\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=636,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=626,[2]=626,[3]=626,[4]=626,[5]=626,[6]=626,[8]=8},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"wooden_sign\"},[\"special\"]=false},[\"minecraft:melon\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=643,[\"count\"]=1,[\"ingredients\"]={{479,1,false},{479,1,false},{479,1,false},{479,1,false},{479,1,false},{479,1,false},{479,1,false},{479,1,false},{479,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:mossy_cobblestone_slab_from_mossy_cobblestone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=651,[\"count\"]=2,[\"ingredients\"]={{649,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:mossy_stone_brick_stairs_from_mossy_stone_brick_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=656,[\"count\"]=1,[\"ingredients\"]={{655,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:mud_brick_stairs_from_mud_bricks_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=660,[\"count\"]=1,[\"ingredients\"]={{659,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:nether_brick_fence\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=672,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=216,[2]=670,[3]=216,[4]=216,[5]=670,[6]=216},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:nether_wart_block\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=675,[\"count\"]=1,[\"ingredients\"]={{676,1,false},{676,1,false},{676,1,false},{676,1,false},{676,1,false},{676,1,false},{676,1,false},{676,1,false},{676,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:netherite_ingot_from_netherite_block\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=610,[\"count\"]=9,[\"ingredients\"]={{679,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"netherite_ingot\"},[\"special\"]=false},[\"minecraft:note_block\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=690,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=-62,[2]=-62,[3]=-62,[4]=-62,[5]=243,[6]=-62,[7]=-62,[8]=-62,[9]=-62},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:oak_planks\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=692,[\"count\"]=4,[\"ingredients\"]={{700,1,true}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"planks\"},[\"special\"]=false},[\"minecraft:orange_banner\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=709,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=415,[2]=415,[3]=415,[4]=415,[5]=415,[6]=415,[8]=8},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"banner\"},[\"special\"]=false},[\"minecraft:orange_glazed_terracotta\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=714,[\"count\"]=1,[\"ingredients\"]={{715,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.1,[\"category\"]=\"blocks\"},[\"special\"]=false},[\"minecraft:oxidized_copper_bulb\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=722,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[2]=720,[4]=720,[5]=116,[6]=720,[8]=243},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:oxidized_cut_copper_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=724,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=721,[4]=721,[5]=721,[7]=721,[8]=721,[9]=721},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:pink_bed\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=416,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=419,[2]=419,[3]=419,[4]=-62,[5]=-62,[6]=-62},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"bed\"},[\"special\"]=false},[\"minecraft:pink_glazed_terracotta\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=735,[\"count\"]=1,[\"ingredients\"]={{736,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.1,[\"category\"]=\"blocks\"},[\"special\"]=false},[\"minecraft:polished_andesite_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=741,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=740,[2]=740,[3]=740},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:polished_blackstone\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=219,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=109,[2]=109,[4]=109,[5]=109},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:polished_blackstone_brick_stairs_from_polished_blackstone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=746,[\"count\"]=1,[\"ingredients\"]={{219,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:polished_blackstone_button\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=748,[\"count\"]=1,[\"ingredients\"]={{219,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:polished_blackstone_stairs_from_polished_blackstone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=750,[\"count\"]=1,[\"ingredients\"]={{219,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:polished_deepslate_slab_from_polished_deepslate_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=752,[\"count\"]=2,[\"ingredients\"]={{359,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:polished_diorite_from_diorite_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=755,[\"count\"]=1,[\"ingredients\"]={{27,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:polished_granite_from_granite_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=758,[\"count\"]=1,[\"ingredients\"]={{502,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:polished_tuff_from_tuff_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=237,[\"count\"]=1,[\"ingredients\"]={{239,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:polished_tuff_wall_from_polished_tuff_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=763,[\"count\"]=1,[\"ingredients\"]={{237,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:prismarine_brick_stairs_from_prismarine_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=769,[\"count\"]=1,[\"ingredients\"]={{768,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:pumpkin_pie\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=773,[\"count\"]=1,[\"ingredients\"]={{774,1,false},{172,1,false},{173,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:purple_glazed_terracotta\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=779,[\"count\"]=1,[\"ingredients\"]={{780,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.1,[\"category\"]=\"blocks\"},[\"special\"]=false},[\"minecraft:purpur_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=785,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:quartz_from_blasting\"]={[\"kind\"]=\"blasting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Blast\",[\"output\"]=257,[\"count\"]=1,[\"ingredients\"]={{787,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=100,[\"experience\"]=0.2,[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:rabbit_stew_from_red_mushroom\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=791,[\"count\"]=1,[\"ingredients\"]={{39,1,false},{273,1,false},{71,1,false},{181,1,false},{667,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"rabbit_stew\"},[\"special\"]=false},[\"minecraft:raw_iron\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=540,[\"count\"]=9,[\"ingredients\"]={{796,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:red_dye_from_beetroot\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=425,[\"count\"]=1,[\"ingredients\"]={{72,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"red_dye\"},[\"special\"]=false},[\"minecraft:red_nether_brick_stairs_from_red_nether_bricks_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=809,[\"count\"]=1,[\"ingredients\"]={{808,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:red_sandstone_stairs_from_red_sandstone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=812,[\"count\"]=1,[\"ingredients\"]={{225,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:redstone_block\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=816,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=243,[2]=243,[3]=243,[4]=243,[5]=243,[6]=243,[7]=243,[8]=243,[9]=243},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:repeater\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=820,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=23,[2]=243,[3]=23,[4]=232,[5]=232,[6]=232},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:sandstone_stairs_from_sandstone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=824,[\"count\"]=1,[\"ingredients\"]={{228,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:shaper_armor_trim_smithing_template_smithing_trim\"]={[\"kind\"]=\"smithing_trim\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smith\",[\"output\"]=0,[\"count\"]=1,[\"ingredients\"]={{134,1,true},{135,1,true},{830,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=true},[\"minecraft:skull_banner_pattern\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=836,[\"count\"]=1,[\"ingredients\"]={{140,1,false},{837,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:smooth_quartz_slab_from_smooth_quartz_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=843,[\"count\"]=2,[\"ingredients\"]={{842,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:smooth_sandstone\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=848,[\"count\"]=1,[\"ingredients\"]={{228,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.1,[\"category\"]=\"blocks\"},[\"special\"]=false},[\"minecraft:snout_armor_trim_smithing_template\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=851,[\"count\"]=2,[\"ingredients\"]={},[\"grid\"]={[1]=133,[2]=851,[3]=133,[4]=133,[5]=109,[6]=133,[7]=133,[8]=133,[9]=133},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:spire_armor_trim_smithing_template\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=860,[\"count\"]=2,[\"ingredients\"]={},[\"grid\"]={[1]=133,[2]=860,[3]=133,[4]=133,[5]=783,[6]=133,[7]=133,[8]=133,[9]=133},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:spruce_fence_gate\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=869,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=8,[2]=864,[3]=8,[4]=8,[5]=864,[6]=8},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_fence_gate\"},[\"special\"]=false},[\"minecraft:spruce_wood\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=878,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=879,[2]=879,[4]=879,[5]=879},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"bark\"},[\"special\"]=false},[\"minecraft:stone_brick_slab_from_stone_bricks_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=230,[\"count\"]=2,[\"ingredients\"]={{231,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:stone_bricks\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=231,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=232,[2]=232,[4]=232,[5]=232},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:stone_slab_from_stone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=522,[\"count\"]=2,[\"ingredients\"]={{232,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:stripped_crimson_hyphae\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=896,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=305,[2]=305,[4]=305,[5]=305},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"bark\"},[\"special\"]=false},[\"minecraft:sugar_from_sugar_cane\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=172,[\"count\"]=1,[\"ingredients\"]={{728,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"sugar\"},[\"special\"]=false},[\"minecraft:tnt\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=907,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=465,[3]=465,[5]=465,[7]=465,[9]=465},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:tuff_brick_slab_from_tuff_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=236,[\"count\"]=2,[\"ingredients\"]={{239,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:tuff_brick_wall_from_tuff_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=911,[\"count\"]=1,[\"ingredients\"]={{239,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:tuff_wall\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=913,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=239,[2]=239,[3]=239,[4]=239,[5]=239,[6]=239},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:warped_door\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=920,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=919,[2]=919,[4]=919,[5]=919,[7]=919,[8]=919},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_door\"},[\"special\"]=false},[\"minecraft:warped_sign\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=930,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=919,[2]=919,[3]=919,[4]=919,[5]=919,[6]=919,[8]=8},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"wooden_sign\"},[\"special\"]=false},[\"minecraft:waxed_copper_block_from_honeycomb\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=284,[\"count\"]=1,[\"ingredients\"]={{209,1,false},{69,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_copper_block\"},[\"special\"]=false},[\"minecraft:waxed_cut_copper\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=936,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=284,[2]=284,[4]=284,[5]=284},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_cut_copper\"},[\"special\"]=false},[\"minecraft:waxed_cut_copper_stairs_from_honeycomb\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=941,[\"count\"]=1,[\"ingredients\"]={{316,1,false},{69,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_cut_copper_stairs\"},[\"special\"]=false},[\"minecraft:waxed_exposed_copper_bulb_from_honeycomb\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=946,[\"count\"]=1,[\"ingredients\"]={{457,1,false},{69,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_exposed_copper_bulb\"},[\"special\"]=false},[\"minecraft:waxed_exposed_cut_copper_from_honeycomb\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=945,[\"count\"]=1,[\"ingredients\"]={{456,1,false},{69,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_exposed_cut_copper\"},[\"special\"]=false},[\"minecraft:waxed_exposed_cut_copper_stairs_from_waxed_exposed_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=952,[\"count\"]=4,[\"ingredients\"]={{944,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:waxed_oxidized_copper_door_from_honeycomb\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=958,[\"count\"]=1,[\"ingredients\"]={{959,1,false},{69,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_oxidized_copper_door\"},[\"special\"]=false},[\"minecraft:waxed_oxidized_cut_copper_from_waxed_oxidized_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=956,[\"count\"]=4,[\"ingredients\"]={{955,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:waxed_oxidized_cut_copper_stairs_from_waxed_oxidized_cut_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=963,[\"count\"]=1,[\"ingredients\"]={{956,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:waxed_weathered_copper_from_honeycomb\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=967,[\"count\"]=1,[\"ingredients\"]={{973,1,false},{69,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_weathered_copper\"},[\"special\"]=false},[\"minecraft:waxed_weathered_cut_copper_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=965,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=968,[2]=968,[3]=968},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_weathered_cut_copper_slab\"},[\"special\"]=false},[\"minecraft:wayfinder_armor_trim_smithing_template\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=982,[\"count\"]=2,[\"ingredients\"]={},[\"grid\"]={[1]=133,[2]=982,[3]=133,[4]=133,[5]=107,[6]=133,[7]=133,[8]=133,[9]=133},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:weathered_cut_copper\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=978,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=973,[2]=973,[4]=973,[5]=973},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:wheat\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=146,[\"count\"]=9,[\"ingredients\"]={{523,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:white_glazed_terracotta\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=987,[\"count\"]=1,[\"ingredients\"]={{988,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.1,[\"category\"]=\"blocks\"},[\"special\"]=false},[\"minecraft:wind_charge\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=992,[\"count\"]=4,[\"ingredients\"]={{470,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:yellow_banner\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=1001,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=435,[2]=435,[3]=435,[4]=435,[5]=435,[6]=435,[8]=8},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"banner\"},[\"special\"]=false},[\"minecraft:yellow_stained_glass\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=1008,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=65,[2]=65,[3]=65,[4]=65,[5]=433,[6]=65,[7]=65,[8]=65,[9]=65},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"stained_glass\"},[\"special\"]=false}},[\"counts\"]={}}",
  ["ceetos/recipes/vanilla-recipes-1.21.1-8.lua"] = "return{[\"schema\"]=1,[\"minecraft\"]=\"1.21.1\",[\"recipes\"]={[\"minecraft:acacia_planks\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=2,[\"count\"]=4,[\"ingredients\"]={{13,1,true}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"planks\"},[\"special\"]=false},[\"minecraft:amethyst_block\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=24,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=25,[2]=25,[4]=25,[5]=25},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:anvil\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=32,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=33,[2]=33,[3]=33,[5]=22,[7]=22,[8]=22,[9]=22},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:bamboo_button\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=43,[\"count\"]=1,[\"ingredients\"]={{44,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_button\"},[\"special\"]=false},[\"minecraft:bamboo_mosaic_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=55,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=52,[4]=52,[5]=52,[7]=52,[8]=52,[9]=52},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:banner_duplicate\"]={[\"kind\"]=\"crafting_special_bannerduplicate\",[\"mode\"]=\"special\",[\"address\"]=\"Crafter\",[\"output\"]=0,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=true},[\"minecraft:birch_door\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=77,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=74,[2]=74,[4]=74,[5]=74,[7]=74,[8]=74},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_door\"},[\"special\"]=false},[\"minecraft:birch_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=86,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=74,[4]=74,[5]=74,[7]=74,[8]=74,[9]=74},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"wooden_stairs\"},[\"special\"]=false},[\"minecraft:black_dye\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=95,[\"count\"]=1,[\"ingredients\"]={{100,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"black_dye\"},[\"special\"]=false},[\"minecraft:blackstone_slab_from_blackstone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=108,[\"count\"]=2,[\"ingredients\"]={{109,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:blue_bed\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=119,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=118,[2]=118,[3]=118,[4]=-62,[5]=-62,[6]=-62},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"bed\"},[\"special\"]=false},[\"minecraft:blue_stained_glass\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=130,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=65,[2]=65,[3]=65,[4]=65,[5]=121,[6]=65,[7]=65,[8]=65,[9]=65},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"stained_glass\"},[\"special\"]=false},[\"minecraft:bone_meal_from_bone_block\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=137,[\"count\"]=9,[\"ingredients\"]={{136,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"bonemeal\"},[\"special\"]=false},[\"minecraft:brick\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=149,[\"count\"]=1,[\"ingredients\"]={{150,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.3,[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:brown_banner\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=155,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=156,[2]=156,[3]=156,[4]=156,[5]=156,[6]=156,[8]=8},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"banner\"},[\"special\"]=false},[\"minecraft:brown_stained_glass_pane\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=166,[\"count\"]=16,[\"ingredients\"]={},[\"grid\"]={[1]=165,[2]=165,[3]=165,[4]=165,[5]=165,[6]=165},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"stained_glass_pane\"},[\"special\"]=false},[\"minecraft:candle\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=94,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=144,[4]=69},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:cherry_chest_boat\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=190,[\"count\"]=1,[\"ingredients\"]={{5,1,false},{187,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"chest_boat\"},[\"special\"]=false},[\"minecraft:cherry_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=199,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=188,[2]=188,[3]=188},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"wooden_slab\"},[\"special\"]=false},[\"minecraft:chiseled_copper_from_copper_block_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=207,[\"count\"]=4,[\"ingredients\"]={{209,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:chiseled_polished_blackstone_from_polished_blackstone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=217,[\"count\"]=1,[\"ingredients\"]={{219,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:chiseled_stone_bricks_from_stone_bricks_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=229,[\"count\"]=1,[\"ingredients\"]={{231,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:clay\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=240,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=150,[2]=150,[4]=150,[5]=150},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:coarse_dirt\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=248,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=249,[2]=99,[4]=99,[5]=249},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:cobbled_deepslate_wall_from_cobbled_deepslate_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=252,[\"count\"]=1,[\"ingredients\"]={{213,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:compass\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=258,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[2]=22,[4]=22,[5]=243,[6]=22,[8]=22},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:cooked_chicken_from_smoking\"]={[\"kind\"]=\"smoking\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smoke\",[\"output\"]=265,[\"count\"]=1,[\"ingredients\"]={{266,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=100,[\"experience\"]=0.35,[\"category\"]=\"food\"},[\"special\"]=false},[\"minecraft:cooked_porkchop_from_campfire_cooking\"]={[\"kind\"]=\"campfire_cooking\",[\"mode\"]=\"crafting\",[\"address\"]=\"Campfire\",[\"output\"]=271,[\"count\"]=1,[\"ingredients\"]={{272,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=600,[\"experience\"]=0.35,[\"category\"]=\"food\"},[\"special\"]=false},[\"minecraft:cookie\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=277,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=146,[2]=162,[3]=146},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:copper_ingot_from_blasting_deepslate_copper_ore\"]={[\"kind\"]=\"blasting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Blast\",[\"output\"]=168,[\"count\"]=1,[\"ingredients\"]={{282,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=100,[\"experience\"]=0.7,[\"category\"]=\"misc\",[\"group\"]=\"copper_ingot\"},[\"special\"]=false},[\"minecraft:cracked_deepslate_tiles\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=288,[\"count\"]=1,[\"ingredients\"]={{289,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.1,[\"category\"]=\"blocks\"},[\"special\"]=false},[\"minecraft:crimson_door\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=301,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=300,[2]=300,[4]=300,[5]=300,[7]=300,[8]=300},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_door\"},[\"special\"]=false},[\"minecraft:crimson_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=311,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=300,[2]=300,[3]=300},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"wooden_slab\"},[\"special\"]=false},[\"minecraft:cut_copper_slab_from_cut_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=208,[\"count\"]=2,[\"ingredients\"]={{210,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:cut_red_sandstone_slab_from_red_sandstone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=318,[\"count\"]=2,[\"ingredients\"]={{225,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:cyan_candle\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=324,[\"count\"]=1,[\"ingredients\"]={{94,1,false},{325,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"dyed_candle\"},[\"special\"]=false},[\"minecraft:cyan_stained_glass_pane_from_glass_pane\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=333,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=106,[2]=106,[3]=106,[4]=106,[5]=325,[6]=106,[7]=106,[8]=106,[9]=106},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"stained_glass_pane\"},[\"special\"]=false},[\"minecraft:dark_oak_hanging_sign\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=341,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=11,[3]=11,[4]=342,[5]=342,[6]=342,[7]=342,[8]=342,[9]=342},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"hanging_sign\"},[\"special\"]=false},[\"minecraft:dark_prismarine\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=351,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=352,[2]=352,[3]=352,[4]=352,[5]=95,[6]=352,[7]=352,[8]=352,[9]=352},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:deepslate\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=357,[\"count\"]=1,[\"ingredients\"]={{213,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.1,[\"category\"]=\"blocks\"},[\"special\"]=false},[\"minecraft:deepslate_brick_stairs_from_polished_deepslate_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=360,[\"count\"]=1,[\"ingredients\"]={{359,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:deepslate_tile_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=362,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=289,[2]=289,[3]=289},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:deepslate_tile_stairs_from_deepslate_tiles_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=363,[\"count\"]=1,[\"ingredients\"]={{289,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:deepslate_tiles_from_cobbled_deepslate_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=289,[\"count\"]=1,[\"ingredients\"]={{213,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:diamond_chestplate\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=370,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=133,[3]=133,[4]=133,[5]=133,[6]=133,[7]=133,[8]=133,[9]=133},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:diamond_pickaxe\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=376,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=133,[2]=133,[3]=133,[5]=8,[8]=8},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:diorite_wall\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=381,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=27,[2]=27,[3]=27,[4]=27,[5]=27,[6]=27},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:dripstone_block\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=386,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=387,[2]=387,[4]=387,[5]=387},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:dye_blue_carpet\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=122,[\"count\"]=1,[\"ingredients\"]={{121,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"carpet\"},[\"special\"]=false},[\"minecraft:dye_gray_bed\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=389,[\"count\"]=1,[\"ingredients\"]={{390,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"bed\"},[\"special\"]=false},[\"minecraft:dye_light_blue_wool\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=399,[\"count\"]=1,[\"ingredients\"]={{397,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"wool\"},[\"special\"]=false},[\"minecraft:dye_magenta_carpet\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=410,[\"count\"]=1,[\"ingredients\"]={{409,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"carpet\"},[\"special\"]=false},[\"minecraft:dye_purple_bed\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=420,[\"count\"]=1,[\"ingredients\"]={{421,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"bed\"},[\"special\"]=false},[\"minecraft:dye_white_wool\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=431,[\"count\"]=1,[\"ingredients\"]={{429,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"wool\"},[\"special\"]=false},[\"minecraft:emerald_from_smelting_deepslate_emerald_ore\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=436,[\"count\"]=1,[\"ingredients\"]={{438,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=1,[\"category\"]=\"misc\",[\"group\"]=\"emerald\"},[\"special\"]=false},[\"minecraft:end_stone_brick_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=449,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=447,[4]=447,[5]=447,[7]=447,[8]=447,[9]=447},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:ender_chest\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=451,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=67,[2]=67,[3]=67,[4]=67,[5]=442,[6]=67,[7]=67,[8]=67,[9]=67},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:exposed_cut_copper\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=456,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=455,[2]=455,[4]=455,[5]=455},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:eye_armor_trim_smithing_template\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=460,[\"count\"]=2,[\"ingredients\"]={},[\"grid\"]={[1]=133,[2]=460,[3]=133,[4]=133,[5]=448,[6]=133,[7]=133,[8]=133,[9]=133},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:fishing_rod\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=180,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[3]=8,[5]=8,[6]=144,[7]=8,[9]=144},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:furnace_minecart\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=474,[\"count\"]=1,[\"ingredients\"]={{113,1,false},{205,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:gold_ingot_from_blasting_deepslate_gold_ore\"]={[\"kind\"]=\"blasting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Blast\",[\"output\"]=242,[\"count\"]=1,[\"ingredients\"]={{486,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=100,[\"experience\"]=1,[\"category\"]=\"misc\",[\"group\"]=\"gold_ingot\"},[\"special\"]=false},[\"minecraft:gold_ingot_from_smelting_nether_gold_ore\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=242,[\"count\"]=1,[\"ingredients\"]={{488,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=1,[\"category\"]=\"misc\",[\"group\"]=\"gold_ingot\"},[\"special\"]=false},[\"minecraft:golden_carrot\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=494,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=478,[2]=478,[3]=478,[4]=478,[5]=181,[6]=478,[7]=478,[8]=478,[9]=478},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:granite\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=502,[\"count\"]=1,[\"ingredients\"]={{27,1,false},{257,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:gray_bed\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=389,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=392,[2]=392,[3]=392,[4]=-62,[5]=-62,[6]=-62},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"bed\"},[\"special\"]=false},[\"minecraft:gray_stained_glass_pane_from_glass_pane\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=512,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=106,[2]=106,[3]=106,[4]=106,[5]=390,[6]=106,[7]=106,[8]=106,[9]=106},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"stained_glass_pane\"},[\"special\"]=false},[\"minecraft:green_glazed_terracotta\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=517,[\"count\"]=1,[\"ingredients\"]={{518,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.1,[\"category\"]=\"blocks\"},[\"special\"]=false},[\"minecraft:honey_block\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=525,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=526,[2]=526,[4]=526,[5]=526},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:iron_bars\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=532,[\"count\"]=16,[\"ingredients\"]={},[\"grid\"]={[1]=22,[2]=22,[3]=22,[4]=22,[5]=22,[6]=22},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:iron_ingot_from_blasting_iron_ore\"]={[\"kind\"]=\"blasting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Blast\",[\"output\"]=22,[\"count\"]=1,[\"ingredients\"]={{539,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=100,[\"experience\"]=0.7,[\"category\"]=\"misc\",[\"group\"]=\"iron_ingot\"},[\"special\"]=false},[\"minecraft:iron_nugget\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=184,[\"count\"]=9,[\"ingredients\"]={{22,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:jack_o_lantern\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=546,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=547,[4]=548},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:jungle_hanging_sign\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=557,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=11,[3]=11,[4]=558,[5]=558,[6]=558,[7]=558,[8]=558,[9]=558},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"hanging_sign\"},[\"special\"]=false},[\"minecraft:ladder\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=567,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=8,[3]=8,[4]=8,[5]=8,[6]=8,[7]=8,[9]=8},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:lead\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=572,[\"count\"]=2,[\"ingredients\"]={},[\"grid\"]={[1]=144,[2]=144,[4]=144,[5]=573,[9]=144},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:lever\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=581,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=8,[4]=28},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:light_blue_glazed_terracotta\"]={[\"kind\"]=\"smelting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smelt\",[\"output\"]=586,[\"count\"]=1,[\"ingredients\"]={{587,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=200,[\"experience\"]=0.1,[\"category\"]=\"blocks\"},[\"special\"]=false},[\"minecraft:light_gray_carpet\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=402,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=403,[2]=403},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"carpet\"},[\"special\"]=false},[\"minecraft:light_gray_stained_glass\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=597,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=65,[2]=65,[3]=65,[4]=65,[5]=401,[6]=65,[7]=65,[8]=65,[9]=65},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"stained_glass\"},[\"special\"]=false},[\"minecraft:lime_candle\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=602,[\"count\"]=1,[\"ingredients\"]={{94,1,false},{405,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"dyed_candle\"},[\"special\"]=false},[\"minecraft:lime_stained_glass_pane_from_glass_pane\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=608,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=106,[2]=106,[3]=106,[4]=106,[5]=405,[6]=106,[7]=106,[8]=106,[9]=106},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"stained_glass_pane\"},[\"special\"]=false},[\"minecraft:magenta_carpet\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=410,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=411,[2]=411},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"carpet\"},[\"special\"]=false},[\"minecraft:magenta_stained_glass\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=621,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=65,[2]=65,[3]=65,[4]=65,[5]=409,[6]=65,[7]=65,[8]=65,[9]=65},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"stained_glass\"},[\"special\"]=false},[\"minecraft:mangrove_chest_boat\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=628,[\"count\"]=1,[\"ingredients\"]={{5,1,false},{625,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"chest_boat\"},[\"special\"]=false},[\"minecraft:mangrove_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=637,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=626,[2]=626,[3]=626},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"wooden_slab\"},[\"special\"]=false},[\"minecraft:melon_seeds\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=644,[\"count\"]=1,[\"ingredients\"]={{479,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:mossy_cobblestone_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=652,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=649,[4]=649,[5]=649,[7]=649,[8]=649,[9]=649},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:mossy_stone_brick_wall\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=657,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=655,[2]=655,[3]=655,[4]=655,[5]=655,[6]=655},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:mud_brick_wall\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=661,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=659,[2]=659,[3]=659,[4]=659,[5]=659,[6]=659},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:nether_brick_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=215,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=216,[2]=216,[3]=216},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:netherite_axe_smithing\"]={[\"kind\"]=\"smithing_transform\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smith\",[\"output\"]=677,[\"count\"]=1,[\"ingredients\"]={{368,1,false},{610,1,false},{678,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:netherite_leggings_smithing\"]={[\"kind\"]=\"smithing_transform\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smith\",[\"output\"]=685,[\"count\"]=1,[\"ingredients\"]={{375,1,false},{610,1,false},{678,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:oak_boat\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=691,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=692,[3]=692,[4]=692,[5]=692,[6]=692},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"boat\"},[\"special\"]=false},[\"minecraft:oak_pressure_plate\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=701,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=692,[2]=692},[\"metadata\"]={[\"category\"]=\"redstone\",[\"group\"]=\"wooden_pressure_plate\"},[\"special\"]=false},[\"minecraft:orange_bed\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=412,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=415,[2]=415,[3]=415,[4]=-62,[5]=-62,[6]=-62},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"bed\"},[\"special\"]=false},[\"minecraft:orange_stained_glass\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=716,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=65,[2]=65,[3]=65,[4]=65,[5]=413,[6]=65,[7]=65,[8]=65,[9]=65},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"stained_glass\"},[\"special\"]=false},[\"minecraft:oxidized_copper_grate\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=723,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[2]=720,[4]=720,[6]=720,[8]=720},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:oxidized_cut_copper_stairs_from_oxidized_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=724,[\"count\"]=4,[\"ingredients\"]={{720,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:pink_candle\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=730,[\"count\"]=1,[\"ingredients\"]={{94,1,false},{417,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"dyed_candle\"},[\"special\"]=false},[\"minecraft:pink_stained_glass\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=737,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=65,[2]=65,[3]=65,[4]=65,[5]=417,[6]=65,[7]=65,[8]=65,[9]=65},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"stained_glass\"},[\"special\"]=false},[\"minecraft:polished_andesite_slab_from_andesite_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=741,[\"count\"]=2,[\"ingredients\"]={{26,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:polished_blackstone_brick_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=745,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=292,[2]=292,[3]=292},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:polished_blackstone_brick_wall\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=747,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=292,[2]=292,[3]=292,[4]=292,[5]=292,[6]=292},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:polished_blackstone_from_blackstone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=219,[\"count\"]=1,[\"ingredients\"]={{109,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:polished_blackstone_wall\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=751,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=219,[2]=219,[3]=219,[4]=219,[5]=219,[6]=219},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:polished_deepslate_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=753,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=359,[4]=359,[5]=359,[7]=359,[8]=359,[9]=359},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:polished_diorite_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=756,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=755,[2]=755,[3]=755},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:polished_granite_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=759,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=758,[2]=758,[3]=758},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:polished_tuff_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=761,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=237,[2]=237,[3]=237},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:polished_tuff_wall_from_tuff_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=763,[\"count\"]=1,[\"ingredients\"]={{239,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:prismarine_bricks\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=768,[\"count\"]=1,[\"ingredients\"]={{352,1,false},{352,1,false},{352,1,false},{352,1,false},{352,1,false},{352,1,false},{352,1,false},{352,1,false},{352,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:pumpkin_seeds\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=775,[\"count\"]=4,[\"ingredients\"]={{774,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:purple_stained_glass\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=781,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=65,[2]=65,[3]=65,[4]=65,[5]=421,[6]=65,[7]=65,[8]=65,[9]=65},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"stained_glass\"},[\"special\"]=false},[\"minecraft:purpur_slab_from_purpur_block_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=785,[\"count\"]=2,[\"ingredients\"]={{783,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:quartz_pillar\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=789,[\"count\"]=2,[\"ingredients\"]={},[\"grid\"]={[1]=222,[4]=222},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:rail\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=792,[\"count\"]=16,[\"ingredients\"]={},[\"grid\"]={[1]=22,[3]=22,[4]=22,[5]=8,[6]=22,[7]=22,[9]=22},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:raw_iron_block\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=796,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=540,[2]=540,[3]=540,[4]=540,[5]=540,[6]=540,[7]=540,[8]=540,[9]=540},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:red_dye_from_poppy\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=425,[\"count\"]=1,[\"ingredients\"]={{802,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"red_dye\"},[\"special\"]=false},[\"minecraft:red_nether_brick_wall\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=810,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=808,[2]=808,[3]=808,[4]=808,[5]=808,[6]=808},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:red_sandstone_wall\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=813,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=225,[2]=225,[3]=225,[4]=225,[5]=225,[6]=225},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:redstone_from_blasting_deepslate_redstone_ore\"]={[\"kind\"]=\"blasting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Blast\",[\"output\"]=243,[\"count\"]=1,[\"ingredients\"]={{817,1,false}},[\"grid\"]={},[\"metadata\"]={[\"cookingtime\"]=100,[\"experience\"]=0.7,[\"category\"]=\"blocks\",[\"group\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:respawn_anchor\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=821,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=822,[2]=822,[3]=822,[4]=483,[5]=483,[6]=483,[7]=822,[8]=822,[9]=822},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:sandstone_wall\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=825,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=228,[2]=228,[3]=228,[4]=228,[5]=228,[6]=228},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:shears\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=831,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[2]=22,[4]=22},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:slime_ball\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=573,[\"count\"]=9,[\"ingredients\"]={{838,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:smooth_quartz_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=844,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=842,[4]=842,[5]=842,[7]=842,[8]=842,[9]=842},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:smooth_sandstone_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=849,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=848,[2]=848,[3]=848},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:snout_armor_trim_smithing_template_smithing_trim\"]={[\"kind\"]=\"smithing_trim\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smith\",[\"output\"]=0,[\"count\"]=1,[\"ingredients\"]={{134,1,true},{135,1,true},{851,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=true},[\"minecraft:spire_armor_trim_smithing_template_smithing_trim\"]={[\"kind\"]=\"smithing_trim\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smith\",[\"output\"]=0,[\"count\"]=1,[\"ingredients\"]={{134,1,true},{135,1,true},{860,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=true},[\"minecraft:spruce_hanging_sign\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=870,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=11,[3]=11,[4]=871,[5]=871,[6]=871,[7]=871,[8]=871,[9]=871},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"hanging_sign\"},[\"special\"]=false},[\"minecraft:spyglass\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=880,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[2]=25,[5]=168,[8]=168},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:stone_brick_slab_from_stone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=230,[\"count\"]=2,[\"ingredients\"]={{232,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:stone_bricks_from_stone_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=231,[\"count\"]=1,[\"ingredients\"]={{232,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:stone_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=890,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=232,[4]=232,[5]=232,[7]=232,[8]=232,[9]=232},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:stripped_dark_oak_wood\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=897,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=342,[2]=342,[4]=342,[5]=342},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"bark\"},[\"special\"]=false},[\"minecraft:suspicious_stew\"]={[\"kind\"]=\"crafting_special_suspiciousstew\",[\"mode\"]=\"special\",[\"address\"]=\"Crafter\",[\"output\"]=0,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=true},[\"minecraft:tnt_minecart\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=908,[\"count\"]=1,[\"ingredients\"]={{907,1,false},{205,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"misc\"},[\"special\"]=false},[\"minecraft:tuff_brick_stairs\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=910,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=238,[4]=238,[5]=238,[7]=238,[8]=238,[9]=238},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:tuff_bricks\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=238,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[1]=237,[2]=237,[4]=237,[5]=237},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:tuff_wall_from_tuff_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=913,[\"count\"]=1,[\"ingredients\"]={{239,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:warped_fence\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=921,[\"count\"]=3,[\"ingredients\"]={},[\"grid\"]={[1]=919,[2]=8,[3]=919,[4]=919,[5]=8,[6]=919},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"wooden_fence\"},[\"special\"]=false},[\"minecraft:warped_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=931,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=919,[2]=919,[3]=919},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"wooden_slab\"},[\"special\"]=false},[\"minecraft:waxed_copper_bulb\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=937,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[2]=284,[4]=284,[5]=116,[6]=284,[8]=243},[\"metadata\"]={[\"category\"]=\"redstone\"},[\"special\"]=false},[\"minecraft:waxed_cut_copper_from_honeycomb\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=936,[\"count\"]=1,[\"ingredients\"]={{210,1,false},{69,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_cut_copper\"},[\"special\"]=false},[\"minecraft:waxed_cut_copper_stairs_from_waxed_copper_block_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=941,[\"count\"]=4,[\"ingredients\"]={{284,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:waxed_exposed_copper_door_from_honeycomb\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=947,[\"count\"]=1,[\"ingredients\"]={{948,1,false},{69,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_exposed_copper_door\"},[\"special\"]=false},[\"minecraft:waxed_exposed_cut_copper_from_waxed_exposed_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=945,[\"count\"]=4,[\"ingredients\"]={{944,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:waxed_exposed_cut_copper_stairs_from_waxed_exposed_cut_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=952,[\"count\"]=1,[\"ingredients\"]={{945,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:waxed_oxidized_copper_from_honeycomb\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=955,[\"count\"]=1,[\"ingredients\"]={{720,1,false},{69,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_oxidized_copper\"},[\"special\"]=false},[\"minecraft:waxed_oxidized_cut_copper_slab\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=954,[\"count\"]=6,[\"ingredients\"]={},[\"grid\"]={[1]=956,[2]=956,[3]=956},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_oxidized_cut_copper_slab\"},[\"special\"]=false},[\"minecraft:waxed_weathered_chiseled_copper\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=964,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=965,[4]=965},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_weathered_cut_copper_chiseled\"},[\"special\"]=false},[\"minecraft:waxed_weathered_copper_grate\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=974,[\"count\"]=4,[\"ingredients\"]={},[\"grid\"]={[2]=967,[4]=967,[6]=967,[8]=967},[\"metadata\"]={[\"category\"]=\"building\"},[\"special\"]=false},[\"minecraft:waxed_weathered_cut_copper_slab_from_honeycomb\"]={[\"kind\"]=\"crafting_shapeless\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=965,[\"count\"]=1,[\"ingredients\"]={{979,1,false},{69,1,false}},[\"grid\"]={},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"waxed_weathered_cut_copper_slab\"},[\"special\"]=false},[\"minecraft:wayfinder_armor_trim_smithing_template_smithing_trim\"]={[\"kind\"]=\"smithing_trim\",[\"mode\"]=\"crafting\",[\"address\"]=\"Smith\",[\"output\"]=0,[\"count\"]=1,[\"ingredients\"]={{134,1,true},{135,1,true},{982,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=true},[\"minecraft:weathered_cut_copper_from_weathered_copper_stonecutting\"]={[\"kind\"]=\"stonecutting\",[\"mode\"]=\"crafting\",[\"address\"]=\"Stonecut\",[\"output\"]=978,[\"count\"]=4,[\"ingredients\"]={{973,1,false}},[\"grid\"]={},[\"metadata\"]={},[\"special\"]=false},[\"minecraft:white_banner\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=983,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=431,[2]=431,[3]=431,[4]=431,[5]=431,[6]=431,[8]=8},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"banner\"},[\"special\"]=false},[\"minecraft:white_stained_glass\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=989,[\"count\"]=8,[\"ingredients\"]={},[\"grid\"]={[1]=65,[2]=65,[3]=65,[4]=65,[5]=429,[6]=65,[7]=65,[8]=65,[9]=65},[\"metadata\"]={[\"category\"]=\"building\",[\"group\"]=\"stained_glass\"},[\"special\"]=false},[\"minecraft:wolf_armor\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=993,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=994,[4]=994,[5]=994,[6]=994,[7]=994,[9]=994},[\"metadata\"]={[\"category\"]=\"equipment\"},[\"special\"]=false},[\"minecraft:yellow_bed\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=432,[\"count\"]=1,[\"ingredients\"]={},[\"grid\"]={[1]=435,[2]=435,[3]=435,[4]=-62,[5]=-62,[6]=-62},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"bed\"},[\"special\"]=false},[\"minecraft:yellow_stained_glass_pane\"]={[\"kind\"]=\"crafting_shaped\",[\"mode\"]=\"crafting\",[\"address\"]=\"Crafter\",[\"output\"]=1009,[\"count\"]=16,[\"ingredients\"]={},[\"grid\"]={[1]=1008,[2]=1008,[3]=1008,[4]=1008,[5]=1008,[6]=1008},[\"metadata\"]={[\"category\"]=\"misc\",[\"group\"]=\"stained_glass_pane\"},[\"special\"]=false}},[\"counts\"]={}}",
  ["ceetos/recipes/vanilla-tags-1.21.1.lua"] = "return{[\"schema\"]=1,[\"minecraft\"]=\"1.21.1\",[\"tags\"]={[\"minecraft:acacia_logs\"]={\"minecraft:acacia_log\",\"minecraft:acacia_wood\",\"minecraft:stripped_acacia_log\",\"minecraft:stripped_acacia_wood\"},[\"minecraft:bamboo_blocks\"]={\"minecraft:bamboo_block\",\"minecraft:stripped_bamboo_block\"},[\"minecraft:birch_logs\"]={\"minecraft:birch_log\",\"minecraft:birch_wood\",\"minecraft:stripped_birch_log\",\"minecraft:stripped_birch_wood\"},[\"minecraft:cherry_logs\"]={\"minecraft:cherry_log\",\"minecraft:cherry_wood\",\"minecraft:stripped_cherry_log\",\"minecraft:stripped_cherry_wood\"},[\"minecraft:coals\"]={\"minecraft:charcoal\",\"minecraft:coal\"},[\"minecraft:crimson_stems\"]={\"minecraft:crimson_hyphae\",\"minecraft:crimson_stem\",\"minecraft:stripped_crimson_hyphae\",\"minecraft:stripped_crimson_stem\"},[\"minecraft:dark_oak_logs\"]={\"minecraft:dark_oak_log\",\"minecraft:dark_oak_wood\",\"minecraft:stripped_dark_oak_log\",\"minecraft:stripped_dark_oak_wood\"},[\"minecraft:jungle_logs\"]={\"minecraft:jungle_log\",\"minecraft:jungle_wood\",\"minecraft:stripped_jungle_log\",\"minecraft:stripped_jungle_wood\"},[\"minecraft:logs\"]={\"minecraft:acacia_log\",\"minecraft:acacia_wood\",\"minecraft:birch_log\",\"minecraft:birch_wood\",\"minecraft:cherry_log\",\"minecraft:cherry_wood\",\"minecraft:crimson_hyphae\",\"minecraft:crimson_stem\",\"minecraft:dark_oak_log\",\"minecraft:dark_oak_wood\",\"minecraft:jungle_log\",\"minecraft:jungle_wood\",\"minecraft:mangrove_log\",\"minecraft:mangrove_wood\",\"minecraft:oak_log\",\"minecraft:oak_wood\",\"minecraft:spruce_log\",\"minecraft:spruce_wood\",\"minecraft:stripped_acacia_log\",\"minecraft:stripped_acacia_wood\",\"minecraft:stripped_birch_log\",\"minecraft:stripped_birch_wood\",\"minecraft:stripped_cherry_log\",\"minecraft:stripped_cherry_wood\",\"minecraft:stripped_crimson_hyphae\",\"minecraft:stripped_crimson_stem\",\"minecraft:stripped_dark_oak_log\",\"minecraft:stripped_dark_oak_wood\",\"minecraft:stripped_jungle_log\",\"minecraft:stripped_jungle_wood\",\"minecraft:stripped_mangrove_log\",\"minecraft:stripped_mangrove_wood\",\"minecraft:stripped_oak_log\",\"minecraft:stripped_oak_wood\",\"minecraft:stripped_spruce_log\",\"minecraft:stripped_spruce_wood\",\"minecraft:stripped_warped_hyphae\",\"minecraft:stripped_warped_stem\",\"minecraft:warped_hyphae\",\"minecraft:warped_stem\"},[\"minecraft:logs_that_burn\"]={\"minecraft:acacia_log\",\"minecraft:acacia_wood\",\"minecraft:birch_log\",\"minecraft:birch_wood\",\"minecraft:cherry_log\",\"minecraft:cherry_wood\",\"minecraft:dark_oak_log\",\"minecraft:dark_oak_wood\",\"minecraft:jungle_log\",\"minecraft:jungle_wood\",\"minecraft:mangrove_log\",\"minecraft:mangrove_wood\",\"minecraft:oak_log\",\"minecraft:oak_wood\",\"minecraft:spruce_log\",\"minecraft:spruce_wood\",\"minecraft:stripped_acacia_log\",\"minecraft:stripped_acacia_wood\",\"minecraft:stripped_birch_log\",\"minecraft:stripped_birch_wood\",\"minecraft:stripped_cherry_log\",\"minecraft:stripped_cherry_wood\",\"minecraft:stripped_dark_oak_log\",\"minecraft:stripped_dark_oak_wood\",\"minecraft:stripped_jungle_log\",\"minecraft:stripped_jungle_wood\",\"minecraft:stripped_mangrove_log\",\"minecraft:stripped_mangrove_wood\",\"minecraft:stripped_oak_log\",\"minecraft:stripped_oak_wood\",\"minecraft:stripped_spruce_log\",\"minecraft:stripped_spruce_wood\"},[\"minecraft:mangrove_logs\"]={\"minecraft:mangrove_log\",\"minecraft:mangrove_wood\",\"minecraft:stripped_mangrove_log\",\"minecraft:stripped_mangrove_wood\"},[\"minecraft:oak_logs\"]={\"minecraft:oak_log\",\"minecraft:oak_wood\",\"minecraft:stripped_oak_log\",\"minecraft:stripped_oak_wood\"},[\"minecraft:planks\"]={\"minecraft:acacia_planks\",\"minecraft:bamboo_planks\",\"minecraft:birch_planks\",\"minecraft:cherry_planks\",\"minecraft:crimson_planks\",\"minecraft:dark_oak_planks\",\"minecraft:jungle_planks\",\"minecraft:mangrove_planks\",\"minecraft:oak_planks\",\"minecraft:spruce_planks\",\"minecraft:warped_planks\"},[\"minecraft:smelts_to_glass\"]={\"minecraft:red_sand\",\"minecraft:sand\"},[\"minecraft:soul_fire_base_blocks\"]={\"minecraft:soul_sand\",\"minecraft:soul_soil\"},[\"minecraft:spruce_logs\"]={\"minecraft:spruce_log\",\"minecraft:spruce_wood\",\"minecraft:stripped_spruce_log\",\"minecraft:stripped_spruce_wood\"},[\"minecraft:stone_crafting_materials\"]={\"minecraft:blackstone\",\"minecraft:cobbled_deepslate\",\"minecraft:cobblestone\"},[\"minecraft:stone_tool_materials\"]={\"minecraft:blackstone\",\"minecraft:cobbled_deepslate\",\"minecraft:cobblestone\"},[\"minecraft:trim_materials\"]={\"minecraft:amethyst_shard\",\"minecraft:copper_ingot\",\"minecraft:diamond\",\"minecraft:emerald\",\"minecraft:gold_ingot\",\"minecraft:iron_ingot\",\"minecraft:lapis_lazuli\",\"minecraft:netherite_ingot\",\"minecraft:quartz\",\"minecraft:redstone\"},[\"minecraft:trimmable_armor\"]={\"minecraft:chainmail_boots\",\"minecraft:chainmail_chestplate\",\"minecraft:chainmail_helmet\",\"minecraft:chainmail_leggings\",\"minecraft:diamond_boots\",\"minecraft:diamond_chestplate\",\"minecraft:diamond_helmet\",\"minecraft:diamond_leggings\",\"minecraft:golden_boots\",\"minecraft:golden_chestplate\",\"minecraft:golden_helmet\",\"minecraft:golden_leggings\",\"minecraft:iron_boots\",\"minecraft:iron_chestplate\",\"minecraft:iron_helmet\",\"minecraft:iron_leggings\",\"minecraft:leather_boots\",\"minecraft:leather_chestplate\",\"minecraft:leather_helmet\",\"minecraft:leather_leggings\",\"minecraft:netherite_boots\",\"minecraft:netherite_chestplate\",\"minecraft:netherite_helmet\",\"minecraft:netherite_leggings\",\"minecraft:turtle_helmet\"},[\"minecraft:warped_stems\"]={\"minecraft:stripped_warped_hyphae\",\"minecraft:stripped_warped_stem\",\"minecraft:warped_hyphae\",\"minecraft:warped_stem\"},[\"minecraft:wooden_slabs\"]={\"minecraft:acacia_slab\",\"minecraft:bamboo_slab\",\"minecraft:birch_slab\",\"minecraft:cherry_slab\",\"minecraft:crimson_slab\",\"minecraft:dark_oak_slab\",\"minecraft:jungle_slab\",\"minecraft:mangrove_slab\",\"minecraft:oak_slab\",\"minecraft:spruce_slab\",\"minecraft:warped_slab\"},[\"minecraft:wool\"]={\"minecraft:black_wool\",\"minecraft:blue_wool\",\"minecraft:brown_wool\",\"minecraft:cyan_wool\",\"minecraft:gray_wool\",\"minecraft:green_wool\",\"minecraft:light_blue_wool\",\"minecraft:light_gray_wool\",\"minecraft:lime_wool\",\"minecraft:magenta_wool\",\"minecraft:orange_wool\",\"minecraft:pink_wool\",\"minecraft:purple_wool\",\"minecraft:red_wool\",\"minecraft:white_wool\",\"minecraft:yellow_wool\"}}}",
  ["ceetos/server.lua"] = "package.path=\"/?.lua;/?/init.lua;\"..package.path require(\"ceetos.lib.runtime_modules\").refresh()local profile=require(\"ceetos.lib.profile\")local auth=require(\"ceetos.lib.auth\")local authTransportPolicy=require(\"ceetos.lib.auth_transport_policy\")local net=require(\"ceetos.lib.net\")local audit=require(\"ceetos.lib.audit\")local updater=require(\"ceetos.lib.updater\")local networkIpc=require(\"ceetos.lib.network_ipc\")local networkRuntime=require(\"ceetos.lib.network_runtime\")local version=require(\"ceetos.lib.version\")local recipe,authority,authorityRuntime if profile.is(\"recipe-server\")then recipe=require(\"ceetos.lib.\"..\"recipe_service\")end if profile.is(\"auth-server\")then authority=require(\"ceetos.lib.\"..\"auth_authority\")authorityRuntime=require(\"ceetos.lib.\"..\"auth_authority_runtime\")end local authClient=require(\"ceetos.lib.auth_client\")local cloudSync=require(\"ceetos.lib.cloud_sync\")local cloudService=require(\"ceetos.lib.cloud_service\")local releaseBroker=require(\"ceetos.lib.release_broker\")local store=require(\"ceetos.lib.store\")local supervisor=require(\"ceetos.lib.supervisor\")local sounds=require(\"ceetos.lib.sounds\")local SERVICE_SUPERVISOR=\"/ceetos/data/service-supervisor.lua\"local NETWORK_STATUS=\"/ceetos/data/network-status.lua\"local NETWORK_HEALTH=\"/ceetos/data/network-service.lua\"local NETWORK_IPC_DIAG=\"/ceetos/data/network-ipc-status.lua\"local snapshotSerialised={}local function recordServiceTransition(name,status)local state=store.read(SERVICE_SUPERVISOR,{schema=1,services={}})if type(state)~=\"table\"then state={schema=1,services={}}end if type(state.services)~=\"table\"then state.services={}end state.schema,state.services[name],state.updated=1,status,os.epoch(\"utc\")store.write(SERVICE_SUPERVISOR,state)if status.state==\"backoff\"then sounds.play(\"warning\")elseif status.state==\"running\"and(tonumber(status.failures)or 0)>0 then sounds.play(\"reconnect\")end end local function replyIpc(command,ok,result)local replyError=nil if ok~=true then replyError=tostring(result or\"server command failed\")end local replied,replyErr=networkIpc.reply(command.id,{id=command.id,ok=ok==true,result=ok and result or nil,error=replyError,})if not replied then error(\"could not commit protected server IPC reply: \"..tostring(replyErr),0)end end local function writeSnapshot(path,value)local serialOk,encoded=pcall(textutils.serialise,value)if not serialOk then audit.log(\"server\",\"network.snapshot_encode_error\",{path=path,error=tostring(encoded):sub(1,120)})return false end if snapshotSerialised[path]==encoded then return true end local ok,err=pcall(store.write,path,value)if not ok or err==false then audit.log(\"server\",\"network.snapshot_error\",{path=path,error=tostring(err):sub(1,120)})return false end snapshotSerialised[path]=encoded local domains={[NETWORK_STATUS]=\"network\",[NETWORK_HEALTH]=\"network-health\",[NETWORK_IPC_DIAG]=\"network-ipc\"}if domains[path]and os and os.queueEvent then pcall(os.queueEvent,\"ceetos_state_changed\",domains[path],value.revision or value.updated or os.epoch(\"utc\"))end return true end local function command()local request=networkIpc.take()if not request then return end local ok,result=pcall(function()if request.action==\"server_status\"or request.action==\"network_status\"then return{profile=profile.id(),version=version.string,network=net.statusSnapshot(true),authority=authority and authority.status()or auth.authority(),recipes=recipe and recipe.status()or nil}elseif request.action==\"route_status\"then return net.routeStatus(request.target)elseif request.action==\"network_trace\"then return net.transportTrace(request.kind)elseif request.action==\"server_discovery_start\"or request.action==\"discovery_start\"then auth.require(\"admin\");return net.startDiscovery(request.mode or\"peer\",request.master or\"initiator\",request.phrase)elseif request.action==\"server_discovery_join\"or request.action==\"discovery_join\"then auth.require(\"admin\");return net.joinDiscovery(request.phrase)elseif request.action==\"server_discovery_confirm\"or request.action==\"discovery_confirm\"then auth.require(\"admin\");return net.confirmDiscovery()elseif request.action==\"server_discovery_cancel\"or request.action==\"discovery_cancel\"then auth.require(\"admin\")return net.cancelDiscovery(request.control,request.source or\"server-ipc\")elseif request.action==\"server_update_status\"or request.action==\"update_status\"then return updater.status()elseif request.action==\"server_update_check\"or request.action==\"update_check\"then auth.require(\"operator\");return updater.check()elseif request.action==\"server_update_offers\"or request.action==\"update_offers\"then auth.require(\"operator\");return updater.status().offers elseif request.action==\"server_update_download\"or request.action==\"update_download\"then auth.require(\"operator\");return updater.download(request.source)elseif request.action==\"server_update_latest\"or request.action==\"update_install_latest\"then auth.require(\"operator\");return updater.installLatest()elseif request.action==\"server_update_cancel\"or request.action==\"update_cancel\"then auth.require(\"operator\");return updater.cancel()elseif request.action==\"server_update_clear\"or request.action==\"update_clear_cache\"then auth.require(\"admin\");return updater.clearCache()elseif request.action==\"server_update_apply\"or request.action==\"update_apply\"then auth.require(\"admin\");return updater.prepareApply()elseif request.action==\"broker_status\"then auth.require(\"operator\");return releaseBroker.status()elseif request.action==\"broker_promote\"then auth.require(\"admin\");return releaseBroker.promote(request.ownerKey)elseif request.action==\"broker_revoke\"then auth.require(\"admin\");return releaseBroker.revoke(request.ownerKey)elseif request.action==\"broker_approve\"then auth.require(\"admin\");return releaseBroker.approve(request.session,request.phrase)elseif request.action==\"auth_send\"then local directCheck=net.isTrustedDirectLink or net.isDirectPeer local trusted=directCheck and directCheck(request.target)==true if not authTransportPolicy.canSend(request.type,trusted)then error(authTransportPolicy.denial(request.type))end local sent,err=net.request(request.target,request.type,request.body or{},{safe=true,confidential=true})if not sent then error(err or\"could not contact Auth Server\")end return true end error(\"unknown protected server command\")end)replyIpc(request,ok and result~=false,ok and result or result)end net.handler=function(from,peer,packet)if packet.type==\"update_query\"or packet.type==\"update_offer\"or packet.type==\"update_chunk_request\"or packet.type==\"update_chunk\"then return updater.authenticatedPacket(from,peer,packet)end if packet.type==\"profile_query\"then return net.reply(packet,\"profile_status\",{profile=profile.id(),version=version.string},{safe=true})end if recipe and(packet.type==\"recipe_plan_request\"or packet.type==\"recipe_catalog_request\"or packet.type==\"recipe_tag_options_request\")then return recipe.handle(packet,net)end if packet.type==\"auth_login_begin_result\"or packet.type==\"auth_login_proof_result\"or packet.type==\"auth_mutate_result\"then local directCheck=net.isTrustedDirectLink or net.isDirectPeer return authClient.receive(packet.body,{from=from,direct=directCheck and directCheck(from)==true,type=packet.type,routed=tostring(packet.origin or from)~=tostring(from),deferred=true})end if packet.type==\"auth_seed_request\"then return false,\"auth seed replication requires a v2 capability\"end if packet.type==\"auth_authority\"then local directCheck=net.isTrustedDirectLink or net.isDirectPeer local ok,result=pcall(auth.acceptAuthority,packet.body,{from=from,direct=directCheck and directCheck(from)==true})if not ok then audit.log(\"server\",\"auth.authority_rejected\",{error=tostring(result):sub(1,120)})return true end return result end if authorityRuntime and authorityRuntime.handles(packet)then return authorityRuntime.handle(authority,from,peer,packet,net)end end net.publicHandler=function(packet,distance)if tostring(packet.type or\"\"):match(\"^broker_\")then return releaseBroker.handle(packet,distance)end return updater.publicPacket(packet,distance)end local candidateStartedAt=os.epoch(\"utc\")local recoveryHealthProof local function service()net.start()if authorityRuntime then authorityRuntime.start(authority)end local advertised=0 local started,lastError=os.epoch(\"utc\"),nil local nextHealthAt=0 local function health(errorText,force)if errorText then lastError=tostring(errorText):sub(1,240)end local timestamp=os.epoch(\"utc\")if not force and timestamp<nextHealthAt then return end nextHealthAt=timestamp+2000 writeSnapshot(NETWORK_HEALTH,{version=version.string,profile=profile.id(),started=started,lastEvent=os.epoch(\"utc\"),healthy=lastError==nil,error=lastError,ipc=networkIpc.status()})end health(nil,true)local runtime=networkRuntime.new({now=function()return os.epoch(\"utc\")end,startTimer=os.startTimer,pullEvent=os.pullEventRaw,handle=net.handle,onFault=function(scope,errorText)health(errorText,true)sounds.play(\"error\")local names={ipc=\"network.ipc_error\",packet=\"network.error\",event=\"network.event_error\"}audit.log(\"server\",names[scope]or(\"network.\"..tostring(scope)..\"_error\"),{error=tostring(errorText):sub(1,120)})end,onEvent=function(event)if event[1]==\"peripheral\"or event[1]==\"peripheral_detach\"then sounds.invalidate()sounds.refresh()end end,ipc={event=networkIpc.EVENT,interval=0.5,cadence=250,pending=networkIpc.pending,claim=command},tasks={{name=\"network\",initial=0.25,interval=1,run=function()local tickOk,tickErr=pcall(net.tick)pcall(releaseBroker.tick)if authorityRuntime then local authorityOk,authorityErr=pcall(authorityRuntime.tick,authority,net)if not authorityOk then audit.log(\"server\",\"auth.tick_error\",{error=tostring(authorityErr):sub(1,120)})error(\"authority tick failed: \"..tostring(authorityErr))end end local snapshotOk,snapshot=pcall(net.statusSnapshot,true)if snapshotOk then writeSnapshot(NETWORK_STATUS,snapshot)else error(snapshot)end writeSnapshot(NETWORK_IPC_DIAG,{phase=\"service\",at=os.epoch(\"utc\"),ipc=networkIpc.status()})if os.epoch(\"utc\")-advertised>=30000 then for _,peer in ipairs(net.peers())do net.request(peer.id,\"profile_status\",{profile=profile.id(),version=version.string},{safe=true})end advertised=os.epoch(\"utc\")end health()if not tickOk then error(tickErr)end if recoveryHealthProof then recoveryHealthProof()end return 1 end,},{name=\"updates\",initial=1,interval=1,run=function()pcall(updater.tick);return 1 end},},})runtime:run()end local function console()shell.run(\"/ceetos/bin/ceetserver.lua\")while true do sleep(1);shell.run(\"/ceetos/bin/ceetserver.lua\")end end recoveryHealthProof=function()local path=\"/ceetos-dev/recovery/transaction.lua\"if not fs.exists(path)then return end local handle=fs.open(path,\"r\")local transaction=handle and textutils.unserialise(handle.readAll())or nil if handle then handle.close()end if type(transaction)~=\"table\"or transaction.state~=\"candidate\"or transaction.expectedVersion~=version.string then return end local now=os.epoch(\"utc\")if type(transaction.candidateAt)~=\"number\"or candidateStartedAt<transaction.candidateAt then return end local temporary=\"/ceetos-dev/recovery/candidate-health.lua.tmp\"local output=fs.open(temporary,\"w\")if output then output.write(textutils.serialise({transaction=transaction.id,version=version.string,profile=profile.id(),startedAt=candidateStartedAt,runtimeReady=true,at=now}))output.close()if fs.exists(\"/ceetos-dev/recovery/candidate-health.lua\")then fs.delete(\"/ceetos-dev/recovery/candidate-health.lua\")end fs.move(temporary,\"/ceetos-dev/recovery/candidate-health.lua\")sounds.play(\"confirmation\")end end sounds.play(\"boot\")local function devBridge()local path=\"/ceetos-dev/connection.lua\"local restartPath=\"/ceetos-dev/recovery/restart-request.lua\"local heartbeatPath=\"/ceetos-dev/recovery/bridge-heartbeat.lua\"local function pendingRestartRequest()if not fs.exists(restartPath)then return nil end local handle=fs.open(restartPath,\"r\")local request=handle and textutils.unserialise(handle.readAll())or nil if handle then handle.close()end if type(request)~=\"table\"or request.schema~=1 then return nil end if request.reason~=\"candidate\"and request.reason~=\"restart\"and request.reason~=\"rollback\"and request.reason~=\"websocket-recovery\"and request.reason~=\"offline-repair\"then return nil end return request end local function runDevClient(cfg,token)local started=os.epoch(\"utc\")local function recoverBlockedClient()local temporary=restartPath..\".tmp\"if fs.exists(temporary)then pcall(fs.delete,temporary)end local output=fs.open(temporary,\"w\")if output then output.write(textutils.serialise({schema=1,reason=\"websocket-recovery\",requestedAt=os.epoch(\"utc\")}))output.close()if fs.exists(restartPath)then pcall(fs.delete,restartPath)end pcall(fs.move,temporary,restartPath)end os.reboot()end local function stalled()while true do sleep(2)local handle=fs.exists(heartbeatPath)and fs.open(heartbeatPath,\"r\")or nil local heartbeat=handle and textutils.unserialise(handle.readAll())or nil if handle then handle.close()end local at=type(heartbeat)==\"table\"and tonumber(heartbeat.at)or nil if os.epoch(\"utc\")-started>20000 and(not at or at<started or os.epoch(\"utc\")-at>15000)then recoverBlockedClient()end end end parallel.waitForAny(function()if token~=\"\"then shell.run(\"/ceetos/bin/ceetdev.lua\",cfg.url,token,\"--background\")else shell.run(\"/ceetos/bin/ceetdev.lua\",cfg.url,\"--background\")end end,stalled)end while true do if fs.exists(\"/ceetos/bin/ceetdev.lua\")and fs.exists(path)then local handle=fs.open(path,\"r\")local cfg=handle and textutils.unserialise(handle.readAll())or nil if handle then handle.close()end if type(cfg)==\"table\"and type(cfg.url)==\"string\"then local token=type(cfg.token)==\"string\"and cfg.token or\"\"local ran,result=pcall(runDevClient,cfg,token)if not ran or result==false then writeSnapshot(\"/ceetos-dev/recovery/bridge-status.lua\",{schema=1,state=\"client-exited\",at=os.epoch(\"utc\"),detail=tostring(ran and\"ceetdev returned false\"or result):gsub(\"[%c]\",\" \"):sub(1,160),})end if pendingRestartRequest()then return end sleep(3)else sleep(5)end else sleep(5)end end end local function cloudServiceLoop()cloudService.new({tick=cloudSync.tick,startTimer=os.startTimer,pullEvent=os.pullEventRaw,interval=5,}):run()end local function restartWatcher()local path=\"/ceetos-dev/recovery/restart-request.lua\"local function restartRequest()if not fs.exists(path)then return nil end local handle=fs.open(path,\"r\")local request=handle and textutils.unserialise(handle.readAll())or nil if handle then handle.close()end if type(request)==\"table\"and request.schema==1 and(request.reason==\"candidate\"or request.reason==\"restart\"or request.reason==\"rollback\"or request.reason==\"websocket-recovery\"or request.reason==\"offline-repair\")then return request end return nil end local timer=os.startTimer(2)local shouldCheck=true while true do if shouldCheck and restartRequest()then os.reboot()end local event,id=os.pullEventRaw()shouldCheck=event==\"ceetos_dev_restart\"or(event==\"timer\"and id==timer)if shouldCheck then timer=os.startTimer(2)end end end local serviceSupervisor=supervisor.new({now=function()return os.epoch(\"utc\")end,sleep=sleep,record=recordServiceTransition,baseDelay=0.25,maxDelay=5,})local function backgroundServices()parallel.waitForAll(function()serviceSupervisor:run(\"network\",service)end,function()serviceSupervisor:run(\"cloud\",cloudServiceLoop)end,function()serviceSupervisor:run(\"devbridge\",devBridge)end)end parallel.waitForAny(console,backgroundServices,restartWatcher)",
  ["ceetos/bin/ceetserver.lua"] = "package.path=\"/?.lua;/?/init.lua;\"..package.path local profile=require(\"ceetos.lib.profile\")local auth=require(\"ceetos.lib.auth\")local version=require(\"ceetos.lib.version\")local terminalUi=require(\"ceetos.lib.terminal_ui\")local input=require(\"ceetos.lib.input\")local store=require(\"ceetos.lib.store\")local networkIpc=require(\"ceetos.lib.network_ipc\")local pairingMonitor=require(\"ceetos.lib.pairing_monitor\")local recipe if profile.is(\"recipe-server\")then recipe=require(\"ceetos.lib.\"..\"recipe_service\")end local selected,page,modal,message,targets,armed=1,\"home\",nil,nil,{},nil local statusCache,pending,requestSerial,lastRenderKey,pairingPending={},{},0,nil,nil local NETWORK_STATUS=\"/ceetos/data/network-status.lua\"local function safe(call,fallback)local ok,result=pcall(call)if ok then return result end return fallback end local function currentSession()return safe(function()return auth.refreshSession()end,nil)end local function admin()return safe(function()return auth.allowed(\"admin\")end,false)==true end local function emptyAccounts()local accounts=safe(function()return auth.list()end,{})return type(accounts)==\"table\"and#accounts==0 end local function status()local snapshot=safe(function()return(store.readStable and store.readStable(NETWORK_STATUS,nil))or store.read(NETWORK_STATUS,nil)end,nil)if type(snapshot)==\"table\"then statusCache=snapshot end statusCache.transport=type(statusCache.transport)==\"table\"and statusCache.transport or{}statusCache.discovery=type(statusCache.discovery)==\"table\"and statusCache.discovery or{}statusCache.peers=type(statusCache.peers)==\"table\"and statusCache.peers or{}return statusCache end local function discoveryControl(snapshot)local session=type(snapshot)==\"table\"and type(snapshot.discovery)==\"table\"and snapshot.discovery.session or nil local control=type(session)==\"table\"and session.control or nil if type(control)~=\"string\"or control==\"\"then return nil,\"No active discovery session to cancel\"end return control end local function actions(session,snapshot)if page==\"pair\"then local discovery=snapshot.discovery or{}local rows={{id=\"pair_start\",key=\"S\",label=\"Start discovery\"},{id=\"pair_join\",key=\"J\",label=\"Join discovery\"},}if discovery.state==\"candidate\"then rows[#rows+1]={id=\"pair_confirm\",key=\"C\",label=\"Confirm candidate\"}end if discovery.active then rows[#rows+1]={id=\"pair_cancel\",key=\"X\",label=\"Cancel discovery\"}end rows[#rows+1]={id=\"pair_back\",key=\"B\",label=\"Back to server\"}return rows end local rows={}if not session then rows[#rows+1]={id=\"login\",key=\"L\",label=\"Log in\"}if emptyAccounts()and not safe(function()return auth.centralActive()end,false)then rows[#rows+1]={id=\"enrol\",key=\"E\",label=\"First-time enrolment\"}end else if admin()then rows[#rows+1]={id=\"pair\",key=\"P\",label=\"Network pairing\"}rows[#rows+1]={id=\"terminal\",key=\"T\",label=\"Admin terminal\"}if recipe then rows[#rows+1]={id=\"import\",key=\"I\",label=\"Import recipe pack\"}end end rows[#rows+1]={id=\"logout\",key=\"L\",label=\"Log out\"}end rows[#rows+1]={id=\"refresh\",key=\"R\",label=\"Refresh status\"}return rows end local function setMessage(value,isError)if value and value~=\"\"then message={text=terminalUi.clean(value),error=isError==true}end end local function submitService(action,body,pendingText)requestSerial=requestSerial+1 local request=body or{}request.action=action request.id=\"server-ui-\"..tostring(os.getComputerID())..\"-\"..tostring(os.epoch(\"utc\"))..\"-\"..tostring(requestSerial)local ok,err=networkIpc.submit(request)if not ok then return false,err or\"server service is unavailable\"end pending[request.id]={action=action,text=pendingText or\"Request queued\"}setMessage((pendingText or\"Request\")..\"...\")return true end local function pollService()for id,job in pairs(pending)do local reply=networkIpc.poll(id,true)if reply then pending[id]=nil if reply.ok then if job.action==\"discovery_confirm\"then local monitor,monitorMessage=pairingMonitor.begin(reply.result,os.epoch(\"utc\"),120000)if monitor then pairingPending=monitor setMessage(\"Waiting for pairing confirmation from \"..tostring(monitor.label)..\".\")else setMessage(monitorMessage)end else setMessage(job.text..\" complete.\")end else setMessage(reply.error or(job.text..\" failed.\"),true)end end end end local function pollPairingMonitor()if not pairingPending then return end local changed,monitorMessage,isError=pairingMonitor.poll(pairingPending,status(),os.epoch(\"utc\"))if changed then pairingPending=nil setMessage(monitorMessage,isError)end end local function beginModal(kind,prompt,secret)modal={kind=kind,prompt=prompt,secret=secret==true,value=\"\",replaceOnInput=false}end local function importRecipePack(event)if not recipe then return setMessage(\"This server profile has no recipe service.\",true)end if not admin()then return setMessage(\"Recipe import requires an admin session.\",true)end local files=event and event.getFiles and event.getFiles()or nil if type(files)~=\"table\"or#files~=1 or type(files[1].read)~=\"function\"then return setMessage(\"Drop exactly one data-only recipe pack.\",true)end local chunks,total={},0 while true do local part=files[1].read(4096)if not part then break end if type(part)~=\"string\"then return setMessage(\"Dropped recipe pack has invalid data.\",true)end total=total+#part if total>64*1024 then return setMessage(\"Recipe pack exceeds 64 KiB.\",true)end chunks[#chunks+1]=part end local ok,result=recipe.import(table.concat(chunks))if not ok then return setMessage(tostring(result),true)end setMessage(\"Recipe pack imported: \"..tostring(result.imported or 0)..\" recipe changes.\")end local function activate(action)local session,snapshot=currentSession(),status()if action==\"login\"then beginModal(\"login_user\",\"Username\",false)elseif action==\"enrol\"then beginModal(\"enrol\",\"Create local admin password\",true)elseif action==\"logout\"then safe(function()auth.logout()end);setMessage(\"Logged out.\")elseif action==\"refresh\"then setMessage(\"Status refreshed.\")elseif action==\"pair\"and admin()then page,selected,message=\"pair\",1,nil elseif action==\"terminal\"and admin()then shell.run(\"/ceetos/bin/ceetserver-admin.lua\");setMessage(\"Returned from admin terminal.\")elseif action==\"pair_back\"then page,selected,message=\"home\",1,nil elseif action==\"pair_start\"and admin()then beginModal(\"pair_start\",\"One-time pairing phrase\",true)elseif action==\"pair_join\"and admin()then beginModal(\"pair_join\",\"One-time pairing phrase\",true)elseif action==\"pair_confirm\"and admin()then local ok,err=submitService(\"discovery_confirm\",{},\"Confirming discovery\")if not ok then setMessage(err,true)end elseif action==\"pair_cancel\"and admin()then local control,controlErr=discoveryControl(snapshot)if not control then return setMessage(controlErr,true)end local ok,err=submitService(\"discovery_cancel\",{control=control,source=\"server-console\"},\"Cancelling discovery\")if not ok then setMessage(err,true)end elseif action==\"import\"then setMessage(\"Drag one data-only recipe pack into this console.\")else setMessage(\"Action is unavailable for this session.\",true)end end local function finishModal()local active=modal if not active then return end if active.kind==\"login_user\"then local username=active.value if username==\"\"then return setMessage(\"Username is required.\",true)end modal={kind=\"login_password\",prompt=\"Password for \"..terminalUi.clip(username,22),secret=true,value=\"\",username=username}return end modal=nil if active.kind==\"login_password\"then local called,ok,err=pcall(auth.login,active.username,active.value)if not called then setMessage(ok,true)else setMessage(ok and\"Logged in.\"or err,not ok)end elseif active.kind==\"enrol\"then if#active.value<8 then return setMessage(\"Enrollment password must contain at least 8 characters.\",true)end local ok,result=pcall(auth.bootstrap,active.value)setMessage(ok and\"Enrollment complete.\"or result,not ok)elseif active.kind==\"pair_start\"then local ok,err=submitService(\"discovery_start\",{mode=\"peer\",master=\"initiator\",phrase=active.value},\"Starting discovery\")if not ok then setMessage(err,true)end elseif active.kind==\"pair_join\"then local ok,err=submitService(\"discovery_join\",{phrase=active.value},\"Joining discovery\")if not ok then setMessage(err,true)end end end local function drawModal(width,height)local title,value=\"Input\",modal.secret and string.rep(\"*\",#modal.value)or modal.value local x1,x2=math.max(2,math.floor(width*.12)),math.min(width-1,math.floor(width*.88))local y1,y2=math.max(3,math.floor(height/2)-2),math.min(height-1,math.floor(height/2)+2)terminalUi.fill(x1,y1,x2-x1+1,y2-y1+1,colors.black)terminalUi.box(x1,y1,x2,y2,title,colors.lightBlue,colors.lightBlue)terminalUi.write(x1+2,y1+1,modal.prompt,colors.white,colors.black,x2-x1-3)terminalUi.write(x1+2,y1+2,value,colors.yellow,colors.black,x2-x1-3)terminalUi.write(x1+2,y2-1,\"Enter confirm | Backspace cancel\",colors.gray,colors.black,x2-x1-3)term.setCursorPos(math.min(x2-1,x1+2+#terminalUi.clip(value,x2-x1-3,\"\")),y1+2)term.setCursorBlink(true)targets[#targets+1]={kind=\"modal\",action=\"modal_confirm\",x1=x1+2,x2=x2-2,y1=y2-1,y2=y2-1}end local function draw()local width,height=term.getSize()term.setCursorBlink(false)if width<30 or height<13 then targets=terminalUi.minimum(\"CeetOS Server\",\"Terminal is too small for the server console\",\"Resize terminal; Backspace refresh\");return end local session,snapshot,transport=currentSession(),status(),nil transport=snapshot.transport or{}local discovery=snapshot.discovery or{}local rows=actions(session,snapshot)selected=math.max(1,math.min(#rows,selected))local visible=table.concat({tostring(width),tostring(height),tostring(page),tostring(selected),session and tostring(session.name)or\"\",session and tostring(session.role)or\"\",tostring(#snapshot.peers),tostring(transport.wireless),tostring(transport.healthyLinks or 0),tostring(discovery.state or\"inactive\"),tostring(discovery.active),pairingPending and tostring(pairingPending.peer)or\"\",message and tostring(message.text)or\"\",message and tostring(message.error)or\"\",modal and tostring(modal.kind)or\"\",modal and tostring(modal.value)or\"\",tostring(#rows),},\"\\31\")if visible==lastRenderKey then return end lastRenderKey=visible targets={}term.setBackgroundColor(colors.black);term.setTextColor(colors.white);term.clear()terminalUi.clearLine(1,colors.blue)terminalUi.write(2,1,\"CeetOS \"..profile.id()..\" server\",colors.white,colors.blue,width-2)terminalUi.box(1,3,width,8,\"Server status\",colors.gray,colors.lightBlue)terminalUi.write(3,4,\"Version: \"..tostring(version.string)..\" | \"..(transport.wireless and\"wireless ready\"or\"no wireless modem\"),colors.white,colors.black,width-4)terminalUi.write(3,5,\"Network: \"..tostring(#snapshot.peers)..\" peers | \"..tostring(transport.healthyLinks or 0)..\" healthy links\",colors.lightGray,colors.black,width-4)local discoveryText=pairingPending and(\"confirming \"..tostring(pairingPending.label or pairingPending.peer))or tostring(discovery.state or\"inactive\")terminalUi.write(3,6,\"Discovery: \"..discoveryText,(discovery.active or pairingPending)and colors.yellow or colors.lightGray,colors.black,width-4)terminalUi.write(3,7,session and(\"Signed in: \"..tostring(session.name)..\" (\"..tostring(session.role)..\")\")or\"Not signed in\",session and colors.white or colors.lightGray,colors.black,width-4)terminalUi.box(1,10,width,height-2,page==\"pair\"and\"Network pairing\"or\"Local controls\",colors.gray,colors.lightBlue)for index,item in ipairs(rows)do local y=10+index if y>=height-2 then break end local selectedRow=index==selected terminalUi.fill(2,y,width-2,1,selectedRow and colors.gray or colors.black)terminalUi.write(3,y,\"[\"..item.key..\"] \"..item.label,selectedRow and colors.white or colors.lightGray,selectedRow and colors.gray or colors.black,width-4)targets[#targets+1]={kind=\"action\",action=item.id,index=index,x1=2,x2=width-1,y1=y,y2=y}end if message then terminalUi.write(2,height-1,terminalUi.clip(message.text,width-3),message.error and colors.red or colors.lightGray,colors.black,width-3)end terminalUi.write(2,height,\"Arrows/WASD select | Enter/D open | Backspace \"..(page==\"pair\"and\"back\"or\"refresh\"),colors.gray,colors.black,width-3)if modal then drawModal(width,height)end end local refreshTimer=os.startTimer(0.5)while true do draw()local event,a,b,c=os.pullEventRaw()pollService()pollPairingMonitor()if modal then if event==\"char\"then modal.value=modal.value..tostring(a)elseif event==\"paste\"then modal.value=modal.value..tostring(a):gsub(\"[\\r\\n]\",\"\")elseif event==\"key\"then local key=tostring(keys.getName(a)or\"\"):lower()if key==\"enter\"then finishModal()elseif key==\"backspace\"then if#modal.value>0 then modal.value=modal.value:sub(1,-2)else modal=nil end end elseif event==\"mouse_up\"and a==1 then local target=terminalUi.hit(targets,b,c)if target and target.action==\"modal_confirm\"then finishModal()end end elseif event==\"timer\"then if a==refreshTimer then refreshTimer=os.startTimer(0.5)end elseif event==\"file_transfer\"then importRecipePack(a)elseif event==\"key\"then local key=tostring(keys.getName(a)or\"\"):lower()key=input.navigation(key)local rows=actions(currentSession(),status())if key==\"up\"then selected=math.max(1,selected-1)elseif key==\"down\"then selected=math.min(#rows,selected+1)elseif key==\"enter\"or key==\"right\"then local item=rows[selected];if item then activate(item.id)end elseif key==\"backspace\"then if page==\"pair\"then page,selected,message=\"home\",1,nil else setMessage(\"Status refreshed.\")end elseif key==\"left\"and page==\"pair\"then page,selected,message=\"home\",1,nil else for index,item in ipairs(rows)do if key==item.key:lower()then selected=index;activate(item.id);break end end end elseif event==\"mouse_click\"and a==1 then local target=terminalUi.hit(targets,b,c)if target and target.kind==\"action\"then selected,armed=target.index,target.action end elseif event==\"mouse_drag\"and a==1 then local target=terminalUi.hit(targets,b,c)armed=target and target.action or nil elseif event==\"mouse_up\"and a==1 then local target=terminalUi.hit(targets,b,c)if target and target.action==armed then activate(target.action)end armed=nil elseif event==\"monitor_touch\"then local target=terminalUi.hit(targets,b,c)if target and target.kind==\"action\"then selected=target.index;activate(target.action)end end end",
  ["ceetos/bin/ceetserver-admin.lua"] = "package.path=\"/?.lua;/?/init.lua;\"..package.path local auth=require(\"ceetos.lib.auth\")local profile=require(\"ceetos.lib.profile\")local version=require(\"ceetos.lib.version\")local audit=require(\"ceetos.lib.audit\")local ipc=require(\"ceetos.lib.network_ipc\")local command=require(\"ceetos.lib.server_terminal\")local ui=require(\"ceetos.lib.terminal_ui\")auth.require(\"admin\")local input,cursor,history,historyIndex,output,sequence=\"\",0,{},nil,{},0 local MAX_HISTORY,MAX_OUTPUT=32,72 local function append(value,error)for line in tostring(value or\"\"):gmatch(\"[^\\r\\n]+\")do output[#output+1]={text=ui.clean(line),error=error==true}end while#output>MAX_OUTPUT do table.remove(output,1)end end local function insert(value)value=tostring(value or\"\"):gsub(\"[\\r\\n]\",\" \")if value==\"\"then return end input=input:sub(1,cursor)..value..input:sub(cursor+1)cursor=cursor+#value end local function request(action)sequence=sequence+1 action.id=\"server-terminal-\"..tostring(os.getComputerID())..\"-\"..tostring(os.epoch(\"utc\"))..\"-\"..tostring(sequence)local ok,err=ipc.submit(action)if not ok then return false,err or\"server service is unavailable\"end local reply,waitErr=ipc.await(action.id,5000)if waitErr then return false,waitErr end return reply and reply.ok==true,reply and(reply.result or reply.error)or\"server service did not respond\"end local function execute()local line=input input,cursor,historyIndex=\"\",0,nil if line:match(\"^%s*$\")then return false end history[#history+1]=line while#history>MAX_HISTORY do table.remove(history,1)end append(\"# \"..line)local argv,parseErr=command.parse(line)if not argv then append(parseErr,true);return false end local plan,planErr=command.plan(argv)if not plan then append(planErr,true);return false end if plan.kind==\"exit\"then return true end if plan.kind==\"clear\"then output={};return false end local ok,result=pcall(function()auth.require(\"admin\")if plan.kind==\"help\"then return command.format(\"help\")end if plan.kind==\"users\"then return command.format(\"users\",auth.list())end if plan.kind==\"audit\"then return command.format(\"audit\",audit.recent(24))end if plan.kind==\"noop\"then return{}end if plan.request.action==\"discovery_cancel\"then local statusOk,statusReply=request({action=\"network_status\"})local snapshot=statusOk and statusReply and statusReply.network or nil local control=snapshot and snapshot.discovery and snapshot.discovery.session and snapshot.discovery.session.control if type(control)~=\"string\"or control==\"\"then error(\"No active discovery session to cancel\",0)end plan.request.control,plan.request.source=control,\"server-terminal\"end local sent,reply=request(plan.request)if not sent then error(reply or\"command failed\",0)end return command.format(argv[1]:lower()==\"routes\"and\"routes\"or\"result\",reply)end)if not ok then append(result,true);return false end for _,row in ipairs(result or{})do append(row)end return false end local function promptLine(width)local session=auth.refreshSession()or{name=\"admin\"}local prefix=tostring(session.name)..\"@\"..tostring(profile.id())..\":~# \"local available=math.max(1,width-#prefix-1)local start=math.max(1,cursor-available+2)local visible=input:sub(start,start+available-1)return prefix,visible,cursor-start+1 end local function draw()local width,height=term.getSize()term.setCursorBlink(false)if width<34 or height<10 then ui.minimum(\"CeetOS Server Terminal\",\"Terminal is too small\",\"Resize | Backspace return\");return end term.setBackgroundColor(colors.black);term.setTextColor(colors.white);term.clear()ui.clearLine(1,colors.blue)ui.write(2,1,\"CeetOS \"..profile.id()..\" admin terminal | \"..tostring(version.string),colors.white,colors.blue,width-2)local capacity,first=height-4,math.max(1,#output-(height-4)+1)for index=0,capacity-1 do local row=output[first+index]if not row then break end ui.write(2,2+index,row.text,row.error and colors.red or colors.lightGray,colors.black,width-3)end ui.clearLine(height-2,colors.black)ui.write(2,height-2,\"help for server commands | Tab complete | Backspace on empty returns\",colors.gray,colors.black,width-3)ui.clearLine(height-1,colors.black)local prefix,visible,position=promptLine(width)ui.write(2,height-1,prefix,colors.lime,colors.black,width-3)ui.write(2+#prefix,height-1,visible,colors.white,colors.black,width-#prefix-3)ui.clearLine(height,colors.black)ui.write(2,height,\"Cursor \"..tostring(cursor+1)..\"/\"..tostring(#input+1)..\" | Enter run | exit return\",colors.gray,colors.black,width-3)term.setCursorPos(math.min(width,2+#prefix+math.max(0,position-1)),height-1)term.setCursorBlink(true)end append(\"Protected server terminal ready. Type help.\")while true do draw()local event,a=os.pullEventRaw()if event==\"char\"then insert(a)elseif event==\"paste\"then insert(a)elseif event==\"key\"then local key=tostring(keys.getName(a)or\"\"):lower()if key==\"enter\"then if execute()then return end elseif key==\"backspace\"then if cursor>0 then input=input:sub(1,cursor-1)..input:sub(cursor+1);cursor=cursor-1 elseif input==\"\"then return end elseif key==\"delete\"then input=input:sub(1,cursor)..input:sub(cursor+2)elseif key==\"left\"then cursor=math.max(0,cursor-1)elseif key==\"right\"then cursor=math.min(#input,cursor+1)elseif key==\"home\"then cursor=0 elseif key==\"end\"then cursor=#input elseif key==\"up\"then if#history>0 then historyIndex=math.max(1,(historyIndex or(#history+1))-1);input,cursor=history[historyIndex],#history[historyIndex]end elseif key==\"down\"then if historyIndex then historyIndex=historyIndex+1;if historyIndex>#history then historyIndex,input,cursor=nil,\"\",0 else input,cursor=history[historyIndex],#history[historyIndex]end end elseif key==\"tab\"then local rows=command.completions(input)if#rows==1 then input,cursor=rows[1],#rows[1]elseif#rows>1 then append(\"Matches: \"..table.concat(rows,\", \"))end end elseif event==\"terminate\"then if auth.canExitOs()then return end append(\"Administrator session required to stop CeetOS\",true)end end",
  ["ceetos/lib/server_terminal.lua"] = "local M={}local ROOT={\"help\",\"status\",\"peers\",\"routes\",\"discover\",\"update\",\"wget\",\"users\",\"audit\",\"clear\",\"exit\"}local function words(line)if type(line)~=\"string\"then return nil,\"command must be text\"end if#line>320 then return nil,\"command is too long\"end local out,current,quote,escaped={},{},nil,false for index=1,#line do local char=line:sub(index,index)if escaped then current[#current+1],escaped=char,false elseif char==\"\\\\\"then escaped=true elseif quote then if char==quote then quote=nil else current[#current+1]=char end elseif char==\"\\\"\"or char==\"'\"then quote=char elseif char:match(\"%s\")then if#current>0 then out[#out+1],current=table.concat(current),{}end else current[#current+1]=char end end if quote then return nil,\"unterminated quoted value\"end if escaped then current[#current+1]=\"\\\\\"end if#current>0 then out[#out+1]=table.concat(current)end return out end M.parse=words local function action(name,payload)payload=payload or{}payload.action=name return{kind=\"request\",request=payload}end function M.plan(argv)if type(argv)~=\"table\"or#argv==0 then return{kind=\"noop\"}end local command,sub=tostring(argv[1]):lower(),tostring(argv[2]or\"\"):lower()if command==\"help\"then return{kind=\"help\"}end if command==\"clear\"then return{kind=\"clear\"}end if command==\"exit\"or command==\"quit\"then return{kind=\"exit\"}end if command==\"status\"then return action(\"server_status\")end if command==\"peers\"then return action(\"network_status\")end if command==\"routes\"then return action(\"route_status\",{target=argv[2]})end if command==\"users\"then return{kind=\"users\"}end if command==\"audit\"then return{kind=\"audit\"}end if command==\"discover\"then if sub==\"status\"then return action(\"network_status\")end if sub==\"cancel\"then return action(\"discovery_cancel\")end if sub==\"confirm\"then return action(\"discovery_confirm\")end if sub==\"join\"then if not argv[3]then return nil,\"use: discover join <phrase>\"end return action(\"discovery_join\",{phrase=argv[3]})end if sub==\"start\"then if not argv[3]then return nil,\"use: discover start <phrase> [peer|master] [initiator|joiner]\"end local mode=tostring(argv[4]or\"peer\"):lower()if mode~=\"peer\"and mode~=\"master\"then return nil,\"discovery mode must be peer or master\"end local master=tostring(argv[5]or\"initiator\"):lower()if master~=\"initiator\"and master~=\"joiner\"then return nil,\"master side must be initiator or joiner\"end return action(\"discovery_start\",{phrase=argv[3],mode=mode,master=master})end return nil,\"use: discover status|start|join|confirm|cancel\"end if command==\"update\"then if sub==\"\"or sub==\"status\"then return action(\"update_status\")end if sub==\"check\"then return action(\"update_check\")end if sub==\"offers\"then return action(\"update_offers\")end if sub==\"download\"and argv[3]then return action(\"update_download\",{source=argv[3]})end if sub==\"latest\"then return action(\"update_install_latest\")end if sub==\"cancel\"then return action(\"update_cancel\")end if sub==\"clear-cache\"then return action(\"update_clear_cache\")end if sub==\"apply\"then if tostring(argv[3]or\"\")~=\"CONFIRM\"then return nil,\"use: update apply CONFIRM\"end return action(\"update_apply\")end return nil,\"use: update status|check|offers|download <source>|latest|cancel|clear-cache|apply CONFIRM\"end if command==\"wget\"then if sub==\"run\"and(argv[3]==nil or tostring(argv[3]):lower()==\"ceetos\"or tostring(argv[3]):lower()==\"latest\")then return action(\"update_install_latest\")end return nil,\"protected server wget supports only: wget run [ceetos|latest]\"end return nil,\"unknown protected-server command; type help\"end function M.completions(line)line=tostring(line or\"\")if line:find(\"%s\")then return{}end local prefix,out=line:lower(),{}for _,word in ipairs(ROOT)do if word:sub(1,#prefix)==prefix then out[#out+1]=word end end return out end local function bool(value)return value and\"yes\"or\"no\"end function M.format(kind,result)local rows={}if kind==\"help\"then return{\"Protected server commands:\",\"status | peers | routes [node] | users | audit\",\"discover status|start <phrase>|join <phrase>|confirm|cancel\",\"update status|check|offers|download <source>|latest|cancel|clear-cache|apply CONFIRM\",\"wget run [ceetos|latest] downloads the latest verified matching-profile release.\",\"Quote pairing phrases containing spaces. Commands run through the server service; arbitrary CraftOS commands are intentionally denied.\",}elseif kind==\"users\"then for _,user in ipairs(result or{})do rows[#rows+1]=tostring(user.name)..\"\\t\"..tostring(user.role)..(user.disabled and\"\\tdisabled\"or\"\")end return#rows>0 and rows or{\"No accounts are visible.\"}elseif kind==\"audit\"then for _,entry in ipairs(result or{})do rows[#rows+1]=tostring(entry.actor or\"system\")..\"\\t\"..tostring(entry.action or entry.kind or\"event\")end return#rows>0 and rows or{\"No recent audit entries.\"}elseif kind==\"routes\"then for _,route in ipairs(result or{})do rows[#rows+1]=tostring(route.id)..\" via \"..tostring(route.next)..\" | \"..tostring(route.hops)..\" hop | \"..tostring(route.health or\"unknown\")end return#rows>0 and rows or{\"No usable routes.\"}end local server=type(result)==\"table\"and(result.network and result or nil)or nil local network=server and server.network or result if type(network)==\"table\"and(network.transport or network.peers or network.discovery)then local transport,discovery=network.transport or{},network.discovery or{}if server then rows[#rows+1]=\"Profile: \"..tostring(server.profile)..\" | Version: \"..tostring(server.version)end rows[#rows+1]=\"Wireless: \"..bool(transport.wireless)..\" | links: \"..tostring(transport.wirelessLinkCount or 0)rows[#rows+1]=\"Peers: \"..tostring(#(network.peers or{}))..\" | controller: \"..tostring(network.controller or\"-\")rows[#rows+1]=\"Discovery: \"..tostring(discovery.state or\"inactive\")..(discovery.active and\" (active)\"or\"\")return rows end if type(result)==\"table\"and result.status then rows[#rows+1]=\"Update: \"..tostring(result.status)..\" | running \"..tostring(result.version or\"?\")if result.message then rows[#rows+1]=tostring(result.message)end if result.cache then rows[#rows+1]=\"Cached: \"..tostring(result.cache.version)..\" \"..tostring(result.cache.fingerprint or\"\")end return rows end if type(result)==\"table\"then for _,item in ipairs(result)do rows[#rows+1]=tostring(item.version or item.id or item)end return#rows>0 and rows or{\"OK\"}end return{tostring(result==nil and\"OK\"or result)}end return M",
  ["ceetos/lib/recipe_service.lua"] = "local store=require(\"ceetos.lib.store\")local crafting=require(\"ceetos.lib.crafting\")local recipeDb=require(\"ceetos.lib.recipe_db\")local M={}local OVERLAY=\"/ceetos/data/recipes.lua\"local CATALOGUE_CACHE_LIMIT=24 local cache={loaded=false,recipes=nil,tags=nil,overlay=nil,overlayRaw=nil,overlaySignature=\"none\",error=nil,recipeCount=0,overlayCount=0,revision=0,loads=0,hits=0,invalidations=0,lastInvalidation=\"startup\",catalogue={},catalogueOrder={},catalogueHits=0,catalogueMisses=0,}local function countRows(rows)local count=0 for _ in pairs(rows or{})do count=count+1 end return count end local function fingerprint(raw)if raw==false then return\"none\"end local left,right=1,0 for index=1,#raw do left=(left+raw:byte(index))%65521 right=(right+left)%65521 end return tostring(#raw)..\":\"..string.format(\"%04x%04x\",right,left)end local function readOverlaySource()if not fs.exists(OVERLAY)then return false end local handle=fs.open(OVERLAY,\"r\")if not handle then return nil,\"could not read recipe overlay\"end local raw=handle.readAll()handle.close()if type(raw)~=\"string\"or#raw>crafting.RECIPE_PACK_MAX_BYTES then return nil,\"recipe overlay exceeds the 64 KiB import limit\"end return raw end local function clearCatalogue()cache.catalogue,cache.catalogueOrder={},{}end local function invalidate(reason)cache.loaded,cache.recipes,cache.tags,cache.overlay=false,nil,nil,nil cache.error,cache.recipeCount,cache.overlayCount=nil,0,0 cache.overlayRaw,cache.overlaySignature=nil,\"none\"cache.revision,cache.invalidations=cache.revision+1,cache.invalidations+1 cache.lastInvalidation=tostring(reason or\"manual\"):sub(1,48)clearCatalogue()end function M.invalidate(reason)invalidate(reason or\"manual\")return true end local function effective()local raw,readErr=readOverlaySource()if raw==nil then return nil,nil,readErr end if cache.loaded and raw==cache.overlayRaw then cache.hits=cache.hits+1 return cache.recipes,cache.tags,nil,cache.overlay end if cache.error and raw==cache.overlayRaw then cache.hits=cache.hits+1 return nil,nil,cache.error end local overlay={recipes={},tags={}}if raw~=false then local parsed,parseErr=crafting.parseRecipeOverlay(raw)if not parsed then cache.loaded,cache.error,cache.overlayRaw=false,parseErr,raw cache.overlaySignature,cache.revision=fingerprint(raw),cache.revision+1 clearCatalogue()return nil,nil,parseErr end overlay=parsed end local base,databaseOrErr=recipeDb.loadBase()if not base then return nil,nil,databaseOrErr end cache.recipes=recipeDb.mergeOverlay(base,overlay.recipes)cache.tags=recipeDb.mergeTags(databaseOrErr.tags,overlay.tags)cache.overlay,cache.overlayRaw=overlay,raw cache.overlaySignature,cache.error=fingerprint(raw),nil cache.recipeCount,cache.overlayCount=countRows(cache.recipes),countRows(overlay.recipes)cache.loaded,cache.loads,cache.revision=true,cache.loads+1,cache.revision+1 clearCatalogue()return cache.recipes,cache.tags,nil,cache.overlay end function M.status()local recipes,_,err,overlay=effective()return{available=recipes~=nil,recipes=recipes and cache.recipeCount or 0,overlay=overlay and cache.overlayCount or 0,error=err,cache={revision=cache.revision,loaded=cache.loaded,loads=cache.loads,hits=cache.hits,invalidations=cache.invalidations,lastInvalidation=cache.lastInvalidation,overlay=cache.overlaySignature,catalogue={entries=#cache.catalogueOrder,limit=CATALOGUE_CACHE_LIMIT,hits=cache.catalogueHits,misses=cache.catalogueMisses},base=recipeDb.cacheStatus and recipeDb.cacheStatus()or nil,},}end function M.plan(item,quantity,stock,tagChoices)if type(item)~=\"string\"or#item>128 or tonumber(quantity)==nil or quantity<1 or quantity>256 then return nil,\"invalid recipe plan request\"end local count=0 for _,row in pairs(type(stock)==\"table\"and stock or{})do count=count+1 if count>512 or type(row)~=\"table\"or type(row.name or row.id)~=\"string\"then return nil,\"invalid stock snapshot\"end end local recipes,tags,err=effective()if not recipes then return nil,err end local plan,planErr=crafting.plan(recipes,stock,item,math.floor(quantity),{forceRoot=true,tags=tags,tagChoices=tagChoices})if not plan or#plan>96 then return nil,planErr or\"recipe plan exceeds limit\"end local encoded=textutils.serialise(plan,{compact=true})if#encoded>12*1024 then return nil,\"recipe plan exceeds reply limit\"end return plan end function M.catalog(query,limit,offset)query=tostring(query or\"\"):lower()if#query>64 or query:find(\"[%c]\")then return nil,\"invalid recipe search\"end limit=math.max(1,math.min(64,math.floor(tonumber(limit)or 48)))offset=math.max(0,math.min(65536,math.floor(tonumber(offset)or 0)))local recipes,_,err=effective()if not recipes then return nil,err end local key=query..\"\\0\"..tostring(limit)..\"\\0\"..tostring(offset)local cached=cache.catalogue[key]if cached and cached.revision==cache.revision then cache.catalogueHits=cache.catalogueHits+1 local rows={}for index,row in ipairs(cached.rows)do local tags={}for tagIndex,tag in ipairs(row.tags or{})do tags[tagIndex]=tag end rows[index]={name=row.name,tags=tags}end return{rows=rows,total=cached.total,offset=cached.offset,truncated=cached.truncated}end cache.catalogueMisses=cache.catalogueMisses+1 local names={}for name in pairs(recipes)do local short=crafting.displayName(name):lower()if query==\"\"or name:lower():find(query,1,true)or short:find(query,1,true)then names[#names+1]=name end end table.sort(names)local rows={}for index=offset+1,math.min(#names,offset+limit)do local name=names[index]rows[#rows+1]={name=name,tags=crafting.recipeTagReferences(recipes[name])}end while#rows>1 and#textutils.serialise({rows=rows,total=#names,offset=offset},{compact=true})>6*1024 do table.remove(rows)end local result={rows=rows,total=#names,offset=offset,truncated=offset+#rows<#names}cache.catalogue[key]={revision=cache.revision,rows=rows,total=result.total,offset=result.offset,truncated=result.truncated}cache.catalogueOrder[#cache.catalogueOrder+1]=key while#cache.catalogueOrder>CATALOGUE_CACHE_LIMIT do cache.catalogue[table.remove(cache.catalogueOrder,1)]=nil end return result end function M.tagOptions(item,stock)local count=0 for _,row in pairs(type(stock)==\"table\"and stock or{})do count=count+1 if count>512 or type(row)~=\"table\"or type(row.name or row.id)~=\"string\"then return nil,\"invalid stock snapshot\"end end local recipes,tags,err=effective()if not recipes then return nil,err end local options,optionsErr=crafting.recipeTagOptions(recipes,tags,item,stock)if not options then return nil,optionsErr end for _,tag in ipairs(options.tags)do while#tag.options>1 and#textutils.serialise(options,{compact=true})>10*1024 do table.remove(tag.options)end end if#textutils.serialise(options,{compact=true})>10*1024 then return nil,\"tag choices exceed reply limit\"end return options end function M.handle(packet,net)local body=type(packet.body)==\"table\"and packet.body or{}if packet.type==\"recipe_plan_request\"then local plan,err=M.plan(body.item,body.quantity,body.stock,body.tagChoices)net.reply(packet,\"recipe_plan_result\",{request_id=body.request_id,ok=plan~=nil,result=plan or err},{safe=true})return true elseif packet.type==\"recipe_catalog_request\"then local result,err=M.catalog(body.query,body.limit,body.offset)local replied,replyErr=net.reply(packet,\"recipe_catalog_result\",{request_id=body.request_id,ok=result~=nil,result=result or err},{safe=true})return replied,replyErr elseif packet.type==\"recipe_tag_options_request\"then local result,err=M.tagOptions(body.item,body.stock)net.reply(packet,\"recipe_tag_options_result\",{request_id=body.request_id,ok=result~=nil,result=result or err},{safe=true})return true end return false end function M.import(raw)if type(raw)~=\"string\"or#raw>crafting.RECIPE_PACK_MAX_BYTES then return false,\"recipe pack is too large\"end local pack,err=crafting.parseRecipePack(raw)if not pack then return false,err end local valid,validateErr=crafting.validateRecipes(pack.recipes)if not valid then return false,validateErr end local effectiveRecipes,_,loadErr,overlay=effective()if loadErr then return false,loadErr end local review,reviewErr=crafting.reviewRecipePack(effectiveRecipes,pack.recipes)if not review then return false,reviewErr end local merged,importedOrErr,tags=crafting.mergeRecipePack(overlay.recipes,review,overlay.tags,pack.tags)if not merged then return false,importedOrErr end local saved,saveErr=crafting.writeRecipeFile(OVERLAY,merged,tags)if not saved then return false,saveErr end invalidate(\"import\")return true,{imported=importedOrErr,counts=review.counts}end function M.exportOverlay()local _,_,err,overlay=effective()if not overlay then return nil,err end return{schema=1,recipes=overlay.recipes or{},tags=overlay.tags or{}}end function M.replaceOverlay(overlay)if type(overlay)~=\"table\"or type(overlay.recipes)~=\"table\"or type(overlay.tags)~=\"table\"then return false,\"invalid cloud recipe overlay\"end local valid,validationErr=crafting.validateRecipes(overlay.recipes)if not valid then return false,validationErr end local tags=recipeDb.mergeTags({},overlay.tags)local graphOk,graphErr=crafting.validateRecipeGraph(overlay.recipes,tags)if not graphOk then return false,graphErr end local saved,saveErr=crafting.writeRecipeFile(OVERLAY,overlay.recipes,tags)if saved then invalidate(\"replaceOverlay\")end return saved,saveErr end return M",
}
local CEETOS_RELEASE_INSTALLER = true
local CEETOS_PROFILE = "recipe-server"
local CEETOS_VERSION = "0.19.53"
local CEETOS_DEV_BRIDGE_URL = nil

-- `wget --install` may run inside a deliberately restricted CeetShell child
-- environment. Self-cleaning is optional there: never require the shell API
-- merely to install the runtime.
local args = { ... }
local automated = args[1] == "--ceetos-apply"
local self = shell and shell.getRunningProgram and shell.getRunningProgram()
local cache = "/ceetos-updates/release.lua"
-- A signed release launched directly is retained outside the replaceable
-- runtime tree for verified recovery. Development installers deliberately do
-- not become propagation sources. Do this before removing the downloaded
-- program itself, but avoid copying the cache onto itself during recovery.
if CEETOS_RELEASE_INSTALLER and not automated and self and fs.exists(self) and self ~= cache then
  if not fs.exists("/ceetos-updates") then fs.makeDir("/ceetos-updates") end
  if fs.exists(cache) then fs.delete(cache) end
  pcall(fs.copy, self, cache)
end
if self and self ~= cache and fs.exists(self) then pcall(fs.delete, self) end

local bytes = 0
local fileCount = 0
for _, contents in pairs(files) do bytes = bytes + #contents; fileCount = fileCount + 1 end
print("CeetOS " .. CEETOS_PROFILE .. " v" .. CEETOS_VERSION .. " installer (" .. bytes .. " bytes)")
if not automated then
  print("This will replace /ceetos and /startup.lua. Continue? [y/N]")
  if read():lower() ~= "y" then print("Cancelled."); return end
end

local backup, migrate, migrationData = nil, false, {}
-- A signed release must remain independently installable. Broker enrollment
-- is an optional post-install Cloud setup path, never a prerequisite for a
-- fresh offline/public `wget` installation.
-- Clean stale full-tree backups from older installers before measuring space.
for _, name in ipairs(fs.list(".")) do
  if name:match("^ceetos%.backup") or name == "ceetos-migrate" then fs.delete(name) end
end
-- Development transactions can be much larger than the runtime. Preserve
-- only the reconnect record; staged payloads, test data, and rollback trees
-- are disposable and must not prevent an install from starting.
for _, name in ipairs({ "staging", "backups", "test-data" }) do
  local path = fs.combine("ceetos-dev", name)
  if fs.exists(path) then fs.delete(path) end
end
local hadRuntime = fs.exists("ceetos")
-- A fresh computer has no old runtime whose removal can make room. Check the
-- actual free space before touching its filesystem: `getCapacity` is only a
-- limit and does not prove that the writable mount has space left.
local free = fs.getFreeSpace("/")
local reserve = 8192 + fileCount * 1024
local required = bytes + reserve
if not hadRuntime and type(free) == "number" and free < required then
  printError("Not enough free space for CeetOS: " .. tostring(free) .. " bytes free; approximately " .. tostring(required) .. " bytes required.")
  return
end
if hadRuntime then
  if automated then migrate = true else
    print("Migrate saved CeetOS configuration? [Y/n]")
    local choice = read():lower()
    migrate = choice ~= "n" and choice ~= "no"
  end
  -- Copy only durable configuration to a small migration area, then remove
  -- the old tree before writing the new one. This works on nearly-full CC
  -- drives where retaining a complete backup would make installation fail.
  if migrate then
    local durable = { "users.lua", "network.lua", "shares.lua", "config.lua", "owner-service.lua", "seen-peers.lua", "jobs.lua", "job-workers.lua", "crafting-state.lua", "auth-authority.lua", "auth-authority-state.lua", "auth-directory.lua", "auth-session.lua", "cloud.lua", "cloud-state.lua" }
    if CEETOS_PROFILE == "recipe-server" then durable[#durable + 1] = "recipes.lua" end
    for _, name in ipairs(durable) do
      local source = fs.combine("ceetos/data", name)
      if fs.exists(source) then
        local input = fs.open(source, "r")
        if input then migrationData[name] = input.readAll(); input.close() end
      end
    end
  end
  fs.delete("ceetos")
end

local writingPath = nil
local wrote, writeErr = pcall(function()
  for path, contents in pairs(files) do
    writingPath = path
    local parent = fs.getDir(path)
    if parent ~= "" and not fs.exists(parent) then fs.makeDir(parent) end
    local handle = assert(fs.open(path, "w"))
    handle.write(contents)
    handle.close()
  end
end)
if not wrote then
  -- Fresh installs have no previous runtime to preserve. Remove incomplete
  -- output so a retry starts from a known-empty CeetOS tree.
  if not hadRuntime and fs.exists("ceetos") then fs.delete("ceetos") end
  printError("CeetOS installation failed while writing " .. tostring(writingPath or "installer data") .. ": " .. tostring(writeErr) .. ". Started with " .. tostring(free) .. " bytes free; needs approximately " .. tostring(required) .. " bytes.")
  return
end

-- Installing a profile is an explicit local conversion. A previous desktop
-- runtime may have left a durable profile override behind; if it wins over
-- the freshly installed declaration, a Recipe/Router/Auth Server would boot
-- and register with CeetDev as a desktop. Do not migrate that override:
-- replace it with the profile bound into this installer before startup.
if not fs.exists("ceetos/data") then fs.makeDir("ceetos/data") end
local profileOutput = assert(fs.open("ceetos/data/profile.lua", "w"))
profileOutput.write(textutils.serialise({ schema = 1, id = CEETOS_PROFILE, installedAt = os.epoch("utc") }))
profileOutput.close()

if migrate then
  -- Preserve durable configuration, but never preserve an active session,
  -- temporary recovery window, remote result cache, or stale audit entries.
  local durable = { "users.lua", "network.lua", "shares.lua", "config.lua", "owner-service.lua", "seen-peers.lua", "jobs.lua", "job-workers.lua", "crafting-state.lua", "auth-authority.lua", "auth-authority-state.lua", "auth-directory.lua", "auth-session.lua", "cloud.lua", "cloud-state.lua" }
  if CEETOS_PROFILE == "recipe-server" then durable[#durable + 1] = "recipes.lua" end
  for _, name in ipairs(durable) do
    local contents = migrationData[name]
    if contents then
      if not fs.exists("ceetos/data") then fs.makeDir("ceetos/data") end
      local output = assert(fs.open(fs.combine("ceetos/data", name), "w"))
      output.write(contents); output.close()
    end
  end
  print("Saved CeetOS configuration migrated. Please log in again.")
end

-- A DevBuild downloaded from this loopback bridge is an explicit local
-- developer action. Persist a short-lived, tokenless local connection so the
-- newly installed runtime registers after first boot without requiring a
-- second `ceetdev ws://...` command. Release installers and standalone
-- DevBuild artifacts deliberately have no embedded bridge URL.
local function localLoopback(url)
  return type(url) == "string" and (url:match("^ws://127%.0%.0%.1[:/]") or url:match("^ws://localhost[:/]") or url:match("^ws://%[::1%][:/]"))
end
local function writeValue(path, value)
  local parent, temporary = fs.getDir(path), path .. ".tmp"
  if parent ~= "" and not fs.exists(parent) then fs.makeDir(parent) end
  if fs.exists(temporary) then fs.delete(temporary) end
  local output = assert(fs.open(temporary, "w")); output.write(textutils.serialise(value)); output.close()
  if fs.exists(path) then fs.delete(path) end
  fs.move(temporary, path)
end
if not CEETOS_RELEASE_INSTALLER and localLoopback(CEETOS_DEV_BRIDGE_URL) then
  local existing = nil
  if fs.exists("/ceetos-dev/connection.lua") then
    local input = fs.open("/ceetos-dev/connection.lua", "r")
    if input then existing = textutils.unserialise(input.readAll()); input.close() end
  end
  -- Never replace an explicitly configured LAN/token bridge. A local
  -- loopback configuration is safe to refresh because it is bound to this
  -- same workstation and contains no credential.
  if type(existing) ~= "table" or localLoopback(existing.url) then
    writeValue("/ceetos-dev/connection.lua", { url = CEETOS_DEV_BRIDGE_URL, token = "", auth = "none", source = "devbuild-installer", autoConnect = true })
    writeValue("/ceetos-dev/recovery/developer-mode.lua", { schema = 1, enabledAt = os.epoch("utc"), untilAt = os.epoch("utc") + 8 * 60 * 60 * 1000, source = "local-installer" })
    print("Local DevBridge auto-connect enabled for this DevBuild.")
  end
end

-- The installer is intentionally transactional while it runs, but retaining
-- a full tree backup after a successful install quickly exhausts small CC
-- drives. Durable data has already been copied, so remove the old tree.
if automated then
  -- The root startup launcher sees this marker and boots the freshly written
  -- runtime rather than replaying the installer. The runtime verifies its
  -- loaded version before clearing it.
  if not fs.exists("/ceetos-updates") then fs.makeDir("/ceetos-updates") end
  local marker = fs.open("/ceetos-updates/pending.lua", "w")
  if marker then marker.write("return {state='verify',version=" .. "0.19.53" .. ",profile=" .. "\"recipe-server\"" .. "}"); marker.close() end
  print("CeetOS installed. Rebooting to verify the update.")
  os.reboot()
end
print("CeetOS installed. Reboot to start it.")

-- CEETOS_RELEASE_PAYLOAD_END
