getprop("ro.product.device") == "cas" || abort("E3004: This package is for \"cas\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Xiaomi/cas/cas:12/RKQ1.211001.001/V13.0.1.0.SJJCNXM:user/release-keys");
ui_print("Target: Xiaomi/cas/cas:12/RKQ1.211001.001/V13.0.3.0.SJJCNXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/cas/cas:12/RKQ1.211001.001/V13.0.1.0.SJJCNXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/cas/cas:12/RKQ1.211001.001/V13.0.3.0.SJJCNXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/cas/cas:12/RKQ1.211001.001/V13.0.1.0.SJJCNXM:user/release-keys or Xiaomi/cas/cas:12/RKQ1.211001.001/V13.0.3.0.SJJCNXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:870381d4608fdd0459f47fe1417d89ccae222d0a"),
                      concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:ac12104e209b28faab1ebec5dc01ca1f6d6c93bb")) ||
    abort(concat("E3005: \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:870381d4608fdd0459f47fe1417d89ccae222d0a"),"\" or \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:ac12104e209b28faab1ebec5dc01ca1f6d6c93bb"),"\" has unexpected contents."));
apply_patch_space(134217728) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1(map_partition("system"), "836,1,28,40,54,1061,1062,8332,8333,10304,10305,23552,23553,26843,26844,29013,29014,29067,29068,29492,29493,29736,29737,32768,32782,39950,39952,40228,40230,40240,40241,40933,40935,40960,40961,41023,41025,41031,41032,41042,41044,41049,41050,44688,44692,44740,44741,44748,44750,44755,44756,44763,44765,44770,44771,44784,44786,44791,44792,44805,44807,44812,44813,45129,45131,45143,45144,45148,45149,45188,45190,45195,46354,49498,49499,50358,50360,50403,50404,50415,50417,50422,50423,50431,50433,50438,50439,51686,51688,51715,51716,51847,51849,51857,51858,51983,51985,51994,51995,52357,52358,52363,52365,52370,52371,52404,52406,52411,52412,56254,56256,56288,56289,58056,58058,58075,58076,59922,59923,64185,64187,65536,65548,65928,65929,71192,71193,72132,72134,72135,72136,72147,72149,72154,72155,72844,72846,73919,73920,74821,74823,74846,74847,77466,77467,77884,77885,79028,79030,79079,79080,86341,86342,87148,87150,87209,87210,91183,91184,92074,92076,92088,92089,92148,92149,93331,93333,93351,93352,95791,95792,95927,95929,95953,95954,97316,97318,97341,97342,97750,97752,97763,97764,98304,98318,100097,100099,100132,100133,105704,105705,107795,107797,107943,107944,109853,109855,109884,109885,111535,111536,112343,112345,112369,112370,117921,117922,127202,127204,127269,127270,129257,129259,129290,129291,131072,131084,141819,141820,142340,142341,145689,145691,145719,145720,145880,145881,147989,147990,148536,148538,148552,148553,148616,148617,150204,150206,150230,150231,153633,153635,153646,153647,153911,153912,154198,154200,154211,154212,160141,160142,161254,161256,161279,161280,161387,161388,163840,163854,165798,165799,166334,166335,170172,170173,170175,170176,170265,170266,184015,184017,184019,184020,184024,184025,184027,184028,188717,188719,191393,191395,191413,191414,191490,191491,194948,194949,196608,196620,206247,206249,206294,206295,206732,206733,207815,207816,208932,208934,208944,208945,208964,208965,209008,209010,209039,209041,209046,209047,215195,215196,215679,215683,215745,215746,215768,215769,220203,220204,220912,220913,222087,222089,222119,222120,223190,223194,223217,223218,226302,226303,228507,228509,228567,228568,229376,229390,229391,229392,233648,233649,234152,234154,234169,234170,234467,234469,234478,234479,236590,236594,236622,236623,236838,236839,238787,238788,240554,240555,241754,241758,241828,241829,243309,243310,244127,244129,244142,244143,244175,244176,244210,244212,244217,244218,244222,244224,244229,244230,244567,244568,247771,247772,247840,247842,247847,247848,247893,247897,247902,247903,248507,248508,251187,251191,251249,251250,251270,251272,251277,251278,251325,251327,251332,251333,254271,254272,254952,254954,254991,254992,255064,255066,255071,255072,262144,262156,265346,265347,268856,268858,272754,272755,273504,273505,274711,274713,274721,274722,274737,274738,275814,275815,276523,276524,284998,285002,285116,285117,285129,285131,285136,285137,286914,286915,287408,287410,288146,288147,289226,289227,291014,291016,291445,291447,291476,291477,294912,294926,304150,304151,310433,310435,316173,316174,316224,316225,316248,316249,320061,320063,320065,320066,327680,327692,328981,328983,330517,330518,331280,331281,333871,333872,334657,334659,334667,334668,334682,334683,334751,334753,334760,334761,334767,334769,334781,334782,334798,334800,334805,334806,335209,335211,335218,335219,335243,335245,335250,335251,337643,337644,339151,339153,339166,339167,339239,339240,339245,339249,339254,339255,339641,339643,339657,339658,340695,340699,340723,340724,340751,340755,340760,340763,344463,344464,347713,347714,348366,348367,351461,351462,354904,354905,356641,356643,356667,356668,360448,360460,361082,361086,362055,362057,362074,362075,362079,362081,362375,362377,362388,362389,362394,362395,363080,363083,363116,363117,363498,363499,364280,364281,364744,364778,364800,364825,364862,364863,364899,364906,364908,364915,364931,364937,364940,364943,364945,364951,364961,364964,364965,364972,364974,364981,364983,364990,365003,365007,365024,365031,366041,366138,366245,366312,366678,366679,370422,370423,374103,374104,374116,374121,374122,374123,374124,374125,374126,374127,374128,374129,374130,374131,374132,374134,376063,376065,376172,376174,379312,379313,379945,379946,381563,381566,384471,384472,388761,388762,389130,389131,391396,391397,393216,393228,397654,397655,397769,397770,397774,397775,397776,397777,397782,397783,397785,397786,397802,397803,397804,397805,397810,397811,400461,400462,419511,419512,419995,419997,420132,420134,420136,420138,420139,420141,420294,420296,420595,420596,425984,425996,427619,427620,428289,428290,434261,434262,435601,435602,435606,435607,441616,441617,441806,441807,443922,443923,444210,444211,445435,445436,447093,447094,447810,447811,458752,458764,460271,460272,460712,460713,460831,460832,462907,462908,463519,463521,468704,468705,473655,473656,474958,474959,475165,475166,476487,476488,478948,478949,480469,480470,480749,480750,491520,491532,492487,492488,493803,493804,494065,494066,496877,496878,497559,497560,506972,506973,508962,508965,509072,509073,518387,518388,518485,518486,521185,521186,521196,521197,521211,521212,521214,521215,521288,521289,521290,521291,521314,521315,523497,523498,524288,524300,525620,525621,529236,529237,536531,536532,557056,557068,568832,568833,569832,569833,570162,570163,571187,571188,572024,572026,572067,572068,573022,573023,589824,589836,618326,618327,621712,621713,622592,622604,623717,623718,626348,626349,627613,627614,627685,627686,654875,654876,654878,654879,655360,655372,656247,656248,664776,664777,665489,665491,665686,665687,680699,680700,681387,681388,684479,1179658,1179660,1212417,1212428,1245185,1245196,1267826,1271666,1291548") == "8fca598237dd675ca42ca7b8ee8a846e54d9e26b" || 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"), "836,1,28,40,54,1061,1062,8332,8333,10304,10305,23552,23553,26843,26844,29013,29014,29067,29068,29492,29493,29736,29737,32768,32782,39950,39952,40228,40230,40240,40241,40933,40935,40960,40961,41023,41025,41031,41032,41042,41044,41049,41050,44688,44692,44740,44741,44748,44750,44755,44756,44763,44765,44770,44771,44784,44786,44791,44792,44805,44807,44812,44813,45129,45131,45143,45144,45148,45149,45188,45190,45195,46354,49498,49499,50358,50360,50403,50404,50415,50417,50422,50423,50431,50433,50438,50439,51686,51688,51715,51716,51847,51849,51857,51858,51983,51985,51994,51995,52357,52358,52363,52365,52370,52371,52404,52406,52411,52412,56254,56256,56288,56289,58056,58058,58075,58076,59922,59923,64185,64187,65536,65548,65928,65929,71192,71193,72132,72134,72135,72136,72147,72149,72154,72155,72844,72846,73919,73920,74821,74823,74846,74847,77466,77467,77884,77885,79028,79030,79079,79080,86341,86342,87148,87150,87209,87210,91183,91184,92074,92076,92088,92089,92148,92149,93331,93333,93351,93352,95791,95792,95927,95929,95953,95954,97316,97318,97341,97342,97750,97752,97763,97764,98304,98318,100097,100099,100132,100133,105704,105705,107795,107797,107943,107944,109853,109855,109884,109885,111535,111536,112343,112345,112369,112370,117921,117922,127202,127204,127269,127270,129257,129259,129290,129291,131072,131084,141819,141820,142340,142341,145689,145691,145719,145720,145880,145881,147989,147990,148536,148538,148552,148553,148616,148617,150204,150206,150230,150231,153633,153635,153646,153647,153911,153912,154198,154200,154211,154212,160141,160142,161254,161256,161279,161280,161387,161388,163840,163854,165798,165799,166334,166335,170172,170173,170175,170176,170265,170266,184015,184017,184019,184020,184024,184025,184027,184028,188717,188719,191393,191395,191413,191414,191490,191491,194948,194949,196608,196620,206247,206249,206294,206295,206732,206733,207815,207816,208932,208934,208944,208945,208964,208965,209008,209010,209039,209041,209046,209047,215195,215196,215679,215683,215745,215746,215768,215769,220203,220204,220912,220913,222087,222089,222119,222120,223190,223194,223217,223218,226302,226303,228507,228509,228567,228568,229376,229390,229391,229392,233648,233649,234152,234154,234169,234170,234467,234469,234478,234479,236590,236594,236622,236623,236838,236839,238787,238788,240554,240555,241754,241758,241828,241829,243309,243310,244127,244129,244142,244143,244175,244176,244210,244212,244217,244218,244222,244224,244229,244230,244567,244568,247771,247772,247840,247842,247847,247848,247893,247897,247902,247903,248507,248508,251187,251191,251249,251250,251270,251272,251277,251278,251325,251327,251332,251333,254271,254272,254952,254954,254991,254992,255064,255066,255071,255072,262144,262156,265346,265347,268856,268858,272754,272755,273504,273505,274711,274713,274721,274722,274737,274738,275814,275815,276523,276524,284998,285002,285116,285117,285129,285131,285136,285137,286914,286915,287408,287410,288146,288147,289226,289227,291014,291016,291445,291447,291476,291477,294912,294926,304150,304151,310433,310435,316173,316174,316224,316225,316248,316249,320061,320063,320065,320066,327680,327692,328981,328983,330517,330518,331280,331281,333871,333872,334657,334659,334667,334668,334682,334683,334751,334753,334760,334761,334767,334769,334781,334782,334798,334800,334805,334806,335209,335211,335218,335219,335243,335245,335250,335251,337643,337644,339151,339153,339166,339167,339239,339240,339245,339249,339254,339255,339641,339643,339657,339658,340695,340699,340723,340724,340751,340755,340760,340763,344463,344464,347713,347714,348366,348367,351461,351462,354904,354905,356641,356643,356667,356668,360448,360460,361082,361086,362055,362057,362074,362075,362079,362081,362375,362377,362388,362389,362394,362395,363080,363083,363116,363117,363498,363499,364280,364281,364744,364778,364800,364825,364862,364863,364899,364906,364908,364915,364931,364937,364940,364943,364945,364951,364961,364964,364965,364972,364974,364981,364983,364990,365003,365007,365024,365031,366041,366138,366245,366312,366678,366679,370422,370423,374103,374104,374116,374121,374122,374123,374124,374125,374126,374127,374128,374129,374130,374131,374132,374134,376063,376065,376172,376174,379312,379313,379945,379946,381563,381566,384471,384472,388761,388762,389130,389131,391396,391397,393216,393228,397654,397655,397769,397770,397774,397775,397776,397777,397782,397783,397785,397786,397802,397803,397804,397805,397810,397811,400461,400462,419511,419512,419995,419997,420132,420134,420136,420138,420139,420141,420294,420296,420595,420596,425984,425996,427619,427620,428289,428290,434261,434262,435601,435602,435606,435607,441616,441617,441806,441807,443922,443923,444210,444211,445435,445436,447093,447094,447810,447811,458752,458764,460271,460272,460712,460713,460831,460832,462907,462908,463519,463521,468704,468705,473655,473656,474958,474959,475165,475166,476487,476488,478948,478949,480469,480470,480749,480750,491520,491532,492487,492488,493803,493804,494065,494066,496877,496878,497559,497560,506972,506973,508962,508965,509072,509073,518387,518388,518485,518486,521185,521186,521196,521197,521211,521212,521214,521215,521288,521289,521290,521291,521314,521315,523497,523498,524288,524300,525620,525621,529236,529237,536531,536532,557056,557068,568832,568833,569832,569833,570162,570163,571187,571188,572024,572026,572067,572068,573022,573023,589824,589836,618326,618327,621712,621713,622592,622604,623717,623718,626348,626349,627613,627614,627685,627686,654875,654876,654878,654879,655360,655372,656247,656248,664776,664777,665489,665491,665686,665687,680699,680700,681387,681388,684479,1179658,1179660,1212417,1212428,1245185,1245196,1267826,1271666,1291548") && 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"), "1058,1,142,153,155,162,163,243,249,257,258,266,268,274,275,1101,1103,1122,1123,1130,1132,1137,1138,1383,1385,1392,1393,1399,1401,1406,1407,1416,1418,1423,1424,1429,1431,1436,1437,1440,1441,3092,3093,5857,5858,6415,6416,15358,15359,16482,16484,16488,16490,16491,16492,16513,16514,16515,16516,16519,16520,16525,16526,16527,16528,16532,16533,16537,16538,16542,16543,16547,16548,16552,16553,16557,16558,16559,16560,16563,16565,16566,16567,16569,16571,16572,16573,16576,16577,16578,16579,16582,16583,16584,16585,16588,16589,16590,16591,16594,16595,16596,16597,16601,16602,16606,16607,16610,16612,16616,16617,16620,16622,16623,16624,16628,16629,16630,16631,16634,16635,16636,16637,16640,16641,16642,16643,16646,16647,16648,16649,16652,16654,16655,16656,16659,16660,16661,16662,16667,16668,16672,16673,16677,16678,16682,16683,16687,16688,17049,17050,17967,17974,32768,32770,32883,32907,59525,59526,60155,60157,60211,60212,64930,64932,65536,65555,65588,65589,65684,65685,66813,66814,66842,66846,66909,66910,66936,66940,67277,67278,67325,67329,69774,69775,70391,70392,72119,72120,78625,78626,83194,83195,90789,90790,98304,98306,98419,98438,98691,98692,102460,102461,102465,102467,102484,102485,102520,102521,102530,102531,102674,102675,102730,102731,103443,103444,103447,103448,105786,105787,105812,105813,105849,105850,105963,105964,106015,106016,106492,106493,110719,110720,110726,110727,110745,110746,110867,110868,110870,110872,110936,110937,111007,111008,111075,111076,111078,111079,111081,111082,111141,111143,111145,111146,111210,111211,111281,111282,111349,111350,111352,111353,111355,111361,111363,111364,111366,111368,111370,111382,111442,111443,111445,111446,111456,111457,111523,111524,111601,111602,111612,111613,111679,111680,111756,111757,111836,111837,111913,111914,111990,111991,112067,112068,112082,112083,112146,112147,112222,112223,112233,112234,112300,112301,112377,112378,112450,112451,112453,112454,112466,112472,112532,112533,112535,112536,112538,112539,112610,112611,112613,112614,112619,112620,112685,112686,112757,112758,112760,112761,112831,112832,112834,112835,112905,112906,112908,112909,112978,112979,112981,112982,113047,113048,113050,113051,113121,113122,113201,113202,113278,113279,113281,113282,113347,113348,113350,113351,113356,113357,113420,113421,113423,113424,113490,113492,113494,113495,113562,113563,113565,113566,113633,113634,113636,113637,113702,113703,113705,113706,113774,113775,113777,113778,113846,113847,113923,113924,114000,114001,114003,114004,114078,114079,114081,114082,114152,114153,114155,114156,114225,114226,114228,114229,114300,114301,114303,114304,114373,114374,114376,114377,114450,114451,114452,114453,114461,114462,114525,114526,114527,114528,114602,114603,114605,114606,114675,114676,114678,114679,114747,114748,114750,114751,114816,114817,114819,114820,114889,114890,114892,114893,114958,114959,114961,114962,115029,115030,115032,115033,115098,115099,115101,115102,115105,115106,115168,115169,115171,115172,115240,115241,115243,115244,115312,115313,115315,115316,115385,115386,115387,115388,115390,115391,115461,115462,115464,115465,115535,115536,115538,115539,115609,115610,115612,115613,115682,115683,115685,115686,115753,115754,115756,115757,115824,115825,115827,115828,116019,116020,116036,116037,116296,116527,116530,116532,120707,120708,120781,120782,120866,120867,123725,123726,123727,123728,123793,123795,123803,123805,123806,123807,123814,123815,145431,145433,145535,145537,145538,145540,145542,145543,145710,145713,145714,145715,145721,145722,145725,145726,145732,145733,145736,145740,145748,145749,145868,145878,146062,146067,146089,146094,146235,146237,146238,146240,146247,146248,146256,146257,146262,146263,146265,146266,146274,146275,146340,146341,146593,146597,146608,146611,146614,146617,146836,146838,146933,146934,146937,146940,147058,147059,147061,147062,147081,147082,147084,147085,147086,147087,147189,147190,147524,147525,147533,147535,147537,147543,147544,147552,147553,147560,147561,147562,147591,147616,147622,147630,147632,147644,147740,147742,147782,147783,147888,147889,147898,147899,148214,148216,148217,148218,148254,148255,148257,148258,148260,148261,148263,148264,148266,148267,148268,148270,148271,148272,148273,148274,148277,148278,148280,148281,148283,148286,148352,148354,148426,148427,148429,148430,148452,148454,148491,148492,148499,148500,148512,148514,148515,148516,148633,148636,148732,148733,148767,148768,148770,148771,148855,148857,149141,149142,149628,149629,149631,149632,149640,149641,149738,149746,149857,149858,149860,149861,149991,149992,149994,149995,150003,150004,150006,150007,150009,150010,150019,150020,150453,150454,150456,150457,150459,150460,150469,150470,150472,150473,150812,150813,150831,150832,151256,151257,151280,151281,151443,151444,151446,151448,151457,151458,151548,151549,152457,152458,152535,152536,152537,152538,152540,152541,152818,152819,152828,152829,152947,152948,152959,152974,153871,153872,154085,154086,154333,154334,154336,154337,154340,154341,154342,154343,154349,154350,154679,154680,154682,154683,154966,154967,154990,154991,154996,154998,155088,155089,155415,155416,155418,155419,155423,155425,155435,155436,155728,155729,155736,155737,155742,155743,155748,155749,155754,155755,155757,155758,156789,156790,156825,156826,157110,157111,157112,157113,157270,157271,157273,157275,157910,157916,158798,158804,159682,159683,160434,160439,160693,160694,160696,160697,163224,163225,163537,163538,163539,163540,163840,163842,163955,163974,165519,165520,166320,166321,166861,166862,171579,174078,177402,177403,177941,177956,178257,178258,187949,187951,190737,190738,194682,194683,194685,194686,196608,196639,199105,199106,200456,200457,201360,201361,203575,203576,204483,204484,209162,211221,211227,216905,217139,217140,218746,218747,220423,220424,220715,220716,221349,221350,222867,222869,226172,226173,228073,228082,228588,228589,229376,229378,229491,229512,237113,237114,237172,237173,237254,237255,238127,240425,244234,244235,246430,246431,251869,251870,253124,253125,253526,253588,260832,260833,262144,262163,265395,265396,265398,265399,265535,265536,283974,284127,286272,286273,286607,286618,286632,286643,286680,286681,286693,286694,294912,294914,295027,295052,301703,301704,303517,303518,304763,304764,304889,304951,320349,320350,326840,326841,327680,327706,329780,329781,329783,329784,329791,329792,330117,330118,330701,330702,333215,333216,334069,334070,335185,335186,340118,340119,352617,352622,353979,353980,355540,355541,355546,355547,360448,360467,360583,360584,360590,360592,360598,360599,368742,368743,368749,368751,368758,368759,371863,371868,376235,376237,376322,376323,384557,384558,384564,384565,384775,384776,387089,387090,388017,388018,392714,392715,393216,393235,410340,410341,418127,418128,419608,419609,422603,422604,422606,422607,422614,422615,425893,425894,425984,426003,430846,430847,437833,437835,443378,443379,443381,443382,443389,443390,444531,444532,444554,444555,445390,445392,445598,445599,445911,445912,447143,447149,451756,451757,455999,456000,456229,456230,456265,456266,457050,457051,457060,457062,457082,457083,457118,458762,458771,461556,461564,461575,463119,470459,470563,470564") == "c600ecd8bf793494cefb37a6b410da68dfa65410" || 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"), "1058,1,142,153,155,162,163,243,249,257,258,266,268,274,275,1101,1103,1122,1123,1130,1132,1137,1138,1383,1385,1392,1393,1399,1401,1406,1407,1416,1418,1423,1424,1429,1431,1436,1437,1440,1441,3092,3093,5857,5858,6415,6416,15358,15359,16482,16484,16488,16490,16491,16492,16513,16514,16515,16516,16519,16520,16525,16526,16527,16528,16532,16533,16537,16538,16542,16543,16547,16548,16552,16553,16557,16558,16559,16560,16563,16565,16566,16567,16569,16571,16572,16573,16576,16577,16578,16579,16582,16583,16584,16585,16588,16589,16590,16591,16594,16595,16596,16597,16601,16602,16606,16607,16610,16612,16616,16617,16620,16622,16623,16624,16628,16629,16630,16631,16634,16635,16636,16637,16640,16641,16642,16643,16646,16647,16648,16649,16652,16654,16655,16656,16659,16660,16661,16662,16667,16668,16672,16673,16677,16678,16682,16683,16687,16688,17049,17050,17967,17974,32768,32770,32883,32907,59525,59526,60155,60157,60211,60212,64930,64932,65536,65555,65588,65589,65684,65685,66813,66814,66842,66846,66909,66910,66936,66940,67277,67278,67325,67329,69774,69775,70391,70392,72119,72120,78625,78626,83194,83195,90789,90790,98304,98306,98419,98438,98691,98692,102460,102461,102465,102467,102484,102485,102520,102521,102530,102531,102674,102675,102730,102731,103443,103444,103447,103448,105786,105787,105812,105813,105849,105850,105963,105964,106015,106016,106492,106493,110719,110720,110726,110727,110745,110746,110867,110868,110870,110872,110936,110937,111007,111008,111075,111076,111078,111079,111081,111082,111141,111143,111145,111146,111210,111211,111281,111282,111349,111350,111352,111353,111355,111361,111363,111364,111366,111368,111370,111382,111442,111443,111445,111446,111456,111457,111523,111524,111601,111602,111612,111613,111679,111680,111756,111757,111836,111837,111913,111914,111990,111991,112067,112068,112082,112083,112146,112147,112222,112223,112233,112234,112300,112301,112377,112378,112450,112451,112453,112454,112466,112472,112532,112533,112535,112536,112538,112539,112610,112611,112613,112614,112619,112620,112685,112686,112757,112758,112760,112761,112831,112832,112834,112835,112905,112906,112908,112909,112978,112979,112981,112982,113047,113048,113050,113051,113121,113122,113201,113202,113278,113279,113281,113282,113347,113348,113350,113351,113356,113357,113420,113421,113423,113424,113490,113492,113494,113495,113562,113563,113565,113566,113633,113634,113636,113637,113702,113703,113705,113706,113774,113775,113777,113778,113846,113847,113923,113924,114000,114001,114003,114004,114078,114079,114081,114082,114152,114153,114155,114156,114225,114226,114228,114229,114300,114301,114303,114304,114373,114374,114376,114377,114450,114451,114452,114453,114461,114462,114525,114526,114527,114528,114602,114603,114605,114606,114675,114676,114678,114679,114747,114748,114750,114751,114816,114817,114819,114820,114889,114890,114892,114893,114958,114959,114961,114962,115029,115030,115032,115033,115098,115099,115101,115102,115105,115106,115168,115169,115171,115172,115240,115241,115243,115244,115312,115313,115315,115316,115385,115386,115387,115388,115390,115391,115461,115462,115464,115465,115535,115536,115538,115539,115609,115610,115612,115613,115682,115683,115685,115686,115753,115754,115756,115757,115824,115825,115827,115828,116019,116020,116036,116037,116296,116527,116530,116532,120707,120708,120781,120782,120866,120867,123725,123726,123727,123728,123793,123795,123803,123805,123806,123807,123814,123815,145431,145433,145535,145537,145538,145540,145542,145543,145710,145713,145714,145715,145721,145722,145725,145726,145732,145733,145736,145740,145748,145749,145868,145878,146062,146067,146089,146094,146235,146237,146238,146240,146247,146248,146256,146257,146262,146263,146265,146266,146274,146275,146340,146341,146593,146597,146608,146611,146614,146617,146836,146838,146933,146934,146937,146940,147058,147059,147061,147062,147081,147082,147084,147085,147086,147087,147189,147190,147524,147525,147533,147535,147537,147543,147544,147552,147553,147560,147561,147562,147591,147616,147622,147630,147632,147644,147740,147742,147782,147783,147888,147889,147898,147899,148214,148216,148217,148218,148254,148255,148257,148258,148260,148261,148263,148264,148266,148267,148268,148270,148271,148272,148273,148274,148277,148278,148280,148281,148283,148286,148352,148354,148426,148427,148429,148430,148452,148454,148491,148492,148499,148500,148512,148514,148515,148516,148633,148636,148732,148733,148767,148768,148770,148771,148855,148857,149141,149142,149628,149629,149631,149632,149640,149641,149738,149746,149857,149858,149860,149861,149991,149992,149994,149995,150003,150004,150006,150007,150009,150010,150019,150020,150453,150454,150456,150457,150459,150460,150469,150470,150472,150473,150812,150813,150831,150832,151256,151257,151280,151281,151443,151444,151446,151448,151457,151458,151548,151549,152457,152458,152535,152536,152537,152538,152540,152541,152818,152819,152828,152829,152947,152948,152959,152974,153871,153872,154085,154086,154333,154334,154336,154337,154340,154341,154342,154343,154349,154350,154679,154680,154682,154683,154966,154967,154990,154991,154996,154998,155088,155089,155415,155416,155418,155419,155423,155425,155435,155436,155728,155729,155736,155737,155742,155743,155748,155749,155754,155755,155757,155758,156789,156790,156825,156826,157110,157111,157112,157113,157270,157271,157273,157275,157910,157916,158798,158804,159682,159683,160434,160439,160693,160694,160696,160697,163224,163225,163537,163538,163539,163540,163840,163842,163955,163974,165519,165520,166320,166321,166861,166862,171579,174078,177402,177403,177941,177956,178257,178258,187949,187951,190737,190738,194682,194683,194685,194686,196608,196639,199105,199106,200456,200457,201360,201361,203575,203576,204483,204484,209162,211221,211227,216905,217139,217140,218746,218747,220423,220424,220715,220716,221349,221350,222867,222869,226172,226173,228073,228082,228588,228589,229376,229378,229491,229512,237113,237114,237172,237173,237254,237255,238127,240425,244234,244235,246430,246431,251869,251870,253124,253125,253526,253588,260832,260833,262144,262163,265395,265396,265398,265399,265535,265536,283974,284127,286272,286273,286607,286618,286632,286643,286680,286681,286693,286694,294912,294914,295027,295052,301703,301704,303517,303518,304763,304764,304889,304951,320349,320350,326840,326841,327680,327706,329780,329781,329783,329784,329791,329792,330117,330118,330701,330702,333215,333216,334069,334070,335185,335186,340118,340119,352617,352622,353979,353980,355540,355541,355546,355547,360448,360467,360583,360584,360590,360592,360598,360599,368742,368743,368749,368751,368758,368759,371863,371868,376235,376237,376322,376323,384557,384558,384564,384565,384775,384776,387089,387090,388017,388018,392714,392715,393216,393235,410340,410341,418127,418128,419608,419609,422603,422604,422606,422607,422614,422615,425893,425894,425984,426003,430846,430847,437833,437835,443378,443379,443381,443382,443389,443390,444531,444532,444554,444555,445390,445392,445598,445599,445911,445912,447143,447149,451756,451757,455999,456000,456229,456230,456265,456266,457050,457051,457060,457062,457082,457083,457118,458762,458771,461556,461564,461575,463119,470459,470563,470564") && 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"), "198,1,20,36,38,44,45,52,53,56,57,60,61,178,180,185,186,199,201,206,207,1004,1006,1024,1025,4877,4879,18401,18402,18471,18472,20688,20690,32768,32781,41231,41232,43256,43257,45729,45730,46807,46945,47469,47470,51375,51376,51379,51382,51394,51395,55949,55950,56053,56054,56056,56058,56069,56071,56081,56082,56171,56172,56184,56185,56199,56201,56210,56211,56213,56214,56521,56522,56523,56524,56525,56527,56536,56537,56539,56540,56616,56617,56619,56620,56685,56686,56739,56740,56770,56771,58200,58203,58215,58218,58262,58265,58295,58298,58327,58330,58354,58355,58369,58371,58539,58540,61481,61482,61492,61493,61507,61508,61509,61511,64882,64883,65536,65547,66273,66274,75479,75480,75783,75785,75911,75913,76452,76453,76621,76623,76624,76625,76633,76634,76638,76639,76663,76664,76668,76670,76672,76674,76695,76696,76702,76703,76764,76766,76818,76819,76918,76921,77336,77337,77708,77709,79194,79195,96819,96820,96822,96823,98304,98316,98317,98333,98898,98899,106057,106059,107795,107796,109879,109881,109968,109969,110015,110017,110022,110023,110048,110049,111939,111941,113625,113628,115353,115355,115378,115379,115507,115508,116025,116027,116391,118239,118278,118279") == "7e0b1414d409a6d66cebb4431d1f0704edfff5af" || 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"), "198,1,20,36,38,44,45,52,53,56,57,60,61,178,180,185,186,199,201,206,207,1004,1006,1024,1025,4877,4879,18401,18402,18471,18472,20688,20690,32768,32781,41231,41232,43256,43257,45729,45730,46807,46945,47469,47470,51375,51376,51379,51382,51394,51395,55949,55950,56053,56054,56056,56058,56069,56071,56081,56082,56171,56172,56184,56185,56199,56201,56210,56211,56213,56214,56521,56522,56523,56524,56525,56527,56536,56537,56539,56540,56616,56617,56619,56620,56685,56686,56739,56740,56770,56771,58200,58203,58215,58218,58262,58265,58295,58298,58327,58330,58354,58355,58369,58371,58539,58540,61481,61482,61492,61493,61507,61508,61509,61511,64882,64883,65536,65547,66273,66274,75479,75480,75783,75785,75911,75913,76452,76453,76621,76623,76624,76625,76633,76634,76638,76639,76663,76664,76668,76670,76672,76674,76695,76696,76702,76703,76764,76766,76818,76819,76918,76921,77336,77337,77708,77709,79194,79195,96819,96820,96822,96823,98304,98316,98317,98333,98898,98899,106057,106059,107795,107796,109879,109881,109968,109969,110015,110017,110022,110023,110048,110049,111939,111941,113625,113628,115353,115355,115378,115379,115507,115508,116025,116027,116391,118239,118278,118279") && 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"), "14,1,2,9,13,2026,2033,2040,2041,2049,2315,32231,32745,32767,32768") == "6a9ec089e887e57a8c05447d637acfeb80e7228c" || 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"), "14,1,2,9,13,2026,2033,2040,2041,2049,2315,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"), "188,1,31,27967,27969,27977,27979,27985,27986,28048,28050,28055,28056,28108,28110,28115,28116,28120,28122,28127,28128,28133,28134,28550,28552,28566,28567,28579,28581,28586,28587,28592,28594,28599,28600,28606,28608,28611,28612,28624,28626,28631,28632,28638,28639,28652,28654,28659,28662,28685,28686,28827,28828,28909,28910,28922,28923,28925,28926,28927,28928,28929,28931,28932,28933,28934,28935,28965,28977,28979,28980,28981,28982,28992,28993,29016,29017,29056,29057,29062,29064,29166,29167,29169,29171,29180,29181,30039,30040,30044,30045,32768,32797,33044,33045,33067,33068,33357,33364,33382,33385,33387,33388,34729,34730,34873,34874,38285,38286,38300,38301,38452,38453,38762,38763,43454,43455,48474,48481,48499,48502,48504,48505,50475,50476,51105,51106,60081,60082,60293,60294,60613,60614,65536,65564,67146,67147,94236,94237,95592,95593,97411,97412,98304,98328,98329,98350,99110,99111,114442,114443,125282,125286,125414,125415,125695,125696,126658,126660,126669,126670,126686,126687,126715,126717,126722,126723,126753,126757,126762,126763,127639,127641,127665,127666,127683,127685,127690,127691,128083,128087,128096,128099,128129,128132,128541,130582,130622,130623") == "44e95a6994b646631203d576983bccb3b8fee249" || 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"), "188,1,31,27967,27969,27977,27979,27985,27986,28048,28050,28055,28056,28108,28110,28115,28116,28120,28122,28127,28128,28133,28134,28550,28552,28566,28567,28579,28581,28586,28587,28592,28594,28599,28600,28606,28608,28611,28612,28624,28626,28631,28632,28638,28639,28652,28654,28659,28662,28685,28686,28827,28828,28909,28910,28922,28923,28925,28926,28927,28928,28929,28931,28932,28933,28934,28935,28965,28977,28979,28980,28981,28982,28992,28993,29016,29017,29056,29057,29062,29064,29166,29167,29169,29171,29180,29181,30039,30040,30044,30045,32768,32797,33044,33045,33067,33068,33357,33364,33382,33385,33387,33388,34729,34730,34873,34874,38285,38286,38300,38301,38452,38453,38762,38763,43454,43455,48474,48481,48499,48502,48504,48505,50475,50476,51105,51106,60081,60082,60293,60294,60613,60614,65536,65564,67146,67147,94236,94237,95592,95593,97411,97412,98304,98328,98329,98350,99110,99111,114442,114443,125282,125286,125414,125415,125695,125696,126658,126660,126669,126670,126686,126687,126715,126717,126722,126723,126753,126757,126762,126763,127639,127641,127665,127666,127683,127685,127690,127691,128083,128087,128096,128099,128129,128132,128541,130582,130622,130623") && 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 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.");

# Update dynamic partition metadata

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

# 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.");

# 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:870381d4608fdd0459f47fe1417d89ccae222d0a"),
                concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:ac12104e209b28faab1ebec5dc01ca1f6d6c93bb"),
                package_extract_file("boot.img.p")) ||
    abort(concat(        "E3008: Failed to apply patch to ",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:ac12104e209b28faab1ebec5dc01ca1f6d6c93bb")));

# ---- 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");
set_progress(1.000000);
