1. simple eurphoria question

can someone please tell me how to get the integer part of a number in an atom in
order to assign it to an integer variable

new topic     » topic index » view message » categorize

2. Re: simple eurphoria question

john thomas wrote:
> 
> 
> can someone please tell me how to get the integer part of a number in an atom
> in order to assign it to an integer variable

atom x
integer y
x = 1.1

y = floor(x)

new topic     » goto parent     » topic index » view message » categorize

3. Re: simple eurphoria question

Evan Marshall wrote:
> 
> john thomas wrote:
> > 
> > 
> > can someone please tell me how to get the integer part of a number in an
> > atom
> > in order to assign it to an integer variable
> 
> atom x
> integer y
> x = 1.1
> 
> y = floor(x)

Yes, that will get the integer part of positive numbers, but it won't get the
integer part of negative numbers. For example, -1.1 will be rounded down to -2.
I'm afraid you'll have to use some if statements to make it work for negative
numbers too (ie if it's a negative number, do the opposite of floor(), which
could be named roof() and be a new function you could implement).

Regards, Alexander Toresson

new topic     » goto parent     » topic index » view message » categorize

4. Re: simple eurphoria question

Alexander Toresson wrote:
> Evan Marshall wrote:
> > john thomas wrote:
> > > 
> > > can someone please tell me how to get the integer part of a number in an
> > > atom
> > > in order to assign it to an integer variable
> > 
> > atom x
> > integer y
> > x = 1.1
> > 
> > y = floor(x)
> 
> Yes, that will get the integer part of positive numbers, but it won't get the
> integer part of negative numbers. For example, -1.1 will be rounded down to
> -2. I'm afraid you'll have to use some if statements to make it work for
> negative
> numbers too (ie if it's a negative number, do the opposite of floor(), which
> could be named roof() and be a new function you could implement).

I wrote a function just for this purpose. It's called
round_this_number_toward_zero_remember_that_negative_numbers_are_screwy().

I sometimes wonder if it's worth typing all that out just for

if x < 0 then
   return floor(x+1)
else
   return floor(x)
end if

new topic     » goto parent     » topic index » view message » categorize

5. Re: simple eurphoria question

john thomas wrote:
> 
> 
> can someone please tell me how to get the integer part of a number
 in an atom
> in order to assign it to an integer variable

atom number,atom,_part
integer integer_part

 number=1.1
 integer_part=floor(number)--1
 atom_part=number-integer_part--.1
 --.1 can't be assigned a intger value



Don Cole

new topic     » goto parent     » topic index » view message » categorize

6. Re: simple eurphoria question

Hey, y'all... from Kat:

Ck, please forward to euforum for me?

include get.e -- for value()

object junk
sequence string_number
atom atom_number
integer integer_number

atom_number = -0.4
string_number = sprintf("%d",atom_number)
junk = value(string_number)
integer_number = junk[2]


Kat,
cannot recieve or send to Euforum.

Why can't she send/receive?!

new topic     » goto parent     » topic index » view message » categorize

7. Re: simple eurphoria question

cklester wrote:
> 
> Hey, y'all... from Kat:
> 
> Ck, please forward to euforum for me?
> 
<snip>
> Kat,
> cannot recieve or send to Euforum.
> 
> Why can't she send/receive?!
I've got the same problem.
If you go see http://lists.topica.com/lists/EUforum/read
It looks like Topica died, last message showing is 1st Dec,
now five days ago. I'm trying this via the web interface, 
and wondering if there is a way to post from an Eu Program.

Got a bit lost somewhere with one of those <form method=POST 
enctype="multipart/form-data" action="http://www.listfilter.com/
cgi-bin/maillist.exu" name="maillist_form"> things, but I'm 
sure it can be done.

Regards,
Pete

new topic     » goto parent     » topic index » view message » categorize

8. Re: simple eurphoria question

cklester wrote:
> 
Test, please ignore

new topic     » goto parent     » topic index » view message » categorize

9. Re: simple eurphoria question

c.k.lester wrote:

> I wrote a function just for this purpose. It's called
> round_this_number_toward_zero_remember_that_negative_numbers_are_screwy().
> 
> I sometimes wonder if it's worth typing all that out just for
> 
> if x < 0 then
>    return floor(x+1)
> else
>    return floor(x)
> end if

This is not quite correct. if x is say, -2, it will return -1 rather than the
correct -2.

This will work:

if integer(x) then
     return x
elsif x<0 then
     return floor(x+1)
else
     return floor(x)
end if
}}}

new topic     » goto parent     » topic index » view message » categorize

10. Re: simple eurphoria question

Mike Nelson wrote:
> 
> c.k.lester wrote:
> 
> > I wrote a function just for this purpose. It's called
> > round_this_number_toward_zero_remember_that_negative_numbers_are_screwy().
> > 
> > I sometimes wonder if it's worth typing all that out just for
> > 
> > if x < 0 then
> >    return floor(x+1)
> > else
> >    return floor(x)
> > end if
> 
> This is not quite correct. if x is say, -2, it will return -1 rather than the
> correct -2.
> 
> This will work:
> 
> }}}
<eucode>
> if integer(x) then
>      return x
> elsif x<0 then
>      return floor(x+1)
> else
>      return floor(x)
> end if

A simpler method that works is:
if x < 0 then
    return -floor(-x)
else
    return floor(x)
end if


new topic     » goto parent     » topic index » view message » categorize

11. Re: simple eurphoria question

Larry Miller wrote:
> Mike Nelson wrote:
> > c.k.lester wrote:
> > > I wrote a function just for this purpose. It's called
> > > round_this_number_toward_zero_remember_that_negative_numbers_are_screwy().
> > > I sometimes wonder if it's worth typing all that out just for
> > > if x < 0 then
> > >    return floor(x+1)
> > > else
> > >    return floor(x)
> > > end if
> > This is not quite correct. if x is say, -2, it will return -1 rather than
> > the
> > correct -2.
> > This will work:
> > if integer(x) then
> >      return x
> > elsif x<0 then
> >      return floor(x+1)
> > else
> >      return floor(x)
> > end if
> A simpler method that works is:
> if x < 0 then
>     return -floor(-x)
> else
>     return floor(x)
> end if

Nice job, you guys. Thanks! :)

new topic     » goto parent     » topic index » view message » categorize

12. Re: simple eurphoria question

c.k.lester wrote:
> 
> Larry Miller wrote:
> > Mike Nelson wrote:
> > > c.k.lester wrote:
> > > > I wrote a function just for this purpose. It's called
> > > >
> > > > round_this_number_toward_zero_remember_that_negative_numbers_are_screwy().
> > > > I sometimes wonder if it's worth typing all that out just for
> > > > if x < 0 then
> > > >    return floor(x+1)
> > > > else
> > > >    return floor(x)
> > > > end if
> > > This is not quite correct. if x is say, -2, it will return -1 rather than
> > > the
> > > correct -2.
> > > This will work:
> > > if integer(x) then
> > >      return x
> > > elsif x<0 then
> > >      return floor(x+1)
> > > else
> > >      return floor(x)
> > > end if
> > A simpler method that works is:
> > if x < 0 then
> >     return -floor(-x)
> > else
> >     return floor(x)
> > end if
> 
> Nice job, you guys. Thanks! :)

Yes, this last solution is simpler, but a bit slower when dealing with
many numbers.
Please see my General functions library, where this and other similar problems
are dealt with.
Regards.

new topic     » goto parent     » topic index » view message » categorize

13. Re: simple eurphoria question

Hi John,

This function seems to work as well for converting atom to integer.

function int(atom a)

	return floor(a)+(a<0)

end function


Good luck!

Mark K. Akita
http://marksarts.blogspot.com/

new topic     » goto parent     » topic index » view message » categorize

14. Re: simple eurphoria question

Mark K. Akita wrote:
> 
> Hi John,
> 
> This function seems to work as well for converting atom to integer.
> 
> }}}
<eucode>
> 
> function int(atom a)
> 
> 	return floor(a)+(a<0)
> 
> end function
> 
> </eucode>
{{{

> 
> Good luck!
> 
> Mark K. Akita
> <a href="http://marksarts.blogspot.com/">http://marksarts.blogspot.com/</a>

That's what I thought Mark, but it's incorrect. :)
Try with this set of numbers: 1, 1.1, 1.9, 2, -1, -1.1, -1.9, -2

Mike Nelson, or Larry Miller's solutions are correct.

Chris Bensler
~ The difference between ordinary and extraordinary is that little extra ~
http://empire.iwireweb.com - Empire for Euphoria

new topic     » goto parent     » topic index » view message » categorize

15. Re: simple eurphoria question

Well i'd like to thank you all for your help.
a fantastic response for such a basic question.
and some well good solutions
it'll be interesting if i get a meaty problem.
next time i'll ensure i specify exactly what i want - i was only dealing with
positives

new topic     » goto parent     » topic index » view message » categorize

16. Re: simple eurphoria question

Chris Bensler wrote:
> 
> Mark K. Akita wrote:
> > 
> > Hi John,
> > 
> > This function seems to work as well for converting atom to integer.
> > 
> > }}}
<eucode>
> > 
> > function int(atom a)
> > 
> > 	return floor(a)+(a<0)
> > 
> > end function
> > 
> > </eucode>
{{{

> > 
> > Good luck!
> > 
> > Mark K. Akita
> > <a href="http://marksarts.blogspot.com/">http://marksarts.blogspot.com/</a>
> 
> That's what I thought Mark, but it's incorrect. :)
> Try with this set of numbers: 1, 1.1, 1.9, 2, -1, -1.1, -1.9, -2
> 
> Mike Nelson, or Larry Miller's solutions are correct.
> 
> Chris Bensler
> ~ The difference between ordinary and extraordinary is that little extra ~
> <a href="http://empire.iwireweb.com">http://empire.iwireweb.com</a> - Empire
> for Euphoria
Good catch Chris, 
OK.. how about this function instead

function int(atom a)

	return a-remainder(a,1)

end function


This should work with negative numbers that already are integers.

Mark K. Akita
http://marksarts.blogspot.com

new topic     » goto parent     » topic index » view message » categorize

17. Re: simple eurphoria question

Mark K. Akita wrote:
> 
> Chris Bensler wrote:
> > 
> > Mark K. Akita wrote:
> > > 
> > > Hi John,
> > > 
> > > This function seems to work as well for converting atom to integer.
> > > 
> > > }}}
<eucode>
> > > 
> > > function int(atom a)
> > > 
> > > 	return floor(a)+(a<0)
> > > 
> > > end function
> > > 
> > > </eucode>
{{{

> > > 
> > > Good luck!
> > > 
> > > Mark K. Akita
> > > <a
> > > href="http://marksarts.blogspot.com/">http://marksarts.blogspot.com/</a>
> > 
> > That's what I thought Mark, but it's incorrect. :)
> > Try with this set of numbers: 1, 1.1, 1.9, 2, -1, -1.1, -1.9, -2
> > 
> > Mike Nelson, or Larry Miller's solutions are correct.
> > 
> > Chris Bensler
> > ~ The difference between ordinary and extraordinary is that little extra ~
> > <a href="http://empire.iwireweb.com">http://empire.iwireweb.com</a> - Empire
> for Euphoria</font></i>
> Good catch Chris, 
> OK.. how about this function instead
> 
> }}}
<eucode>
> function int(atom a)
> 
> 	return a-remainder(a,1)
> 
> end function
> </eucode>
{{{

> 
> This should work with negative numbers that already are integers.
> 
> Mark K. Akita
> <a href="http://marksarts.blogspot.com">http://marksarts.blogspot.com</a>

It's interesting that works. I would have expected the result of anything
divided by 1 to be equal to itself (1.2/1 = 1.2). Apparently remainder() does
integer division (1.2/1 = 1).

Chris Bensler
~ The difference between ordinary and extraordinary is that little extra ~
http://empire.iwireweb.com - Empire for Euphoria

new topic     » goto parent     » topic index » view message » categorize

18. Re: simple eurphoria question

This function will find the integer portion of a negative number - most of the
time:

if integer(x) then
     return x
elsif x<0 then
     return floor(x+1)
else
     return floor(x)
end if


The problem is that integer(x) will return 0 for any number outside of
Euphoria's integer range, even if it has no fractional component. The function
above when used with -4000000000 will return -3999999999, which is wrong.

This method is used in Ricardo Forno's General function library for
FloorTowardsZero() and probably others. It should be corrected.

Larry Miller

new topic     » goto parent     » topic index » view message » categorize

19. Re: simple eurphoria question

Larry Miller wrote:
> 
> This function will find the integer portion of a negative number - most of the
> time:
> 
> }}}
<eucode>
> if integer(x) then
>      return x
> elsif x<0 then
>      return floor(x+1)
> else
>      return floor(x)
> end if
> 
> </eucode>
{{{

> 
> The problem is that integer(x) will return 0 for any number outside of
> Euphoria's
> integer range, even if it has no fractional component. The function above when
> used with -4000000000 will return -3999999999, which is wrong.
> 
> This method is used in Ricardo Forno's General function library for
> FloorTowardsZero()
> and probably others. It should be corrected.
> 
> Larry Miller

Yep, you are right.
I performed the following test of candidate good functions for this task.
The results showed all three were correct, but f2 was the fastest:

constant MAX = 50000000
atom t, x


function f1(atom a)
    
    return a - remainder(a,1)
end function

function f2(atom a)
    if a < 0 then
	return - floor(- a)
    end if
    return floor(a)
end function

function f3(atom a)
    atom b
    b = 2 * (a > 0) - 1
    return b * floor(a * b)
end function

t = time()
for i = 1 to MAX do
    x = f1(89.76)
end for
printf(1, "f1 = %f\n", time() - t)

t = time()
for i = 1 to MAX do
    x = f2(89.76)
end for
printf(1, "f2 = %f\n", time() - t)

t = time()
for i = 1 to MAX do
    x = f3(89.76)
end for
printf(1, "f3 = %f\n", time() - t)

printf(1, "0 %f %f %f\n", {f1(0), f2(0), f3(0)})
printf(1, "50 %f %f %f\n", {f1(50), f2(50), f3(50)})
printf(1, "-50 %f %f %f\n", {f1(-50), f2(-50), f3(-50)})
printf(1, "8.76 %f %f %f\n", {f1(8.76), f2(8.76), f3(8.76)})
printf(1, "-8.76 %f %f %f\n", {f1(-8.76), f2(-8.76), f3(-8.76)})
printf(1, "4346567890 %f %f %f\n", {f1(434567890), f2(434567890),
f3(434567890)})
printf(1, "-4346567890 %f %f %f\n", {f1(-434567890), f2(434567890),
f3(-434567890)})
printf(1, "4346567890.67 %f %f %f\n", {f1(434567890.67), f2(434567890.67),
f3(434567890.67)})
printf(1, "-4346567890.67 %f %f %f\n", {f1(-434567890.67), f2(-434567890.67),
f3(-434567890.67)})



So, I'm going to correct genfunc.e
Regards.

new topic     » goto parent     » topic index » view message » categorize

20. Re: simple eurphoria question

Ricardo M. Forno wrote:
> Yep, you are right.
> I performed the following test of candidate good functions for this task.
> The results showed all three were correct, but f2 was the fastest:

Did you try changing the order of the code in your bench tests, to verify that
it wasn't affecting your results? I've found it to be a major factor in any kind
of trivial timing test.

Also, it should be slightly faster if the last return statement in f2() was
inside of an if-branch..
As Matt (I beleive) pointed out with his winning code from the christmas contest
a few years ago.

function f2(atom a)
  if a < 0 then
    return - floor(- a)
  else
    return floor(a)
  end if
end function


Chris Bensler
~ The difference between ordinary and extraordinary is that little extra ~
http://empire.iwireweb.com - Empire for Euphoria

new topic     » goto parent     » topic index » view message » categorize

21. Re: simple eurphoria question

The benchmarks are interesting.  Euphoria "IF" statement processing must be
slightly faster than the math procedures.
It's amazing how profound a "simple" question can be...

Mark K. Akita
http://marksarts.blogspot.com/

new topic     » goto parent     » topic index » view message » categorize

22. Re: simple eurphoria question

Chris Bensler wrote:
> 
> Ricardo M. Forno wrote:
> > Yep, you are right.
> > I performed the following test of candidate good functions for this task.
> > The results showed all three were correct, but f2 was the fastest:
> 
> Did you try changing the order of the code in your bench tests, to verify that
> it wasn't affecting your results? I've found it to be a major factor in any
> kind of trivial timing test.
> 
> Also, it should be slightly faster if the last return statement in f2() was
> inside of an if-branch..
> As Matt (I beleive) pointed out with his winning code from the christmas
> contest
> a few years ago.
> 
> }}}
<eucode>
> function f2(atom a)
>   if a < 0 then
>     return - floor(- a)
>   else
>     return floor(a)
>   end if
> end function
> </eucode>
{{{

> 
> Chris Bensler
> ~ The difference between ordinary and extraordinary is that little extra ~
> <a href="http://empire.iwireweb.com">http://empire.iwireweb.com</a> - Empire
> for Euphoria

Hi Chris.
I tested both versions before posting this mail,
with the return inside the if and outside it.
Both had identical timings.

Regarding the code order, what change would you suggest?
Regards.

new topic     » goto parent     » topic index » view message » categorize

23. Re: simple eurphoria question

Ricardo M. Forno wrote:
> 
> Chris Bensler wrote:
> > 
> > Ricardo M. Forno wrote:
> > > Yep, you are right.
> > > I performed the following test of candidate good functions for this task.
> > > The results showed all three were correct, but f2 was the fastest:
> > 
> > Did you try changing the order of the code in your bench tests, to verify
> > that
> > it wasn't affecting your results? I've found it to be a major factor in any
> > kind of trivial timing test.
> > 
> > Also, it should be slightly faster if the last return statement in f2() was
> > inside of an if-branch..
> > As Matt (I beleive) pointed out with his winning code from the christmas
> > contest
> > a few years ago.
> > 
> > }}}
<eucode>
> > function f2(atom a)
> >   if a < 0 then
> >     return - floor(- a)
> >   else
> >     return floor(a)
> >   end if
> > end function
> > </eucode>
{{{

> > 
> > Chris Bensler
> > ~ The difference between ordinary and extraordinary is that little extra ~
> > <a href="http://empire.iwireweb.com">http://empire.iwireweb.com</a> - Empire
> for Euphoria</font></i>
> 
> Hi Chris.
> I tested both versions before posting this mail,
> with the return inside the if and outside it.
> Both had identical timings.
> 
> Regarding the code order, what change would you suggest?
> Regards.

Sorry, nevermind the code order. I can't duplicate the results.

However, it's worth mentioning that in my bench tests, f1() was consistently
faster than f2() when using exw3.0.1 and f2() is faster than f1() when using
exw2.3
Either way, the difference is so marginal that I don't think it matters.

Chris Bensler
~ The difference between ordinary and extraordinary is that little extra ~
http://empire.iwireweb.com - Empire for Euphoria

new topic     » goto parent     » topic index » view message » categorize

24. Re: simple eurphoria question

Ricardo M. Forno wrote:

[snipped]
> function f2(atom a)
>     if a < 0 then
> 	return - floor(- a)
>     end if
>     return floor(a)
> end function
[snipped]

Hi Ricardo,

Try please the below version:

function f2_(atom a)
     if a >= 0 then -- ">=" seems to be faster than just "<"
      return floor(a)
     end if
      return - floor(- a) -- it seems to be a rare case
 end function


Regards,
Igor Kachan
kinz at peterlink.ru

new topic     » goto parent     » topic index » view message » categorize

25. Re: simple eurphoria question

Chris Bensler wrote:
> 
> Ricardo M. Forno wrote:
> > 
> > Chris Bensler wrote:
> > > 
> > > Ricardo M. Forno wrote:
> > > > Yep, you are right.
> > > > I performed the following test of candidate good functions for this
> > > > task.
> > > > The results showed all three were correct, but f2 was the fastest:
> > > 
> > > Did you try changing the order of the code in your bench tests, to verify
> > > that
> > > it wasn't affecting your results? I've found it to be a major factor in
> > > any
> > > kind of trivial timing test.
> > > 
> > > Also, it should be slightly faster if the last return statement in f2()
> > > was
> > > inside of an if-branch..
> > > As Matt (I beleive) pointed out with his winning code from the christmas
> > > contest
> > > a few years ago.
> > > 
> > > }}}
<eucode>
> > > function f2(atom a)
> > >   if a < 0 then
> > >     return - floor(- a)
> > >   else
> > >     return floor(a)
> > >   end if
> > > end function
> > > </eucode>
{{{

> > > 
> > > Chris Bensler
> > > ~ The difference between ordinary and extraordinary is that little extra ~
> > > <a href="http://empire.iwireweb.com">http://empire.iwireweb.com</a> -
> > > Empire
> > for Euphoria</font></i>
> > 
> > Hi Chris.
> > I tested both versions before posting this mail,
> > with the return inside the if and outside it.
> > Both had identical timings.
> > 
> > Regarding the code order, what change would you suggest?
> > Regards.
> 
> Sorry, nevermind the code order. I can't duplicate the results.
> 
> However, it's worth mentioning that in my bench tests, f1() was consistently
> faster than f2() when using exw3.0.1 and f2() is faster than f1() when using
> exw2.3
> Either way, the difference is so marginal that I don't think it matters.
> 
> Chris Bensler
> ~ The difference between ordinary and extraordinary is that little extra ~
> <a href="http://empire.iwireweb.com">http://empire.iwireweb.com</a> - Empire
> for Euphoria

Hi Chris.
Maybe there should be some difference between your benchmarks and mine.
My PC has an AMD 2800 chip, and I'm usig EU 2.4 :)
Regards.

new topic     » goto parent     » topic index » view message » categorize

26. Re: simple eurphoria question

Ricardo M. Forno wrote:
>
> Hi Chris.
> Maybe there should be some difference between your benchmarks and mine.
> My PC has an AMD 2800 chip, and I'm usig EU 2.4 :)
> Regards.

I'm using a PIV 2.53Ghz but I don't think that should really matter.
In these tests, I've changed the MAX from 50000000 to 5000000 so they are
faster, but the results are consistent with what I get when using the larger
iterations.

Using this code...
constant MAX = 5000000
atom t, x

function f1(atom a)
    return a - remainder(a,1)
end function

function f2(atom a)
  if a < 0 then
  	return - floor(- a)
  end if
    return floor(a)
end function

t = time()
for i = 1 to MAX do
    x = f1(89.76)
end for
printf(1, "f1 = %f\n", time() - t)

t = time()
for i = 1 to MAX do
    x = f2(89.76)
end for
printf(1, "f2 = %f\n", time() - t)

if getc(0) then end if


Using 2.3 the results are:
f1() = 1.50
f2() = 1.42

Using 3.0.1 the results are:
f1() = 1.37
f2() = 1.54

Using this code:
constant MAX = 5000000
atom t, x

function f1(atom a)
    return a - remainder(a,1)
end function

function f2(atom a)
  if a < 0 then
  	return - floor(- a)
  end if
    return floor(a)
end function

function f3(atom a)
  if a >= 0 then
    return floor(a)
  else
  	return - floor(- a)
  end if
end function

t = time()
for i = 1 to MAX do
    x = f1(89.76)
end for
printf(1, "f1 = %f\n", time() - t)

t = time()
for i = 1 to MAX do
    x = f2(89.76)
end for
printf(1, "f2 = %f\n", time() - t)

t = time()
for i = 1 to MAX do
    x = f3(89.76)
end for
printf(1, "f3 = %f\n", time() - t)

if getc(0) then end if


Using 2.3 the results are:
f1() = 1.52
f2() = 1.41
f3() = 1.44

Using 3.0.1 the results are:
f1() = 1.42
f2() = 1.52
f3() = 1.45

When I use this code:
constant MAX = 5000000
atom t, x

function f1(atom a)
    return a - remainder(a,1)
end function

function f3(atom a)
  if a >= 0 then
    return floor(a)
  else
  	return - floor(- a)
  end if
end function

function f2(atom a)
  if a < 0 then
  	return - floor(- a)
  end if
    return floor(a)
end function

t = time()
for i = 1 to MAX do
    x = f1(89.76)
end for
printf(1, "f1 = %f\n", time() - t)

t = time()
for i = 1 to MAX do
    x = f3(89.76)
end for
printf(1, "f3 = %f\n", time() - t)

t = time()
for i = 1 to MAX do
    x = f2(89.76)
end for
printf(1, "f2 = %f\n", time() - t)

if getc(0) then end if


(note that the results for f3() are displayed before f2() in this example)
Using 2.3 the results are:
f1() = 1.50
f3() = 1.40
f2() = 1.46

Using 3.0.1 the results are:
f1() = 1.39
f3() = 1.48
f2() = 1.45

Chris Bensler
~ The difference between ordinary and extraordinary is that little extra ~
http://empire.iwireweb.com - Empire for Euphoria

new topic     » goto parent     » topic index » view message » categorize

Search



Quick Links

User menu

Not signed in.

Misc Menu