getprop("ro.product.device") == "nitrogen" || abort("E3004: This package is for \"nitrogen\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Xiaomi/nitrogen/nitrogen:9/PKQ1.181007.001/V11.0.1.0.PEDCNXM:user/release-keys");
ui_print("Target: Xiaomi/nitrogen/nitrogen:9/PKQ1.181007.001/V11.0.2.0.PEDCNXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/nitrogen/nitrogen:9/PKQ1.181007.001/V11.0.1.0.PEDCNXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/nitrogen/nitrogen:9/PKQ1.181007.001/V11.0.2.0.PEDCNXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/nitrogen/nitrogen:9/PKQ1.181007.001/V11.0.1.0.PEDCNXM:user/release-keys or Xiaomi/nitrogen/nitrogen:9/PKQ1.181007.001/V11.0.2.0.PEDCNXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
show_progress(0.100000, 5);
apply_patch_check("EMMC:/dev/block/bootdevice/by-name/boot:54281546:e4e7313d6a1dce753bccf1dcd7b0daf54953e254:54281546:6c6109e534000d313dc9f4d3ca676bef70c2ddbc") || abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:54281546:e4e7313d6a1dce753bccf1dcd7b0daf54953e254:54281546:6c6109e534000d313dc9f4d3ca676bef70c2ddbc\" has unexpected contents.");
apply_patch_space(54281546) || abort("E3006: Not enough free space on /cache to apply patches.");
show_progress(0.100000, 70);
if (range_sha1("/dev/block/bootdevice/by-name/system", "808,1,208,223,534,8303,8310,8412,8416,8419,8421,8429,8431,8463,8465,8475,8477,8483,8485,8490,8492,8526,8528,8531,8533,8783,8785,8793,8795,8798,8800,8965,8967,8970,8972,8975,8977,12293,12295,12299,12301,12317,12319,12527,12529,12532,12534,12537,12539,12542,12544,12571,12573,12576,12578,12581,12583,12593,12595,13077,13079,13087,13089,19702,19704,19707,19709,19713,19715,21040,21042,21056,21058,21226,21228,21239,21241,21244,21246,21358,21360,21456,21458,21495,21497,21536,21538,21674,21676,21679,21681,21685,21687,21692,21694,21698,21700,21703,21705,21709,21711,21794,21796,21814,21816,21833,21835,21838,21840,21843,21845,21885,21887,21903,21905,21917,21919,21934,21937,22105,22107,22110,22112,22115,22117,22140,22142,22146,22148,22172,22174,22567,22569,22577,22579,22582,22584,22729,22731,23119,23121,23133,23135,23138,23140,23144,23146,23157,23159,23162,23164,23168,23170,23174,23176,23179,23181,23196,23198,23247,23249,23252,23254,23257,23259,23263,23265,23268,23576,23669,23671,23674,23676,23679,23681,23685,23688,23691,23693,23701,23703,23735,23737,23742,23744,23750,23752,23757,23759,23793,23795,23798,23800,24050,24052,24060,24062,24065,24067,24232,24234,24237,24239,24242,24244,24304,24306,24310,24312,24328,24330,24538,24540,24543,24545,24548,24550,24553,24555,24582,24584,24587,24589,24592,24594,24604,24606,25021,25023,25114,25116,25119,25121,25155,25157,25171,25173,25341,25343,25354,25356,25359,25361,25473,25475,25558,25560,25597,25599,25638,25640,25752,25754,25757,25759,25763,25765,25770,25772,25776,25778,25781,25783,25787,25789,25860,25862,25880,25882,25899,25901,25904,25906,25909,25911,25959,25961,25973,25975,25990,25992,26154,26155,26161,26163,26166,26168,26171,26173,26188,26190,26194,26196,26220,26222,26615,26617,26625,26627,26757,26759,27147,27149,27161,27163,27166,27168,27172,27174,27185,27187,27190,27192,27196,27198,27202,27204,27207,27209,27224,27226,27275,27277,27280,27282,27285,27287,27291,27293,27296,27298,27391,27393,27396,27398,27401,27403,32768,32770,34828,34829,35598,46215,49283,63073,63546,73817,75117,86543,86589,86843,88940,88941,91324,91328,91349,91351,91357,91360,91365,91367,91372,91377,91399,91402,91451,91453,91460,91461,91466,91471,91481,91482,98304,98306,103498,103500,108938,108941,109408,109410,109545,109548,109556,109558,109563,109564,111570,111571,114465,114470,114646,114647,114696,114700,114814,114821,117297,117300,117712,117715,118291,118293,118304,120535,120626,120630,120691,120696,120819,120822,120935,120937,120989,120992,121377,121379,121454,121461,122291,122292,122295,122299,122308,122313,122467,122468,126159,126160,126317,126318,127184,127187,127195,127197,127203,127208,127367,127372,127422,127424,127435,127438,127442,127444,127450,127455,127606,127607,127609,127611,127613,127615,127619,127622,127854,127857,127893,127895,127902,127905,127915,127917,127922,127927,128932,128935,128950,128952,128959,128962,128972,128974,129000,129005,129415,129420,129458,129461,129462,129464,129472,129477,129489,129492,129497,129499,129504,129509,135009,135012,135035,135037,135110,135112,135116,135121,135138,135140,135147,135150,135156,135158,135245,138470,139084,139086,142454,142457,142466,142468,142473,142476,142665,142667,142676,142679,142718,142720,142732,142735,142760,142762,142769,142776,147806,147808,148893,148894,149339,149342,149345,149347,149357,149360,149681,149683,149757,149760,149990,149992,150029,150034,150069,150072,152689,152691,155231,155236,155634,155639,155648,155651,157475,157477,160435,160436,163840,163842,178587,178588,190088,190091,190485,190487,190543,190548,190635,190640,190646,190647,190770,190773,191011,191013,191071,191076,191268,191271,191756,191758,191882,191885,192005,192007,192348,192353,193887,193890,193895,193897,193903,193904,196279,196282,196309,196311,196322,196327,196690,196695,196707,196709,196716,196719,196918,196920,196954,197220,197324,197327,197796,197798,197966,197971,197998,198003,198124,198127,198130,198132,198141,198144,199262,199264,201000,201003,201664,201666,201922,201966,201973,201978,201998,202000,202006,202011,202056,202059,204793,204795,209232,209235,209242,209244,209250,209253,209652,209654,211757,211758,211760,211764,211776,211779,211782,211784,211789,211794,212349,212351,212648,212651,212819,212821,212836,212837,212862,212863,212865,212868,213756,213758,213816,213821,216000,216005,216393,216398,216417,216422,216829,216832,216841,216843,216850,216855,216883,216886,216898,216900,216906,216907,216946,216950,218140,218147,218237,218238,219736,219737,219740,219743,219792,219794,219802,219807,220267,220270,220280,220282,220294,220299,220677,220680,220684,220686,220692,220695,222154,222156,222532,222537,229376,229378,232813,232816,232822,232824,232834,232839,232946,232951,234939,234942,235424,235428,236113,236114,241075,241077,245684,245689,245707,245710,245731,245733,245747,245750,247344,247346,248787,248790,248865,248867,248926,248927,249979,249980,253023,253024,253383,253834,254031,254032,256321,256322,256323,256327,256328,256330,256394,256399,256424,256425,257783,257786,257927,257931,257937,257940,257952,257954,259105,259106,264189,264194,264204,264207,264223,264225,268159,268164,270065,294914,295103,524296,528344,639965,639969,640029,640034,640046,640049,726172,774155,780254,780261,786432") == "3dd2fab62004cbe3162089f17801d3e63b0f9e59" || block_image_verify("/dev/block/bootdevice/by-name/system", package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat")) then
ui_print("Verified system image...");
else
check_first_block("/dev/block/bootdevice/by-name/system");
ifelse (block_image_recover("/dev/block/bootdevice/by-name/system", "808,1,208,223,534,8303,8310,8412,8416,8419,8421,8429,8431,8463,8465,8475,8477,8483,8485,8490,8492,8526,8528,8531,8533,8783,8785,8793,8795,8798,8800,8965,8967,8970,8972,8975,8977,12293,12295,12299,12301,12317,12319,12527,12529,12532,12534,12537,12539,12542,12544,12571,12573,12576,12578,12581,12583,12593,12595,13077,13079,13087,13089,19702,19704,19707,19709,19713,19715,21040,21042,21056,21058,21226,21228,21239,21241,21244,21246,21358,21360,21456,21458,21495,21497,21536,21538,21674,21676,21679,21681,21685,21687,21692,21694,21698,21700,21703,21705,21709,21711,21794,21796,21814,21816,21833,21835,21838,21840,21843,21845,21885,21887,21903,21905,21917,21919,21934,21937,22105,22107,22110,22112,22115,22117,22140,22142,22146,22148,22172,22174,22567,22569,22577,22579,22582,22584,22729,22731,23119,23121,23133,23135,23138,23140,23144,23146,23157,23159,23162,23164,23168,23170,23174,23176,23179,23181,23196,23198,23247,23249,23252,23254,23257,23259,23263,23265,23268,23576,23669,23671,23674,23676,23679,23681,23685,23688,23691,23693,23701,23703,23735,23737,23742,23744,23750,23752,23757,23759,23793,23795,23798,23800,24050,24052,24060,24062,24065,24067,24232,24234,24237,24239,24242,24244,24304,24306,24310,24312,24328,24330,24538,24540,24543,24545,24548,24550,24553,24555,24582,24584,24587,24589,24592,24594,24604,24606,25021,25023,25114,25116,25119,25121,25155,25157,25171,25173,25341,25343,25354,25356,25359,25361,25473,25475,25558,25560,25597,25599,25638,25640,25752,25754,25757,25759,25763,25765,25770,25772,25776,25778,25781,25783,25787,25789,25860,25862,25880,25882,25899,25901,25904,25906,25909,25911,25959,25961,25973,25975,25990,25992,26154,26155,26161,26163,26166,26168,26171,26173,26188,26190,26194,26196,26220,26222,26615,26617,26625,26627,26757,26759,27147,27149,27161,27163,27166,27168,27172,27174,27185,27187,27190,27192,27196,27198,27202,27204,27207,27209,27224,27226,27275,27277,27280,27282,27285,27287,27291,27293,27296,27298,27391,27393,27396,27398,27401,27403,32768,32770,34828,34829,35598,46215,49283,63073,63546,73817,75117,86543,86589,86843,88940,88941,91324,91328,91349,91351,91357,91360,91365,91367,91372,91377,91399,91402,91451,91453,91460,91461,91466,91471,91481,91482,98304,98306,103498,103500,108938,108941,109408,109410,109545,109548,109556,109558,109563,109564,111570,111571,114465,114470,114646,114647,114696,114700,114814,114821,117297,117300,117712,117715,118291,118293,118304,120535,120626,120630,120691,120696,120819,120822,120935,120937,120989,120992,121377,121379,121454,121461,122291,122292,122295,122299,122308,122313,122467,122468,126159,126160,126317,126318,127184,127187,127195,127197,127203,127208,127367,127372,127422,127424,127435,127438,127442,127444,127450,127455,127606,127607,127609,127611,127613,127615,127619,127622,127854,127857,127893,127895,127902,127905,127915,127917,127922,127927,128932,128935,128950,128952,128959,128962,128972,128974,129000,129005,129415,129420,129458,129461,129462,129464,129472,129477,129489,129492,129497,129499,129504,129509,135009,135012,135035,135037,135110,135112,135116,135121,135138,135140,135147,135150,135156,135158,135245,138470,139084,139086,142454,142457,142466,142468,142473,142476,142665,142667,142676,142679,142718,142720,142732,142735,142760,142762,142769,142776,147806,147808,148893,148894,149339,149342,149345,149347,149357,149360,149681,149683,149757,149760,149990,149992,150029,150034,150069,150072,152689,152691,155231,155236,155634,155639,155648,155651,157475,157477,160435,160436,163840,163842,178587,178588,190088,190091,190485,190487,190543,190548,190635,190640,190646,190647,190770,190773,191011,191013,191071,191076,191268,191271,191756,191758,191882,191885,192005,192007,192348,192353,193887,193890,193895,193897,193903,193904,196279,196282,196309,196311,196322,196327,196690,196695,196707,196709,196716,196719,196918,196920,196954,197220,197324,197327,197796,197798,197966,197971,197998,198003,198124,198127,198130,198132,198141,198144,199262,199264,201000,201003,201664,201666,201922,201966,201973,201978,201998,202000,202006,202011,202056,202059,204793,204795,209232,209235,209242,209244,209250,209253,209652,209654,211757,211758,211760,211764,211776,211779,211782,211784,211789,211794,212349,212351,212648,212651,212819,212821,212836,212837,212862,212863,212865,212868,213756,213758,213816,213821,216000,216005,216393,216398,216417,216422,216829,216832,216841,216843,216850,216855,216883,216886,216898,216900,216906,216907,216946,216950,218140,218147,218237,218238,219736,219737,219740,219743,219792,219794,219802,219807,220267,220270,220280,220282,220294,220299,220677,220680,220684,220686,220692,220695,222154,222156,222532,222537,229376,229378,232813,232816,232822,232824,232834,232839,232946,232951,234939,234942,235424,235428,236113,236114,241075,241077,245684,245689,245707,245710,245731,245733,245747,245750,247344,247346,248787,248790,248865,248867,248926,248927,249979,249980,253023,253024,253383,253834,254031,254032,256321,256322,256323,256327,256328,256330,256394,256399,256424,256425,257783,257786,257927,257931,257937,257940,257952,257954,259105,259106,264189,264194,264204,264207,264223,264225,268159,268164,270065,294914,295103,524296,528344,639965,639969,640029,640034,640046,640049,726172,774155,780254,780261,786432") && block_image_verify("/dev/block/bootdevice/by-name/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("/dev/block/bootdevice/by-name/vendor", "368,1,198,207,208,223,452,8303,8309,8310,8343,8350,8351,8353,8354,8368,8369,10569,10570,11233,11234,12248,12249,12349,12350,12355,12356,14342,14345,14379,14381,14383,14384,16379,16380,16382,16383,16385,16386,16391,16392,16394,16395,16403,16404,16410,16413,19853,19854,28589,28591,28598,28599,28640,28641,28712,28713,31610,31611,32768,32770,44583,44586,46245,46246,46250,46251,46448,46450,46721,46722,46745,46748,48407,48408,48412,48413,48611,48613,48884,48885,48908,48909,48910,48912,48913,48914,48915,48917,48918,48919,48920,48921,49374,49377,49395,49396,49441,49442,49473,49475,49813,49814,50221,50222,51110,51111,51237,51238,51277,51278,51331,51332,51343,51345,57485,57486,58019,58020,58034,58036,58205,58208,62817,62818,63207,63208,63670,63671,64187,64188,64539,64540,66050,66051,66321,66322,66669,66670,66739,66740,67645,67646,69904,69905,69917,69918,70463,70464,70831,70832,71347,71348,71575,71577,72386,72387,72652,72653,72758,72759,73786,73787,75809,75810,75811,78256,78257,78265,78418,78419,79368,79369,85594,85595,86890,86891,89523,89524,89619,89620,90402,90403,90537,90538,92649,92650,92683,92684,93043,93044,94746,94747,95515,95516,96018,96019,96751,96752,96851,96852,98304,98306,98506,98507,100767,100768,101090,101091,101987,101988,102098,102099,102203,102204,102933,102934,104580,104581,105967,105968,106542,106543,106639,106640,106783,106784,106894,106895,108047,108048,108228,108229,108444,108445,108485,108486,108727,108728,109079,109080,120661,120662,120842,120843,120999,121000,121346,121347,121639,121640,121700,121701,122269,122270,125584,125585,126219,126220,126228,126229,126925,126926,127199,127200,128882,128883,128914,128915,129133,129134,132203,132204,133335,133336,133543,133544,133706,133707,135086,135087,135229,135230,135336,135337,137200,137201,137266,137267,137292,137293,140915,140916,141521,141522,141608,141609,144137,144138,144324,144325,146143,146144,146397,146399,147008,147009,147291,147292,147792,147793,148508,148509,148521,148522,148651,148652,154647,154648,155601,155729,157018,157019,157047,157048,157502,157503,157958,157959,162450,162451,163840,163842,168972,168973,171046,171047,171396,171397,174544,174545,184240,184241,185093,185094,189669,189670,204095,204096,204683,204696,229376,229378,294912,294914,524288,524289,524295,524296,774155,776552,780136,780254,780261,781679,782191,784751,785263,786432") == "e3e6af95dcb1bf2c14e004efd77c0cd691e183a5" || block_image_verify("/dev/block/bootdevice/by-name/vendor", package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat")) then
ui_print("Verified vendor image...");
else
check_first_block("/dev/block/bootdevice/by-name/vendor");
ifelse (block_image_recover("/dev/block/bootdevice/by-name/vendor", "368,1,198,207,208,223,452,8303,8309,8310,8343,8350,8351,8353,8354,8368,8369,10569,10570,11233,11234,12248,12249,12349,12350,12355,12356,14342,14345,14379,14381,14383,14384,16379,16380,16382,16383,16385,16386,16391,16392,16394,16395,16403,16404,16410,16413,19853,19854,28589,28591,28598,28599,28640,28641,28712,28713,31610,31611,32768,32770,44583,44586,46245,46246,46250,46251,46448,46450,46721,46722,46745,46748,48407,48408,48412,48413,48611,48613,48884,48885,48908,48909,48910,48912,48913,48914,48915,48917,48918,48919,48920,48921,49374,49377,49395,49396,49441,49442,49473,49475,49813,49814,50221,50222,51110,51111,51237,51238,51277,51278,51331,51332,51343,51345,57485,57486,58019,58020,58034,58036,58205,58208,62817,62818,63207,63208,63670,63671,64187,64188,64539,64540,66050,66051,66321,66322,66669,66670,66739,66740,67645,67646,69904,69905,69917,69918,70463,70464,70831,70832,71347,71348,71575,71577,72386,72387,72652,72653,72758,72759,73786,73787,75809,75810,75811,78256,78257,78265,78418,78419,79368,79369,85594,85595,86890,86891,89523,89524,89619,89620,90402,90403,90537,90538,92649,92650,92683,92684,93043,93044,94746,94747,95515,95516,96018,96019,96751,96752,96851,96852,98304,98306,98506,98507,100767,100768,101090,101091,101987,101988,102098,102099,102203,102204,102933,102934,104580,104581,105967,105968,106542,106543,106639,106640,106783,106784,106894,106895,108047,108048,108228,108229,108444,108445,108485,108486,108727,108728,109079,109080,120661,120662,120842,120843,120999,121000,121346,121347,121639,121640,121700,121701,122269,122270,125584,125585,126219,126220,126228,126229,126925,126926,127199,127200,128882,128883,128914,128915,129133,129134,132203,132204,133335,133336,133543,133544,133706,133707,135086,135087,135229,135230,135336,135337,137200,137201,137266,137267,137292,137293,140915,140916,141521,141522,141608,141609,144137,144138,144324,144325,146143,146144,146397,146399,147008,147009,147291,147292,147792,147793,148508,148509,148521,148522,148651,148652,154647,154648,155601,155729,157018,157019,157047,157048,157502,157503,157958,157959,162450,162451,163840,163842,168972,168973,171046,171047,171396,171397,174544,174545,184240,184241,185093,185094,189669,189670,204095,204096,204683,204696,229376,229378,294912,294914,524288,524289,524295,524296,774155,776552,780136,780254,780261,781679,782191,784751,785263,786432") && block_image_verify("/dev/block/bootdevice/by-name/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;

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

ui_print("Patching boot image...");
show_progress(0.100000, 10);
apply_patch("EMMC:/dev/block/bootdevice/by-name/boot:54281546:e4e7313d6a1dce753bccf1dcd7b0daf54953e254:54281546:6c6109e534000d313dc9f4d3ca676bef70c2ddbc",
            "-", 6c6109e534000d313dc9f4d3ca676bef70c2ddbc, 54281546,
            e4e7313d6a1dce753bccf1dcd7b0daf54953e254, package_extract_file("patch/boot.img.p")) || abort("Failed to apply patch \"patch/boot.img.p \".");
show_progress(0.600000, 600);
ui_print("Patching system image after verification.");
block_image_update("/dev/block/bootdevice/by-name/system", package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat") ||
  abort("E1001: Failed to update system image.");
ui_print("Patching vendor image after verification.");
block_image_update("/dev/block/bootdevice/by-name/vendor", package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat") ||
  abort("E2001: Failed to update vendor image.");

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

ui_print("Patching firmware images...");
package_extract_file("firmware-update/cmnlib64.mbn", "/dev/block/bootdevice/by-name/cmnlib64");
package_extract_file("firmware-update/cmnlib.mbn", "/dev/block/bootdevice/by-name/cmnlib");
package_extract_file("firmware-update/hyp.mbn", "/dev/block/bootdevice/by-name/hyp");
package_extract_file("firmware-update/pmic.elf", "/dev/block/bootdevice/by-name/pmic");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tz");
package_extract_file("firmware-update/keymaster64.mbn", "/dev/block/bootdevice/by-name/keymaster");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/abl");
package_extract_file("firmware-update/devcfg.mbn", "/dev/block/bootdevice/by-name/devcfg");
package_extract_file("firmware-update/storsec.mbn", "/dev/block/bootdevice/by-name/storsec");
package_extract_file("firmware-update/xbl.elf", "/dev/block/bootdevice/by-name/xbl");
package_extract_file("firmware-update/rpm.mbn", "/dev/block/bootdevice/by-name/rpm");
package_extract_file("firmware-update/cmnlib64.mbn", "/dev/block/bootdevice/by-name/cmnlib64bak");
package_extract_file("firmware-update/cmnlib.mbn", "/dev/block/bootdevice/by-name/cmnlibbak");
package_extract_file("firmware-update/hyp.mbn", "/dev/block/bootdevice/by-name/hypbak");
package_extract_file("firmware-update/pmic.elf", "/dev/block/bootdevice/by-name/pmicbak");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tzbak");
package_extract_file("firmware-update/keymaster64.mbn", "/dev/block/bootdevice/by-name/keymasterbak");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/ablbak");
package_extract_file("firmware-update/devcfg.mbn", "/dev/block/bootdevice/by-name/devcfgbak");
package_extract_file("firmware-update/storsec.mbn", "/dev/block/bootdevice/by-name/storsecbak");
package_extract_file("firmware-update/xbl.elf", "/dev/block/bootdevice/by-name/xblbak");
package_extract_file("firmware-update/rpm.mbn", "/dev/block/bootdevice/by-name/rpmbak");
package_extract_file("firmware-update/NON-HLOS.bin", "/dev/block/bootdevice/by-name/modem");
package_extract_file("firmware-update/BTFM.bin", "/dev/block/bootdevice/by-name/bluetooth");
show_progress(0.100000, 2);
