getprop("ro.product.device") == "violet" || abort("E3004: This package is for \"violet\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: xiaomi/violet/violet:9/PKQ1.181203.001/V11.0.4.0.PFHCNXM:user/release-keys");
ui_print("Target: xiaomi/violet/violet:9/PKQ1.181203.001/V11.0.8.0.PFHCNXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "xiaomi/violet/violet:9/PKQ1.181203.001/V11.0.4.0.PFHCNXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "xiaomi/violet/violet:9/PKQ1.181203.001/V11.0.8.0.PFHCNXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of xiaomi/violet/violet:9/PKQ1.181203.001/V11.0.4.0.PFHCNXM:user/release-keys or xiaomi/violet/violet:9/PKQ1.181203.001/V11.0.8.0.PFHCNXM: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:67108864:1e26bfc0b22252bbb7a1317194ce2e5b91355281:67108864:550f0cfda70d646cb4553b35f370468ea9f8ae1c") || abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:67108864:1e26bfc0b22252bbb7a1317194ce2e5b91355281:67108864:550f0cfda70d646cb4553b35f370468ea9f8ae1c\" has unexpected contents.");
apply_patch_space(213626880) || 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", "1108,1,239,254,528,8324,8335,8336,8339,8340,8884,8885,9513,9515,9518,9520,9521,9526,9579,9583,9586,9589,16159,16160,19155,19156,20223,20224,24468,24469,27997,29249,29605,29606,30071,30072,32294,32295,32768,32990,36535,36536,42612,42613,49552,49553,52057,52058,56951,56952,57299,57300,57711,57712,69260,69261,88700,88701,90069,90070,93382,93383,98304,98526,102340,102341,105973,105974,108566,108567,113660,113661,114456,114457,115847,115848,116585,116586,126609,126610,129881,129882,139388,139392,139496,139499,139891,139894,140798,140799,146540,146541,148432,148434,149105,150276,150629,150630,158822,164458,167075,167077,167141,167142,168878,168880,170981,170984,170995,170996,179885,183092,187446,188284,188310,188313,188321,188322,188390,190683,190724,190725,191440,191442,192629,192630,192860,192862,192873,192876,200300,200302,200384,200387,200411,200412,200418,200420,200426,200427,206680,206681,208823,208825,213969,213970,214292,214294,214307,214308,214551,214553,214564,214567,214581,214583,214590,214591,215726,215728,215758,215761,215775,215776,215784,215786,215792,215793,216110,216112,216124,216125,216280,216282,216292,216295,217103,217104,217159,217161,217168,217171,219604,219605,229376,229598,239190,239191,244261,244263,249769,250515,250516,250529,250536,250539,251897,251900,252213,252215,252229,252232,252259,252260,256579,256581,256627,256628,256641,256643,256649,256650,256791,256793,256801,256802,262325,262326,262763,262765,262777,262778,266678,266680,266732,266733,266736,266738,266744,266745,266750,266752,266762,266763,266790,266792,266800,266801,268151,268153,268178,268179,268183,268185,268191,268194,268228,268229,273322,273960,273978,274661,274680,274681,274800,274802,274812,274813,274882,274884,274984,274985,278806,278808,279084,279087,280585,280588,282818,282819,284013,284015,284025,284026,286312,286313,287453,287455,287473,287474,288640,288642,288672,288673,288693,288695,288701,288702,289253,289255,289277,289278,289418,289420,289428,289431,291735,291736,291742,291745,291782,291783,293137,293138,293514,293516,293526,293527,293536,293538,293544,293545,293555,293557,293563,293566,293630,293631,294912,295134,295317,295319,295363,295366,295374,295375,295450,295451,295457,295458,295479,295481,295488,295489,295547,295549,295557,296070,296088,296091,296092,296094,296137,296138,296157,296158,296163,296164,296540,296541,302420,302422,302431,302432,302591,302592,302593,302594,302675,302677,302680,302682,302691,302692,305510,307728,307937,309410,311785,311829,311841,311843,311870,312241,312245,312247,312281,312333,312342,312343,312346,312538,312627,312628,320244,322720,322740,322741,322748,322750,323143,323345,324154,324157,324196,324199,324610,324611,324633,324635,324774,324777,324840,324842,325241,325246,325293,325294,325296,325298,325388,325391,326622,326625,326627,326629,326656,326657,326666,326668,326709,326712,326714,326716,326728,326729,329651,329653,331515,331516,331520,331522,331539,331540,331545,331547,331553,331554,331557,331559,331572,331575,331589,331592,331681,331682,331685,331687,331835,331838,332073,332076,332345,332348,332533,332536,332691,332692,332715,332717,332797,332800,332803,332805,332815,332818,332839,332840,332843,332845,332856,332857,332859,332861,332899,332900,332912,332914,332938,332941,332956,332959,333375,333376,333379,333381,333578,333579,336809,336810,336935,336937,337416,337417,339135,339137,340275,340276,340279,340281,340432,341268,341270,341272,341281,341284,341353,341356,341819,341820,341822,341824,341836,341839,343334,343335,343382,343384,343504,343507,344411,344412,345819,347477,347499,347500,347623,348107,348643,348646,348654,348656,348658,348661,348682,349131,349528,349533,349543,349546,349577,350776,351082,351085,351642,351644,351942,351943,352047,352049,352313,352314,352662,352664,352698,354161,354163,354165,354189,356684,359351,359354,359427,359430,359839,359840,361935,361936,361938,361940,361948,361949,361951,361953,361967,361968,361972,361973,379943,379944,391434,391438,391552,391554,392051,392052,392097,392099,392506,392507,392510,392512,392525,392526,393005,393007,393023,393024,393072,393074,393324,393325,405150,405152,407247,409001,409620,410215,410590,410593,410609,410612,410628,410631,410650,411574,411577,411580,411598,411599,411612,411614,411623,411624,414518,414519,418898,418900,421699,421700,421702,421704,421726,421727,423819,423821,424233,424234,429195,429197,433804,433805,433903,433905,433932,433933,434091,434093,434574,434575,434588,434590,434607,434608,434840,434841,434843,434846,434864,434865,438556,438557,438714,438715,438718,438720,438762,438763,438765,438767,438777,438780,438788,438789,438793,438795,438815,438816,438908,438910,439208,439209,440155,440157,440305,440308,440486,440487,440491,440493,440548,440549,440553,440555,440604,440607,440609,440611,440637,440640,440657,440658,441140,441142,441829,441830,441921,441923,441986,441989,442004,442005,442007,442009,442041,442044,443377,443379,444524,444525,444527,444528,445594,446712,446751,447761,449259,450129,450514,451987,451990,451992,453281,453282,453342,453343,453345,453347,453353,453354,453615,453616,453845,453846,453930,453931,453937,453939,454041,454042,454116,454117,454119,454120,454140,454141,454142,454143,454192,454193,454251,454252,454329,454330,454533,454535,454911,454913,456229,456230,456258,456259,456261,456262,456285,456286,457259,457260,457285,457286,457292,457297,457298,457299,457300,457301,458080,458081,458082,458083,458546,458548,459011,459012,459018,459020,459021,459023,459024,459025,459026,459027,459028,459029,459030,459031,459032,459033,459034,459035,459036,459037,459038,459041,459968,459969,459970,459971,462689,462690,464102,464103,464267,464268,472467,473783,474692,474693,476327,476328,478624,478625,481604,481605,482225,482226,482901,485705,485769,485770,487365,487366,487559,487560,487573,495765,498868,503335,504902,504903,508265,508266,508372,508373,509078,509079,509977,509978,513268,513269,516166,516168,518811,518812,519912,519913,524288,530360,536837,536840,536882,539027,539059,539069,539088,539093,539098,539099,539104,539465,539490,539496,539530,539536,539559,539565,540157,540171,540186,540208,540210,540215,540220,540606,541200,541934,541943,541944,541979,547632,548807,548808,555703,555704,556479,556488,558394,558425,558474,558537,558599,558633,558654,564699,566079,566080,571162,571163,571553,571554,576032,576033,577248,577249,580972,580973,600587,600588,605274,605275,618004,618005,618468,618469,620895,620896,637443,637444,638757,638758,641205,641206,642956,642957,649938,649940,657056,657057,657120,657121,662581,662582,669469,669470,677300,677301,680072,680073,680743,680744,682823,682824,687941,687942,693635,693636,694014,694015,701507,701508,705632,705633,708366,708367,711650,711652,715885,715886,716682,716684,719114,719115,724027,724028,730943,730944,732446,732449,733069,733070,733167,733168,735554,735555,736791,736792,737253,737257,737276,737277,737300,737301,737305,737306,737376,737377,737422,737423,737426,737427,737448,737449,737459,737460,737474,737475,737488,737489,737490,737492,737493,737494,737496,737497,737498,737499,737500,737501,737502,737503,737504,737505,737509,737510,737511,737512,737513,737514,737515,737516,737518,737519,737520,737521,737522,737523,737524,737525,737527,737528,737529,737530,737531,737532,737534,737535,737536,737537,737538,737539,737540,737541,737543,737544,737545,737548,737550,737552,737558,737559,737567,737569,737573,737574,737580,737581,737587,737588,738922,738924,738964,738965,739070,739072,739090,739092,739103,739104,742571,742572,742843,742844,742895,742898,742914,742917,743124,743127,743205,743206,747565,747566,748563,748564,748573,903029,917316,917503,917504") == "db9fc741545113e07791ca2b40d55fc6fb0524b6" || 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", "1108,1,239,254,528,8324,8335,8336,8339,8340,8884,8885,9513,9515,9518,9520,9521,9526,9579,9583,9586,9589,16159,16160,19155,19156,20223,20224,24468,24469,27997,29249,29605,29606,30071,30072,32294,32295,32768,32990,36535,36536,42612,42613,49552,49553,52057,52058,56951,56952,57299,57300,57711,57712,69260,69261,88700,88701,90069,90070,93382,93383,98304,98526,102340,102341,105973,105974,108566,108567,113660,113661,114456,114457,115847,115848,116585,116586,126609,126610,129881,129882,139388,139392,139496,139499,139891,139894,140798,140799,146540,146541,148432,148434,149105,150276,150629,150630,158822,164458,167075,167077,167141,167142,168878,168880,170981,170984,170995,170996,179885,183092,187446,188284,188310,188313,188321,188322,188390,190683,190724,190725,191440,191442,192629,192630,192860,192862,192873,192876,200300,200302,200384,200387,200411,200412,200418,200420,200426,200427,206680,206681,208823,208825,213969,213970,214292,214294,214307,214308,214551,214553,214564,214567,214581,214583,214590,214591,215726,215728,215758,215761,215775,215776,215784,215786,215792,215793,216110,216112,216124,216125,216280,216282,216292,216295,217103,217104,217159,217161,217168,217171,219604,219605,229376,229598,239190,239191,244261,244263,249769,250515,250516,250529,250536,250539,251897,251900,252213,252215,252229,252232,252259,252260,256579,256581,256627,256628,256641,256643,256649,256650,256791,256793,256801,256802,262325,262326,262763,262765,262777,262778,266678,266680,266732,266733,266736,266738,266744,266745,266750,266752,266762,266763,266790,266792,266800,266801,268151,268153,268178,268179,268183,268185,268191,268194,268228,268229,273322,273960,273978,274661,274680,274681,274800,274802,274812,274813,274882,274884,274984,274985,278806,278808,279084,279087,280585,280588,282818,282819,284013,284015,284025,284026,286312,286313,287453,287455,287473,287474,288640,288642,288672,288673,288693,288695,288701,288702,289253,289255,289277,289278,289418,289420,289428,289431,291735,291736,291742,291745,291782,291783,293137,293138,293514,293516,293526,293527,293536,293538,293544,293545,293555,293557,293563,293566,293630,293631,294912,295134,295317,295319,295363,295366,295374,295375,295450,295451,295457,295458,295479,295481,295488,295489,295547,295549,295557,296070,296088,296091,296092,296094,296137,296138,296157,296158,296163,296164,296540,296541,302420,302422,302431,302432,302591,302592,302593,302594,302675,302677,302680,302682,302691,302692,305510,307728,307937,309410,311785,311829,311841,311843,311870,312241,312245,312247,312281,312333,312342,312343,312346,312538,312627,312628,320244,322720,322740,322741,322748,322750,323143,323345,324154,324157,324196,324199,324610,324611,324633,324635,324774,324777,324840,324842,325241,325246,325293,325294,325296,325298,325388,325391,326622,326625,326627,326629,326656,326657,326666,326668,326709,326712,326714,326716,326728,326729,329651,329653,331515,331516,331520,331522,331539,331540,331545,331547,331553,331554,331557,331559,331572,331575,331589,331592,331681,331682,331685,331687,331835,331838,332073,332076,332345,332348,332533,332536,332691,332692,332715,332717,332797,332800,332803,332805,332815,332818,332839,332840,332843,332845,332856,332857,332859,332861,332899,332900,332912,332914,332938,332941,332956,332959,333375,333376,333379,333381,333578,333579,336809,336810,336935,336937,337416,337417,339135,339137,340275,340276,340279,340281,340432,341268,341270,341272,341281,341284,341353,341356,341819,341820,341822,341824,341836,341839,343334,343335,343382,343384,343504,343507,344411,344412,345819,347477,347499,347500,347623,348107,348643,348646,348654,348656,348658,348661,348682,349131,349528,349533,349543,349546,349577,350776,351082,351085,351642,351644,351942,351943,352047,352049,352313,352314,352662,352664,352698,354161,354163,354165,354189,356684,359351,359354,359427,359430,359839,359840,361935,361936,361938,361940,361948,361949,361951,361953,361967,361968,361972,361973,379943,379944,391434,391438,391552,391554,392051,392052,392097,392099,392506,392507,392510,392512,392525,392526,393005,393007,393023,393024,393072,393074,393324,393325,405150,405152,407247,409001,409620,410215,410590,410593,410609,410612,410628,410631,410650,411574,411577,411580,411598,411599,411612,411614,411623,411624,414518,414519,418898,418900,421699,421700,421702,421704,421726,421727,423819,423821,424233,424234,429195,429197,433804,433805,433903,433905,433932,433933,434091,434093,434574,434575,434588,434590,434607,434608,434840,434841,434843,434846,434864,434865,438556,438557,438714,438715,438718,438720,438762,438763,438765,438767,438777,438780,438788,438789,438793,438795,438815,438816,438908,438910,439208,439209,440155,440157,440305,440308,440486,440487,440491,440493,440548,440549,440553,440555,440604,440607,440609,440611,440637,440640,440657,440658,441140,441142,441829,441830,441921,441923,441986,441989,442004,442005,442007,442009,442041,442044,443377,443379,444524,444525,444527,444528,445594,446712,446751,447761,449259,450129,450514,451987,451990,451992,453281,453282,453342,453343,453345,453347,453353,453354,453615,453616,453845,453846,453930,453931,453937,453939,454041,454042,454116,454117,454119,454120,454140,454141,454142,454143,454192,454193,454251,454252,454329,454330,454533,454535,454911,454913,456229,456230,456258,456259,456261,456262,456285,456286,457259,457260,457285,457286,457292,457297,457298,457299,457300,457301,458080,458081,458082,458083,458546,458548,459011,459012,459018,459020,459021,459023,459024,459025,459026,459027,459028,459029,459030,459031,459032,459033,459034,459035,459036,459037,459038,459041,459968,459969,459970,459971,462689,462690,464102,464103,464267,464268,472467,473783,474692,474693,476327,476328,478624,478625,481604,481605,482225,482226,482901,485705,485769,485770,487365,487366,487559,487560,487573,495765,498868,503335,504902,504903,508265,508266,508372,508373,509078,509079,509977,509978,513268,513269,516166,516168,518811,518812,519912,519913,524288,530360,536837,536840,536882,539027,539059,539069,539088,539093,539098,539099,539104,539465,539490,539496,539530,539536,539559,539565,540157,540171,540186,540208,540210,540215,540220,540606,541200,541934,541943,541944,541979,547632,548807,548808,555703,555704,556479,556488,558394,558425,558474,558537,558599,558633,558654,564699,566079,566080,571162,571163,571553,571554,576032,576033,577248,577249,580972,580973,600587,600588,605274,605275,618004,618005,618468,618469,620895,620896,637443,637444,638757,638758,641205,641206,642956,642957,649938,649940,657056,657057,657120,657121,662581,662582,669469,669470,677300,677301,680072,680073,680743,680744,682823,682824,687941,687942,693635,693636,694014,694015,701507,701508,705632,705633,708366,708367,711650,711652,715885,715886,716682,716684,719114,719115,724027,724028,730943,730944,732446,732449,733069,733070,733167,733168,735554,735555,736791,736792,737253,737257,737276,737277,737300,737301,737305,737306,737376,737377,737422,737423,737426,737427,737448,737449,737459,737460,737474,737475,737488,737489,737490,737492,737493,737494,737496,737497,737498,737499,737500,737501,737502,737503,737504,737505,737509,737510,737511,737512,737513,737514,737515,737516,737518,737519,737520,737521,737522,737523,737524,737525,737527,737528,737529,737530,737531,737532,737534,737535,737536,737537,737538,737539,737540,737541,737543,737544,737545,737548,737550,737552,737558,737559,737567,737569,737573,737574,737580,737581,737587,737588,738922,738924,738964,738965,739070,739072,739090,739092,739103,739104,742571,742572,742843,742844,742895,742898,742914,742917,743124,743127,743205,743206,747565,747566,748563,748564,748573,903029,917316,917503,917504") && 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", "22,1,136,142,144,159,305,8223,32770,32895,98306,98431,163842,163967,229378,229503,272339,294912,294914,515995,524173,524287,524288") == "5f41aad83c2c997dd65ed2c1ee740f87fa084915" || 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", "22,1,136,142,144,159,305,8223,32770,32895,98306,98431,163842,163967,229378,229503,272339,294912,294914,515995,524173,524287,524288") && 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:67108864:1e26bfc0b22252bbb7a1317194ce2e5b91355281:67108864:550f0cfda70d646cb4553b35f370468ea9f8ae1c",
            "-", 550f0cfda70d646cb4553b35f370468ea9f8ae1c, 67108864,
            1e26bfc0b22252bbb7a1317194ce2e5b91355281, 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...");
ifelse(msm.boot_update("main"), (
package_extract_file("firmware-update/cmnlib64.mbn", "/dev/block/bootdevice/by-name/cmnlib64");
package_extract_file("firmware-update/vbmeta.img", "/dev/block/bootdevice/by-name/vbmeta");
package_extract_file("firmware-update/splash.img", "/dev/block/bootdevice/by-name/splash");
package_extract_file("firmware-update/imagefv.elf", "/dev/block/bootdevice/by-name/imagefv");
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/km4.mbn", "/dev/block/bootdevice/by-name/keymaster");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tz");
package_extract_file("firmware-update/aop.mbn", "/dev/block/bootdevice/by-name/aop");
package_extract_file("firmware-update/multi_image.mbn", "/dev/block/bootdevice/by-name/multiimgoem");
package_extract_file("firmware-update/xbl_config.elf", "/dev/block/bootdevice/by-name/xbl_config");
package_extract_file("firmware-update/storsec.mbn", "/dev/block/bootdevice/by-name/storsec");
package_extract_file("firmware-update/uefi_sec.mbn", "/dev/block/bootdevice/by-name/uefisecapp");
package_extract_file("firmware-update/qupv3fw.elf", "/dev/block/bootdevice/by-name/qupfw");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/abl");
package_extract_file("firmware-update/dtbo.img", "/dev/block/bootdevice/by-name/dtbo");
package_extract_file("firmware-update/devcfg.mbn", "/dev/block/bootdevice/by-name/devcfg");
package_extract_file("firmware-update/xbl.elf", "/dev/block/bootdevice/by-name/xbl");
), "");
ifelse(msm.boot_update("backup"), (
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/km4.mbn", "/dev/block/bootdevice/by-name/keymasterbak");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tzbak");
package_extract_file("firmware-update/aop.mbn", "/dev/block/bootdevice/by-name/aopbak");
package_extract_file("firmware-update/storsec.mbn", "/dev/block/bootdevice/by-name/storsecbak");
package_extract_file("firmware-update/uefi_sec.mbn", "/dev/block/bootdevice/by-name/uefisecappbak");
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/xbl.elf", "/dev/block/bootdevice/by-name/xblbak");
), "");
msm.boot_update("finalize");
package_extract_file("firmware-update/dspso.bin", "/dev/block/bootdevice/by-name/dsp");
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);
