static int _get_stage_durations(lua_State *L, const char *key, int &outNumStages, double **outDurationArray)
{
	LUA_DEBUG_START(L);
	LuaTable stages = LuaTable(L, -1).Sub(key);
	if (stages.GetLua() == 0) {
		luaL_error(L, "Not a proper table (%s)", key);
	}
	if (stages.Size() < 1)
		return luaL_error(L, "Station must have at least 1 stage in %s", key);
	outNumStages = stages.Size();
	*outDurationArray = new double[stages.Size()];
	std::copy(stages.Begin<double>(), stages.End<double>(), *outDurationArray);
	lua_pop(L, 1); // Popping t
	LUA_DEBUG_END(L, 0);
	return 0;
}
// Data format example:
//	bay_groups = {
//		{0, 500, {1}},
//	},
static int _get_bay_ids(lua_State *L, const char *key, SpaceStationType::TBayGroups &outBayGroups, unsigned int &outNumDockingPorts)
{
	LUA_DEBUG_START(L);
	LuaTable t = LuaTable(L, -1).Sub(key);
	if (t.GetLua() == 0) {
		luaL_error(L, "The bay group isn't a proper table (%s)", key);
	}
	if (t.Size() < 1) {
		return luaL_error(L, "Station must have at least 1 group of bays in %s", key);
	}

	LuaTable::VecIter<LuaTable> it_end = t.End<LuaTable>();
	for (LuaTable::VecIter<LuaTable> it = t.Begin<LuaTable>(); it != it_end; ++it) {
		SpaceStationType::SBayGroup newBay;
		newBay.minShipSize = it->Get<int>(1);
		newBay.maxShipSize = it->Get<int>(2);
		LuaTable group = it->Sub(3);

		if (group.GetLua() == 0) {
			luaL_error(L, "A group is of the form {int, int, table} (%s)", key);
		}

		if (group.Size() == 0) {
			return luaL_error(L, "Group must have at least 1 bay %s", key);
		}

		newBay.bayIDs.reserve(group.Size());
		LuaTable::VecIter<int> jt_end = group.End<int>();
		for (LuaTable::VecIter<int> jt = group.Begin<int>(); jt != jt_end; ++jt) {
			if ((*jt) < 1) {
				return luaL_error(L, "Valid bay ID ranges start from 1 %s", key);
			}
			newBay.bayIDs.push_back((*jt)-1);
			++outNumDockingPorts;
		}
		lua_pop(L, 1); // Popping group
		outBayGroups.push_back(newBay);
	}
	lua_pop(L, 1); // Popping t
	LUA_DEBUG_END(L, 0);
	return 0;
}