//
//  root.txt
//
//     root resource file for ufortune.
//     This data will be used as a fall-back if no other resource bundle
//     matches the requested locale.
//

//   ufortune has three resources
//     usage         - the usage string to display if there's a command line error 
//                     or in response to -? or --help.
//     optionMessage - the error text to display in response to an unrecognized
//                     option on the command line.
//     fortunes      - An array of strings, the fortune messages.
//

root {

   usage           {"usage: ufortune [-v]  [-l locale]"}
   optionMessage   {"unrecognized command line option:"} 


//
//  These fortune messages are from BSD fortune data files.

   fortunes {


"186,282 miles per second:

It isn't just a good idea, it's the law!",

"2180, U.S. History question:
        What 20th Century U.S. President was almost impeached and what
office did he later hold?",

"$3,000,000",

"355/113 -- Not the famous irrational number PI, but an incredible
simulation!\"",

"3 syncs represent the trinity - init, the child and the eternal zombie
process.  In doing 3, you're paying homage to each and I think such
traditions are important in this shallow, mercurial business we find
ourselves in.
                -- Jordan K. Hubbard",

"43rd Law of Computing:
        Anything that can go wr
fortune: Segmentation violation -- Core dumped",

"7:30, Channel 5: The Bionic Dog (Action/Adventure)
        The Bionic Dog drinks too much and kicks over the National
        Redwood Forest.",

"7:30, Channel 5: The Bionic Dog (Action/Adventure)
        The Bionic Dog gets a hormonal short-circuit and violates the
        Mann Act with an interstate Greyhound bus.",

"99 blocks of crud on the disk,
99 blocks of crud!
You patch a bug, and dump it again:
100 blocks of crud on the disk!

100 blocks of crud on the disk,
100 blocks of crud!
You patch a bug, and dump it again:
101 blocks of crud on the disk! ...",

"A \"No\" uttered from deepest conviction is better and greater than a
\"Yes\" merely uttered to please, or what is worse, to avoid trouble.
                -- Mahatma Ghandi",

"A [golf] ball hitting a tree shall be deemed not to have hit the tree.
Hitting a tree is simply bad luck and has no place in a scientific
game.  The player should estimate the distance the ball would have
traveled if it had not hit the tree and play the ball from there,
preferably atop a nice firm tuft of grass.
                -- Donald A. Metz",

"A [golf] ball sliced or hooked into the rough shall be lifted and
placed in the fairway at a point equal to the distance it carried or
rolled into the rough.  Such veering right or left frequently results
from friction between the face of the club and the cover of the ball
and the player should not be penalized for the erratic behavior of the
ball resulting from such uncontrollable physical
phenomena.
                -- Donald A. Metz",

"A baby is an alimentary canal with a loud voice at one end and no
responsibility at the other.",

"A baby is God's opinion that the world should go on.
                -- Carl Sandburg",

"A bachelor is a selfish, undeserving guy who has cheated some woman out
of a divorce.
                -- Don Quinn",

"A banker is a fellow who lends you his umbrella when the sun is shining
and wants it back the minute it begins to rain.
                -- Mark Twain",

"A billion here, a couple of billion there -- first thing you know it
adds up to be real money.
                -- Senator Everett McKinley Dirksen",

"A bird in the bush usually has a friend in there with him.",

"A bird in the hand is worth what it will bring.",

"A bird in the hand makes it awfully hard to blow your nose.",

"... A booming voice says, \"Wrong, cretin!\", and you notice that you
have turned into a pile of dust.",

"A bore is someone who persists in holding his own views after we have
enlightened him with ours.",

"A budget is just a method of worrying before you spend money, as well
as afterward.",

"A candidate is a person who gets money from the rich and votes from the
poor to protect them from each other.",

"A celebrity is a person who is known for his well-knownness.",

"A child can go only so far in life without potty training.  It is not
mere coincidence that six of the last seven presidents were potty
trained, not to mention nearly half of the nation's state legislators.
                -- Dave Barry",

"A child of five could understand this!  Fetch me a child of five.",

"A chubby man with a white beard and a red suit will approach you soon.
Avoid him.  He's a Commie.",

"A citizen of America will cross the ocean to fight for democracy, but
won't cross the street to vote in a national election.
                -- Bill Vaughan",

"A city is a large community where people are lonesome together
                -- Herbert Prochnow",

"A classic is something that everybody wants to have read and nobody
wants to read.
                -- Mark Twain",

"A closed mouth gathers no foot.",

"A computer, to print out a fact,
Will divide, multiply, and subtract.
        But this output can be
        No more than debris,
If the input was short of exact.
                -- Gigo",

"A conclusion is simply the place where someone got tired of thinking.",

"A CONS is an object which cares.
                -- Bernie Greenberg.",

"A consultant is a person who borrows your watch, tells you what time it
is, pockets the watch, and sends you a bill for it.",

"A continuing flow of paper is sufficient to continue the flow of paper.
                -- Dyer",

"A copy of the universe is not what is required of art; one of the
damned things is ample.
                -- Rebecca West",

"A countryman between two lawyers is like a fish between two cats.
                -- Ben Franklin",

"A crusader's wife slipped from the garrison
And had an affair with a Saracen.
        She was not oversexed,
        Or jealous or vexed,
She just wanted to make a comparison.",

"A cynic is a person searching for an honest man, with a stolen
lantern.
                -- Edgar A. Shoaff",

"A day for firm decisions!!!!!  Or is it?",

"A day without sunshine is like night.",

"A diplomat is a man who can convince his wife she'd look stout in a fur
coat.",

"A diplomat is someone who can tell you to go to hell in such a way that
you will look forward to the trip.",

"        A disciple of another sect once came to Drescher as he was
eating his morning meal.  \"I would like to give you this personality
test\", said the outsider, \"because I want you to be happy.\"
        Drescher took the paper that was offered him and put it into
the toaster -- \"I wish the toaster to be happy too\".",

"A diva who specializes in risque arias is an off-coloratura soprano ...",

"        A doctor, an architect, and a computer scientist were arguing
about whose profession was the oldest.  In the course of their
arguments, they got all the way back to the Garden of Eden, whereupon
the doctor said, \"The medical profession is clearly the oldest, because
Eve was made from Adam's rib, as the story goes, and that was a simply
incredible surgical feat.\"  "
  }
}