Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # This is a sample dgamelaunch configuration file. Only bash-style comments
- # are allowed, such as this. Each configuration option will be explained
- # along with its default value.
- # Global config variables:
- # Max amount of registered users to allow. Has no effect if dgl was
- # compiled with SQLite
- maxusers = 64000
- # Allow registration of new nicks? (yes or no)
- allow_new_nicks = yes
- # Max length for newly registered nicks. Must be less than 20.
- # By default, NetHack only stores the first 10 chars of a name into
- # the record/logfile.
- maxnicklen = 16
- # Set the default watching-screen sorting mode. Can be one of
- # "username", "game", "windowsize", "starttime" or "idletime".
- # "username" is the default.
- #sortmode = "username"
- # Set the columns displayed in the watching-screen. Each column definition
- # must have four elements as:
- # [ "<display title>", "<sortname>", <Screen column>, "<printf format>" ]
- #
- # <sortname> may be "unsorted", "username", "game", "windowsize", "starttime",
- # "duration", "idletime", or (if shmem is enabled) "watchers".
- #
- # watch_columns = [ ["", "", 1, "%s)"],
- # ["User", "username", 4, "%-15s"],
- # ["Game", "game", 21, "%-11s"],
- # ["Term", "windowsize", 34, "%s"],
- # ["Idle", "idletime", 43, "%-10s"],
- # ["Watchers", "watchers", 55, "%5s"],
- # ["Started", "starttime", 65, "%s"]
- # ]
- watch_columns = [ ["", "", 1, "%s)"],
- ["Username", "username", 4, "%-15s"],
- ["Game", "game", 21, "%-5s"],
- [" Size", "windowsize", 31, "%s"],
- ["Start date & time", "starttime", 40, "%s"],
- ["Idle", "idletime", 61, "%-8s"],
- [" W", "watchers", 68, "%2s"],
- ["Extra", "extrainfo", 71, "%s"]
- ]
- # Path to a prepared chroot jail.
- chroot_path = "/opt/nethack/hardfought.org/"
- # From inside the jail, dgamelaunch's working directory for rcfiles/ttyrec/etc
- dglroot = "/dgldir/"
- # Strings to be replaced in every banner
- # you can have either direct string replacements, like
- # "$FOO" = "BAR", or you can get the server time with
- # "$FOO" = timeformat("%F %T")
- # for the timeformat parameter string format, see man strftime
- bannervars = [ "$MOTDTIME" = "2011.10.08",
- "$SERVERID" = "$ATTR(14)Hardfought - a public NetHack server$ATTR()",
- "$SERVADDR" = "$ATTR(14)https://www.hardfought.org/$ATTR()",
- "$DATETIME" = timeformat("%F %T"),
- "$RSA" = "$ATTR(12)2048 RSA 22:88:b9:45:ff:30:a3:8e:12:70:af:90:41:3d:5b:a8$ATTR()",
- "$EDIT" = "Editor options: use number column for rnano, symbol for virus$ATTR()",
- "$IRCID" = "$ATTR(10)join us at #hardfought on chat.freenode.net$ATTR()",
- "$USER" = "$ATTR(12)$USERNAME$ATTR()"
- ]
- # From inside the jail, location of a banner file, which is
- # shown in submenus that cannot be defined separately.
- # Some string substitution is done for every banner file contents:
- # - bannervars from above
- # - $VERSION replaced with "dgamelaunch v" + dgl version number.
- # - $USERNAME replaced with logged-in user's name, or with "[Anonymous]"
- # - $INCLUDE(filename) the named file will be inserted here.
- banner = "/dgl-banner"
- # The following two options are fairly insecure. They will force us to
- # load the password/group database into memory while still having root
- # privileges. Replace them with shed_uid/shed_gid entries as soon as
- # possible if you decide to use them. dgamelaunch will inform you of
- # the uids/gids corresponding to your choices when it loads.
- #
- # Note that shed_uid and shed_gid will always take precedence over
- # shed_user and shed_group if they are specified.
- # shed_user: username to shed privileges to
- #shed_user = "games"
- # shed_group: group name to shed privileges to
- #shed_group = "games"
- # Preferably, you may use the respective gids/uids. This is for Debian:
- shed_uid = 5
- shed_gid = 60
- # Locale. Leaving this out, dgamelaunch will not explicitly set locale.
- locale = "en_US.UTF-8"
- # Default TERM, used if the user's $TERM is unknown.
- # If undefined, dgamelaunch will just terminate in that case.
- default_term = "xterm"
- # Should dgl send select-UTF8-charset escape code? (that is: ESC % G)
- # default is no.
- #utf8esc = yes
- # Should dgl allow XON/XOFF? Default is "yes", meaning "don't touch it".
- # "no" disables XON/XOFF
- #flowcontrol = no
- # Maximum time in seconds user can idle in the dgamelaunch menus
- # before dgl exits. Default value is 0, which disables the idling timer.
- # Does not apply to external programs or config editors.
- # For setting game idle time, use max_idle_time in the game DEFINE.
- # menu_max_idle_time = 1024
- # Passwd refers to the file that stores the user database.
- # The default passwd file is "/dgl-login" for flat-text database, and for
- # sqlite, whatever value was defined for the sqlite database at compile time.
- # This is also used for the shared memory key, if shmem is enabled at compile
- # time.
- #passwd = "/dgl-login"
- # Lockfile is used only when dgl was compiled without sqlite.
- #lockfile = "/dgl-lock"
- #
- # define some commands that are run when something happens. format is
- # commands [ <time> ] = <command> ...
- #
- # <time> can be one of:
- # dglstart = when someone telnets in
- # login = when user has logged in
- # register = right after a new user is registered
- # gamestart = just before a game is started
- # gameend = after a game ends (see also per-game "postcommand" define)
- #
- # <command> is:
- # mkdir "foo" = create a directory "foo"
- # chdir "foo" = change current work dir to "foo"
- # cp "foo" "bar" = copy file "foo" to "bar", overwriting previous "bar"
- # ifnxcp "foo" "bar" = copy file "foo" to "bar", if "bar" doesn't exist
- # unlink "foo" = delete file "foo"
- # setenv "foo" "bar" = set environment variable "foo" to "bar"
- # exec "foo" "bar" = execute "foo" with "bar" as it's param
- # rawprint "foo" = output string "foo"
- # chpasswd = do the change password prompting, if logged in
- # chmail = do the change email prompting, if logged in
- # watch_menu = go to the watching menu
- # quit = quit dgl
- # ask_login = do the login prompting, if not logged in
- # ask_register = do register new user prompting, if not logged in and
- # registration of new nicks is allowed.
- # play_game "foo" = start game which has the short name "foo"
- # (user must be logged in)
- # play_if_exist "foo" "file" = start game "foo", if file "file" exists.
- # submenu "foo" = go to submenu "foo"
- # return = return from submenu
- #
- # NOTE: edit_options-command was removed. use ifnxcp and exec to simulate it.
- #
- # The commands will be done inside the chroot and with the uid and gid
- # defined above.
- # Parameters to the commands are subject to variable substitution:
- # %r = dglroot, as defined above
- # %n = user nick, if user is logged in
- # %N = first character of user name, if user is logged in
- # %u = shed_uid, as defined above, but numeric
- # %g = game name, if user has selected a game.
- # %s = short game name, if user has selected a game.
- # %t = ttyrec path & filename of the last game played.
- #
- # Also some escape codes:
- # \\ = backslash
- # \a = bell
- # \b = backspace
- # \e = escape character
- # \f = form feed
- # \n = newline
- # \r = carriage return
- # \t = tab
- # \v = vertical tab
- #
- # eg. commands[login] = mkdir "foo", unlink "bar", setenv "Z" "foo"
- #
- # Change the terminal title: (assuming terminals support the escape code)
- #commands[dglstart] = rawprint "\e]2;nethack.alt.org\a"
- # create the user's dirs when they register
- commands[register] = mkdir "%ruserdata/%N",
- mkdir "%ruserdata/%N/%n"
- commands[login] = mkdir "%ruserdata/%N",
- mkdir "%ruserdata/%N/%n"
- # see each game variant section for gamestart commands
- # commands[gamestart] = mkdir "%ruserdata/%N/%n/%s",
- #mkdir "%ruserdata/%N/%n/%s/dumplog",
- #mkdir "%ruserdata/%N/%n/%s/ttyrec"
- #ifnxcp "/dgl-default-rcfile.%s" "%ruserdata/%N/%n/%s/%n.%src"
- # file mode for when commands copy files.
- # readable and writable by all. you could use eg. "0644" to be more secure.
- filemode = "0666"
- # Define the main menus.
- # You _must_ define "mainmenu_anon" and "mainmenu_user".
- # $VERSION and $SERVERID will be replaced, as per the bannerfile above.
- # First, the menu shown to anonymous user:
- menu["mainmenu_anon"] {
- bannerfile = "dgl_menu_main_anon.txt"
- cursor = (5,12)
- commands["l"] = ask_login
- commands["r"] = ask_register
- commands["s"] = submenu "server_info"
- commands["w"] = watch_menu
- commands["q"] = quit
- }
- # Then the menu shown when the user has logged in:
- # $USERNAME in here will be replaced with the user name.
- menu["mainmenu_user"] {
- # contents of this file are written to screen.
- # the file must be inside the chroot.
- # Some string subsitutions can be done in the file:
- # $INCLUDE(filename) = includes the file to this file.
- # String substitutions defined in bannervars-section above.
- # $VERSION = dgamelaunch version
- # $USERNAME = user name (or [Anonymous] if not logged in)
- # $ATTR(params) = change text color and attributes.
- # params can be either number (to set the text color),
- # one, or any of "b" (bold), "s" (standout), "u" (underline),
- # "r" (reverse) or "d" (dim),
- # or both color number and attribute characters, separated by colon.
- # Empty param resets color and attributes to default.
- bannerfile = "dgl_menu_main_user.txt"
- # after which cursor is moved to this location
- # if cursor-definition is missing, the cursor is put
- # to the end of the last line of the banner.
- cursor = (5,22)
- # keys we accept. format is
- # commands["string_of_keys"] = <commandlist>
- # for example, you could use commands["qQ"] = quit
- commands["c"] = chpasswd
- commands["e"] = chmail
- commands["w"] = watch_menu
- commands["1"] = mkdir "%ruserdata/%N/%n/nh343",
- ifnxcp "/dgl-default-rcfile.nh343" "%ruserdata/%N/%n/nh343/%n.nh343rc",
- exec "/bin/rnano" "%ruserdata/%N/%n/nh343/%n.nh343rc"
- commands["!"] = mkdir "%ruserdata/%N/%n/nh343",
- ifnxcp "/dgl-default-rcfile.nh343" "%ruserdata/%N/%n/nh343/%n.nh343rc",
- exec "/bin/virus" "%ruserdata/%N/%n/nh343/%n.nh343rc"
- commands["2"] = mkdir "%ruserdata/%N/%n/nhdev",
- ifnxcp "/dgl-default-rcfile.nhdev" "%ruserdata/%N/%n/nhdev/%n.nhdevrc",
- exec "/bin/rnano" "%ruserdata/%N/%n/nhdev/%n.nhdevrc"
- commands["@"] = mkdir "%ruserdata/%N/%n/nhdev",
- ifnxcp "/dgl-default-rcfile.nhdev" "%ruserdata/%N/%n/nhdev/%n.nhdevrc",
- exec "/bin/virus" "%ruserdata/%N/%n/nhdev/%n.nhdevrc"
- commands["3"] = mkdir "%ruserdata/%N/%n/gh",
- ifnxcp "/dgl-default-rcfile.gh" "%ruserdata/%N/%n/gh/%n.ghrc",
- exec "/bin/rnano" "%ruserdata/%N/%n/gh/%n.ghrc"
- commands["#"] = mkdir "%ruserdata/%N/%n/gh",
- ifnxcp "/dgl-default-rcfile.gh" "%ruserdata/%N/%n/gh/%n.ghrc",
- exec "/bin/virus" "%ruserdata/%N/%n/gh/%n.ghrc"
- commands["4"] = mkdir "%ruserdata/%N/%n/un531",
- ifnxcp "/dgl-default-rcfile.un531" "%ruserdata/%N/%n/un531/%n.un531",
- exec "/bin/rnano" "%ruserdata/%N/%n/un531/%n.un531rc"
- commands["$"] = mkdir "%ruserdata/%N/%n/un531",
- ifnxcp "/dgl-default-rcfile.un531" "%ruserdata/%N/%n/un531/%n.un531",
- exec "/bin/virus" "%ruserdata/%N/%n/un531/%n.un531rc"
- commands["5"] = mkdir "%ruserdata/%N/%n/dnethack",
- ifnxcp "/dgl-default-rcfile.dnethack" "%ruserdata/%N/%n/dnethack/%n.dnethack",
- exec "/bin/rnano" "%ruserdata/%N/%n/dnethack/%n.dnethackrc"
- commands["%"] = mkdir "%ruserdata/%N/%n/dnethack",
- ifnxcp "/dgl-default-rcfile.dnethack" "%ruserdata/%N/%n/dnethack/%n.dnethack",
- exec "/bin/virus" "%ruserdata/%N/%n/dnethack/%n.dnethackrc"
- commands["p"] = play_game "nh343"
- commands["v"] = play_game "nhdev"
- commands["g"] = play_game "gh"
- commands["u"] = play_game "un531"
- commands["i"] = play_game "fh"
- commands["f"] = play_game "4k"
- commands["d"] = play_game "dnethack"
- commands["s"] = submenu "server_info"
- commands["q"] = quit
- }
- # this menu is shown when user presses '?' in the watching menu
- menu["watchmenu_help"] {
- bannerfile = "dgl_menu_watchmenu_help.txt"
- cursor = (5,20)
- commands["qQ"] = return
- }
- menu["server_info"] {
- bannerfile = "dgl_menu_server_info.txt"
- cursor = (5,21)
- commands["qQ"] = return
- }
- # Next, we'll define one game's data:
- #
- # NetHack 3.4.3
- #
- DEFINE {
- game_path = "/nh343/nethack"
- game_name = "nethack"
- short_name = "nh343"
- game_args = "/nh343/nethack", "-u", "%n"
- spooldir = "/mail/"
- rc_template = "/dgl-default-rcfile.nh343"
- rc_fmt = "%ruserdata/%N/%n/%s/%n.nh343rc"
- inprogressdir = "%rinprogress-nh343/"
- extra_info_file = "%rextrainfo-nh343/%n.extrainfo"
- max_idle_time = 3600
- # The place where ttyrecs are stored for this game.
- # If this is not defined, ttyrecs are not saved for this game.
- # Leaving this undefined also means the games cannot be spectated.
- ttyrecdir = "%ruserdata/%N/%n/%s/ttyrec/"
- # back up savefile
- commands = cp "/nh343/var/save/%u%n.gz" "/nh343/var/save/%u%n.gz.bak",
- mkdir "%ruserdata/%N/%n/%s",
- mkdir "%ruserdata/%N/%n/%s/dumplog",
- mkdir "%ruserdata/%N/%n/%s/ttyrec",
- ifnxcp "/dgl-default-rcfile.%s" "%ruserdata/%N/%n/%s/%n.%src",
- # set NETHACKOPTIONS to point to the rcfile
- setenv "NETHACKOPTIONS" "@%ruserdata/%N/%n/%s/%n.nh343rc",
- # set up nethack mail stuff, assuming it's compiled with it...
- setenv "MAIL" "/mail/%n",
- setenv "SIMPLEMAIL" "1",
- # don't let the mail file grow
- unlink "/mail/%n"
- }
- #
- # NetHack 3.6.1-dev
- #
- DEFINE {
- game_path = "/nhdev/nethack"
- game_name = "nethack"
- short_name = "nhdev"
- game_args = "/nhdev/nethack", "-u", "%n"
- spooldir = "/mail/"
- rc_template = "/dgl-default-rcfile.nhdev"
- rc_fmt = "%ruserdata/%N/%n/%s/%n.nhdevrc"
- inprogressdir = "%rinprogress-nhdev/"
- extra_info_file = "%rextrainfo-nhdev/%n.extrainfo"
- max_idle_time = 3600
- # The place where ttyrecs are stored for this game.
- # If this is not defined, ttyrecs are not saved for this game.
- # Leaving this undefined also means the games cannot be spectated.
- ttyrecdir = "%ruserdata/%N/%n/%s/ttyrec/"
- # back up savefile
- commands = cp "/nhdev/var/save/%u%n.gz" "/nhdev/var/save/%u%n.gz.bak",
- mkdir "%ruserdata/%N/%n/%s",
- mkdir "%ruserdata/%N/%n/%s/dumplog",
- mkdir "%ruserdata/%N/%n/%s/ttyrec",
- ifnxcp "/dgl-default-rcfile.%s" "%ruserdata/%N/%n/%s/%n.%src",
- # set NETHACKOPTIONS to point to the rcfile
- setenv "NETHACKOPTIONS" "@%ruserdata/%N/%n/%s/%n.nhdevrc",
- # set up nethack mail stuff, assuming it's compiled with it...
- setenv "MAIL" "/mail/%n",
- setenv "SIMPLEMAIL" "1",
- # don't let the mail file grow
- unlink "/mail/%n"
- }
- #
- # GruntHack
- #
- DEFINE {
- game_path = "/gh/grunthack"
- game_name = "grunthack"
- short_name = "gh"
- game_args = "/gh/grunthack", "-u", "%n"
- spooldir = "/mail/"
- rc_template = "/dgl-default-rcfile.gh"
- rc_fmt = "%ruserdata/%N/%n/%s/%n.ghrc"
- inprogressdir = "%rinprogress-gh/"
- extra_info_file = "%rextrainfo-gh/%n.extrainfo"
- max_idle_time = 3600
- # The place where ttyrecs are stored for this game.
- # If this is not defined, ttyrecs are not saved for this game.
- # Leaving this undefined also means the games cannot be spectated.
- ttyrecdir = "%ruserdata/%N/%n/%s/ttyrec/"
- # back up savefile
- commands = cp "/gh/var/save/%u%n.gz" "/gh/var/save/%u%n.gz.bak",
- mkdir "%ruserdata/%N/%n/%s",
- mkdir "%ruserdata/%N/%n/%s/dumplog",
- mkdir "%ruserdata/%N/%n/%s/ttyrec",
- ifnxcp "/dgl-default-rcfile.%s" "%ruserdata/%N/%n/%s/%n.%src",
- # set NETHACKOPTIONS to point to the rcfile
- setenv "NETHACKOPTIONS" "@%ruserdata/%N/%n/%s/%n.ghrc",
- # set up nethack mail stuff, assuming it's compiled with it...
- setenv "MAIL" "/mail/%n",
- setenv "SIMPLEMAIL" "1",
- # don't let the mail file grow
- unlink "/mail/%n"
- }
- #
- # UnNetHack 5.3.1
- #
- DEFINE {
- game_path = "/un531/unnethack"
- game_name = "unnethack"
- short_name = "un531"
- game_args = "/un531/unnethack", "-u", "%n"
- spooldir = "/mail/"
- rc_template = "/dgl-default-rcfile.un531"
- rc_fmt = "%ruserdata/%N/%n/%s/%n.un531rc"
- inprogressdir = "%rinprogress-un531/"
- max_idle_time = 3600
- # The place where ttyrecs are stored for this game. If this is not
- # defined, ttyrecs are not saved for this game. Leaving this undefined
- # also means the games cannot be spectated.
- ttyrecdir = "%ruserdata/%N/%n/%s/ttyrec/"
- # back up savefile
- commands = cp "/un531/var/save/%u%n.gz" "/un531/var/save/%u%n.gz.bak",
- mkdir "%ruserdata/%N/%n/%s",
- mkdir "%ruserdata/%N/%n/%s/dumplog",
- mkdir "%ruserdata/%N/%n/%s/ttyrec",
- ifnxcp "/dgl-default-rcfile.%s" "%ruserdata/%N/%n/%s/%n.%src",
- # set NETHACKOPTIONS to point to the rcfile
- setenv "NETHACKOPTIONS" "@%ruserdata/%N/%n/%s/%n.un531rc",
- # set up nethack mail stuff, assuming it's compiled with it...
- setenv "MAIL" "/mail/%n",
- setenv "SIMPLEMAIL" "1",
- # don't let the mail file grow
- unlink "/mail/%n"
- }
- #
- # dNetHack
- #
- DEFINE {
- game_path = "/dnethackdir/dnethack"
- game_name = "dnethack"
- short_name = "dnethack"
- game_args = "/dnethackdir/dnethack", "-u", "%n"
- spooldir = "/mail/"
- rc_template = "/dgl-default-rcfile.dnethack"
- rc_fmt = "%ruserdata/%N/%n/%s/%n.dnethackrc"
- inprogressdir = "%rinprogress-dnh/"
- extra_info_file = "%rextrainfo-dnh/%n.extrainfo"
- max_idle_time = 3600
- # The place where ttyrecs are stored for this game.
- # If this is not defined, ttyrecs are not saved for this game.
- # Leaving this undefined also means the games cannot be spectated.
- ttyrecdir = "%ruserdata/%N/%n/%s/ttyrec/"
- # back up savefile
- commands = cp "/dnethackdir/save/%u%n.gz" "/dnethackdir/save/%u%n.gz.bak",
- mkdir "%ruserdata/%N/%n/%s",
- mkdir "%ruserdata/%N/%n/%s/dumplog",
- mkdir "%ruserdata/%N/%n/%s/ttyrec",
- ifnxcp "/dgl-default-rcfile.%s" "%ruserdata/%N/%n/%s/%n.%src",
- # set NETHACKOPTIONS to point to the rcfile
- setenv "NETHACKOPTIONS" "@%ruserdata/%N/%n/%s/%n.dnethackrc",
- # set up nethack mail stuff, assuming it's compiled with it...
- setenv "MAIL" "/mail/%n",
- setenv "SIMPLEMAIL" "1",
- # don't let the mail file grow
- unlink "/mail/%n"
- }
- # FIQhack
- #
- DEFINE {
- game_path = "/fiqhackdir/fiqhack"
- game_name = "fiqhack"
- short_name = "fh"
- game_args = "/fiqhackdir/fiqhack", "-H", "/fiqhackdir/data", "-U", "%ruserdata/%N/%n/fiqhack"
- spooldir = "/mail/"
- rc_template = "/dgl-default-rcfile.fh"
- rc_fmt = "%ruserdata/%N/%n/%g/%n.fhrc"
- inprogressdir = "%rinprogress-fh/"
- extra_info_file = "%rextrainfo-fh/%n.extrainfo"
- max_idle_time = 3600
- # The place where ttyrecs are stored for this game.
- # If this is not defined, ttyrecs are not saved for this game.
- # Leaving this undefined also means the games cannot be spectated.
- ttyrecdir = "%ruserdata/%N/%n/%g/ttyrec/"
- # back up savefile
- # commands = cp "/fiqhackdir/save/%u%n.gz" "/fiqhackdir/save/%u%n.gz.bak",
- # set NETHACKOPTIONS to point to the rcfile
- commands = setenv "NH4SERVERUSER" "%n",
- mkdir "%ruserdata/%N/%n/%g",
- mkdir "%ruserdata/%N/%n/%g/ttyrec",
- # set up nethack mail stuff, assuming it's compiled with it...
- setenv "MAIL" "/mail/%n",
- setenv "SIMPLEMAIL" "1",
- # don't let the mail file grow
- unlink "/mail/%n"
- }
- # Fourk
- #
- DEFINE {
- game_path = "/fourkdir/nhfourk"
- game_name = "nhfourk"
- short_name = "4k"
- game_args = "/fourkdir/nhfourk", "-U", "%ruserdata/%N/%n/nhfourk"
- spooldir = "/mail/"
- rc_template = "/dgl-default-rcfile.4k"
- rc_fmt = "%ruserdata/%N/%n/%g/%n.4krc"
- inprogressdir = "%rinprogress-4k/"
- extra_info_file = "%rextrainfo-4k/%n.extrainfo"
- max_idle_time = 3600
- # The place where ttyrecs are stored for this game.
- # If this is not defined, ttyrecs are not saved for this game.
- # Leaving this undefined also means the games cannot be spectated.
- ttyrecdir = "%ruserdata/%N/%n/%g/ttyrec/"
- # back up savefile
- # commands = cp "/fiqhackdir/save/%u%n.gz" "/fiqhackdir/save/%u%n.gz.bak",
- # set NETHACKOPTIONS to point to the rcfile
- commands = setenv "NH4SERVERUSER" "%n",
- mkdir "%ruserdata/%N/%n/%g",
- mkdir "%ruserdata/%N/%n/%g/ttyrec",
- # set up nethack mail stuff, assuming it's compiled with it...
- setenv "MAIL" "/mail/%n",
- setenv "SIMPLEMAIL" "1",
- # don't let the mail file grow
- unlink "/mail/%n"
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement