#!/bin/sh

# Copyright (C) 2002-2016 RealVNC Ltd.  All rights reserved.

usage()
{
    echo "VNC(R) Server Setup Utility 5.3.2 (RasPi) (r22164)"
    echo "Copyright (C) 2002-2016 RealVNC Ltd."
    echo "See http://www.realvnc.com for information on VNC."
    echo
    echo "Usage: vncinitconfig ACTION..."
    echo
    echo "Actions:"
    echo "  -install-defaults  Perform all steps below supported for this platform"
    echo "  -pam               Enable system authentication using PAM"
    echo "  -xstartup          Create default /etc/vnc/xstartup"
    echo "  -config            Create default /etc/vnc/config"
    echo "  -keygen            Regenerate private key"
    echo "  -licensing         Clear up old licensing files after upgrade"
    echo "  -service-daemon    Install init file for VNC Server in Service Mode daemon"
    echo "  -virtual-daemon    Install init file for VNC Server in Virtual Mode daemon"
    echo "  -enable-print      Set up CUPS for VNC print backend"
    echo "  -register-SELinux  Set up SELinux modules to allow services to work normally"
    echo "                     This is not performed as part of install-defaults"
}

# Set sane and safe umask or nothing below works
umask 022

# Initialise the X Server configuration file location. NB/ We omit paths based
# on environment variables that don't exist and also per-user config files.
init_xserver_config_path()
{
    if [ -z "$HOSTNAME" ]; then
        hn=`uname -n`
    else
        hn=$HOSTNAME
    fi

    paths=/etc/X11/xorg.conf
    if [ -n "$XF86CONFIG" ]; then
        paths="$paths $XF86CONFIG /etc/X11/$XF86CONFIG /usr/X11R6/etc/X11/$XF86CONFIG"
    fi
    paths="$paths /etc/X11/XF86Config-4 /etc/X11/XF86Config /etc/XF86Config /usr/X11R6/etc/X11/XF86Config.$hn /usr/X11R6/etc/X11/XF86Config-4 /usr/X11R6/etc/X11/XF86Config $paths /usr/X11R6/lib/X11/XF86Config.$hn /usr/X11R6/lib/X11/XF86Config-4 /usr/X11R6/lib/X11/XF86Config"

    for xserver_config_path in $paths; do
        [ -r "$xserver_config_path" ] && return
    done
    xserver_config_path=
}


# Get an attribute either using xset, or from the X Server config file located
# using the above function. The variable $attr_value is set to the value of the
# attribute. The variable $attr_location indicates where the value comes from.
get_attr_from_xserver_config()
{
    xset_pattern="$1"       # Look for this in "xset q" output
    config_pattern="$2"     # Look for this in $xserver_config_path
    attr_location=
    attr_value=

    # First try to get the information via "xset q"; this will work if
    # we're running under a properly-configured X Server. Solaris awk
    # doesn't handle variables introduced with -v, so we have to let the
    # shell handle variable expansion, which is a little uglier.
    if [ -n "$xset_pattern" ]; then
        attr_value=`
            xset q 2>/dev/null |
            $awk "BEGIN { found = 0 }
                  /^$xset_pattern\$/ { found = 1; next }
                  found == 1  { sub(\"^ *\",\"\"); print; exit }"`
        if [ -n "$attr_value" ]; then
            attr_location="xset"
            return
        fi
    fi

    # If that fails, try to get the information from the X Server config file.
    # NB/ The triple backslashes are required because the ` invokes a subshell
    # that reduces \\\$1 to \$1, which is then reduced to $1 before passing it
    # to awk.
    if [ -n "$xserver_config_path" -a -n "$config_pattern" ]; then
        attr_value=`
            $awk "BEGIN { first=1 }
                  \\\$1==\"$config_pattern\" {
                      gsub(/^\"|\"\$/, \"\", \\\$2);
                      printf \"%s%s\", (first==1) ? \"\" : \",\", \\\$2;
                      first = 0
                }" $xserver_config_path`
        if [ -n "$attr_value" ]; then
            attr_location="$xserver_config_path"
            return
        fi
    fi
}

strip_user_specfic_paths()
{
    # Filter user-specific paths
    sed -e 's%\(^\|,\)'$HOME'[^,]*%%g' | sed -e 's%^,%%'
}


# Copy $1 to $1.tmp
backup()
{
    [ -f $1 ] && { mv $1 $1.tmp && cp -p $1.tmp $1; }
}


# If $1.tmp exists, compare it to $1. If they differ, print a message and move
# $1.tmp to $1.old, otherwise replace the original file with the backup (so that
# all file attributes are preserved if possible)
verify()
{
    if [ -f $1.tmp ]; then
        if diff $1 $1.tmp >/dev/null 2>&1; then
            mv $1.tmp $1
        else
            mv $1.tmp $1.old
            echo "Original config file \"$1.old\" preserved"
        fi
    fi
}


# mktemp isn't guaranteed by POSIX, and isn't available on AIX 5.2, nor on stock
# HP-UX, nor on Solaris before 5.10.  mktemp2 takes as its first argument a
# mktemp format string, and as its second argument a fallback name.
mktemp2()
{
  if which mktemp >/dev/null 2>&1; then
    mktemp "$1"
  else
    echo "$2"
  fi
}


# Set options to be applied at installation time.
# The exact set of options is platform-dependent.
set_install_options()
{
    init_install=1

    # Basic options for most platforms
    init_pam=1
    init_xstartup=1
    init_config=1
    init_keygen=1
    init_licensing=1
    init_updates=1
    init_service_daemon=1;
    init_virtual_daemon=1;
    init_print=1
    init_icons=1
    init_seLinux=0

    # Tweaks for specific platforms
    SYSNAME=`uname -s`
    case "$SYSNAME" in
        AIX)
            # Automatic PAM configuration not supported on AIX
            init_pam=0
            ;;
    esac
}


init_pam=0
init_xstartup=0
init_config=0
init_keygen=0
init_licensing=0
init_updates=0
init_service_daemon=0
init_virtual_daemon=0
init_print=0
init_icons=0
init_seLinux=0
inittype_arg=

# Generic flag for steps that only happen at install time,
# and are not intended to be run separately by a user.
init_install=0


# Sanitise the environment in case we're running under su or sudo
# without the - or -i options, respectively.
HOME=~root


# Parse command-line parameters
for i in $@; do
    case $i in
        "--install-defaults" | "-install-defaults")
            set_install_options
            ;;
        "--pam" | "-pam")
            init_pam=1
            ;;
        "--xstartup" | "-xstartup")
            init_xstartup=1
            ;;
        "--config" | "-config")
            init_config=1
            ;;
        "--keygen" | "-keygen")
            init_keygen=1
            ;;
        "--licensing" | "-licensing")
            init_licensing=1
            ;;
        "--updates" | "-updates")
            init_updates=1
            ;;            
        --init-type=* | -init-type=* )
            inittype_arg=`echo "$i" | sed -e 's/^-\{0,1\}-init-type=//'`
            ;;
        "--service-daemon" | "-service-daemon")
            init_service_daemon=1;
            ;;
        "--virtual-daemon" | "-virtual-daemon")
            init_virtual_daemon=1;
            ;;
        "--enable-print" | "-enable-print")
            init_print=1
            ;;
        "--install-icons" | "-install-icons")
            init_icons=1
            ;;
        "--register-SELinux" | "-register-SELinux")
            init_seLinux=1
            ;;
        "--help" | "-help")
            usage
            exit
            ;;
    esac
done

if [ "$init_pam" = "0" -a "$init_config" = "0" -a "$init_xstartup" = "0" \
     -a "$init_keygen" = "0" -a "$init_licensing" = "0" \
     -a "$init_service_daemon" = "0" -a "$init_virtual_daemon" = "0" \
     -a "$init_print" = "0" -a "$init_icons" = "0" -a "$init_seLinux" = "0" ]; then
    usage
    exit 1
fi


# Set up defaults and platform-specific overrides.
### for PAM:
pamconfig="auth required pam_unix.so
account required pam_unix.so"
username=\$USER
### dirs and utils:
: ${ETCVNCDIR=/etc/vnc}
bin=/usr/local/bin
cups_backend_dir=/usr/lib/cups/backend
libvnc=/usr/local/lib/vnc
share=/usr/share
sharevnc=$share/vnc
awk=awk
which_str=which
### moduledirname is used for network installs
moduledirname=`dirname "$0"`
moduledirname=`(cd "$moduledirname" && pwd)`
installed_binary()
{
  if [ -f $bin/$1 ]; then
    echo $bin/$1
  elif [ -f $moduledirname/$1 ]; then
    echo $moduledirname/$1
  elif which $1 >/dev/null 2>&1; then
    which $1 2>&1;
    echo "WARNING: $1 not installed, but using version from \$PATH" >&2
  else
    echo $bin/$1
  fi
}

SYSNAME=`uname -s`
case "$SYSNAME" in
    Linux)
        libvnc=/usr/lib/vnc
        bin=/usr/bin

        # We make sure we find systemctl, chkconfig, and update-rc.d:
        PATH=$PATH:/sbin:/usr/sbin
        ;;
    SunOS)
        username=\$LOGNAME
        # We modify the path in order to make sure we find xset and svcadm:
        PATH=$PATH:/usr/openwin/bin:/usr/sbin
        awk=nawk
        which() { ksh whence -p "$@"; }
        which_str="ksh whence -p"

        # On Solaris, packages are "relocatable", ie with pkgadd -a none -d *.pkg
        # they can be installed to a custom directory - so we do an extra check
        # to find where the target directory is
        bin="$moduledirname"
        if [ -d "$moduledirname/../lib/vnc" ]; then
          libvnc=`(cd "$moduledirname/../lib/vnc" && pwd)`
        fi
        ;;
    HP-UX)
        username=\$LOGNAME
        # We modify the path in order to make sure we find xset:
        PATH=$PATH:/usr/bin/X11
        which() { command -v "$@"; }
        which_str="command -v"
        ;;
    AIX)
        if [ "$init_pam" = "1" ]; then
            echo "Automatic PAM configuration not supported on this platform"
            init_pam=0
        fi
        ;;
    FreeBSD)
        ETCVNCDIR=/usr/local/etc/vnc
        libvnc=/usr/local/libexec/vnc
        share=/usr/local/share
        sharevnc=$share/vnc
        cups_backend_dir=/usr/local/libexec/cups/backend
        ;;
    *)
        echo "Unknown platform"
        exit 1
        ;;
esac



# Configuration steps to be performed only at install time
if [ "$init_install" = "1" ]; then
    # Needed for 64-bit version of RHEL4, since CUPS is configured
    # to use printer backends in /usr/lib64... instead of /usr/lib...
    if [ "$SYSNAME" = Linux ]; then
        cups64_backend_dir=/usr/lib64/cups/backend
        if [ -d "$cups64_backend_dir" ]; then
            # On some systems, lib and lib64 are the same location, so
            # avoid creating the symlink if the file already exists in lib64.
            if [ '!' -e "$cups64_backend_dir/vnc" ]; then
                ln -s "$cups_backend_dir/vnc" "$cups64_backend_dir/vnc"
            fi
        fi
    fi
fi


# Required for appindicator support
## Note that -e fails on some solaris machines {file exists check}
## so we have to use -f                        {is regular file check}
if [ "$init_icons" = 1 ]; then
  mkdir -p "$share/icons/hicolor/48x48/apps/"
  for f in $moduledirname/icons/vnc*.png ; do
    filename=`basename "$f"`
    if [ -f "$f" ] && \
       [ ! -f "$share/icons/hicolor/48x48/apps/$filename" ]; then
      echo "Copying $moduledirname/icons/$filename to $share/icons/hicolor/48x48/apps/$filename"
      cp -f "$moduledirname/icons/$filename" "$share/icons/hicolor/48x48/apps/$filename"
      chmod -f 0444 "$share/icons/hicolor/48x48/apps/$filename"
    fi
  done
fi


if [ "$init_print" = 1 ]; then
    chmod 0700 "$cups_backend_dir/vnc"
    if [ "$SYSNAME" = SunOS ]; then
        sun_cups_dir=/opt/sfw/cups/lib/cups
        solaris_ver=`uname -r | sed 's/^5\.//'`
        if [ -d "$sun_cups_dir" ]; then
            ln -s "$cups_backend_dir/vnc" "$sun_cups_dir/backend/vnc"
        elif [ "$solaris_ver" -ge 11 ]; then
            : # It's OK, Solaris 11 uses the normal /usr/lib/cups/backend
        else
            echo "CUPS installation not found at $sun_cups_dir."
            echo "Please install CUPS from the Solaris Companion CD, then run"
            echo "  vncinitconfig -enable-print"
        fi
    fi
fi


# Initialise the PAM configuration.
if [ "$init_pam" = "1" ]; then

    # The "pamcomment" string here should not be changed, because the uninstall
    # scripts on all our platforms hunt for it in order to know we're removing
    # the correct files.  For VNC 4.6.x and earlier, pamcomment was "Default VNC
    # Enterprise Edition PAM configuration".
    pamcomment="# Default VNC Server PAM configuration."
    pamwarning="# This file is automatically generated. DO NOT EDIT.
# To make changes, create a file named vncserver.custom in this
# directory and create or edit $ETCVNCDIR/config.d/common.custom to
# add 'PamApplicationName=vncserver.custom'"
    pamlocation=/etc

    case "$SYSNAME" in
        Linux)
            # This hack is needed to work around the fact that there are 101 places
            # libraries live on Linux, unguessable, and not even symlinked from some
            # traditional location like /lib or /usr/lib.
            ldd_line=`ldd \`installed_binary Xvnc\` 2>/dev/null | grep '/libc\.' | head -n 1`
            libsecurity=`dirname \`echo "$ldd_line" | $awk '{ if ($2 == "=>") print $3}'\` 2>/dev/null`/security
            if [ -f $libsecurity/pam_selinux.so ]; then pamconfig="$pamconfig
session required pam_selinux.so"; fi
            if [ -f $libsecurity/pam_umask.so ]; then pamconfig="$pamconfig
session optional pam_umask.so"; fi
            if [ -f $libsecurity/pam_limits.so ]; then pamconfig="$pamconfig
session optional pam_limits.so"; fi
            pamconfig="$pamconfig
session required pam_unix.so"
            if [ -f $libsecurity/pam_systemd.so ]; then pamconfig="$pamconfig
session optional pam_systemd.so"; fi
            if [ -f $libsecurity/pam_env.so ]; then pamconfig="$pamconfig
session optional pam_env.so"; fi
            ;;
        SunOS)
            if [ -f /usr/lib/security/pam_unix.so.1 ]; then
                # Solaris 5.8, 5.9
                pamconfig="auth required pam_unix.so.1
account required pam_unix.so.1
session required pam_unix.so.1"
            elif [ -f /usr/lib/security/pam_unix_auth.so.1 ] &&\
                 [ -f /usr/lib/security/pam_authtok_get.so.1 ] &&\
                 [ -f /usr/lib/security/pam_unix_cred.so.1 ] &&\
                 [ -f /usr/lib/security/pam_unix_session.so.1 ]; then
                # Solaris 5.10, 5.11
                pamconfig="auth required pam_authtok_get.so.1
auth required pam_unix_auth.so.1
auth required pam_unix_cred.so.1"
                if [ -f /usr/lib/security/pam_unix_acct.so.1 ]; then
                    # Solaris 5.11
                    pamconfig="$pamconfig
account required pam_unix_acct.so.1"
                elif [ -f /usr/lib/security/pam_unix_account.so.1 ]; then
                    # Solaris 5.10
                    pamconfig="$pamconfig
account required pam_unix_account.so.1"
                fi
                pamconfig="$pamconfig
session required pam_unix_session.so.1"
            else
                echo "Can't find required PAM modules"
                exit 1
            fi
            ;;
        HP-UX)
            pamconfig="auth required libpam_unix.so.1
account required libpam_unix.so.1
session required libpam_unix.so.1";
            ;;
        FreeBSD)
            pamlocation=/usr/local/etc
            pamconfig="$pamconfig
session required pam_unix.so";
            if [ '!' -d "$pamlocation/pam.d" ]; then
              mkdir -p "$pamlocation/pam.d" -m 0755
              chown root:wheel "$pamlocation/pam.d"
            fi
            ;;
    esac

    inited=0

    # New-style /etc/pam.d configuration. If a configuration for vncserver
    # already exists, then preserve it as .old if it differs.
    if [ -d $pamlocation/pam.d ]; then
        cfg=$pamlocation/pam.d/vncserver
        echo "Updating $cfg"
        backup $cfg
        cat > $cfg <<EOF
$pamcomment
$pamwarning
$pamconfig
EOF
        chmod 644 $cfg
        verify $cfg
        inited=1
    fi
    # Old-style /etc/pam.conf configuration. We don't update existing config.
    if [ -f $pamlocation/pam.conf ]; then
        printf "%s" "Updating $pamlocation/pam.conf... "
        pamwarning="# These rules are automatically generated. DO NOT EDIT.
# To make changes, create rules for an application named vncserver.custom
# and create or edit $ETCVNCDIR/config.d/common.custom to add
# 'PamApplicationName=vncserver.custom'"
        # Remove any old stuff from the file.  This awk script is deliberately
        # different from the awk script in the package uninstall snippets: the
        # uninstall snippets only remove blocks exactly matching the block we
        # create, but this one goes further and removes every "vncserver" line
        tmpfile=`mktemp2 /tmp/vnc.pam.XXXXXX "$pamlocation/pam.vnctmp"`
        if $awk '/^# Default VNC .* PAM configuration/ { comm = 1; }
                 /^#/ && comm == 1 { next }
                 /^ *vncserver / { comm = 0; next }
                 1 { comm = 0; print }' $pamlocation/pam.conf > $tmpfile; then
          if diff $pamlocation/pam.conf $tmpfile >/dev/null 2>&1; then :; else
            printf "%s" "removing old config... "
          fi
        else
          cat $pamlocation/pam.conf > $tmpfile
        fi
        # Prepend 'vncserver ' to each line
        pamconfig=`echo "$pamconfig" | sed -e's/^/vncserver /'`
        if grep '^ *vncserver ' $tmpfile >/dev/null 2>&1; then
          echo "skipped (error parsing $pamlocation/pam.conf)"
          echo "WARNING: please update $pamlocation/pam.conf manually to match the defaults below:"
          echo "$pamconfig" | sed -e's/^/   /'
        else
          if [ $inited = 0 ]; then
            # If inited==0, add the VNC lines to pam.conf, otherwise we found
            # pam.d so we're just cleaning up pam.conf.
            cat >> $tmpfile <<EOF
$pamcomment
$pamwarning
$pamconfig
EOF
          fi
          if diff $pamlocation/pam.conf $tmpfile >/dev/null 2>&1; then :; else
            cp -p $pamlocation/pam.conf $pamlocation/pam.conf.vncbak
            cat $tmpfile > $pamlocation/pam.conf
          fi
          echo done
        fi
        rm $tmpfile
        inited=1
    fi
    [ $inited = 1 ] || \
        (echo "Can't find PAM configuration files"; exit 1)

    if [ "`uname -s`" = Linux ]; then
        # Search for any central configuration in the locations RedHat/Debian-
        # derived distros use, and alert user if it looks better than the
        # vanilla config we just installed
        extra_modules=`(grep -v -e 'pam_\(deny\|permit\|unix\|succeed\|env\)\|optional\|^[[:space:]]*#\|^[[:space:]]*$' \
                             /etc/pam.d/common-auth /etc/pam.d/password-auth \
                             /etc/pam.d/system-auth \
                        | sed -e 's/[^:]*://' \
                        | awk '$1 != "auth" { next; }
                               {
                                 if ($2 ~ /^\[/) {
                                   for(i=2;i<=NF;++i) {
                                     if ($i ~ /]$/) { ++i; print "   " $i; break; }
                                   }
                                 } else {
                                   print "   " $3;
                                 }
                               }' \
                        | uniq)2>/dev/null`
        if [ -n "$extra_modules" ] && \
           [ "`find /etc/pam.d -name 'vncserver.*' '!' -name vncserver.old -print \
              | wc -l`" -lt 1 ]; then
          echo
          echo "NOTICE: common configuration in /etc/pam.d contains the following modules:"
          echo "$extra_modules"
          echo "The default vncserver PAM configuration only enables pam_unix. See "
          echo "\`man vncinitconfig' for details on any manual configuration required."
          echo
        fi
    fi
fi




# Initialise $ETCVNCDIR/xstartup
if [ "$init_xstartup" = "1" ]; then
    mkdir -p $ETCVNCDIR
    cfg=$ETCVNCDIR/xstartup
    backup $cfg
    cat  > $cfg <<EOF
#!/bin/sh

# Default VNC Server (Virtual-Mode) start-up script.
#
# This file is automatically generated. DO NOT EDIT.
# To override settings in this file, create or edit $ETCVNCDIR/xstartup.custom
# and make it executable. This will then be executed instead of this file.

# The following keymap code is designed to support VNC Viewers with US and
# Western European keyboards. If you expect VNC Viewers to have different
# keyboards, override this file as described above, making sure to preserve all
# this code. You can then change the variable assignment appropriately. For
# example, setting:
#
# targetkbMap="pc+cz+ru:2+gr:3+fr:4"
#
# ...provides support for Czech, Russian, Greek and French keyboards.
targetkbMap="pc+us+us(intl):2"
if $which_str setxkbmap > /dev/null 2>&1 && \\
  $which_str sed > /dev/null 2>&1 && \\
  $which_str xkbcomp > /dev/null 2>&1 ; then
  setxkbmap -symbols "\$targetkbMap" -print | sed -n '/xkb_keymap {/,\$p' | xkbcomp - \$DISPLAY
fi
# End of keymap code

[ -r \$HOME/.Xresources ] && xrdb \$HOME/.Xresources
xsetroot -solid grey

if [ -f /usr/bin/gnome-session ]; then
  # Some gnome session types won't work with Xvnc, try to pick a sensible 
  # default.
  for SESSION in "ubuntu-2d" "2d-gnome" "gnome-classic" "gnome-fallback"; do
    if [ -f /usr/share/gnome-session/sessions/\$SESSION.session ]; then
      DESKTOP_SESSION=\$SESSION; export DESKTOP_SESSION
      GDMSESSION=\$SESSION; export GDMSESSION
      STARTUP="/usr/bin/gnome-session --session=\$SESSION"; export STARTUP
    fi
  done
fi

unset SESSIONBIN
XTERM_COMMAND="xterm -geometry 80x24+10+10 -ls"

if   [ -x /etc/X11/Xsession ]; then SESSIONBIN="/etc/X11/Xsession"
elif [ -x /etc/X11/xdm/Xsession ]; then SESSIONBIN="/etc/X11/xdm/Xsession"
elif [ -x /etc/X11/xinit/Xsession ]; then SESSIONBIN="/etc/X11/xinit/Xsession"
elif [ -x /etc/X11/gdm/Xsession ]; then SESSIONBIN="/etc/X11/gdm/Xsession gnome-session"
elif [ -x /etc/gdm/Xsession ]; then SESSIONBIN="/etc/gdm/Xsession gnome-session"
elif [ -x /etc/kde/kdm/Xsession ]; then SESSIONBIN="/etc/kde/kdm/Xsession"
elif [ -x /usr/dt/bin/Xsession ]; then
  XSTATION=1 
  DTXSERVERLOCATION=local
  export XSTATION DTXSERVERLOCATION
  SESSIONBIN="/usr/dt/bin/Xsession"
elif [ -x /usr/dt/bin/dtsession ]; then SESSIONBIN="/usr/dt/bin/dtsession"
elif $which_str twm > /dev/null 2>&1; then
  \$XTERM_COMMAND &
  SESSIONBIN="twm"
fi

if [ "x\${SESSIONBIN}" = "x" ]; then
  echo "No session located; just starting a terminal"
  \$XTERM_COMMAND
  echo "Terminal closed with return code \$?"
else
  echo "Starting session: \$SESSIONBIN"
  \$SESSIONBIN
  echo "Session terminated with return code \$?"
fi

vncserver-virtual -kill \$DISPLAY
EOF
    verify $cfg
    chmod a+x $cfg
fi

# Initialise $ETCVNCDIR/{config,cacerts.pem,vncelevate.cfg} and server symlinks
if [ "$init_config" = "1" ]; then
    init_xserver_config_path
    mkdir -p $ETCVNCDIR
    cacerts=$ETCVNCDIR/cacerts.pem
    backup $cacerts
    cat > $cacerts <<END_OF_CERTS
-----BEGIN CERTIFICATE-----
MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG
EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA
n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc
biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp
EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA
bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu
YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB
AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW
BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI
QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I
0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni
lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9
B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv
ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo
IhNzbM8m9Yop5w==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG
9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB
CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97
nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt
43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P
T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4
gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO
BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR
TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw
DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr
hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg
06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF
PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls
YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH
MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG
9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI
2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx
1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ
q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz
tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ
vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP
BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV
5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY
1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4
NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG
Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91
8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe
pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl
MrY=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL
MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug
RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm
+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW
PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM
xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB
Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3
hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg
EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF
MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA
FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec
nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z
eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF
hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2
Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep
+OkuE6N36B9K
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG
EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg
R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9
9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq
fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv
iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU
1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+
bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW
MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA
ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l
uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn
Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS
tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF
PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un
hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV
5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB
mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT
MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s
eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv
cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ
BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0
BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz
+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm
hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn
5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W
JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL
DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC
huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw
HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB
AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB
zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN
kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH
SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G
spki4cErx5z481+oghLrGREt
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY
MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo
R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx
MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp
ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9
AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA
ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0
7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W
kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI
mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G
A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ
KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1
6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl
4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K
oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj
UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU
AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG
A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw
MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT
aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ
jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp
xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp
1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG
snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ
U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8
9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E
BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B
AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz
yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE
38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP
AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad
DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME
HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G
A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp
Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1
MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG
A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL
v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8
eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq
tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd
C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa
zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB
mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH
V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n
bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG
3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs
J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO
291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS
ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd
AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx
EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT
EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp
ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz
NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH
EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE
AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD
E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH
/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy
DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh
GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR
tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA
AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE
FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX
WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu
9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr
gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo
2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI
4uJEvlz36hz1
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB
rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV
BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa
Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl
LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u
MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl
ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm
gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8
YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf
b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9
9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S
zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk
OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV
HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA
2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW
oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c
KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM
m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu
MdRAGmI0Nj81Aa6sY6A=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB
qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV
BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw
NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j
LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG
A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs
W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta
3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk
6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6
Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J
NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA
MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP
r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU
DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz
YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2
/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/
LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7
jVaMaA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB
yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp
U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW
ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0
aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL
MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln
biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1
nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex
t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz
SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG
BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+
rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/
NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E
BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH
BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv
MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE
p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y
5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK
WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ
4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N
hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB
vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp
U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W
ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe
Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX
MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0
IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y
IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh
bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF
9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH
H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H
LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN
/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT
rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud
EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw
WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs
exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4
sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+
seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz
4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+
BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR
lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3
7M2CYfE45k+XmCpajQ==
-----END CERTIFICATE-----

END_OF_CERTS
    verify $cacerts

    cfg=$ETCVNCDIR/config
    backup $cfg
    cat > $cfg <<EOF
# Default X Server command-line parameters for VNC Server.
#
# This file is automatically generated. DO NOT EDIT.
# To override settings in this file, create or edit $ETCVNCDIR/config.custom.

# Continue even if standard ports fail
-pn
EOF
    # Try to work out the font path
    printf %s "Looking for font path... "
    get_attr_from_xserver_config "Font Path:" FontPath
    if [ -n "$attr_value" ]; then
        attr_value=`echo $attr_value | strip_user_specfic_paths`
        attr_value=`echo $attr_value | sed -e "s%,$sharevnc/fonts/\$%%"`
        echo "$attr_value (from $attr_location)."
        cat >> $cfg <<EOF

# Default font path (from $attr_location)
-fp "$attr_value"
EOF
    else
        echo "not found."
    fi
    verify $cfg

    # Create $ETCVNCDIR/config.d/common with comment
    mkdir -p $ETCVNCDIR/config.d
    backup $ETCVNCDIR/config.d/common
    cat > $ETCVNCDIR/config.d/common <<EOF
# Default settings for all VNC programs.
#
# This file is automatically generated. DO NOT EDIT.
# To override settings in this file, create or edit
# $ETCVNCDIR/config.d/common.custom

EOF
    verify $ETCVNCDIR/config.d/common


# Create vncelevate.cfg
    vncelevatecfg=$ETCVNCDIR/vncelevatecfg
    backup $vncelevatecfg
    cat > $vncelevatecfg <<EOF
# Default elevation commands for VNC Server.
#
# This file is automatically generated. DO NOT EDIT.
# To override settings in this file, create or edit $ETCVNCDIR/vncelevatecfg.custom.
#
# When the process launches we rely on the fact we don't return from elevation
# command until the authentication finishes

# Uncomment the next line to add your custom command
#CUSTOM_COMMAND=

SU_LAUNCHCMD=xterm -T DESCRIPTION -e su - root -c COMMAND_SINGLE_ARG
SU_LAUNCHCMD=gnome-terminal --title DESCRIPTION --disable-factory -x su - root -c COMMAND_SINGLE_ARG
SU_LAUNCHCMD=gksu -u root -t DESCRIPTION COMMAND_SINGLE_ARG
# The old konsole commands did not use --nofork option. Please remove it if needed.
SU_LAUNCHCMD=konsole --title DESCRIPTION --nofork -e su - root -c COMMAND_SINGLE_ARG
#SU_LAUNCHCMD=kdesu -u root -c COMMAND_SINGLE_ARG

SUDO_LAUNCHCMD=gksudo -D DESCRIPTION -- COMMAND
SUDO_LAUNCHCMD=kdesudo --comment DESCRIPTION -- COMMAND
SUDO_LAUNCHCMD=xterm -T DESCRIPTION -e sudo COMMAND
SUDO_LAUNCHCMD=gnome-terminal --title DESCRIPTION --disable-factory -x sudo COMMAND
# The old konsole commands did not use --nofork option. Please remove it if needed.
SUDO_LAUNCHCMD=konsole --title DESCRIPTION --nofork -e sudo COMMAND
EOF
    verify $vncelevatecfg
    if [ -f $ETCVNCDIR/vncelevatecfg.custom ] ; then
      (grep '$COMMAND' $ETCVNCDIR/vncelevatecfg.custom) 2>/dev/null >&2 \
      && echo 'WARNING: old vncelevatecfg.custom found. Update with new syntax in vncelevatecfg!'
    fi

    for f in \
        get_primary_ip4 \
        vncelevate \
    ; do
        rm -f $ETCVNCDIR/$f
        ln -s $libvnc/$f $ETCVNCDIR
    done

    # Link vncserver -> vncserver-virtual
    rm -f $bin/vncserver
    if [ -f $bin/vncserver-virtual ]; then ln -s vncserver-virtual $bin/vncserver; fi
fi

# Initialise RSA keys for encrypted service-mode sessions.
if [ "$init_keygen" = "1" ]; then
    `installed_binary vncserver-x11` -generatekeys
fi

# Generate update notification ID
if [ "$init_updates" = "1" ]; then
    `installed_binary vncserver-x11` -createUpdateId
fi

install_raspi_license()
{
    license="/tmp/RaspberryPi.vnclicense"
    cat > $license <<EOF
Summary=RaspberryPi
-----BEGIN REALVNC LICENSE V1-----
GIdYqYqAqtCIsZh5FHrRd+9sX6wa1EFZ6XSV72TUqVFYiOr85AsiX9IpxqgD7vOn
mz0pvsjupnQX1y4hI12DDGaOQGZukj5LNkX1gwA4gMS7a3Fiku8lcG5Ul8OtEcaZ
3B2I1/hEMzkgwNyfh3QPgwcTeGkgvbbRjYMxQUaj5AfpN+hUB5hwc47SFtYbNnP6
b8DNyMe7T2MD87xjPuaHJVOEjg0ZD0R+YOrdba2PFrF6XqnyZfBYcJ7Ro1JmVF6Q
V7Q5F9QNRUaamrXXbxOIlhEWnTCT4O/baV1Ls+0cdlrCy9w8raxbnxGsBRqgN1dI
D/4mBboLjC2ygvZDzlu25a74chAt9l9ab3Mh5YRsZGd283wTRDbdw+ZimIdjNU/U
+e8esjYyDqKQgQrxif02zbWsPyBGgw2ypFRRsw+0RsAVTWeLTmEtCVl8TGt+pCXJ
6luim9dfmzk6fWytxrEspZnav3w2nE9wZknYI0K1VJNN/DUD8ixCBrBREC3SzMvq
rT3hNHHc27hlWj9JX5E6Ej+nb2Jcrs+FUrXlbcnfujCHTNrkYeAdPHZv4xcPiJ9C
GKOEJdvS9MDAr/JfHUknocrXmALj2wTwN9v4vdZ8ws9jU/Ym64SW7fNqn4ePs5mW
9QitjuVs4KId2FPDLcCqvdO1h96RNRpKLuPQPBiUyiE=
-----END REALVNC LICENSE V1-----

EOF
    echo
    echo "Installing Raspberry Pi license (VNC Personal)"
    echo "Please note that this is only valid for non-commercial use on Raspberry Pi devices."
    echo "See https://www.realvnc.com/raspberrypi for further information."
    `installed_binary vnclicense` -add $license
    rm -f $license
    echo
}

if [ "$init_licensing" = "1" ]; then
    `installed_binary vnclicense` -check >/dev/null # delete old sockets
    if [ -d /var/run/.Xvnc4EE ]; then
        (rmdir /var/run/.Xvnc4EE || chmod 1755 /var/run/.Xvnc4EE) 2>/dev/null
    fi
    if [ -d /tmp/.Xvnc4EE ]; then
        (rmdir /tmp/.Xvnc4EE || chmod 1755 /tmp/.Xvnc4EE) 2>/dev/null
    fi
    mkdir -m 01777 -p /tmp/.vncserver-license

    case `uname -m` in
	arm*)
	    install_raspi_license
	    ;;
    esac
fi

install_init_script()
{
    start_pri=20
    stop_pri=80
    init_d=/etc/init.d
    path=/bin:/usr/bin
    inittype=
    case "$SYSNAME" in
        Linux)
            if [ -d /run/systemd/system ]; then
              inittype=systemd
            elif [ -d $init_d ]; then
              inittype=SysV
            fi
            ;;
        HP-UX)
            # HP-UX uses /sbin/init.d, and has 3-digit priority codes
            init_d=/sbin/init.d
            start_pri=${start_pri}0
            stop_pri=${stop_pri}0
            if [ -d $init_d ]; then inittype=SysV; fi
            path=$path:/usr/local/bin:/usr/bin/X11:/usr/contrib/bin/X11
            ;;
        SunOS)
            path=$path:"$bin":/usr/openwin/bin:/usr/bin/X11:/usr/X11/bin
            if [ -f /lib/svc/share/smf_include.sh ]; then
              # We use smf_include's "smf_present" function if possible - but
              # not if someone's doing a crazy install using PGK_INSTALL_ROOT
              # (ie he's installing packages onto an unbooted from a LiveCD for
              # example)
              if [ -n "$PKG_INSTALL_ROOT" ]; then
                inittype=SMF
              else
                . /lib/svc/share/smf_include.sh
                if smf_present; then
                  inittype=SMF
                fi
              fi
            fi
            if [ -z "$inittype" ] && [ -d $init_d ]; then inittype=SysV; fi
            ;;
        AIX)
            path=$path:/usr/local/bin:/usr/bin/X11
            init_d=/etc/rc.d/init.d
            if [ -d $init_d ]; then inittype=SysV; fi
            ;;
        FreeBSD)
            path=$path:/usr/local/bin
            init_d=/usr/local/etc/rc.d
            if [ -d $init_d ]; then inittype=rc.conf; fi
            ;;
    esac
    if [ -n "$inittype_arg" ]; then
      inittype=$inittype_arg
    fi
    if [ -d "/usr/X11R6/bin" ]; then
      path=$path:/usr/X11R6/bin
    fi
    extraopts=""
    if [ $1 = "vncserver-x11-serviced" ]; then
      if [ "$inittype" = SysV ]; then
        extraopts="
# This is required on some systems for X authentication to work
XAUTHLOCALHOSTNAME=localhost
export XAUTHLOCALHOSTNAME"
      elif [ "$inittype" = systemd ]; then
        extraopts="
# This is required on some systems for X authentication to work
Environment=\"XAUTHLOCALHOSTNAME=localhost\""
      fi
    fi
    prestart=""
    if [ $1 = vncserver-virtuald ] && [ "$inittype" = SysV ]; then
       prestart="vnclicense -check > /dev/null ||
        echo 'vncserver-virtuald: No suitable license found. You must apply 
                    an Enterprise license to enable connections.' >&2
    "
    fi
    if [ $1 = vncserver-x11-serviced ] && [ "$inittype" = SysV ]; then
       file=`(getent passwd root | cut -d: -f6)2>/dev/null`
       [ -z "$file" ] || file=" $file/.vnc/config.d/vncserver-x11"
       prestart="vnclicense -check > /dev/null ||
        echo 'vncserver-x11-serviced: No VNC licenses are installed. To enable connections,
    apply a license with vnclicense.  If you apply a Free license and have not
    yet specified a VNC password, please also run as root
    \`vncpasswd$file'\'. >&2
    "
    fi
    init_script=${init_d}/$1
    if [ "$inittype" = SysV ]; then
        backup $init_script
        cat > $init_script <<EOF
#!/bin/sh

# chkconfig: 2345 $start_pri $stop_pri
# description: $2
# pidfile: /var/run/$3.pid

### BEGIN INIT INFO
# Provides:          $1
# Required-Start:    \$remote_fs \$syslog \$network
# Required-Stop:     \$remote_fs \$syslog \$network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: $2
# Description:       $2
### END INIT INFO

PIDFILE=/var/run/$3.pid
PATH=$path
export PATH
[ -r /etc/default/locale ] && . /etc/default/locale 2>/dev/null
export LANG
$extraopts

case \$1 in
start)
    $prestart$3
    ;;
stop)
    if [ -r "\$PIDFILE" ] && ps -p \`cat "\$PIDFILE"\` >/dev/null; then
      kill -TERM \`cat \$PIDFILE\`
    else
      echo "No $3 process found to stop"
      exit 7
    fi
    ;;
force-reload|reload)
    if [ -r "\$PIDFILE" ] && ps -p \`cat "\$PIDFILE"\` >/dev/null; then
      kill -HUP \`cat \$PIDFILE\`
    else
      echo "No $3 process found to reload"
      exit 7
    fi
    ;;
restart)
    \$0 stop >/dev/null || true
    i=0
    while [ -r "\$PIDFILE" ] && [ \$i -lt 5 ]; do
      i=\`expr \$i + 1\`
      sleep 1
    done
    \$0 start
    ;;
try-restart)
    if \$0 status >/dev/null; then
      \$0 restart
    else
      echo "No running $3 process; service not started"
    fi
    ;;
status)
    if [ '!' -f "\$PIDFILE" ]; then
        echo "$3 is not running"
        exit 3
    elif [ '!' -r "\$PIDFILE" ]; then
        echo "Status of $3 unknown (pidfile not readable)"
        exit 4
    elif ps -p \`cat "\$PIDFILE" 2>/dev/null\` >/dev/null ; then
        echo "$3 is running"
        exit 0
    else
        echo "$3 not running but pidfile exists"
        exit 1
    fi
    ;;
*)
    echo "Usage: \$0 (start|stop|restart|status)"
    exit 1
    ;;
esac

EOF
        chmod 0755 $init_script
        echo "Installed init script for $2"
        verify $init_script
        echo "Start and stop the service with:"
        echo "  $init_script (start|stop)"
        if which chkconfig >/dev/null 2>&1; then
          echo "Use chkconfig to start or stop the service at boot time." 
        elif which update-rc.d >/dev/null 2>&1; then
          echo "Use update-rc.d to start or stop the service at boot time."
        fi

    elif [ "$inittype" = systemd ]; then
        mkdir -m 0755 -p /usr/lib/systemd/system
        init_script=/usr/lib/systemd/system/$1.service
        cat > ${init_script}.tmp <<EOF
[Unit]
Description=$2
After=network.target

[Service]
ExecStart=/usr/bin/$3 -fg
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
KillMode=process
$extraopts

[Install]
WantedBy=multi-user.target
EOF
        chmod 0644 ${init_script}.tmp
        mv ${init_script}.tmp $init_script
        systemctl daemon-reload || true
        echo "Installed systemd unit for $2"
        echo "Start or stop the service with:"
        echo "  systemctl (start|stop) $1.service"
        echo "Mark or unmark the service to be started at boot time with:"
        echo "  systemctl (enable|disable) $1.service"

    elif [ "$inittype" = rc.conf ]; then
        backup $init_script
        name=`echo $3 | tr - _`
        rcvar=`(. /etc/rc.subr; name=$name set_rcvar)`
        cat > $init_script <<EOF
#!/bin/sh

# PROVIDE: $name
# REQUIRE: DAEMON
#
# Add the following lines to /etc/rc.conf to enable the $2:
#
# ${rcvar}="YES"
#

PATH=$path
export PATH
. /etc/rc.subr

name="$name"
rcvar=\`set_rcvar\`
eval "\${rcvar}=\\\${\${rcvar}:-NO}"
command="$bin/$1"
pidfile="/var/run/$1.pid"

load_rc_config $name
run_rc_command "\$1"

EOF
        chmod 0755 $init_script
        echo "Installed rc.d script for $2"
        verify $init_script
        echo "Start and stop the service with:"
        echo "  $init_script (onestart|onestop)"
        echo "Add ${name}_enable=YES to /etc/rc.conf to start it on boot."

    elif [ "$inittype" = SMF ]; then
        if [ "`uname -r`" = 5.10 ]; then
          svc_manifest_dir=/var/svc/manifest
        else
          svc_manifest_dir=/lib/svc/manifest
        fi
        init_script="$svc_manifest_dir/application/$1.xml"
        method_script=/lib/svc/method/vncserver
        mkdir -p $svc_manifest_dir/application
        mkdir -p /lib/svc/method
        cat > $init_script <<EOF
<?xml version="1.0"?>
<!DOCTYPE service_bundle
  SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">

<service_bundle type='manifest' name='$1'>
  <service name='application/$3' type='service' version='1'>
    <create_default_instance enabled='false' />
    <single_instance />

    <dependency name='multi-user-server' grouping='optional_all'
       type='service' restart_on='none'>
      <service_fmri value='svc:/milestone/multi-user-server' />
    </dependency>
    <dependency name='network' grouping='require_all'
        restart_on='none' type='service'>
      <service_fmri value='svc:/milestone/network:default' />
    </dependency>

    <exec_method type='method' name='start'
        exec='/lib/svc/method/vncserver %m %s' timeout_seconds='15'>
      <method_context>
        <method_credential user='root' />
      </method_context>
    </exec_method>

    <exec_method type='method' name='restart' exec=':kill -HUP'
        timeout_seconds='5' />

    <exec_method type='method' name='stop' exec=':kill'
        timeout_seconds='5' />

    <template>
      <common_name>
        <loctext xml:lang='C'>$2</loctext>
      </common_name>
      <documentation> 
        <manpage title='$1' section='3' />
      </documentation>
    </template>
  </service>
</service_bundle>
EOF
        chmod 0444 $init_script
        chgrp sys $init_script
        svccfg validate $init_script
        backup $method_script
        cat > $method_script <<EOF
#!/sbin/sh

. /lib/svc/share/smf_include.sh

PATH=$path
export PATH

if [ \$# -ge 2 ]; then
  APPLICATION=\`echo "\$2" | sed -e 's/application\///'\`
fi
PIDFILE=/var/run/\$APPLICATION.pid
if [ \$# -eq 2 ] && [ start = "\$1" ] && [ -x "$bin/\$APPLICATION" ]; then
  smf_clear_env
  if [ -f "\$PIDFILE" ] && ps -p \`cat "\$PIDFILE" 2>/dev/null\` >/dev/null; then
    echo "\$APPLICATION is already running - has it been started outside SMF?"
    exit $SMF_EXIT_ERR_CONFIG
  fi
  $bin/\$APPLICATION
  exit \$?
fi

echo "Usage: \$0 start <service>"
exit 1
EOF
        chmod 0555 $method_script
        chgrp bin $method_script
        verify $method_script
        if [ -z "$PKG_INSTALL_ROOT" ]; then
          svcadm restart svc:/system/manifest-import:default || true
        fi
        echo "Installed SMF manifest for $2"
        echo "Start or stop the service with:"
        echo "  svcadm (enable|disable) application/$3"

    else
      if [ -n "$inittype" ]; then
        echo "ERROR: \"$inittype\" is not a supported init type. Enter one of SysV, systemd, rc.conf, SMF." >&2
      else
        echo "ERROR: init script for $2 not installed (no supported init system found)" >&2
      fi
    fi

    [ -f $bin/$1 ] || echo "Notice: the installed init template may need to be manually configured, as
$1 is not installed in $bin."
    echo
}

if [ "$init_seLinux" = 1 ]; then
  . /usr/lib/vnc/registerSELinuxmodules
  SELinux_installFedoraCorrection $bin
  SELinux_installModules $share/selinux/packages/realvnc $bin
fi

# Init service-mode daemon
if [ "$init_service_daemon" = 1 ]; then
    install_init_script "vncserver-x11-serviced" "VNC Server in Service Mode daemon" "vncserver-x11-serviced"
fi

# Init virtual-mode daemon
if [ "$init_virtual_daemon" = 1 ]; then
    install_init_script "vncserver-virtuald" "VNC Server in Virtual Mode daemon" "vncserver-virtuald"
fi
