getprop("ro.product.device") == "apollo" || abort("E3004: This package is for \"apollo\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Redmi/apollo/apollo:11/RKQ1.200826.002/V12.1.1.0.RJDCNXM:user/release-keys");
ui_print("Target: Redmi/apollo/apollo:11/RKQ1.200826.002/V12.1.2.0.RJDCNXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Redmi/apollo/apollo:11/RKQ1.200826.002/V12.1.1.0.RJDCNXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Redmi/apollo/apollo:11/RKQ1.200826.002/V12.1.2.0.RJDCNXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Redmi/apollo/apollo:11/RKQ1.200826.002/V12.1.1.0.RJDCNXM:user/release-keys or Redmi/apollo/apollo:11/RKQ1.200826.002/V12.1.2.0.RJDCNXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:6ccfaa4e88c658f9f71bb28b1106470bfeca7733"),
                      concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:88b261efe671673777a20714f9e63abcadf325bf")) ||
    abort(concat("E3005: \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:6ccfaa4e88c658f9f71bb28b1106470bfeca7733"),"\" or \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:88b261efe671673777a20714f9e63abcadf325bf"),"\" has unexpected contents."));
apply_patch_space(134217728) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1(map_partition("system"), "20,1,31,41,51,53,57,1990,1991,2016,2017,2051,851972,851983,884739,884753,908134,910874,925307,925498,925499") == "8aba6db97468bd63a2c2f00b43f5dd8f7c0d5ac0" || block_image_verify(map_partition("system"), package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat")) then
ui_print("Verified system image...");
else
check_first_block(map_partition("system"));
ifelse (block_image_recover(map_partition("system"), "20,1,31,41,51,53,57,1990,1991,2016,2017,2051,851972,851983,884739,884753,908134,910874,925307,925498,925499") && block_image_verify(map_partition("system"), package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat"), ui_print("system recovered successfully."), abort("E1004: system partition fails to recover"));
endif;
if (range_sha1(map_partition("vendor"), "648,1,26,36,40,45,46,124,132,138,139,1813,1817,2294,2295,2300,2304,2308,2309,2315,2321,2322,2323,2328,2329,2573,2577,2582,2583,2585,2589,7684,7685,8360,8361,12137,12138,12140,12141,12230,12231,20252,20254,20257,20258,20268,20269,20271,20272,20295,20296,20332,20336,20386,20387,20522,20523,20526,20532,20533,20534,20537,20538,20543,20544,22201,22202,25372,25373,25815,25816,32768,32787,34703,34704,34839,34840,35795,35797,35798,35799,35801,35804,35805,35806,35808,35810,35811,35812,35814,35816,35817,35818,35820,35822,35823,35824,35826,35828,35829,35830,35832,35834,35839,35841,35844,35846,35849,35851,35859,35861,35864,35866,35867,35868,35870,35872,35873,35874,35877,35879,35880,35881,35883,35885,35886,35887,35889,35891,35892,35893,35895,35897,35898,35899,35901,35903,35904,35905,35914,35915,35934,35935,35936,35937,35941,35942,35943,35944,35947,35948,35949,35950,35953,35954,35955,35956,35959,35960,35961,35962,35966,35967,35968,35969,35972,35973,35974,35975,35979,35980,35984,35985,35989,35990,35994,35995,35999,36000,36001,36002,36011,36012,36013,36014,36017,36018,36019,36020,36023,36024,36025,36026,36029,36030,36031,36032,36034,36036,36328,36329,36444,36445,37494,37500,65536,65557,78933,78934,79562,79564,84451,85007,85008,85146,85616,85617,91043,91044,93499,93500,94800,94801,94803,94804,94856,94857,98304,98323,122074,122075,129123,129124,129229,129230,129231,129232,129730,129732,129737,129739,129745,129747,129752,129754,129813,129815,130035,130040,130133,130134,131072,131089,134284,134285,138517,138519,138567,138568,143277,143279,143939,143940,144033,144034,147563,147564,148180,148181,149908,149909,163840,163859,165299,165300,165313,165314,165318,165320,165337,165338,165373,165374,165383,165384,165527,165528,165578,165579,165585,165586,166291,166292,166302,166303,168642,168643,168668,168669,168704,168705,168813,168814,168921,168922,169398,169399,173628,173629,173643,173644,173697,173698,173765,173766,173768,173770,173834,173835,173905,173906,173973,173974,173976,173977,173979,173980,174039,174041,174043,174044,174108,174109,174179,174180,174247,174248,174250,174251,174253,174259,174261,174262,174264,174266,174268,174279,174339,174340,174342,174343,174353,174354,174420,174421,174498,174499,174509,174510,174576,174577,174653,174654,174733,174734,174810,174811,174887,174888,174964,174965,174975,174976,174979,174980,175043,175044,175119,175120,175130,175131,175197,175198,175274,175275,175347,175348,175350,175351,175363,175369,175428,175429,175431,175433,175499,175500,175502,175503,175506,175507,175572,175573,175575,175576,175648,175649,175651,175652,175725,175726,175728,175729,175797,175798,175800,175801,175871,175872,175946,175947,175949,175950,176015,176016,176018,176019,176085,176086,176088,176089,176157,176158,176160,176161,176226,176227,176229,176230,176299,176300,176302,176304,176372,176373,176375,176376,176447,176448,176450,176451,176514,176515,176517,176518,176586,176587,176589,176590,176656,176657,176659,176660,176730,176731,176733,176734,176797,176798,176800,176801,176865,176866,176868,176869,176934,176935,177013,177014,177090,177091,177167,177168,177170,177171,177234,177235,177237,177238,177302,177303,177305,177306,177369,177370,177372,177373,177437,177438,177505,177506,177573,177574,177575,177576,177643,177644,177713,177714,177782,177783,177850,177851,177920,177921,177985,177986,177988,177989,178055,178056,178058,178059,178127,178128,178130,178131,178200,178201,178203,178204,178275,178276,178278,178279,178348,178349,178351,178352,178425,178426,178427,178428,178435,178436,178500,178501,178502,178503,178577,178578,178580,178581,178650,178651,178653,178654,178749,178750,178762,178763,179239,179241,179293,179294,179410,179411,179413,179414,179571,179572,182701,182702,182703,182704,182755,182756,183171,183172,183181,183182,183207,183208,183310,183311,183424,183425,183830,183831,183892,183893,184032,184033,184154,184155,184223,184224,184409,184410,184525,184526,184571,184572,184790,184791,184832,184833,184870,184871,185048,185049,185182,185183,185353,185354,185566,185567,185678,185679,185733,185734,185784,185785,185883,185884,185970,185971,185972,185973,186078,186079,186107,186108,186157,186159,186166,186168,186169,186170,186177,186178,186721,458767,458769,484456,485927,493628,493738,493739") == "abc5bd68f252dc52a260a99520546a0df7db5bfc" || block_image_verify(map_partition("vendor"), package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat")) then
ui_print("Verified vendor image...");
else
check_first_block(map_partition("vendor"));
ifelse (block_image_recover(map_partition("vendor"), "648,1,26,36,40,45,46,124,132,138,139,1813,1817,2294,2295,2300,2304,2308,2309,2315,2321,2322,2323,2328,2329,2573,2577,2582,2583,2585,2589,7684,7685,8360,8361,12137,12138,12140,12141,12230,12231,20252,20254,20257,20258,20268,20269,20271,20272,20295,20296,20332,20336,20386,20387,20522,20523,20526,20532,20533,20534,20537,20538,20543,20544,22201,22202,25372,25373,25815,25816,32768,32787,34703,34704,34839,34840,35795,35797,35798,35799,35801,35804,35805,35806,35808,35810,35811,35812,35814,35816,35817,35818,35820,35822,35823,35824,35826,35828,35829,35830,35832,35834,35839,35841,35844,35846,35849,35851,35859,35861,35864,35866,35867,35868,35870,35872,35873,35874,35877,35879,35880,35881,35883,35885,35886,35887,35889,35891,35892,35893,35895,35897,35898,35899,35901,35903,35904,35905,35914,35915,35934,35935,35936,35937,35941,35942,35943,35944,35947,35948,35949,35950,35953,35954,35955,35956,35959,35960,35961,35962,35966,35967,35968,35969,35972,35973,35974,35975,35979,35980,35984,35985,35989,35990,35994,35995,35999,36000,36001,36002,36011,36012,36013,36014,36017,36018,36019,36020,36023,36024,36025,36026,36029,36030,36031,36032,36034,36036,36328,36329,36444,36445,37494,37500,65536,65557,78933,78934,79562,79564,84451,85007,85008,85146,85616,85617,91043,91044,93499,93500,94800,94801,94803,94804,94856,94857,98304,98323,122074,122075,129123,129124,129229,129230,129231,129232,129730,129732,129737,129739,129745,129747,129752,129754,129813,129815,130035,130040,130133,130134,131072,131089,134284,134285,138517,138519,138567,138568,143277,143279,143939,143940,144033,144034,147563,147564,148180,148181,149908,149909,163840,163859,165299,165300,165313,165314,165318,165320,165337,165338,165373,165374,165383,165384,165527,165528,165578,165579,165585,165586,166291,166292,166302,166303,168642,168643,168668,168669,168704,168705,168813,168814,168921,168922,169398,169399,173628,173629,173643,173644,173697,173698,173765,173766,173768,173770,173834,173835,173905,173906,173973,173974,173976,173977,173979,173980,174039,174041,174043,174044,174108,174109,174179,174180,174247,174248,174250,174251,174253,174259,174261,174262,174264,174266,174268,174279,174339,174340,174342,174343,174353,174354,174420,174421,174498,174499,174509,174510,174576,174577,174653,174654,174733,174734,174810,174811,174887,174888,174964,174965,174975,174976,174979,174980,175043,175044,175119,175120,175130,175131,175197,175198,175274,175275,175347,175348,175350,175351,175363,175369,175428,175429,175431,175433,175499,175500,175502,175503,175506,175507,175572,175573,175575,175576,175648,175649,175651,175652,175725,175726,175728,175729,175797,175798,175800,175801,175871,175872,175946,175947,175949,175950,176015,176016,176018,176019,176085,176086,176088,176089,176157,176158,176160,176161,176226,176227,176229,176230,176299,176300,176302,176304,176372,176373,176375,176376,176447,176448,176450,176451,176514,176515,176517,176518,176586,176587,176589,176590,176656,176657,176659,176660,176730,176731,176733,176734,176797,176798,176800,176801,176865,176866,176868,176869,176934,176935,177013,177014,177090,177091,177167,177168,177170,177171,177234,177235,177237,177238,177302,177303,177305,177306,177369,177370,177372,177373,177437,177438,177505,177506,177573,177574,177575,177576,177643,177644,177713,177714,177782,177783,177850,177851,177920,177921,177985,177986,177988,177989,178055,178056,178058,178059,178127,178128,178130,178131,178200,178201,178203,178204,178275,178276,178278,178279,178348,178349,178351,178352,178425,178426,178427,178428,178435,178436,178500,178501,178502,178503,178577,178578,178580,178581,178650,178651,178653,178654,178749,178750,178762,178763,179239,179241,179293,179294,179410,179411,179413,179414,179571,179572,182701,182702,182703,182704,182755,182756,183171,183172,183181,183182,183207,183208,183310,183311,183424,183425,183830,183831,183892,183893,184032,184033,184154,184155,184223,184224,184409,184410,184525,184526,184571,184572,184790,184791,184832,184833,184870,184871,185048,185049,185182,185183,185353,185354,185566,185567,185678,185679,185733,185734,185784,185785,185883,185884,185970,185971,185972,185973,186078,186079,186107,186108,186157,186159,186166,186168,186169,186170,186177,186178,186721,458767,458769,484456,485927,493628,493738,493739") && block_image_verify(map_partition("vendor"), package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat"), ui_print("vendor recovered successfully."), abort("E2004: vendor partition fails to recover"));
endif;
if (range_sha1(map_partition("product"), "106,1,21,26,27,29,30,146,150,154,155,167,173,174,175,3115,3116,15392,15393,15448,15449,31995,31996,32768,32782,34472,34473,38355,38356,42213,42214,42217,42219,42382,42383,42384,42385,42387,42388,42403,42404,42407,42409,42410,42412,42430,42431,42437,42438,42476,42480,42484,42488,42489,42501,42916,42917,43288,43289,44774,44775,51796,51799,53729,53730,53732,53733,55720,55721,59797,59798,61371,61374,61572,61574,65536,65547,65548,65591,69086,69088,71239,71240,71243,71244,71846,71850,71896,71897,72178,72179,74065,74067,75736,75737,77480,77484,77577,77578,77627,77628,78265,78269,78520,79767,79799,79800") == "3db504b48079c35a6398b8b6828f876beaff3d1d" || block_image_verify(map_partition("product"), package_extract_file("product.transfer.list"), "product.new.dat", "product.patch.dat")) then
ui_print("Verified product image...");
else
ifelse (block_image_recover(map_partition("product"), "106,1,21,26,27,29,30,146,150,154,155,167,173,174,175,3115,3116,15392,15393,15448,15449,31995,31996,32768,32782,34472,34473,38355,38356,42213,42214,42217,42219,42382,42383,42384,42385,42387,42388,42403,42404,42407,42409,42410,42412,42430,42431,42437,42438,42476,42480,42484,42488,42489,42501,42916,42917,43288,43289,44774,44775,51796,51799,53729,53730,53732,53733,55720,55721,59797,59798,61371,61374,61572,61574,65536,65547,65548,65591,69086,69088,71239,71240,71243,71244,71846,71850,71896,71897,72178,72179,74065,74067,75736,75737,77480,77484,77577,77578,77627,77628,78265,78269,78520,79767,79799,79800") && block_image_verify(map_partition("product"), package_extract_file("product.transfer.list"), "product.new.dat", "product.patch.dat"), ui_print("product recovered successfully."), abort("E2004: product partition fails to recover"));
endif;
if (range_sha1(map_partition("odm"), "12,1,6,2019,2025,2026,2027,2035,2036,32231,32745,32767,32768") == "05ef1d28903b5d8b932cd504be4de8c127488add" || block_image_verify(map_partition("odm"), package_extract_file("odm.transfer.list"), "odm.new.dat", "odm.patch.dat")) then
ui_print("Verified odm image...");
else
ifelse (block_image_recover(map_partition("odm"), "12,1,6,2019,2025,2026,2027,2035,2036,32231,32745,32767,32768") && block_image_verify(map_partition("odm"), package_extract_file("odm.transfer.list"), "odm.new.dat", "odm.patch.dat"), ui_print("odm recovered successfully."), abort("E2004: odm partition fails to recover"));
endif;
if (range_sha1(map_partition("system_ext"), "346,1,35,42,46,50,51,57,63,64,65,79,85,86,87,145,149,154,155,161,167,168,169,363,367,371,372,375,379,384,385,388,389,395,401,402,403,425,431,432,433,1144,1148,1166,1167,1171,1177,1178,1179,1181,1182,1193,1199,1200,1201,1211,1212,1217,1221,1225,1226,1230,1236,1240,1241,1248,1254,1255,1256,1268,1274,1275,1276,1278,1285,1291,1298,1303,1310,1340,1347,1366,1373,1391,1396,1413,1420,1436,1437,1532,1534,1537,1538,1550,1551,1552,1553,1554,1555,1563,1564,1587,1588,1631,1636,1639,1642,1645,1648,1651,1653,1657,1658,1662,1665,1670,1671,1674,1676,1756,1757,1758,1759,1767,1768,2152,2158,2163,2165,2170,2172,2176,2180,2181,2185,2186,2190,2191,2195,2196,2200,2201,2205,2206,2208,2215,2219,2220,2224,2225,2229,2230,2234,2235,2239,2240,2244,2245,2249,2250,2252,2253,2257,2258,2262,2263,2267,2268,2272,2273,2277,2278,2282,2283,2287,2288,2290,2294,2298,2299,2301,2302,2304,2305,2309,2310,2314,2315,2317,2318,2322,2323,2327,2328,2332,2333,2337,2338,2340,2341,2345,2346,2348,2352,2361,2366,2396,2399,2507,4938,4939,5073,5750,5997,5998,7599,7600,7658,7659,7797,7798,8107,8108,13289,13290,13362,13363,13371,13372,13507,13508,13512,13513,13566,13567,13577,13578,13611,13612,13631,13632,13684,13685,13830,13831,13906,13907,14053,14054,18804,18806,18945,18946,18971,18972,19068,19069,19120,19121,19132,19133,19183,19184,19259,19260,19323,19324,19586,19587,20091,20092,23966,23967,24023,24024,24448,24449,30418,31455,32273,32274,32768,32804,33220,33221,38247,38248,38438,38439,38757,38758,40818,40819,46475,46479,47254,47256,47315,47317,48901,48903,49573,49575,58934,58935,61229,61230,62383,62385,65536,65559,65562,65586,68707,68711,69016,69017,69699,69703,69719,69720,69747,69753,69754,69755,69783,69789,69793,69794,70587,70591,70614,70615,70622,70628,70629,70630,70908,70914,70923,70930,70954,70959,71184,72316,72345,72346") == "29701017fb13be59e0d9e9fbae02e6dae408972b" || block_image_verify(map_partition("system_ext"), package_extract_file("system_ext.transfer.list"), "system_ext.new.dat", "system_ext.patch.dat")) then
ui_print("Verified system_ext image...");
else
check_first_block(map_partition("system_ext"));
ifelse (block_image_recover(map_partition("system_ext"), "346,1,35,42,46,50,51,57,63,64,65,79,85,86,87,145,149,154,155,161,167,168,169,363,367,371,372,375,379,384,385,388,389,395,401,402,403,425,431,432,433,1144,1148,1166,1167,1171,1177,1178,1179,1181,1182,1193,1199,1200,1201,1211,1212,1217,1221,1225,1226,1230,1236,1240,1241,1248,1254,1255,1256,1268,1274,1275,1276,1278,1285,1291,1298,1303,1310,1340,1347,1366,1373,1391,1396,1413,1420,1436,1437,1532,1534,1537,1538,1550,1551,1552,1553,1554,1555,1563,1564,1587,1588,1631,1636,1639,1642,1645,1648,1651,1653,1657,1658,1662,1665,1670,1671,1674,1676,1756,1757,1758,1759,1767,1768,2152,2158,2163,2165,2170,2172,2176,2180,2181,2185,2186,2190,2191,2195,2196,2200,2201,2205,2206,2208,2215,2219,2220,2224,2225,2229,2230,2234,2235,2239,2240,2244,2245,2249,2250,2252,2253,2257,2258,2262,2263,2267,2268,2272,2273,2277,2278,2282,2283,2287,2288,2290,2294,2298,2299,2301,2302,2304,2305,2309,2310,2314,2315,2317,2318,2322,2323,2327,2328,2332,2333,2337,2338,2340,2341,2345,2346,2348,2352,2361,2366,2396,2399,2507,4938,4939,5073,5750,5997,5998,7599,7600,7658,7659,7797,7798,8107,8108,13289,13290,13362,13363,13371,13372,13507,13508,13512,13513,13566,13567,13577,13578,13611,13612,13631,13632,13684,13685,13830,13831,13906,13907,14053,14054,18804,18806,18945,18946,18971,18972,19068,19069,19120,19121,19132,19133,19183,19184,19259,19260,19323,19324,19586,19587,20091,20092,23966,23967,24023,24024,24448,24449,30418,31455,32273,32274,32768,32804,33220,33221,38247,38248,38438,38439,38757,38758,40818,40819,46475,46479,47254,47256,47315,47317,48901,48903,49573,49575,58934,58935,61229,61230,62383,62385,65536,65559,65562,65586,68707,68711,69016,69017,69699,69703,69719,69720,69747,69753,69754,69755,69783,69789,69793,69794,70587,70591,70614,70615,70622,70628,70629,70630,70908,70914,70923,70930,70954,70959,71184,72316,72345,72346") && block_image_verify(map_partition("system_ext"), package_extract_file("system_ext.transfer.list"), "system_ext.new.dat", "system_ext.patch.dat"), ui_print("system_ext recovered successfully."), abort("E2004: system_ext partition fails to recover"));
endif;

# ---- start making changes here ----


# ---- radio update tasks ----

ui_print("Patching firmware images...");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/abl");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/ablbak");

# --- Start patching dynamic partitions ---


# Patch partition vendor

ui_print("Patching vendor image after verification.");
show_progress(0.100000, 0);
block_image_update(map_partition("vendor"), package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat") ||
  abort("E2001: Failed to update vendor image.");

# Update dynamic partition metadata

assert(update_dynamic_partitions(package_extract_file("dynamic_partitions_op_list")));

# Patch partition system

ui_print("Patching system image after verification.");
show_progress(0.500000, 0);
block_image_update(map_partition("system"), package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat") ||
  abort("E1001: Failed to update system image.");

# Patch partition product

ui_print("Patching product image after verification.");
show_progress(0.100000, 0);
block_image_update(map_partition("product"), package_extract_file("product.transfer.list"), "product.new.dat", "product.patch.dat") ||
  abort("E2001: Failed to update product image.");

# Patch partition odm

ui_print("Patching odm image after verification.");
show_progress(0.100000, 0);
block_image_update(map_partition("odm"), package_extract_file("odm.transfer.list"), "odm.new.dat", "odm.patch.dat") ||
  abort("E2001: Failed to update odm image.");

# Patch partition system_ext

ui_print("Patching system_ext image after verification.");
show_progress(0.100000, 0);
block_image_update(map_partition("system_ext"), package_extract_file("system_ext.transfer.list"), "system_ext.new.dat", "system_ext.patch.dat") ||
  abort("E2001: Failed to update system_ext image.");

# --- End patching dynamic partitions ---

ui_print("Patching boot image...");
show_progress(0.100000, 10);
patch_partition(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:6ccfaa4e88c658f9f71bb28b1106470bfeca7733"),
                concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:88b261efe671673777a20714f9e63abcadf325bf"),
                package_extract_file("boot.img.p")) ||
    abort(concat(        "E3008: Failed to apply patch to ",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:88b261efe671673777a20714f9e63abcadf325bf")));

# ---- radio update tasks 2 ----

ui_print("Patching vbmeta dtbo logo binimages...");
package_extract_file("firmware-update/dtbo.img", "/dev/block/bootdevice/by-name/dtbo");
package_extract_file("firmware-update/vbmeta.img", "/dev/block/bootdevice/by-name/vbmeta");
package_extract_file("firmware-update/vbmeta_system.img", "/dev/block/bootdevice/by-name/vbmeta_system");

# ---- update tasks: exaid part 2----


package_extract_file("exaid.img", "/dev/block/bootdevice/by-name/exaid");
    
set_progress(1.000000);
