# dmidecode 2.4 (=> Type: laptop)
SMBIOS 2.31 present.
27 structures occupying 1211 bytes.
Table at 0x000DF810.
Handle 0x0000
	DMI type 0, 20 bytes.
	BIOS Information
		Vendor: ACER   
		Version: 3A14
		Release Date: 04/20/2004
		Address: 0xE5160
		Runtime Size: 110240 bytes
		ROM Size: 512 kB
		Characteristics:
			ISA is supported
			PCI is supported
			PC Card (PCMCIA) is supported
			PNP is supported
			APM is supported
			BIOS is upgradeable
			BIOS shadowing is allowed
			ESCD support is available
			Boot from CD is supported
			3.5"/720 KB floppy services are supported (int 13h)
			Print screen service is supported (int 5h)
			8042 keyboard services are supported (int 9h)
			Serial services are supported (int 14h)
			Printer services are supported (int 17h)
			ACPI is supported
			USB legacy is supported
			AGP is supported
			Smart battery is supported
			BIOS boot specification is supported
Handle 0x0001
	DMI type 1, 25 bytes.
	System Information
		Manufacturer: Acer
		Product Name: TravelMate 6000
		Version: Rev 1                   
		Serial Number: LXT41050014200085CEF00
		UUID: E043E530-B1A3-D811-8AAC-00C09F3DF593
		Wake-up Type: Power Switch
Handle 0x0002
	DMI type 2, 8 bytes.
	Base Board Information
		Manufacturer: Acer
		Product Name: TravelMate 6000
		Version: Rev 1.0                 
		Serial Number: LXT41050014200085CEF00
Handle 0x0003
	DMI type 3, 17 bytes.
	Chassis Information
		Manufacturer: Acer
		Type: Notebook
		Lock: Not Present
		Version: Rev.1                   
		Serial Number: LXT41050014200085CEF00
		Asset Tag: ................................     
		Boot-up State: Safe
		Power Supply State: Safe
		Thermal State: Safe
		Security Status: None
		OEM Information: 0x00001234
Handle 0x0004
	DMI type 4, 35 bytes.
	Processor Information
		Socket Designation: uFCPGA2
		Type: Central Processor
		Family: Pentium M
		Manufacturer: Intel
		ID: 95 06 00 00 BF F9 E9 A7
		Signature: Type 0, Family 6, Model 9, Stepping 5
		Flags:
			FPU (Floating-point unit on-chip)
			VME (Virtual mode extension)
			DE (Debugging extension)
			PSE (Page size extension)
			TSC (Time stamp counter)
			MSR (Model specific registers)
			MCE (Machine check exception)
			CX8 (CMPXCHG8 instruction supported)
			SEP (Fast system call)
			MTRR (Memory type range registers)
			PGE (Page global enable)
			MCA (Machine check architecture)
			CMOV (Conditional move instruction supported)
			PAT (Page attribute table)
			CLFSH (CLFLUSH instruction supported)
			DS (Debug store)
			ACPI (ACPI supported)
			MMX (MMX technology supported)
			FXSR (Fast floating-point save and restore)
			SSE (Streaming SIMD extensions)
			SSE2 (Streaming SIMD extensions 2)
			TM (Thermal monitor supported)
			SBF (Signal break on FERR)
		Version: Intel(R) Pentium(R) M processor
		Voltage: 1.2 V
		External Clock: 400 MHz
		Max Speed: 1600 MHz
		Current Speed: 1600 MHz
		Status: Populated, Enabled
		Upgrade: ZIF Socket
		L1 Cache Handle: 0x0008
		L2 Cache Handle: 0x0009
		L3 Cache Handle: Not Provided
		Serial Number: Not Specified
		Asset Tag: Not Specified
		Part Number: Not Specified
Handle 0x0005
	DMI type 5, 20 bytes.
	Memory Controller Information
		Error Detecting Method: None
		Error Correcting Capabilities:
			None
		Supported Interleave: One-way Interleave
		Current Interleave: One-way Interleave
		Maximum Memory Module Size: 1024 MB
		Maximum Total Memory Size: 2048 MB
		Supported Speeds:
			60 ns
		Supported Memory Types:
			DIMM
		Memory Module Voltage: 3.3 V
		Associated Memory Slots: 2
			0x0006
			0x0007
		Enabled Error Correcting Capabilities:
			None
Handle 0x0006
	DMI type 6, 12 bytes.
	Memory Module Information
		Socket Designation: DIMM 1
		Bank Connections: 0 1
		Current Speed: 75 ns
		Type: DIMM SDRAM
		Installed Size: 256 MB (Double-bank Connection)
		Enabled Size: 256 MB (Double-bank Connection)
		Error Status: OK
Handle 0x0007
	DMI type 6, 12 bytes.
	Memory Module Information
		Socket Designation: DIMM 2
		Bank Connections: 2 3
		Current Speed: 75 ns
		Type: DIMM SDRAM
		Installed Size: 256 MB (Double-bank Connection)
		Enabled Size: 256 MB (Double-bank Connection)
		Error Status: OK
Handle 0x0008
	DMI type 7, 19 bytes.
	Cache Information
		Socket Designation: L1 Cache
		Configuration: Enabled, Not Socketed, Level 1
		Operational Mode: Write Back
		Location: Internal
		Installed Size: 32 KB
		Maximum Size: 32 KB
		Supported SRAM Types:
			Burst
			Pipeline Burst
			Asynchronous
		Installed SRAM Type: Asynchronous
		Speed: Unknown
		Error Correction Type: Unknown
		System Type: Unknown
		Associativity: Unknown
Handle 0x0009
	DMI type 7, 19 bytes.
	Cache Information
		Socket Designation: L2 Cache
		Configuration: Enabled, Not Socketed, Level 2
		Operational Mode: Write Back
		Location: External
		Installed Size: 1024 KB
		Maximum Size: 1024 KB
		Supported SRAM Types:
			Burst
			Pipeline Burst
			Asynchronous
		Installed SRAM Type: Burst
		Speed: Unknown
		Error Correction Type: Unknown
		System Type: Unknown
		Associativity: Unknown
Handle 0x000A
	DMI type 8, 9 bytes.
	Port Connector Information
		Internal Reference Designator: LPT 1
		Internal Connector Type: None
		External Reference Designator: Parallel
		External Connector Type: DB-25 female
		Port Type: Parallel Port ECP/EPP
Handle 0x000B
	DMI type 8, 9 bytes.
	Port Connector Information
		Internal Reference Designator: U28
		Internal Connector Type: None
		External Reference Designator: PS/2 Mouse
		External Connector Type: Circular DIN-8 male
		Port Type: Keyboard Port
Handle 0x000C
	DMI type 9, 13 bytes.
	System Slot Information
		Designation: PCMCIA socket 0
		Type: 32-bit PC Card (PCMCIA)
		Current Usage: Unknown
		Length: Long
		ID: Adapter 0, Socket 0
		Characteristics:
			5.0 V is provided
			3.3 V is provided
			PC Card-16 is supported
			Cardbus is supported
			Modem ring resume is supported
			PME signal is supported
			Hot-plug devices are supported
Handle 0x000D
	DMI type 10, 10 bytes.
	On Board Device 1 Information
		Type: Video
		Status: Disabled
		Description: Montara-GME
	On Board Device 2 Information
		Type: Sound
		Status: Disabled
		Description: AC97 Audio
	On Board Device 3 Information
		Type: Other
		Status: Disabled
		Description: TI TSB43AB21 IEEE-1394 Controller
Handle 0x000E
	DMI type 11, 5 bytes.
	OEM Strings
		String 1: SMBIOS 2.3
		String 2: Customer Reference Platform
Handle 0x000F
	DMI type 12, 5 bytes.
	System Configuration Options
		Option 1: No Jumper On This Platform.
Handle 0x0010
	DMI type 15, 29 bytes.
	System Event Log
		Area Length: 0 bytes
		Header Start Offset: 0x0000
		Header Length: 16 bytes
		Data Start Offset: 0x0010
		Access Method: Memory-mapped physical 32-bit address
		Access Address: 0x00000000
		Status: Invalid, Not Full
		Change Token: 0x00000000
		Header Format: Type 1
		Supported Log Type Descriptors: 3
		Descriptor 1: POST error
		Data Format 1: POST results bitmap
		Descriptor 2: Single-bit ECC memory error
		Data Format 2: Multiple-event
		Descriptor 3: Multi-bit ECC memory error
		Data Format 3: Multiple-event
Handle 0x0011
	DMI type 16, 15 bytes.
	Physical Memory Array
		Location: System Board Or Motherboard
		Use: System Memory
		Error Correction Type: None
		Maximum Capacity: 3 GB
		Error Information Handle: Not Provided
		Number Of Devices: 2
Handle 0x0012
	DMI type 17, 27 bytes.
	Memory Device
		Array Handle: 0x0011
		Error Information Handle: No Error
		Total Width: 64 bits
		Data Width: 64 bits
		Size: 256 MB
		Form Factor: DIMM
		Set: 1
		Locator: DIMM 0
		Bank Locator: Bank 0, 1
		Type: SRAM
		Type Detail: Synchronous
		Speed: 333 MHz (3.0 ns)
		Manufacturer: Not Specified
		Serial Number: Not Specified
		Asset Tag: Not Specified
		Part Number: Not Specified
Handle 0x0013
	DMI type 17, 27 bytes.
	Memory Device
		Array Handle: 0x0011
		Error Information Handle: No Error
		Total Width: 64 bits
		Data Width: 64 bits
		Size: 256 MB
		Form Factor: DIMM
		Set: 1
		Locator: DIMM 1
		Bank Locator: Bank 2, 3
		Type: SRAM
		Type Detail: Synchronous
		Speed: 333 MHz (3.0 ns)
		Manufacturer: Not Specified
		Serial Number: Not Specified
		Asset Tag: Not Specified
		Part Number: Not Specified
Handle 0x0014
	DMI type 19, 15 bytes.
	Memory Array Mapped Address
		Starting Address: 0x00000000000
		Ending Address: 0x0001FFFFFFF
		Range Size: 512 MB
		Physical Array Handle: 0x0011
		Partition Width: 0
Handle 0x0015
	DMI type 20, 19 bytes.
	Memory Device Mapped Address
		Starting Address: 0x00000000000
		Ending Address: 0x0000FFFFFFF
		Range Size: 256 MB
		Physical Device Handle: 0x0012
		Memory Array Mapped Address Handle: 0x0014
		Partition Row Position: 1
		Interleave Position: 1
Handle 0x0016
	DMI type 20, 19 bytes.
	Memory Device Mapped Address
		Starting Address: 0x00010000000
		Ending Address: 0x0001FFFFFFF
		Range Size: 256 MB
		Physical Device Handle: 0x0013
		Memory Array Mapped Address Handle: 0x0014
		Partition Row Position: 1
		Interleave Position: 1
Handle 0x0017
	DMI type 21, 7 bytes.
	Built-in Pointing Device
		Type: Mouse
		Interface: PS/2
		Buttons: 2
Handle 0x0018
	DMI type 22, 26 bytes.
	Portable Battery
		Location: Right Side
		Manufacturer: Sanyo
		Name: Sanyo
		Chemistry: Lithium Ion
		Design Capacity: 4400 mWh
		Design Voltage: 14800 mV
		SBDS Version: Bat123
		Maximum Error: 6%
		SBDS Serial Number: 04D2
		SBDS Manufacture Date: 1985-08-25
		OEM-specific Information: 0x00000000
Handle 0x0019
	DMI type 32, 20 bytes.
	System Boot Information
		Status: <OUT OF SPEC>
Handle 0x001A
	DMI type 127, 4 bytes.
	End Of Table
n100' href='#n100'>100</a>
<a id='n101' href='#n101'>101</a>
<a id='n102' href='#n102'>102</a>
<a id='n103' href='#n103'>103</a>
<a id='n104' href='#n104'>104</a>
<a id='n105' href='#n105'>105</a>
<a id='n106' href='#n106'>106</a>
<a id='n107' href='#n107'>107</a>
<a id='n108' href='#n108'>108</a>
<a id='n109' href='#n109'>109</a>
<a id='n110' href='#n110'>110</a>
<a id='n111' href='#n111'>111</a>
<a id='n112' href='#n112'>112</a>
<a id='n113' href='#n113'>113</a>
<a id='n114' href='#n114'>114</a>
<a id='n115' href='#n115'>115</a>
<a id='n116' href='#n116'>116</a>
<a id='n117' href='#n117'>117</a>
<a id='n118' href='#n118'>118</a>
<a id='n119' href='#n119'>119</a>
<a id='n120' href='#n120'>120</a>
<a id='n121' href='#n121'>121</a>
<a id='n122' href='#n122'>122</a>
<a id='n123' href='#n123'>123</a>
<a id='n124' href='#n124'>124</a>
<a id='n125' href='#n125'>125</a>
<a id='n126' href='#n126'>126</a>
<a id='n127' href='#n127'>127</a>
<a id='n128' href='#n128'>128</a>
<a id='n129' href='#n129'>129</a>
<a id='n130' href='#n130'>130</a>
<a id='n131' href='#n131'>131</a>
<a id='n132' href='#n132'>132</a>
<a id='n133' href='#n133'>133</a>
<a id='n134' href='#n134'>134</a>
<a id='n135' href='#n135'>135</a>
<a id='n136' href='#n136'>136</a>
<a id='n137' href='#n137'>137</a>
<a id='n138' href='#n138'>138</a>
<a id='n139' href='#n139'>139</a>
<a id='n140' href='#n140'>140</a>
<a id='n141' href='#n141'>141</a>
<a id='n142' href='#n142'>142</a>
<a id='n143' href='#n143'>143</a>
<a id='n144' href='#n144'>144</a>
<a id='n145' href='#n145'>145</a>
<a id='n146' href='#n146'>146</a>
<a id='n147' href='#n147'>147</a>
<a id='n148' href='#n148'>148</a>
<a id='n149' href='#n149'>149</a>
<a id='n150' href='#n150'>150</a>
<a id='n151' href='#n151'>151</a>
<a id='n152' href='#n152'>152</a>
<a id='n153' href='#n153'>153</a>
<a id='n154' href='#n154'>154</a>
<a id='n155' href='#n155'>155</a>
<a id='n156' href='#n156'>156</a>
<a id='n157' href='#n157'>157</a>
<a id='n158' href='#n158'>158</a>
<a id='n159' href='#n159'>159</a>
<a id='n160' href='#n160'>160</a>
<a id='n161' href='#n161'>161</a>
<a id='n162' href='#n162'>162</a>
<a id='n163' href='#n163'>163</a>
<a id='n164' href='#n164'>164</a>
<a id='n165' href='#n165'>165</a>
<a id='n166' href='#n166'>166</a>
<a id='n167' href='#n167'>167</a>
<a id='n168' href='#n168'>168</a>
<a id='n169' href='#n169'>169</a>
<a id='n170' href='#n170'>170</a>
<a id='n171' href='#n171'>171</a>
<a id='n172' href='#n172'>172</a>
<a id='n173' href='#n173'>173</a>
<a id='n174' href='#n174'>174</a>
<a id='n175' href='#n175'>175</a>
<a id='n176' href='#n176'>176</a>
<a id='n177' href='#n177'>177</a>
<a id='n178' href='#n178'>178</a>
<a id='n179' href='#n179'>179</a>
<a id='n180' href='#n180'>180</a>
<a id='n181' href='#n181'>181</a>
<a id='n182' href='#n182'>182</a>
<a id='n183' href='#n183'>183</a>
<a id='n184' href='#n184'>184</a>
<a id='n185' href='#n185'>185</a>
<a id='n186' href='#n186'>186</a>
<a id='n187' href='#n187'>187</a>
<a id='n188' href='#n188'>188</a>
<a id='n189' href='#n189'>189</a>
<a id='n190' href='#n190'>190</a>
<a id='n191' href='#n191'>191</a>
<a id='n192' href='#n192'>192</a>
<a id='n193' href='#n193'>193</a>
<a id='n194' href='#n194'>194</a>
<a id='n195' href='#n195'>195</a>
<a id='n196' href='#n196'>196</a>
<a id='n197' href='#n197'>197</a>
<a id='n198' href='#n198'>198</a>
<a id='n199' href='#n199'>199</a>
<a id='n200' href='#n200'>200</a>
<a id='n201' href='#n201'>201</a>
<a id='n202' href='#n202'>202</a>
<a id='n203' href='#n203'>203</a>
<a id='n204' href='#n204'>204</a>
<a id='n205' href='#n205'>205</a>
<a id='n206' href='#n206'>206</a>
<a id='n207' href='#n207'>207</a>
<a id='n208' href='#n208'>208</a>
<a id='n209' href='#n209'>209</a>
<a id='n210' href='#n210'>210</a>
<a id='n211' href='#n211'>211</a>
<a id='n212' href='#n212'>212</a>
<a id='n213' href='#n213'>213</a>
<a id='n214' href='#n214'>214</a>
<a id='n215' href='#n215'>215</a>
<a id='n216' href='#n216'>216</a>
<a id='n217' href='#n217'>217</a>
<a id='n218' href='#n218'>218</a>
<a id='n219' href='#n219'>219</a>
<a id='n220' href='#n220'>220</a>
<a id='n221' href='#n221'>221</a>
<a id='n222' href='#n222'>222</a>
<a id='n223' href='#n223'>223</a>
<a id='n224' href='#n224'>224</a>
<a id='n225' href='#n225'>225</a>
<a id='n226' href='#n226'>226</a>
<a id='n227' href='#n227'>227</a>
<a id='n228' href='#n228'>228</a>
<a id='n229' href='#n229'>229</a>
<a id='n230' href='#n230'>230</a>
<a id='n231' href='#n231'>231</a>
<a id='n232' href='#n232'>232</a>
<a id='n233' href='#n233'>233</a>
<a id='n234' href='#n234'>234</a>
<a id='n235' href='#n235'>235</a>
<a id='n236' href='#n236'>236</a>
<a id='n237' href='#n237'>237</a>
<a id='n238' href='#n238'>238</a>
<a id='n239' href='#n239'>239</a>
<a id='n240' href='#n240'>240</a>
<a id='n241' href='#n241'>241</a>
<a id='n242' href='#n242'>242</a>
<a id='n243' href='#n243'>243</a>
<a id='n244' href='#n244'>244</a>
<a id='n245' href='#n245'>245</a>
<a id='n246' href='#n246'>246</a>
<a id='n247' href='#n247'>247</a>
<a id='n248' href='#n248'>248</a>
<a id='n249' href='#n249'>249</a>
<a id='n250' href='#n250'>250</a>
<a id='n251' href='#n251'>251</a>
<a id='n252' href='#n252'>252</a>
<a id='n253' href='#n253'>253</a>
<a id='n254' href='#n254'>254</a>
<a id='n255' href='#n255'>255</a>
<a id='n256' href='#n256'>256</a>
<a id='n257' href='#n257'>257</a>
<a id='n258' href='#n258'>258</a>
<a id='n259' href='#n259'>259</a>
<a id='n260' href='#n260'>260</a>
<a id='n261' href='#n261'>261</a>
<a id='n262' href='#n262'>262</a>
<a id='n263' href='#n263'>263</a>
<a id='n264' href='#n264'>264</a>
<a id='n265' href='#n265'>265</a>
<a id='n266' href='#n266'>266</a>
<a id='n267' href='#n267'>267</a>
<a id='n268' href='#n268'>268</a>
<a id='n269' href='#n269'>269</a>
<a id='n270' href='#n270'>270</a>
<a id='n271' href='#n271'>271</a>
<a id='n272' href='#n272'>272</a>
<a id='n273' href='#n273'>273</a>
<a id='n274' href='#n274'>274</a>
<a id='n275' href='#n275'>275</a>
<a id='n276' href='#n276'>276</a>
<a id='n277' href='#n277'>277</a>
<a id='n278' href='#n278'>278</a>
<a id='n279' href='#n279'>279</a>
<a id='n280' href='#n280'>280</a>
<a id='n281' href='#n281'>281</a>
<a id='n282' href='#n282'>282</a>
<a id='n283' href='#n283'>283</a>
<a id='n284' href='#n284'>284</a>
<a id='n285' href='#n285'>285</a>
<a id='n286' href='#n286'>286</a>
<a id='n287' href='#n287'>287</a>
<a id='n288' href='#n288'>288</a>
<a id='n289' href='#n289'>289</a>
<a id='n290' href='#n290'>290</a>
<a id='n291' href='#n291'>291</a>
<a id='n292' href='#n292'>292</a>
<a id='n293' href='#n293'>293</a>
<a id='n294' href='#n294'>294</a>
<a id='n295' href='#n295'>295</a>
<a id='n296' href='#n296'>296</a>
<a id='n297' href='#n297'>297</a>
<a id='n298' href='#n298'>298</a>
<a id='n299' href='#n299'>299</a>
<a id='n300' href='#n300'>300</a>
<a id='n301' href='#n301'>301</a>
<a id='n302' href='#n302'>302</a>
<a id='n303' href='#n303'>303</a>
<a id='n304' href='#n304'>304</a>
<a id='n305' href='#n305'>305</a>
<a id='n306' href='#n306'>306</a>
<a id='n307' href='#n307'>307</a>
<a id='n308' href='#n308'>308</a>
<a id='n309' href='#n309'>309</a>
<a id='n310' href='#n310'>310</a>
<a id='n311' href='#n311'>311</a>
<a id='n312' href='#n312'>312</a>
<a id='n313' href='#n313'>313</a>
<a id='n314' href='#n314'>314</a>
<a id='n315' href='#n315'>315</a>
<a id='n316' href='#n316'>316</a>
<a id='n317' href='#n317'>317</a>
<a id='n318' href='#n318'>318</a>
<a id='n319' href='#n319'>319</a>
<a id='n320' href='#n320'>320</a>
<a id='n321' href='#n321'>321</a>
<a id='n322' href='#n322'>322</a>
<a id='n323' href='#n323'>323</a>
<a id='n324' href='#n324'>324</a>
<a id='n325' href='#n325'>325</a>
<a id='n326' href='#n326'>326</a>
<a id='n327' href='#n327'>327</a>
<a id='n328' href='#n328'>328</a>
<a id='n329' href='#n329'>329</a>
<a id='n330' href='#n330'>330</a>
<a id='n331' href='#n331'>331</a>
<a id='n332' href='#n332'>332</a>
<a id='n333' href='#n333'>333</a>
<a id='n334' href='#n334'>334</a>
<a id='n335' href='#n335'>335</a>
<a id='n336' href='#n336'>336</a>
<a id='n337' href='#n337'>337</a>
<a id='n338' href='#n338'>338</a>
<a id='n339' href='#n339'>339</a>
<a id='n340' href='#n340'>340</a>
<a id='n341' href='#n341'>341</a>
<a id='n342' href='#n342'>342</a>
<a id='n343' href='#n343'>343</a>
<a id='n344' href='#n344'>344</a>
<a id='n345' href='#n345'>345</a>
<a id='n346' href='#n346'>346</a>
<a id='n347' href='#n347'>347</a>
<a id='n348' href='#n348'>348</a>
<a id='n349' href='#n349'>349</a>
<a id='n350' href='#n350'>350</a>
<a id='n351' href='#n351'>351</a>
<a id='n352' href='#n352'>352</a>
<a id='n353' href='#n353'>353</a>
<a id='n354' href='#n354'>354</a>
<a id='n355' href='#n355'>355</a>
<a id='n356' href='#n356'>356</a>
<a id='n357' href='#n357'>357</a>
<a id='n358' href='#n358'>358</a>
<a id='n359' href='#n359'>359</a>
<a id='n360' href='#n360'>360</a>
<a id='n361' href='#n361'>361</a>
<a id='n362' href='#n362'>362</a>
<a id='n363' href='#n363'>363</a>
<a id='n364' href='#n364'>364</a>
<a id='n365' href='#n365'>365</a>
<a id='n366' href='#n366'>366</a>
<a id='n367' href='#n367'>367</a>
<a id='n368' href='#n368'>368</a>
<a id='n369' href='#n369'>369</a>
<a id='n370' href='#n370'>370</a>
<a id='n371' href='#n371'>371</a>
<a id='n372' href='#n372'>372</a>
<a id='n373' href='#n373'>373</a>
<a id='n374' href='#n374'>374</a>
<a id='n375' href='#n375'>375</a>
<a id='n376' href='#n376'>376</a>
<a id='n377' href='#n377'>377</a>
<a id='n378' href='#n378'>378</a>
<a id='n379' href='#n379'>379</a>
<a id='n380' href='#n380'>380</a>
<a id='n381' href='#n381'>381</a>
<a id='n382' href='#n382'>382</a>
<a id='n383' href='#n383'>383</a>
<a id='n384' href='#n384'>384</a>
<a id='n385' href='#n385'>385</a>
<a id='n386' href='#n386'>386</a>
<a id='n387' href='#n387'>387</a>
<a id='n388' href='#n388'>388</a>
<a id='n389' href='#n389'>389</a>
<a id='n390' href='#n390'>390</a>
<a id='n391' href='#n391'>391</a>
<a id='n392' href='#n392'>392</a>
<a id='n393' href='#n393'>393</a>
<a id='n394' href='#n394'>394</a>
<a id='n395' href='#n395'>395</a>
<a id='n396' href='#n396'>396</a>
<a id='n397' href='#n397'>397</a>
<a id='n398' href='#n398'>398</a>
<a id='n399' href='#n399'>399</a>
<a id='n400' href='#n400'>400</a>
<a id='n401' href='#n401'>401</a>
<a id='n402' href='#n402'>402</a>
<a id='n403' href='#n403'>403</a>
<a id='n404' href='#n404'>404</a>
<a id='n405' href='#n405'>405</a>
<a id='n406' href='#n406'>406</a>
<a id='n407' href='#n407'>407</a>
<a id='n408' href='#n408'>408</a>
<a id='n409' href='#n409'>409</a>
<a id='n410' href='#n410'>410</a>
<a id='n411' href='#n411'>411</a>
<a id='n412' href='#n412'>412</a>
<a id='n413' href='#n413'>413</a>
<a id='n414' href='#n414'>414</a>
<a id='n415' href='#n415'>415</a>
<a id='n416' href='#n416'>416</a>
<a id='n417' href='#n417'>417</a>
<a id='n418' href='#n418'>418</a>
<a id='n419' href='#n419'>419</a>
<a id='n420' href='#n420'>420</a>
<a id='n421' href='#n421'>421</a>
<a id='n422' href='#n422'>422</a>
<a id='n423' href='#n423'>423</a>
<a id='n424' href='#n424'>424</a>
<a id='n425' href='#n425'>425</a>
<a id='n426' href='#n426'>426</a>
<a id='n427' href='#n427'>427</a>
<a id='n428' href='#n428'>428</a>
<a id='n429' href='#n429'>429</a>
<a id='n430' href='#n430'>430</a>
<a id='n431' href='#n431'>431</a>
<a id='n432' href='#n432'>432</a>
<a id='n433' href='#n433'>433</a>
<a id='n434' href='#n434'>434</a>
<a id='n435' href='#n435'>435</a>
<a id='n436' href='#n436'>436</a>
<a id='n437' href='#n437'>437</a>
<a id='n438' href='#n438'>438</a>
<a id='n439' href='#n439'>439</a>
<a id='n440' href='#n440'>440</a>
<a id='n441' href='#n441'>441</a>
<a id='n442' href='#n442'>442</a>
<a id='n443' href='#n443'>443</a>
<a id='n444' href='#n444'>444</a>
<a id='n445' href='#n445'>445</a>
<a id='n446' href='#n446'>446</a>
<a id='n447' href='#n447'>447</a>
<a id='n448' href='#n448'>448</a>
<a id='n449' href='#n449'>449</a>
<a id='n450' href='#n450'>450</a>
<a id='n451' href='#n451'>451</a>
<a id='n452' href='#n452'>452</a>
<a id='n453' href='#n453'>453</a>
<a id='n454' href='#n454'>454</a>
<a id='n455' href='#n455'>455</a>
<a id='n456' href='#n456'>456</a>
<a id='n457' href='#n457'>457</a>
<a id='n458' href='#n458'>458</a>
<a id='n459' href='#n459'>459</a>
<a id='n460' href='#n460'>460</a>
<a id='n461' href='#n461'>461</a>
<a id='n462' href='#n462'>462</a>
<a id='n463' href='#n463'>463</a>
<a id='n464' href='#n464'>464</a>
<a id='n465' href='#n465'>465</a>
<a id='n466' href='#n466'>466</a>
<a id='n467' href='#n467'>467</a>
<a id='n468' href='#n468'>468</a>
<a id='n469' href='#n469'>469</a>
<a id='n470' href='#n470'>470</a>
<a id='n471' href='#n471'>471</a>
<a id='n472' href='#n472'>472</a>
<a id='n473' href='#n473'>473</a>
<a id='n474' href='#n474'>474</a>
<a id='n475' href='#n475'>475</a>
<a id='n476' href='#n476'>476</a>
<a id='n477' href='#n477'>477</a>
<a id='n478' href='#n478'>478</a>
<a id='n479' href='#n479'>479</a>
<a id='n480' href='#n480'>480</a>
<a id='n481' href='#n481'>481</a>
<a id='n482' href='#n482'>482</a>
<a id='n483' href='#n483'>483</a>
<a id='n484' href='#n484'>484</a>
<a id='n485' href='#n485'>485</a>
<a id='n486' href='#n486'>486</a>
<a id='n487' href='#n487'>487</a>
<a id='n488' href='#n488'>488</a>
<a id='n489' href='#n489'>489</a>
<a id='n490' href='#n490'>490</a>
<a id='n491' href='#n491'>491</a>
<a id='n492' href='#n492'>492</a>
<a id='n493' href='#n493'>493</a>
<a id='n494' href='#n494'>494</a>
<a id='n495' href='#n495'>495</a>
<a id='n496' href='#n496'>496</a>
<a id='n497' href='#n497'>497</a>
<a id='n498' href='#n498'>498</a>
<a id='n499' href='#n499'>499</a>
<a id='n500' href='#n500'>500</a>
<a id='n501' href='#n501'>501</a>
<a id='n502' href='#n502'>502</a>
<a id='n503' href='#n503'>503</a>
<a id='n504' href='#n504'>504</a>
<a id='n505' href='#n505'>505</a>
<a id='n506' href='#n506'>506</a>
<a id='n507' href='#n507'>507</a>
<a id='n508' href='#n508'>508</a>
<a id='n509' href='#n509'>509</a>
<a id='n510' href='#n510'>510</a>
<a id='n511' href='#n511'>511</a>
<a id='n512' href='#n512'>512</a>
<a id='n513' href='#n513'>513</a>
<a id='n514' href='#n514'>514</a>
<a id='n515' href='#n515'>515</a>
<a id='n516' href='#n516'>516</a>
<a id='n517' href='#n517'>517</a>
<a id='n518' href='#n518'>518</a>
<a id='n519' href='#n519'>519</a>
<a id='n520' href='#n520'>520</a>
<a id='n521' href='#n521'>521</a>
<a id='n522' href='#n522'>522</a>
<a id='n523' href='#n523'>523</a>
<a id='n524' href='#n524'>524</a>
<a id='n525' href='#n525'>525</a>
<a id='n526' href='#n526'>526</a>
<a id='n527' href='#n527'>527</a>
<a id='n528' href='#n528'>528</a>
<a id='n529' href='#n529'>529</a>
<a id='n530' href='#n530'>530</a>
<a id='n531' href='#n531'>531</a>
<a id='n532' href='#n532'>532</a>
<a id='n533' href='#n533'>533</a>
<a id='n534' href='#n534'>534</a>
<a id='n535' href='#n535'>535</a>
<a id='n536' href='#n536'>536</a>
<a id='n537' href='#n537'>537</a>
<a id='n538' href='#n538'>538</a>
<a id='n539' href='#n539'>539</a>
<a id='n540' href='#n540'>540</a>
<a id='n541' href='#n541'>541</a>
<a id='n542' href='#n542'>542</a>
<a id='n543' href='#n543'>543</a>
<a id='n544' href='#n544'>544</a>
<a id='n545' href='#n545'>545</a>
<a id='n546' href='#n546'>546</a>
<a id='n547' href='#n547'>547</a>
<a id='n548' href='#n548'>548</a>
<a id='n549' href='#n549'>549</a>
<a id='n550' href='#n550'>550</a>
<a id='n551' href='#n551'>551</a>
<a id='n552' href='#n552'>552</a>
<a id='n553' href='#n553'>553</a>
<a id='n554' href='#n554'>554</a>
<a id='n555' href='#n555'>555</a>
<a id='n556' href='#n556'>556</a>
<a id='n557' href='#n557'>557</a>
<a id='n558' href='#n558'>558</a>
<a id='n559' href='#n559'>559</a>
<a id='n560' href='#n560'>560</a>
<a id='n561' href='#n561'>561</a>
<a id='n562' href='#n562'>562</a>
<a id='n563' href='#n563'>563</a>
<a id='n564' href='#n564'>564</a>
<a id='n565' href='#n565'>565</a>
<a id='n566' href='#n566'>566</a>
<a id='n567' href='#n567'>567</a>
<a id='n568' href='#n568'>568</a>
<a id='n569' href='#n569'>569</a>
<a id='n570' href='#n570'>570</a>
<a id='n571' href='#n571'>571</a>
<a id='n572' href='#n572'>572</a>
<a id='n573' href='#n573'>573</a>
<a id='n574' href='#n574'>574</a>
<a id='n575' href='#n575'>575</a>
<a id='n576' href='#n576'>576</a>
<a id='n577' href='#n577'>577</a>
<a id='n578' href='#n578'>578</a>
<a id='n579' href='#n579'>579</a>
<a id='n580' href='#n580'>580</a>
<a id='n581' href='#n581'>581</a>
<a id='n582' href='#n582'>582</a>
<a id='n583' href='#n583'>583</a>
<a id='n584' href='#n584'>584</a>
<a id='n585' href='#n585'>585</a>
<a id='n586' href='#n586'>586</a>
<a id='n587' href='#n587'>587</a>
<a id='n588' href='#n588'>588</a>
<a id='n589' href='#n589'>589</a>
<a id='n590' href='#n590'>590</a>
<a id='n591' href='#n591'>591</a>
<a id='n592' href='#n592'>592</a>
<a id='n593' href='#n593'>593</a>
<a id='n594' href='#n594'>594</a>
<a id='n595' href='#n595'>595</a>
<a id='n596' href='#n596'>596</a>
<a id='n597' href='#n597'>597</a>
<a id='n598' href='#n598'>598</a>
<a id='n599' href='#n599'>599</a>
<a id='n600' href='#n600'>600</a>
<a id='n601' href='#n601'>601</a>
<a id='n602' href='#n602'>602</a>
<a id='n603' href='#n603'>603</a>
<a id='n604' href='#n604'>604</a>
<a id='n605' href='#n605'>605</a>
<a id='n606' href='#n606'>606</a>
<a id='n607' href='#n607'>607</a>
<a id='n608' href='#n608'>608</a>
<a id='n609' href='#n609'>609</a>
<a id='n610' href='#n610'>610</a>
<a id='n611' href='#n611'>611</a>
<a id='n612' href='#n612'>612</a>
<a id='n613' href='#n613'>613</a>
<a id='n614' href='#n614'>614</a>
<a id='n615' href='#n615'>615</a>
<a id='n616' href='#n616'>616</a>
<a id='n617' href='#n617'>617</a>
<a id='n618' href='#n618'>618</a>
<a id='n619' href='#n619'>619</a>
<a id='n620' href='#n620'>620</a>
<a id='n621' href='#n621'>621</a>
<a id='n622' href='#n622'>622</a>
<a id='n623' href='#n623'>623</a>
<a id='n624' href='#n624'>624</a>
<a id='n625' href='#n625'>625</a>
<a id='n626' href='#n626'>626</a>
<a id='n627' href='#n627'>627</a>
<a id='n628' href='#n628'>628</a>
<a id='n629' href='#n629'>629</a>
<a id='n630' href='#n630'>630</a>
<a id='n631' href='#n631'>631</a>
<a id='n632' href='#n632'>632</a>
<a id='n633' href='#n633'>633</a>
<a id='n634' href='#n634'>634</a>
<a id='n635' href='#n635'>635</a>
<a id='n636' href='#n636'>636</a>
<a id='n637' href='#n637'>637</a>
<a id='n638' href='#n638'>638</a>
<a id='n639' href='#n639'>639</a>
<a id='n640' href='#n640'>640</a>
<a id='n641' href='#n641'>641</a>
<a id='n642' href='#n642'>642</a>
<a id='n643' href='#n643'>643</a>
<a id='n644' href='#n644'>644</a>
<a id='n645' href='#n645'>645</a>
<a id='n646' href='#n646'>646</a>
<a id='n647' href='#n647'>647</a>
<a id='n648' href='#n648'>648</a>
<a id='n649' href='#n649'>649</a>
<a id='n650' href='#n650'>650</a>
<a id='n651' href='#n651'>651</a>
<a id='n652' href='#n652'>652</a>
<a id='n653' href='#n653'>653</a>
<a id='n654' href='#n654'>654</a>
<a id='n655' href='#n655'>655</a>
<a id='n656' href='#n656'>656</a>
<a id='n657' href='#n657'>657</a>
<a id='n658' href='#n658'>658</a>
<a id='n659' href='#n659'>659</a>
<a id='n660' href='#n660'>660</a>
<a id='n661' href='#n661'>661</a>
<a id='n662' href='#n662'>662</a>
<a id='n663' href='#n663'>663</a>
<a id='n664' href='#n664'>664</a>
<a id='n665' href='#n665'>665</a>
<a id='n666' href='#n666'>666</a>
<a id='n667' href='#n667'>667</a>
<a id='n668' href='#n668'>668</a>
<a id='n669' href='#n669'>669</a>
<a id='n670' href='#n670'>670</a>
<a id='n671' href='#n671'>671</a>
<a id='n672' href='#n672'>672</a>
<a id='n673' href='#n673'>673</a>
<a id='n674' href='#n674'>674</a>
<a id='n675' href='#n675'>675</a>
<a id='n676' href='#n676'>676</a>
<a id='n677' href='#n677'>677</a>
<a id='n678' href='#n678'>678</a>
<a id='n679' href='#n679'>679</a>
<a id='n680' href='#n680'>680</a>
<a id='n681' href='#n681'>681</a>
<a id='n682' href='#n682'>682</a>
<a id='n683' href='#n683'>683</a>
<a id='n684' href='#n684'>684</a>
<a id='n685' href='#n685'>685</a>
<a id='n686' href='#n686'>686</a>
<a id='n687' href='#n687'>687</a>
<a id='n688' href='#n688'>688</a>
<a id='n689' href='#n689'>689</a>
<a id='n690' href='#n690'>690</a>
<a id='n691' href='#n691'>691</a>
<a id='n692' href='#n692'>692</a>
<a id='n693' href='#n693'>693</a>
<a id='n694' href='#n694'>694</a>
<a id='n695' href='#n695'>695</a>
<a id='n696' href='#n696'>696</a>
<a id='n697' href='#n697'>697</a>
<a id='n698' href='#n698'>698</a>
<a id='n699' href='#n699'>699</a>
<a id='n700' href='#n700'>700</a>
<a id='n701' href='#n701'>701</a>
<a id='n702' href='#n702'>702</a>
<a id='n703' href='#n703'>703</a>
<a id='n704' href='#n704'>704</a>
<a id='n705' href='#n705'>705</a>
<a id='n706' href='#n706'>706</a>
<a id='n707' href='#n707'>707</a>
<a id='n708' href='#n708'>708</a>
<a id='n709' href='#n709'>709</a>
<a id='n710' href='#n710'>710</a>
<a id='n711' href='#n711'>711</a>
<a id='n712' href='#n712'>712</a>
<a id='n713' href='#n713'>713</a>
<a id='n714' href='#n714'>714</a>
<a id='n715' href='#n715'>715</a>
<a id='n716' href='#n716'>716</a>
<a id='n717' href='#n717'>717</a>
<a id='n718' href='#n718'>718</a>
<a id='n719' href='#n719'>719</a>
<a id='n720' href='#n720'>720</a>
<a id='n721' href='#n721'>721</a>
<a id='n722' href='#n722'>722</a>
<a id='n723' href='#n723'>723</a>
<a id='n724' href='#n724'>724</a>
<a id='n725' href='#n725'>725</a>
<a id='n726' href='#n726'>726</a>
<a id='n727' href='#n727'>727</a>
<a id='n728' href='#n728'>728</a>
<a id='n729' href='#n729'>729</a>
<a id='n730' href='#n730'>730</a>
<a id='n731' href='#n731'>731</a>
<a id='n732' href='#n732'>732</a>
<a id='n733' href='#n733'>733</a>
<a id='n734' href='#n734'>734</a>
<a id='n735' href='#n735'>735</a>
<a id='n736' href='#n736'>736</a>
<a id='n737' href='#n737'>737</a>
<a id='n738' href='#n738'>738</a>
<a id='n739' href='#n739'>739</a>
<a id='n740' href='#n740'>740</a>
<a id='n741' href='#n741'>741</a>
<a id='n742' href='#n742'>742</a>
<a id='n743' href='#n743'>743</a>
<a id='n744' href='#n744'>744</a>
<a id='n745' href='#n745'>745</a>
<a id='n746' href='#n746'>746</a>
<a id='n747' href='#n747'>747</a>
<a id='n748' href='#n748'>748</a>
<a id='n749' href='#n749'>749</a>
<a id='n750' href='#n750'>750</a>
<a id='n751' href='#n751'>751</a>
<a id='n752' href='#n752'>752</a>
<a id='n753' href='#n753'>753</a>
<a id='n754' href='#n754'>754</a>
<a id='n755' href='#n755'>755</a>
<a id='n756' href='#n756'>756</a>
<a id='n757' href='#n757'>757</a>
<a id='n758' href='#n758'>758</a>
<a id='n759' href='#n759'>759</a>
<a id='n760' href='#n760'>760</a>
<a id='n761' href='#n761'>761</a>
<a id='n762' href='#n762'>762</a>
<a id='n763' href='#n763'>763</a>
<a id='n764' href='#n764'>764</a>
<a id='n765' href='#n765'>765</a>
<a id='n766' href='#n766'>766</a>
<a id='n767' href='#n767'>767</a>
<a id='n768' href='#n768'>768</a>
<a id='n769' href='#n769'>769</a>
<a id='n770' href='#n770'>770</a>
<a id='n771' href='#n771'>771</a>
<a id='n772' href='#n772'>772</a>
<a id='n773' href='#n773'>773</a>
<a id='n774' href='#n774'>774</a>
<a id='n775' href='#n775'>775</a>
<a id='n776' href='#n776'>776</a>
<a id='n777' href='#n777'>777</a>
<a id='n778' href='#n778'>778</a>
<a id='n779' href='#n779'>779</a>
<a id='n780' href='#n780'>780</a>
<a id='n781' href='#n781'>781</a>
<a id='n782' href='#n782'>782</a>
<a id='n783' href='#n783'>783</a>
<a id='n784' href='#n784'>784</a>
<a id='n785' href='#n785'>785</a>
<a id='n786' href='#n786'>786</a>
<a id='n787' href='#n787'>787</a>
<a id='n788' href='#n788'>788</a>
<a id='n789' href='#n789'>789</a>
<a id='n790' href='#n790'>790</a>
<a id='n791' href='#n791'>791</a>
<a id='n792' href='#n792'>792</a>
<a id='n793' href='#n793'>793</a>
<a id='n794' href='#n794'>794</a>
<a id='n795' href='#n795'>795</a>
<a id='n796' href='#n796'>796</a>
<a id='n797' href='#n797'>797</a>
<a id='n798' href='#n798'>798</a>
<a id='n799' href='#n799'>799</a>
<a id='n800' href='#n800'>800</a>
<a id='n801' href='#n801'>801</a>
<a id='n802' href='#n802'>802</a>
<a id='n803' href='#n803'>803</a>
<a id='n804' href='#n804'>804</a>
<a id='n805' href='#n805'>805</a>
<a id='n806' href='#n806'>806</a>
<a id='n807' href='#n807'>807</a>
<a id='n808' href='#n808'>808</a>
<a id='n809' href='#n809'>809</a>
<a id='n810' href='#n810'>810</a>
<a id='n811' href='#n811'>811</a>
<a id='n812' href='#n812'>812</a>
<a id='n813' href='#n813'>813</a>
<a id='n814' href='#n814'>814</a>
<a id='n815' href='#n815'>815</a>
<a id='n816' href='#n816'>816</a>
<a id='n817' href='#n817'>817</a>
<a id='n818' href='#n818'>818</a>
<a id='n819' href='#n819'>819</a>
<a id='n820' href='#n820'>820</a>
<a id='n821' href='#n821'>821</a>
<a id='n822' href='#n822'>822</a>
<a id='n823' href='#n823'>823</a>
<a id='n824' href='#n824'>824</a>
<a id='n825' href='#n825'>825</a>
<a id='n826' href='#n826'>826</a>
<a id='n827' href='#n827'>827</a>
<a id='n828' href='#n828'>828</a>
<a id='n829' href='#n829'>829</a>
<a id='n830' href='#n830'>830</a>
<a id='n831' href='#n831'>831</a>
<a id='n832' href='#n832'>832</a>
<a id='n833' href='#n833'>833</a>
<a id='n834' href='#n834'>834</a>
<a id='n835' href='#n835'>835</a>
<a id='n836' href='#n836'>836</a>
<a id='n837' href='#n837'>837</a>
<a id='n838' href='#n838'>838</a>
<a id='n839' href='#n839'>839</a>
<a id='n840' href='#n840'>840</a>
<a id='n841' href='#n841'>841</a>
<a id='n842' href='#n842'>842</a>
<a id='n843' href='#n843'>843</a>
<a id='n844' href='#n844'>844</a>
<a id='n845' href='#n845'>845</a>
<a id='n846' href='#n846'>846</a>
<a id='n847' href='#n847'>847</a>
<a id='n848' href='#n848'>848</a>
<a id='n849' href='#n849'>849</a>
<a id='n850' href='#n850'>850</a>
<a id='n851' href='#n851'>851</a>
<a id='n852' href='#n852'>852</a>
<a id='n853' href='#n853'>853</a>
<a id='n854' href='#n854'>854</a>
<a id='n855' href='#n855'>855</a>
<a id='n856' href='#n856'>856</a>
<a id='n857' href='#n857'>857</a>
<a id='n858' href='#n858'>858</a>
<a id='n859' href='#n859'>859</a>
<a id='n860' href='#n860'>860</a>
<a id='n861' href='#n861'>861</a>
<a id='n862' href='#n862'>862</a>
<a id='n863' href='#n863'>863</a>
<a id='n864' href='#n864'>864</a>
<a id='n865' href='#n865'>865</a>
<a id='n866' href='#n866'>866</a>
<a id='n867' href='#n867'>867</a>
<a id='n868' href='#n868'>868</a>
<a id='n869' href='#n869'>869</a>
<a id='n870' href='#n870'>870</a>
<a id='n871' href='#n871'>871</a>
<a id='n872' href='#n872'>872</a>
<a id='n873' href='#n873'>873</a>
<a id='n874' href='#n874'>874</a>
<a id='n875' href='#n875'>875</a>
<a id='n876' href='#n876'>876</a>
<a id='n877' href='#n877'>877</a>
<a id='n878' href='#n878'>878</a>
<a id='n879' href='#n879'>879</a>
<a id='n880' href='#n880'>880</a>
<a id='n881' href='#n881'>881</a>
<a id='n882' href='#n882'>882</a>
<a id='n883' href='#n883'>883</a>
<a id='n884' href='#n884'>884</a>
<a id='n885' href='#n885'>885</a>
<a id='n886' href='#n886'>886</a>
<a id='n887' href='#n887'>887</a>
<a id='n888' href='#n888'>888</a>
<a id='n889' href='#n889'>889</a>
<a id='n890' href='#n890'>890</a>
<a id='n891' href='#n891'>891</a>
<a id='n892' href='#n892'>892</a>
<a id='n893' href='#n893'>893</a>
<a id='n894' href='#n894'>894</a>
<a id='n895' href='#n895'>895</a>
<a id='n896' href='#n896'>896</a>
<a id='n897' href='#n897'>897</a>
<a id='n898' href='#n898'>898</a>
<a id='n899' href='#n899'>899</a>
<a id='n900' href='#n900'>900</a>
<a id='n901' href='#n901'>901</a>
<a id='n902' href='#n902'>902</a>
<a id='n903' href='#n903'>903</a>
<a id='n904' href='#n904'>904</a>
<a id='n905' href='#n905'>905</a>
<a id='n906' href='#n906'>906</a>
<a id='n907' href='#n907'>907</a>
<a id='n908' href='#n908'>908</a>
<a id='n909' href='#n909'>909</a>
<a id='n910' href='#n910'>910</a>
<a id='n911' href='#n911'>911</a>
<a id='n912' href='#n912'>912</a>
<a id='n913' href='#n913'>913</a>
<a id='n914' href='#n914'>914</a>
<a id='n915' href='#n915'>915</a>
<a id='n916' href='#n916'>916</a>
<a id='n917' href='#n917'>917</a>
<a id='n918' href='#n918'>918</a>
<a id='n919' href='#n919'>919</a>
<a id='n920' href='#n920'>920</a>
<a id='n921' href='#n921'>921</a>
<a id='n922' href='#n922'>922</a>
<a id='n923' href='#n923'>923</a>
<a id='n924' href='#n924'>924</a>
<a id='n925' href='#n925'>925</a>
<a id='n926' href='#n926'>926</a>
<a id='n927' href='#n927'>927</a>
<a id='n928' href='#n928'>928</a>
<a id='n929' href='#n929'>929</a>
<a id='n930' href='#n930'>930</a>
<a id='n931' href='#n931'>931</a>
<a id='n932' href='#n932'>932</a>
<a id='n933' href='#n933'>933</a>
<a id='n934' href='#n934'>934</a>
<a id='n935' href='#n935'>935</a>
<a id='n936' href='#n936'>936</a>
<a id='n937' href='#n937'>937</a>
<a id='n938' href='#n938'>938</a>
<a id='n939' href='#n939'>939</a>
<a id='n940' href='#n940'>940</a>
<a id='n941' href='#n941'>941</a>
<a id='n942' href='#n942'>942</a>
<a id='n943' href='#n943'>943</a>
<a id='n944' href='#n944'>944</a>
<a id='n945' href='#n945'>945</a>
<a id='n946' href='#n946'>946</a>
<a id='n947' href='#n947'>947</a>
<a id='n948' href='#n948'>948</a>
<a id='n949' href='#n949'>949</a>
<a id='n950' href='#n950'>950</a>
<a id='n951' href='#n951'>951</a>
<a id='n952' href='#n952'>952</a>
<a id='n953' href='#n953'>953</a>
<a id='n954' href='#n954'>954</a>
<a id='n955' href='#n955'>955</a>
<a id='n956' href='#n956'>956</a>
<a id='n957' href='#n957'>957</a>
<a id='n958' href='#n958'>958</a>
<a id='n959' href='#n959'>959</a>
<a id='n960' href='#n960'>960</a>
<a id='n961' href='#n961'>961</a>
<a id='n962' href='#n962'>962</a>
<a id='n963' href='#n963'>963</a>
<a id='n964' href='#n964'>964</a>
<a id='n965' href='#n965'>965</a>
<a id='n966' href='#n966'>966</a>
<a id='n967' href='#n967'>967</a>
<a id='n968' href='#n968'>968</a>
<a id='n969' href='#n969'>969</a>
<a id='n970' href='#n970'>970</a>
<a id='n971' href='#n971'>971</a>
<a id='n972' href='#n972'>972</a>
<a id='n973' href='#n973'>973</a>
<a id='n974' href='#n974'>974</a>
<a id='n975' href='#n975'>975</a>
<a id='n976' href='#n976'>976</a>
<a id='n977' href='#n977'>977</a>
<a id='n978' href='#n978'>978</a>
<a id='n979' href='#n979'>979</a>
<a id='n980' href='#n980'>980</a>
<a id='n981' href='#n981'>981</a>
<a id='n982' href='#n982'>982</a>
<a id='n983' href='#n983'>983</a>
<a id='n984' href='#n984'>984</a>
<a id='n985' href='#n985'>985</a>
<a id='n986' href='#n986'>986</a>
<a id='n987' href='#n987'>987</a>
<a id='n988' href='#n988'>988</a>
<a id='n989' href='#n989'>989</a>
<a id='n990' href='#n990'>990</a>
<a id='n991' href='#n991'>991</a>
<a id='n992' href='#n992'>992</a>
<a id='n993' href='#n993'>993</a>
<a id='n994' href='#n994'>994</a>
<a id='n995' href='#n995'>995</a>
<a id='n996' href='#n996'>996</a>
<a id='n997' href='#n997'>997</a>
<a id='n998' href='#n998'>998</a>
<a id='n999' href='#n999'>999</a>
<a id='n1000' href='#n1000'>1000</a>
<a id='n1001' href='#n1001'>1001</a>
<a id='n1002' href='#n1002'>1002</a>
<a id='n1003' href='#n1003'>1003</a>
<a id='n1004' href='#n1004'>1004</a>
<a id='n1005' href='#n1005'>1005</a>
<a id='n1006' href='#n1006'>1006</a>
<a id='n1007' href='#n1007'>1007</a>
<a id='n1008' href='#n1008'>1008</a>
<a id='n1009' href='#n1009'>1009</a>
<a id='n1010' href='#n1010'>1010</a>
<a id='n1011' href='#n1011'>1011</a>
<a id='n1012' href='#n1012'>1012</a>
<a id='n1013' href='#n1013'>1013</a>
<a id='n1014' href='#n1014'>1014</a>
<a id='n1015' href='#n1015'>1015</a>
<a id='n1016' href='#n1016'>1016</a>
<a id='n1017' href='#n1017'>1017</a>
<a id='n1018' href='#n1018'>1018</a>
<a id='n1019' href='#n1019'>1019</a>
<a id='n1020' href='#n1020'>1020</a>
<a id='n1021' href='#n1021'>1021</a>
<a id='n1022' href='#n1022'>1022</a>
<a id='n1023' href='#n1023'>1023</a>
<a id='n1024' href='#n1024'>1024</a>
<a id='n1025' href='#n1025'>1025</a>
<a id='n1026' href='#n1026'>1026</a>
<a id='n1027' href='#n1027'>1027</a>
<a id='n1028' href='#n1028'>1028</a>
<a id='n1029' href='#n1029'>1029</a>
<a id='n1030' href='#n1030'>1030</a>
<a id='n1031' href='#n1031'>1031</a>
<a id='n1032' href='#n1032'>1032</a>
<a id='n1033' href='#n1033'>1033</a>
<a id='n1034' href='#n1034'>1034</a>
<a id='n1035' href='#n1035'>1035</a>
<a id='n1036' href='#n1036'>1036</a>
<a id='n1037' href='#n1037'>1037</a>
<a id='n1038' href='#n1038'>1038</a>
<a id='n1039' href='#n1039'>1039</a>
<a id='n1040' href='#n1040'>1040</a>
<a id='n1041' href='#n1041'>1041</a>
<a id='n1042' href='#n1042'>1042</a>
<a id='n1043' href='#n1043'>1043</a>
<a id='n1044' href='#n1044'>1044</a>
<a id='n1045' href='#n1045'>1045</a>
<a id='n1046' href='#n1046'>1046</a>
<a id='n1047' href='#n1047'>1047</a>
<a id='n1048' href='#n1048'>1048</a>
<a id='n1049' href='#n1049'>1049</a>
<a id='n1050' href='#n1050'>1050</a>
<a id='n1051' href='#n1051'>1051</a>
<a id='n1052' href='#n1052'>1052</a>
<a id='n1053' href='#n1053'>1053</a>
<a id='n1054' href='#n1054'>1054</a>
<a id='n1055' href='#n1055'>1055</a>
<a id='n1056' href='#n1056'>1056</a>
<a id='n1057' href='#n1057'>1057</a>
<a id='n1058' href='#n1058'>1058</a>
<a id='n1059' href='#n1059'>1059</a>
<a id='n1060' href='#n1060'>1060</a>
<a id='n1061' href='#n1061'>1061</a>
<a id='n1062' href='#n1062'>1062</a>
<a id='n1063' href='#n1063'>1063</a>
<a id='n1064' href='#n1064'>1064</a>
<a id='n1065' href='#n1065'>1065</a>
<a id='n1066' href='#n1066'>1066</a>
<a id='n1067' href='#n1067'>1067</a>
<a id='n1068' href='#n1068'>1068</a>
<a id='n1069' href='#n1069'>1069</a>
<a id='n1070' href='#n1070'>1070</a>
<a id='n1071' href='#n1071'>1071</a>
<a id='n1072' href='#n1072'>1072</a>
<a id='n1073' href='#n1073'>1073</a>
<a id='n1074' href='#n1074'>1074</a>
<a id='n1075' href='#n1075'>1075</a>
<a id='n1076' href='#n1076'>1076</a>
<a id='n1077' href='#n1077'>1077</a>
<a id='n1078' href='#n1078'>1078</a>
<a id='n1079' href='#n1079'>1079</a>
<a id='n1080' href='#n1080'>1080</a>
<a id='n1081' href='#n1081'>1081</a>
<a id='n1082' href='#n1082'>1082</a>
<a id='n1083' href='#n1083'>1083</a>
<a id='n1084' href='#n1084'>1084</a>
<a id='n1085' href='#n1085'>1085</a>
<a id='n1086' href='#n1086'>1086</a>
<a id='n1087' href='#n1087'>1087</a>
<a id='n1088' href='#n1088'>1088</a>
<a id='n1089' href='#n1089'>1089</a>
<a id='n1090' href='#n1090'>1090</a>
<a id='n1091' href='#n1091'>1091</a>
<a id='n1092' href='#n1092'>1092</a>
<a id='n1093' href='#n1093'>1093</a>
<a id='n1094' href='#n1094'>1094</a>
<a id='n1095' href='#n1095'>1095</a>
<a id='n1096' href='#n1096'>1096</a>
<a id='n1097' href='#n1097'>1097</a>
<a id='n1098' href='#n1098'>1098</a>
<a id='n1099' href='#n1099'>1099</a>
<a id='n1100' href='#n1100'>1100</a>
<a id='n1101' href='#n1101'>1101</a>
<a id='n1102' href='#n1102'>1102</a>
<a id='n1103' href='#n1103'>1103</a>
<a id='n1104' href='#n1104'>1104</a>
<a id='n1105' href='#n1105'>1105</a>
</pre></td>
<td class='lines'><pre><code><span class="hl kwa">package</span> install_steps_interactive<span class="hl opt">;</span>


<span class="hl kwa">use</span> diagnostics<span class="hl opt">;</span>
<span class="hl kwa">use</span> strict<span class="hl opt">;</span>
<span class="hl kwa">use</span> vars <span class="hl str">qw(</span><span class="hl ipl">&#64;ISA</span><span class="hl str">)</span><span class="hl opt">;</span>

<span class="hl kwb">&#64;ISA</span> <span class="hl opt">=</span> <span class="hl str">qw(install_steps)</span><span class="hl opt">;</span>

<span class="hl slc">#-######################################################################################</span>
<span class="hl slc">#- misc imports</span>
<span class="hl slc">#-######################################################################################</span>
<span class="hl kwa">use</span> common <span class="hl str">qw(:common :file :functional :system)</span><span class="hl opt">;</span>
<span class="hl kwa">use</span> partition_table <span class="hl str">qw(:types)</span><span class="hl opt">;</span>
<span class="hl kwa">use</span> install_steps<span class="hl opt">;</span>
<span class="hl kwa">use</span> install_any<span class="hl opt">;</span>
<span class="hl kwa">use</span> detect_devices<span class="hl opt">;</span>
<span class="hl kwa">use</span> run_program<span class="hl opt">;</span>
<span class="hl kwa">use</span> commands<span class="hl opt">;</span>
<span class="hl kwa">use</span> devices<span class="hl opt">;</span>
<span class="hl kwa">use</span> fsedit<span class="hl opt">;</span>
<span class="hl kwa">use</span> network<span class="hl opt">;</span>
<span class="hl kwa">use</span> raid<span class="hl opt">;</span>
<span class="hl kwa">use</span> mouse<span class="hl opt">;</span>
<span class="hl kwa">use</span> modules<span class="hl opt">;</span>
<span class="hl kwa">use</span> lang<span class="hl opt">;</span>
<span class="hl kwa">use</span> keyboard<span class="hl opt">;</span>
<span class="hl kwa">use</span> fs<span class="hl opt">;</span>
<span class="hl kwa">use</span> <span class="hl kwc">log</span><span class="hl opt">;</span>

<span class="hl slc">#-######################################################################################</span>
<span class="hl slc">#- In/Out Steps Functions</span>
<span class="hl slc">#-######################################################################################</span>
<span class="hl kwa">sub</span> errorInStep<span class="hl opt">(</span><span class="hl kwb">$$</span><span class="hl opt">) {</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, $err</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl kwb">$err</span> <span class="hl opt">=~</span> <span class="hl kwd">s/ at .*?$/\./</span> <span class="hl kwa">unless</span> <span class="hl opt">$::</span>testing<span class="hl opt">;</span> <span class="hl slc">#- avoid error message.</span>
    <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span>_<span class="hl opt">(</span><span class="hl str">&quot;Error&quot;</span><span class="hl opt">), [</span> _<span class="hl opt">(</span><span class="hl str">&quot;An error occurred&quot;</span><span class="hl opt">),</span> <span class="hl kwb">$err</span> <span class="hl opt">]);</span>
<span class="hl opt">}</span>

<span class="hl kwa">sub</span> kill_action <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwc">kill</span><span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl slc">#-######################################################################################</span>
<span class="hl slc">#- Steps Functions</span>
<span class="hl slc">#-######################################################################################</span>
<span class="hl slc">#------------------------------------------------------------------------------</span>
<span class="hl kwa">sub</span> selectLanguage<span class="hl opt">($) {</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>

    <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>lang<span class="hl opt">} =</span>
      lang<span class="hl opt">::</span>text2lang<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_list</span><span class="hl opt">(</span><span class="hl str">&quot;Language&quot;</span><span class="hl opt">,</span>
					_<span class="hl opt">(</span><span class="hl str">&quot;Which language do you want?&quot;</span><span class="hl opt">),</span>
					<span class="hl slc"># the translation may be used for the help</span>
					<span class="hl opt">[</span> lang<span class="hl opt">::</span>list<span class="hl opt">() ],</span>
					lang<span class="hl opt">::</span>lang2text<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>lang<span class="hl opt">})));</span>
    install_steps<span class="hl opt">::</span>selectLanguage<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">);</span>

<span class="hl slc">#-    $o-&gt;{useless_thing_accepted} = $o-&gt;ask_from_list_(&apos;&apos;, </span>
<span class="hl slc">#-&quot;Warning no warranty&quot;, </span>
<span class="hl slc">#-			 [ __(&quot;Accept&quot;), __(&quot;Refuse&quot;) ], &quot;Accept&quot;) eq &quot;Accept&quot; or _exit(1) unless $o-&gt;{useless_thing_accepted};</span>
<span class="hl opt">}</span>
<span class="hl slc">#------------------------------------------------------------------------------</span>
<span class="hl kwa">sub</span> selectKeyboard<span class="hl opt">($) {</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>keyboard<span class="hl opt">} =</span>
      keyboard<span class="hl opt">::</span>text2keyboard<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_list_</span><span class="hl opt">(</span>_<span class="hl opt">(</span><span class="hl str">&quot;Keyboard&quot;</span><span class="hl opt">),</span>
						 _<span class="hl opt">(</span><span class="hl str">&quot;What is your keyboard layout?&quot;</span><span class="hl opt">),</span>
						 <span class="hl opt">[</span> keyboard<span class="hl opt">::</span>list<span class="hl opt">() ],</span>
						 keyboard<span class="hl opt">::</span>keyboard2text<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>keyboard<span class="hl opt">})));</span>
    <span class="hl kwc">delete</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>keyboard_unsafe<span class="hl opt">};</span>
    install_steps<span class="hl opt">::</span>selectKeyboard<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">);</span>
<span class="hl opt">}</span>
<span class="hl slc">#------------------------------------------------------------------------------</span>
<span class="hl kwa">sub</span> selectPath<span class="hl opt">($) {</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>isUpgrade<span class="hl opt">} =</span>
      <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_list_</span><span class="hl opt">(</span>_<span class="hl opt">(</span><span class="hl str">&quot;Install/Upgrade&quot;</span><span class="hl opt">),</span>
			 _<span class="hl opt">(</span><span class="hl str">&quot;Is this an install or an upgrade?&quot;</span><span class="hl opt">),</span>
			 <span class="hl opt">[</span> __<span class="hl opt">(</span><span class="hl str">&quot;Install&quot;</span><span class="hl opt">),</span> __<span class="hl opt">(</span><span class="hl str">&quot;Upgrade&quot;</span><span class="hl opt">) ],</span>
			 <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>isUpgrade<span class="hl opt">}</span> ? <span class="hl str">&quot;Upgrade&quot;</span> <span class="hl opt">:</span> <span class="hl str">&quot;Install&quot;</span><span class="hl opt">)</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;Upgrade&quot;</span><span class="hl opt">;</span>
    install_steps<span class="hl opt">::</span>selectPath<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">);</span>
<span class="hl opt">}</span>
<span class="hl slc">#------------------------------------------------------------------------------</span>
<span class="hl kwa">sub</span> selectRootPartition<span class="hl opt">(</span><span class="hl kwb">$&#64;</span><span class="hl opt">) {</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, &#64;parts</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>upgradeRootPartition<span class="hl opt">} =</span>
      <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_list</span><span class="hl opt">(</span>_<span class="hl opt">(</span><span class="hl str">&quot;Root Partition&quot;</span><span class="hl opt">),</span>
			_<span class="hl opt">(</span><span class="hl str">&quot;What is the root partition (/) of your system?&quot;</span><span class="hl opt">),</span>
			<span class="hl opt">[</span> <span class="hl kwb">&#64;parts</span> <span class="hl opt">],</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>upgradeRootPartition<span class="hl opt">});</span>
<span class="hl slc">#- TODO check choice, then mount partition in $o-&gt;{prefix} and autodetect.</span>
<span class="hl slc">#-    install_steps::selectRootPartition($o);</span>
<span class="hl opt">}</span>
<span class="hl slc">#------------------------------------------------------------------------------</span>
<span class="hl kwa">sub</span> selectInstallClass<span class="hl opt">(</span><span class="hl kwb">$&#64;</span><span class="hl opt">) {</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, &#64;classes</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">&#64;c</span> <span class="hl opt">=</span> <span class="hl str">qw(beginner specific expert)</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">%c</span> <span class="hl opt">= (</span>
	     beginner  <span class="hl opt">=&gt;</span> _<span class="hl opt">(</span><span class="hl str">&quot;Recommended&quot;</span><span class="hl opt">),</span>
	     specific  <span class="hl opt">=&gt;</span> _<span class="hl opt">(</span><span class="hl str">&quot;Customized&quot;</span><span class="hl opt">),</span>
	     expert    <span class="hl opt">=&gt;</span> _<span class="hl opt">(</span><span class="hl str">&quot;Expert&quot;</span><span class="hl opt">),</span>
	    <span class="hl opt">);</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$installClass</span> <span class="hl opt">= ${{</span><span class="hl kwc">reverse</span> <span class="hl kwb">%c</span><span class="hl opt">}}{</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_list</span><span class="hl opt">(</span>_<span class="hl opt">(</span><span class="hl str">&quot;Install Class&quot;</span><span class="hl opt">),</span>
							 _<span class="hl opt">(</span><span class="hl str">&quot;What installation class do you want?&quot;</span><span class="hl opt">),</span>
							 <span class="hl opt">[</span> <span class="hl kwc">map</span> <span class="hl opt">{</span> <span class="hl kwb">$c</span><span class="hl opt">{</span><span class="hl kwb">$_</span><span class="hl opt">} }</span> <span class="hl kwb">&#64;c</span> <span class="hl opt">],</span> <span class="hl kwb">$c</span><span class="hl opt">{</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>installClass<span class="hl opt">}} ||</span> <span class="hl kwb">$c</span><span class="hl opt">{</span>beginner<span class="hl opt">})};</span>
    <span class="hl opt">$::</span>expert   <span class="hl opt">=</span> <span class="hl kwb">$installClass</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;expert&quot;</span><span class="hl opt">;</span>
    <span class="hl opt">$::</span>beginner <span class="hl opt">=</span> <span class="hl kwb">$installClass</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;beginner&quot;</span><span class="hl opt">;</span>

    <span class="hl kwa">if</span> <span class="hl opt">($::</span>beginner<span class="hl opt">) {</span>
	<span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>installClass<span class="hl opt">} =</span> <span class="hl str">&quot;normal&quot;</span><span class="hl opt">;</span>
    <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
	<span class="hl kwc">my</span> <span class="hl kwb">%c</span> <span class="hl opt">= (</span>
		 normal    <span class="hl opt">=&gt;</span> _<span class="hl opt">(</span><span class="hl str">&quot;Normal&quot;</span><span class="hl opt">),</span>
		 developer <span class="hl opt">=&gt;</span> _<span class="hl opt">(</span><span class="hl str">&quot;Development&quot;</span><span class="hl opt">),</span>
		 server    <span class="hl opt">=&gt;</span> _<span class="hl opt">(</span><span class="hl str">&quot;Server&quot;</span><span class="hl opt">),</span>
		<span class="hl opt">);</span>
	<span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>installClass<span class="hl opt">} = ${{</span><span class="hl kwc">reverse</span> <span class="hl kwb">%c</span><span class="hl opt">}}{</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_list</span><span class="hl opt">(</span>_<span class="hl opt">(</span><span class="hl str">&quot;Install Class&quot;</span><span class="hl opt">),</span>
							       _<span class="hl opt">(</span><span class="hl str">&quot;What usage do you want?&quot;</span><span class="hl opt">),</span>
							       <span class="hl opt">[</span> <span class="hl kwc">values</span> <span class="hl kwb">%c</span> <span class="hl opt">],</span> <span class="hl kwb">$c</span><span class="hl opt">{</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>installClass<span class="hl opt">}})};</span>
    <span class="hl opt">}</span>
    install_steps<span class="hl opt">::</span>selectInstallClass<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">);</span>
<span class="hl opt">}</span>

<span class="hl slc">#------------------------------------------------------------------------------</span>
<span class="hl kwa">sub</span> selectMouse <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, $force</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>

    <span class="hl kwc">my</span> <span class="hl kwb">$name</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>mouse<span class="hl opt">}{</span>FULLNAME<span class="hl opt">};</span>
    <span class="hl kwa">if</span> <span class="hl opt">(!</span><span class="hl kwb">$name</span> <span class="hl opt">|| $::</span>expert <span class="hl opt">||</span> <span class="hl kwb">$force</span><span class="hl opt">) {</span>
	<span class="hl kwb">$name</span> <span class="hl opt">||=</span> <span class="hl str">&quot;Generic Mouse (serial)&quot;</span><span class="hl opt">;</span>
	<span class="hl kwb">$name</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_list_</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">&quot;What is the type of your mouse?&quot;</span><span class="hl opt">), [</span> mouse<span class="hl opt">::</span>names<span class="hl opt">() ],</span> <span class="hl kwb">$name</span><span class="hl opt">);</span>
	<span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>mouse<span class="hl opt">} =</span> mouse<span class="hl opt">::</span>name2mouse<span class="hl opt">(</span><span class="hl kwb">$name</span><span class="hl opt">);</span>
    <span class="hl opt">}</span>
    <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>mouse<span class="hl opt">}{</span>XEMU3<span class="hl opt">} =</span> <span class="hl str">&apos;yes&apos;</span> <span class="hl kwa">if</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>mouse<span class="hl opt">}{</span>nbuttons<span class="hl opt">} &lt;</span> <span class="hl num">3</span><span class="hl opt">;</span> <span class="hl slc">#- if $o-&gt;{mouse}{nbuttons} &lt; 3 &amp;&amp; $o-&gt;ask_yesorno(&apos;&apos;, _(&quot;Emulate third button?&quot;), 1);</span>

    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>mouse<span class="hl opt">}{</span>device<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;ttyS&quot;</span><span class="hl opt">) {</span>
	<span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">set_help</span><span class="hl opt">(</span><span class="hl str">&apos;selectSerialPort&apos;</span><span class="hl opt">);</span>
	<span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>mouse<span class="hl opt">}{</span>device<span class="hl opt">} =</span> mouse<span class="hl opt">::</span>serial_ports_names2dev<span class="hl opt">(</span>
	  <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_list</span><span class="hl opt">(</span>_<span class="hl opt">(</span><span class="hl str">&quot;Mouse Port&quot;</span><span class="hl opt">),</span>
			    _<span class="hl opt">(</span><span class="hl str">&quot;Which serial port is your mouse connected to?&quot;</span><span class="hl opt">),</span>
			    <span class="hl opt">[</span> mouse<span class="hl opt">::</span>serial_ports_names<span class="hl opt">() ]));</span>
    <span class="hl opt">}</span>

    <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">setup_thiskind</span><span class="hl opt">(</span><span class="hl str">&apos;serial_usb&apos;</span><span class="hl opt">, !$::</span>expert<span class="hl opt">,</span> <span class="hl num">0</span><span class="hl opt">)</span> <span class="hl kwa">if</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>mouse<span class="hl opt">}{</span>device<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;usbmouse&quot;</span><span class="hl opt">;</span>

    <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">SUPER</span><span class="hl opt">::</span>selectMouse<span class="hl opt">;</span>
<span class="hl opt">}</span>
<span class="hl slc">#------------------------------------------------------------------------------</span>
<span class="hl kwa">sub</span> setupSCSI <span class="hl opt">{</span> setup_thiskind<span class="hl opt">(</span><span class="hl kwb">$_</span><span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">],</span> <span class="hl str">&apos;scsi&apos;</span><span class="hl opt">,</span> <span class="hl kwb">$_</span><span class="hl opt">[</span><span class="hl num">1</span><span class="hl opt">],</span> <span class="hl kwb">$_</span><span class="hl opt">[</span><span class="hl num">2</span><span class="hl opt">]) }</span>

<span class="hl kwa">sub</span> ask_mntpoint_s <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, $fstab</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">&#64;fstab</span> <span class="hl opt">=</span> <span class="hl kwc">grep</span> <span class="hl opt">{</span> isExt2<span class="hl opt">(</span><span class="hl kwb">$_</span><span class="hl opt">) }</span> <span class="hl kwb">&#64;$fstab</span><span class="hl opt">;</span>
    <span class="hl kwb">&#64;fstab</span> <span class="hl opt">=</span> <span class="hl kwc">grep</span> <span class="hl opt">{</span> isSwap<span class="hl opt">(</span><span class="hl kwb">$_</span><span class="hl opt">) }</span> <span class="hl kwb">&#64;$fstab</span> <span class="hl kwa">if</span> <span class="hl kwb">&#64;fstab</span> <span class="hl opt">==</span> <span class="hl num">0</span><span class="hl opt">;</span>
<span class="hl slc">#    &#64;fstab = &#64;$fstab if &#64;fstab == 0;</span>
    <span class="hl kwc">die</span> _<span class="hl opt">(</span><span class="hl str">&quot;no available partitions&quot;</span><span class="hl opt">)</span> <span class="hl kwa">if</span> <span class="hl kwb">&#64;fstab</span> <span class="hl opt">==</span> <span class="hl num">0</span><span class="hl opt">;</span>

    <span class="hl kwc">my</span> <span class="hl kwb">$msg</span> <span class="hl opt">=</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span> <span class="hl str">&quot;</span><span class="hl ipl">$_</span><span class="hl str">-&gt;{device} &quot;</span> <span class="hl opt">.</span> _<span class="hl opt">(</span><span class="hl str">&quot;(</span><span class="hl ipl">%dMb</span><span class="hl str">)&quot;</span><span class="hl opt">,</span> <span class="hl kwb">$_</span><span class="hl opt">-&gt;{</span>size<span class="hl opt">}</span> <span class="hl kwd">/ 1024 /</span> <span class="hl num">2</span><span class="hl opt">) };</span>
    
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">&#64;fstab</span> <span class="hl opt">==</span> <span class="hl num">1</span><span class="hl opt">) {</span>
	<span class="hl kwb">$fstab</span><span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">]-&gt;{</span>mntpoint<span class="hl opt">} =</span> <span class="hl str">&apos;/&apos;</span><span class="hl opt">;</span>
    <span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">($::</span>beginner<span class="hl opt">) {</span>
	<span class="hl kwc">my</span> <span class="hl kwb">%l</span><span class="hl opt">;</span> <span class="hl kwb">$l</span><span class="hl opt">{&amp;</span><span class="hl kwb">$msg</span><span class="hl opt">} =</span> <span class="hl kwb">$_</span> <span class="hl kwa">foreach</span> <span class="hl kwb">&#64;fstab</span><span class="hl opt">;</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$e</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_list</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> 
				  _<span class="hl opt">(</span><span class="hl str">&quot;Which partition do you want to use as your root partition&quot;</span><span class="hl opt">),</span> 
				  <span class="hl opt">[</span> <span class="hl kwc">sort keys</span> <span class="hl kwb">%l</span> <span class="hl opt">]);</span>
	<span class="hl opt">(</span>fsedit<span class="hl opt">::</span>get_root<span class="hl opt">(</span><span class="hl kwb">$fstab</span><span class="hl opt">) || {})-&gt;{</span>mntpoint<span class="hl opt">} =</span> <span class="hl str">&apos;&apos;</span><span class="hl opt">;</span>
	<span class="hl kwb">$l</span><span class="hl opt">{</span><span class="hl kwb">$e</span><span class="hl opt">}{</span>mntpoint<span class="hl opt">} =</span> <span class="hl str">&apos;/&apos;</span><span class="hl opt">;</span>
    <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
	<span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_entries_ref</span>
	  <span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> 
	   _<span class="hl opt">(</span><span class="hl str">&quot;Choose the mount points&quot;</span><span class="hl opt">),</span>
	   <span class="hl opt">[</span> <span class="hl kwc">map</span> <span class="hl opt">{ &amp;</span><span class="hl kwb">$msg</span> <span class="hl opt">}</span> <span class="hl kwb">&#64;fstab</span> <span class="hl opt">],</span>
	   <span class="hl opt">[</span> <span class="hl kwc">map</span> <span class="hl opt">{ +{</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$_</span><span class="hl opt">-&gt;{</span>mntpoint<span class="hl opt">},</span> 
		      list <span class="hl opt">=&gt; [</span> <span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> fsedit<span class="hl opt">::</span>suggestions_mntpoint<span class="hl opt">([]) ]</span>
		    <span class="hl opt">} }</span> <span class="hl kwb">&#64;fstab</span> <span class="hl opt">]);</span>
    <span class="hl opt">}</span>
    <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">SUPER</span><span class="hl opt">::</span>ask_mntpoint_s<span class="hl opt">(</span><span class="hl kwb">$fstab</span><span class="hl opt">);</span>
<span class="hl opt">}</span>

<span class="hl slc">#------------------------------------------------------------------------------</span>
<span class="hl kwa">sub</span> rebootNeeded<span class="hl opt">($) {</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">&quot;You need to reboot for the partition table modifications to take place&quot;</span><span class="hl opt">));</span>

    install_steps<span class="hl opt">::</span>rebootNeeded<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">);</span>
<span class="hl opt">}</span>

<span class="hl slc">#------------------------------------------------------------------------------</span>
<span class="hl kwa">sub</span> choosePartitionsToFormat<span class="hl opt">(</span><span class="hl kwb">$$</span><span class="hl opt">) {</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, $fstab</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>

    <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">SUPER</span><span class="hl opt">::</span>choosePartitionsToFormat<span class="hl opt">(</span><span class="hl kwb">$fstab</span><span class="hl opt">);</span>

    <span class="hl kwc">my</span> <span class="hl kwb">&#64;l</span> <span class="hl opt">=</span> <span class="hl kwc">grep</span> <span class="hl opt">{ !</span><span class="hl kwb">$_</span><span class="hl opt">-&gt;{</span>isFormatted<span class="hl opt">} &amp;&amp;</span> <span class="hl kwb">$_</span><span class="hl opt">-&gt;{</span>mntpoint<span class="hl opt">} &amp;&amp; !($::</span>beginner <span class="hl opt">&amp;&amp;</span> isSwap<span class="hl opt">(</span><span class="hl kwb">$_</span><span class="hl opt">)) }</span> <span class="hl kwb">&#64;$fstab</span><span class="hl opt">;</span>
    <span class="hl kwb">$_</span><span class="hl opt">-&gt;{</span>toFormat<span class="hl opt">} =</span> <span class="hl num">1</span> <span class="hl kwa">foreach</span> <span class="hl kwc">grep</span> <span class="hl opt">{  $::</span>beginner <span class="hl opt">&amp;&amp;</span> isSwap<span class="hl opt">(</span><span class="hl kwb">$_</span><span class="hl opt">) }</span> <span class="hl kwb">&#64;$fstab</span><span class="hl opt">;</span>

    <span class="hl kwa">return if</span> <span class="hl opt">$::</span>beginner <span class="hl opt">&amp;&amp;</span> <span class="hl num">0</span> <span class="hl opt">==</span> <span class="hl kwc">grep</span> <span class="hl opt">{ !</span> <span class="hl kwb">$_</span><span class="hl opt">-&gt;{</span>toFormat<span class="hl opt">} }</span> <span class="hl kwb">&#64;l</span><span class="hl opt">;</span>

    <span class="hl kwb">$_</span><span class="hl opt">-&gt;{</span>toFormat<span class="hl opt">} ||=</span> <span class="hl kwb">$_</span><span class="hl opt">-&gt;{</span>toFormatUnsure<span class="hl opt">}</span> <span class="hl kwa">foreach</span> <span class="hl kwb">&#64;l</span><span class="hl opt">;</span>
    <span class="hl kwc">log</span><span class="hl opt">::</span>l<span class="hl opt">(</span><span class="hl str">&quot;preparing to format</span> <span class="hl ipl">$_</span><span class="hl str">-&gt;{mntpoint}&quot;</span><span class="hl opt">)</span> <span class="hl kwa">foreach</span> <span class="hl kwc">grep</span> <span class="hl opt">{</span> <span class="hl kwb">$_</span><span class="hl opt">-&gt;{</span>toFormat<span class="hl opt">} }</span> <span class="hl kwb">&#64;l</span><span class="hl opt">;</span>

    <span class="hl kwc">my</span> <span class="hl kwb">%label</span><span class="hl opt">;</span>
    <span class="hl kwb">$label</span><span class="hl opt">{</span><span class="hl kwb">$_</span><span class="hl opt">} = (</span>isSwap<span class="hl opt">(</span><span class="hl kwb">$_</span><span class="hl opt">)</span> ? type2name<span class="hl opt">(</span><span class="hl kwb">$_</span><span class="hl opt">-&gt;{</span>type<span class="hl opt">}) :</span> <span class="hl kwb">$_</span><span class="hl opt">-&gt;{</span>mntpoint<span class="hl opt">}) .</span> <span class="hl str">&quot;   (</span><span class="hl ipl">$_</span><span class="hl str">-&gt;{device})&quot;</span> <span class="hl kwa">foreach</span> <span class="hl kwb">&#64;l</span><span class="hl opt">;</span>

    <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_many_from_list_ref</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">&quot;Choose the partitions you want to format&quot;</span><span class="hl opt">),</span>
			       <span class="hl opt">[</span> <span class="hl kwc">map</span> <span class="hl opt">{</span> <span class="hl kwb">$label</span><span class="hl opt">{</span><span class="hl kwb">$_</span><span class="hl opt">} }</span> <span class="hl kwb">&#64;l</span> <span class="hl opt">],</span>
			       <span class="hl opt">[</span> <span class="hl kwc">map</span> <span class="hl opt">{</span> \<span class="hl kwb">$_</span><span class="hl opt">-&gt;{</span>toFormat<span class="hl opt">} }</span> <span class="hl kwb">&#64;l</span> <span class="hl opt">])</span> <span class="hl kwc">or die</span> <span class="hl str">&quot;cancel&quot;</span><span class="hl opt">;</span>
    <span class="hl kwb">&#64;l</span> <span class="hl opt">=</span> <span class="hl kwc">grep</span> <span class="hl opt">{</span> <span class="hl kwb">$_</span><span class="hl opt">-&gt;{</span>toFormat<span class="hl opt">} }</span> <span class="hl kwb">&#64;l</span><span class="hl opt">;</span>
    <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_many_from_list_ref</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">&quot;Check bad blocks?&quot;</span><span class="hl opt">),</span>
			       <span class="hl opt">[</span> <span class="hl kwc">map</span> <span class="hl opt">{</span> <span class="hl kwb">$label</span><span class="hl opt">{</span><span class="hl kwb">$_</span><span class="hl opt">} }</span> <span class="hl kwb">&#64;l</span> <span class="hl opt">],</span>
			       <span class="hl opt">[</span> <span class="hl kwc">map</span> <span class="hl opt">{</span> \<span class="hl kwb">$_</span><span class="hl opt">-&gt;{</span>toFormatCheck<span class="hl opt">} }</span> <span class="hl kwb">&#64;l</span> <span class="hl opt">])</span> <span class="hl kwc">or</span> <span class="hl kwa">goto</span> <span class="hl opt">&amp;</span>choosePartitionsToFormat <span class="hl kwa">if</span> <span class="hl opt">$::</span>expert<span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl kwa">sub</span> formatPartitions <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$o</span> <span class="hl opt">=</span> <span class="hl kwc">shift</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$w</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">wait_message</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> <span class="hl str">&apos;&apos;</span><span class="hl opt">);</span>
    <span class="hl kwa">foreach</span> <span class="hl opt">(</span><span class="hl kwb">&#64;_</span><span class="hl opt">) {</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$_</span><span class="hl opt">-&gt;{</span>toFormat<span class="hl opt">}) {</span>
	    <span class="hl kwb">$w</span><span class="hl opt">-&gt;</span><span class="hl kwd">set</span><span class="hl opt">(</span>_<span class="hl opt">(</span><span class="hl str">&quot;Formatting partition</span> <span class="hl ipl">%s</span><span class="hl str">&quot;</span><span class="hl opt">,</span> <span class="hl kwb">$_</span><span class="hl opt">-&gt;{</span>device<span class="hl opt">}));</span>
	    raid<span class="hl opt">::</span>format_part<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>raid<span class="hl opt">},</span> <span class="hl kwb">$_</span><span class="hl opt">);</span>
	<span class="hl opt">}</span>
    <span class="hl opt">}</span>
<span class="hl opt">}</span>

<span class="hl slc">#------------------------------------------------------------------------------</span>
<span class="hl kwa">sub</span> setPackages <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$w</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">wait_message</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">&quot;Looking for available packages&quot;</span><span class="hl opt">));</span>
    <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">SUPER</span><span class="hl opt">::</span>setPackages<span class="hl opt">;</span>
<span class="hl opt">}</span>
<span class="hl slc">#------------------------------------------------------------------------------</span>
<span class="hl kwa">sub</span> selectPackagesToUpgrade <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$w</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">wait_message</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">&quot;Finding packages to upgrade&quot;</span><span class="hl opt">));</span>
    <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">SUPER</span><span class="hl opt">::</span>selectPackagesToUpgrade<span class="hl opt">();</span>
<span class="hl opt">}</span>
<span class="hl slc">#------------------------------------------------------------------------------</span>
<span class="hl kwa">sub</span> choosePackages <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, $packages, $compss, $compssUsers, $compssUsersSorted, $first_time</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>

    <span class="hl kwa">require</span> pkgs<span class="hl opt">;</span>
    <span class="hl kwa">unless</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>isUpgrade<span class="hl opt">}) {</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$available</span> <span class="hl opt">=</span> pkgs<span class="hl opt">::</span>invCorrectSize<span class="hl opt">(</span>install_any<span class="hl opt">::</span>getAvailableSpace<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">) /</span> sqr<span class="hl opt">(</span><span class="hl num">1024</span><span class="hl opt">)) *</span> sqr<span class="hl opt">(</span><span class="hl num">1024</span><span class="hl opt">);</span>
	
	<span class="hl kwa">foreach</span> <span class="hl opt">(</span><span class="hl kwc">values</span> <span class="hl kwb">%$packages</span><span class="hl opt">) {</span>
	    <span class="hl kwc">delete</span> <span class="hl kwb">$_</span><span class="hl opt">-&gt;{</span>skip<span class="hl opt">};</span>
	    <span class="hl kwc">delete</span> <span class="hl kwb">$_</span><span class="hl opt">-&gt;{</span>unskip<span class="hl opt">};</span>
	<span class="hl opt">}</span>
	pkgs<span class="hl opt">::</span>unselect_all<span class="hl opt">(</span><span class="hl kwb">$packages</span><span class="hl opt">);</span>
	pkgs<span class="hl opt">::</span><span class="hl kwc">select</span><span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>packages<span class="hl opt">},</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>packages<span class="hl opt">}{</span><span class="hl kwb">$_</span><span class="hl opt">} ||</span> <span class="hl kwa">next</span><span class="hl opt">)</span> <span class="hl kwa">foreach</span> <span class="hl opt">&#64;{</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>default_packages<span class="hl opt">}};</span>

	pkgs<span class="hl opt">::</span>setSelectedFromCompssList<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>compssListLevels<span class="hl opt">},</span> <span class="hl kwb">$packages,</span> <span class="hl opt">$::</span>expert ? <span class="hl num">90</span> <span class="hl opt">:</span> <span class="hl num">80</span><span class="hl opt">,</span> <span class="hl kwb">$available, $o</span><span class="hl opt">-&gt;{</span>installClass<span class="hl opt">});</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$min_size</span> <span class="hl opt">=</span> pkgs<span class="hl opt">::</span>size_selected<span class="hl opt">(</span><span class="hl kwb">$packages</span><span class="hl opt">);</span>

	<span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">chooseGroups</span><span class="hl opt">(</span><span class="hl kwb">$packages, $compssUsers, $compssUsersSorted</span><span class="hl opt">);</span>

	<span class="hl kwc">my</span> <span class="hl kwb">%save_selected</span><span class="hl opt">;</span> <span class="hl kwb">$save_selected</span><span class="hl opt">{</span><span class="hl kwb">$_</span><span class="hl opt">-&gt;{</span>name<span class="hl opt">}} =</span> <span class="hl kwb">$_</span><span class="hl opt">-&gt;{</span>selected<span class="hl opt">}</span> <span class="hl kwa">foreach</span> <span class="hl kwc">values</span> <span class="hl kwb">%$packages</span><span class="hl opt">;</span>
	pkgs<span class="hl opt">::</span>setSelectedFromCompssList<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>compssListLevels<span class="hl opt">},</span> <span class="hl kwb">$packages,</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl num">0</span><span class="hl opt">,</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>installClass<span class="hl opt">});</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$max_size</span> <span class="hl opt">=</span> pkgs<span class="hl opt">::</span>size_selected<span class="hl opt">(</span><span class="hl kwb">$packages</span><span class="hl opt">);</span>
	<span class="hl kwb">$_</span><span class="hl opt">-&gt;{</span>selected<span class="hl opt">} =</span> <span class="hl kwb">$save_selected</span><span class="hl opt">{</span><span class="hl kwb">$_</span><span class="hl opt">-&gt;{</span>name<span class="hl opt">}}</span> <span class="hl kwa">foreach</span> <span class="hl kwc">values</span> <span class="hl kwb">%$packages</span><span class="hl opt">;</span>	

	<span class="hl kwa">if</span> <span class="hl opt">(!$::</span>beginner <span class="hl opt">&amp;&amp;</span> <span class="hl kwb">$max_size</span> <span class="hl opt">&gt;</span> <span class="hl kwb">$available</span><span class="hl opt">) {</span>
	    <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_okcancel</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> 
_<span class="hl opt">(</span><span class="hl str">&quot;You need</span> <span class="hl ipl">%dMB</span> <span class="hl str">for a full install of the groups you selected.</span>
<span class="hl str">You can go on anyway, but be warned that you won&apos;t get all packages&quot;</span><span class="hl opt">,</span> <span class="hl kwb">$max_size</span> <span class="hl opt">/</span> sqr<span class="hl opt">(</span><span class="hl num">1024</span><span class="hl opt">)),</span> <span class="hl num">1</span><span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">goto</span> <span class="hl opt">&amp;</span>choosePackages
	<span class="hl opt">}</span>

	<span class="hl kwc">my</span> <span class="hl kwb">$size2install</span> <span class="hl opt">= $::</span>beginner ? <span class="hl kwb">$available</span> <span class="hl opt">*</span> <span class="hl num">0.7</span> <span class="hl opt">:</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">chooseSizeToInstall</span><span class="hl opt">(</span><span class="hl kwb">$packages, $min_size,</span> min<span class="hl opt">(</span><span class="hl kwb">$max_size, $available</span><span class="hl opt">))</span> <span class="hl kwc">or</span> <span class="hl kwa">goto</span> <span class="hl opt">&amp;</span>choosePackages<span class="hl opt">;</span>

	<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>packages_<span class="hl opt">}{</span>ind<span class="hl opt">}) =</span> 
	  pkgs<span class="hl opt">::</span>setSelectedFromCompssList<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>compssListLevels<span class="hl opt">},</span> <span class="hl kwb">$packages,</span> <span class="hl num">1</span><span class="hl opt">,</span> <span class="hl kwb">$size2install, $o</span><span class="hl opt">-&gt;{</span>installClass<span class="hl opt">});</span>

<span class="hl slc">#	$_-&gt;{selected} and print &quot;$_-&gt;{name}\n&quot; foreach values %$packages;</span>
    <span class="hl opt">}</span>
    <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">choosePackagesTree</span><span class="hl opt">(</span><span class="hl kwb">$packages, $compss</span><span class="hl opt">)</span> <span class="hl kwa">if</span> <span class="hl opt">$::</span>expert<span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl kwa">sub</span> chooseSizeToInstall <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, $packages, $min, $max</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    install_any<span class="hl opt">::</span>getAvailableSpace<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">) *</span> <span class="hl num">0.7</span><span class="hl opt">;</span>
<span class="hl opt">}</span>
<span class="hl kwa">sub</span> choosePackagesTree <span class="hl opt">{}</span>

<span class="hl kwa">sub</span> chooseGroups <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, $packages, $compssUsers, $compssUsersSorted</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>

    <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_many_from_list_ref</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span>
			       _<span class="hl opt">(</span><span class="hl str">&quot;Package Group Selection&quot;</span><span class="hl opt">),</span>
			       <span class="hl opt">[</span> <span class="hl kwb">&#64;$compssUsersSorted,</span> <span class="hl str">&quot;Miscellaneous&quot;</span> <span class="hl opt">],</span>
			       <span class="hl opt">[</span> <span class="hl kwc">map</span> <span class="hl opt">{</span> \<span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>compssUsersChoice<span class="hl opt">}{</span><span class="hl kwb">$_</span><span class="hl opt">} }</span> <span class="hl kwb">&#64;$compssUsersSorted,</span> <span class="hl str">&quot;Miscellaneous&quot;</span> <span class="hl opt">]</span>
			       <span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">goto</span> <span class="hl opt">&amp;</span>chooseGroups <span class="hl kwa">unless</span> <span class="hl opt">$::</span>beginner<span class="hl opt">;</span>

    <span class="hl kwa">unless</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>compssUsersChoice<span class="hl opt">}{</span>Miscellaneous<span class="hl opt">}) {</span>
	<span class="hl kwc">my</span> <span class="hl kwb">%l</span><span class="hl opt">;</span>
	<span class="hl kwb">$l</span><span class="hl opt">{&#64;{</span><span class="hl kwb">$compssUsers</span><span class="hl opt">-&gt;{</span><span class="hl kwb">$_</span><span class="hl opt">}}} = ()</span> <span class="hl kwa">foreach</span> <span class="hl kwb">&#64;$compssUsersSorted</span><span class="hl opt">;</span>
	<span class="hl kwc">exists</span> <span class="hl kwb">$l</span><span class="hl opt">{</span><span class="hl kwb">$_</span><span class="hl opt">}</span> <span class="hl kwc">or</span> <span class="hl kwb">$packages</span><span class="hl opt">-&gt;{</span><span class="hl kwb">$_</span><span class="hl opt">}{</span>skip<span class="hl opt">} =</span> <span class="hl num">1</span> <span class="hl kwa">foreach</span> <span class="hl kwc">keys</span> <span class="hl kwb">%$packages</span><span class="hl opt">;</span>
    <span class="hl opt">}</span>
    <span class="hl kwa">foreach</span> <span class="hl opt">(</span><span class="hl kwb">&#64;$compssUsersSorted</span><span class="hl opt">) {</span>
	<span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>compssUsersChoice<span class="hl opt">}{</span><span class="hl kwb">$_</span><span class="hl opt">}</span> <span class="hl kwc">or</span> pkgs<span class="hl opt">::</span>skip_set<span class="hl opt">(</span><span class="hl kwb">$packages,</span> <span class="hl opt">&#64;{</span><span class="hl kwb">$compssUsers</span><span class="hl opt">-&gt;{</span><span class="hl kwb">$_</span><span class="hl opt">}});</span>
    <span class="hl opt">}</span>
    <span class="hl kwa">foreach</span> <span class="hl opt">(</span><span class="hl kwb">&#64;$compssUsersSorted</span><span class="hl opt">) {</span>
	<span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>compssUsersChoice<span class="hl opt">}{</span><span class="hl kwb">$_</span><span class="hl opt">}</span> <span class="hl kwc">or</span> <span class="hl kwa">next</span><span class="hl opt">;</span>
	<span class="hl kwa">foreach</span> <span class="hl opt">(&#64;{</span><span class="hl kwb">$compssUsers</span><span class="hl opt">-&gt;{</span><span class="hl kwb">$_</span><span class="hl opt">}}) {</span>
	    <span class="hl kwb">$_</span><span class="hl opt">-&gt;{</span>unskip<span class="hl opt">} =</span> <span class="hl num">1</span><span class="hl opt">;</span>
	    <span class="hl kwc">delete</span> <span class="hl kwb">$_</span><span class="hl opt">-&gt;{</span>skip<span class="hl opt">};</span>
	<span class="hl opt">}</span>
    <span class="hl opt">}</span>
<span class="hl opt">}</span>

<span class="hl slc">#------------------------------------------------------------------------------</span>
<span class="hl kwa">sub</span> installPackages <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, $packages</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$current, $total</span><span class="hl opt">) =</span> <span class="hl num">0</span><span class="hl opt">;</span>

    <span class="hl kwc">my</span> <span class="hl kwb">$w</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">wait_message</span><span class="hl opt">(</span>_<span class="hl opt">(</span><span class="hl str">&quot;Installing&quot;</span><span class="hl opt">),</span> _<span class="hl opt">(</span><span class="hl str">&quot;Preparing installation&quot;</span><span class="hl opt">));</span>

    <span class="hl kwc">my</span> <span class="hl kwb">$old</span> <span class="hl opt">=</span> \<span class="hl opt">&amp;</span>pkgs<span class="hl opt">::</span>installCallback<span class="hl opt">;</span>
    <span class="hl kwc">local</span> <span class="hl opt">*</span>pkgs<span class="hl opt">::</span>installCallback <span class="hl opt">=</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$m</span> <span class="hl opt">=</span> <span class="hl kwc">shift</span><span class="hl opt">;</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$m</span> <span class="hl opt">=~</span> <span class="hl kwd">/^Starting installation/</span><span class="hl opt">) {</span>
	    <span class="hl kwb">$total</span> <span class="hl opt">=</span> <span class="hl kwb">$_</span><span class="hl opt">[</span><span class="hl num">1</span><span class="hl opt">];</span>
	<span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$m</span> <span class="hl opt">=~</span> <span class="hl kwd">/^Starting installing package/</span><span class="hl opt">) {</span>
	    <span class="hl kwc">my</span> <span class="hl kwb">$name</span> <span class="hl opt">=</span> <span class="hl kwb">$_</span><span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">];</span>
	    <span class="hl kwb">$w</span><span class="hl opt">-&gt;</span><span class="hl kwd">set</span><span class="hl opt">(</span>_<span class="hl opt">(</span><span class="hl str">&quot;Installing package</span> <span class="hl ipl">%s\n%d%%</span><span class="hl str">&quot;</span><span class="hl opt">,</span> <span class="hl kwb">$name, $total</span> <span class="hl opt">&amp;&amp;</span> <span class="hl num">100</span> <span class="hl opt">*</span> <span class="hl kwb">$current</span> <span class="hl opt">/</span> <span class="hl kwb">$total</span><span class="hl opt">));</span>
	    <span class="hl kwb">$current</span> <span class="hl opt">+=</span> c<span class="hl opt">::</span>headerGetEntry<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>packages<span class="hl opt">}{</span><span class="hl kwb">$name</span><span class="hl opt">}{</span>header<span class="hl opt">},</span> <span class="hl str">&apos;size&apos;</span><span class="hl opt">);</span>
	<span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span> <span class="hl kwc">unshift</span> <span class="hl kwb">&#64;_, $m</span><span class="hl opt">;</span> <span class="hl kwa">goto</span> <span class="hl kwb">$old</span> <span class="hl opt">}</span>
    <span class="hl opt">};</span>
    <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">SUPER</span><span class="hl opt">::</span>installPackages<span class="hl opt">(</span><span class="hl kwb">$packages</span><span class="hl opt">);</span>
<span class="hl opt">}</span>

<span class="hl kwa">sub</span> afterInstallPackages<span class="hl opt">($) {</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$w</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">wait_message</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">&quot;Post install configuration&quot;</span><span class="hl opt">));</span>
    <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">SUPER</span><span class="hl opt">::</span>afterInstallPackages<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">);</span>
<span class="hl opt">}</span>

<span class="hl slc">#------------------------------------------------------------------------------</span>
<span class="hl kwa">sub</span> configureNetwork<span class="hl opt">($) {</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, $first_time</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl kwc">local</span> <span class="hl kwb">$_</span><span class="hl opt">;</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>intf<span class="hl opt">}) {</span>
	<span class="hl kwa">if</span> <span class="hl opt">(!$::</span>beginner <span class="hl opt">&amp;&amp;</span> <span class="hl kwb">$first_time</span> <span class="hl opt">|| $::</span>expert<span class="hl opt">) {</span>
	    <span class="hl kwc">my</span> <span class="hl kwb">&#64;l</span> <span class="hl opt">= (</span>
		     __<span class="hl opt">(</span><span class="hl str">&quot;Keep the current IP configuration&quot;</span><span class="hl opt">),</span>
		     __<span class="hl opt">(</span><span class="hl str">&quot;Reconfigure network now&quot;</span><span class="hl opt">),</span>
		     __<span class="hl opt">(</span><span class="hl str">&quot;Do not set up networking&quot;</span><span class="hl opt">),</span>
		    <span class="hl opt">);</span>
	    <span class="hl kwb">$_</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_list_</span><span class="hl opt">([</span> _<span class="hl opt">(</span><span class="hl str">&quot;Network Configuration&quot;</span><span class="hl opt">) ],</span>
				    _<span class="hl opt">(</span><span class="hl str">&quot;Local networking has already been configured. Do you want to:&quot;</span><span class="hl opt">),</span>
				    <span class="hl opt">[</span> <span class="hl kwb">&#64;l</span> <span class="hl opt">]) ||</span> <span class="hl str">&quot;Do not&quot;</span><span class="hl opt">;</span>
	<span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span> <span class="hl kwb">$_</span> <span class="hl opt">=</span> <span class="hl str">&quot;Keep&quot;</span><span class="hl opt">; }</span>
    <span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>modem<span class="hl opt">}) {</span>
	<span class="hl kwb">$_</span> <span class="hl opt">=</span> <span class="hl str">&quot;Dialup&quot;</span><span class="hl opt">;</span>
    <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
	<span class="hl kwb">$_</span> <span class="hl opt">= $::</span>beginner ? <span class="hl str">&quot;Do not&quot;</span> <span class="hl opt">:</span>
	  <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_list_</span><span class="hl opt">([</span> _<span class="hl opt">(</span><span class="hl str">&quot;Network Configuration&quot;</span><span class="hl opt">) ],</span>
			     _<span class="hl opt">(</span><span class="hl str">&quot;Do you want to configure networking for your system?&quot;</span><span class="hl opt">),</span>
			     <span class="hl opt">[</span> __<span class="hl opt">(</span><span class="hl str">&quot;Local LAN&quot;</span><span class="hl opt">),</span> __<span class="hl opt">(</span><span class="hl str">&quot;Dialup with modem&quot;</span><span class="hl opt">),</span> __<span class="hl opt">(</span><span class="hl str">&quot;Do not set up networking&quot;</span><span class="hl opt">) ]);</span>
    <span class="hl opt">}</span>

    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwd">/^Dialup/</span><span class="hl opt">) {</span>
	<span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">pppConfig</span><span class="hl opt">;</span>
    <span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwd">/^Do not/</span><span class="hl opt">) {</span>
	<span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>netc<span class="hl opt">}{</span>NETWORKING<span class="hl opt">} =</span> <span class="hl str">&quot;false&quot;</span><span class="hl opt">;</span>
    <span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(!</span><span class="hl kwd">/^Keep/</span><span class="hl opt">) {</span>
	<span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">setup_thiskind</span><span class="hl opt">(</span><span class="hl str">&apos;net&apos;</span><span class="hl opt">, !$::</span>expert<span class="hl opt">,</span> <span class="hl num">1</span><span class="hl opt">);</span>
	<span class="hl kwc">my</span> <span class="hl kwb">&#64;l</span> <span class="hl opt">=</span> detect_devices<span class="hl opt">::</span>getNet<span class="hl opt">()</span> <span class="hl kwc">or die</span> _<span class="hl opt">(</span><span class="hl str">&quot;no network card found&quot;</span><span class="hl opt">);</span>

	<span class="hl kwc">my</span> <span class="hl kwb">$last</span><span class="hl opt">;</span> <span class="hl kwa">foreach</span> <span class="hl opt">($::</span>beginner ? <span class="hl kwb">$l</span><span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">] :</span> <span class="hl kwb">&#64;l</span><span class="hl opt">) {</span>
	    <span class="hl kwc">my</span> <span class="hl kwb">$intf</span> <span class="hl opt">=</span> network<span class="hl opt">::</span>findIntf<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>intf<span class="hl opt">} ||= [],</span> <span class="hl kwb">$_</span><span class="hl opt">);</span>
	    add2hash<span class="hl opt">(</span><span class="hl kwb">$intf, $last</span><span class="hl opt">);</span>
	    add2hash<span class="hl opt">(</span><span class="hl kwb">$intf,</span> <span class="hl opt">{</span> NETMASK <span class="hl opt">=&gt;</span> <span class="hl str">&apos;255.255.255.0&apos;</span> <span class="hl opt">});</span>
	    <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">configureNetworkIntf</span><span class="hl opt">(</span><span class="hl kwb">$intf</span><span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">return</span><span class="hl opt">;</span>

	    <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>netc<span class="hl opt">} ||= {};</span>
	    <span class="hl kwc">delete</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>netc<span class="hl opt">}{</span>dnsServer<span class="hl opt">};</span>
	    <span class="hl kwc">delete</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>netc<span class="hl opt">}{</span>GATEWAY<span class="hl opt">};</span>
	    <span class="hl kwb">$last</span> <span class="hl opt">=</span> <span class="hl kwb">$intf</span><span class="hl opt">;</span>
	<span class="hl opt">}</span>
	<span class="hl slc">#-	  {</span>
	<span class="hl slc">#-	      my $wait = $o-&gt;wait_message(_(&quot;Hostname&quot;), _(&quot;Determining host name and domain...&quot;));</span>
	<span class="hl slc">#-	      network::guessHostname($o-&gt;{prefix}, $o-&gt;{netc}, $o-&gt;{intf});</span>
	<span class="hl slc">#-	  }</span>
	<span class="hl kwb">$last</span><span class="hl opt">-&gt;{</span>BOOTPROTO<span class="hl opt">} =~</span> <span class="hl kwd">/^(dhcp|bootp)$/</span> <span class="hl opt">||</span>
	  <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">configureNetworkNet</span><span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>netc<span class="hl opt">},</span> <span class="hl kwb">$last</span> <span class="hl opt">||= {},</span> <span class="hl kwb">&#64;l</span><span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">return</span><span class="hl opt">;</span>
    <span class="hl opt">}</span>
    install_steps<span class="hl opt">::</span>configureNetwork<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">);</span>
<span class="hl opt">}</span>

<span class="hl kwa">sub</span> configureNetworkIntf <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, $intf</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$pump</span> <span class="hl opt">=</span> <span class="hl kwb">$intf</span><span class="hl opt">-&gt;{</span>BOOTPROTO<span class="hl opt">} =~</span> <span class="hl kwd">/^(dhcp|bootp)$/</span><span class="hl opt">;</span>
    <span class="hl kwc">delete</span> <span class="hl kwb">$intf</span><span class="hl opt">-&gt;{</span>NETWORK<span class="hl opt">};</span>
    <span class="hl kwc">delete</span> <span class="hl kwb">$intf</span><span class="hl opt">-&gt;{</span>BROADCAST<span class="hl opt">};</span>
    <span class="hl kwc">my</span> <span class="hl kwb">&#64;fields</span> <span class="hl opt">=</span> <span class="hl str">qw(IPADDR NETMASK)</span><span class="hl opt">;</span>
    <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">set_help</span><span class="hl opt">(</span><span class="hl str">&apos;configureNetworkIP&apos;</span><span class="hl opt">);</span>
    <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_entries_ref</span><span class="hl opt">(</span>_<span class="hl opt">(</span><span class="hl str">&quot;Configuring network device</span> <span class="hl ipl">%s</span><span class="hl str">&quot;</span><span class="hl opt">,</span> <span class="hl kwb">$intf</span><span class="hl opt">-&gt;{</span>DEVICE<span class="hl opt">}),</span>
<span class="hl opt">($::</span>isStandalone ? <span class="hl str">&apos;&apos;</span> <span class="hl opt">:</span> _<span class="hl opt">(</span><span class="hl str">&quot;Configuring network device</span> <span class="hl ipl">%s</span><span class="hl str">&quot;</span><span class="hl opt">,</span> <span class="hl kwb">$intf</span><span class="hl opt">-&gt;{</span>DEVICE<span class="hl opt">}) .</span> <span class="hl str">&quot;</span><span class="hl esc">\n\n</span><span class="hl str">&quot;</span><span class="hl opt">) .</span>
_<span class="hl opt">(</span><span class="hl str">&quot;Please enter the IP configuration for this machine.</span>
<span class="hl str">Each item should be entered as an IP address in dotted-decimal</span>
<span class="hl str">notation (for example, 1.2.3.4).&quot;</span><span class="hl opt">),</span>
			     <span class="hl opt">[</span> _<span class="hl opt">(</span><span class="hl str">&quot;IP address:&quot;</span><span class="hl opt">),</span> _<span class="hl opt">(</span><span class="hl str">&quot;Netmask:&quot;</span><span class="hl opt">),</span> _<span class="hl opt">(</span><span class="hl str">&quot;Automatic IP&quot;</span><span class="hl opt">) ],</span>
			     <span class="hl opt">[</span> \<span class="hl kwb">$intf</span><span class="hl opt">-&gt;{</span>IPADDR<span class="hl opt">},</span> \<span class="hl kwb">$intf</span><span class="hl opt">-&gt;{</span>NETMASK<span class="hl opt">}, {</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$pump,</span> type <span class="hl opt">=&gt;</span> <span class="hl str">&quot;bool&quot;</span><span class="hl opt">,</span> text <span class="hl opt">=&gt;</span> _<span class="hl opt">(</span><span class="hl str">&quot;(bootp/dhcp)&quot;</span><span class="hl opt">) } ],</span>
			     complete <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
				 <span class="hl kwb">$intf</span><span class="hl opt">-&gt;{</span>BOOTPROTO<span class="hl opt">} =</span> <span class="hl kwb">$pump</span> ? <span class="hl str">&quot;dhcp&quot;</span> <span class="hl opt">:</span> <span class="hl str">&quot;static&quot;</span><span class="hl opt">;</span>
				 <span class="hl kwa">return</span> <span class="hl num">0</span> <span class="hl kwa">if</span> <span class="hl kwb">$pump</span><span class="hl opt">;</span>
				 <span class="hl kwa">for</span> <span class="hl opt">(</span><span class="hl kwc">my</span> <span class="hl kwb">$i</span> <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span> <span class="hl kwb">$i</span> <span class="hl opt">&lt;</span> <span class="hl kwb">&#64;fields</span><span class="hl opt">;</span> <span class="hl kwb">$i++</span><span class="hl opt">) {</span>
				     <span class="hl kwa">unless</span> <span class="hl opt">(</span>network<span class="hl opt">::</span>is_ip<span class="hl opt">(</span><span class="hl kwb">$intf</span><span class="hl opt">-&gt;{</span><span class="hl kwb">$fields</span><span class="hl opt">[</span><span class="hl kwb">$i</span><span class="hl opt">]})) {</span>
					 <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">&quot;IP address should be in format 1.2.3.4&quot;</span><span class="hl opt">));</span>
					 <span class="hl kwa">return</span> <span class="hl opt">(</span><span class="hl num">1</span><span class="hl opt">,</span><span class="hl kwb">$i</span><span class="hl opt">);</span>
				     <span class="hl opt">}</span>
				     <span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
				 <span class="hl opt">}</span>
			     <span class="hl opt">},</span>
			     focus_out <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
				 <span class="hl kwb">$intf</span><span class="hl opt">-&gt;{</span>NETMASK<span class="hl opt">} =</span> network<span class="hl opt">::</span>netmask<span class="hl opt">(</span><span class="hl kwb">$intf</span><span class="hl opt">-&gt;{</span>IPADDR<span class="hl opt">})</span> <span class="hl kwa">unless</span> <span class="hl kwb">$_</span><span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">]</span>
			     <span class="hl opt">}</span>
			    <span class="hl opt">);</span>
<span class="hl opt">}</span>

<span class="hl kwa">sub</span> configureNetworkNet <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, $netc, $intf, &#64;devices</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>

    <span class="hl kwb">$netc</span><span class="hl opt">-&gt;{</span>dnsServer<span class="hl opt">} ||=</span> network<span class="hl opt">::</span>dns<span class="hl opt">(</span><span class="hl kwb">$intf</span><span class="hl opt">-&gt;{</span>IPADDR<span class="hl opt">});</span>
    <span class="hl kwb">$netc</span><span class="hl opt">-&gt;{</span>GATEWAY<span class="hl opt">}   ||=</span> network<span class="hl opt">::</span>gateway<span class="hl opt">(</span><span class="hl kwb">$intf</span><span class="hl opt">-&gt;{</span>IPADDR<span class="hl opt">});</span>

    <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_entries_ref</span><span class="hl opt">(</span>_<span class="hl opt">(</span><span class="hl str">&quot;Configuring network&quot;</span><span class="hl opt">),</span>
_<span class="hl opt">(</span><span class="hl str">&quot;Please enter your host name.</span>
<span class="hl str">Your host name should be a fully-qualified host name,</span>
<span class="hl str">such as ``mybox.mylab.myco.com&apos;&apos;.</span>
<span class="hl str">You may also enter the IP address of the gateway if you have one&quot;</span><span class="hl opt">),</span>
			     <span class="hl opt">[</span>_<span class="hl opt">(</span><span class="hl str">&quot;Host name:&quot;</span><span class="hl opt">),</span> _<span class="hl opt">(</span><span class="hl str">&quot;DNS server:&quot;</span><span class="hl opt">),</span> _<span class="hl opt">(</span><span class="hl str">&quot;Gateway:&quot;</span><span class="hl opt">), $::</span>expert ? _<span class="hl opt">(</span><span class="hl str">&quot;Gateway device:&quot;</span><span class="hl opt">) : ()],</span>
			     <span class="hl opt">[(</span><span class="hl kwc">map</span> <span class="hl opt">{</span> \<span class="hl kwb">$netc</span><span class="hl opt">-&gt;{</span><span class="hl kwb">$_</span><span class="hl opt">}}</span> <span class="hl str">qw(HOSTNAME dnsServer GATEWAY)</span><span class="hl opt">),</span>
			      <span class="hl opt">{</span>val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$netc</span><span class="hl opt">-&gt;{</span>GATEWAYDEV<span class="hl opt">},</span> list <span class="hl opt">=&gt;</span> \<span class="hl kwb">&#64;devices</span><span class="hl opt">}]</span>
			    <span class="hl opt">);</span>

    <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">miscellaneousNetwork</span><span class="hl opt">();</span>
<span class="hl opt">}</span>

<span class="hl slc">#------------------------------------------------------------------------------</span>
<span class="hl kwa">sub</span> pppConfig <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$m</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>modem<span class="hl opt">} ||= {};</span>

    <span class="hl kwa">unless</span> <span class="hl opt">(</span><span class="hl kwb">$m</span><span class="hl opt">-&gt;{</span>device<span class="hl opt">} || $::</span>expert <span class="hl opt">&amp;&amp; !</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_yesorno</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">&quot;Try to find a modem?&quot;</span><span class="hl opt">),</span> <span class="hl num">1</span><span class="hl opt">)) {</span>
	<span class="hl kwa">foreach</span> <span class="hl opt">(</span><span class="hl num">0</span><span class="hl opt">.</span><span class="hl num">.3</span><span class="hl opt">) {</span>
	    <span class="hl kwa">next if</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>mouse<span class="hl opt">}{</span>device<span class="hl opt">} =~</span> <span class="hl kwd">/ttyS$_/</span><span class="hl opt">;</span>
	    detect_devices<span class="hl opt">::</span>hasModem<span class="hl opt">(</span><span class="hl str">&quot;</span><span class="hl ipl">$o</span><span class="hl str">-&gt;{prefix}/dev/ttyS</span><span class="hl ipl">$_</span><span class="hl str">&quot;</span><span class="hl opt">)</span>
		<span class="hl kwc">and</span> <span class="hl kwb">$m</span><span class="hl opt">-&gt;{</span>device<span class="hl opt">} =</span> <span class="hl str">&quot;ttyS</span><span class="hl ipl">$_</span><span class="hl str">&quot;</span><span class="hl opt">,</span> <span class="hl kwa">last</span><span class="hl opt">;</span>
	<span class="hl opt">}</span>
    <span class="hl opt">}</span>

    <span class="hl kwb">$m</span><span class="hl opt">-&gt;{</span>device<span class="hl opt">} ||=</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">set_help</span><span class="hl opt">(</span><span class="hl str">&apos;selectSerialPort&apos;</span><span class="hl opt">) &amp;&amp;</span> 
                     mouse<span class="hl opt">::</span>serial_ports_names2dev<span class="hl opt">(</span>
	<span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_list</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">&quot;Which serial port is your modem connected to?&quot;</span><span class="hl opt">),</span>
			  <span class="hl opt">[</span> mouse<span class="hl opt">::</span>serial_ports_names <span class="hl opt">]));</span>

    <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">set_help</span><span class="hl opt">(</span><span class="hl str">&apos;configureNetworkISP&apos;</span><span class="hl opt">);</span>
    install_steps<span class="hl opt">::</span>pppConfig<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">)</span> <span class="hl kwa">if</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_entries_refH</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span>
							      _<span class="hl opt">(</span><span class="hl str">&quot;Dialup options&quot;</span><span class="hl opt">), [</span>
_<span class="hl opt">(</span><span class="hl str">&quot;Connection name&quot;</span><span class="hl opt">) =&gt;</span> \<span class="hl kwb">$m</span><span class="hl opt">-&gt;{</span>connection<span class="hl opt">},</span>
_<span class="hl opt">(</span><span class="hl str">&quot;Phone number&quot;</span><span class="hl opt">) =&gt;</span> \<span class="hl kwb">$m</span><span class="hl opt">-&gt;{</span>phone<span class="hl opt">},</span>
_<span class="hl opt">(</span><span class="hl str">&quot;Login ID&quot;</span><span class="hl opt">) =&gt;</span> \<span class="hl kwb">$m</span><span class="hl opt">-&gt;{</span>login<span class="hl opt">},</span>
_<span class="hl opt">(</span><span class="hl str">&quot;Password&quot;</span><span class="hl opt">) =&gt; {</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$m</span><span class="hl opt">-&gt;{</span>passwd<span class="hl opt">},</span> hidden <span class="hl opt">=&gt;</span> <span class="hl num">1</span> <span class="hl opt">},</span>
_<span class="hl opt">(</span><span class="hl str">&quot;Authentication&quot;</span><span class="hl opt">) =&gt; {</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$m</span><span class="hl opt">-&gt;{</span>auth<span class="hl opt">},</span> list <span class="hl opt">=&gt; [</span> __<span class="hl opt">(</span><span class="hl str">&quot;PAP&quot;</span><span class="hl opt">),</span> __<span class="hl opt">(</span><span class="hl str">&quot;CHAP&quot;</span><span class="hl opt">),</span> __<span class="hl opt">(</span><span class="hl str">&quot;Terminal-based&quot;</span><span class="hl opt">),</span> __<span class="hl opt">(</span><span class="hl str">&quot;Script-based&quot;</span><span class="hl opt">) ] },</span>
_<span class="hl opt">(</span><span class="hl str">&quot;Domain name&quot;</span><span class="hl opt">) =&gt;</span> \<span class="hl kwb">$m</span><span class="hl opt">-&gt;{</span>domain<span class="hl opt">},</span>
_<span class="hl opt">(</span><span class="hl str">&quot;First DNS Server&quot;</span><span class="hl opt">) =&gt;</span> \<span class="hl kwb">$m</span><span class="hl opt">-&gt;{</span>dns1<span class="hl opt">},</span>
_<span class="hl opt">(</span><span class="hl str">&quot;Second DNS Server&quot;</span><span class="hl opt">) =&gt;</span> \<span class="hl kwb">$m</span><span class="hl opt">-&gt;{</span>dns2<span class="hl opt">},</span>
    <span class="hl opt">]);</span>

    <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">miscellaneousNetwork</span><span class="hl opt">();</span>
<span class="hl opt">}</span>

<span class="hl slc">#------------------------------------------------------------------------------</span>
<span class="hl kwa">sub</span> installCrypto <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$u</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>crypto<span class="hl opt">} ||= {};</span>
    
    <span class="hl opt">$::</span>expert <span class="hl kwc">or</span> <span class="hl kwa">return</span><span class="hl opt">;</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>intf<span class="hl opt">} &amp;&amp;</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>netc<span class="hl opt">}{</span>NETWORKING<span class="hl opt">}</span> <span class="hl kwc">ne</span> <span class="hl str">&apos;false&apos;</span><span class="hl opt">) {</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$w</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">wait_message</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">&quot;Bringing up the network&quot;</span><span class="hl opt">));</span>
	network<span class="hl opt">::</span>up_it<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>prefix<span class="hl opt">},</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>intf<span class="hl opt">});</span>
    <span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>modem<span class="hl opt">}) {</span>
	run_program<span class="hl opt">::</span>rooted<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>prefix<span class="hl opt">},</span> <span class="hl str">&quot;ifup&quot;</span><span class="hl opt">,</span> <span class="hl str">&quot;ppp0&quot;</span><span class="hl opt">);</span>
    <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
	<span class="hl kwa">return</span><span class="hl opt">;</span>
    <span class="hl opt">}</span>
    
    is_empty_hash_ref<span class="hl opt">(</span><span class="hl kwb">$u</span><span class="hl opt">)</span> <span class="hl kwc">and</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_yesorno</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> 
_<span class="hl opt">(</span><span class="hl str">&quot;You have now the possibility to download software aimed for encryption.</span>
<span class="hl str"></span>
<span class="hl str">WARNING:</span>
<span class="hl str"></span>
<span class="hl str">Due to different general requirements applicable to these software and imposed</span>
<span class="hl str">by various jurisdictions, customer and/or end user of theses software should</span>
<span class="hl str">ensure that the laws of his/their jurisdiction allow him/them to download, stock</span>
<span class="hl str">and/or use these software.</span>
<span class="hl str"></span>
<span class="hl str">In addition customer and/or end user shall particularly be aware to not infringe</span>
<span class="hl str">the laws of his/their jurisdiction. Should customer and/or end user do not</span>
<span class="hl str">respect the provision of these applicable laws, he/they will incur serious</span>
<span class="hl str">sanctions.</span>
<span class="hl str"></span>
<span class="hl str">In no event shall Mandrakesoft nor its manufacturers and/or suppliers be liable</span>
<span class="hl str">for special, indirect or incidental damages whatsoever (including, but not</span>
<span class="hl str">limited to loss of profits, business interruption, loss of commercial data and</span>
<span class="hl str">other pecuniary losses, and eventual liabilities and indemnification to be paid</span>
<span class="hl str">pursuant to a court decision) arising out of use, possession, or the sole</span>
<span class="hl str">downloading of these software, to which customer and/or end user could</span>
<span class="hl str">eventually have access after having sign up the present agreement.</span>
<span class="hl str"></span>
<span class="hl str"></span>
<span class="hl str">For any queries relating to these agreement, please contact </span>
<span class="hl str">Mandrakesoft, Inc.</span>
<span class="hl str">2400 N. Lincoln Avenue Suite 243</span>
<span class="hl str">Altadena California 91001</span>
<span class="hl str">USA&quot;</span><span class="hl opt">)) ||</span> <span class="hl kwa">return</span><span class="hl opt">;</span>

    <span class="hl kwa">require</span> crypto<span class="hl opt">;</span>
    <span class="hl kwc">eval</span> <span class="hl opt">{</span>
      <span class="hl kwb">$u</span><span class="hl opt">-&gt;{</span>mirror<span class="hl opt">} =</span> crypto<span class="hl opt">::</span>text2mirror<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_list</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">&quot;Choose a mirror from which to get the packages&quot;</span><span class="hl opt">), [</span> crypto<span class="hl opt">::</span>mirrorstext<span class="hl opt">() ],</span> crypto<span class="hl opt">::</span>mirror2text<span class="hl opt">(</span><span class="hl kwb">$u</span><span class="hl opt">-&gt;{</span>mirror<span class="hl opt">})));</span>
    <span class="hl opt">};</span>
    <span class="hl kwa">return if</span> <span class="hl kwb">$&#64;</span><span class="hl opt">;</span>
    
    <span class="hl kwc">my</span> <span class="hl kwb">&#64;packages</span> <span class="hl opt">=</span> <span class="hl kwa">do</span> <span class="hl opt">{</span>
      <span class="hl kwc">my</span> <span class="hl kwb">$w</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">wait_message</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">&quot;Contacting the mirror to get the list of available packages&quot;</span><span class="hl opt">));</span>
      crypto<span class="hl opt">::</span>packages<span class="hl opt">(</span><span class="hl kwb">$u</span><span class="hl opt">-&gt;{</span>mirror<span class="hl opt">});</span>
    <span class="hl opt">};</span>

    <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_many_from_list_ref</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">&quot;Which packages do you want to install&quot;</span><span class="hl opt">),</span> \<span class="hl kwb">&#64;packages,</span> <span class="hl opt">[</span> <span class="hl kwc">map</span> <span class="hl opt">{</span> \<span class="hl kwb">$u</span><span class="hl opt">-&gt;{</span>packages<span class="hl opt">}{</span><span class="hl kwb">$_</span><span class="hl opt">} }</span> <span class="hl kwb">&#64;packages</span> <span class="hl opt">])</span> <span class="hl kwc">or</span> <span class="hl kwa">return</span><span class="hl opt">;</span>

    <span class="hl kwc">my</span> <span class="hl kwb">$w</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">wait_message</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">&quot;Downloading cryptographic packages&quot;</span><span class="hl opt">));</span>
    install_steps<span class="hl opt">::</span>installCrypto<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">);</span>
<span class="hl opt">}</span>

<span class="hl slc">#------------------------------------------------------------------------------</span>
<span class="hl kwa">sub</span> timeConfig <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, $f, $clicked</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>

    <span class="hl kwa">require</span> timezone<span class="hl opt">;</span>
    <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>timezone<span class="hl opt">}{</span>timezone<span class="hl opt">} ||=</span> timezone<span class="hl opt">::</span>bestTimezone<span class="hl opt">(</span>lang<span class="hl opt">::</span>lang2text<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>lang<span class="hl opt">}));</span>
    <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>timezone<span class="hl opt">}{</span>timezone<span class="hl opt">} =</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_list</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">&quot;Which is your timezone?&quot;</span><span class="hl opt">), [</span> timezone<span class="hl opt">::</span>getTimeZones<span class="hl opt">($::</span>g_auto_install ? <span class="hl str">&apos;&apos;</span> <span class="hl opt">:</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>prefix<span class="hl opt">}) ],</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>timezone<span class="hl opt">}{</span>timezone<span class="hl opt">});</span>
    <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>timezone<span class="hl opt">}{</span>UTC<span class="hl opt">} =</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_yesorno</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">&quot;Is your hardware clock set to GMT?&quot;</span><span class="hl opt">),</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>timezone<span class="hl opt">}{</span>UTC<span class="hl opt">})</span> <span class="hl kwa">if</span> <span class="hl opt">$::</span>expert <span class="hl opt">||</span> <span class="hl kwb">$clicked</span><span class="hl opt">;</span>
    install_steps<span class="hl opt">::</span>timeConfig<span class="hl opt">(</span><span class="hl kwb">$o,$f</span><span class="hl opt">);</span>
<span class="hl opt">}</span>

<span class="hl slc">#------------------------------------------------------------------------------</span>
<span class="hl slc">#-sub servicesConfig {}</span>
<span class="hl slc">#------------------------------------------------------------------------------</span>
<span class="hl kwa">sub</span> printerConfig<span class="hl opt">($) {</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>printer<span class="hl opt">}{</span>want<span class="hl opt">} =</span>
      <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_yesorno</span><span class="hl opt">(</span>_<span class="hl opt">(</span><span class="hl str">&quot;Printer&quot;</span><span class="hl opt">),</span>
		      _<span class="hl opt">(</span><span class="hl str">&quot;Would you like to configure a printer?&quot;</span><span class="hl opt">),</span>
		      <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>printer<span class="hl opt">}{</span>want<span class="hl opt">});</span>
    <span class="hl kwa">return if</span> <span class="hl opt">!</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>printer<span class="hl opt">}{</span>want<span class="hl opt">};</span>

    <span class="hl kwa">require</span> printerdrake<span class="hl opt">;</span>
    printerdrake<span class="hl opt">::</span>main<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>prefix<span class="hl opt">},</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>printer<span class="hl opt">},</span> <span class="hl kwb">$o,</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span> install_any<span class="hl opt">::</span>pkg_install<span class="hl opt">(</span><span class="hl kwb">$o, $_</span><span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">]) });</span>
<span class="hl opt">}</span>

<span class="hl slc">#------------------------------------------------------------------------------</span>
<span class="hl kwa">sub</span> setRootPassword<span class="hl opt">($) {</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, $clicked</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$sup</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>superuser<span class="hl opt">} ||= {};</span>
    <span class="hl kwb">$sup</span><span class="hl opt">-&gt;{</span>password2<span class="hl opt">} ||=</span> <span class="hl kwb">$sup</span><span class="hl opt">-&gt;{</span>password<span class="hl opt">} ||=</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">;</span>

    <span class="hl kwa">return if</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>security<span class="hl opt">} &lt;</span> <span class="hl num">1</span> <span class="hl opt">&amp;&amp; !</span><span class="hl kwb">$clicked</span><span class="hl opt">;</span>

    <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">set_help</span><span class="hl opt">(</span><span class="hl str">&quot;setRootPassword&quot;</span><span class="hl opt">,</span> 
		 <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>installClass<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;server&quot;</span> <span class="hl opt">|| $::</span>expert ? <span class="hl str">&quot;setRootPasswordMd5&quot;</span> <span class="hl opt">: (),</span>
		 <span class="hl opt">$::</span>beginner ? <span class="hl opt">() :</span> <span class="hl str">&quot;setRootPasswordNIS&quot;</span><span class="hl opt">);</span>

    <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_entries_refH</span><span class="hl opt">([</span>_<span class="hl opt">(</span><span class="hl str">&quot;Set root password&quot;</span><span class="hl opt">),</span> _<span class="hl opt">(</span><span class="hl str">&quot;Ok&quot;</span><span class="hl opt">),</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>security<span class="hl opt">} &gt;</span> <span class="hl num">2</span> ? <span class="hl opt">() :</span> _<span class="hl opt">(</span><span class="hl str">&quot;No password&quot;</span><span class="hl opt">)],</span>
			 _<span class="hl opt">(</span><span class="hl str">&quot;Set root password&quot;</span><span class="hl opt">), [</span>
_<span class="hl opt">(</span><span class="hl str">&quot;Password&quot;</span><span class="hl opt">) =&gt; {</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$sup</span><span class="hl opt">-&gt;{</span>password<span class="hl opt">},</span>  hidden <span class="hl opt">=&gt;</span> <span class="hl num">1</span> <span class="hl opt">},</span>
_<span class="hl opt">(</span><span class="hl str">&quot;Password (again)&quot;</span><span class="hl opt">) =&gt; {</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$sup</span><span class="hl opt">-&gt;{</span>password2<span class="hl opt">},</span> hidden <span class="hl opt">=&gt;</span> <span class="hl num">1</span> <span class="hl opt">},</span>
  <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>installClass<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;server&quot;</span> <span class="hl opt">|| $::</span>expert ? <span class="hl opt">(</span>
_<span class="hl opt">(</span><span class="hl str">&quot;Use shadow file&quot;</span><span class="hl opt">) =&gt; {</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>authentication<span class="hl opt">}{</span>shadow<span class="hl opt">},</span> type <span class="hl opt">=&gt;</span> <span class="hl str">&apos;bool&apos;</span><span class="hl opt">,</span> text <span class="hl opt">=&gt;</span> _<span class="hl opt">(</span><span class="hl str">&quot;shadow&quot;</span><span class="hl opt">) },</span>
_<span class="hl opt">(</span><span class="hl str">&quot;Use MD5 passwords&quot;</span><span class="hl opt">) =&gt; {</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>authentication<span class="hl opt">}{</span>md5<span class="hl opt">},</span> type <span class="hl opt">=&gt;</span> <span class="hl str">&apos;bool&apos;</span><span class="hl opt">,</span> text <span class="hl opt">=&gt;</span> _<span class="hl opt">(</span><span class="hl str">&quot;MD5&quot;</span><span class="hl opt">) },</span>
  <span class="hl opt">) : (), $::</span>beginner ? <span class="hl opt">() : (</span>
_<span class="hl opt">(</span><span class="hl str">&quot;Use NIS&quot;</span><span class="hl opt">) =&gt; {</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>authentication<span class="hl opt">}{</span>NIS<span class="hl opt">},</span> type <span class="hl opt">=&gt;</span> <span class="hl str">&apos;bool&apos;</span><span class="hl opt">,</span> text <span class="hl opt">=&gt;</span> _<span class="hl opt">(</span><span class="hl str">&quot;yellow pages&quot;</span><span class="hl opt">) },</span>
  <span class="hl opt">)</span>
			 <span class="hl opt">],</span> 
			 complete <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
			     <span class="hl kwb">$sup</span><span class="hl opt">-&gt;{</span>password<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl kwb">$sup</span><span class="hl opt">-&gt;{</span>password2<span class="hl opt">}</span> <span class="hl kwc">or</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">, [</span> _<span class="hl opt">(</span><span class="hl str">&quot;The passwords do not match&quot;</span><span class="hl opt">),</span> _<span class="hl opt">(</span><span class="hl str">&quot;Please try again&quot;</span><span class="hl opt">) ]),</span> <span class="hl kwa">return</span> <span class="hl opt">(</span><span class="hl num">1</span><span class="hl opt">,</span><span class="hl num">1</span><span class="hl opt">);</span>
			     <span class="hl kwc">length</span> <span class="hl kwb">$sup</span><span class="hl opt">-&gt;{</span>password<span class="hl opt">} &lt;</span> <span class="hl num">2</span> <span class="hl opt">*</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>security<span class="hl opt">}</span>
			       <span class="hl kwc">and</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">&quot;This password is too simple (must be at least</span> <span class="hl ipl">%d</span> <span class="hl str">characters long)&quot;</span><span class="hl opt">,</span> <span class="hl num">2</span> <span class="hl opt">*</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>security<span class="hl opt">})),</span> <span class="hl kwa">return</span> <span class="hl opt">(</span><span class="hl num">1</span><span class="hl opt">,</span><span class="hl num">0</span><span class="hl opt">);</span>
			     <span class="hl kwa">return</span> <span class="hl num">0</span>
			 <span class="hl opt">}</span>
    <span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">return</span><span class="hl opt">;</span>

    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>authentication<span class="hl opt">}{</span>NIS<span class="hl opt">}) {</span>
	<span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_entries_ref</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span>
				 _<span class="hl opt">(</span><span class="hl str">&quot;Authentification NIS&quot;</span><span class="hl opt">),</span>
				 <span class="hl opt">[</span> _<span class="hl opt">(</span><span class="hl str">&quot;NIS Domain&quot;</span><span class="hl opt">),</span> _<span class="hl opt">(</span><span class="hl str">&quot;NIS Server&quot;</span><span class="hl opt">) ],</span>
				 <span class="hl opt">[</span> \ <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>netc<span class="hl opt">}{</span>NISDOMAIN<span class="hl opt">} ||=</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>netc<span class="hl opt">}{</span>DOMAINNAME<span class="hl opt">}),</span>
				   <span class="hl opt">{</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>authentication<span class="hl opt">}{</span>NIS_server<span class="hl opt">},</span> list <span class="hl opt">=&gt; [</span><span class="hl str">&quot;broadcast&quot;</span><span class="hl opt">] },</span>
				 <span class="hl opt">]);</span>
    <span class="hl opt">}</span>
    install_steps<span class="hl opt">::</span>setRootPassword<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">);</span>
<span class="hl opt">}</span>

<span class="hl slc">#------------------------------------------------------------------------------</span>
<span class="hl slc">#-addUser</span>
<span class="hl slc">#------------------------------------------------------------------------------</span>
<span class="hl kwa">sub</span> addUser<span class="hl opt">($) {</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, $clicked</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$u</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>user<span class="hl opt">} ||=</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>security<span class="hl opt">} &lt;</span> <span class="hl num">1</span> ? <span class="hl opt">{</span> name <span class="hl opt">=&gt;</span> <span class="hl str">&quot;mandrake&quot;</span><span class="hl opt">,</span> realname <span class="hl opt">=&gt;</span> <span class="hl str">&quot;default&quot;</span> <span class="hl opt">} : {};</span>
    <span class="hl kwb">$u</span><span class="hl opt">-&gt;{</span>password2<span class="hl opt">} ||=</span> <span class="hl kwb">$u</span><span class="hl opt">-&gt;{</span>password<span class="hl opt">} ||=</span> <span class="hl str">&quot;&quot;</span><span class="hl opt">;</span>
    <span class="hl kwb">$u</span><span class="hl opt">-&gt;{</span>shell<span class="hl opt">} ||=</span> <span class="hl str">&quot;/bin/bash&quot;</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">&#64;fields</span> <span class="hl opt">=</span> <span class="hl str">qw(realname name password password2)</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">&#64;shells</span> <span class="hl opt">=</span> install_any<span class="hl opt">::</span>shells<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">);</span>

    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>security<span class="hl opt">} &lt;</span> <span class="hl num">2</span> <span class="hl opt">&amp;&amp; !</span><span class="hl kwb">$clicked</span> <span class="hl opt">||</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_entries_refH</span><span class="hl opt">(</span>
        <span class="hl opt">[</span> _<span class="hl opt">(</span><span class="hl str">&quot;Add user&quot;</span><span class="hl opt">),</span> _<span class="hl opt">(</span><span class="hl str">&quot;Accept user&quot;</span><span class="hl opt">),</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>security<span class="hl opt">} &gt;</span> <span class="hl num">4</span> <span class="hl opt">&amp;&amp; !&#64;{</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>users<span class="hl opt">}}</span> ? <span class="hl opt">() :</span> _<span class="hl opt">(</span><span class="hl str">&quot;Done&quot;</span><span class="hl opt">) ],</span>
        _<span class="hl opt">(</span><span class="hl str">&quot;Enter a user</span><span class="hl esc">\n</span><span class="hl str"></span><span class="hl ipl">%s</span><span class="hl str">&quot;</span><span class="hl opt">,</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>users<span class="hl opt">}</span> ? _<span class="hl opt">(</span><span class="hl str">&quot;(already added</span> <span class="hl ipl">%s</span><span class="hl str">)&quot;</span><span class="hl opt">,</span> <span class="hl kwc">join</span><span class="hl opt">(</span><span class="hl str">&quot;, &quot;</span><span class="hl opt">,</span> <span class="hl kwc">map</span> <span class="hl opt">{</span> <span class="hl kwb">$_</span><span class="hl opt">-&gt;{</span>realname<span class="hl opt">} ||</span> <span class="hl kwb">$_</span><span class="hl opt">-&gt;{</span>name<span class="hl opt">} } &#64;{</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>users<span class="hl opt">}})) :</span> <span class="hl str">&apos;&apos;</span><span class="hl opt">),</span>
        <span class="hl opt">[</span> 
	 _<span class="hl opt">(</span><span class="hl str">&quot;Real name&quot;</span><span class="hl opt">) =&gt;</span> \<span class="hl kwb">$u</span><span class="hl opt">-&gt;{</span>realname<span class="hl opt">},</span>
	 _<span class="hl opt">(</span><span class="hl str">&quot;User name&quot;</span><span class="hl opt">) =&gt;</span> \<span class="hl kwb">$u</span><span class="hl opt">-&gt;{</span>name<span class="hl opt">},</span>
	   <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>security<span class="hl opt">} &lt;</span> <span class="hl num">2</span> ? <span class="hl opt">() : (</span>
         _<span class="hl opt">(</span><span class="hl str">&quot;Password&quot;</span><span class="hl opt">) =&gt; {</span>val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$u</span><span class="hl opt">-&gt;{</span>password<span class="hl opt">},</span> hidden <span class="hl opt">=&gt;</span> <span class="hl num">1</span><span class="hl opt">},</span>
         _<span class="hl opt">(</span><span class="hl str">&quot;Password (again)&quot;</span><span class="hl opt">) =&gt; {</span>val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$u</span><span class="hl opt">-&gt;{</span>password2<span class="hl opt">},</span> hidden <span class="hl opt">=&gt;</span> <span class="hl num">1</span><span class="hl opt">},</span>
	   <span class="hl opt">), $::</span>beginner ? <span class="hl opt">() : (</span>
         _<span class="hl opt">(</span><span class="hl str">&quot;Shell&quot;</span><span class="hl opt">) =&gt; {</span>val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$u</span><span class="hl opt">-&gt;{</span>shell<span class="hl opt">},</span> list <span class="hl opt">=&gt;</span> \<span class="hl kwb">&#64;shells,</span> not_edit <span class="hl opt">=&gt; !$::</span>expert<span class="hl opt">}</span> 
	   <span class="hl opt">),</span>
        <span class="hl opt">],</span>
        focus_out <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$_</span><span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">]</span> <span class="hl kwc">eq</span> <span class="hl num">0</span><span class="hl opt">) {</span>
		<span class="hl kwb">$u</span><span class="hl opt">-&gt;{</span>name<span class="hl opt">} ||=</span> <span class="hl kwc">lc</span> first<span class="hl opt">(</span><span class="hl kwb">$u</span><span class="hl opt">-&gt;{</span>realname<span class="hl opt">} =~</span> <span class="hl kwd">/((\w|-)+)/</span><span class="hl opt">);</span>
	    <span class="hl opt">}</span>
	<span class="hl opt">},</span>
        complete <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
	    <span class="hl kwb">$u</span><span class="hl opt">-&gt;{</span>password<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl kwb">$u</span><span class="hl opt">-&gt;{</span>password2<span class="hl opt">}</span> <span class="hl kwc">or</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">, [</span> _<span class="hl opt">(</span><span class="hl str">&quot;The passwords do not match&quot;</span><span class="hl opt">),</span> _<span class="hl opt">(</span><span class="hl str">&quot;Please try again&quot;</span><span class="hl opt">) ]),</span> <span class="hl kwa">return</span> <span class="hl opt">(</span><span class="hl num">1</span><span class="hl opt">,</span><span class="hl num">3</span><span class="hl opt">);</span>
	    <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>security<span class="hl opt">} &gt;</span> <span class="hl num">3</span> <span class="hl opt">&amp;&amp;</span> <span class="hl kwc">length</span><span class="hl opt">(</span><span class="hl kwb">$u</span><span class="hl opt">-&gt;{</span>password<span class="hl opt">}) &lt;</span> <span class="hl num">6</span> <span class="hl kwc">and</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">&quot;This password is too simple&quot;</span><span class="hl opt">)),</span> <span class="hl kwa">return</span> <span class="hl opt">(</span><span class="hl num">1</span><span class="hl opt">,</span><span class="hl num">2</span><span class="hl opt">);</span>
	    <span class="hl kwb">$u</span><span class="hl opt">-&gt;{</span>name<span class="hl opt">}</span> <span class="hl kwc">or</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">&quot;Please give a user name&quot;</span><span class="hl opt">)),</span> <span class="hl kwa">return</span> <span class="hl opt">(</span><span class="hl num">1</span><span class="hl opt">,</span><span class="hl num">0</span><span class="hl opt">);</span>
	    <span class="hl kwb">$u</span><span class="hl opt">-&gt;{</span>name<span class="hl opt">} =~</span> <span class="hl kwd">/^[a-z0-9_-]+$/</span> <span class="hl kwc">or</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">&quot;The user name must contain only lower cased letters, numbers, `-&apos; and `_&apos;&quot;</span><span class="hl opt">)),</span> <span class="hl kwa">return</span> <span class="hl opt">(</span><span class="hl num">1</span><span class="hl opt">,</span><span class="hl num">0</span><span class="hl opt">);</span>
	    member<span class="hl opt">(</span><span class="hl kwb">$u</span><span class="hl opt">-&gt;{</span>name<span class="hl opt">},</span> <span class="hl kwc">map</span> <span class="hl opt">{</span> <span class="hl kwb">$_</span><span class="hl opt">-&gt;{</span>name<span class="hl opt">} } &#64;{</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>users<span class="hl opt">}})</span> <span class="hl kwc">and</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">&quot;This user name is already added&quot;</span><span class="hl opt">)),</span> <span class="hl kwa">return</span> <span class="hl opt">(</span><span class="hl num">1</span><span class="hl opt">,</span><span class="hl num">0</span><span class="hl opt">);</span>
	    <span class="hl kwa">return</span> <span class="hl num">0</span><span class="hl opt">;</span>
	<span class="hl opt">},</span>
    <span class="hl opt">)) {</span>
	<span class="hl kwc">push</span> <span class="hl opt">&#64;{</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>users<span class="hl opt">}},</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>user<span class="hl opt">};</span>
	<span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>user<span class="hl opt">} = {};</span>
	<span class="hl kwa">goto</span> <span class="hl opt">&amp;</span>addUser <span class="hl kwa">unless</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>security<span class="hl opt">} &lt;</span> <span class="hl num">2</span> <span class="hl opt">&amp;&amp; !</span><span class="hl kwb">$clicked</span><span class="hl opt">;</span> <span class="hl slc">#- INFO_TO_DEL: bad security level may cause deadlocks...</span>
    <span class="hl opt">}</span>
    install_steps<span class="hl opt">::</span>addUser<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">);</span>
<span class="hl opt">}</span>




<span class="hl slc">#------------------------------------------------------------------------------</span>
<span class="hl kwa">sub</span> createBootdisk <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, $first_time</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">&#64;l</span> <span class="hl opt">=</span> detect_devices<span class="hl opt">::</span>floppies<span class="hl opt">();</span>
    <span class="hl kwc">my</span> <span class="hl kwb">%l</span> <span class="hl opt">= (</span>
	     <span class="hl str">&apos;fd0&apos;</span>  <span class="hl opt">=&gt;</span> __<span class="hl opt">(</span><span class="hl str">&quot;First drive&quot;</span><span class="hl opt">),</span>
	     <span class="hl str">&apos;fd1&apos;</span>  <span class="hl opt">=&gt;</span> __<span class="hl opt">(</span><span class="hl str">&quot;Second drive&quot;</span><span class="hl opt">),</span>
	     <span class="hl str">&apos;Skip&apos;</span> <span class="hl opt">=&gt;</span> __<span class="hl opt">(</span><span class="hl str">&quot;Skip&quot;</span><span class="hl opt">),</span>
	    <span class="hl opt">);</span>

    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$first_time</span> <span class="hl opt">||</span> <span class="hl kwb">&#64;l</span> <span class="hl opt">==</span> <span class="hl num">1</span><span class="hl opt">) {</span>
	<span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_yesorno</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span>
			_<span class="hl opt">(</span><span class="hl str">&quot;A custom bootdisk provides a way of booting into your Linux system without</span>
<span class="hl str">depending on the normal bootloader. This is useful if you don&apos;t want to install</span>
<span class="hl str">LILO on your system, or another operating system removes LILO, or LILO doesn&apos;t</span>
<span class="hl str">work with your hardware configuration. A custom bootdisk can also be used with</span>
<span class="hl str">the Mandrake rescue image, making it much easier to recover from severe system</span>
<span class="hl str">failures. Would you like to create a bootdisk for your system?&quot;</span><span class="hl opt">),</span> 
			<span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>mkbootdisk<span class="hl opt">})</span> <span class="hl kwc">or</span> <span class="hl kwa">return</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>mkbootdisk<span class="hl opt">} =</span> <span class="hl str">&apos;&apos;</span><span class="hl opt">;</span>
	<span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>mkbootdisk<span class="hl opt">} =</span> <span class="hl kwb">$l</span><span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">]</span> <span class="hl kwa">if</span> <span class="hl opt">!</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>mkbootdisk<span class="hl opt">} ||</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>mkbootdisk<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;1&quot;</span><span class="hl opt">;</span>
    <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
	<span class="hl kwb">&#64;l</span> <span class="hl kwc">or die</span> _<span class="hl opt">(</span><span class="hl str">&quot;Sorry, no floppy drive available&quot;</span><span class="hl opt">);</span>

	<span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>mkbootdisk<span class="hl opt">} = ${{</span><span class="hl kwc">reverse</span> <span class="hl kwb">%l</span><span class="hl opt">}}{</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_list_</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span>
							      _<span class="hl opt">(</span><span class="hl str">&quot;Choose the floppy drive you want to use to make the bootdisk&quot;</span><span class="hl opt">),</span>
							      <span class="hl opt">[</span> <span class="hl kwb">&#64;l</span><span class="hl opt">{</span><span class="hl kwb">&#64;l,</span> <span class="hl str">&quot;Skip&quot;</span><span class="hl opt">} ],</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>mkbootdisk<span class="hl opt">})};</span>
	<span class="hl kwa">return</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>mkbootdisk<span class="hl opt">} =</span> <span class="hl str">&apos;&apos;</span> <span class="hl kwa">if</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>mkbootdisk<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&apos;Skip&apos;</span><span class="hl opt">;</span>
    <span class="hl opt">}</span>

    <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">&quot;Insert a floppy in drive</span> <span class="hl ipl">%s</span><span class="hl str">&quot;</span><span class="hl opt">,</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>mkbootdisk<span class="hl opt">}));</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$w</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">wait_message</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">&quot;Creating bootdisk&quot;</span><span class="hl opt">));</span>
    install_steps<span class="hl opt">::</span>createBootdisk<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">);</span>
<span class="hl opt">}</span>

<span class="hl slc">#------------------------------------------------------------------------------</span>
<span class="hl kwa">sub</span> setupBootloaderBefore <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$w</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">wait_message</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">&quot;Preparing bootloader&quot;</span><span class="hl opt">));</span>
    <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">SUPER</span><span class="hl opt">::</span>setupBootloaderBefore<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">);</span>
<span class="hl opt">}</span>

<span class="hl slc">#------------------------------------------------------------------------------</span>
<span class="hl kwa">sub</span> setupBootloader <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, $more</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$b</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>bootloader<span class="hl opt">};</span>

    <span class="hl kwb">$more++</span> <span class="hl kwa">if</span> <span class="hl kwb">$b</span><span class="hl opt">-&gt;{</span>bootUnsafe<span class="hl opt">};</span>

    <span class="hl kwa">if</span> <span class="hl opt">($::</span>beginner <span class="hl opt">&amp;&amp;</span> <span class="hl kwb">$more</span> <span class="hl opt">==</span> <span class="hl num">1</span><span class="hl opt">) {</span>
	<span class="hl kwc">my</span> <span class="hl kwb">&#64;l</span> <span class="hl opt">= (</span>__<span class="hl opt">(</span><span class="hl str">&quot;First sector of drive (MBR)&quot;</span><span class="hl opt">),</span> __<span class="hl opt">(</span><span class="hl str">&quot;First sector of boot partition&quot;</span><span class="hl opt">));</span>

	<span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">set_help</span><span class="hl opt">(</span><span class="hl str">&apos;setupBootloaderBeginner&apos;</span><span class="hl opt">);</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$boot</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>hds<span class="hl opt">}[</span><span class="hl num">0</span><span class="hl opt">]{</span>device<span class="hl opt">};</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$onmbr</span> <span class="hl opt">=</span> <span class="hl str">&quot;/dev/</span><span class="hl ipl">$boot</span><span class="hl str">&quot;</span> <span class="hl kwc">eq</span> <span class="hl kwb">$b</span><span class="hl opt">-&gt;{</span>boot<span class="hl opt">};</span>
	<span class="hl kwb">$b</span><span class="hl opt">-&gt;{</span>boot<span class="hl opt">} =</span> <span class="hl str">&quot;/dev/&quot;</span> <span class="hl opt">. (</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_list_</span><span class="hl opt">(</span>_<span class="hl opt">(</span><span class="hl str">&quot;LILO Installation&quot;</span><span class="hl opt">),</span>
					_<span class="hl opt">(</span><span class="hl str">&quot;Where do you want to install the bootloader?&quot;</span><span class="hl opt">),</span>
					\<span class="hl kwb">&#64;l, $l</span><span class="hl opt">[!</span><span class="hl kwb">$onmbr</span><span class="hl opt">])</span> <span class="hl kwc">eq</span> <span class="hl kwb">$l</span><span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">]</span> 
					  ? <span class="hl kwb">$boot</span> <span class="hl opt">:</span> fsedit<span class="hl opt">::</span>get_root<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>fstab<span class="hl opt">},</span> <span class="hl str">&apos;boot&apos;</span><span class="hl opt">)-&gt;{</span>device<span class="hl opt">});</span>
    <span class="hl opt">}</span> <span class="hl kwa">elsif</span> <span class="hl opt">(</span><span class="hl kwb">$more</span> <span class="hl opt">|| !$::</span>beginner<span class="hl opt">) {</span>
	<span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">set_help</span><span class="hl opt">(</span><span class="hl str">&quot;setupBootloaderGeneral&quot;</span><span class="hl opt">);</span>

	<span class="hl opt">$::</span>expert <span class="hl kwc">and</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_yesorno</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">&quot;Do you want to use LILO?&quot;</span><span class="hl opt">),</span> <span class="hl num">1</span><span class="hl opt">) ||</span> <span class="hl kwa">return</span><span class="hl opt">;</span>

	<span class="hl kwc">my</span> <span class="hl kwb">&#64;l</span> <span class="hl opt">= (</span>
_<span class="hl opt">(</span><span class="hl str">&quot;Boot device&quot;</span><span class="hl opt">) =&gt; {</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$b</span><span class="hl opt">-&gt;{</span>boot<span class="hl opt">},</span> list <span class="hl opt">=&gt; [</span> <span class="hl kwc">map</span> <span class="hl opt">{</span> <span class="hl str">&quot;/dev/</span><span class="hl ipl">$_</span><span class="hl str">&quot;</span> <span class="hl opt">} (</span><span class="hl kwc">map</span> <span class="hl opt">{</span> <span class="hl kwb">$_</span><span class="hl opt">-&gt;{</span>device<span class="hl opt">} } &#64;{</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>hds<span class="hl opt">}}, &#64;{</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>fstab<span class="hl opt">}}),</span> detect_devices<span class="hl opt">::</span>floppies <span class="hl opt">],</span> not_edit <span class="hl opt">=&gt; !$::</span>expert <span class="hl opt">},</span>
_<span class="hl opt">(</span><span class="hl str">&quot;Linear (needed for some SCSI drives)&quot;</span><span class="hl opt">) =&gt; {</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$b</span><span class="hl opt">-&gt;{</span>linear<span class="hl opt">},</span> type <span class="hl opt">=&gt;</span> <span class="hl str">&quot;bool&quot;</span><span class="hl opt">,</span> text <span class="hl opt">=&gt;</span> _<span class="hl opt">(</span><span class="hl str">&quot;linear&quot;</span><span class="hl opt">) },</span>
_<span class="hl opt">(</span><span class="hl str">&quot;Compact&quot;</span><span class="hl opt">) =&gt; {</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$b</span><span class="hl opt">-&gt;{</span>compact<span class="hl opt">},</span> type <span class="hl opt">=&gt;</span> <span class="hl str">&quot;bool&quot;</span><span class="hl opt">,</span> text <span class="hl opt">=&gt;</span> _<span class="hl opt">(</span><span class="hl str">&quot;compact&quot;</span><span class="hl opt">) },</span>
_<span class="hl opt">(</span><span class="hl str">&quot;Delay before booting default image&quot;</span><span class="hl opt">) =&gt;</span> \<span class="hl kwb">$b</span><span class="hl opt">-&gt;{</span>timeout<span class="hl opt">},</span>
_<span class="hl opt">(</span><span class="hl str">&quot;Video mode&quot;</span><span class="hl opt">) =&gt; {</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$b</span><span class="hl opt">-&gt;{</span>vga<span class="hl opt">},</span> list <span class="hl opt">=&gt; [</span> <span class="hl kwc">keys</span> <span class="hl kwb">%lilo</span><span class="hl opt">::</span>vga_modes <span class="hl opt">],</span> not_edit <span class="hl opt">=&gt; $::</span>beginner <span class="hl opt">},</span>
<span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>security<span class="hl opt">} &lt;</span> <span class="hl num">4</span> ? <span class="hl opt">() : (</span>
_<span class="hl opt">(</span><span class="hl str">&quot;Password&quot;</span><span class="hl opt">) =&gt; {</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$b</span><span class="hl opt">-&gt;{</span>password<span class="hl opt">},</span> hidden <span class="hl opt">=&gt;</span> <span class="hl num">1</span> <span class="hl opt">},</span>
_<span class="hl opt">(</span><span class="hl str">&quot;Password (again)&quot;</span><span class="hl opt">) =&gt; {</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$b</span><span class="hl opt">-&gt;{</span>password2<span class="hl opt">},</span> hidden <span class="hl opt">=&gt;</span> <span class="hl num">1</span> <span class="hl opt">},</span>
_<span class="hl opt">(</span><span class="hl str">&quot;Restrict command line options&quot;</span><span class="hl opt">) =&gt; {</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$b</span><span class="hl opt">-&gt;{</span>restricted<span class="hl opt">},</span> type <span class="hl opt">=&gt;</span> <span class="hl str">&quot;bool&quot;</span><span class="hl opt">,</span> text <span class="hl opt">=&gt;</span> _<span class="hl opt">(</span><span class="hl str">&quot;restrict&quot;</span><span class="hl opt">) },</span>
<span class="hl opt">)</span>
	<span class="hl opt">);</span>
	<span class="hl kwb">&#64;l</span> <span class="hl opt">=</span> <span class="hl kwb">&#64;l</span><span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">.</span><span class="hl num">.3</span><span class="hl opt">]</span> <span class="hl kwa">unless</span> <span class="hl opt">$::</span>expert<span class="hl opt">;</span>

	<span class="hl kwb">$b</span><span class="hl opt">-&gt;{</span>vga<span class="hl opt">} ||=</span> <span class="hl str">&apos;Normal&apos;</span><span class="hl opt">;</span>
	<span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_entries_refH</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">&quot;LILO main options&quot;</span><span class="hl opt">),</span> \<span class="hl kwb">&#64;l,</span>
				 complete <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
<span class="hl slc">#-				     $o-&gt;{security} &gt; 4 &amp;&amp; length($b-&gt;{password}) &lt; 6 and $o-&gt;ask_warn(&apos;&apos;, _(&quot;At this level of security, a password (and a good one) in lilo is requested&quot;)), return 1;</span>
				     <span class="hl kwb">$b</span><span class="hl opt">-&gt;{</span>restricted<span class="hl opt">} &amp;&amp; !</span><span class="hl kwb">$b</span><span class="hl opt">-&gt;{</span>password<span class="hl opt">}</span> <span class="hl kwc">and</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">&quot;Option ``Restrict command line options&apos;&apos; is of no use without a password&quot;</span><span class="hl opt">)),</span> <span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">;</span>
				     <span class="hl kwb">$b</span><span class="hl opt">-&gt;{</span>password<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl kwb">$b</span><span class="hl opt">-&gt;{</span>password2<span class="hl opt">}</span> <span class="hl kwc">or</span> <span class="hl opt">!</span><span class="hl kwb">$b</span><span class="hl opt">-&gt;{</span>restricted<span class="hl opt">}</span> <span class="hl kwc">or</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">, [</span> _<span class="hl opt">(</span><span class="hl str">&quot;The passwords do not match&quot;</span><span class="hl opt">),</span> _<span class="hl opt">(</span><span class="hl str">&quot;Please try again&quot;</span><span class="hl opt">) ]),</span> <span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">;</span>
				     <span class="hl num">0</span><span class="hl opt">;</span>
				 <span class="hl opt">}</span>
				<span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">return</span><span class="hl opt">;</span>
	<span class="hl kwb">$b</span><span class="hl opt">-&gt;{</span>vga<span class="hl opt">} =</span> <span class="hl kwb">$lilo</span><span class="hl opt">::</span>vga_modes<span class="hl opt">{</span><span class="hl kwb">$b</span><span class="hl opt">-&gt;{</span>vga<span class="hl opt">}} ||</span> <span class="hl kwb">$b</span><span class="hl opt">-&gt;{</span>vga<span class="hl opt">};</span>
    <span class="hl opt">}</span>

    <span class="hl kwa">until</span> <span class="hl opt">($::</span>beginner <span class="hl opt">&amp;&amp;</span> <span class="hl kwb">$more</span> <span class="hl opt">&lt;=</span> <span class="hl num">1</span><span class="hl opt">) {</span>
	<span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">set_help</span><span class="hl opt">(</span><span class="hl str">&apos;setupBootloaderAddEntry&apos;</span><span class="hl opt">);</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$c</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_list_</span><span class="hl opt">([</span><span class="hl str">&apos;&apos;</span><span class="hl opt">],</span> 
_<span class="hl opt">(</span><span class="hl str">&quot;Here are the following entries in LILO.</span>
<span class="hl str">You can add some more or change the existing ones.&quot;</span><span class="hl opt">),</span>
		<span class="hl opt">[ (</span><span class="hl kwc">sort</span> <span class="hl opt">&#64;{[</span>map_each <span class="hl opt">{</span> <span class="hl str">&quot;$::b-&gt;{label} ($::a)&quot;</span> <span class="hl opt">. (</span><span class="hl kwb">$b</span><span class="hl opt">-&gt;{</span><span class="hl kwa">default</span><span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl opt">$::</span>b-<span class="hl opt">&gt;{</span>label<span class="hl opt">} &amp;&amp;</span> <span class="hl str">&quot;  *&quot;</span><span class="hl opt">) } %{</span><span class="hl kwb">$b</span><span class="hl opt">-&gt;{</span>entries<span class="hl opt">}}]}),</span> __<span class="hl opt">(</span><span class="hl str">&quot;Add&quot;</span><span class="hl opt">),</span> __<span class="hl opt">(</span><span class="hl str">&quot;Done&quot;</span><span class="hl opt">) ],</span>
	<span class="hl opt">);</span>
	<span class="hl kwb">$c</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;Done&quot;</span> <span class="hl kwc">and</span> <span class="hl kwa">last</span><span class="hl opt">;</span>

	<span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$e, $name</span><span class="hl opt">);</span>

	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$c</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;Add&quot;</span><span class="hl opt">) {</span>
	    <span class="hl kwc">my</span> <span class="hl kwb">&#64;labels</span> <span class="hl opt">=</span> <span class="hl kwc">map</span> <span class="hl opt">{</span> <span class="hl kwb">$_</span><span class="hl opt">-&gt;{</span>label<span class="hl opt">} }</span> <span class="hl kwc">values</span> <span class="hl opt">%{</span><span class="hl kwb">$b</span><span class="hl opt">-&gt;{</span>entries<span class="hl opt">}};</span>
	    <span class="hl kwc">my</span> <span class="hl kwb">$prefix</span><span class="hl opt">;</span>
	    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_list_</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">&quot;Which type of entry do you want to add&quot;</span><span class="hl opt">), [</span> __<span class="hl opt">(</span><span class="hl str">&quot;Linux&quot;</span><span class="hl opt">),</span> __<span class="hl opt">(</span><span class="hl str">&quot;Other OS (windows...)&quot;</span><span class="hl opt">) ])</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;Linux&quot;</span><span class="hl opt">) {</span>
		<span class="hl kwb">$e</span> <span class="hl opt">= {</span> type <span class="hl opt">=&gt;</span> <span class="hl str">&apos;image&apos;</span> <span class="hl opt">};</span>
		<span class="hl kwb">$prefix</span> <span class="hl opt">=</span> <span class="hl str">&quot;linux&quot;</span><span class="hl opt">;</span>
	    <span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
		<span class="hl kwb">$e</span> <span class="hl opt">= {</span> type <span class="hl opt">=&gt;</span> <span class="hl str">&apos;other&apos;</span> <span class="hl opt">};</span>
		<span class="hl kwb">$prefix</span> <span class="hl opt">=</span> <span class="hl str">&quot;windows&quot;</span><span class="hl opt">;</span>
	    <span class="hl opt">}</span>
	    <span class="hl kwb">$e</span><span class="hl opt">-&gt;{</span>label<span class="hl opt">} =</span> <span class="hl kwb">$prefix</span><span class="hl opt">;</span>
	    <span class="hl kwa">for</span> <span class="hl opt">(</span><span class="hl kwc">my</span> <span class="hl kwb">$nb</span> <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span> member<span class="hl opt">(</span><span class="hl kwb">$e</span><span class="hl opt">-&gt;{</span>label<span class="hl opt">},</span> <span class="hl kwb">&#64;labels</span><span class="hl opt">);</span> <span class="hl kwb">$nb++</span><span class="hl opt">) {</span> <span class="hl kwb">$e</span><span class="hl opt">-&gt;{</span>label<span class="hl opt">} =</span> <span class="hl str">&quot;</span><span class="hl ipl">$prefix</span><span class="hl str">-</span><span class="hl ipl">$nb</span><span class="hl str">&quot;</span> <span class="hl opt">}</span>
	<span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
	    <span class="hl opt">(</span><span class="hl kwb">$name</span><span class="hl opt">) =</span> <span class="hl kwb">$c</span> <span class="hl opt">=~</span> <span class="hl kwd">/\((.*?)\)/</span><span class="hl opt">;</span>
	    <span class="hl kwb">$e</span> <span class="hl opt">=</span> <span class="hl kwb">$b</span><span class="hl opt">-&gt;{</span>entries<span class="hl opt">}{</span><span class="hl kwb">$name</span><span class="hl opt">};</span>
	<span class="hl opt">}</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$old_name</span> <span class="hl opt">=</span> <span class="hl kwb">$name</span><span class="hl opt">;</span>
	<span class="hl kwc">my</span> <span class="hl kwb">%old_e</span> <span class="hl opt">=</span> <span class="hl kwb">%$e</span><span class="hl opt">;</span>
	<span class="hl kwc">my</span> <span class="hl kwb">$default</span> <span class="hl opt">=</span> <span class="hl kwc">my</span> <span class="hl kwb">$old_default</span> <span class="hl opt">=</span> <span class="hl kwb">$e</span><span class="hl opt">-&gt;{</span>label<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl kwb">$b</span><span class="hl opt">-&gt;{</span><span class="hl kwa">default</span><span class="hl opt">};</span>
	    
	<span class="hl kwc">my</span> <span class="hl kwb">&#64;l</span><span class="hl opt">;</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$e</span><span class="hl opt">-&gt;{</span>type<span class="hl opt">}</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;image&quot;</span><span class="hl opt">) {</span> 
	    <span class="hl kwb">&#64;l</span> <span class="hl opt">= (</span>
_<span class="hl opt">(</span><span class="hl str">&quot;Image&quot;</span><span class="hl opt">) =&gt; {</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$name,</span> list <span class="hl opt">=&gt; [</span> <span class="hl kwc">eval</span> <span class="hl opt">{</span> glob_<span class="hl opt">(</span><span class="hl str">&quot;/boot/vmlinuz*&quot;</span><span class="hl opt">) } ] },</span>
_<span class="hl opt">(</span><span class="hl str">&quot;Root&quot;</span><span class="hl opt">) =&gt; {</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$e</span><span class="hl opt">-&gt;{</span>root<span class="hl opt">},</span> list <span class="hl opt">=&gt; [</span> <span class="hl kwc">map</span> <span class="hl opt">{</span> <span class="hl str">&quot;/dev/</span><span class="hl ipl">$_</span><span class="hl str">-&gt;{device}&quot;</span> <span class="hl opt">} &#64;{</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>fstab<span class="hl opt">}} ],</span> not_edit <span class="hl opt">=&gt; !$::</span>expert <span class="hl opt">},</span>
_<span class="hl opt">(</span><span class="hl str">&quot;Append&quot;</span><span class="hl opt">) =&gt;</span> \<span class="hl kwb">$e</span><span class="hl opt">-&gt;{</span>append<span class="hl opt">},</span>
_<span class="hl opt">(</span><span class="hl str">&quot;Initrd&quot;</span><span class="hl opt">) =&gt; {</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$e</span><span class="hl opt">-&gt;{</span>initrd<span class="hl opt">},</span> list <span class="hl opt">=&gt; [</span> <span class="hl kwc">eval</span> <span class="hl opt">{</span> glob_<span class="hl opt">(</span><span class="hl str">&quot;/boot/initrd*&quot;</span><span class="hl opt">) } ] },</span>
_<span class="hl opt">(</span><span class="hl str">&quot;Read-write&quot;</span><span class="hl opt">) =&gt; {</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$e</span><span class="hl opt">-&gt;{</span><span class="hl str">&apos;read-write&apos;</span><span class="hl opt">},</span> type <span class="hl opt">=&gt;</span> <span class="hl str">&apos;bool&apos;</span> <span class="hl opt">}</span>
	    <span class="hl opt">);</span>
	    <span class="hl kwb">&#64;l</span> <span class="hl opt">=</span> <span class="hl kwb">&#64;l</span><span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">.</span><span class="hl num">.5</span><span class="hl opt">]</span> <span class="hl kwa">unless</span> <span class="hl opt">$::</span>expert<span class="hl opt">;</span>
	<span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
	    <span class="hl kwb">&#64;l</span> <span class="hl opt">= (</span> 
_<span class="hl opt">(</span><span class="hl str">&quot;Root&quot;</span><span class="hl opt">) =&gt; {</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$name,</span> list <span class="hl opt">=&gt; [</span> <span class="hl kwc">map</span> <span class="hl opt">{</span> <span class="hl str">&quot;/dev/</span><span class="hl ipl">$_</span><span class="hl str">-&gt;{device}&quot;</span> <span class="hl opt">} &#64;{</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>fstab<span class="hl opt">}} ],</span> not_edit <span class="hl opt">=&gt; !$::</span>expert <span class="hl opt">},</span>
_<span class="hl opt">(</span><span class="hl str">&quot;Table&quot;</span><span class="hl opt">) =&gt; {</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$e</span><span class="hl opt">-&gt;{</span>table<span class="hl opt">},</span> list <span class="hl opt">=&gt; [</span> <span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> <span class="hl kwc">map</span> <span class="hl opt">{</span> <span class="hl str">&quot;/dev/</span><span class="hl ipl">$_</span><span class="hl str">-&gt;{device}&quot;</span> <span class="hl opt">} &#64;{</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>hds<span class="hl opt">}} ],</span> not_edit <span class="hl opt">=&gt; !$::</span>expert <span class="hl opt">},</span>
_<span class="hl opt">(</span><span class="hl str">&quot;Unsafe&quot;</span><span class="hl opt">) =&gt; {</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$e</span><span class="hl opt">-&gt;{</span>unsafe<span class="hl opt">},</span> type <span class="hl opt">=&gt;</span> <span class="hl str">&apos;bool&apos;</span> <span class="hl opt">}</span>
	    <span class="hl opt">);</span>
	    <span class="hl kwb">&#64;l</span> <span class="hl opt">=</span> <span class="hl kwb">&#64;l</span><span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">.</span><span class="hl num">.1</span><span class="hl opt">]</span> <span class="hl kwa">unless</span> <span class="hl opt">$::</span>expert<span class="hl opt">;</span>
	<span class="hl opt">}</span>
	<span class="hl kwb">&#64;l</span> <span class="hl opt">= (</span>
_<span class="hl opt">(</span><span class="hl str">&quot;Label&quot;</span><span class="hl opt">) =&gt;</span> \<span class="hl kwb">$e</span><span class="hl opt">-&gt;{</span>label<span class="hl opt">},</span>
<span class="hl kwb">&#64;l,</span>
_<span class="hl opt">(</span><span class="hl str">&quot;Default&quot;</span><span class="hl opt">) =&gt; {</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$default,</span> type <span class="hl opt">=&gt;</span> <span class="hl str">&apos;bool&apos;</span> <span class="hl opt">},</span>
	<span class="hl opt">);</span>

	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_entries_refH</span><span class="hl opt">(</span><span class="hl kwb">$c</span> <span class="hl kwc">eq</span> <span class="hl str">&quot;Add&quot;</span> ? <span class="hl str">&apos;&apos;</span> <span class="hl opt">: [</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">&quot;Ok&quot;</span><span class="hl opt">),</span> _<span class="hl opt">(</span><span class="hl str">&quot;Remove entry&quot;</span><span class="hl opt">)],</span> 
	    <span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> \<span class="hl kwb">&#64;l,</span>
	    complete <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
		<span class="hl kwb">$e</span><span class="hl opt">-&gt;{</span>label<span class="hl opt">}</span> <span class="hl kwc">or</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">&quot;Empty label not allowed&quot;</span><span class="hl opt">)),</span> <span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">;</span>
		member<span class="hl opt">(</span><span class="hl kwb">$e</span><span class="hl opt">-&gt;{</span>label<span class="hl opt">},</span> <span class="hl kwc">map</span> <span class="hl opt">{</span> <span class="hl kwb">$_</span><span class="hl opt">-&gt;{</span>label<span class="hl opt">} }</span> <span class="hl kwc">grep</span> <span class="hl opt">{</span> <span class="hl kwb">$_</span> <span class="hl opt">!=</span> <span class="hl kwb">$e</span> <span class="hl opt">}</span> <span class="hl kwc">values</span> <span class="hl opt">%{</span><span class="hl kwb">$b</span><span class="hl opt">-&gt;{</span>entries<span class="hl opt">}})</span> <span class="hl kwc">and</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">&quot;This label is already in use&quot;</span><span class="hl opt">)),</span> <span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">;</span>
			    <span class="hl kwb">$name</span> <span class="hl kwc">ne</span> <span class="hl kwb">$old_name</span> <span class="hl opt">&amp;&amp;</span> <span class="hl kwb">$b</span><span class="hl opt">-&gt;{</span>entries<span class="hl opt">}{</span><span class="hl kwb">$name</span><span class="hl opt">}</span> <span class="hl kwc">and</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">&quot;A entry</span> <span class="hl ipl">%s</span> <span class="hl str">already exists&quot;</span><span class="hl opt">,</span> <span class="hl kwb">$name</span><span class="hl opt">)),</span> <span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">;</span>
			   <span class="hl opt">}</span>
		<span class="hl opt">)) {</span>
	    <span class="hl kwb">$b</span><span class="hl opt">-&gt;{</span><span class="hl kwa">default</span><span class="hl opt">} =</span> <span class="hl kwb">$old_default</span> <span class="hl opt">||</span> <span class="hl kwb">$default</span> ? <span class="hl kwb">$default</span> <span class="hl opt">&amp;&amp;</span> <span class="hl kwb">$e</span><span class="hl opt">-&gt;{</span>label<span class="hl opt">} :</span> <span class="hl kwb">$b</span><span class="hl opt">-&gt;{</span><span class="hl kwa">default</span><span class="hl opt">};</span>
	    
	    <span class="hl kwc">delete</span> <span class="hl kwb">$b</span><span class="hl opt">-&gt;{</span>entries<span class="hl opt">}{</span><span class="hl kwb">$old_name</span><span class="hl opt">};</span>
	    <span class="hl kwb">$b</span><span class="hl opt">-&gt;{</span>entries<span class="hl opt">}{</span><span class="hl kwb">$name</span><span class="hl opt">} =</span> <span class="hl kwb">$e</span><span class="hl opt">;</span>
	<span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
	    <span class="hl kwc">delete</span> <span class="hl kwb">$b</span><span class="hl opt">-&gt;{</span>entries<span class="hl opt">}{</span><span class="hl kwb">$old_name</span><span class="hl opt">};</span>	    
	<span class="hl opt">}</span>
    <span class="hl opt">}</span>
    <span class="hl kwc">eval</span> <span class="hl opt">{</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">SUPER</span><span class="hl opt">::</span>setupBootloader <span class="hl opt">};</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$&#64;</span><span class="hl opt">) {</span>
	<span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> 
		     <span class="hl opt">[</span> _<span class="hl opt">(</span><span class="hl str">&quot;Installation of LILO failed. The following error occured:&quot;</span><span class="hl opt">),</span>
		       <span class="hl kwc">grep</span> <span class="hl opt">{ !</span><span class="hl kwd">/^Warning:/</span> <span class="hl opt">}</span> cat_<span class="hl opt">(</span><span class="hl str">&quot;</span><span class="hl ipl">$o</span><span class="hl str">-&gt;{prefix}/tmp/.error&quot;</span><span class="hl opt">) ]);</span>
	<span class="hl kwc">unlink</span> <span class="hl str">&quot;</span><span class="hl ipl">$o</span><span class="hl str">-&gt;{prefix}/tmp/.error&quot;</span><span class="hl opt">;</span>
	<span class="hl kwc">die</span> <span class="hl str">&quot;already displayed&quot;</span><span class="hl opt">;</span>
    <span class="hl opt">}</span>
<span class="hl opt">}</span>

<span class="hl slc">#------------------------------------------------------------------------------</span>
<span class="hl kwa">sub</span> miscellaneousNetwork <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, $clicked</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$u</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>miscellaneous<span class="hl opt">} ||= {};</span>

    <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">set_help</span><span class="hl opt">(</span><span class="hl str">&apos;configureNetworkProxy&apos;</span><span class="hl opt">);</span>
    <span class="hl opt">!$::</span>beginner <span class="hl opt">||</span> <span class="hl kwb">$clicked</span> <span class="hl kwc">and</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_entries_ref</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span>
       _<span class="hl opt">(</span><span class="hl str">&quot;Proxies configuration&quot;</span><span class="hl opt">),</span>
       <span class="hl opt">[</span> _<span class="hl opt">(</span><span class="hl str">&quot;HTTP proxy&quot;</span><span class="hl opt">),</span>
         _<span class="hl opt">(</span><span class="hl str">&quot;FTP proxy&quot;</span><span class="hl opt">),</span>
       <span class="hl opt">],</span>
       <span class="hl opt">[</span> \<span class="hl kwb">$u</span><span class="hl opt">-&gt;{</span>http_proxy<span class="hl opt">},</span>
         \<span class="hl kwb">$u</span><span class="hl opt">-&gt;{</span>ftp_proxy<span class="hl opt">},</span>
       <span class="hl opt">],</span>
       complete <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
	   <span class="hl kwb">$u</span><span class="hl opt">-&gt;{</span>http_proxy<span class="hl opt">} =~</span> m<span class="hl opt">,^($|</span>http<span class="hl opt">:</span><span class="hl kwd">//</span><span class="hl opt">),</span> <span class="hl kwc">or</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">&quot;Proxy should be http://...&quot;</span><span class="hl opt">)),</span> <span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">,</span><span class="hl num">3</span><span class="hl opt">;</span>
	   <span class="hl kwb">$u</span><span class="hl opt">-&gt;{</span>ftp_proxy<span class="hl opt">} =~</span> m<span class="hl opt">,^($|</span>ftp<span class="hl opt">:</span><span class="hl kwd">//</span><span class="hl opt">),</span> <span class="hl kwc">or</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">&quot;Proxy should be ftp://...&quot;</span><span class="hl opt">)),</span> <span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">,</span><span class="hl num">4</span><span class="hl opt">;</span>
	   <span class="hl num">0</span><span class="hl opt">;</span>
       <span class="hl opt">}</span>
    <span class="hl opt">) ||</span> <span class="hl kwa">return</span><span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl slc">#------------------------------------------------------------------------------</span>
<span class="hl kwa">sub</span> miscellaneous <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, $clicked</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">%l</span> <span class="hl opt">= (</span>
	<span class="hl num">0</span> <span class="hl opt">=&gt;</span> _<span class="hl opt">(</span><span class="hl str">&quot;Welcome To Crackers&quot;</span><span class="hl opt">),</span>
	<span class="hl num">1</span> <span class="hl opt">=&gt;</span> _<span class="hl opt">(</span><span class="hl str">&quot;Poor&quot;</span><span class="hl opt">),</span>
	<span class="hl num">2</span> <span class="hl opt">=&gt;</span> _<span class="hl opt">(</span><span class="hl str">&quot;Low&quot;</span><span class="hl opt">),</span>
	<span class="hl num">3</span> <span class="hl opt">=&gt;</span> _<span class="hl opt">(</span><span class="hl str">&quot;Medium&quot;</span><span class="hl opt">),</span>
	<span class="hl num">4</span> <span class="hl opt">=&gt;</span> _<span class="hl opt">(</span><span class="hl str">&quot;High&quot;</span><span class="hl opt">),</span>
	<span class="hl num">5</span> <span class="hl opt">=&gt;</span> _<span class="hl opt">(</span><span class="hl str">&quot;Paranoid&quot;</span><span class="hl opt">),</span>
    <span class="hl opt">);</span>
    <span class="hl kwc">delete</span> <span class="hl kwb">&#64;l</span><span class="hl opt">{</span><span class="hl num">0</span><span class="hl opt">,</span><span class="hl num">1</span><span class="hl opt">,</span><span class="hl num">5</span><span class="hl opt">}</span> <span class="hl kwa">unless</span> <span class="hl opt">$::</span>expert<span class="hl opt">;</span>

    install_steps<span class="hl opt">::</span>miscellaneous<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">);</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$u</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>miscellaneous<span class="hl opt">} ||= {};</span>
    <span class="hl kwc">exists</span> <span class="hl kwb">$u</span><span class="hl opt">-&gt;{</span>LAPTOP<span class="hl opt">}</span> <span class="hl kwc">or</span> <span class="hl kwb">$u</span><span class="hl opt">-&gt;{</span>LAPTOP<span class="hl opt">} =</span> <span class="hl num">1</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$s</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>security<span class="hl opt">};</span>

    add2hash_ <span class="hl kwb">$o,</span> <span class="hl opt">{</span> useSupermount <span class="hl opt">=&gt;</span> <span class="hl kwb">$s</span> <span class="hl opt">&lt;</span> <span class="hl num">4</span> <span class="hl opt">};</span>
    <span class="hl kwb">$s</span> <span class="hl opt">=</span> <span class="hl kwb">$l</span><span class="hl opt">{</span><span class="hl kwb">$s</span><span class="hl opt">} ||</span> <span class="hl kwb">$s</span><span class="hl opt">;</span>

    <span class="hl opt">!$::</span>beginner <span class="hl opt">||</span> <span class="hl kwb">$clicked</span> <span class="hl kwc">and</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_entries_refH</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span>
	_<span class="hl opt">(</span><span class="hl str">&quot;Miscellaneous questions&quot;</span><span class="hl opt">), [</span>
_<span class="hl opt">(</span><span class="hl str">&quot;Use hard drive optimisations?&quot;</span><span class="hl opt">) =&gt; {</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$u</span><span class="hl opt">-&gt;{</span>HDPARM<span class="hl opt">},</span> type <span class="hl opt">=&gt;</span> <span class="hl str">&apos;bool&apos;</span><span class="hl opt">,</span> text <span class="hl opt">=&gt;</span> _<span class="hl opt">(</span><span class="hl str">&quot;(may cause data corruption)&quot;</span><span class="hl opt">) },</span>
_<span class="hl opt">(</span><span class="hl str">&quot;Choose security level&quot;</span><span class="hl opt">) =&gt; {</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$s,</span> list <span class="hl opt">=&gt; [</span> <span class="hl kwc">map</span> <span class="hl opt">{</span> <span class="hl kwb">$l</span><span class="hl opt">{</span><span class="hl kwb">$_</span><span class="hl opt">} }</span> ikeys <span class="hl kwb">%l</span> <span class="hl opt">],</span> not_edit <span class="hl opt">=&gt;</span> <span class="hl num">1</span> <span class="hl opt">},</span>
_<span class="hl opt">(</span><span class="hl str">&quot;Precise RAM size if needed (found</span> <span class="hl ipl">%d</span> <span class="hl str">MB)&quot;</span><span class="hl opt">,</span> availableRam <span class="hl opt">/</span> <span class="hl num">1024</span> <span class="hl opt">+</span> <span class="hl num">3</span><span class="hl opt">) =&gt;</span> \<span class="hl kwb">$u</span><span class="hl opt">-&gt;{</span>memsize<span class="hl opt">},</span> <span class="hl slc">#- add three for correction.</span>
_<span class="hl opt">(</span><span class="hl str">&quot;Removable media automounting&quot;</span><span class="hl opt">) =&gt; {</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>useSupermount<span class="hl opt">},</span> type <span class="hl opt">=&gt;</span> <span class="hl str">&apos;bool&apos;</span><span class="hl opt">,</span> text <span class="hl opt">=&gt;</span> <span class="hl str">&apos;supermount&apos;</span> <span class="hl opt">},</span>
     <span class="hl kwb">$u</span><span class="hl opt">-&gt;{</span>numlock<span class="hl opt">}</span> ? <span class="hl opt">(</span>
_<span class="hl opt">(</span><span class="hl str">&quot;Enable num lock at startup&quot;</span><span class="hl opt">) =&gt; {</span> val <span class="hl opt">=&gt;</span> \<span class="hl kwb">$u</span><span class="hl opt">-&gt;{</span>numlock<span class="hl opt">},</span> type <span class="hl opt">=&gt;</span> <span class="hl str">&apos;bool&apos;</span> <span class="hl opt">},</span>
     <span class="hl opt">) : (),</span>
     <span class="hl opt">],</span> complete <span class="hl opt">=&gt;</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
	    <span class="hl opt">!</span><span class="hl kwb">$u</span><span class="hl opt">-&gt;{</span>memsize<span class="hl opt">} ||</span> <span class="hl kwb">$u</span><span class="hl opt">-&gt;{</span>memsize<span class="hl opt">} =~</span> <span class="hl kwd">s/^(\d+)M?$/$1M/i</span> <span class="hl kwc">or</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">&quot;Give the ram size in Mb&quot;</span><span class="hl opt">)),</span> <span class="hl kwa">return</span> <span class="hl num">1</span><span class="hl opt">;</span>
	    <span class="hl num">0</span><span class="hl opt">;</span>
	<span class="hl opt">}</span>
    <span class="hl opt">) ||</span> <span class="hl kwa">return</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">%m</span> <span class="hl opt">=</span> <span class="hl kwc">reverse</span> <span class="hl kwb">%l</span><span class="hl opt">;</span> <span class="hl kwb">$ENV</span><span class="hl opt">{</span>SECURE_LEVEL<span class="hl opt">} =</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>security<span class="hl opt">} =</span> <span class="hl kwb">$m</span><span class="hl opt">{</span><span class="hl kwb">$s</span><span class="hl opt">};</span>
<span class="hl opt">}</span>

<span class="hl slc">#------------------------------------------------------------------------------</span>
<span class="hl kwa">sub</span> setupXfree <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">setupXfreeBefore</span><span class="hl opt">;</span>

    <span class="hl kwa">require</span> Xconfig<span class="hl opt">;</span>
    <span class="hl kwa">require</span> Xconfigurator<span class="hl opt">;</span>
    <span class="hl slc">#- by default do not use existing configuration, so new card will be detected.</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>isUpgrade<span class="hl opt">} &amp;&amp; -</span>r <span class="hl str">&quot;</span><span class="hl ipl">$o</span><span class="hl str">-&gt;{prefix}/etc/X11/XF86Config&quot;</span><span class="hl opt">) {</span>
	<span class="hl kwa">if</span> <span class="hl opt">($::</span>beginner <span class="hl opt">||</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_yesorno</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">&quot;Use existing configuration for X11?&quot;</span><span class="hl opt">),</span> <span class="hl num">1</span><span class="hl opt">)) {</span>
	    Xconfig<span class="hl opt">::</span>getinfoFromXF86Config<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>X<span class="hl opt">},</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>prefix<span class="hl opt">});</span>
	<span class="hl opt">}</span>
    <span class="hl opt">}</span>
    <span class="hl slc">#- strange, xfs must not be started twice...</span>
    <span class="hl slc">#- trying to stop and restart it does nothing good too...</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$xfs_started</span> <span class="hl kwa">if</span> <span class="hl num">0</span><span class="hl opt">;</span>
    run_program<span class="hl opt">::</span>rooted<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>prefix<span class="hl opt">},</span> <span class="hl str">&quot;/etc/rc.d/init.d/xfs&quot;</span><span class="hl opt">,</span> <span class="hl str">&quot;start&quot;</span><span class="hl opt">)</span> <span class="hl kwa">unless</span> <span class="hl kwb">$xfs_started</span><span class="hl opt">;</span>
    <span class="hl kwb">$xfs_started</span> <span class="hl opt">=</span> <span class="hl num">1</span><span class="hl opt">;</span>

    <span class="hl opt">{</span> <span class="hl kwc">local</span> <span class="hl opt">$::</span>testing <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">;</span> <span class="hl slc">#- unset testing</span>
      <span class="hl kwc">local</span> <span class="hl opt">$::</span>auto <span class="hl opt">= $::</span>beginner<span class="hl opt">;</span>
      <span class="hl kwc">local</span> <span class="hl opt">$::</span>noauto <span class="hl opt">= $::</span>expert <span class="hl opt">&amp;&amp; !</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_yesorno</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">&quot;Try to find PCI devices?&quot;</span><span class="hl opt">),</span> <span class="hl num">1</span><span class="hl opt">);</span>
      <span class="hl opt">$::</span>noauto <span class="hl opt">= $::</span>noauto<span class="hl opt">;</span> <span class="hl slc">#- no warning</span>

      Xconfigurator<span class="hl opt">::</span>main<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>prefix<span class="hl opt">},</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>X<span class="hl opt">},</span> <span class="hl kwb">$o, $o</span><span class="hl opt">-&gt;{</span>allowFB<span class="hl opt">},</span> bool<span class="hl opt">(</span><span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>pcmcia<span class="hl opt">}),</span> <span class="hl kwa">sub</span> <span class="hl opt">{</span>
	  install_any<span class="hl opt">::</span>pkg_install<span class="hl opt">(</span><span class="hl kwb">$o,</span> <span class="hl str">&quot;XFree86-</span><span class="hl ipl">$_</span><span class="hl str">[0]&quot;</span><span class="hl opt">);</span>
      <span class="hl opt">});</span>
    <span class="hl opt">}</span>
    <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">setupXfreeAfter</span><span class="hl opt">;</span>
<span class="hl opt">}</span>

<span class="hl slc">#------------------------------------------------------------------------------</span>
<span class="hl kwa">sub</span> exitInstall <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, $alldone</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>

    <span class="hl kwa">return</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;{</span>step<span class="hl opt">} =</span> <span class="hl str">&apos;&apos;</span> <span class="hl kwa">unless</span> <span class="hl kwb">$alldone</span> <span class="hl opt">||</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_yesorno</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> 
_<span class="hl opt">(</span><span class="hl str">&quot;Some steps are not completed.</span>
<span class="hl str"></span>
<span class="hl str">Do you really want to quit now?&quot;</span><span class="hl opt">),</span> <span class="hl num">0</span><span class="hl opt">);</span>

    install_any<span class="hl opt">::</span>unlockCdrom<span class="hl opt">;</span>

    <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_warn</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span>
_<span class="hl opt">(</span><span class="hl str">&quot;Congratulations, installation is complete.</span>
<span class="hl str">Remove the boot media and press return to reboot.</span>
<span class="hl str"></span>
<span class="hl str">For information on fixes which are available for this release of Linux-Mandrake,</span>
<span class="hl str">consult the Errata available from http://www.linux-mandrake.com/.</span>
<span class="hl str"></span>
<span class="hl str">Information on configuring your system is available in the post</span>
<span class="hl str">install chapter of the Official Linux-Mandrake User&apos;s Guide.&quot;</span><span class="hl opt">))</span> <span class="hl kwa">if</span> <span class="hl kwb">$alldone</span> <span class="hl opt">&amp;&amp; !$::</span>g_auto_install<span class="hl opt">;</span>

    <span class="hl opt">$::</span>global_wait <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">wait_message</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span> _<span class="hl opt">(</span><span class="hl str">&quot;Shutting down&quot;</span><span class="hl opt">));</span>

    <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">SUPER</span><span class="hl opt">::</span>exitInstall<span class="hl opt">;</span>
<span class="hl opt">}</span>


<span class="hl slc">#-######################################################################################</span>
<span class="hl slc">#- Misc Steps Functions</span>
<span class="hl slc">#-######################################################################################</span>

<span class="hl slc">#--------------------------------------------------------------------------------</span>
<span class="hl kwa">sub</span> wait_load_module <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, $type, $text, $module</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">wait_message</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span>
		     <span class="hl opt">[</span> _<span class="hl opt">(</span><span class="hl str">&quot;Installing driver for</span> <span class="hl ipl">%s</span> <span class="hl str">card</span> <span class="hl ipl">%s</span><span class="hl str">&quot;</span><span class="hl opt">,</span> <span class="hl kwb">$type, $text</span><span class="hl opt">),</span>
		       <span class="hl opt">$::</span>beginner ? <span class="hl opt">() :</span> _<span class="hl opt">(</span><span class="hl str">&quot;(module</span> <span class="hl ipl">%s</span><span class="hl str">)&quot;</span><span class="hl opt">,</span> <span class="hl kwb">$module</span><span class="hl opt">)</span>
		     <span class="hl opt">]);</span>
<span class="hl opt">}</span>


<span class="hl kwa">sub</span> load_module <span class="hl opt">{</span>
    <span class="hl kwc">my</span> <span class="hl opt">(</span><span class="hl kwb">$o, $type</span><span class="hl opt">) =</span> <span class="hl kwb">&#64;_</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">&#64;options</span><span class="hl opt">;</span>

    <span class="hl kwc">my</span> <span class="hl kwb">$l</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_list</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span>
			      _<span class="hl opt">(</span><span class="hl str">&quot;Which</span> <span class="hl ipl">%s</span> <span class="hl str">driver should I try?&quot;</span><span class="hl opt">,</span> <span class="hl kwb">$type</span><span class="hl opt">),</span>
			      <span class="hl opt">[</span> modules<span class="hl opt">::</span>text_of_type<span class="hl opt">(</span><span class="hl kwb">$type</span><span class="hl opt">) ])</span> <span class="hl kwc">or</span> <span class="hl kwa">return</span><span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">$m</span> <span class="hl opt">=</span> modules<span class="hl opt">::</span>text2driver<span class="hl opt">(</span><span class="hl kwb">$l</span><span class="hl opt">);</span>

    <span class="hl kwa">require</span> modparm<span class="hl opt">;</span>
    <span class="hl kwc">my</span> <span class="hl kwb">&#64;names</span> <span class="hl opt">=</span> modparm<span class="hl opt">::</span>get_options_name<span class="hl opt">(</span><span class="hl kwb">$m</span><span class="hl opt">);</span>

    <span class="hl kwa">if</span> <span class="hl opt">((</span><span class="hl kwb">&#64;names</span> <span class="hl opt">!=</span> <span class="hl num">0</span><span class="hl opt">) &amp;&amp;</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_list_</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span>
_<span class="hl opt">(</span><span class="hl str">&quot;In some cases, the</span> <span class="hl ipl">%s</span> <span class="hl str">driver needs to have extra information to work</span>
<span class="hl str">properly, although it normally works fine without. Would you like to specify</span>
<span class="hl str">extra options for it or allow the driver to probe your machine for the</span>
<span class="hl str">information it needs? Occasionally, probing will hang a computer, but it should</span>
<span class="hl str">not cause any damage.&quot;</span><span class="hl opt">,</span> <span class="hl kwb">$l</span><span class="hl opt">),</span>
			      <span class="hl opt">[</span> __<span class="hl opt">(</span><span class="hl str">&quot;Autoprobe&quot;</span><span class="hl opt">),</span> __<span class="hl opt">(</span><span class="hl str">&quot;Specify options&quot;</span><span class="hl opt">) ],</span> <span class="hl str">&quot;Autoprobe&quot;</span><span class="hl opt">)</span> <span class="hl kwc">ne</span> <span class="hl str">&quot;Autoprobe&quot;</span><span class="hl opt">) {</span>
      ASK<span class="hl opt">:</span>
	<span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">&#64;names</span> <span class="hl opt">&gt;=</span> <span class="hl num">0</span><span class="hl opt">) {</span>
	    <span class="hl kwc">my</span> <span class="hl kwb">&#64;l</span> <span class="hl opt">=</span> <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_entries</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span>
_<span class="hl opt">(</span><span class="hl str">&quot;You may now provide its options to module</span> <span class="hl ipl">%s</span><span class="hl str">.&quot;</span><span class="hl opt">,</span> <span class="hl kwb">$l</span><span class="hl opt">),</span>
					 \<span class="hl kwb">&#64;names</span><span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">return</span><span class="hl opt">;</span>
	    <span class="hl kwb">&#64;options</span> <span class="hl opt">=</span> modparm<span class="hl opt">::</span>get_options_result<span class="hl opt">(</span><span class="hl kwb">$m, &#64;l</span><span class="hl opt">);</span>
	<span class="hl opt">}</span> <span class="hl kwa">else</span> <span class="hl opt">{</span>
	    <span class="hl kwb">&#64;options</span> <span class="hl opt">=</span> <span class="hl kwc">split</span> <span class="hl str">&apos; &apos;</span><span class="hl opt">,</span>
	      <span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_from_entry</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span>
_<span class="hl opt">(</span><span class="hl str">&quot;You may now provide its options to module</span> <span class="hl ipl">%s</span><span class="hl str">.</span>
<span class="hl str">Options are in format ``name=value name2=value2 ...&apos;&apos;.</span>
<span class="hl str">For instance, ``io=0x300 irq=7&apos;&apos;&quot;</span><span class="hl opt">,</span> <span class="hl kwb">$l</span><span class="hl opt">),</span>
				 _<span class="hl opt">(</span><span class="hl str">&quot;Module options:&quot;</span><span class="hl opt">),</span>
				<span class="hl opt">);</span>
	<span class="hl opt">}</span>
    <span class="hl opt">}</span>
    <span class="hl kwc">eval</span> <span class="hl opt">{</span> 
	<span class="hl kwc">my</span> <span class="hl kwb">$w</span> <span class="hl opt">=</span> wait_load_module<span class="hl opt">(</span><span class="hl kwb">$o, $type, $l, $m</span><span class="hl opt">);</span>
	modules<span class="hl opt">::</span>load<span class="hl opt">(</span><span class="hl kwb">$m, $type, &#64;options</span><span class="hl opt">);</span>
    <span class="hl opt">};</span>
    <span class="hl kwa">if</span> <span class="hl opt">(</span><span class="hl kwb">$&#64;</span><span class="hl opt">) {</span>
	<span class="hl kwb">$o</span><span class="hl opt">-&gt;</span><span class="hl kwd">ask_yesorno</span><span class="hl opt">(</span><span class="hl str">&apos;&apos;</span><span class="hl opt">,</span>
_<span class="hl opt">(</span><span class="hl str">&quot;Loading module</span> <span class="hl ipl">%s</span> <span class="hl str">failed.</span>
<span class="hl str">Do you want to try again with other parameters?&quot;</span><span class="hl opt">,</span> <span class="hl kwb">$l</span><span class="hl opt">),</span> <span class="hl num">1</span><span class="hl opt">)</span> <span class="hl kwc">or</span> <span class="hl kwa">return</span><span class="hl opt">;</span>
	<span class="hl kwa">goto</span> ASK<span class="hl opt">;</span>
    <span class="hl opt">}</span>
    <span class="hl kwb">$l, $m</span><span class="hl opt">;</span>
<span class="hl opt">}</span>