2020-11-16 17:58:14 +01:00
-- Ks signals
-- Can display main aspects (no Zs) + Sht
-- Note that the group value of advtrains_signal is 2, which means "step 2 of signal capabilities"
-- advtrains_signal=1 is meant for signals that do not implement set_aspect.
2021-11-16 11:03:22 +01:00
local function asp_to_zs3type ( asp )
local n = tonumber ( asp )
if not n or n < 4 then return " off " end
if n < 8 then return 2 * math.floor ( n / 2 ) end
return math.min ( 16 , 4 * math.floor ( n / 4 ) )
end
local function setzs3 ( msp , lim , rot )
local pos = { x = msp.x , y = msp.y + 1 , z = msp.z }
local node = advtrains.ndb . get_node ( pos )
local asp = asp_to_zs3type ( lim )
if node.name : find ( " ^advtrains_signals_ks:zs3_ " ) then
advtrains.ndb . swap_node ( pos , { name = " advtrains_signals_ks:zs3_ " .. asp .. " _ " .. rot , param2 = node.param2 } )
end
end
local function getzs3 ( msp )
local pos = { x = msp.x , y = msp.y + 1 , z = msp.z }
local nodename = advtrains.ndb . get_node ( pos ) . name
local speed = nodename : match ( " ^advtrains_signals_ks:zs3_(%w+)_%d+$ " )
if not speed then return nil end
speed = tonumber ( speed )
if not speed then return false end
return speed
end
local function setzs3v ( msp , lim , rot )
local pos = { x = msp.x , y = msp.y - 1 , z = msp.z }
local node = advtrains.ndb . get_node ( pos )
local asp = asp_to_zs3type ( lim )
if node.name : find ( " ^advtrains_signals_ks:zs3v_ " ) then
advtrains.ndb . swap_node ( pos , { name = " advtrains_signals_ks:zs3v_ " .. asp .. " _ " .. rot , param2 = node.param2 } )
end
end
local function getzs3v ( msp )
local pos = { x = msp.x , y = msp.y - 1 , z = msp.z }
local nodename = advtrains.ndb . get_node ( pos ) . name
local speed = nodename : match ( " ^advtrains_signals_ks:zs3v_(%w+)_%d+$ " )
if not speed then return nil end
speed = tonumber ( speed )
if not speed then return false end
return speed
end
2020-11-16 17:58:14 +01:00
local setaspectf = function ( rot )
return function ( pos , node , asp )
2021-11-16 11:03:22 +01:00
setzs3 ( pos , asp.main , rot )
2021-02-19 14:15:18 +01:00
if asp.main == 0 then
if asp.shunt then
2020-11-16 17:58:14 +01:00
advtrains.ndb . swap_node ( pos , { name = " advtrains_signals_ks:hs_shunt_ " .. rot , param2 = node.param2 } )
else
advtrains.ndb . swap_node ( pos , { name = " advtrains_signals_ks:hs_danger_ " .. rot , param2 = node.param2 } )
end
2021-11-16 11:03:22 +01:00
setzs3v ( pos , nil , rot )
2020-11-16 17:58:14 +01:00
else
2021-11-16 11:03:22 +01:00
if not asp.dst or asp.dst == - 1 then
2020-11-16 17:58:14 +01:00
advtrains.ndb . swap_node ( pos , { name = " advtrains_signals_ks:hs_free_ " .. rot , param2 = node.param2 } )
2021-11-16 11:03:22 +01:00
elseif asp.dst == 0 then
2020-11-16 17:58:14 +01:00
advtrains.ndb . swap_node ( pos , { name = " advtrains_signals_ks:hs_slow_ " .. rot , param2 = node.param2 } )
2021-11-16 11:03:22 +01:00
else
advtrains.ndb . swap_node ( pos , { name = " advtrains_signals_ks:hs_nextslow_ " .. rot , param2 = node.param2 } )
2020-11-16 17:58:14 +01:00
end
2021-11-16 11:03:22 +01:00
setzs3v ( pos , asp.dst , rot )
2020-11-16 17:58:14 +01:00
end
end
end
2021-02-19 14:15:18 +01:00
2020-11-16 17:58:14 +01:00
local suppasp = {
2021-11-16 11:03:22 +01:00
main = { 0 , 4 , 6 , 8 , 12 , 16 , - 1 } ,
dst = { 0 , 4 , 6 , 8 , 12 , 16 , - 1 , false } ,
2021-02-19 14:15:18 +01:00
shunt = nil ,
proceed_as_main = true ,
2020-11-16 17:58:14 +01:00
info = {
call_on = false ,
dead_end = false ,
w_speed = nil ,
}
}
--Rangiersignal
local setaspectf_ra = function ( rot )
return function ( pos , node , asp )
2021-02-19 14:15:18 +01:00
if asp.shunt then
2020-11-16 17:58:14 +01:00
advtrains.ndb . swap_node ( pos , { name = " advtrains_signals_ks:ra_shuntd_ " .. rot , param2 = node.param2 } )
else
advtrains.ndb . swap_node ( pos , { name = " advtrains_signals_ks:ra_danger_ " .. rot , param2 = node.param2 } )
end
local meta = minetest.get_meta ( pos )
if meta then
meta : set_string ( " infotext " , minetest.serialize ( asp ) )
end
end
end
local suppasp_ra = {
2021-02-19 14:15:18 +01:00
main = { false } ,
dst = { false } ,
shunt = nil ,
proceed_as_main = false ,
2020-11-16 17:58:14 +01:00
info = {
call_on = false ,
dead_end = false ,
w_speed = nil ,
}
}
advtrains.trackplacer . register_tracktype ( " advtrains_signals_ks:hs " )
advtrains.trackplacer . register_tracktype ( " advtrains_signals_ks:ra " )
advtrains.trackplacer . register_tracktype ( " advtrains_signals_ks:sign " )
2021-11-16 11:03:22 +01:00
advtrains.trackplacer . register_tracktype ( " advtrains_signals_ks:sign_lf " )
advtrains.trackplacer . register_tracktype ( " advtrains_signals_ks:sign_lf7 " )
advtrains.trackplacer . register_tracktype ( " advtrains_signals_ks:zs3 " )
advtrains.trackplacer . register_tracktype ( " advtrains_signals_ks:zs3v " )
2020-11-16 17:58:14 +01:00
advtrains.trackplacer . register_tracktype ( " advtrains_signals_ks:mast " )
for _ , rtab in ipairs ( {
{ rot = " 0 " , sbox = { - 1 / 8 , - 1 / 2 , - 1 / 2 , 1 / 8 , 1 / 2 , - 1 / 4 } , ici = true } ,
{ rot = " 30 " , sbox = { - 3 / 8 , - 1 / 2 , - 1 / 2 , - 1 / 8 , 1 / 2 , - 1 / 4 } , } ,
{ rot = " 45 " , sbox = { - 1 / 2 , - 1 / 2 , - 1 / 2 , - 1 / 4 , 1 / 2 , - 1 / 4 } , } ,
{ rot = " 60 " , sbox = { - 1 / 2 , - 1 / 2 , - 3 / 8 , - 1 / 4 , 1 / 2 , - 1 / 8 } , } ,
} ) do
local rot = rtab.rot
for typ , prts in pairs ( {
2021-11-16 11:03:22 +01:00
danger = { asp = advtrains.interlocking . DANGER , n = " slow " , ici = true } ,
slow = {
asp = function ( pos )
return { main = getzs3 ( pos ) or - 1 , proceed_as_main = true , dst = 0 }
end ,
n = " nextslow "
} ,
nextslow = {
asp = function ( pos )
return { main = getzs3 ( pos ) or - 1 , proceed_as_main = true , dst = getzs3v ( pos ) or 6 }
end ,
n = " free "
} ,
free = {
asp = function ( pos )
return { main = getzs3 ( pos ) or - 1 , proceed_as_main = true , dst = - 1 }
end ,
n = " shunt "
} ,
shunt = { asp = { main = 0 , shunt = true } , n = " danger " } ,
2020-11-16 17:58:14 +01:00
} ) do
2021-11-16 11:03:22 +01:00
local tile = " advtrains_signals_ks_ltm_ " .. typ .. " .png "
local afunc = prts.asp
if type ( afunc ) == " table " then
afunc = function ( ) return prts.asp end
end
if typ == " nextslow " then
tile = {
name = tile ,
animation = {
type = " vertical_frames " ,
aspect_w = 32 ,
aspect_h = 32 ,
length = 1 ,
}
}
end
2020-11-16 17:58:14 +01:00
minetest.register_node ( " advtrains_signals_ks:hs_ " .. typ .. " _ " .. rot , {
description = " Ks Main Signal " ,
drawtype = " mesh " ,
mesh = " advtrains_signals_ks_main_smr " .. rot .. " .obj " ,
2021-11-16 11:03:22 +01:00
tiles = { " advtrains_signals_ks_mast.png " , " advtrains_signals_ks_head.png " , " advtrains_signals_ks_head.png " , tile } ,
2020-11-16 17:58:14 +01:00
paramtype = " light " ,
sunlight_propagates = true ,
light_source = 4 ,
paramtype2 = " facedir " ,
selection_box = {
type = " fixed " ,
fixed = { rtab.sbox , { - 1 / 4 , - 1 / 2 , - 1 / 4 , 1 / 4 , - 7 / 16 , 1 / 4 } }
} ,
groups = {
cracky = 2 ,
advtrains_signal = 2 ,
not_blocking_trains = 1 ,
save_in_at_nodedb = 1 ,
not_in_creative_inventory = ( rtab.ici and prts.ici ) and 0 or 1 ,
} ,
drop = " advtrains_signals_ks:hs_danger_0 " ,
inventory_image = " advtrains_signals_ks_hs_inv.png " ,
advtrains = {
set_aspect = setaspectf ( rot ) ,
supported_aspects = suppasp ,
2021-11-16 11:03:22 +01:00
get_aspect = afunc ,
2020-11-16 17:58:14 +01:00
} ,
on_rightclick = advtrains.interlocking . signal_rc_handler ,
can_dig = advtrains.interlocking . signal_can_dig ,
2021-03-17 20:30:38 +01:00
after_dig_node = advtrains.interlocking . signal_after_dig ,
2020-11-16 17:58:14 +01:00
} )
-- rotatable by trackworker
2021-11-16 11:03:22 +01:00
advtrains.trackplacer . add_worked ( " advtrains_signals_ks:hs " , typ , " _ " .. rot )
2020-11-16 17:58:14 +01:00
end
--Rangiersignale:
for typ , prts in pairs ( {
2021-02-19 14:15:18 +01:00
danger = { asp = { main = false , shunt = false } , n = " shuntd " , ici = true } ,
shuntd = { asp = { main = false , shunt = true } , n = " danger " } ,
2020-11-16 17:58:14 +01:00
} ) do
minetest.register_node ( " advtrains_signals_ks:ra_ " .. typ .. " _ " .. rot , {
description = " Ks Shunting Signal " ,
drawtype = " mesh " ,
mesh = " advtrains_signals_ks_sht_smr " .. rot .. " .obj " ,
tiles = { " advtrains_signals_ks_mast.png " , " advtrains_signals_ks_head.png " , " advtrains_signals_ks_head.png " , " advtrains_signals_ks_ltm_ " .. typ .. " .png " } ,
paramtype = " light " ,
sunlight_propagates = true ,
light_source = 4 ,
paramtype2 = " facedir " ,
selection_box = {
type = " fixed " ,
fixed = { - 1 / 4 , - 1 / 2 , - 1 / 4 , 1 / 4 , 0 , 1 / 4 }
} ,
groups = {
cracky = 2 ,
advtrains_signal = 2 ,
not_blocking_trains = 1 ,
save_in_at_nodedb = 1 ,
not_in_creative_inventory = ( rtab.ici and prts.ici ) and 0 or 1 ,
} ,
drop = " advtrains_signals_ks:ra_danger_0 " ,
inventory_image = " advtrains_signals_ks_ra_inv.png " ,
advtrains = {
set_aspect = setaspectf_ra ( rot ) ,
supported_aspects = suppasp_ra ,
get_aspect = function ( pos , node )
return prts.asp
end ,
} ,
on_rightclick = advtrains.interlocking . signal_rc_handler ,
can_dig = advtrains.interlocking . signal_can_dig ,
2021-03-17 20:30:38 +01:00
after_dig_node = advtrains.interlocking . signal_after_dig ,
2020-11-16 17:58:14 +01:00
} )
-- rotatable by trackworker
2021-11-16 11:03:22 +01:00
advtrains.trackplacer . add_worked ( " advtrains_signals_ks:ra " , typ , " _ " .. rot )
2020-11-16 17:58:14 +01:00
end
2021-11-16 11:03:22 +01:00
-- Schilder:
local function register_sign ( prefix , typ , nxt , description , mesh , tile2 , dtyp , inv , asp )
minetest.register_node ( " advtrains_signals_ks: " .. prefix .. " _ " .. typ .. " _ " .. rot , {
description = description ,
2020-11-16 17:58:14 +01:00
drawtype = " mesh " ,
2021-11-16 11:03:22 +01:00
mesh = " advtrains_signals_ks_ " .. mesh .. " _smr " .. rot .. " .obj " ,
tiles = { " advtrains_signals_ks_signpost.png " , tile2 } ,
2020-11-16 17:58:14 +01:00
paramtype = " light " ,
sunlight_propagates = true ,
light_source = 4 ,
paramtype2 = " facedir " ,
selection_box = {
type = " fixed " ,
fixed = { rtab.sbox , { - 1 / 4 , - 1 / 2 , - 1 / 4 , 1 / 4 , - 7 / 16 , 1 / 4 } }
} ,
groups = {
cracky = 2 ,
advtrains_signal = 2 ,
not_blocking_trains = 1 ,
save_in_at_nodedb = 1 ,
2021-11-16 11:03:22 +01:00
not_in_creative_inventory = ( rtab.ici and typ == dtyp ) and 0 or 1 ,
2020-11-16 17:58:14 +01:00
} ,
2021-11-16 11:03:22 +01:00
drop = " advtrains_signals_ks: " .. prefix .. " _ " .. dtyp .. " _0 " ,
inventory_image = inv ,
2020-11-16 17:58:14 +01:00
advtrains = {
2021-11-16 11:03:22 +01:00
get_aspect = function ( ) return asp end
2020-11-16 17:58:14 +01:00
} ,
on_rightclick = advtrains.interlocking . signal_rc_handler ,
can_dig = advtrains.interlocking . signal_can_dig ,
2021-03-17 20:30:38 +01:00
after_dig_node = advtrains.interlocking . signal_after_dig ,
2020-11-16 17:58:14 +01:00
} )
-- rotatable by trackworker
2021-11-16 11:03:22 +01:00
advtrains.trackplacer . add_worked ( " advtrains_signals_ks: " .. prefix , typ , " _ " .. rot , nxt )
end
for typ , prts in pairs {
[ " hfs " ] = { asp = { main = false , shunt = false } , n = " pam " , mesh = " _hfs " } ,
[ " pam " ] = { asp = { main = - 1 , shunt = false , proceed_as_main = true } , n = " hfs " }
} do
local mesh = prts.mesh or " "
local tile2 = " advtrains_signals_ks_sign_lf7.png^(advtrains_signals_ks_sign_ " .. typ .. " .png^[makealpha:255,255,255) "
if typ == " hfs " then
tile2 = " advtrains_signals_ks_sign_hfs.png "
end
register_sign ( " sign " , typ , prts.n , " Signal Sign " , " sign " .. mesh , tile2 , " hfs " , " advtrains_signals_ks_sign_lf7.png " , prts.asp )
end
for typ , prts in pairs {
-- Speed restrictions:
[ " 4 " ] = { asp = { main = 4 , shunt = true } , n = " 6 " } ,
[ " 6 " ] = { asp = { main = 6 , shunt = true } , n = " 8 " } ,
[ " 8 " ] = { asp = { main = 8 , shunt = true } , n = " 12 " } ,
[ " 12 " ] = { asp = { main = 12 , shunt = true } , n = " 16 " } ,
[ " 16 " ] = { asp = { main = 16 , shunt = true } , n = " e " } ,
-- Speed restriction lifted
[ " e " ] = { asp = { main = - 1 , shunt = true } , n = " 4 " , mesh = " _zs10 " } ,
} do
local mesh = tonumber ( typ ) and " _zs3 " or prts.mesh or " "
local tile2 = " [combine:40x40:0,0= \\ (advtrains_signals_ks_sign_off.png \\ ^[resize \\ :40x40 \\ ):3,-2=advtrains_signals_ks_sign_ " .. typ .. " .png^[invert:rgb "
if typ == " e " then
tile2 = " advtrains_signals_ks_sign_zs10.png "
end
register_sign ( " sign " , typ , prts.n , " Permanent local speed restriction sign " , " sign " .. mesh , tile2 , " 8 " , " advtrains_signals_ks_sign_8.png^[invert:rgb " , prts.asp )
end
for typ , prts in pairs {
[ " 4 " ] = { main = 4 , n = " 6 " } ,
[ " 6 " ] = { main = 6 , n = " 8 " } ,
[ " 8 " ] = { main = 8 , n = " 12 " } ,
[ " 12 " ] = { main = 12 , n = " 16 " } ,
[ " 16 " ] = { main = 16 , n = " e " } ,
[ " e " ] = { main = - 1 , n = " 4 " } ,
} do
local tile2 = " advtrains_signals_ks_sign_lf7.png^(advtrains_signals_ks_sign_ " .. typ .. " .png^[makealpha:255,255,255) " .. ( typ == " e " and " " or " ^[multiply:orange " )
local inv = " advtrains_signals_ks_sign_lf7.png^(advtrains_signals_ks_sign_8.png^[makealpha:255,255,255)^[multiply:orange "
register_sign ( " sign_lf " , typ , prts.n , " Temporary local speed restriction sign " , " sign " , tile2 , " 8 " , inv , { main = prts.main , shunt = true , type = " temp " } )
end
for typ , prts in pairs {
[ " 4 " ] = { main = 4 , n = " 6 " } ,
[ " 6 " ] = { main = 6 , n = " 8 " } ,
[ " 8 " ] = { main = 8 , n = " 12 " } ,
[ " 12 " ] = { main = 12 , n = " 16 " } ,
[ " 16 " ] = { main = 16 , n = " 20 " } ,
[ " 20 " ] = { main = 20 , n = " 4 " } ,
} do
local tile2 = " advtrains_signals_ks_sign_lf7.png^(advtrains_signals_ks_sign_ " .. typ .. " .png^[makealpha:255,255,255) "
local inv = " advtrains_signals_ks_sign_lf7.png^(advtrains_signals_ks_sign_8.png^[makealpha:255,255,255) "
register_sign ( " sign_lf7 " , typ , prts.n , " Line speed restriction sign " , " sign " , tile2 , " 8 " , inv , { main = prts.main , shunt = true , type = " line " } )
end
-- Geschwindigkeits(vor)anzeiger für Ks-Signale
for typ , prts in pairs ( {
[ " off " ] = { n = " 4 " , ici = true } ,
[ " 4 " ] = { n = " 6 " } ,
[ " 6 " ] = { n = " 8 " } ,
[ " 8 " ] = { n = " 12 " } ,
[ " 12 " ] = { n = " 16 " } ,
[ " 16 " ] = { n = " off " } ,
} ) do
local def = {
drawtype = " mesh " ,
tiles = { " advtrains_signals_ks_mast.png " , " advtrains_signals_ks_head.png " , " advtrains_signals_ks_sign_ " .. typ .. " .png^[invert:rgb^[noalpha " } ,
paramtype = " light " ,
sunlight_propagates = true ,
light_source = 4 ,
paramtype2 = " facedir " ,
selection_box = {
type = " fixed " ,
fixed = { rtab.sbox , { - 1 / 4 , - 1 / 2 , - 1 / 4 , 1 / 4 , - 7 / 16 , 1 / 4 } }
} ,
groups = {
cracky = 2 ,
not_blocking_trains = 1 ,
save_in_at_nodedb = 1 ,
not_in_creative_inventory = ( rtab.ici and prts.ici ) and 0 or 1 ,
} ,
after_dig_node = function ( pos ) advtrains.ndb . update ( pos ) end
}
-- Zs 3
local t = table.copy ( def )
t.description = " Ks speed limit indicator "
t.mesh = " advtrains_signals_ks_zs_top_smr " .. rot .. " .obj "
t.drop = " advtrains_signals_ks:zs3_off_0 "
t.selection_box . fixed [ 1 ] [ 5 ] = 0
minetest.register_node ( " advtrains_signals_ks:zs3_ " .. typ .. " _ " .. rot , t )
advtrains.trackplacer . add_worked ( " advtrains_signals_ks:zs3 " , typ , " _ " .. rot )
-- Zs 3v
local t = table.copy ( def )
t.description = " Ks distant speed limit indicator "
t.mesh = " advtrains_signals_ks_zs_bottom_smr " .. rot .. " .obj "
t.drop = " advtrains_signals_ks:zs3v_off_0 "
t.tiles [ 3 ] = t.tiles [ 3 ] .. " ^[multiply:yellow "
minetest.register_node ( " advtrains_signals_ks:zs3v_ " .. typ .. " _ " .. rot , t )
advtrains.trackplacer . add_worked ( " advtrains_signals_ks:zs3v " , typ , " _ " .. rot )
2020-11-16 17:58:14 +01:00
end
minetest.register_node ( " advtrains_signals_ks:mast_mast_ " .. rot , {
description = " Ks Mast " ,
drawtype = " mesh " ,
mesh = " advtrains_signals_ks_mast_smr " .. rot .. " .obj " ,
tiles = { " advtrains_signals_ks_mast.png " } ,
paramtype = " light " ,
sunlight_propagates = true ,
--light_source = 4,
paramtype2 = " facedir " ,
selection_box = {
type = " fixed " ,
fixed = { rtab.sbox , { - 1 / 4 , - 1 / 2 , - 1 / 4 , 1 / 4 , - 7 / 16 , 1 / 4 } }
} ,
groups = {
cracky = 2 ,
not_blocking_trains = 1 ,
not_in_creative_inventory = ( rtab.ici ) and 0 or 1 ,
} ,
drop = " advtrains_signals_ks:mast_mast_0 " ,
} )
advtrains.trackplacer . add_worked ( " advtrains_signals_ks:mast " , " mast " , " _ " .. rot )
end
2021-02-25 20:49:03 +01:00
-- Crafting
minetest.register_craft ( {
output = " advtrains_signals_ks:hs_danger_0 2 " ,
recipe = {
{ ' default:steel_ingot ' , ' dye:red ' , ' default:steel_ingot ' } ,
{ ' dye:yellow ' , ' default:steel_ingot ' , ' dye:dark_green ' } ,
{ ' default:steel_ingot ' , ' advtrains_signals_ks:mast_mast_0 ' , ' default:steel_ingot ' } ,
} ,
} )
minetest.register_craft ( {
output = " advtrains_signals_ks:mast_mast_0 10 " ,
recipe = {
{ ' default:steel_ingot ' } ,
{ ' dye:cyan ' } ,
{ ' default:steel_ingot ' } ,
} ,
} )
minetest.register_craft ( {
output = " advtrains_signals_ks:ra_danger_0 2 " ,
recipe = {
{ ' dye:red ' , ' dye:white ' , ' dye:red ' } ,
{ ' dye:white ' , ' default:steel_ingot ' , ' default:steel_ingot ' } ,
{ ' default:steel_ingot ' , ' advtrains_signals_ks:mast_mast_0 ' , ' default:steel_ingot ' } ,
} ,
} )
2021-03-17 20:30:38 +01:00
local sign_material = " default:sign_wall_steel " --fallback
if minetest.get_modpath ( " basic_materials " ) then
sign_material = " basic_materials:plastic_sheet "
end
--print("Sign Material: "..sign_material)
2021-02-25 20:49:03 +01:00
minetest.register_craft ( {
output = " advtrains_signals_ks:sign_8_0 2 " ,
recipe = {
2021-03-17 20:30:38 +01:00
{ sign_material , ' dye:black ' } ,
2021-02-25 20:49:03 +01:00
{ ' default:stick ' , ' ' } ,
{ ' default:stick ' , ' ' } ,
} ,
} )
2021-03-17 20:30:38 +01:00
sign_material = nil
2021-11-16 11:03:22 +01:00
minetest.register_craft {
output = " advtrains_signals_ks:sign_8_0 1 " ,
recipe = { { " advtrains_signals_ks:sign_lf7_8_0 " } }
}
minetest.register_craft {
output = " advtrains_signals_ks:sign_hfs_0 1 " ,
recipe = { { " advtrains_signals_ks:sign_8_0 " } }
}
minetest.register_craft {
output = " advtrains_signals_ks:sign_lf_8_0 1 " ,
recipe = { { " advtrains_signals_ks:sign_hfs_0 " } }
}
minetest.register_craft {
output = " advtrains_signals_ks:sign_lf7_8_0 1 " ,
recipe = { { " advtrains_signals_ks:sign_lf_8_0 " } }
}