Mafia Wars Autoplayer

By fuckyou Uploaded Oct 16, 2009

the source is over 100KB, syntax highlighting in the browser is too slow

// ==UserScript==
// @name    Facebook Mafia Wars Autoplayer
// @namespace   mafiawars
// @description   autoplayer for the mafia wars game I modified code from Blannies Vampire Wars script http://userscripts.org/scripts/show/36917
// @include   http://apps.facebook.com/inthemafia/*
// @include   http://apps.new.facebook.com/inthemafia/*
// @include   http://www.facebook.com/common/error.html
// @version 0.9.21
// @contributor Ronjeit Basnet [GURKHA]

// ==/UserScript==


var SCRIPT = {
  url: 'http://userscripts.org/scripts/source/43573.user.js',
  version: '0.9.21',
  build: '764',
  name: 'inthemafia',
  appID: 'app10979261223',
  ajaxPage: 'inner2',
  presentationurl: 'http://userscripts.org/scripts/show/43573',
  controller: '/remote/html_server.php?&xw_controller=',
  action: '&xw_action=',
  city: '&xw_city=',
  opponent: '&opponent_id=',
  user: '&user_id='
};

// Register debugOnOff with Greasemonkey
GM_registerMenuCommand('FB Mafia Wars Autoplayer - Turn Debugging Log On/Off', debugOnOff);
GM_registerMenuCommand('FB Mafia Wars Autoplayer - Log Filtering On/Off', logFilterOnOff);
GM_registerMenuCommand('FB Mafia Wars Autoplayer - Clear Saved Values', function() { clearSettings(); loadHome(); });
GM_registerMenuCommand('FB Mafia Wars Autoplayer - Display Stats Window', function() { toggleStats(); });

// Handle Facebook error pages.
if (location.href.indexOf('error') != -1) {
  var delay = 30;
  var p = document.createElement('p');
  var wait = function() {
    if (!delay) return back();
    p.innerHTML = 'You will automatically return to the previous page in ' +
                  delay-- + ' seconds.';
    window.setTimeout(wait, 1000);
  }
  document.body.appendChild(p);
  wait();
  return;
}

customizeLayout();

//create data uris for mini icon usage
var searchIcon = '<img src="' +
                    'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACLElEQVR42mNkgIJ12/cacLCzlTIwMtkwMzNx/Pnz58qfP3/n+Ls5LGfAAxhBxMZdBxKFBflnqirKs4oKCTAwMjIyfP' +
                    '/xk+HmvYcMj54+X/n9x4/oCD+Pv1gNWLVlp6GYiMhJQ20NVm4uDoTMfwaGf///MZy5fIPh9Zs3tf5uji1YDdi67/BSaUnJKDUFGQYmJiaw7SDd//79Z/j77x/Di9fvGO4+ePTh4+fP4mE+br8wDNh+4OhDTRVlOU' +
                    'F+XgYOdlaIAUDbQZp//vrN8OrtB4b3Hz8yPHzy1BhowDkMA3YePPZCR0NNnJebk4GdlRXsiv9A+PfvP4Yv374zfPryjeHdhw+gsLAK9nQ+js0Lewy1NZ15ebgYWFlYGFiYmcDO//P3L8M3YEB+/faD4eHTp3+ePH' +
                    '8pFuXv+R7DAGD0hasoyK1QlkeEwf//EBf8+PWL4e37jwy37z9Y7uNsF4UvGherKcnHyEtLMjAzM4MNALng5Zt3DM9fvWa4/+BhSWyIfy9OAxav28LEy81VwsvDUyolLioCcsW7Dx9/vf/4adWLl6+vXzt/qmXz+r' +
                    'WHGJmYfG7evPkFwwAYmL96IwsTI6MG0BXsQFfcjg3y+QQSNzO3OMzLL2Dz9OH9o0A/ety4ceMLVgNwAR1tbT5efv4dXDx8lk8fPTgKFPIEGvKZaAMghmgBDRHAMIRoA3AZQpIBUEN4gYbsBBny8O7tvSQbAA0TXg' +
                    '4u7g2fP33YBwCb9/irlkMH+QAAAABJRU5ErkJgggo=' +
                    '" />';

var lootbagIcon = '<img src="' +
                    'data:image/gif;base64,R0lGODlhEAAQAIQfALq3nMG8k8TAmbSvfMnFoTg3LYmEWhMSDaumeM7Lqrm0hNXStXl2Vnp4ab65jaeha4+Nery2irexgmhnW9HNrsvIpdjVurGrd9fUuktKQcK9otPQsrOwkiAfHG' +
                    'poSv///yH5BAEAAB8ALAAAAAAQABAAAAWB4CeOk1Y0UHeMrHgAUZU4Wds2gcKo9thxl0ePNUlUKoPVEGLZYDaBZK9gsTwJgcig11h4KQSHQiJscSjoRFgi2bIOsoRxPXCPDoQ4QSAeXFp4BIICAQ5tfywFAouEDh' +
                    'FtBm8Bk4xZCgoPSh8ZARcKk4UKjgiaHyoFDAaqBh4MpCIhADs=' +
                    '" />';

var tabSelectedImage = '<img src="' +
                    'data:image/gif;base64,R0lGODdhZAAyAOMQACIODyUQESYTFCkWGCwZHTMgJDckKDAdIDooLT4sMUw6QEY0OkEvNVJBSFlIUGFQWSwAAAAAZAAyAAAE/hAAIQMFwYa5+c6fxklChplT1YGq5GlgOXpnd6FsCm' +
                    '7CRfEyUa/ymwRlwxPxc3G5hJcBxsgEtjDHZ6W1I9lqR9s3xvReU1oyRjr7ZbIzFNopm7OSnVnNuDVjr3VXeSVvJngudRaAKzeGPlM4Pk1FkSSPgk1TiJYkKoycdp+ac00iKJRBpmNYZUqjeqhlIjqsf655aIZqXU' +
                    'mlJryXe4qjhE9fKj+SnZ62g79uMcEsw3K+rThOz33at2HNK9nX4DVqddC/QmNdw75nudMr6tPSoutMA+vBP/jzy3Y3jcL5SyRq0hOAgvKka2OsFUNm7BracsIMD71W1iZqMvcGiZgQ/iE8egG5DMcpZxjFjNzzjp' +
                    'kmVRLwWarCZ82UHjTxMHIYr1giSTkD1hr2ElnKTrs4Ii1ki+CmPkQGPkrqp5qWNjw+1HTmiWfWqK5+0imI5Aaieiq3KQsFFo+UkF/RtGtG8eTKSjXnEj0mLG0scrdMXcL2dE7YVEiHCsU1hJqPKrKUEnlsRuHan1' +
                    'p7xYuclh1lrUPfTuKmaINMLDJ7xTwLNhIhC1E+NovCemLsrEFjOgKShJ+R1yUu71wT0lJZ3UCs5B0kRUDq21QmyByAhN+b5zF7sIHNY7sJ6h9OB/CNU7ppkdGdLwEgczx18+zZkE89oD14C+/VD3sffbxp+dWV/l' +
                    'cfcvCpxx5QxOkWn3bOZVCfc28RoIF24zknIQAEvEcdIc51OMuG7uHTYH/UPThgABIG16GHdYDYYA8HlDBAhiLWWKKE7lVAAIQWUlDfeTN2BJ4AF/4YogU7rnEAbPXd6CCATAZXpIozYpChjCVuuGOTP9aXIZLBze' +
                    'jjjkRukKR7Mh6AT5D4+eglPlcSCWGT4xEgwZkP1kkBkRuKGZ+Z1BGwI4qE7HhAAU0uiaGWTcrpp6Axgdeon0HG16igJQxKqHZJQvrnBBlOsCR+oYpJo4VSEHDAgWp6iSifGWC6qIxXUirTqTOKKMCrud6Y6qqz1n' +
                    'njng1maCcAB5B5paAW/iRrLKYzFiChtDOquiMBBaQ5ZqbLqolitnxK4aqhKTpb7ZYxsjeooGRKi+KgB6gJawDOEllAjPFScGiu8eJzL3XJ6lurtwOMKiaRgtaH6HhLQhjvtfcKkC+yJhLc8IxqWouiARYGjK1ziL' +
                    'Lr8b+7tiqtoYhimG0A1L6baIiq7kuAAc5m+O8AIQs6cgkts2sBrzRK6yyiOCeLM9HmnoxxvwUQrbTS+77LM7MRD2CAzkY7G6+aTdeXdMJRY1pnARsgGrDVhy5pAMcAUCvo1bty7BwCquL8LNwFyM3roRIeYIDX/f' +
                    'pNHQJc/00313fvmHcPe7u7tapX+41oAQkI2rQB/ohivuPV0uaNr+dWSysA59jSLDHbN9+boeloq1oA4QQQDrrmo2NbOr6ot0rzz1jPiHm8a8OOAM0IIDBj5clePnPe9xZ/vLXKv454D2tHbEACPcCObQLSYv678w' +
                    'Qgj23e2BJud8ccB4BAtggkQF0Cw0t/79o0U57h8F4y4Dr9h1Y+AP7/S94B1oczBkjPe9jSn9XwRwD9HYp/9vvf3wKIrQGGDHb9m1nx/LaAwyXgah9sGgP8FryrYc6A4cNcAUZIv+HNzH0B4N6M1ne9AySgcgIYHv' +
                    'AYQDgDIACFIVwhCX1oQhjKMHY+fN/8EpAsHhYPcwogIuZ+mKwFhIx7CGiA/hRfN0ICWPF49/KbAXOYABQN74OxW0CGOigtBCwgAVEc3hS7+MXwhdEAY2zf0QqgRgF0MHYKiNcTDRBFEVavfX+D4/8KUMgVHvKDA1' +
                    'CkAAyYrOL1kHv3YsDabGjF2MHvUI3U5BQhKUlKxq54mfyd5uAnu0DeUAGVU4AD36hJJ5IQlgSQpapoiccNElJNVGxgAlDIADUOoJOU++IrYznLYfayh4H8Xxd5yMRjGu+TwhyhAijHxzeuUAFWXMAC1PTGH3aTew' +
                    'wAZzfJub7XKYBuCNjm2ooJTwVQx5uR3Cb3xIlOdYqTnU2LZz1fGM+8RTF2DUgmG8G5tijeMAEdtKEC/rR4AIYS8no3jCgc1QRLEG5QoIjyJh61mEtwrs+iDs0o4TY6gI6GD5XxtOEB2GgAcTJyeD9cgCYVIM8Onh' +
                    'R++tQpIXuKSliuL52JrKY4cZlO5zTAhQ2wog+LuVOi/vSoUYxkNd/5wagyr5wTXZsDrlfTD7bvnRUNZPgcgMg3+hCOhONpsraZwHcOgAEkZaQmZ5rQXDYgigYY6wfdeta4qpWu3zQeXlP5TqkKtHg81aYmCfDUDi' +
                    '4AlwlwgE4rOtnKuhGzDdgRLJsGS/gF9qkBkCUUOxpPWXL2ap69bOUSEFoBjJaRNyweRXUZ2G0W4KmQde0CHEA5B6CxAZoM7giH/lvc4xpwpH+baLzAObMDNOABNFOAAxSALeC2drnEzaxz84bX6DZgupREoxvfCM' +
                    'enBhaLshzsO73ogEi+150MkC/dhlufsUqLoZRLaADSqb/A8rO9wzMufvVL3/5qDsC0zZZOw/fUQ411qA3gXgMSat0nmpSRE9Uwh4FLSDYu4LwtDe0AMkwzvOoPAQ54gOwuzNMM/3bEHjYxiieaIRYfwMUnVq0DHH' +
                    'AoGRsQnDs1LmVxqQAjM1Ko2q3cX2Np2hMzUbsZoqcX/yrUIRfZnEgmpJKnnMsqZ7iiDsjyH0mKV51eNsOUpahxPxhi+sJ5wzSbMyHhPNwYOYCOqs3sNfPaVeZi1hnPB9BznfssgD9XMdBsjeQIGfCABaxNxmdFLp' +
                    'qbFtWr8bR47dUmcX9r6ZISbrgIAAAcs4VcHp540gao9KVBPVFRc7rUn54pW1W9TQG02o0NiAAAOw==' +
                    '" />';

var playIcon = '<img src="' +
                    'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAC+0lEQVR42l1TSU9TURT+Xt9UaIHWAqUMJY2tSIwS41QEjXFhTFy54B/wF9iUhAUJxAQTt0RJkJUxLli6c6ELNcTEKV' +
                    'GCYShWfNRHh1faN7aeexkinuTm3pt77ne+851zBPxnW1tbCVmSxxVVuU3XRKPRAK0N0zRf2ba9kEwmN/71F44O2WxWlCRpGj5x4sPXVXk9m0OlWuVvweZmJOLduDiYclzbmnNddyqVSnnHAD+3t0VFUV9ktT/336' +
                    'x8RGtLEKqiwOfz0WsD9XoDpmWhXNnH6OUhREPBZWIzxkA4gKZpM7/+FDMrn78hEg5BlmVIokgABwQZgOu5sG0HeqGIKxcGEQ6os4lEYlLY2dlJSIq6+vL1e7k9HIaqKvyzKAogLQ4B6nBcD7bjwLJs5PcKuDNyya' +
                    'ntVwYEXddn1nO7Gb1ooCXQTAAyOVl49vw5boyO4kwySYkKTEh4Xp1SsWHsVxEJtaA7HJwVjLLx9tPaZjrQ5Kdsma+AKok3//gJP/f39+N6Oo1otJPfD6uCas3E2XjXO8EwjN9ffmSjHadCqJkWahTdILGWlpag+p' +
                    'sQaGmjyC66OtsxfO0q2iMRNFGa+b0iBuJdGgFUfn/fzEXDbUEuFqNXKpex+HQJ/qZmBFpD8FwXsc4IRobTiB0yKZQMnO7u0IRKpfJ2bVtL+xWZq65QBaq1Kh48fASBysg0uHVzFD2xGC+pRZWoNw72eEfonVAsFm' +
                    'f0cjVTpsgqfVZkCY5jY35hEffu3sHQ+XNcPIdY2I7LK8F2JnhAwqyQz+cTlOvq6lZOZgAyAYhEkTURY8PMozK6ngeXgdCybBepvi7HKJcGeKcUCoUZ061ncprOGRz0gY/netRIRyCMQQ/pIXjObCwWm+Qeu5omqn' +
                    '7/i5rt3s/t6jy66PsHoNHgzcRSYZ9FeMuWaY71xePe8TAxEFlRpiVZmdBLhlwy9nn3MZMlEW3BAMKtAceq1eZsx57q7e31TkzjkTFNaBbGaTKPx5lsg4aHjzPRPjHOfwGdsIJvkkplkQAAAABJRU5ErkJgggo=' +
                    '" />';

var infoIcon = '<img src="' +
                    'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADPUlEQVR42l3Te2wMQRwH8O++aTV1WjmttueupSIedWiaqJL7QyQETdoQJyIIEsQrErlS0Wg9KooQkYq/LogSCeKt8Q' +
                    'wSjcQj+INzrfbu2nu0d1drd293ze4FZZJNdnZmPzO/38yPwn/N5/PbOY5dJwiCS9N1u64DFHSfKIrtsqycmzChxDd0PvX7xe/3MzTNNiRF7PK2dXDPX/kQjSbNsVGjMjG73IEVNWUKz6aaNVWtLy0dr/4BOju7GJ' +
                    '7n224/+VZ9/OxjWMgP3DAO+u9VyIsiKeiPDmLr+irMK8+7JstyrYGYQE8g2HjnWaen5fxT5FizkaJpVDpt2La83ASOnm7HK38ErKYhHBzAtjWVqHKObhpf4qijurt77AmJ/rx4y0UuZ8xIKAwNjaYwf+Y47HNXmE' +
                    'B9yz087IyCUTVwBIkE+nGlpVYRKKmUCofDjQe8bzztb/xghwsAAUCArEwBedkZJhDoSyChpACNxKKqUEUZrrIibK2e2ETF4/EX5Z5bFRkCC8gyARhIZKJragFOrp1tAjsO3ca9njgEhnRSGiDwEKUUHu11vaRiA/' +
                    'GgY/t1q91hhdY/gO+RQYQHFbjnlMC7ea4JrG+4idYPQeRm8CjIyQRtyYbvSxAfDy0IpYGdN6w2xxh86fuBRKTf3Ka7shjejZVp4MAttH7qI6ExyMrNRnFuJvxfA/h4kADJZPKFs/5uRYIbhkDSCIGEQm6P25kP7+' +
                    'oZaeDwfbR+F83cIKUiL4tHliziuWceCSEWa/Rc+eA52xGERtFmDozHPbMA3pXT0kDzwzRATsDYHa1r2OC0om5hcRPV29tnj0jU52n773Myy5nbBLkH7lmF8K6angaOPEBr1480oKngFQUde1zKCOpnqXmRItFY46' +
                    'XXQc+my28BlgBkJ0vL8nGiZooJ7D7zFBe7CUBWBjnOU8umYsmkkU2FBfl1JhAKhRheENouvA5Vb7/6DrJx3hQ1pFR0My886R4jaM1kyzVJkmpttiL1TzEZCMvxDb2ivuvko2/czfdBdMVEc6zQMhyLJluxucqmWF' +
                    'i1OaXI9UVFhX+LaWgzcmKUM8dxLkXV7cY3htJ9pJTbJVk+NzY/759y/gUON2pDlqRajwAAAABJRU5ErkJgggo=' +
                    '" />';

var attackIcon = '<img src="' +
                    'data:image/gif;base64,R0lGODlhDQANANU/AKJRAP/LNP/dNP/KIv2uAMmHAOyXAP/pfP/eQ7VkAfisAEA8LOWNAP+9CkgkDeejAIhIA92OAP/ODmtEDf/EAf+9ADErHF02Df/PE/y3ALVrAGMyCv/mhk9LLy' +
                    'ccFhsYGf/TJaeRO9PCav/fYqeWLP/UE//hRv+0DvC6QqeDDrWiHPecAP/GCtGeAoVXCvDcXKebSdOwWLF3CP/ic//sdvWnAIRuDWMtB3toDXYuAnU/CqJgAm9KDXBZDXtrLf///yH5BAEAAD8ALAAAAAANAA0AAA' +
                    'Z3wJ+wAxP+FiqjkkY6vnBK48HkEwl6xo4UIUCUbEJLaMbhjEASTBrd+qUGgQGLQs8UIB6hb9Co+CsPOx9CCzEBDRmJCg8FPEcoJzU1BAQ1ERo7Gi4yExc8BgYMEQk3Dg4bSisJEAkADlFCDDkfF66wFgl5PzqoQk' +
                    'EAOwo=' +
                    '" />';

var influenceIcon = '<img src="' +
                    'data:image/gif;base64,R0lGODlhEAAQAOZiAOPt8dDg5sLU2gwODlhbXCstLbTJ0VhcXa66vtLg5ePu80dLTNXj6cra3svZ38DT2snX28vW2ubv8sfX3ePt8LHEzNbk8SMnKFRdYLnIztPh6A8PENvj5rTGzX' +
                    'J7ftnn7ODs9rvP1tzp797q7+rx9MbV2dLd5JqrsdTh5xkcHNLh5+Tx9Nbh5s3b3t3q7qe5wWxydIaPk5KYmdvl6NTj6cXX3XuGiu709svc4+Pv82BqbcLV3CgrLMHT2d3q9NDc4NHh7d7r8Mzb4Ts9PuXs78LQ0z' +
                    'g/Qu33+cfP0uDr7rnK0N3o6q25vtbk6NHh5/D3+tPg5d3o7dfl7eTs79Tj5dbl6g0ODg8PDwsMDeTv89fm61FXWOHt7tfj59He43uFicfY3bjM1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +
                    'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAGIALAAAAAAQABAAAAd9gGKCg4SFhoeIiYqLRkVgEw1hVAJSAUoLglZfNUsUFgYCXCsgJEktHlg6TT8RHE' +
                    'APKCMvJllHUzMYAzE9XV4+OwBOGVFBTwAygzYaATQqCh8SDgk3MIVbVSFCIi4sJ0QEhwcQUAxaFUhDiTwlOTgdBYsXCEwpi4IbV/b6+4EAOw==' +
                    '" />';

var closeButtonIcon = '<img src="' +
                    'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAA2lJREFUOMu9VF9oW1UY/917zv3XJC7p0j4YFTTS2RJwrB' +
                    'AGe9hgT0P6KlTX+DBh6WAi00otDhZlXcKwBspo+9i8+DSHvraQMlYznViVjuYhbWY3blNzk9zk3mubP/deH0buGoJuE/SDD8453+/8zvedc74f8B8Y8zTAuXNnjxeLlUy1quPQITf6+nzs0TePvHrxg8tbz0WamJ' +
                    '4KLqd/zDWbLbAsC4ZhwLKsE7csC5SyOH0qTD759Kr1j6Tl4n3mw0tfvLb9sJAjhIBSCkopCCEghDg40zRhmiZarRYCL/qHk1/Gai/0vp5rx8lB0sJuJbj9sJDjOA6iKEIURfA8D57n0T6EEAKO45y5pv15/s7qD1' +
                    '+vrf32qM3j1HQ9/lnP79s7OUEQIEmSQ0gpBcMwYJjHRbXHlFLwPA9RFFFUqpmvZmLHuzK1wTUIoRBFEYIgoF6vIxwOY3BwECsrK8jn81AUBW63GyMjI9B1HYZhgGVZsCyL/AP5/Ww2G3MyTc5ccds2IAgCbNvG7u' +
                    '4uNjc3kclkMDo6WolGo7BtG5IkIZFIYGhoCEtLS5BlGfV63bnzuRvXRCfTQOAl6Mb+ZcuyUCwWUSqVYFkWFEXB1taWNDU1hWw2i0gkgmAwiEgkgr29Pei6jmazCUEQwPM8Go3mt3fv3pMpABQVtW6aJsrlMnRd7/' +
                    'gey8vLWFxcRDwerwDA2NiYr1arOXFVVfE4sQBUVbsHgGEBoNFoQlVVGIbhlHLQ0+k0PB6PD4BvZ2enK65pGiqVCpot68nrM4wNTdOcRzrofr8fs7OzmJ+fhyzLSKVSXRhBEKDrOjhKnpD2+b3HKKWQJKnLk8kkCo' +
                    'UCUqkUpqenEQgEMDk52YXjOA79/d6TAEABIBwO/bp+P4eenp6OdhwfH8fAwACi0ShcLhdkWcbc3BwmJiawsbGB1dXVjvs/dvSN7502fZS/I7z97sS+1+sDx3EOKBQKwTAM5PP5js2hUAgAsL6+7qxRSnDz5jdMR+' +
                    '8nZ65wK7d/abhcrn8ld2+dOeF95+yFapegfPzRRY9a3asdFI9nsYWFhQ4e2iF5iet2PH71sFLSS+1ef5q98nL/8DPp6Xe3Frmf1nINy7L/lowQFrHY58xzK//t9C32wfYf4XJZy+jGPtwuEb29nuHIe+d/xv9tfw' +
                    'FATFKTqjXpOQAAAABJRU5ErkJggg==' +
                    '" />';

var updateGoodIcon = '<img src="' +
                    'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADaElEQVR42lWTX2gcVRTGvzv/dibZmezOrLObmNrGVttKpLKWKGit+NLaB4sU8tAiRPDBFhUf+iBRKiKhvolQoQUtTf' +
                    '8kuytRWzRUCqVYaggl2+oiphZTXKPtNknTpMnu/Llzx7MRH3Lh4zAP3++ee843DHSGhkuFqVr9BYbYA2N+QpM8x1R8XU94kqZT1b2krvkJRfF8HvkiijwWR35jaWmQNQFfnhkZO1SafjZmEiAxhFYSjZ6tMJgAEx' +
                    'ECHkDwEHJI4hHUiGPgGRPJxemDK4Avhr79vXCdPyboKwaDLMtofXoLJElCJGLUI4G7YYT7AYfwSVQ/zSsQ1V/eXgEcOX129psbzCEHdFmCSsp0b0TC0CHiGB4Blghwm4z1kANBhE+eUnG3MrafDRdL0m0pFZybjG' +
                    'S1ebMiQVNkuOsfgZm2/uuAzA/IPEO3/+OH8BshjvYYqJYvv9kE2FejzNzx6x6ycoyMocHUVeTW5JDrdNEg81w9wEw9xPSyjxsk7oX4cWcqrl678kYTsOFSmL15fIrBqS/DSahIkpxMCu1r22mAAvfJcK8RoEZ1iq' +
                    'qgemVHMvrr14nX2VDxq57vvNz4cE1H29IismS2mpBWA+lcBhIEnnMDLPgT8MI5xMwm2Gb0dYL/OVl5jRWKpZeH5t3R72cUaIGHtKIglVBgaCpSTht6n5jDscmjELRShYbLaaCm3IL3N+0V83/c6WWFQnHfpXup0+' +
                    'M1AZ/eu1Bv7lxAp430vdiB0fAIHB1IqYBKMelp34bnH34JBy4exscb+/rZ1yMj74Rh+FlM64qoYU3TEEsKtQuI9Q8wPn8WdsJBLDzYRgZv5T/Cqd9GcPXOOWzLvPozK5fLXRSFrUIINwiCbOD73Zzz3SRpYc0tCs' +
                    '9F9G4+hgu3ziCf245lruFUpR9dbRy28srsSpD+Pz+cP/+453mXVU11FVkB1i7i2uwAut092LmhfyVUAz/tgywmaB4m8g99UF4FKJWK76mKethqs5BOpeFkbZSqB+g5N7EltxeR1I3K3/30v4GG/CR2dR56dxVg8M' +
                    'SJdclk61jatnN22obR0gLZCnBh+kMKUgVcyFBYBDeZx/aOg6OMa7tXAZrn5OCgbVnWftM0dxiG8ShjTDOSiZqcWRTL4WyHqblVS2k/yUPxeVfHJv4vpD6OQ8IRFmYAAAAASUVORK5CYIIK' +
                    '" />';

var pausedMessageImage = '<img src="' +
                    'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOAAAAAaCAYAAACuJFCeAAAAAXNSR0IArs4c6QAAFUBJREFUeNrtXHmUVcWd/uq+1/2abuimabohNIoedfQ4J4K4EI2OC1lm0FEmBh0wEkVFMo7GYH' +
                    'I8QYUwrSGbtAnJETWEwTVEyWQCRGMSgyK7oiBi3Gh6ofd+3f2Wfsu9t77549V9r+59972GYDLnIHVOnV5q+9VXv6/qV1W/ugLHw7CB5EIAVQAqAAQA2ABiAPoAdAohnjuO0vHgozezAIwHUANgJIAgAAvAEICoEO' +
                    'KHokjhs1WhcgClSvEEAAnABJAAEBdC7PyYhD1XKXiZEhRK2KRq5/WjrP881Z8RAEKqjQAAQ0Wh/R5UfS5XZSrVzzKVbioC9gJoB9AqhHjhGFemswCMUmMUAlCi4afrkVQTlKnGbkgI8donkHz/AuAEABMAjFXYBQ' +
                    'EQQApAHEA8WKDwNABjAIxWBR1SCAVuWlUwSPKfhBCvHqWwFwGoVqtMuRpcqEEcUu1c9NcOJMmLtf44RCpVfTI8MaBiqco3Qsk0Qv0Pqv9l6ncHzGNZmaaoWXyMmozKNRI6uEEpl0PAlJqkoyRnCCF+9wnjYLXCa6' +
                    'xGwFJtYUkBSAYLFB4LYJwCvUopnwO2A24MQL9KO9rgzBKj1QyrK3ocwMBRtuPUryuQTsCAh4RBbRUMqVgKIc7xaOZaTdGO5VCl8KtTGI7SJrGARkAo/bDU2A0BiADoJ3mdEGLtJ4iAtSqOhRDXefTmTYWRlUdA0z' +
                    'Q/b9t2bSAQGAegFnPmfA7PPvtpV6avfGU/nnxyq2PSkbxJCLH6KIQ9UZF9NIRY4BF2pRrw8qOsfyyAaghxa8FcZWUSNTVpTJ0ax2239eGKK5KKiI655Q1jlKKZx7gyVaoZvRZC3F8wVyhko6YmhbPOGsAttxzANd' +
                    'e0AogqAleSvFUI8fgnhIDjFQHHFFgdJQCZtwe0LOtaIcSJhmFMkKnUOGPChC8hHC5zZaqpSaGj408oKRkAEAYQFkIsITlfKaRU5og3CJ89VqVa+aoBjIIQV3sI+L9qEPvVShhRM2tazbZ6W0Jb0Zz6q1TdGRNXiC' +
                    'sOG8Jbb43iscci2VleiDqPbLvUQUw3gB6FRUztfSwlHzX5+LewED2/UzMFKYR4juSXtb2aE+kxGbNmkdq37dJM0H9X+5mJEOLOw5Zszpw2PP30HjVmg9r4xVRbJgDbtm3pKKRt2zIUCv3KsqxZgUBA+Mit69Jfg4' +
                    '+zT3WiLYT4H9XPf/Oxhrx1OXhJIcSvVblrlUVQofS5RlmQdQBqIMR5Hr3pceRwdaKnp+eKMWPGTAQwyTCMCXjiiTPx1a+e59utX/7yPVx33SEN3JgyxcwiBNT3WSXKrKxQK2lmlRPiAo+w25xTI9VGXGvHIaC3DX' +
                    '0PV6HqHgVgJIQ431N/CwADpimweXMIN95YjdbW3Gr36KNxzJ9vZYZcVHnKvqf6P6BiVMmX9iHg35KE8NQvPT+FjxLrSuiYjAnVh4gi4StKwW5SVsSJEGKeB4OPFH4GXn01hBtvHIu2tpxl1djYhLvuala4OPgMKQ' +
                    'JaUkrbMAxbSqnLQ8MwIKU0DMMQzs8jJF4hjLwTj65D+hmA4dOWi4AatiVqm+Ic2jmT/mg16Z/uwSziO4tYljVLCHGyQ0B+8YsXiZdeGgsAmDTJhBACBw9mwL3yyijWr29SYDqkcBSvGAGFRkD9oKMMQAhCnOER9i' +
                    '/azJxQP3UFL0TAoM9BSghC/IOn/l4X2Bs3luDKK0dm0889V2LXrqQiYLmnbJtzGqxhkNQmh/8vAurk060D4aNIlnZiGVOTaRjAoBBigyLgAgCTFAHneDBo107IgfXrS3DVVdXZ9MmTk3jrrQ8945dyxlBm2OWMo5' +
                    'RS0iEgACGlzK6Azv8+RnxsjfTeBaIYAaUPaUMaCR0iVqhFZaIHs+yZQdDH1q8CUMWOjjHYtKkmm3LDDSkIIdDQkCnz0ksj0dtbjbFjy1Rj6aziCXGhp8HNWQUQ4rOetP0ASiDEab6w5RNyT7ad7dvL8NBD47FjRy' +
                    'W6u0Mggbq6NC64IIq77+7GtGmWRvRS7XTVtXNxAX3ppW7Q333XKLD/gyJ2ZrXdvr0aTz5Zji1bynHgQBnicQMjRkjU1ydw2WX9WLy4DRMmmACIyZOnYO/e3Go6b14rVq06kP170aKJWLbslOzfZ5wRxbvv7na1vH' +
                    'fvCPzwh/XYsmU0OjvLYFkCtbUpXHJJGEuWtOD00xMeAgJCfM6D5Xo0NNTjiSdOQmtrJdLpAKS8TxEkpeUManthb9CvqAQuv9yd+sEHIQCV2L59NJ5+egQ2bx6BAwdCDj6Gg8/997egvj5lGAZJOqavMAKByz0yv6' +
                    'L155KCaQDws5/VYc2a8Xj//ZGIxYIIhWycdNIQLrxwAHPnduLiiyO+W5g9e8rxox+diC1bqn2wbVbYugmYTpdg8eIT8cwzdejqKkV9vYVbb03gnnv8zgcCeeS2LGumbdsLbdteIaX8DR944AABEiANg2xqGmBTU4' +
                    'SGwez/GxujJNtJtpBsIvkhyfez6U4k31XxLz5pbSQ78v5fKJIHSX7ExsYuBoOyYL5gUPLhh3uz9ZM9JMM+9cVdMRYbcqVXVJBkimTKp2yEZJhk97Byjxtn8sCBD0i+w7VrW1xpEyakSb6TjRdfHHWlNza2u9JXrm' +
                    'xjKFS47yNHWtyw4QDJvST3ZKM33+zZ7T59WkLya2pf4xDhTpIPkXzeJ3+Y5CDJKMkoYzG37OXlkmTPsPjU1aX50Ud/kVK+reTeK6V826e9HA7F0u6/v/MwdGkPybdc8ZFHWg4D2480XPeSfIdXXx3xzT9vXtqnXd' +
                    'OJOgHn2rb9Hdu2/1tK+Qd55plxp4C85BJTKVuMl15qZSs6+2yLZD/JPpLdJDvzyCSEQ7JDJA/5CNOn6oiQjPqkx1TagBrsHm7aFHZNBJ/+dJpNTV1sbu7iWWelXRPHq68OqrIZ+fPrH1IxQ8CNGxOu9HPPtUkmSS' +
                    'YLlM3IN326yeeei7Cjo5em2cW2ti4uWOBu74YbYiTbaNttPOMM98Bs3txNso2JxCGWlUltwCUHB9tItpJs5datXQwEcuXq6y3u3t3Jzs5DPP/8nIxVVTZbW9tINqtJ66CvMv3kJ/vZ2/sCySdJNpL8Nsmb1YGEQ8' +
                    'A7FAHX+WAwkB07MpaH3znnWCQHOH26yeefj7Kjo28YfFpcMV+XWrMxX5Zc2vjxlitt3boeJpNtbG09xFWrejltWtKFDXmQW7a0+2Dbwc7OtiLYtvCpp/pcbU2ebLG5Ocrm5jinTLF95LScmLu8se07bdtulFKuk9' +
                    'u3v+kqsHp1XCnaENescSvO3r1DagAcRe93pQcCDsnCBVagqFL+IZIJn/SERpAoyQivusotw4YN0Wz9Gza4SXz11aaSPdOG/woYo2lG+MorMU6a5AbssceSRcomlXxxbaLI4TA0NODKP3GinZVz9Wq38t1xR4JkmC' +
                    '++GPHMoEmSvdk4c6Z7JV61KppN27TJ3d5ddw2piTEzOXrlf/jhJinln0mus237UZL/Zdv27SRnkfyCRsD/IPmjIivgAE1zkK+8Ei+AX0SLOj79Pvj0uGK+LuWwyJcll1ZS4k5bvjzGffv6mU73etrozsaZM5NHiG' +
                    '0PyV5On+7Wx40bHX1N8He/Sw9LQMuybjZNc6llWaullL+Xt9zSlc08apRkLBbJEjAWS7CyUhfE1BQwlreKZUCLFFnhcuTzX2WSmqJnOlZb6zYRwuFY1gQKh2Me00Zqq1zisE1dgJw/f4i23ZtdoYvJ9tprSc6ebf' +
                    'LUUyXLyzOztTd/SQmzOJlmjCedJDXlk7TtGL/5TfeA7dwZ1xR3kHV17r63tubS4vFBV9qZZ9pZZSf78uTp7HyD5Au2ba+xbft7ytS8luR0jyfMbSR/QPJXR4TfbbcladsDJAe5eXOcs2ebPOUUexh8BqWUg1LKTJ' +
                    '8K61KkwJYgE88+2/KVKRQiL7rI5Jo1cYVNLh45tpm0MWO8+pjI6nM47Ld1STsx40uVSt1rWdZPpZTrZDK5WdbUmIcNcl2dZDqt76NiPqBFsyZKYQIWWwETLlMxGHTnsayYS7HzBzUnX7G+hEKSEyemOXPmIDdubF' +
                    'V72ma1z+0paL4+80zKZRIX33fkBmfFCtNjhqY4eXJuBZk61c5Oao5iefteLGb2X4NZ8z1fllellM/btv1j27a/WcQV7WaS3yX57LD4nXCCyS99KcYXX+zJ7r2ffjp2BPhECpLMrUvRAtZUJm7bFue4cbJoW0uXul' +
                    'fnI8c2s6joZmtGH3OLimkmik3cwaGhoQYhRJWUcgyAkWLt2nFGX1/wsA93u7sFNm4UmDnT8k2XMncEHIn45bCHOVq2847vq6uJnp5cmWiUGD2a6nd3XdXV9K0jp13NmjtZUrvHNDRXtBGa76fr7AqAwNKlIdVP5+' +
                    '4rhQULLJSUAMFghY8zQibefDPR0AB0dzundkHs3WtojgCm50ohv+/FwtCQ8Byd5+UQQkRI9kcike4iNZla9OL3gXad4VxBBVynz9/5zmgPPgksWGAqfCqLXJwX0yVR9NL9M5+x8dFHcfz2twFs2RLAe+8Z2L49gF' +
                    'gsV27lyhIsXpwsqFeHhy1RVUWEw159lOp3owCeAEAjGAzWGoYxxjCMUQDKxFNP1bqyvvxyD8gOkJ0gu0B2o6mpD4ZW7y9+EdCuIUyEQvoAAYODmbumN97wU4K0duyddtWbAT3tqhtIY9o0tyJs3cps2tat7jYyeV' +
                    'M+R+tOiChvli4AhwC0AGhWP9uUl0tY3Y95Q6bOAwfcQs+fn0BZmYn9+2XRy+ARI4A777Q15wYD6ggeI0cS11/v3Jelszidf37ac8zfD7JPi2EVM3/ruOWvbHEpZRTAQHV19ROHQcBC+PUrnDqQeR3SrvAMA4igqS' +
                    'ngwSeOsrI09u+3C+hDLpaW0qVLAwNmEV0yXbGiIo3ZsxP46U9j+MMfBrF//wDcnieGK//555vDYKvH3qyMU6Z49VFm07Zt8+tj9k7U0JyTS9DeXoo//zl3P3XyyWlcdtmAuqCNKU+GKE46aRAXX5xzQH7xxRJ0d6' +
                    'fUpfwQTjnFLdDPfy7Q15fC/feH/OYSLcZRW+sW+I9/tD15Eli4cBBCm6gWLQqhuTmN1tY07r03t1IZBrBwYb/mLOD3aiGslOcQgIMAPgTwgfp5UJGwSymZv+zjxrllXrsWCIfTWLiwtMCKnrskv/12icrK/FzXXp' +
                    'vGqFEJ7aI/Mwbf+EbY1fc5c8qxa5cJ00wgEkli504Ty5YZmDx5lAe3ofwrVhE1DCNiGEZkmPne1JwhvKFfw69ZYdas/s6QsLbW9HhRAeFwEgsX+jnYJ1zx1FPdltWqVQb6+pIFdClX7rzzRmLFCgP79plIJBKIx5' +
                    'N44QX36lpfb2l6Ec/D9vrrK7Brl6Vha2HZsoDCNtfWTTdFXfUuWhRCS0sKLS0pLFrkJ2c8O6aWZT1rWdY6KeUGed9977ls1W9/u5XkTpI7SG5XcQfJXXz88SZX3gcf7CC5j+Q7bGxs97Wbb7jBbx/ytop7Sb7N+f' +
                    'N7iuwPcvc83/9+OwOBwjZ+ICD5gx8c0u7C3iL5pk+dz5F8hOTSAvufpSr9uQL3SG/zgQf87zFnzYoUODWMZE/JyCS/9a38A4MdO7rUHnQfyd0kd6mxeJ3LlrUU7XuurX0K2z0kd/uk/5jkt9TDURTZA/4rydtJLv' +
                    'Op4xmFz3c9ZR4kuZLkc7z33nd95bvmmv4C+rA3G5cvbzsCXSp8R+iNhkE+8khL3j3g977XdpjYuuWcMWPAN9+cOX5yvknyDZKvC8uyHhdClAAoFaeeOkM0NVVljFODeP/9l8UppyQ0typnDxPE0FApxo+/HNFoxj' +
                    'vitNNieP/917P7uSVL6rFqVT26uspQV5fEjTe2o6GhDYGA13vhZZftnkgEcM89k7BhQx3a20cglTK0vO53h1u2VGD58nps316F3t5Q1lF82rRB3H13Ky66KOrxdCCE+IKn/RXKkbpLCPGYj/LNz3q2C/GfnsQ/Zd' +
                    '2XGhrq8eijmf6OHZvGl7/cg4ce6kAo5HXE7UDuKVTG5enllwOYPj2kuW+l8dZbBzTLY0itQsy62W3dOhrLl5+InTur0d0dgmUZqKw0cfLJQ7jggkHMmdODCy+Mudyu8vu+FIfxoJjk5wDUA/gUhFjmSWxUq2CvEO' +
                    'IR/eQ0+xwHqMZ9952F1atPQ3d3OWpqUrjmmk40Nh5EKHRpUX0ABJYsOQGrVk08DF3K6ce2bRV45pmx2Lq1Ck1NFRgcDCIQIGpq0pgyJYI77mjFjBn9vp4wW7dWorFxInbsGO2L7ezZ3fjsZ6MuOVMpA4sWTcKzz3' +
                    '4KPT0hjBuXwty5HWhoaEUw6JXz9w6nhG3bDdqGuUQphqH87qicZU21waZSuBItBop4rB+pz6LQXjTodR2p57ufQ7Ke5jwqHlJ7ux4A3UKI9X6zv/Jqr0XusxTeF/XCR/aAdhih+whWaIc6mToaGkJYvDhHwIcf7s' +
                    'DXv96szON+tc9KKdmDRbD3YkXPIYzudB1R9Xch81mN14oQ8ALl3V+rHIzLkfs0R1zJ2CeE+I1W5krkHqM6D6GLvaTH30AfhtM7qfnrQhs3w6fNQvrlJ+fhjIMNwAqSbBZClBiGUSKlLDEMQ39gKQ3DcAbNFEI8qh' +
                    'xz8wj7VxLQz2vfGKYzR1K39HEMd9IcB2TnqVNfoXNeBVZSkXWE5v8Y8Hlp4P20hXOK6vjZjgZgQ0oiHC7Dpk0BrFhRoj31sjBvXpt2MNQlhFiklPprmpN56REQUHc+dvod10g4OAyuUTXWUk1azqc5LEVm56mRvr' +
                    '/cQPLzKv+AZ+IyChDw49aHj+M1RLFJYjg5UcAB3BkHUwCAaZr/rMzQIIBAIBAQtm0jEAhkveV1E0V976K0yCyMAkIM925tls+MdzhvwIrVLYUQz5O8xpPHedk/BCAmhNhdZAWYityj4GKrn5eEQaWsI+E8aHUeae' +
                    '7ZU4spU07Na2zVqg8xb94HADrVQcYhIcRKTZYZw6yAxZTO1lZ/51MaUSHE28NqLvmPyH1TR/86gvPNnjcLlLsQuW/9lBaR+ePUh2LXGnlk8HkPOJyMRyqn3wpoCSHWH83bquPhSKdfsgHApwCMw+7dE3DOOVMz7z' +
                    'FCxOmnJ3D33a2YO/egdqrYou+rjodjLwSPQ/B3De3ZmXLqVAlyALnv3zgfoMruy9TP4+E4AY+Hjyl0aearrfZPpYqUzgeowtre79fHITu2w3ET9O9vhs5RZqj3U3UOAfsU+dYcR+vYD/8HshtVUk4+/YMAAAAASU' +
                    'VORK5CYII=' +
                    '" />';

var experienceIcon = '<img src="' +
                    'data:image/gif;base64,R0lGODlhEAAQAOZyAAABAQBAUAARFQAFBgAUGQANEHvl/wMJCwBIWwBLXgAZIABLXQArNAUOED/Z/0Ta/wAbIgBDVAArNSnX/wB5lwBedUrb/xHQ/wB4lgYQEwA3RQTC8gCEpgCy3h' +
                    'PE8Ifm/wBgeBZ+lYbn/wAvOyhSXAC/7wBfdwCPsyU6QFOSogAiKinU/wDG+ABbcgAGCCTT/wTO/wGbwkDZ/3nk/wDC8gMFBV/h/znY/wARFjHV/16Pmyx2iAAKDAAKDQBJWwAICgBmfxU4QAEDBEfK6gCiywA7SQ' +
                    'BngRFEUQ3P/yXE6SE8QgB0kgOjyy7X/xjR/yg7QB0uMhxCSxU9RxtvhAI6SA7Q/3nM4QBuigB6mRc4QAo3QQBiewA0QQKfx0nb/wB3lQUSFQBlfwGgyAONsAACAwCWvSk7QAAqNRrR/QTB8RvO+1Pc/wIJCwjQ/x' +
                    'rL+AA8SwidwgCFqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAHIALAAAAAAQABAAAAeagHKCg3INGYSIiCQ7iY1yKUNCjoQ1VhZUk4NQIl5jiWBRSihPZjozD25HWUFaRQ' +
                    'QHUzI2Bh8GazkvTRMeXRUFgiNMajcOK05IG2UgKogFSywXVTAlJwg4jnBtNB1EWFyObElpcVcYFGE8jVJoHAEMPkZfGo0hMQECcgILQCYAiGRiEvQY9ONNCwiIJGxxkehMBH+DFAxwRGBiIAA7Cg==' +
                    '" />';

var badIcon = '<img src="' +
                    'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADW0lEQVR42l2TW2gUVxzGv7Nz2yS7m2xMNpusuWxq3EKLfSsJjVDEtlgLIuQiWJGKF4qlVFpL2bRpDN2l1FYRxZcGBL' +
                    'VaDaIkD5XapIJIQl+KNj4ktFm7ZrOX7H1mNzszOzM9O9G09j8cGGbO9zvn+18I/hfhUMjLctxBXhC2EV33GoYBg5BQaXV1WlXksc7NvtB/95NnL08eP2ZYhhnlCtLxJ1cucisz9yGnk+Y/oX4DGnt64dmzVy1yws' +
                    'myrg9v8vm0dcBSOMzwPD8u3bm9e+HcaVid9WAF6zrdoKssl1DKpNF19CNwW1+/qShKfwVi7kksLweKUz/7F8+fQbWrCbzNDr0g/QugBIvNBkUSUUjE0fn+hyA9vcGOrq4hEo1EvNaCNP9g3yBnc7vhenMH3O/ux9' +
                    '8jn0NZ/GvNwgub0P7lV4hcuoDknduQYjG8dOGyKrKcj6SSyUD67Hf+/G+zqKpvQNf578E6alEW84gOD4EQguYTATB2O7WQwdyh/SBFCY5Xu1H13pEgEfP5mfDAO91cTTU1SlDV2UkFQSpwQKMQQh8LFcvZLB4e+w' +
                    'C1mRTA0K2FIlwXx2eJmM3Gwm+91uTwbYQmGdCTUTDtLWg59yO9SZ1poSJ+cHgPGmPLsDQ0w1JDIC4swT0xFScSBSxRQM2LHmjpRWh5CcLmLXB/ew3MU4CSyyL+ySDUhYf0mx2M0wtpPgLX5DQFSNJMvO/tbsYiQp' +
                    'ejsG55Ga7R62BsTvNkmgLwtXXUTgaxLwag/DEHi9AMTbej7vKNWZLNZALymW/84sQlMM02tF65T0+pN8Vzn/ajpVGD67MbNCdOlHNp/DnQCzYhwr5rH4xDR4NkJZHwVou5+ejgGxwsMux9e+E46MfcMeo5/7tpgW' +
                    '17BU0nruHR6a9hnfwBLHi4rv6k5nirz+yVbCoVwK8T/pUALRtnYJVeuUbP0O552kk6TSTrBEnmwNAGbhgKQO7eHnS3tg6tdWI8xgiCMG7cvbU7dWoEel41QZVymUFFhkrLaeOw4eMRqD07bpbkUn9re4e2PkwVCM' +
                    '9xo7yUOl6cHOOK935BORZZs+D2oHrrdlh3HlCLguOkopaHN7a1ac9N47NI0pxUxpmubdDK3sogGBYmRIdnWpXlMbfH89w4/wNi4WxKCJsyDQAAAABJRU5ErkJgggo=' +
                    '" />';

var pauseIcon = '<img src="' +
                    'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADEUlEQVR42l1TW08TQRg92+7sFlqwFZCL0LBCRV8Eg1wMmhiMGmOMQYNPxsSEv+ALJjyQwIt/wcTE+EYUTLwbeUADCK' +
                    'J4SbRyL1ZYytLSLe1eW2cHIeqXTHY3O3PmnO87h8N/tbS0JBGedAmi0E4/pVwuB7oWNE0bNgzjTm1t7cLf+7mdl0gk4uZ5vhcu982pr2EyH4kilU6zf778fEjBChw9HDItQ79tWVZPKBSydwF+Li+7BUEciMjrHW' +
                    '8mp1FY4IMoCHC5XPRvDtlsDpquI5nawolj9Sj1+wYpm04HhAHIstz3az3RPfn5G4oCfhBCwLvdFGCboANg2RYMw4QST6DpyGEEvGK/JEm3uJWVFYkXxPCzkXekOBCAKAoQCA+epwCc6w9AFqZlwzBN6LqB2EYcZ9' +
                    'sazcxWqo5TFKVvPrrWrSRUFHjzKQDB95k5/FqV0dLYwFROfJhGWUkxDh0MUSkG1K00ivwFqAj4+jk1qY59mlls9eZ5qFq6neMwOvEeM3MLOHf6FGvSi+ER1FRXoa21GX+mgnRGw6Fg2Tinqurql9lIaclePzKajg' +
                    'xt1tvRcczOzePC+bOMwdPnL3FAqsbJtuPwiCLyqMzYRgJ1wTKZAqRWvy9GSwN7fKxZDr1Xr4cRDv/AlcsdrAcPBodQR+mfOd3OZDos45sqaipKZC6VSo3NLMutHoGwrgt0Ao8eP8HUx2ncuH6NAdy9dx+NDfW4dP' +
                    'ECdDqJLJXgPIMl/nEukUj0Kcl0d5LeLNLDzgTGJyaZhKuXL7G+DDwcQm1NDVqam9gkDNNiTLw8+rlYLCaJnrxweClKHABCAQj1gNtZru0x2nSMlm2DOhAGXbphIVRVZqrJzTrmlHg83qdZ2e6orGx7gAG4mNYdI+' +
                    '2AOAz27ysCZ5v95eXlt9iONVl2ix7PQMawOqJrCrOwc/suQC7HzGTbWXbYDXtQ17TOqmDQ3g2TA0IEoZcnwk1lUyWb6hZzn1OEunKPz4tAodfUM5nbhmn0VFZW2v+kcaecntAsdNFk7saZ1gIND4szpf1PnH8DjE' +
                    'h/b2bB2sAAAAAASUVORK5CYIIK' +
                    '" />';

var defenseIcon = '<img src="' +
                    'data:image/gif;base64,R0lGODlhDQANANU/AFFzrH2m60V0ukhrpazH/CQ0TYuv8U19yVeK3Cc7Wl+Q4F2O3S1MfFCAzBgdJRsjMjtinj9loVp4r22a52aFvzlPdIGYwk2AzneUzVN/x2iDt8ja/ZS29mOAtT' +
                    '9dj9Pi/jFShI6hxHef6G2Nx0VdiDlLaePs/rrR/SxEaaWwxYCh4lWH1198slqJ1mN5oqLA93uSv05ihUJkm0JusF+IyzRdm22b6DdfnGWV5HSg7YKq9Hul8Iiv+K/J/M3e/v///yH5BAEAAD8ALAAAAAANAA0AAA' +
                    'Z4wJTp4ysaiwRMaHPqOZ9OlcZC4PCu2OuoA3txdOAwmMJycQy7tHonkkhiBkNuTs/hAKRSIDCx+f0TNAAVDjiGh4YKAAMFPx4tCwqSCgsZAzI/Pw8HDSsInw0REQmZPygzAgcXAhAQDKWZCTezswwOsJkPDDUgja' +
                    'VBADsK' +
                    '" />';

var staminaIcon = '<img src="' +
                    'data:image/gif;base64,R0lGODlhEAAQANU/ANVbbJmZmkVHRikpKVV5Wq2fnux4itCxt8fIx76WnBYWFjU1NYyNjaVweJOSlNxqdysVF3t6fgcGBnR0daOhp76/vnZze7lcZOaMmq6Bh7KtrpN8hIJCSaCXmI' +
                    'GFi6qurmVjYm1jZGhpapOLjHRoa1EpLnJvdt9KUeyQoZ+foLKJkeBpfE5QUO/w8FRJTOJTXpSVmudVZNHR0sdkb91wfICAgIR0d7t3g2VeZamnq7NWXPJugGRWXH9BR4BfXAAAACH5BAEAAD8ALAAAAAAQABAAAA' +
                    'aJwJ9wSCwaj0OJUFBTiByBQIohWAxSFeEA8SFUWjJExOKBRSZCBYlAGBU6HQvFQclFhJtXiMVAaDQmA0UDADsJAiA8LjgBCkUJJzE+IgsiCgMTSkMDNAYABJcDCgQOmkI2KwYNggsCLI5FGQ8oKrCmRTcPGAe3Rw' +
                    '0XM7xIQyU9HDrDQxDLvcnOQkEAOwo=' +
                    '" />';

var huhIcon = '<img src="' +
                    'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADW0lEQVR42l2Te0xTVxzHv+f2PniMlQpLAaXY8oxhg5FIXNjQNHGSOTFN6EzmH8THZqJuzixspnUs0wGLxkf2yIIxZn' +
                    '843IaOTM3mNCE4fCaii84QTKAWJrTYUqBl13tv7707PUaHO8lJzuv3Ob/vL78vwf9GIBB0CgK/WZIkt2GaTtMECMyALMu9qqodLSsrCcx/T54sgsGgheP4PQkZLce7B4TL1wOYmkqwuwULMlFX68LbTdWayCf3G7' +
                    'reWl5eqj8FjI6OWURR7P7tj/uew50XYaMBQpoA88kvdKEpGqan5rDj3XqsqM3vUVXVm4IwwPhEqO3cpVHfoWP9yLFbsajAhuY1VSh15MDCEYwEo+jquYl7oRlEwjP4YOOrqK95ob20xOUnDx6MO+MKN9T43gkhJy' +
                    '8bz2dn4MSnjbBlpT1TG01LYlNLN4YTjxCdmMbJQ15NIko5iUQibZ8fv+XrvRUEny6huaES76+tZkF7v+lFPEPCvg11bP9913Uc7L8HXVbhrnZgh6einczOzl6t9f26LEPiAVXFYpp+cUE2JN6Cb3++iXc8L6NjfS' +
                    '0DfHXkIr67Mw5IImQlib5P3NdIbGY25Np52u502WFMz+Dv6BwicxpAtfs9VdjrrQEhBAN/jsF74AKstEaczYrAcAiDXzSEHwM+PGMvcuVh+OE/iEenAV1HXUUe+v2vs+BzfUN4q/MK4oKArFwrinMzERyZwGAHBS' +
                    'QSias1rb8viwtpmEiogIVKod3TvHQhWt+oYKmv/OgXjGRksqyQ1JGfJSJLlXHZt4JKiMXafCfv+joHQjAIRwEWNpeX5uIVh5UBjp0fwiRHzw2DZceZBrbU2OFfXdxOJicfOqMKGar67IKg8gL9hT7kOHQ0LsGulS' +
                    'UMULXlR9wW0x8DDB2ipmFgt1t7jjwqZ40UnYq1/XAj5Nv2022AVh80k49XlWHra04GaNh1GoO8RKVRAO2Hr9e9hLVLstsLFxX4GSAcDltESeruuhH27Dx1B6qRchCZZxWT1UWk24NNL6Kp0tajKIq3qMihPzVTCs' +
                    'IL4p5J2Wz5su++cPavEMZiMrsrtKXjzUo7ttcXaTZe35/U1FaHo/A/M80fqZqk7CwIglvTTabBQswAtXKvoqpHFxbkP2PnfwFXFV5DkrUSVwAAAABJRU5ErkJgggo=' +
                    '" />';

var updateBadIcon = '<img src="' +
                    'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADcElEQVR42lWSa2gcVRiG3zO3nenOTHZ2N3uRxrZaK8WAVWsqSKOIEItoqAWlrYKiQiJWiwhKQPFSafWHIlhRsKUp7W' +
                    'Z3a2yUukR/haYlaYtrNVTSC0HXxbCXpJt2L3M949mIP/LBy8vAvM855/s+AlapkWx6rtTsJfBNEGIFJM6MaIIlywGTk2TmsqnKkhUQBNNyPYt6nkl8z2rV68OkDTh0fHTq3WzxAZ9wAEfg6CpaPZuhEApCPdiuDe' +
                    'o64B0m14Poufhoiwb1RvHNZcA3qbEr6YvuHZR9+SDgeR7B++4Gx3HwqI+mR1F2PNRsF9RiYv7ZvQJo4fc9y4Avjn1fPXmZRFgCMs9BZIp234mAIoP6PkwGqDPAPAs2HRewPRzYJKI8MzVIRjJZbp4L2T/MerzYPl' +
                    'ngIAk8YrffCs3Q/7sBC99k4Qo7/R/LgdVy8FWPgkJ+cqANCF/woguHL5qI8z6iigRNFpHoSiCxOoYWCy80bVSaDooNC5eZXNPB6cdCfuHXsy+1AesnnPjVw3MEkWYDkYAIlSkSDSG5JskaSFFjgcWWjRLzOeaU+d' +
                    'k+1fv70i8vkFTmRM8pM3FupCSjo34DcRbW25CgAiMRBQeKRwwLG66cQXCpjLIWw8+xe7BrDXH/mp15jqQz2W2p67HcjxUBkm3CEASEAgIUSUQo0oGh6DyErz8GRyk41lzKGupLEjpfeZ3OVipPk3Q6s3tiMXTsXI' +
                    'nCYu9darZnTiGziQw8mMRDx99H8vEnlgFL4zmEt+9Aq1ZD9cxp6K/uHSLfjY6+5jjO5z4bl8cuLDG6zwlgz8T9jQr8sTQi255E58uDaJyfRrBnC65+sh/e9CSkHTt/I/l8fh1bhc2U0pht23Hbsrpd1+1n4u669g' +
                    'f86Rzc4p/o/PAg1K19KOdGUT/wFsTVa+H19leXF+n/+ml8fINpmpOiJMYEXsDGagnOoX3o2P0sjOeHUJ04iejDT6H65RDq344hMPBOfgUgm828LQrifr1DhxEykDBCsAafgdK7FTfZNIQLKQQffRGLhRrkSzOQ3/' +
                    't07wrA8JEja1U1OGWEw4mwEYayahUijetofLAHznwR4NlPbJPFrnUIvrEvZyta/wpAu44OD4d1XR/UNK1PUZTbCCGSKgml5MI16i9UbuGj8QK6Nh51PP9gvHuT+y+285cc/rnNdQAAAABJRU5ErkJgggo=' +
                    '" />';

var processIcon = '<img src="' +
                    'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADhklEQVR42nVTbWxTZRQ+7/3qvbe77W1X0q7r1i0q/KCMtQsdDscSidkH1GEd/tAtmkwHw0Wz6B+dwcQsmiEyBzMm6D' +
                    'aSZcHIDGNCXIjRoWFKYjrBNoyW6Uqh7b3Yfdkv6Mf13RINBjnJ++PkPec55zznOQgeYoPHjzkZhjHlcjlf58FX5x8Wh+53RoY+30aSVJei5Ns1Wu14SWlpc8DvfyORSJzZYNhwKJ6I97zQ2hb+X4B33n6rwPV0c2' +
                    'izzSae+3qyWxTFequ1rGFu7loPRdNVDE27s9nsd7v3uHY9ADB4bKBJpWI9Gq2mbe8z7sOyJClrf3lFgbvptBJbjEEmk1XuyFJNKpnMEASZf7619dd1gP6PjphqduzwcxwPweDCdG3tThduFTL3MoAIjI+h1nzMRU' +
                    'aW5EmSJPYmk0lPNBKpfrljv4I+7Our2FKxZczuqLKp1WqQZRlEUQs3AjckRVH8hQZDFUWS/BpINBoFgiDgr5XVc6HQzbau115fRgP9R0VB0NBGk2nCbrfXkBQFsx7P+UQi3vJsy770xUs/WAp1+kscz5XeXpZASW' +
                    'UvRhflAyvR2K2O9v1xNH76yyWj0Sjq9YXAcRyw+F29csXR0Ng4uzbj996Z7rPhmb6pm5fprJIHhqCgqaQa6tCmKddTuxvR2YkzS7hNTLoIQoEAPB7j+tw1xxO1O2d/CvyyZ8D/1WQwEUICA0BjSgx8EVQUVoJPDu' +
                    'SfM9btQp8MHhdxIl1WXjZhNJpqdHo95kE6n7ybbIlwsQsnAiO1Fp4FgaaAxtUPVvbArfgSvHv5feh89KVv0MnhoQpzcfGYimVtLMuCxVICeOcQjoQlH/pZH0l9Sz9u6YTphdPgND8JjqIGeG/mTShRx8DINEloZG' +
                    'jIhKv7EVqXxLTZXOyiMQDCbP+WnobfV4bBtfEIiKwVCmgtDHsH4M7KKeAZFh4ROhfWs8ZGR5vwnj2CRmgrMpsP8xyviDoR5fkMnPS6QUUqsG/zCUjmNPDFVTdwVA4yigbc5Z9+9q+UP+jtLXBu3x4iSEKMhMPdOp' +
                    '2ufpuzusG3egF+DPUCgQgAwooFdR1Hs1BXeuhPPVHueOCYsO67UqlUOz6e8Uq7vfmP4PyocRNnD6xO2ZbTIdCxZbBRW++hFPWLj5m3ev8DcL993H/USVGUSaVifK90HJiXF29vRYiwZHP3gkUGq/efuL8BeLNcQJ' +
                    'E3FaMAAAAASUVORK5CYIIK' +
                    '" />';

var energyPackIcon = '<img src="' +
                    'data:image/gif;base64,R0lGODlhGAAYAOZ/AFcqAO96APLpzPXHMv3012g2AIZRAvniksS3nue6RHZCAPvoqfjXa9KdAO9pAPO+EbCJKePXw51oAbGVZS8oD2FbR/767NurF/bSXe+UAPPELdOsQ++HANC/q6' +
                    '2PTQwIAufEV3JbErF8AOW9N49hIfTBG/bZeNvEiubTl/TEJvzsu/DLUtW9cKVyAaJ3MLiEAtq5VfXcjcZ4MbyJAOKtAdmlAO65Dd2oAPn4+PXLP/K/FSUUAO2+ItaiAPLu6+u2CXRoP+PJeOfJZvzwysqVAO/JS6' +
                    'NuBEUdAP745v39/f778LWAAOvm4at2APDFQfG8EOaxBMSRAPXy8O9fAKRyDjcyIbSBC////++kALOEGtvMt+izBuK2MOXbt+3iyZ5uG/n39t+tDPHPX+3ALfCjDLOlduvGTcCNAPbhnMueD1hKHd3AZNVNAMKFI+' +
                    'OyD++6AOXPhr+njN3SybiGDO/IAI1gAP734fC+Gs+gH6J8AO+sAOPATevSf+Pa0uG0IQAAACH5BAEAAH8ALAAAAAAYABgAAAf/gH+Cg38fVUBlKHATQFUfhJCDHxURFkqXFkgEC2tqj5GCFAgWFpsYAzkmC0NDBx' +
                    'AUoFUCSUMrbjc9uTU1F2sofH6whBQCSjE8NTNNEszNLTMsQls7kghKB3c3SxFX3d7eJ0FOeZ8VBAQDP0Qu3Q5T71NsOBEvCSZpAIVdFgw6NEtxrshwQPAdDikkXoQxwaWFITsEcthoIEFKkgABHGTEkeSIgRc3Vp' +
                    'gRsQOInQUpoMyYkEQGB4wBuiWZ6aXHGDEiAHiwYOJJjRZyrmTgQPQlxita5tS4w2BJgT0WMEyEcKVNhqtDiV5BYIQIFB0YRCgYYYfBxBNXcKhNgPVKHCMN7KA8KVHESAEIBA7woEFEQoEkOLBgIZNkQpMGW57oSM' +
                    'GlzpEQKlSkuyH2ihM9V8B4ENHjx5MHDzRcMLCDAgMVGPy96MDkzRUfLqx0/vyghAYrBT58SHMATYobTXzQucLExYwbnkE/SDEawCMAI9BgAN6tz5czN2zQrs2jBQBqhepsiJHgTJIIVKLQ0A5aRwkeuI98+rOjxY' +
                    'YgMNJEabD+gfsSKcBXgHOQ7FBHFjAIAYITGqSQwgADiGYEAARGskMBBkCwAQhiiFEEF3hQoQAA8oEiyAc7AFCAAga0OCCFO8xnYiEoHkHhETHKOEggADsK' +
                    '" />';

var energyIcon = '<img src="' +
                    'data:image/gif;base64,R0lGODlhDQANANU/AEs+IPfHHj0zIPesHveqHmhPIPfCHvfAHi8uIfexHve4HktEIPe9HvfEHve7HveoHvfFHiAiIWhZIPeuHiAgIS8wIdqfHqGBH/fWHvfiHve6HlpWIMyYH/fJHv' +
                    'e3HsyXH+nGHr6SH/fbHj05IOmfHoV0H/ezHlpEIFpPIK+hH/fMHve0Hsy0H9q0HmhUIKGSH6GWH/fKHvfUHvevHtqqHve5HvfPHvepHvfIHve+Hve2HoV9Hz0xIGhYIEs9IP///yH5BAEAAD8ALAAAAAANAA0AAA' +
                    'ZgwJ+wMCDcHg8ST8i0JGaT4okpdCl0K1OiQBXSGA6NggMA+ATCXsNwOIBrng/61+oEIOtDLkRhLhYoMTh3F11CJTY2KhKGPwgYMiAjjT8vIiwIlBUZKRGUPzA7n0Iboz9BADsK' +
                    '" />';

var killedMobsterIcon = '<img src="' +
                    'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgND' +
                    'RgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAAoACkDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEA' +
                    'wUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp' +
                    '6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhc' +
                    'RMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0' +
                    'tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDy3UJ501CVUmkVRjADEDoKtGzvRawSR3UssspH7lFYtgqGzn0AZc9PvDrzirfrnUJfXj+QrXgvotRN1CYB9mWKWVo/PchGEeE4BA4IQcg9K' +
                    'VCnF0oaLZfkelmWKrrG1kpu3PLq+7GI8EIaGaeISC35kaSRx5pPTKEj5Qc9DyMVD9kuWhkki1BJSkZl2L5oLKCMkblAOM5PPQGn6LbiXXtNjPR7uJT/AN9itbRZ/tiGW/u1Kw3aSMZ5wCYpEdZgNxycqqDAyelbe' +
                    'ygvsr7ji+t4j/n5L72c7DNOZ4w0zkFhkFvetms5reGK+228zTQq42SsmwsM9SvOD7Vo15GaRUZRsrH3nCFWpUo1eeTeq3d+hj3kJkvZAAxLEKAvUkgDjHetOx02K1S5srfyxPIqpeTKNywruDCMYyXclRkDJ4IHR' +
                    'jW7o2reF9HP2i+057zUR02Qlth56l2CdMfdH61oTeJLeC2trm00qRtKmkw6i62CFud0flooAO0kj5sEYI6HbpRxddxUKdFuyWrsk/Q+QzKnD67Wbl9uX/pTMyx8P6g95p93oum3KXMMu5oL90iZihDLJtbHysOCB' +
                    'nBU8nINXJ/h1ew6lJCZ/Lt2JaEQQPOyx5ON5+VQcYzgmkl12806/sbhrqyXTblXVZbC1KTJHkoWHmZcEEkgAlSVIyRms+f7TdXN1oPiDUJJpPM3W93POzokmOCST/qpBjntlW6bgduXH1Hq4xX3v/I4b0V0bLM+g' +
                    'aBp9vIbjUma9WPMcUl3Hy+BgGOPLA5J6nHHpWNStot1YW4neGEQ7whkhnjlUMQSASjHBIU9fQ0lcGPpTpyjzz5mz7zg+SlRq2VtV+RSlgke4dgmVOMHI9K2tEW2FlqNvfXTW6TCIEBSxkRWLsFwCA/ChS2B8zZI7' +
                    'lFOGZVYwUElp6/5nVX4TwderOtKcrybb1XV3/lKV9PLqF287xLGCAqRKcrGgGFQewAA/U8mrv8AaaNb2yzaRZ3E9vCIRPO8hLKCduVV1HAIXkHhRRRV/wBq1v5V+P8AmY/6nYH+ef3x/wDkSObVLy4t2tiLeG2Zl' +
                    'YxW9vHErEZwTtUFsZPUnrVaiiuTEYqWIacklbsezleU0ctjKFFt82utv0SP/9kK' +
                    '" />';

var goodIcon = '<img src="' +
                    'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADA0lEQVR42o2TWWgTURSG/8nMnUlsNTFNTNN0IVpbu6i0GFD0xQ2xD4pCq2JBpa2CBVFwI2KqYgISX3wRtSrqq2ARBL' +
                    'F1AZG2UrTigxIJxEbSNm3aLE06yUwm42TEuDyIBwYu95zz3bPMT+EvC4x9tROG6eQ4blNOztnVSxkBPs2/FAThdk11TeD3eOrnYSw4Rmto+lJCw5+6/vEReREcQTgVU32WBQZsrnLgSMNOUScw3pwkuWqX10oFQP' +
                    'BbkGZZ9mHf+OtdF4buoKTIAC1hf+FlIC0ImFGAPes6sL3E0adU05qHqCHjkxPux5NvnBdH7sKmN0FLA1XFZnjXn1XzDz7vQSqbREZ5MxSPwOU4hK2GZs9ye/U5KjQesicY3rfpSTdZYTBjMQF0tIzKhVZ4NnhVwN' +
                    '6n3WAQVyAUolnAF5tG/7ZropbX1FKRmYj7qq/X+X5yFKU6gmJCKRXQsBbbcHKNWwV0DByDnsTBSxKSIjDBi2i2NKG7Yp+Hmkskhk4O719r4BagiLVBx+jAagj0rB4HGo+rgPODHpg4AWIui4Q4j5QQQlxIw9PUO0' +
                    'zF52KTZwZbLE2mJdjTcAt6zox/2dfEBHo/dGFqPgb3mkdhFeB622JpNJrQVn8Ti7jS/wIkhChcTX1hKplMDnlH29cayBQ04KChGOVjUVq8Grvrfszg8tBpGJlPyMn5NiRIcgaxrBkn6pUWorGo+2nontMfuaGsXS' +
                    'q8ZNTZcdTRr56PDuxAGfe54JNkGtWmI9hobPNQ09NTdpHlfTdH2wmNCVDUvwGy8lMJshWHV90X5ZSyxvzlbHTW7Z8fcT7zO5WAuAoxaCvQvurBjy286YKF9avJOUqP7cvcKNc0emxl5edUQDgcpjkt9zDIv9s1EL' +
                    'iCZCagzEEulJxPlJUGi1g7tiw9jTLNyr50Ot1aWVklFcSUh7AsuZQj6VOfZgbIl9lXSGRCqm8hZ0ONcSPqFm8WczzjFQXBVV5R+UtMv1t+JoSQToYhipwlVc6UTAUEUVDlbLWW/SHn7/7NSUl252Y9AAAAAElFTk' +
                    'SuQmCCCg==' +
                    '" />';

var mafiaHatIcon = '<img src="' +
                    'data:image/gif;base64,R0lGODlhGAASANU/AKysrDg4OJSUlIuLi1tbW3Jycnx9fUtMTK0nMqKiokJCQqhqcMbGxhUVFU0gJKWlpWI0OCQjI5tGTk0PFF5JSpdmamxsbGZlZYgtNJ+fn4aGhpmZmYKCgol5ew' +
                    'cHB7Ozsra2tlFRUJiLjGpqamBgYFVWVj0mJ4+QkFtTU1NUVGBiYk1HSJqjom5vb5ZbX6+vr2dnZzYHC7hLVDEwMXh1daipqWxeX28XHkdHR5h/gbYgLL+/v6Gnp5KYmJycnAAAACH5BAEAAD8ALAAAAAAYABIAAA' +
                    'b/wJ9w+PMYj0gjcSk0BjSPR+2x4ZQiDSWz2CgwHhyaRuADgD6jiGf7a4QYvgKB0OIIEi+AQNHYehoDH3IlKhoJDwIGJCVXWUR/DRkgBmIbCYkXITglIzAKWFwNBAkMDC8PlwYtJJoKIQQHKhcBHhERAiAAOyAvCS' +
                    'cGFiQErQopBzgHIQ0RPr2SLzUZA6oXJAcKAQErJZowEQUAGWR5Dz6/BTAEOAEzMw4owy0zAuInIlIJG9MFFyXrMyYmhChxwEAAAQJO9HCxgAeLHtNaqCihAOAEE/5IaMDBgcMAARV0yFiQowMNGxQgTJgQw0SIYh' +
                    'kIBLCgysAAFwh0IECA4cbKVYs4UgQgUcPCnxEcWhCAYaCDCwkYMECAQAEeDgUaABBY0+bCAA2ZShBQoUIYQQUFAZyYscTDDAsINaCDcQFGAQ0ZXmhQwHVLgwCcWhQYPKJEgD5MggAAOwo=' +
                    '" />';

var plussignIcon = '<img src="' +
                    'data:image/gif;base64,R0lGODlhEAAQALMPAO3r6wxTAGmvZqjQppHFj4O8gANoAACCAJ3JmkqiRzCXLQB3ABGOEl6pWv38/P///yH5BAEAAA8ALAAAAAAQABAAAART8MlJqwUuO2CpG0ghON30hQ1ZPmeRqB' +
                    'SmDYTwahxbEDxRNIyDcKFyCI7HBGPBNBiKiigjuHAaAoGi8NDEerMSWcaJ1Wwsjmt5xfrCOg43W3xmsyMAOwo=' +
                    '" />';

var cashIcon =    '<img src="' +
                    'data:image/gif;base64,R0lGODlhEAAQAKU/AHS3k3W0OxIbEtW8BTN7S9XquYnDlVKSNFObXEpzVmelcPXkAXCNXpzUpWyoRPbbAChtEcfFJqm9c7jaimOXe5iiGWyqiVaHboe3Y4i9k0h4YGWTaK3Wd0V5Ey' +
                    'dCJZzKbDxkIluPc+Lxz6nUb2JbD+zMA5XCXJG9cj+MW3rAmnCxhVB/Zk+bckBTSN7bAsrDBMa/E9XDD1NcLkt2J6u5PMrlqGOOaIS7V6TObKjIf22NC4K6TmOHKJ6rQfLPAP///yH5BAEAAD8ALAAAAAAQABAAAA' +
                    'aMwJ9wSCwaj8hkUXBgMARKUKAm+mB4HZnxEJiIODkJBLKggTxDAgKzM/U6EFdE8rmdZp7VikCoDHQvc14FIwcEIYgrMAsPFQ44BQUcDgo2CRQUFzAPCwkoCA4mAQgNCT8CHhoxPg8bFhYsCAoNBlBDJAMlCgC8AA' +
                    'YZaEYCLRQAKSkZG0qnCQAqtsvRSUEAOw==" />';

var cashCubaIcon = '<img src="data:image/gif;base64,R0lGODlhEAALANU/AMa6tcCbk7lpirKkmxRvU+Tc1ChYKlclM8zDuiu1J+LSzFmYYxX1AHQzUnBsbB0XF9PGu8Jcje3i3t/X0NrMxLt1puvh2Av1AfHP4eq508psmPPm49qKtdZ3qY1ebu3j2bQ7cBjVBWaHZ9RvpbNce7tTf9e/uuDOygLeCMm2q9C0rguNMDCLOlFKSmpTVJiYmKtids5soJtFXcaAoOWoyFWYV4x5egTKBRzsA9LCwdLKxtjGwpI0TuTV0ahEaAAAACH5BAEAAD8ALAAAAAAQAAsAAAaFwN/vwfN4HsKk8ncA0TAaQYNgWP5kIA6mM3sRCJfF4ZBMqWYlweKLqlU06YYLMaEMWKHVTVTRZkYwFBATEwgJFwwOPjEZGR0CPRMABQWGDBcAEAEkEREnGzo/DgAACQwMOZQTJgobEi1KBiE4Oxa2FhISNlZDAwUWHx8SALxKDggWCkg/QQA7" width="16" height="11"/>'

var cashMoscowIcon = '<img src="data:image/gif;base64,R0lGODlhEAAQANU6ACkFBt4aIvFCSdoaIaITGV8LDvNhZq8VG/mtsPbbAChtEekbI8AXHfFITvvIyu8oL/JRV7kWHNwaIfXkAca/E/AwOOcbI8fFJvA4P5iiGfJNU/A0O/NZX/aBhX0PE/V2e9W8Be8tNPFGTL0WHcrDBPLPAPNbYeAaIt7bAoMPFIgQFeQbIveanUV5E/JYXmJbD7MVG+zMA22NC9XDD+8kLM0YH4EPE5IRFvA5QJ6rQQAAAAAAAAAAAAAAAAAAAAAAACH5BAEAADoALAAAAAAQABAAAAaMQJ1wSCwaj8hkERAZDABKT4Dl0GwIKZsxEvg4DKaGQjFZeQpDQmBDw+RaCtSloQmJbgUGg0DIgGQkc14ILhEETgMMFBMJGRIQCAgGEg8nBwsLNRQJEwcjARIYAQEdBzoABTAzJQkWFRUDAQ8dBlBDLyAxDwK8AgYcaEYAKgsCEBAcFkqnBwI4tsvRSUEAOw==" width="16" height="11"/>'

var healthIcon = '<img src="' +
                    'data:image/gif;base64,R0lGODlhEAAQAMQfAKkAE4oAELYAFawAFJEAEYYAD////7UAFZcAEZIAEaAAEp0AEo4AELIAFbAAFJsAErkAFZoAEpQAEbEAFJgAEq4AFKsAFIwAEKQAE7gAFaYAE6MAE7sAFbsAFr' +
                    'wAFgAAACH5BAEAAB8ALAAAAAAQABAAAAVm4CeOZGkaaGqShsdlgrGOBiQcjTx/Bu4MOlbKMKlYAEOdoZM5/ACajWJBVUIOkwEAM41QEAiloFHZKh4ISYJAUDotmjMiwbgEAsrhYs5IniISDHg7PBQJFwVBKwYIBA' +
                    'GJhEmKhCshADsK' +
                    '" />';

var foundIcon = '<img src="' +
                    'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADC0lEQVR42o2SbUhTYRSAz3vvdjc3l7p0OXXmQsnhRzBLi/IrI1KhlFBJg0ApRCItK8u0EjQViuhHQT9TIpH8kaFUwq' +
                    'IgI1MpDcNMxT40m86Vus9739vRZmi/fOHhwOE9z3k/DoF1rvPpGQnaqYmGX6y09Grfu4GVPFlPcUnFFTlxOY+oZqefka9jIeLCfKq30zFVNTB0b43gQsOtTRh0iByRICylNNDlsPtJZTIXIcwX+6x5gFgt+d6fh0' +
                    'zXXrzsJ57CIs9pzMg0MrOUF0URqCBE2G2LAQqltxkIkbmdziRWwvZcrz7X8u8KKEjEkOUpnET4pe6iSP0FQYhlGNZMCBF4t2uSd7uH5V6KucbK0z2rBTkYNiNBSAfixu4W7K5zOuzpcoWyEwUah90Ww8nkHxiGGW' +
                    'm8WNa9WpCKIRbZhXQiFAWz2NGIm92cTDaLOQPD0mGFUvmaERl5RXFh72pBtkegRVqxWEmpsID3Peqr9u2NMujzxpmpuHnRxvlJVN+2KnQteMGazB1prhVBHobtSAjyBAVSkVJOLufCohK3pDUOPzBSQkHCMsALFF' +
                    'SsAs5E5pgUhDuwImAwFHskUyigLMsI2+Mi9zXONO3eiJ/qKwWQ4q54bSLsCd4LJaZ6qIsuPPf/HOzHEIpIOU6i1e9Rlff87lCoZRtBpA5Qe/nDSWMNNH9sg7c/2iHRP/v9sqD8St0m/C4dy3kxWLks0wT4SIMTbM' +
                    '+tLpM013AXusbvgzEwGRZ5DpoHK0Hvw4NacnBmWXCs6HiFxfwz7nH7o9zVJ+oaefipf7o2IlpzGA6EVy59DdR1F+B49uF7qMAYUPV3EnfG7wgODAvPDNKFtd65UW8tq67lQjfr1DvjI2teLVw94XCPwLbAfBCYaB' +
                    'j8XokDCeDFxUBGyOWyNW9QWnEpS0bEm59GRy/qDbHdyUlxC4ZoTZvpa22K2TYIPGVBQgTQeBshOehsJ+G5Q2sEaSlJvvbFxTdW69ypoZGxp0u57+ZxjmGh1OKaKJh3moNVnObLBom2iXfT2/qgSP4PU3k9tCVxAe' +
                    '4AAAAASUVORK5CYIIK' +
                    '" />';

var warningIcon = '<img src="' +
                    'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACgUlEQVR42pWST0gUURzHv29n/7S7rpuhlroW/kFdobQ8qBgdxItWB6NDkVAdukREWdShEr3YHyiicwQlJRJJEP2hOo' +
                    'Vmapq1qbEuaWq7Cu6s6+7OjLuz7zU7I1aYZXP5vWHm++Hzvu8R/OURJ15YGZWZJXePsNo/ZLUPYc9jS0ykQ0yWKKen2+1bG8T/AoS+tLf4J4UmeVFEaqaueX3Z8ZY1AxZGbm+e9y2OJttDFqoAeB+N2NMNRWm7mq' +
                    'bXBOAHb7YHJkMHHPnzYDEJYwNMsdA/yKi7deifgOCnqzu9I+E3jnyeuH0S5KiEApsE9wBYdpGlKrO+rWdVwMLHZl2El/pEPliWlRfAjYdALCbiTG0QnveA2Wbqs9qNFVkHn7A/Avjes0fH+4N3nBVz0FEB1zoAWQ' +
                    'GcqwtCDkvoeUZQXLnh8JZjb++tAPi7T9v8EwG3ycRvSncEwaR5NN8NKR2EcGmvABbX4duoEYJg86bnpBXmnugP/waYfXnkytd+//mSqilQYQosGsHlTgPMBuBkjWIcJ6CyDl3PzXCWp7XmN7ouLANmnzbkTrrmhr' +
                    'McnnW2pO8AUwKUoMtDYOKAsgxOMSCqBT/DYdxtlnJKHMV5p96Nq4CJttrO6aGx+m2VXk0nUREjGJll6rooRa8aJABMJhjoNsJRkPrIefHzfuLt2F3teuV5XVrpJWYrU7NY6rixnVPn9X3QwgokARLDBIO9RuYsz6' +
                    '4mrtaSD8Kct7Rwx6KyHy3JmFZNnFDVRBfVa2GasNBg7mEOJmvyIBlqyuOn3ZGUFVeK/TqJOjU7srRFICPTwBPf/ZokvSV5I8D9PJPlMFH7VN/p0poSDRKniIYCMz8A9QcpP1oZxJMAAAAASUVORK5CYIIK' +
                    '" />';

var chickenIcon = '<img src="' +
                    'data:image/gif;base64,R0lGODdhEAAQAMYAAAQCBKSKBHQCBEQ2FNTKDEwCBDQyTCQaBIyKvHxiDMzOzExOTBwaNCQCBFw+BPTmBHx6fPS+BDQmBExKfLy+BCQmJKSm3Hx+BAwOHMyaBKQCBExKHDwmDDQyZB' +
                    'waHPTy9FxaXPz+BKSWBDQyPPzKBGQCBJyavIRuDExOZCQmNCQWFGROBPzyBMQCBDw+ZBweHAwKDLSKBEwyBFQCBHxmBNze3FRSVDQCBGQ+DPzmBHx+fFxajLy+vJxyBBQSFLQCBBwaJPz+/PzWBJyazCwqRDw+dA' +
                    'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +
                    'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAEAAQAAAHi4AAgoMAL4SHiDclM4iNGi0FjYcwLT+SkyUCMJeDJhUNE4Obgh6EFiguRRg6hoQeNUEQPgg7qz' +
                    'wKhzpBuhUGGx48t4QwNrsfCyI5AwoKpYQ+IDogEiE5MT6XEgEPIUIRGT0Ho4QEFxQsJD0OOByNEisJJwkyHtiIIxYmLhISHkQdHeyJYkCwYMFBgQAAOw==" />';

var hideIcon =    '<img src="' +
                    'data:image/gif;base64,R0lGODlhEAAQANU/AP////8zM/f39+3t7YCAgOXl5fX19fT09BkZGdPT0xUVFbS0tMvLy4eHh/9LS/v7++Hh4aAVEtvb2/j4+M9NTKQWFMcuLDw8PMMcGkpKSrq6uqQVFKkXFawYFs' +
                    'YcGqAUEqcmI5GRkf7+/qenp6+vr/Pz87u7uwMDA/9ra/5ycmNjY2lpaf5HR8gdGs3Nzf+Hh8AbGtLS0vr6+psUEdjY2NnZ2dJOTP/b26MWE+fn56cWFL0bGKsXFa4YFp0UEgAAACH5BAEAAD8ALAAAAAAQABAAAA' +
                    'aYwJ9wSCwaA8ikkRhoeTyYwFKoQNkoFpiUqFCNCoJwgbCTIhDCDOAhAAAMgwQhREgwSD+FyO2G1wYCEwYQDEIPfAIDEoAAMm8JQhp8BTk0A3wAAgVCDm4CBAQml3wHmz8BNwApAT08BAUHsS4EQw0ADQEdOjgRLG' +
                    'dFFwAxATwVID5bRSclAA4cGx8zyUULAC9JSFMrAAtTQkEAOw==" />';

var redBgImage =    '<img src="' +
                    'data:image/gif;base64,' +
                    'R0lGODlhZAAyALMAACIODyUQESYTFCkWGCwZHTMgJDckKDAdIDooLT4sMUw6QEY0OkEvNVJBSFlIUGFQWSH5BAAAAAAALAAAAABkADIAQAT/sC3EWBNFJYDcOoiiEMbSFIWjHJaGII9RxgwrURamcR4okiaUyuYK' +
                    'jUqn1KqVeMVmNYbJ0FQMDonEwKBgFBAJxRexMGQUBikDYTaREI2BoEsILxbX7Lb7DY/LZ2kLCRlgYi+AIoJrBiEFd2ZkCAECBgcEcgQFVwgFJCgElwmYLwcFZgaahAShCAICCQYCpjKvmpyeZp6ipAi0p5+7db0H' +
                    'ja0yB7SYBwIAAQMDAACsAAKYr9YBlATbBALQ4M6Y1dfglNDS1NaZ39De3wTOB+AFzNzb3fDO6OuvA97OnDWrNlBAAGmUEBqsdlDbQYHSXgWk9DAhwYgPJw60+CqjRYoM/52B5PjQYMWSKKVVU1nwpEKWCDOKxEgz' +
                    'IsyQDp8dHLgSp0M5DYNqQ8iy4cKZF0dKPBgt6VGVRQW6dGq02c6SVhdSstpzqUMpGBoQKjHilANoHgiEKJOAgYJOCRw0aqAhwR25BNwyCFBA7KkFZQ2cHZB2LRW3cOVqKayALeICcefWvYOAhKVTNcZUNsXgm4Yt' +
                    'TU6lQcGlHpjKjxIUS2MKsqUXmwt0HvCZSicZXk4doq3FtujcXGSUOvBWLZ5vBQyy4vavACVP1i6xGrDpyqblxTDVu2Runjvmmp7Ho27vlvVvpryFWk5dDvT1clIFWI9wQNWITeXss/pMGrqt+p3jX/80OglUUFML' +
                    '6feNSd80BI1VAfYHwH8KQuPgTUiRJNVQBfHUElQZ8TQURDiZtNNLUm14IolamURUTy+O2GJDPYE0Y0Ai8hQQUjeuOBRFRtG4UZAYNmMcA/8MkYAEjYRRhwIN1KGCIGKs8UA9DsglBZQLHJnkCkuWYciTUcaFxpay' +
                    'wTBCGGVOiaaVWGrJZTENvJCFGJApYI1YT04wQZRpLCECG2GIEWgAcMgFhh957jmKHZIA6hYLCzjwaGORkjCpW2+98FYbnbwVCwHFhdDJF3gccMcjfNi1AGQZaAHZAp5VRgYDMhSi1lsokHHFqoB54Wqadv36arCz' +
                    'vkrIEm21ooX/KQl8w0Zl1CXwzKiNyGAJcKOk+RquyTRiTRZYRKKdtQNgywYy3GriRSrZskvaKFRcQsZrbLBiSSjJzFePHNS9YoY1qWByi71bbALCN5ZckQw0lvg7D3ICJ0fCdAerJUclFhfcXDUyBGBKMZnMo4kt' +
                    'rGwTzSyZYByKcvZ4go47r3jyzCXwcLNONfOIFx3GzmlyDXusMDOfN//YckA6/+j0jTgGLRh1fvbNB/CDBvVMjkHmPEOgN+d0ZPXTXpNzdTYDalMOUGz/Y98sHemHokRO8YdgVnS7WCBILLZkIjYi3b2UV3enqI3d' +
                    'KoU4VVcfznQ4iiMmXlPkBb0EZED2RdQ4/+Wa17SjQzHZJFJQG5VO0+OQjyhjTKRbrvePH+GN+kc8BgVi6CUSWXuGp8s0lVac4w58iJrndFXqk4vY+eEOKY8U8iGRuKNXHjlP/U0WAaBFB7G41SULDsyS1pJoZOEA' +
                    'nWXStYAUDXhBglgDcB/o9wyEf8D4dFERF/p1NIB/+fszQAPS1xj2MeB9FqgBFeJAALpcQQKoQsMLGmCKAUKGLmgQjGke4IDKJLAYS/qHAw8AQTJIEA4VPAH5DgGYRqCwLyrEoAwcYBo+qUY2KyChFQSIK9kAKi6E' +
                    '6AGnYHMCUg3BAA+gYCoAkwwH8tAMFiABEFPwgSGyIYpUsBQVWTCoCf+iQAF44RRr+oKkELgvA6EQgQ+aQAW2CEYGUCqLBIrhlly0L3580MQIiLOCELDRLraxVBr76II2UuGNAhTVq8yABeJ0wk5StAJxVEOGLMQi' +
                    'g4CJ4BHaZ4ZifeEtIABDJK+gARAMIgvBIQudSllJVGKShYPoS2WC4yssUCAUayAlvnDFALtcwi1P0kNqPPGIf6zPXc1iAQJ0GUpe+jIva8pgM9PwTGCGgVxiCGW3rPEqFKTLFbKxBLS0Q7/bZEsDE9CErwiQzkNW' +
                    'JgBNwAC4xkmdcoqGDXWCDDlxaU42GAo2BywXIS4BAu34YhfL3MIy61APbdUjL5jI1j/chwoQyGb/E19IDwggttCBOvSXmFDoPzyKDNOcAgzfiOdDTyYyA0DDFCBjRjGISQJrnOIKjNxMJwjq0lm4NBTVgWklZGoG' +
                    'oclCEy6dKVFpetSbngIUDKXOZZwhs24841+suE4ooOHNZEjHZMnQlxxMcTTnWIM5WL1FVrmqsLD+Q61bpc51TMHVoplnGdcQmX2ucLWlzUKm73kYUHrWnre+AxPaIOzE/uHXl1nnZiYjD88Aq55QaCNpDrOqRPrh' +
                    'tnPEAwCXmNDaypEcro12HysrB2L1cdbLIk1mL31aaN3WDvVEg7aJbcY/zHaOzFmDaV4DhzX8AZ5wLEhte+1ZO3YSj/nYIrVA/xnuM0Ia3Ae940EWgsdBrnFcfygkbFKjCDcmdLbMbWU/wQXQdxcEFPXqY2x77Yhy' +
                    'mHK1y0qNQimaEN5cR6AAEa4i5iXbiPx7lI0V7hkmQrBA+rvfyy5PQVGRHoJSMru7Ne8oMqoITxD0YAwTKHrA8xBTdLcTHf2OSD66z/NgZGLhnc5FjgPdSGo0pNHBpHrC07Dk6pY8qGC4xtFLCOWEouMXLQUisYtR' +
                    'VPgmo6yo+McigbHi8ttkwx05c1QxUH1Cx7clB294NznK9aDiZeL5xMzZA7PohOzkHWPYzMPjEO5gt7rELe5DxqPxhkYnZyQnWHU+sZ5QwvwhGNfII9mj8FOX+UNnQvNZRfwx8p07F+Q65+12EV705ITEks1xOimR' +
                    'E12G8GwiPU8oSD/ysZ3nhmofla7Vps4J74b0O9ZF2XU5+duqbcwjW8/OyYP+9Z5BLI0IAAA7' +
                    '" />';

var mwLogoSmall =   '<img src="' +
                    'data:image/jpeg;base64,' +
                    '/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAWgAA/+4ADkFkb2JlAGTAAAAAAf/bAIQAAQEBAQEBAQEBAQIBAQECAgIBAQICAgICAgICAgMCAwMDAwIDAwQEBAQEAwUFBQUFBQcHBwcHCAgICAgI' +
                    'CAgICAEBAQECAgIFAwMFBwUEBQcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI/8AAEQgAUADAAwERAAIRAQMRAf/EAK0AAAICAgMBAQAAAAAAAAAAAAcIBgkEBQECAwoA' +
                    'AQAABwEBAQAAAAAAAAAAAAABAgMEBQYHAAgJEAABBAIBAwIEBAQDBgcAAAACAQMEBQYHEQASCCETMUEiFFFhFQlxMiMWgVIkkaFCJRcYsdFiM2M0JhEAAQMCBAQDBgUBBwUAAAAAAQACAxEEITESBUFRYQZxEwfw' +
                    'gZGxIjKhwdHhFGLxcoKyM0MVQlJTFgj/2gAMAwEAAhEDEQA/AEP/AHV9h5t5O5BqnSWsplXe7N2/KyDK3ayXkFDRw5F9lNicevhLOvpsKIDyiLbbDZvIRkogCKRCK+M/TGxfue7ee/i4k+LiXH4NFF6D7vnbZWJj' +
                    'bwAA8Gig+JNUuulvEX9z3x81wzlTuo28Kw+prhtMpiv51gP6S6VLWPSEsWjG4c4UGI/uvRz5bLsXhEVURNi7/wDS9u4P1xAEk1NMDXkakVGdOIKona3extWaJOApjj8M6H5qsssb8qf3M90ZpR6yh/8AU/MGBbtc' +
                    '7lybqjpHpjTtgxVtpGC7mwxJgH5LTYNtKSopCqoicdW/sDsSDa4g5wo4+8ivM8XHifcFXu6e5pL1+lpq0fA/t/apzt/9t7y+8aNfWef7n1fX65wvHVhNSZk3MsGKQ69PeNiOzFiRrh2TKecVpwvaYaM+wDNUQAMk' +
                    '2KG8i+1pVCkhfmUlwyEHlO706fa03omX8cfFbyE8rLfIaXQGuHs+nYoyw9fkk6qrI8dJROIy2si5lRGVedRl0wZE1cIG3DQVBs1FvNcsZ9xSjInOyTiN/tG/uJwm3ZVl48rFhM8e89/dmDF9REgCAoFyqkRkqCAo' +
                    'iqRKgoiqqJ0h/wAjFzSn8V/JCWo0TkdO0zb5fLrdc17jQk6/czQGUoKHd/8ATie/JTn0/mbFPz6F943xQNgK0dxnvjphrqxSv7XbV8Cr21UJn9Og9yfBO1gpT7ifmhNL+XTd92TklWwhE/WOF+UvkoU/DtE6jp9Z' +
                    'x7SHKSvenyaajs7FhqOTzzUWRkMxiRLc9kDP2G3TLtQi7O1CVG8smGKWjjoUvm7/ANq39xzCcYyjZW0NPpQ65xevn20/JJue69KONZWwynPPIEa9cV01bDkG20IjVRAEIyFFYulBKchtFJfHP9pvza2lglfmcXSy' +
                    'ZHp3KayHkeKZHCzfBFim3MhhJE3QC6VxpSZXhwHAE2yBQcQTEkRe1mjYTqxCTlaTki3qr9t/yLznN891jrjAK6flOmpkGBn+NLmmD8QptpEO1YBl525FuQntJw97JH7DqE072OcB0+besBrkE2dC4lMbnfgn5HeN' +
                    'mBWed7UxOkxaiqpcGBNmv51gL86RYWSorUWDXQ7p6ZLdQF91wI7LhNtcumgtopdOYruN5oDikXQuaKlAWbeLCaj1sde019XVT4c9PQEgSoTsSa4/+hlyvCsFwX4KhevRwuJQtV9RHtL4l8uPXjoxKCgXsLimIii9' +
                    'qfA1/L8OuoiuKsS8Edku6tj7lvqTu/uKREoI0yTHa96UGPuXA/fICdwqgK+kRXVT1UU4+aouV+sL7kbK/wAnxPUAio9uCtXZMcTtwaH+7xoaK06d5sbeg6kzjZ2MYUr8PDrSvqJmF2E37KXchPcVlxuNIFqQDT5t' +
                    '8nHYeVPcRCJSFe1C8ibbvjJJQx8oaKVcQCQK5Amlac6A0W33OwltuZWtqQcASATTl7YqUePHkT4uZri+2cX25YHgexqwJtxX01s3Jg28MoaLKHgDIPeRrsVO5tS+lEXn06p26dm3pkkmLfNjcfpdGdYHQgYjliFe' +
                    'dk7psxbsiJ8t4GLXDST1ByPxV3X7bH7i+lN94FV1VblDUe4gwAmRIVgH6eF/WMJ7b8+AUwgZdbbRFV4O9DAfqIe1ULrT+37e52tgbNpBBpQHGvyr0wPRVTeLu33Fx8upwJrTCnz99KL4Xdkx1ostzWI1FagtN2k3' +
                    '9NjMm26wkVyQTrKtGyRATatkKgQqqKnHHXuPbJxLbMeDWrR8l5huWFkhbyJQwatZAuCSr3J80/BOnlE3SJ3GY5Vs/IcDrLS0lTrSXdVI22Qvfag8TDMoRaREjA2iqHdynonqnWQ9venQ224L2aQymAFcK55kq97t' +
                    '3YbuINdUuriTTH4K/DM9u4Rp39xPPM8yWpjzcUxbbuQN7BplbFW5mOy8ik1l1GJF9FF6E++BIvx56s6g0q2Ba4q/EDWPm/j1083aZFabMHT+J5MHb7VhSYTNl3V+6IqnKg89+hvAvKJ2r8+U4kb2YOY0JvAyhKiG' +
                    '2amz2t4N4rT4BRSsjvz3e6wOOV0d2Q88P9iIYukDCKvaCkqdy+g8r6onPSdjTXijXH2pWKjxKyiG2E3auwcf1PXiilJgyJg2tqIoiKqJFq/dbEvX+V59tUX0XhepZ12wdUy8lN/iV/pzWvhZvLH9aZdOzFyXsjXB' +
                    '5LezBix23SZx3MgbBpmN7nYH1r3ITrnPp8PnFXspeQncDAK0Vg1NO8Ya+88XsvvzxbVN3rLItcMY9RUntQcsz2TkmDYTk0Zy1fluFFZhNXM6wKRZyeFajorDDT5iICz0pxVIl5k648OKbFNheRVBfbg2D/a2wiw7' +
                    'bev8mhQsZhjml+F1efbV/aw0rUaIFS+D7TnuuD3sqKkhF2uoJhkQknx8lVxO8urukaKBpjWWN6ZiccBasQgubvj5EUy0EwEvxUGR6XMpoihiFlBvDaMHZuD7aXYVva7HwK4rbvE8glTX3noNlWTAnxXmFcJUBW3W' +
                    'xVO1E4/Drg4OwPFcW0V/ecytdXPkb55aOxSDEjYZvrCtnnqqICNx2UYsKD/qviwhwnAArkOGAoicIi8J1G8UuhdtWVj2sqzQmmIzsaVK0prLC4U2W19Yfq13AXOLFBI0FVEZ92+icoioifBPh1zjUrgmM2bcYnXz' +
                    'fOzPm2iNnyAyXVlliIOL/pW4uaYy5s69FkV9OQmlDRVT8P4dKvdVgCIMygJ5RSKY8i8ZdaxZJs0WptbV9paUja9rA5LnNtNyWRJ7E9PddrnK1oiX1UWQT4CnUjtcQNSU1vX8Ev8AdzIz81pYoK0KcIic88+nU+Ao' +
                    '5dslqbOxoosuugP2KUzbjto4yy46keOhgCuuqCL2AhGIqS8JyqJ806AOQ0Qn9ky+p1eCL5/Bf8E6Piiru60+Edx1qOZsNqgnIQSIBJfgilxwi+vw65Fomi8LLtup3/gkCxnhX0uaPOUl0+ZdqC1PDtaPn8W5AtOD' +
                    '8fUU9F+HUVvNsJrctOXsD+CXtZdEgI4JtfH7PG5lrubB9g4zZZDCxyTY32j8oaF6FFG8kx/0pxH23zEzYBt10EJO7lUT6U9F6+fXdwsNrJMJ1EihA99PDqfBerO35Lm8ZSQU4ivLCv6qwnV2j6DeepN3+Luxac6j' +
                    'H85xaQzT77i1ddY2WGWLXtPFPbSf7JONkDKi+DT7ZKJFwvPHVJ9PO6ha7oyVzC/EkgECp5mvAK09y9vOnsHwghuAxIrToOpU0xTw4/X9sal8N/J3ZuJZfVeO+s8zjePGOVsiyxKzzGfnNWXsy3Zc1G5MiK2xFCMz' +
                    'HZUmWuD5IyXhNVsN+EU7baNtGSv1Oe9oq6taBtBSoOIcaEkCnFUq72asRle7U+NmkNa44UzrjlTCg96p6/7cfK7yUyDK8w1/423UiohvSVfg01PPZpK0I6mX2cR2eRdyNIKi22rpucIieq9e1bK8sLC2a0yAAjMn' +
                    'PBebZIJ7iUuawnHgCaJKXlfizJUKUwcOZDMmpMV0VBwHALtISEkRUVFThUXqysc1wqDUFRzhRLtrHxz3dZ3OM5QWCP0NLFnwZDM25ejUv3IhLaXiMFq5HJ7nn0UEVPz6j33LaUSzYymU3NjmwvJHzY8/sG1lMgu3' +
                    'GvbXdmcyoU159tZ1PhM+wuZzERWGne6UUZoyaAuBJR4Uk6rCmCtPsHaLnm/jGKRNCxZlPP8AGPT1rsDyll3zAwo9vktMzCgXNlCKBInq67MYZhNCTyNIRNjygqqr0JKCiyvELJaLLdE47A2HtuLpfWbG33J2ws6l' +
                    'vONGNNGw5p2XHi+01JMpTrQELAi04SmqcAS8CqkWaJIK4J38g/cG8wWvGDdG/fHTyxu6TWek5tLW12GydC4ZRYDPK4uQgfptJaz7e9mmcJqQLgtvxgbRkUQlacNoHCOaRmjhJB5NbfzXang1TbrzH7FzL9rZBhdt' +
                    'm1jCgM162Fo7Z7NqPdP7dE57Y9M2Cfmil8SJV4uJC4BGTJtuzdm6/wDHnwM2Jvz9Rn7JxXAzmyK3XNFjzdZQO4rFzKixxLKC8btnPnynIEZbGS223F9oiJHBcc4FhIxXEKMbj8pqjzc0ngGk2MtudbeJmntl4BUR' +
                    'c3zq7kXGQi1Posqcsr+0cJ2UCPrGZ7WYrKuKKALYm5yKDzM1xKKjfnD5Q1ejNrZt4obkn4lpvxzixxo6BdJ4jHwhmHIuo9cxWw7m6nXFkb7bUsSAn4494hy6jbjnJ89hGa4FVzeTeyb7fdDoPyQ2O1BTauy6rIP7' +
                    '4ymvrolb+pPUeTy4UN1xuKIAroMKDHfwq+222P8AKCJ07sxVJyBTy/3u1gnkB4L+RmXQpX9lycW19Ly6HCYZlSZ1br6yka4sGwZddjtuOyYmP8ECuCi9/wAURem0wo8ozckINyb8c25ubfG2cKp7RNf2t7OtICOQ' +
                    'iD9EoJ1j9tWtzUinIajCAuNMAiuKPPaKEqqnSSMmT2n5k4dtXx18I9I4HU2kTaWqoV5X7puZcOLHh3tvYXItUhRHmJT7r4xa4Go3LjbaogIiIvPpy5XLf9c8A0xty9ofH3eU668itw3M3G7/AB7AtT1exsmgU2HP' +
                    'R8CoKd9/LbmkrYyFFoPvHQYV8jWQCvI2rDSo40vLcMgki5oPVD3NfI7aG1dweUniD5Obbp821/omFk8uVsyvwepgS4T2K2UMktY8KoRg1dBvvEmhdVVE3G0dVs1Ugt5nMeCEaRgLaFGLX/kTq7RWf7x8cNc6tpcV' +
                    'xjQMKSnkJtfLaV/N8hurqoySFjDD1bX1dpUtDEGwnMOg24//AC8miNqKg4ea5fK6pRWRNYFvK3O9qeQUHyMuvK2Ljmx2/BewtpmBTH8ep4FHd5diUuWzLo2kFlpJkZyOJTJUERVXGI7ZPioCi9JxTvZWhzQvia7N' +
                    'eGI/uT+WlpidttTI/KzDfH7UGP3FdQwqqxxR+XRLZWEWROi1TEXG6e3s+z7aI4ROkSIIj/7iEooqYBJ6o5IAS7+TsvB9SeQOE7unvYFG2Zn2u8dzTXOJUBi9hmX5jYy5NcN5CGKjLEaCDTDc9xt4mlOX3NKAl7oN' +
                    'vpL+RtsQKF+Qqae3sElZtsheMFyS2E/cWipA6eJ/VRDU+/MmznOaGBuipHGKsO+tyDNmAEwiMyk7QektNd5Gy2SoROtqSoiqqoXCdeJu/uyYLSfMtLyTpdkT0dz6Feyu0bM7taGawe24ZGKHTTU0dW54eCus0VYx' +
                    '4eYv6gzzMq7CbPKIwli16+rT9PeVQoy80/CcV1tmSMx9xEcBHOe0O3+VVLrDbfbfIeWuPGh4Urz6HnyVgnui76DgfnTl1HIoDeYG6Me3H5Q3GC+XmHrgcHRddWVWI7PgyYVm7jxXEU5sSRMg03sMz4rxNo4UVOVZ' +
                    'TuT3FTlV3+3buTNuN9AGuikBhdQantoKlzBSmH4LG7/+E+//AIk9WPYRI01oDXg/HimD8JtVeQOQ7t1TtPKdyxtpaHpCcax3MK27WHW1kyGSNCCVZDGICbEh9sEbVtPgqr1kdnCZ5WO10AdiXOJcB7+IWiRudFG8' +
                    'EBwLcA0Chr0HBBX98vwQpKq6Y8sdGVIToNi+5G3tGrmO0G5rpI6xbuMtDwCPERNvkn0oXYv/ABKvXsr0l7yjbO7b3yB7c2H5t/MDx6Lz36hdsvETbtsZYcnj5O/I+5fO/dQajH7SNK3Bu6qoL6U+0rFYc9y2unHU' +
                    'cTgQYhe8SEprx9aoiL8etlLQAs0GJQ30dsi+03+4p5o7HAiek4h/1THLWlRF+5q52Q/o1uySEipw9ElPAX5EvUSBinZXfx2xjIPG3BvP/Bfuyj3Gdxdk6tnyUACWVT4Nidxk1u33EnKCUuPVnynxRE+S9cAuUE8S' +
                    'Y+tJ3jHYS9x41LzTWGtc6uMxyzCa+atbMu2qnE4cMIKTBRTZbccmCTqh2mQCQAbREjoKRvLcQgITEb3zut8tvBfZ24sys7HW1friK3O8SfFPEUr4GvsTx6nz3HMMsJV0RNjIs7aT/capHMGmwbQHnFUUdBkUzU4o' +
                    'UOt01KNfs8ePFz7yEcq5wVomeE5T/wDX79TnlF5+DSf7U67guRCj4jRj5reHkN6w+3uLjBPGd2vYbjs8OOz9T4rK4N5zkk4Jz1QUTnjp9C0eUSikYpaPCHE8fyfRO65+Z1Uq7wbXuT0mWZdTQ3G2JM6JjOAZtblE' +
                    'bddE0bV9Ge1T45ROeFReFRrDIWmoQuFQjvuPaS+WHiZsTLnxsdSaf1+xcf8AbF41Y26y1jkD+07nF49lbZPKMRdtLB9rKBBhUARBxXXE7EIhcI4k4lClByGdJheOfh2gUH6689W5z+nx/ZOQnKZjIQl9sUVF9fx6' +
                    'eWUmknCqSlXXfzGRZB4o6IyfIq84VxgOYZlj77Zg2Cs01tW015VBw19IoUlu0JB/j0ldFxdU8UMWSYX9v5qsY8YvMjEbSqi2Nh5a1krX+MvSWu4472J4xabNaKOX/C85dVdIxzwv0OEnz6bgJRJv4OwK6+8tfH5M' +
                    'laSXimJ5DFyXL4prwDlPigHk08SX/KsaA4i/l0C5WyYt5F1WrcnpPHHTsWbqTa2e4mGc+UHmUisWmXlT2evWtn2FdikQ/YagPq085FaeNxTV1Ac7wURMF5JHH6eASbWAYpZcWxzH9deXfnDrjXlvZHgOPYRnwYtL' +
                    'upbc23kV7zcSWAzpLQNg9JND/rGIoJHyqIicJ0WH7wjPyKNBZLkc7zX/AHWKsHxnS0iZOct1T4B37bbeNPkqKiL/ADONj6oi+ny6KxwDqlG0F2AzTBYxtnfvk75cWWd3uKY/Ko6ih2lNxjxWrEtqnFGMUt8et7zK' +
                    '6qrGuakSktLeOUj/AJgXuSXZatOPOF2AiPIRC5hFcfbHwQXNvNGQSMPbBRPB9z0vi5gec7L1vQwfJ/w22FY0lL5B+POx6lmDm2LS30l/pTzVvXtFDljy28MWzh8cH2fcQ4rhtF03fG+J3JJte14QG8h2cWyDceJb' +
                    'S1lDLEsM21hGM32F6+fRmQmMV4A/SOVjTgjwbQS6+Q8BqquELqK6bjve4cdeyOc/UVVt7j0YZhEDXVzCgFGespTEaWyPY4y8L7bTqf5gdYEuxfyVFTqLvbGC5iMczQ9pwocQoDat9vttuWz2Uj4pm4hzDQjxpmOY' +
                    'NQUwWVWkzPdaxsKq81fj01BM+9oKgHhlt1kt5RR11lIyqaNmnPuAKDx6kgqvKLRNt7FtNqv/AOVDGJWEaXMdQkNOZaTgaf8AaeGRXoOL1zf3JaCz3giG4BBbcsGlpIwAmYMq/wDkbkRUtpWibV+W5/hew4OeG8t5' +
                    'lOHWEWac+c3+pxDlQ3BdYV9HkIXB9EVEP5dblt9pYfxBFA1rI3DIANzzw+eCzq7upjOXSO1vBzrqrTkamvQgo76N8gN41ucUVbrFyU3ld3LRmiqamW9AJyRINfpHlxQTu59e7gVT+blOsf33/wCe9in+qNz4XDiD' +
                    'UeJB4q9bT6n7nbmho8ciP0V82kf3T2a5iZg29cXZ2lNOt/Tra2qHqSbXSm5cVG5LDjtc+cOQ4AmoG439KknzVO5fK2/7fP27ubna2SCM0Dm1+JAqAeBxOK9mdmdhX3cu1tJaYvMGIfngaUyrTiOi+QnSWl6PbW8t' +
                    'X4TfbQo9QVkn3pt3nl6xbSIEOLXizNd/p0kOc+bziIoMgoCBOEiG42KqY/Q14+nAVXgEZpzKHQtA/wCSPlVs3MvKzSWF03k/X7Ljw61M6kWsvHZmWyX7mAEqPDqlcdAZANx3VbHkUJXOOB7VhmtIcliVOLA9SbFr' +
                    'nLOs3Vj+IWjuscplZi/mxWeKra7V2ljLWvbWPGNyBKbcbZZqI1mbquI2omrYGTqqKLvhLQcM0Ach94/eP2tcQ8avIzT2wfNHTWNZRkMGwla1nxsmuLmLbTrOHGgvQHxqad92Kbf2bRtukKtr3l3KPanLcNKNVabG' +
                    'qLAMN8MtleG+f760ouf58+L+nNo00vKrqTGRu9q76xr8gum2lg1tc7+mj9oDcUjOUok8rbQ+6nBjqLqrS5rpquvvCbXmoWvKfV/6rj1nTpLA8ls0qAZpbTN7H7hub+lqwauJlICjYl3oSGqoicclXVWKGZY/i3lt' +
                    '4uTqrYuKbHh1VFqWHk+waJ2fcwMb/tOjr8UlNSpJQhVr2Fq1d7mANPZMCRe5SFHsUpERaAk3E6q8F08fde0uiNL77wbM/JLXEI9psvQa5+Ha3NoIHZYVk+Kob4wqoyBpl+5ZJ0kQlRtTIRJQ7VZhpRyQsrVN7g2r' +
                    'vEPdnh9sDb+n7ew3As53UO0ahMkyG7pbadMoJk6NYWbbQxaynlN4+yBK3HN4pCtkX9AHDb4NK6qh02QmFaI0Bg2IbAwrPM31qxmUK2WmkneEwxYXI30eQiTI7LKI4Mh1tOQNRJrle3uHlza1qkZjgtbX14bs8XNo' +
                    '4Znu/cXos7vs2w+fhePZVaWla9XRscqb1mVKFWq96GEV4b1GhaaP3FcDlQEQRTVvWHBFgcmK8ccF1hrOL4T45ZeReuZMvXOxcjyLZsmHa3VlEjty3aOWzIlfZVZqUU4lIsdEAScRwiEhETQukYGYGvJKSOyQV8ef' +
                    'F3CtWbE2nkVv5U6ir6q7wzPqPA/dy2ZJlRpN/SSqhhuQ0xWEXe9GkOMIQ+guGJEqAhKiLGkEVRy4URApMboo/khrby8xnd+l5OLU+IYvT5bqfZk3LWDbGt1rDwK6i2FPRxGpU5o/aecjpCfcF4CbRU71cZE80bmu' +
                    'KCNwcFKbjB9H5b5SeS/kThXkxr6BpffOOZgOB47bz5eNZXVSLKq9+HXy6JYj4suDLjDE4bkOMoJI4LpNp3dJsNHVR3Rk4Lyf1/gVB5Febe52/K7WB4huOBl8jAa9i+uX7iYB5VBymFEciDUCQyJbFerQCS9qPEKG' +
                    'SDyaJkJaIEOC9dd7caxHZddllDmEjX8wINzBpdixIC2LlJMuKOVVxZ5w+w1kMR35AOvsiBkbQmIgZKgqVjCSpq8AMRXPlhtry48nsFTRO0N5eNOA6/rL1L3JpWNzsexibZXLLCx/u58c2Etkd7VVTaSK2RLwhtqo' +
                    'iiKvccjwVda5uYSi57s7CRyTXGLa+yks8xzUOGU2KP5+MSZBh3c+NLm20uRCj2LbMkIoPWBMMk+2Dhi2jhAHf2CwuHYqC3iESYBS+r2fWuNCrrwiXpyi/wDn0gFUTZPCl1PuqDik9uzrzV2aXLcUB4JBcUVX3CQv' +
                    'RUbFFJE+aonXVRH7a5+BWRgR7My7IFyaQ97GKTSc/UMeabFY5MOoveTqcKrjhd3cRkqqpfl0LS4GoKGV0MAAb9wyP6IiYdRjiG3MPZmXjtBBj3Fc/EyiMLb70aP94BA+2JkIkQInPBKicp6+nV5t5xNFj4FWu0u/' +
                    'MjD28fmg1i1jkuT5JkrmKXk3AawbixPHsZCYCfpjJznUaik6IgLispw33KnC8c8dZLf9obXO9xlha/VXMcOSul16590WxaIrp8emlA36R+CWB7KssnU1jSBmbkSkuVbO1xOn/wCU1shWxMAF8Ya97/ajipw44SLz' +
                    'yqc9a5/FaRnVQBlJ6Kd4ZcTG8Cy2IVHAZiY2zG+ytWIMaPII3nfbRlx5oB9xU7eeV+pE556ViiAOSMCaIP12dWjOR19mUaNaOVMuPMhxpjSSoxOw3UdbQ2nEVDDlOCFU4IVVF9F6T1AuShw4pm8yqcrzKqtNpS8O' +
                    'o6jJc6bW5q66ur4UaM6EpEJtYNbXOArbCiKoCI0IIqcKvPxWfG3SSKVQBxril5iawyvM8mp4UXGWW482SJXEQ5bDI+y05w6ho0Rm2hqKp2J9aJ8vn1GSOOmhpUo5HJOP5AZFi+PDGh7rtY2T5HHZYXE/HzGoEWlo' +
                    'qKGjApHCSgIagPYgknu97p896ind3dN2RNaUlqKU4945e2Bw8FoKnXFe8nZ2VcIClECpx9UiZ7pIv5t9nSzWojnKBP0FndPrY2zrtlMc9Tkvmbziqq8r6nyvRxCEUyLfVWGMRv6xtByXooqPCrz/AIdKCIBEMhTH' +
                    'aQqaSLZv0MnGTmy78lD9Va7VCNH7fqLjjnnn59CYhmhD1CcwxJvHM5l1c+O1KGI+hNOcg4JtGXoSqCqnqnxTpdrQQk6kFTmJQVFcTkqNBbFHOeFQUT+Pr0IYF2pYLtNj06WpHWMsvc+h9icH/H8+h8tvJFLjVZcj' +
                    'F4NlEeiuRGfXtFt5RRUBRXkV9Pl+P5dEnhD2EJa3mLHhynukdCLszZeNYjaVyMVkp9v9TsRBCQYqHwXtkiEikXwH8/j8OqdvVybOIkj6uHX9le9lt2XsoA+3j0H68k7WQeJdBTTL5uXqqFCocZbkvPWD/ar6NNl2' +
                    'sJ3tumRm6voiFwqfFeOoQdzxtYK/U6oBGRFVP/8ArD3vJAoyhIPA0Q5yLRFVKpH7qpgP4McSIUiG08rzvvgzwouK0ad4AS+iGhL/AA6sVveMecDiOqrt3bOjGINOqrU8p26yx8ld7WUSGDcC1yi2mVY9qJ/pJshZ' +
                    'kdU4RPQmnRVPy6Q3Jx893ifb4LN4y5rQOSB7SIzyLSI2ny46YI6zG5jzf8jiiqJ8efy66qLpCyY9m8LrRumqoC888/7ehBQOYCFZf41bwq6mkm0kpgHZEtkm2wXhVXkflz0q0ql71tzg4FY1ZBtribbPtR3n265w' +
                    '5UY2g90mG0PvQ0b55JBX0IR9VThURVHtJ/YXpidjiDmpPbtxZCaE4H5odRHaGXv7baUGd0dDiuT5FbyqK1kuSGo5MTJrkpv2wcFtR4VztRHEH4cKidN7nSZDTJG3IgsBALqBcal0PS4zUEGVYe7muZZC+69juNRn' +
                    'UIIlZHZ99HZBD7YoRdpKq9wp2p+adXlkRrhkrq0VURyaPluw5yYZi9QxCq4Jqh4ZjEN+4lIap9SuBU+62B9vzkvtl8OU4VF6B9wzIGvhijNY4lTOl/b93VcwX7Gsx2FSNMD3k9k1ign6LyqlFoUdBsV+Ke5KJU5T' +
                    'lBVF5bND3CooPFLGNYOe+JmzNYYwOU7Lm2+e4K0jYSZONPBCxqL/APFMWD3vKKEaohLwnr8fXrjbFxq91UUigwC0uAZvUa4qM62jQUEGBC1zCiRcMpgaQ2JGSXjjrEByQsg3HHgjsxn5CiRKhKCIvx6CcNaKAIhG' +
                    'CUuLU22VyZ+R2dg5eXdxIdkW0991XX3pDxq4444RqqkRESqqr8V6bsaknFEmkw4mjacktg3wn0qaovrx6enTlookSVNoFQ2K8OL3GK8rx+XSoCKSibB1rOvoLj9eDbntILikhcl2coiqooiqvx45/HopdRdRFvGc' +
                    'NkVlRMx6taKqmze1yVcyEVrvZa+owRVT6UX19V6KSK1QhA1cJtc82HApa90Icm5eRt5815BpGxVxwvinPaIqqfj0leXrbeB0hxp7BLWlqZpQwcU7Wy9Tav11RYwMG/YzCqkNxzu7Ft9CaN1xBbNBdaVFQ0X0QRVO' +
                    'VT4L1mw7ovTcipw5AcPfjgtDi7cszbnDHgSfYJWts4VD17np0dZZ/q1NKjR51RNXtVxY8kVVBc7URO8CEhVUROeOeE5461BkgNRnT+1ZvLEWmijUYzabXhORJfn+HStUknY8L8rhQs8dxl5pwbjIDZOpsRcT22Ri' +
                    'NvPuh2Ki8k4iIiKipx69UvvixdLah4/28fjQK9+n+4shu/LcP9TD4AnHxVhO4bN2xhy4tXeSIWWznFjXR8R0hPsvCntMGckh4QeE5JPRFX1XrObERvmAcNRcaGmfRade+ZHA5zTpawYfnh1QByO+lM4XepkcpAhU' +
                    'sNivnSCBFfbMTQyiB7a8ESuJxzzwiL8eOr527sgjDgM3GhPQHBUfuPf/ADWtcaENGA6kY/iqWPKyIzZZrUbDgxPtI2Ywmo1rHReRZtKZhqCYIq8KolGSOYqvxVST5L1J71CGzVGRH4rKjXUSeKVz5evy6iKrl+/J' +
                    'OuqhXKKiKi/JOuqgUkx+/l08xiTGeVk2zFWyRVRRUV5RU4/PrmnFIXEIe0gqxfS+4K9ifFsnzbZYktE5KUv5WnQH/UAvr8FH606VBVLvrA0o3muNsYVS4xmrWwKKsjWuG5s6yFswb8ePFZdlNdzbilIZkM+26qKn' +
                    'JgqIXHqnPQEUR7C5c+PyyaOb7dEKpLWPyYtrY7ls5OzMtjvR0LCjv1iQYDctTVpJVRTI36+4PBIbxKimArzyKrd4WteaPxP4LTXPIChth5NZfpyfiUrVFLX4ncy8ecj2qnHN6LBddspTDjMSA8ax2UBGA57myLvR' +
                    'S55XpKVxZJ9OCBshQE2Du7dW1hUc/wBnXGSR3fVah2Y63XinPP0RGFBgf8A6SoXZpNz+a/ai3PtjRN81kGs8ylUDi/Ta0vf9xVWMdfQ482E/3MSGTT6SBwFThfl1zQW5Lg9HjdLuH2WBWFnrapZosU2k9judOYqC' +
                    'n20U2IlpittVsqfKrHjz3Uejoq8oxIbRfVF6EuLijvdUVSzUr70EvdZc7eE+tPkv5dLsCbEopYyNjkc5itq4Ts2fI4RuK0JGqrzxyn4ev49IX+4wWkJlmcGMGZJoEra2ks7wyMFzjwCtEx39vHZMXWLWfbGmTMSy' +
                    'LKYzi6i1fErjsMgyeUg8gaRlcYGHAHjl+fKNtlseV5JU7VyG79XazgxNa2ChOp5Ic8DixoqQP6iMcgFfLfsWkZ1uJkyo2hDf7xyJ6Bc6ht4/29xlGPSa5TjsrUWFT7jD7zU2E6rD7feyqgva4CoiivaScKnovWr2' +
                    'F+y6gbKz7XgEVwzVIubV0MpY7NpoUPNg5JaSr6ylOWCuNOOi2MUFRBQBTtX4ceiL+PT1owTV2aHWGWbFFtrEbM1NIr0tpp9BURIVkF7KEikioiKSp3en8vPUdvlsZbRzRnSvwxT/AGmcRXLXHKtPjgmG2kzrqoYr' +
                    'osDF7C8OFcSrG6mBGdQYrstOG25DpCQk/wAIjiIJKKJ8eFVesuhMjm62nEigyWoEMa7SRlTn+CWncWRMZFf4cy2x7c2qpWG7Zw17n1efkvSkVwvn3A4Jony7utO2WRzoWuIIJGPjzWcb8Gi4c0YgH2HuUUiB7xCJ' +
                    'co2PCc9TQKg6JqPGDXeWZztbGWsLiOOP0TyTpsoXAY7GIqiR9puKiKS8oiInzVOmO6tL7Z7B9zmkDxIUltLxHcskd9rXNJ8Kqwnb2T3dcFnjtjRRihHJQ0sRbVmSro+n9QeFVD4XhU/3dYlYbQ6aUxF5jeMSKY+I' +
                    'K3q+3dsUImDBIw4A1w8Cly3qMqDg+H1bkA6cbl6TIcry+LiMMAoqS8IvKIZFxx6p6/LratukaBprisT3jU/HhXgkfmantN4gOqcaRg8uyJ8XsOR4waE7aEw+TLKuHwgJIAzY5VURCMSX0HpTcrUSMwzVefTTU8FW' +
                    'za1lrR2VjS3da/TXNNIdi3FRKZNiVFlMOK06y605wQGBIqEip8eqe6MtcQcCEiFgdyqq9FohRgqqHG6HTVrtu7qnMksWL8KOqx9xw2a8VGMxYFJkORjFxPRSb7FXgu70/lXqQtLdpbqKT0udIGg0qnq09+2JuPyP' +
                    '8YG/KDAUhYvaZDLc/tPTryuG5ZwQNQWTFdNe9ptxRVWhMSThF+rjhesr7n9TLTbtx8gsLmDBzmnEE8A3iAM1qOy+mFze2JlY4B+bQRgR/e4HkkPta3YelcnkY5m2Ny8atYTnbLqprJALnYqipNl6iaKnKdwqqcLx' +
                    '1ctn3y0v4RLbvD29Mx4jMHoVnW+dvz2knlzsLHdePgcimL1fvClaontdZa397j80VGokkSIrcd4ufZJV/lNokRQX8UTqXB4Km3+2O1eY3glF1JeUGPZqL2fNzpeH3jD8XKPsTBLBBIhlsPMm76e41KZZd9fj28fP' +
                    'q1xHS6qvuvmi7uTVlzVu0121YMZPj+Ro7MwzL4/YsW3hvF7ioJJx7b7ZqvvMHwQGpcp8+nrmiQVGaB7Uuzkd9mQYPNGy416E0QqJCv4Kip0kAkCV7IzwiuFwIl/N0LggBRb1zFyPOren13CgnKro6WUGc4gqDcNm' +
                    'z9p4nnjNUREZkRmXFT0/lVPxVAcAAnAH0qD0IV/3TSWYvrXJ9UxY4oTggi+q+qFwifFVQSVE9e1fh1F7zuL7a2MjAC4ZAmg+KX260bNMGONB8V9LvjJSeKHjZrSHsbD5VZf5pBjsO5XtjIWWJFTj0p5lHhZq4Jqf' +
                    '6hKIV7mnj5b44VBVPVPIO+913F7PqmJklGQI+hh5NZjqd1dh0W7bfscVvFpjGmM8j9Turnf9LegSC+Xf7hmVbWkX2Eafk2bYXyKuRZVJkg7e3nK9guzH5BC2y18mmlXsH/hElTqR2Ts99w/+RemkdcdROJ/qIz/u' +
                    'jAJrf762FvlW4q/hQZeA4eJxSd6B8efJB9bg4eA24pcOC/DgQwflqZKicuKUX3BLvReeefXrb7H1J2S1j0CXURwa1x+QWdXPaO5TO1FmmvMgfmnzwvwJ8uskebdLS+Rgw4ncrhwHGULlfVVKaTAinx9eV/h06l9U' +
                    'bU/6UUr/APAR/mom7OzZh98kbf8AED8qrrP8edgav2DjGMbB1umP3NxYsC5NkWsCxlxK1h4VddYGC6TTZuonaButqQKqKKd3Cp21d9219eNtnEse7JpFK14Vx+FRVI7h21c28BmaA5jc3A1p7sPjREzPsJz9bG0w' +
                    'SjalXEO2tCexemFr3nSjA4SssOGqEvMQT7DIvgKcqqoqL077h7Vnh3Hy4m/TIatplT9lLdvdywyWAkmdR0Yo6vP9/wBkB9k4VDl57atVMWPbV1SzAgTLR4EZakvxILMeQ4Bui24go8BiCjxyKJx6dW6/uI7Z/lih' +
                    '0AA9SAK/j0VEtILm6JkAIDiSK5AE4fgtK3rKGERHGAcN5HAUfbJz7dUJfUeHA7/4L3/Dpud6FPpFfH9lMw7C7/cdTw/dOV4w5VVay2xh5P8AbBqLEXqua6q8C0kweANfyR0RVV/j0wjuHPk1OOal7y1a2DQwYBOj' +
                    'n2Qjl/kBh1dR1TFhIqUAJMx4R/T5KtCciR7/AD6uKjSdrKj6oXqnw6ib64abyMCmuhr4KwbJtrhs88zgTHUBuOTudOXNIt5by49vtBzGID5hX44b32znevcpkfKFz8iElVEX8uepLWQcFCQRDRjjVKJg8uTS7AjO' +
                    'FFNJP2mRR48ntH2XX/7cng2v9MhIVM1EeET4r6KnpxPR34kbpOarG6bWYmOc04fqq1c22VbbMYqbTL/dtsyr2mYp5m897k2wrY7AMRWp5KKK+9HAEAJBL3kCIJ93CL1XZpi8CufNQYjoSFBIsWTOlRYMJgpU2c60' +
                    'xCignc46++4LTYCifEiIkRE/PpuM0Ypp88hwbnH9GeH2NWaNXrlm9L3XLYRH0hWTsonJiErakLqxmxERUVUS9keF9ejdwbvFtm3vmfkwE+J5fHDwUv2ztjry7AGTjSvTiVcVi37kGu6iA1qvQQWGF4bp6BV4lr6+' +
                    'mLFOREjQmW2rC3dcFe0jQQJlgU5FVRVXjlOvMk/plvF1J/JpV0oLjVwBBdU08ae4Bbxc+pu22jPJrRrKAYE4DihdvPySstxYGNPZ4ZT5JjUidMWvyW3pK4rUISgoi6Hsj2+4aqiqRovHqievr1cvTH0vurS/bNdE' +
                    'NaBg1pNSf6iKAge+qpXePqvaX0RtYAXOJpUjIZ4DgVW1kGpMQsXVcgRVo33vq9yGfYya/Lho0NsU/IBHr0pLtERywWUkBJ97FjAlOQbBhW3WV7TExUSFUXheUJP93SgTo5o1663PlWtoU+kgsw8rwu2JHLnBLeOk' +
                    'utedREFHmx5QmXkROEcbIS/HlOjaqZLg4hFaJneuMxOI5D8fpQ2JercdiecmCpIvwEpbXIj/AOnleh1Su5fBH1DktLD1ccKxkZ3eLE19ixPq5WE4azRjp3ejUUHU7pMgePTgVEV+pURPgOqnUoNIGah2W7MWNSys' +
                    'L1/CLE8OmGv6rLIkK4uF55IpkhFJeDX6ibQlRVX6iPhOC5lEc4lCiM97Kg42StECorZJ8UVP/H+HRbi1ZNGWOyIogimdG8ObmFxd59lYV1Vh9G1KNqE0QQnJLpPsxWydN1EZEl7VQSMlBTRe1F4TrNYuwm/y3SSU' +
                    'NTwFK+PLrTNXF/dDvIDGYeONPD8q5KW6k/UMTdtbIZSzcgWTV2hSy4cP3quZ76InehdyfWqki+ionC9O+9doDbCjR9IwIphQimXikO29wrdVJxPxwV4eO/uuN4rg9PQ215mVi9UM/ahEjXEagrUjsGTTCD9oiEqe' +
                    '0g8/Dj4deerfYt6c3Qxzi3DIkfgAtTmv9vB1EAHqAfmUN7b91z+4H3Y9Lr6FZvJwgy7ezuMgcTleEXtN0wX/AGdSA9Ot2lxcK+JJ/wAxTI907fHkT7qD5BZen8r8ivJPO9i3eLU9diDWR1aY8/kIQm4caDHlRHIk' +
                    'k4kYERFfcYMgRxzlRReUTu4VL/2b6RuhnZdyn6mGtGjM8K8AB0+KrW+d+Mmidbx/a7ifxp4q4am1/LwXDjk39ir81qIrd9cdv+tmo0PcbQf5AIk/qEnqS+nKInr6a2i61UL8RGK9B18TwWP7lBT6W4OeadT08Oap' +
                    'WyLIa5nZxxZUdArXZrva8SJ/QkOGQoQfgi93H5dZTOXSSPdxJJWpW4EbGt5AD4Ip2UT7dpW1E1LuDscBUQiVOeOFPlE/NV6LGaBLPChVi0URkZNfIL78DQ23F5IG3Gy7hUFJE+C/l/h04YCkXPqKFGYd7XLVDjuT' +
                    'RpMeNl1TcBOt3xHtIpDI+jftivCNEnp2p8UXqreTN/yOIwrWvTktTZfWLe3aA4lujT/VWur86oP2E+4ym+k5XYkgWc90ne5BHgVVVL0RUVPiq/Lq1FZa0ELRXFyzHs4FxKZB+Tjz7ElUaaFv3vt3ReVte1OOTQe1' +
                    'ePx6UhfpcDyKQvofNic3mFTbnONO4VmmXYg76ljNlMhCXxQ2o75A2afkYdpJ+S9IzNLXkHms8a6oUp1BeY9jGWrk9xK+0u8bjPTsDJ4DOAd5HBSijLVoDMRQlQ2yREFHBHvVB56Ws3ta+ruCJO1zmENwqhnSz8nx' +
                    'nJLnIPvCi2VrF9pyaLrLxkEhUcNW3WiJQVO1E7hVC+Pw56bbzbQ3dGyDUAa04VGSlbK7dZRhsJpgRXP2qiviEMqligxqCK/qORG3JsiT1IWCL+k2q/H6vUy/w6FxJUFdSaquOQy8easfyGXCg4QxXsEitw4oRQVP' +
                    'UfceDgl/wVen23xkzNpwVd2tpddV8fkgPENwDWM+Kq0S+hf5VX5p1b1c1//Z' +
                    '" />';

var mwapLogo2 =     '<img src="' +
                    'data:image/jpeg;base64,' +
                    '/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAARgAA/+4ADkFkb2JlAGTAAAAAAf/bAIQABAMDAwMDBAMDBAYEAwQGBwUEBAUHCAYGBwYGCAoICQkJCQgKCgwMDAwMCgwMDQ0MDBERERERFBQUFBQU' +
                    'FBQUFAEEBQUIBwgPCgoPFA4ODhQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU/8AAEQgAUAJYAwERAAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkK' +
                    'CwEAAgIDAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPBUtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRF' +
                    'RqS0VtNVKBry4/PE1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZqbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNh' +
                    'IgZxgZEyobHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo' +
                    '+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A42X/AM6Z3gk8IY/ikz8uaBq3m3W7Py7ocKz6pfMywRu6QpSNGkdmeRlUBVVmNT8t8rzamOKPFJni00s0uGI+xkOu/lP558v67p/ly6s4' +
                    'ZtX1T0/qkFrdW8/97L6KmQrJSMFv2pKL13+FqY8e0sRBO+zfLszKCBtumHmf8kvzH8oaPNr2q2Nu+m2xjWd7W6t7iRPWkWJP3aOXNXdV+EHrjj7SwzkI7i0ZOzc0ImWxruVPK35JfmN5u0S28waVZ2y6bd8/qzXN' +
                    '3BBI6xuULcHfkByUgcgK0r0ocGTtLDCRib2Tj7NzTiJCt2Fazp2q+XNWu9D1u2ez1SxkMNzbuASrjwKkhgRurKSGG4JGZuHLHLHiidnDzY54pcMhv7kIt0f8xltfi2ri/FKi3X+dMa/FsuL8Uy7S/IfnLV/LT+bd' +
                    'P05ptFWYWyOHjE0slQG9KEsHdVr8TKpA3/lamvnrcUcnATu7CGjySx8YG32q03kDznBqlnoY0/19dvYEuk0u3kimu445aFRNCjl424srlXAIU1NKGkYa7FIE2QAznossSBQJKVa5pWt+WNSk0fzBZTafqcSq7206' +
                    '8W4yCqsOxB8RmVjywyC4m3GyY54zUhSBW698sphf4pVW698Cb/FImzM97dQWVsOdzcyJBCpZUBklYKoLOQo3PViAO+V5JiETI8g244mchEcyy/zh+XvmzyJa2t55hit44LyQww+hdQTvzCl90Ry1KD7VKDv1GYeL' +
                    'W48suEXbmZdJkxx4jVLPJ/kjzJ54t7+70AWrwaY6x3ZnvLe3ZC6eoCUkcMF4/tEUO9DsaObW48UuE3a4tJPJHiFUkulwXeravZ6JZGM39/cC0tw80UcRlNQB6rOEoabEN8X7NSRls88Y4+M8muGGUp8A5px5t8s6' +
                    '55H1G20vzAsMd3dwNcwpBcw3H7tX4EsImYrv05AV3pWhpDBqoZiRG9mzNp54gDKklW69/wAcyqca1Rbv3/HBSbVFu/f8cFJtUW79/wAcaTaot37/AI4KTaqt37/jgpNqi3fv+OCk2qLdDx/HBSbVBdDx/HFNqgul' +
                    '8fxwUm1RblfH8cFJtUW5Hj+OBNqouV8fxxVUFwv83/DYEqi3A/m/4bAlUWdf5v8AhsUqizj+b/hsCqizj+b/AIbAlUEw/m/4bFKoJv8AK/4bAqoJf8r/AIb+zFK8S/5X/DYEqizf5X/Df2YEqizf5X/D/wBmBKos' +
                    '3+V/w/8AZgVUE3+V/wAP/ZgSqCb/ACv+H/sxSqLN/lf8P/ZgSqLN/lf8P/ZgSqrMP5v+H/swJVFm/wAr/h/7MCV6zf5X/D/2YFVVm/y/+H/swJVFn/yv+H/swJVVn/y/+H/swKqLP/l/8P8A2YEqqz/5f/D/ANmB' +
                    'Kqs/+X/yU/swKqLP/l/8lP7MCVVZ/wDL/wCSn9mBKqs/+X/yU/sxVUW4/wAv/kr/AGYEqq3P+X/yV/syKVZbjwk/5K/2YFVFuP8AL/5K/wBmBVVbgf78/wCSv9mCkqy3P/Fn/JX+zBSbVVuvGT/kr/ZgpNqy3P8A' +
                    'xZ/yW/swUm1Vbr/iz/kt/ZkaTast1/xb/wAlv7MFJtWW5/4t/wCS/wDZkaTaqt1/xb/yX/swUlWW6/4t/wCS/wDzbgpNqq3X/Fv/ACX/AObcjSbVlu6f7t/5L/8ANuCk2qrdD/fv/Tx/zbkaTb8vuf8AnQ52oLxR' +
                    'iyT8t728s/zI8pTWN1Layy6pa2srQO0fOCeVVkjahFVYbEHqNuhzXdoxBxX3Ox7OkRlodXqn/OTPmPzFpPnvSrLR9XvNLgl0hZZPqEz2zs/1mZal4yG6bdc1egwQyyIlydl2hnniiDHn7mW+Udc12b/nHjVNYutU' +
                    'urzVoRO0N/dStPcKY5E40d6k8TuK5h5YiOQgcgXNxSMsYJ5kPNvyD83+b7/81dH03UfMWp32m3MF4ZrK7u5poD6VuzJSN2KjidxxGbPtDS48UQY9fN1fZ2qyZZSE+g7qS78+lim/OjVbe4uY7WGUWKSXU/IRxJ9W' +
                    'j5O3EE0UVOwJ8AcyOz84w6eUvP8AU4naWnObUwj5fpKJtfJP5GXdxHa2/wCb6PPKwSMHRLlASdhu0wA+nH+WJ/zPt/Yn+RYfz/s/alv5p/lZf/ltrllpsF4usWOpxiSwu44zHI7dGV4Q7lSD0+IgjevUDO0vaMco' +
                    'lxDh4RfwcDV9mywmPCeLiNcuvzfQ8H5T+cG/Je18hR3VtZeZaCaStyUiTmSWhaWMGjANxbjUe9M5nxIHNxH6eK/hb1QxzGHhH1cNfGng/ln8sGtfzFg8j6l5ottNuGZhPqOkTzXDRXTB+MSyD0/3hdAG4vt3Nds2' +
                    '+fNg8EcMNjL3cg6bT4dR45EpixHnz5nkp+f/ACppvlv8xx5a1HzHdXOnxC1XV/MmpRvI8SSAMz0MsjuI42XiCwJPw+Byem1MMeCUoxrflbHU6aeTURhKV7c66JrZ+UfyQvrmK0tfzaR7iZgkanRrhQSdhUtKAPmT' +
                    'lf8AK0v5v2/sbR2TH+d9n7Ul/NPyHL+WXmOHRG1BNStrq2W8tLpUMTshYowePk3Eh1I+0aih9hsdHrBqAdqIdbrdIdORvYPkxCyv7m3vbS5s7iS1u4Jo5ILiFikiOGFGVh0I7ZbrMYlhlfdbXo8pjmjXfXJ9Hf8A' +
                    'ORsjjyp5TkkcvIWYtI27MTDHUn3Oc32d/fj4/c9L2iawH4felf8AzjU/qaZ5+b2tP+oebD2l/fn4I7NN4B8Xk3kSbl588ox+Gt2f4TZsNSP8Dj7ouv05/wALl75PRP8AnJacW/5h6U5NP9woHhv9bkoMxOzZCPHI' +
                    '9A5faMTLgA6lJ4bD8kGVOf5rqkzAco/0LdEqx6rUSEGh22y3+VJfzfx8mv8Ak2P878fNEeffIVn5R0XRPMei63+ntE1n1Al19X+plCoVo/gaV3IcFt6CnHfrmVpdf4s+EinH1Oi8KPEDaaeWPyz0rX/IB88y+Zfq' +
                    '3pmRZ7JLZJFiZZOChpWuIwOSsjmqigbv3oydpcMzEDYHvbsfZ/FASvchKvM+g+Q/LGlRzN53i1HXHTfTrG3S4jWVIzI4M0dw3wLTj6nDrTapplmPXGc6rb9DDJoxCF3v+llrfkzBp2lWOo+YPNNppZuJvTujKqLB' +
                    'FFR25JJLLEZG4qPg4Dc0rQVyB7R3OzMaDYbsb82aD5B0GwWXQ/PEWvatK1IdPgtkSqKRzdnFxJxCg/ymp+8T0+tllmI8NMc+kjjhxWwxbv3za0621Rbr3wUm1Rbr3wUm1UXfvgpNqi3Xv+IwUm1Rbv3/ABGNJtUW' +
                    '7Pj+IwUm1Vbs+P4jBTK1Rbs+P4jBSbVFuz4/iMFLaql2TsCT8iMaTaqt2f5vxGCk2qLeHx/EYKTaqt4fE/eMFJtUW8/yvxGCk2qreH+b8RjSbVVvD/MfvGCk2qreH+Y/eMFLaot4f5j94wUm1Vbw/wAx+8Y0m1Vb' +
                    'w/zH7xkaTaot57/iuNJtVW8/yv8AhlwUm1VbwfzH/glwUm1VbsfzH/glwUm1RbseJ/4JcFJtVW6H8x/4JcFJtVW5H8x/4JcjSbVFuR/Mf+CXGk2qrcf5R/4JcFJtVW4H83/DLgpNqi3A/n/4ZcjSqq3H+X/wy/0w' +
                    'UlVWf/KP/BLgpKqs/wDlH/gl/pgpVVZz/Mf+DT+mBKqsx/mP/Bp/TAlVWY/zH/g0/pgVVWdv5j/waf0wJVVnPdj/AMGn9MFJVVnPZz/waf0wUqqtw3dj/wAGn9MFJVVnP85/4NP6YKVVW4b+c/8AIxP6YKTbzf8A' +
                    'Pz81dZ/KL8vV836JZW+o38t/Dp6xXrsYUE6SNzIiKliDHSnIdchM8MbUbyp8m/8AQ835zgmlpoIB6D6lNt/08ZR4pbvD8y2n/OdH51KKNa6Cx8fqMw/VcYPEKeDzbb/nOr87CBwttBQg7kWMpr7b3GDjKeBCRf8A' +
                    'Ob/58RzNK1zpMsbfZgfT14L8irhvvbBxFPCEUv8AznX+eSyFiuiFCABGbB6AjuCJ67+5wcRTT7H/AOcb/wA0vMf5sfljB5u80G3j1hr+7s5BZBbeHhblOBCOzkGjb75MbsTs+GzJ/nvnXAvIkfjdkX5dvX8xvJw/' +
                    '7XVh4/7+XMHXn9yfg5mgH74fF6X/AM5WGn5i6N/2xR/1Fy5hdl/XL3Ob2oPRH3sy8mGv/OMmsH/Iuf8Ak4ma/P8A3sveXYaf+5j7h9zyn/nHRuX5x6D/AMw9/wD9QzZue1fpj73S9kj1y9yffmlpNl5g/wCckovL' +
                    '+otIljql3plpcPDT1BHJBGGK8qitPEZj6bPLFppGPO2/VYI5tVGMuXC9B/MDUfy9/LnzjpuhWf5P2+qfXDG1lqCSSIryOyrxSMrIJCrMoI/DKI5tRlhL1bAbt8sOmwzj6dyduaR/85bzML7y5LGxjZ4JN0JUgMWq' +
                    'Kof1Zd2VATySBFjh/SGjticoY4yiaIl+gqdyg/6FUtjyfeYOTzepPNuprWntmLGEfzPDW3FX2uZKcvyvFe/Bd/B5h+QwjT8y9CjjUKonUgCvUyKSfxze9qY4w04ERQv9bz3ZOSU9SZSNnh8/J6d5z8u2XmX/AJyY' +
                    'h07UlEunyTWL3VuwJWWKCCJ2jNCNnHwnNZgzyw6WRjzMq+x2uo08c2riJchG/tZB5u8w/l/+X35iWnlSy/KGHUJ3a2NrqUTyDmbmgBihdXD8WJX7XUeOU+JqMuKUjK4jm3+FpsOWMRGpHlzYj/zljJ6fnrQz46Sf' +
                    'H/lpk8Mzexvrl7nA7cNQh7y8OsrjleWy16yxjv8AzjN9qh+5n/VPd3PPaOX76H9Yd/e+vPz68p+ZvM3knQH8t6Xcaq9gVa5hs42mmVZY0VSI0q7bjfiDTqds5Hs+cYZgZGhv9z2naMJTwERFnb70p/5xz8reY9F0' +
                    '3znZ63ps+nahem2WCyu43t7j+5lUFo5QrAMT8JOxw9oTjPMTE2NkdmwlDCBIUd3lfljyB598vfmD5futb8t6lZafYa3bG5vZrScWwC3AWol4FGBJAUqx5dq1zP1GfGdIIg71HZ1+nw5BqzIx2uW+7JP+coZBH+Yu' +
                    'hKekmkpH/wAHeOtformN2fMwjkkOgcvtCAnLHE9ZM4/MtfIn5SW+j29v+WcXma3ljWFtUnne3YywrT94yoyNI4UuQFUeGQw5tTmJEZM82HTYQDKP3lCfntfpe/lr5Wv00saIkkwI0lRQW1Ep6dAFpxp4DIdnf38f' +
                    'j9zPtE1gl8PvY15XuUT/AJxm82hlZzcalcRqEFaGtu1T4Ci4NX/jB96dIb049zxqSf1YnjD8S6lQ1K0qKVods66cOKJHe8lDLwkHu976Dj/OmPXfKNhaa9+Wt35jvAUFxwBjsTLGpVpYJF5uAW6KdwKg5yw02aEr' +
                    'iR8w9QdThnGpA/IoL83NF8u2/kry15n0jy8PLV/eTSR3mnhmYgMv2ZOVTyVk+HpsTUV6X6HVZJZRGRsFq1umxwxGURRDxlbv3zoqef4vxuqrde+CmXF+N1Rbv3wUni/G6ot174KTxfjdVF1740y4lRbr3wUniVFu' +
                    'vfBSeJUW698FJ4lVLknpgpPEw/zP+afl/wAr6j+jLhZ729Va3EdoFb0TsQH5Mu5BrtmDm1kMUuE7nyczFpZ5BxDYMduvzr8oX8P1e70rUpISQxVeKbjpUpKpzGlr8UtiC5EdFkjuCE00/wDOzQ7uRLTTtH1e6mUA' +
                    'LDDCsz0GwqBIT9JycddA7CMmJ0cxuZBn2leYP0jZJeT2d3pruSDa3sRjmWhoCQOQ36jfM2E+IXRHvcWQo1YPuTUXRHUn8MspjxKi3Xv+rBSeJUW79/1YKTxKq3fv+rBSbVVu/f8AVgpNqi3Z8f1Y0m1Rbz3/AFYK' +
                    'Taqt37/qwUtqq3fv+rBSbYx+ZHnW48leUZvMFqqvcpPFbxrInqKTKT1AZfDxzHz5PDhbbihxzp4BJ/zkb5+klZ/rUEUXL4IorKH7NT1MjOa9M1f52f4DsfysfwUysv8AnJHzdBpU7Sy2dxqjXVLaO4t2ULalSeTm' +
                    'IBag0G2EayVdLYnSxvrSby/85G64tzKINR0qS0MDNAfqV4ri4CLRXqPsluX2e2TOrN9PkxGm9/zUm/5yR80oun/6Zo5Z2Yalxtbusa+pQFAaV+Dfqd8j+bltyZflh5sy/K789L3zX5jbQdeu7NpbtiulRWVtNGzB' +
                    'Fd29RpAVHwqO4y7DqOOVFhkw8MbD3Jbw+J/4XM7hcW1Vb0+J/wCFwcKeJVW8Pif+FwcKeJVW8Pif+FwcKeJVW8Pif+EwcKeJVW8Pif8AhMHCniVlvT4n/hMjwptVW9bxP/CYOFNqq3reJ/4TBwptWW+bxP8AwmDh' +
                    'Tast8fE/8Jg4U2rLfHxP/CZHhW27nV7XT+P6QuobMuCyC4lghLAdSodhWntgISJKtprFteR+rZ3MdzDWnqQPDKtfCqEiuCk2i1vT7/dHg4U2rLe/P7o8HCtvCv8AnMuVpfyPiY1p+nrHjUKNvSuP5cozD0s8f1/B' +
                    '+fOYLluxV2KuxV2Kv0b/AOcI7nj+SIQ/sa1fj4fTPVYTvy375fAbNcju+Vat/mc6gF5cxVbLUNS0rULPVtKnFtqenzx3VnOVWUJNEeStwcFTQ70IplWbGMseHkzw5Dilxc0w80ecPNnnXUodX836kNSvraD6rDKs' +
                    'ENtxh5mTiRCqqdyTWld8r02lGEkg3bZqdScwAIqvNl+gXf58XPlJ/LnlrT9QufJlyGVreDSPWjkWQ1NJzGXNadVfMXJo8ZmSZ1ZcjHrMggAIXQQGk+V/zl8jalF5p0Xy9q2l6hZJKqXkmmSTqiSrxclZI2X7NRuM' +
                    'y9RDHnAHFVe5w9PPJgJPDdsX1/zV5m8y65J5l1vUGfzIWjP1+BFtZEktwFQhYwFDKBTp8++Tx6KMcZgTYLDJrZyyjIBRDK9Q/Pn84dVsRpmoeapXsOJV4IYo7USKylCsrW4jZ1IJ5Kxocoj2VAcyfk3S7WmeUR8/' +
                    '2JB5r/MTzf54Fqvmm+hvFsRwsxFbRWvpp/IBCqgqPcZl6TQjBIyBJ27nC1mvOoiIkAb3zXv+ZXnN/KieR2v4T5VjFFsfq0QatSeXqgeoWqf5qe1MgOzQMvicR53ybD2mTi8PhHKuflSnpY89eS/0f540yzutNtyy' +
                    'mw1ee0L2kjMCV4NKhRvs1FPD55l6nFDUR8Piog24Wlyz00vE4bBFKGr+efNeueZY/Oeo6jXzTC8UkOpQxRwsskC8UYIgCggbbAfflMOzoDEcZN2bvub59pzOYZAKoVXeyXVPz7/N/WYVttR80TG3QHjDbItkjFip' +
                    '+MWvpcwCuwetO3fKI9jwF3I/JyJdtTNVED4sd82effNnny/t9S83X66he2sJt4JUgitqRFi/EiEKDuTvSuZuj0I05JBu/Jwdbr5akAEVXmkazkGoYqRuCCQQfEEdM2MoiQIPIusjIxII5h6Dp/58/m/pmmQaPZeZ' +
                    '+FjbRC3gD2drJKsaiij1Gj5VA2BrmgPYsL2kfk9EO3J1vEfNIPKvn/zr5Iu7i/8AK2tPZXd5GIbxpI47mOQK3IH05lZFap6qvt0y/L2TjmI0SKFe9x8PbGSBlYBs3z5JldfmV+Y3mPzFp2uXeqi+80WrwRaTPHaQ' +
                    'q6vFMZIlWKJVVz6jVAKmp8crHZEIxIMjv1rk2HtmcpxIiNul8/sTHznZfnP5sn/T3nvStUuG0+2aL662mPYrDbqxkJZoo0UBTVuR3HjktNpMOOxxiXEK6frY6rWZ8vCeDh4DfX9Trb88vzgt9Kg0WPzhcJp0Cxov' +
                    'oxxQXJSKnEG4iVZewqeW/fIR7GgDZkSPczl25MxoRAPv/YlusfmR538x6Va6Fr2qx3mkWbc7aD0I43RvH1VHNie/Nmrlun7LGHIJiRNeTTqe15ZsZgYgX5n9ShZ+efNth5buvJ9lqccXlq8leeaya3ikYyy0q/qM' +
                    'OddhQVp7YMvZYyZDPiO/l+1OHtc48YhwjYd5/UlYu9vhZa9uRJH0gUP45tZwJBA2+DqYZQCCd/iXoV/+fX5sX1jFpdv5jGk6XAESC20mL6n6cMZXjFGysWVaKFpX7O2aWPY8RIEyJ+H7Xey7bkYkAAfH9jFtR83e' +
                    'aNetdOsNf1h7+w0kOLC3KJEqPJXnIxQAu5qd2Pf5Uv0/ZscM+OyT7mjUdqSzQ4KAHv8A2IRbv3H3nNnwuuGTz+1UW79/xwcLIZPP7VVbv3/HBwsvE8/tVFu/f8cHCy8Tz+1UW798HCy4x3/aqrd++DhZcf4tUW7H' +
                    'jg4U8aqt2PHBwsuNu7uiNG1SValo7WdhQ0NRExFD2ynNtE+4t+E3Ie8PBdK06CzuY720lnlkl4oJJKOCHYGtAoP7HjnMQgAbD0k5kii3+m/WuY9KsYvW1CUtCjM/BFm4cASGU1oanr2weJZ4RzXw6HEeSfeT/LGk' +
                    '6tHa6jcebL3TNfvrSW+ufQdIljiWcxDnIXBFTQhT9GZGDDGVEzIkRf2tObNKNgQBiDX2MvsidLU2UH5n3HEVk5TW0VyRsCR6knM9N+Ncyo+nYZfscY+rfw/tTa2nvLiRYYPzFjmuI/jaO4srVFZQRUEnhsa02bLY' +
                    'k3/efYGuQFf3f2lmYugGK8lJABPEhhRhUHbsR0zY1bg3SvBK0rFU3IBb7sBCRJAadrsF9eanaxSq72E6wyKpqVLRK1GFBTfllcZCRI7i2SBAB702+twW1tLqF9Ktvp1spkubiT4URF6knwwyIiLKI3I0Hivm38+r' +
                    '+TUzpvlaIWmjwzcJNRjCTXVwitQmESK0aBh9nkrH9WaTNriZVHk7fFoxVy5sqg/PWzjgHq6FO3pKA5MxeUkDflxtgOXjTMkavb6T+Pg4/wCW3+ofj4qVz/zkLp4hHDyzfMH+yyuuxB7gxjI/nf6JZDSf0gyvyb+Y' +
                    'mn+bkliW3l07VYKvLptwD6qw1ULJXiooxbMvDmGTaqPc0ZcZhvdjvS7893ZvyrnYGga/tCRTqObbfhmPrh+7+IbdGf3nwfKGc87tH2dvM9uZRLGkXKlGRZHJ+kVpkwNmJKskEpcKLhBy/aECVB7eH68NItX9O6bp' +
                    'c8wNqm2hP4sa4d0Mw/JyOa2/MvQ/UP7pXmKn0owSwt5AKkGozI0o/ehp1B/dl9erd/50Gb+nUWqrd/58RgpPEqrd/wCfEYKXiVFu/wDPiMHCniQ3mHzPoXk/R4te8z6gmn6XLKtukxhkmJlcMQvGJWO4U5VknGAs' +
                    'tkAZGgwa/wD+ci/yrsLiOCPU7q9B5erLbWLlI6Db+8KciT/LmKdXjDeMEy1D/wA5L/lMUDy3moqf99/o74vv9QjB+bx/gMvAmsk/5yj/ACoik4oNYmj7yJZQgfc0wOROrh5p/LzdoX/OUH5Y3Noh12a/sb/4/UVL' +
                    'H1Iqc24cSkjmvDjy964I6qHVJwT6Jof+clvyfCMy6veFh9lG02YV+kVyX5nGjwZs48oee9C88aR+nPLkrz6d6z2/OWAwt6kVCw4tv+0MvhITFhrkDE0WW6ZMk97FFIvJGrVSopspOExY8T4n/wCcnvNt75j/ADZv' +
                    'fL+sRRNpnlhjp+miAi3f0p0jmJldxICQzHfiNs1GeVzo9HPwxqNjqlv5Tfnpr35V6TcaJp+j2uq6VcTSahIsjsksbOI4iS6BqACMbFe+DHlMBVMpwEi+sfz1/Nif8ovK3l/WdK0mDVbzXZGiH1uR44ogkKyluMVC' +
                    '1eVKchmZmycA5OLijxEvE/K3/OW/nXXfNOj6Lc6FpMFnqd/bWcjRC4Mkcc8ixsVLSEEipIrlEdQSQKDkHEALt7L/AM5bzCT/AJx/YgV/3KaevQChV5B/DLNQKi04frfnrmuc52KuxV2KuxV94/8AOHmv6dp35X2+' +
                    'i3t7bwapqOr38mmWEjxC5uEVIgzRRswdwCrfZHY5mYapx8nN4QYs3YLqjBr08lbAwer/APOOHlXSPNP5q6faa5brd2Nlb3GofVZQGiklt1Hph1OxUM3Kh60ynPMiGyceMcW70z84P+ckPzD8pfmDrHlTy2bC00rR' +
                    '3S2j9W3E8jn0kcsxZgBu1AqgUGU4dPCUQTe7ZPJIGgxby/8A85Yfmq2uadFqMmnXdjNcww3FuLUQs0csiq3F0aqmh2OWy0mOurWM07Tb/nL3yfomnebvLmuafbLbXWurNDqgiARZXt5IwspAFOZWSjHvQYdFkPCQ' +
                    'ejXqsYJBYR/zkP8AlR5Z/K3WdC0/yzJdyQalZy3Nwb2VZWDpKEHEqiUFMyNNnlkBvo4+o04iRTznyL5fs/Mnnby95e1FpFsNU1C3s7loWCyCKaQK3EkGhodtsysmThiSOgcaGHikAfvej+ffy5/LL8vvzni8pa7d' +
                    '6jD5BSziuLy5RxNfCSaF2XiUj6cwo+x0yjFnyTxcQA4mzJp8cMlEnhfQHnSy/JiT8ifKlr5h1HVYvy1jktjot3ApN87BJvT9VfTNKgvX4B2zX4jl8aRiBxdXPyxxHEBInhfLX5m2H5I2unWDflVqWq32pNOw1FNU' +
                    'Uoi2/D4SlYk35e+bjBLMSfEAA8nTaiGED0Ekst8i/kT5Yt/JcX5m/nLrknl/yrd8Tpdha0N5dK9Sjbq5HMAlERCxX4iQMqy6uXHwYhxHq2YtHEQ48poJppvl3/nEnzleR6BpGqa75c1S5YRWV/fkfV3lbZQxkDqK' +
                    'n+Yp88icmrgLIEgzGPSzNAkF5b+ZP5U67+V3nCHyzrpWe0u2STTtRhqsdzbNJwLAGpVh0ZT0PiKHM7BqI5ocQcHPppYp8Je6+fvyd/5xr/LK9stO836v5htrq/hNzbLARcAxq3AklLfbcdM1uHVanKCYiOzsc2l0' +
                    '+I+on8fBItF/Ln/nGHz1qMPlryj5w1ux8x3tY9P+vwj0pJqEhaPCgJNPs81J7b5bPPqsY4pRFNUdPpsh4YyNvGvNvlnzH+U/nqbRbyVU1rRLiK5s7yEco3AKzQTIGB2Io1GG3Q5scU45sdjkXW5ccsOSuofT/wCW' +
                    '/wCYPnD8wvyF/NDUvOGptqV7aW93b28rRxxcYjY8ytIlQdTXfNLnwQxajGIiv7XdYM08unmZGzv9z43V2oN86KnnHtvlSw/5xln8u6Y/mzWdfh80NAp1WCzjZoEnqahCIG2pTuc1mSWqEjwxjXR2uOOl4RxSlbLf' +
                    'L/5d/wDOM/nrVYPK/lTzJ5gt/MF8HFi11CRGXRC9DzgUHYE05CvjlE8+pxjilGNBvhg02Q8MZStin5f/AJOWt/8AnZfflV5zuJWh0+O6Mtxp8gjaQwxrJE6l1agZWBKkZkZtVWAZIDnXNxsGlvOccydu4vOPO+l2' +
                    '3lzzn5g0CwaRrHS9QubO2MrhpDHBKyLyIAqaDfbMzDLigJHqO5ws0eCZiDyPe9H/AOcefyz8u/mnq+vWHmSW7jh0yyjurc2cqxMXeQoeRZHqKZh67PLCAYgbnuc3QaeOYkSJ280F+S35UH81PMOp213fvpvl3RI/' +
                    'X1K5jo85VmZUSMMKAnixLHoB0yWr1HgxFCyWOk0xzSNkgDzZT9V/5xHjZo/8ReY5OBKmVYn4tTuP9HGxyi9X/Ni5FaQfxSWeafys8hav+W2qfmf+Tmv3eq6boLONX07Ul4ShIgrScCUjIZVYPQghl6GuVw1koz4M' +
                    'kRv3NmTRxlDjxyO3ek/5N6P+TH5h2th5Z8xazqumfmPqlxPDZw2y1tSqgtF8TROnIgHYsPow59TkgbiBwrg0+OYqUjxMt8yeR/8AnG38v9bbyf5v82+YJfM9vHE12LZB6fKZBIoASBlBKnlx5Gg75Xj1OfJvGMWe' +
                    'TT4MX1Sk8o88v5Gtde9L8vL28vfLf1eI+vqXw3H1klvUFCifCBxptmzwiZj+8AB8nW5ZwEvRKx5ljy3f+V+OW8P4pr8Tz+1VW79/xwcP4pl4nn9qvNc+poWuR1/48Z2rWv8AupxmLqY1jPuP3ObpJ3Me8PIkupUh' +
                    'RnQw8eFYASVWgYAchx6jvTOYvZ6it2GQ3M9rfpdW7mO4il5RyClQeXXfMAEg2HNIBFF6R5ih08anPBZWcNpb2JktLf0Fp+5QyH7RJJqd+ubPMBxUBVbOuxE8Nk3e6ASIeihqprE/Ku/SFen35XTZa25ggkMgJHwx' +
                    '1FF2qZFHY4JAJBLNvKPmaeG+TRbmjwyBvRnIpIChchWY7sKDivhm00eY3wF1mrxbcYeo29zFpscEswMt9e1Sys0IDysqGQqpYgA8VJJYgDNhkmBs4WOJO7CNHg13SPMOq3l9o8Fnaa3Mkz+heRXMsUyrQ+puuxqS' +
                    'AoqPfMPTiYmbiPV525ecxMBUvp+Cl+eepz2vkjS7GCiw6jcqJ2FQ1Ioy4AoQKEn4q5R2lIiAHeW/s8AyvuDyHyPpMet3ctvKpY2yiWFlbhwYupLHb4gOIPGvyp1zA0OEZZEHo5usynHEHvewxW8UUvqNGEKAN6yu' +
                    'wBduXL4STQfEetevtnUiIBedMiQxV/PcsXrxtBFK619CaKWsX2QQTuSR8XYjNcdeRYofNzxowa3Z55I1u31P15ojSVVCSxn7QIYgGnYNSozLjlGWNhxZYzjNFF/nWwP5SSk9WurRh9Mp/hmt1/8Adn3hz9Ef3g9z' +
                    '5VznHeqkMLStUJzUEcgGVTT2JwgIJWOoDMAvEAn4a1p7V74pW0HhgVm/5QMsf5jaG+wo81Pn6EmZmj/vouNqj+7L61W6/wA6Z0vC6HiVVuv86YOFPEqLckg0BNAWNFJ2G5O2AhIki2kig06LVry6gtLGZlWKWcsg' +
                    'YvutNj9rtlcpRjuWYBPJ5d+emu6L5u/LqDQvK+o2+saxYagt1eWdmxaSOC2ilMrlWANE5ry8K5rNXOM41E3u5+niYyuWz5i0nSrjVpDFa27TMimRysscYWMMoJ+MduWakC3YyNPX/wDlW/5Uh7mNNWvLh7fkiKt7' +
                    'aReo7IXi+J0KqrUoWPQ7dcy/Cx97h+Lk7mKfoP8ALhESS4fUIgYbWaRRPzI+svwZQRaUPp/aY/tD7NTlXDBu4p+X4+LC9esrXTtYu7OxlE9lE/8Ao8oLNWNgGFS6RmorQ1Rd+2UyFFuibG6XZFk+q/8AnHrzR5X0' +
                    'T8uvq+teYNL0u5bUbpxb311HDNxKx0bgxrQ02NM22lyQjDc9XX54SM9g9Uv/AM5PJOh6YbjylfW3mvzJLHOFt7CQyxW5iiLh5ggL8GYLGvAFnZgoy2eeP8O7SMcuuz4q/MLzEPOPnrW/Ms8tG1KYTOwiaMCQRIrI' +
                    'IyeQVWUqvL4qCp3zUZJcUiXZQFRASyH9EJbP62p3DXAkFvHDHb8o/qjMGd+TyrQ13WPjuepGDbvTv3PpTzlruk/m/wCQND8x+fNfj0byrpElwLPTNItF+vCNXFsJ5TPcS8nZVUeitBVgeVKnMyfrjxE7OHEmEuED' +
                    'dKY/yt8mpDoXnvyjqEFrpVg1vPDdO8t3zuLaUcmunXgoYuvxCKLivuN8RhG0gVOc2YkM1/MLzu/5wflXdeTdBaxkuVu7aRLr144IpLu2md5VVnkIZDE8ZQgBuVQQKjJTJyDakRIhKzb41zXOwdirsVcDQg0rTsem' +
                    'KvXfy48l6j5n0aPULbS9CuIprx7dDfwzGSsXp81JjYALRxTqa1zLxYzIXQcTLkETVlkOraB5i8paJc6+dL8v20OjsCHtLadrlBKWQ8OUi0Vv2iGFRk5QMRdBrjMSNWd1cx5suJgYtenkuJiYvbP+cU04/m0h/wC1' +
                    'Xe/8y8pzn0KI09M/Mb/nIe28n+d9a8tP5I0/U206YRG/mkVZJaxq/JgYG3+Kn2jlUMPEAbKlj1j/AM5S2l1fWlqPy80yMzzxQiQSpVfUcLyH+j9q1yz8v/SKL8kf/wA5i8Y9Q8kO5+CNrxmPsskBJ/DDpDsWGQXT' +
                    'X/OVHlLzJ5tvvKmv+WNLudZ0j6hJGbnT4zcgGWQSoSIwTRlNQ1KYdLMRsFjlhxU8i/LL8vvPFh+Y/lO9vfLWqW9nb6raSzzy2cyRxosoJZmKAADuTmVkyxMDuOTTHERIFOf+crY+X5wXZ/7V1j/xBsGkNY/iUZ4X' +
                    'Jn/nPQtX8y/84reRLTy9Yz6rcwPaSSw2UZnkVIxcRsSqAmisQDttlWOYjnkTsynAyxAB806r5D846RYy32raBqNhYpRXurq1lhiUueKgu6gCp2GbOOaJOxDgSwSHR9Kfm75f1T84vyi8jeaPy/jbU7fQoDBqWjWt' +
                    'Gmif0I4npH3eJoivEb8WqNs12nmMOSQl16uXqMZywBj0fO3lz8qvPvm7VY9F0fQb36zIwSWa4ge3ggBNC8skiqFC9fHwzay1EICyQ6waWcjQBe1/85S6ppv6X8geSYLxdQ1ryzAiatcggsryfV0VXP8AO3pGQr1F' +
                    'RXMHQA1KVUJOXrRZjHqGX/8AOUf5U+f/AMwvMfl6+8n6M+qWtlp8kF1IksMQSRpi4WkrqTtvtlWg1GPFEiRqyy1+nnlI4Rbzz8pP+cdfzW0j8xPL2va/ow0nRtHvI7+8u7i4gYcLc8+KrG7Ek0p4DqTmXqNdiOMi' +
                    'JslxNNosscgMhQHuYz+f14v5j/nRqv8AgeKXXfRggtF+oI1wZHs4gszRiMEsimo5Dbbwy/RDwsI49ve06397mPBu9W/JHyr5n0v8hvzO0nUtGvrPVL5Ln6lZT28kc83Kx4D00ZQWq22w65g6rJGWoxkEUP1ubpcU' +
                    '44Jgg2f1Pl/UvKHmfQEtpvMejX+kWdxIsK3F7bSwKT1YKZFFSFqaZu45YS+kguklhnH6gQH2f5/vfMv5P6H5a0v8lfI1prGiXFtyu9VSze+kZwF4F/QIYmQH1PUckHoM53CI55SOWZB7rp6LMZYYgYo2Pclf5afm' +
                    'x+dvmDz1o2i+avJMel6DdySLe366TdWxiRYnZT6sjFVqwA38cnqNPghAmMrPvYYM+eUwJRoe5jVv5l0fyv8A85jazfa5cpZ2NyWsRdTMFiSW4sYRHzY7AFhxqelcuOOU9GAB+LaBkENYb/GzGfzP/wCcdfzXv/Pu' +
                    'v6zoWjDVtI1a9nv7O7triBQY7lzIFZZHUhhWnh4HL9PrsIxgSNEDzaNTocpyExFgnyekf84x/ld59/L/AFvzJeecNGfTLa90+OG1keWGQPIkpYrSJ2IoN98w+0NRjyiIgbouZ2fp8mIy4xVjyY7/AM4eXFqdY896' +
                    'bIyvdXNvDJHalgHlijkmWTj06c1BPauXdqDaBauzDvMKF7ZflXaSyWVx/wA49eZzJGSkgT6y4qppsySkEe4OQlLKR/exZCOIH+6l9qQ/mH+YOraZ+Wmo+Rfy+/KzUvIvkq8q2t6hfQz82SQqGBZlovMhULvIxp8I' +
                    'pgw4AZiU5iRXNnkIGMIGIYF/zjt5U8wTfmp5N8xW2jXsugwalSXVEgle1TgjBuUoBQUJ3qcyNYYjHIdacbRiZyA9PcjP+cq/y08/ea/zp1i90Dyzf3enO1m0erW9nczx1S0iUgGIFWFRxNATmnlAzhCiBXm7yGQY' +
                    '5zsHfy8nletahF5WsEt57KWG8tmeO9juneOVLlah4irhyKMDsTt0zbDVjFCyL956/a6uWj8WdA1fcBy+xMkbkivuOQDUJXuK5txuL/W6Qij/AGKgr4/iMfx1T+OiYwwhtB1qR2oHtJ467bD0mJ/XmJqfoI8i7DRj' +
                    '1A+YeOQq4RQSRwRGKsSpIQOT2oe4zkw9YWIt/etvQczv4b5hdXM6M9n9JZGBBZt6ncAgK+42+nNiacANCoi5gEExsF+Lb+7X7NR75FKq/P8AffCAAlRvvQSL7YSoTDQppl8zWZDqWYsuzAA8zID1B8emZmkJ8UOF' +
                    'qx+6L2HzPdfV7rSwZTCIJoZ+Sox6TIhUFASOalk8DXfbM7MaIcTCNi881y6lh1Oea2n9CNbe+uFk3BaV5Y/TagB+JOTb9t8xBKpnetpOVKNwG3UO/Oi4F35I8qXINec7/E3WohofxGV9om4RPm2aAVIjyYF+XuqW' +
                    'GmTagb4ugmiVFkQkUG9RRTXkSRxbtlPZ2WMDLi6hv12OUwKZnq3mjT30tE0+cPMVAaKZBJ8IFDzMnUih3HU5tc2qhwek7+brcWnlx+oMAjYJxMiCWJGDOpLKXUcKioO1fbNKDX49ztju9A8ga2Yb+5iZpZLObjFF' +
                    'HXksLGWQgBeRJBFBVRt1NBm10mSyR0+7cus1WOgD1+/kzv8AOST1fyiLAdLizB+iUjI9oD92feGWhNzHufLmc279l+h6Vpl9p6RS2KS3ssTsk7PLy5MJ6MFQgfCYlG+2ZUIRI5b/ANrRKRB5pVpGnwTXy2d3ApLQ' +
                    '81YlwOdQu4qKip3p9GVwiLos5HZrzFp8WnTQRwrGY5VeRJYhItQJXj4lZGJ2KdffBkjRWBtOPyq5/wDKwNFEaGRzJKAqip/uZNwPbMjRf30fx0aNX/dF9ZaDaLql6YJSVjRebAbFqECnt1zp5bB56JsvMtY/O7SP' +
                    '8SXfljyzo8d2it9U03UriaWL1r7mFIYAGkZNUQ0+1StFNRp5a710BbtY6P02SnX5ffmvot/FqU/mO9stL1OC2nNtYQzNcGVY4JHlYsFIXjw2GWQ1YmDxUCwlpjEirL538xed/Meq30yjWbttLWb1rS0E8n1aI0IB' +
                    'jQmgpyahp3zSzySJ57O1jjAHJkflbSNauPJVzPBr2h2OlyyyxzQ3l3HDel3UVRgXWQBuNV4qa5OAPDzDXOQ4uRWflDeaVFf6hDfJIJ/qU7RSR20E56L1Z43dKEVqDgwkWucGhTO7zUvKkeoRI8d5cLM8R9b9FwBV' +
                    '5REGnC32IahoTQj4vfLyY3+xoAlX7UkGoyW9lbCTR5WK2Hl/g6TRUYQ3zUem5/e/ZUdup2yF7cu5nW/PqfuYV+YkN1qX5jalClmbK6v7mBYbJ5Fco06RqgLrRdycpy7zLfi2gGIXEEtrcS20w4zQO0Uq9aPGxVhX' +
                    '5jKi2g2iJI44tMtpkRfVuXnSVyAxpEYyvEn7P2j064eiOqGimmgbnBI8T9OUbFGp16qR4YErCSSSTUnck9a4EuxV9G+U9D02/wDyd8mGeO2e5n19DLBcIhaa3XUkWT42YAAJUFaEsNs2EIg44+/9LrpyIyS936Gf' +
                    '+d4vL+meS2lsbexgm0/T5Gt7SNkikaO3kLMFEZCLxAqf3e4bxNcvyUIuPjsy370dYQ/l/rF7pGmaVeafcWtvcai95FpjwSRLHeeoyet6KgLU8evUjvSuSHAaA80HjAJN9Hh+pf8AON/mS3+vTWWqWZtrZPVhNyJY' +
                    'Q6hwrVcpRQCdiRQ5hHSy73NGqj3PINW0u/0PU7vRtVhNtqVjK9vdQNSqSIaEbdcxSCDRcuJBFhCZFk7FXsfkXz9o3kz8u4ZZytzraaleS2GnIQXLcLVleX+WOq9epptXtmY8ghDztw8mMzn5Uw7W/wA0vOWv2V7p' +
                    'd5dxRaTf8RPZQQRpGERuSqDQtRSf5vnlMssiK6N0cMYm+r1zhm0tjwu4ZLiRwpx5Y80eYPJmqfpryzeGw1QRvALhUSQ+nJTkKSKw3oO2Jo7FiYobXNY1TzLq11rut3Bu9VvWEl1clVQuwULWiAAbAdBko0BQY8KB' +
                    'haS3mjuITxmhdZI2pWjoQwO/gRk7Y8LIvN/n7zj59a0bzbqbak1j6n1QvHFHw9WnOnpota8R1wQEY8mJijPLX5rfmR5PsRpnl3zFdWmmp/d2jcJokr14LMr8R7LTCYQlzCOEp1/0MJ+cv/U0zf8AIi2/6pYPBx9y' +
                    'KLB/NHmXX/OWrNrnmW8N/qrxpC1wyIhMcQoopGqjavhl8KiKDWY2mvlX8zvzB8kWr2HlfX7mwsHYubQcJYQ7dWVJVcKT340wShCfMIohEeZ/zg/Mjzdo8uheZtfe90edkeW3kigQM0TBkNUjU7EV65LHihE3Ebtc' +
                    'zQ3OyTeVPOvm/wAiXj3vlTVp9Mllp60cZDQy06epE4KNT3XLJxjP6hbEAx5M11X/AJyP/OXVrNrKTzALSNxxeWyt4beYg+EiryH+xplcdNiB5JMp97y2JpJdThvLuVpJXuEmuJ5TzdmMgZmZmqSe5JzM4tnFOPe3' +
                    '0H/zkj+bQvdd0Ob8uvOE36OjsZRftpN1LFEJhKSPUClfi4/hmDo8PpPHH5tmqy8JFE/B866j+beq6vavaap54vbyykFJLee/mkjYeDIWII+YzIjn08dwYtEsOeWxEl/k/wA6ax5R1iHXvKN7Lp+qCNoba9EClWjm' +
                    'X4gnqoVIKjwzIlPHlHDIWD793HjinjPFE0fhs9CP/ORP53k/8pXOT/zDWn/VLIjSYP5o+1Tnzfzj9jzX83fz3/MzXp9P0nzFrP6V0+2Bu4YZ4YVKXDBo+XKJFP2T0OavU5hpclYwBYdjpMP5rHeQk0WN+W/+ckfz' +
                    'z8o2RsdA85XltpjE+jaSCK5hhqa8YVuEkMajsq7ZpZ5JSJkeru4YYxiIgcmcWH/OUH/OQN3Cksnnq+VJmEayJZ6eyhiR4wDsffMzFgEhe+/uUwHckqeYvMP5gXt35i80XovdeupXF7eemkfqGA+ipKIAAeKDoM6b' +
                    'RT/cjyJHyLx2vxVnkPd3dz3zyTB5FXyvp8l5/wA5B3Hlq9MYW80VLlkjtJ96wisyioA6AbZr82rjxn93E0ebnYtLLgHrkLHJn/l/80fy1/K/S9b1K1/NG+/M7W7mH0LLTvVeeKN1qQRu6oCSOblumwGUCJ1JAjGM' +
                    'AG4n8uCZSMiXypoeravpGtW+raPdzWGqRyc47m1f0pF5H4gGUg0I6jOjnGMo0dw87jMoysWD8Hpdx+f/AOdKPwi823cMSfCoa3tn50J6FoDU7V65p5abFf0j7XcjNkI+o/Ykfmb85fzN826Bc6H5g80T3mh36ql3' +
                    'ZyQ2w9RUpKN0hQijBe+MIYoESEQxl4swYmR+xJIPzq/Mn8pPLKaV5X8wTWmkpcFxZRw25HOcqztWaMvuPxyrWTxR9coWfe2aTDll6Izoe5kjf85GfnlHpMWrHznII7i59GCMwWg/dksKsTD9r4egyJx4eDi4Bue8' +
                    'sx43Hw8Z2HcHiXmnzBd+bLm8vNWVLjULmup3sqyqs095MxldqKAACZG7Zh5ZiYquQc3FGUDe/P7Fv+M7yymjtp7l7aGS2jA9ejGNFBFE5RH49vidjU5MauUTRkQK/HRhLTCQJELN/jryVk88iNJZ5II7hQCZFU8T' +
                    'GK1V1FE5ch1Xt2y8doyAs7uOez4E1XDf4809s/OVhD5e1GDXporKS9gIsIgJCZPWtlY1KhwKFwMtnrYygeP0kjbn3LDRShMcHqAO/LvYDqus6JbvcPYTfXZ3leMD0gsZh4sBIHAT4jXpwFNvlmmyZIC63dxDHM89' +
                    'mNpBCs0F26vdWJKyXKxfu2B+1JEGNaED9qmYgAu+YcmzVcizK281pB5hhvrXSnbTpUEDQPLyflJQHnK8TDYbN8P05mjPU7EdnDOG4UTu1rusTGQW66fp3psGneayDRxxhlMfpMw5UPw7b0rjlyHlQ+CccOtn4ofT' +
                    '9Tsrq6t7WayWK6vZoIwRK4pDMy8jxKfbU03LfEOgyEZgkCubKUCBd8mWpYaXp9za38cfKaCWOVeZJWqD1aEADapzOhGMZA/jvcOZlIUzbzbcyXQ0u6kKIxCO6BvhqLpAtO5+yemZOc3R/HNowirH45MO1X1F1Isf' +
                    'hdbO4PMMCDSVd69/kcw5/V8HLhy+LzbzZrms6hqN3pl/fTXFhYXlytnbSNWOIeqy/CO222a7NklKRBOwJc7FCIAIG5CaeX4IF0u3laMF5GPI8ASQHk2Jpv8AZGZ2niOAH8dXEzyPGQm/CIj93EASQFPELvxTx92O' +
                    'ZVDoPxs49lUlhtxKwaNeAagBA7Ow7f6owkC0AmmkdYkX0v3ZRfUTieNHMasSPpNcQaCkWmfnDztcaj+XU3liW0lmlgngnn1N5V4BZLmb04+FORNIz0OY+rzmUDGvi3abCIyEvsePZpnavRfKF2lhYgj1DNd2LQ0j' +
                    'lKUUy3G5WnEiq/ZY0JzPwmh7x+txcgs/FL/K9r9Y8yW0NJay2E70k4u3JSxAUVoBUUHh1yvELn8Gcz6fil3miKE3dorS+nSCQFWBJFLqbavw13r2yGUbj8dSyhyZF+W9sqomq2Nmw1yzvoY7TU47iSJ0W4DoaKrU' +
                    'qKUqR+1l2njtYG982rMeh5UzWbzLc+Tzp3mm31e4sfMV3bSNqMV+81/FI7ok3oiOYsFLN0ZemZcp8AErIPnu44xiVihXyeVQmxj876dc6fcPfWsmoW07TrGY+UkkyyOqL1+EmgzW7cYrfdzd+A33Ify0rPrd0kKh' +
                    '3NnqnAN0oLKcmo+WRhz+f3Jny+SQDcCnTKmxWjnKRtH6UcgYEAuvJlr3U9jthRT0X8m9VmttavdOS8NhHcWN273IeGMDhHUKecZLVPbn9GZGA704+eO1vYE1q+/SlrbfWLe+uHltZDMl1BMxWKJkHxApU0NGHp0H' +
                    'Svjl8Rtw+EU8M1QRzwxi3o8P1KzMzj938Zm4uF5Ox7024+wAzBLnBD3sCaf+YOnREv6cV3p7Eyu0r05xndmJP0VxO00g3ApD5gAGv6sB0F9dD/ks+Vy5lsjyDrmOmh6bLyWjT3i8a/EOIgNSPA12xPIKOZS7IsnY' +
                    'q7FXrPl7VtH8r/lfp+pa3oEfmK31TVL+2ijmuDALd4IoiGX0wWqeVd/CozKiRGFkXZcSUTLJQNUFW5g8r+ZdI0OS31e00C9aE3F3bPdvcsJLi8eCNZDOD8dG5N4JVmpthPDIDekAyiTtaY+XtG/LfyvZXCa0Ztfj' +
                    'nFzNJcadq/1RfRsyYyPQiozO6yExhvtoT9n4hkoxhEb7/FjKU5Hbb4JvZ6nqGkeYJkbzUR5daV2ltrf0PrEsFpGLpoGumE3qKVlVebAmdgVHxDJAkHnsxIBHLf8AH48kn1nVfKXmDXSlzJbRTtffWLy7v4A9xfPq' +
                    'shZYZZ7cx8reFQAW+EpWldsjIxkfx1ZREoj8dFIaX+UupS3E1haQJP6ZdbETXkMUTIeHWd6kFhXjzLBW5UNKYKxnkm8g5vMvNsmmz6uLjSrdLOzmghk+pxqqCGTjSRPhJBowPxdxQnwzGnV7OVC63SLIM1yBS6hz' +
                    'xQkBmAqQK7mmKvou01LTb+R4bO6imnjAaWFXq6A9OS9Rm1PpJieYYQlGcRIciimCKKswUdKk0/XhBJSQBzWn0/51/wCCGS3YWO9sKG3Ug/I1yVrQPJ3DDaOFplVRViFHiTQZIG2JAHNjetea7bRI5LieEz26sI4h' +
                    'CfiZj7nYDY5dmAxYxM3fc4GLP4mYwFUOqa6bqFrqenW2pQ1jgulDIslAwJqKGhIrtkIS4xYcqXDHmVC81mysXIuOXphljVkBctIxoFAHXL5x4IcRcSOeMshgOnVSj8yeX5Egk+vxItwaRCQ8CaV3IP2Rsd2yk5Yi' +
                    'rPNyYjiuujCPPeqX1rPaC0vJIY5PVbkh+0AV4/gcHaGWeMR4TV9zgaLFDLKZmOKjtfxX+RvMVvY6beSa3ePxe5SOBpS0lGaNmO5rQbZi6TNUTxHq7HNEXsN65MlvPOOgWNwLa7maOQosoIQuvF9xute2+bHJnx4z' +
                    'Rl083Bx8WQWImrroiLPzJot+Ha2lYqjKvJ42TkWpuvKhIFd8MM0ZAkdGU4iJAPMq188FxayiB1kqkiHga7lSO2ZWOQlGVdzr9VHhlH3vJtO8s6gur2VnqEHpRzNWsgJjcIOTLUdyBnOYtJMZIxkObusurgccpRPJ' +
                    '6Pe2Wn6RZS31tbqJIOJTnJIq/aUCp5Hb6M6LJjhiiZAcvMugxTnlkIE7S8gwK/8AOWq/pKW5tpoyjIYgIw3phG3IAYA8gf2qVzRZdfk4yQfL8frd5DQYxARO6AhisZI5Lyb6yLgledJFapkoQSzCu/vlERAjiN37' +
                    '3PqtglVy6PIRHz9Jahebcj89tt8xZkE7MmV+UIGlhkubmO1ltoGqsl5JJH6QjFSYwoo331zZ6MWLNUO88vc63WZCCBEyB8qZnp1jDZvLc2mlLDM1ebR3MqtLRmo9FB+11Fc2uOAiSRGj/WO7qMszPaUr/wA0MO86' +
                    'WVvp956JsGt4Jh9ZklV3mDTtUN8b0r1H05qtbAQlXDQ59+7t9DIzjfFdbd2ytoWqT+W7SGCA2IuLk/DPLFKzn1grBC4UUFGU0yWDKcMQBw2eu/VjmxRzEkiVDzDJdY1i/wBG80aLZQRxLFfektzGV5BXZ+D8Dse+' +
                    'xzaajV5IZIR6S5/N1Wn0mOeOcuseXyZBO8izT1kUBZmozHYDk5+j3yyR3PvYRGw9ymj/ALtGVwzAMAFYFa+n7ntkL2/HczrdjP5kc/0EPjDKZlJ8a0FMwO0P7v4udofr+DK2vCPKlpIssVmJXMJYxchT94vwCuzm' +
                    'leXjmcZfuR0/BcMR/enq8TlnurkR8ZFMygB5FNGkP7HQkVCj29985okyegAEb7vuVZILxVa4kiklT1gkjP8AvWT4gRR6mjE7HJGMuddWsTiTV717kRe8mi1F1uZJfjQlnRyQnE/uzyoAV6V6+G2WT5S3asfOGwH4' +
                    '5q3m31Cti0khlrFHxJHEAfVrc7DanXwGDUdPx0Dfg6/jqWNZhuUiaodPNeJmSYBCSeYQqSQBWnGo8OuT6MeqeeVIJJ5hxd41JdXkQOw3aE0YR0bcV6EHL8As/jyaMxpnl5dXNl5sdm0821qtvqQjNxJMsEqiMFZC' +
                    'WJKrtsF2HbNhKRGTlW0nCiAcfPuYak0o8zaVDNSMfXyCvIvRRcAKgpyIpvTfMG/3g9/6XMr0H3foZjqutaPZlLS9uUhuPTVjGUZ2AaGgNFQ0zNlljE7n8U4kccpDZNtb1iIWmiXcMgWBoYpI5WFfVjnvGZSirRjQ' +
                    'CrfD9GWZMm0T+ObCENyPxyYX5xv7htdgt9Hv5dRiMHK6ktIJAvpzMGeLgRUgEU99sws8jx1E25WIDhsimAztI88rzAiZnZpAwoQxJJqO2+YB5uaOTMfLpJ0mCgfZyPh3FeUh8M22m+gfjvdbn+srr/XrC3ikETev' +
                    'OCVESmtGVUBLbDaqnHJqIgbblYYZE77JbD5qll5LcKsJb7DqvMCvLqCR3bMb83Jv/LBRe7ubm5IF/PwaigxsoWvEbKgPhttlZyyJ5ltGOIHJANd3cy/U7pvWWV1qzU9ZeJJABJAX7RND4nKTInm2CIHJCzQpFGnX' +
                    '1WJJ+JGXjTb7JJr88iQyZn5ceBLOImSNXW2BZXQOzsZLgKgoOhHUNtmVjqvx5tE+aA8u+k9/eySRApBDIAIyISEB5EVC0/D2yGPmWU+SK8wvaHUlC2zyS+k4dWYSEf6VMak/DuQexyWSr/HeiF0y78qLv0dGuEIB' +
                    'B1G3QjnRlEjgVIp0GZOkNR+LRnG/wSn81JGng06dZFaBzGV+ItLUwL/eV6nbY0yvVGwGeDqwDR2/3L6aCxCC7gJFdh+9WpzBjzDky5FX0eE3Ovw2iXX1P6zLJB9ZDcQolDJQk7UavE17HCOaJclDVxMupXCXHo+s' +
                    'pUMbZQkOyLTioAA267dcEuaY8kVoumNew3t0sskX1WP7URoTzB2PsQN8MRaJGmR/lRqek6Z5huZtRvl04y6fdQwXMvpGESMAQrCTYlgOK+++WYSAd+5rzAkbd70L/EunL5hsbybzJZ3HpyQBYIZligYCM8eXFdir' +
                    'fCx7/PL+IXzcfgPDyYnqumalNbQSQhXh/RVjMxV41URy3HABuIU/bNPi398qkD9jbEj7Uk80afd6Z+YcNneqBcw3FgJih5qGb02HxDbpkJips4G4JNrWn31/5l14WNtLcmG9u5JRChkKIJ2BYhQaDfrkZAmRZxIE' +
                    'RaH1GyvrLTrCK+gNs/qXRWGUMk4FYgS0bAECoop70PhgIICQQTsleQZuxV2KqjXNy9vHaPNI1rEzPFAXYxo705Mqk0BagqR1w2inv/k/Q9GufIWmSXulxTs9pZzo8GnQS3MjtqksUrNcNGWI4gKys3TM6ERwDb7P' +
                    'NwJyPGaP2+SjrVlH5btY7+00lUuWOtoCtklu3CKdUAJSNXp6b/ZLUA9sEhw713pieLa+5dZxXdvJ9RGmW0N1cNfC2imQTW6I1rHNC4orenxO6kEcT0puMI9yD7000jy1bWuoxNcWv6QvLwaRBNDcxo0USF6SxwM0' +
                    'jgxnkOatSp7E5KMd/kxlOx80zi03SNW0p7G7tYp+EXqzxSBpIQVeVq/vOXNqp8TKD0C1oBkqBDGyDb5888WUNhrcUNtaR2lu1hYzRLBvHIJbdHMo+FftEmu3XMDIKLsMZsMcytsdiqdaJdrpWrwah6/ptAS/PiH3' +
                    'II3Fd61y7EY8XqNBryGQj6ACXoV75y0/VNPWN45IriNuTqwqTxBBNO1eubjTTjCZPT7XWawnLjjGt7+DzO+vr03cojuJTEjlohzZuKnp322OazLmnxmpGr23czFhhwC4i632V7LXdetplMN9cFVZXeJZXAah6Gh6' +
                    'HpkBmmZAkmVNvhRjEiPpvuTRfPGtCWWWNzAzn7SD41BG61YNWvWtK5lz10pbEUHFx6MQPEDvXPvV/wDH+oyLDDcN61vHTn6nxOx7tUcd/bJw1/CQQGGTRGcaMj5KJ1i31ef6tMAxkJ4zXChYVQVYVFSfbJnUxzSo' +
                    '/M8moaaWGNj5DmsmjktSba01OcwxlI/RikVYzzHIlCXpwBNKnISBjtGZobbH7t+TKJ4t5QG++4+/bmgLlr22b6qJpmgQhkVZhIoJ71VyK75jzlOPps177/S5EIwl6qF+6v0IdEsrgvFNcNHIoKwtKpIKn9lqE0oa' +
                    'kfPKqhLYmve3EzjuBfuTnU7nTNYTS4LnUFjNrEY7icAklvh3Apv0zOzTx5RAGXIblwcMJ4jMiPM7BKDLbW1o1g5W4iM/r+tBIVbZSiijJ4Gp2zC4oxjw8xd7H9jmcJlLi5Gq3H7UPJLaOjs8UzzsPhlllrSnT9nf' +
                    '78qMonob97aIyHUV7maWGqaJb2cH+lRPPHAoMRG9eIqKkDvm6x5sUYjcXTpsmHKZHY1ai3nCC0upLaJY/qDKOUiCQuWK/sUYDYgDtXKhrYwkQK4fi3S0kskQZE8XwRzeZNMnhe4ttRMmoW0Lz28c8CIqyKhBAZqf' +
                    'arSlTmQdXCQsS9QFiw4w0k4mjH0k0aKzXvNNteeW3t1aGa5uAkcwjkBp0dvh+FhuKZHU6wSw1sSWem0hjmveg87YgmoAUeAr/HNAXfJ2i2CxATCUT1jUcaUBUA7ECnQ5nAQA3u9mKTT8fWk4ElOR4ltjSvfMKXMs' +
                    'kwsNYvtNt1iSj2ruzpG1CvIAqTQg+OX480oCujRkwxmb6povm/V4ODKVRG+M8Pgc8mYncb0Fdt/45kfm8gaDo4FBaxrEWqfV41j9J0Qwzz7sZFD8lNCx6e1MpzZhOh8C3YsXh3Rtk5Gn6slmbW0Rr6K1M9xeyiR1' +
                    'kMEfw8FikjoSIujIK7ZnnhyVQ3q79w8iO5144oXZ2vl7/eD3urq3mm+03WS8aTW8clxbcbdokrFMAQ5EhJNdxTG555Rn3bjbz961DBGUOh2O/l7mVwT3FzaRXs1uoa4AlcrLU/ErVPA7AVO2Z4kTESI5+bgmIBoH' +
                    'l5L47hmCglhGVJjboXLR9N9sRJeFi3nyZJtDQqW5LcUPKvSg8e2YGtN4/i5+jFT+DLLqO6i8n6ekMavN9cBKMCAVMsp7kde+ZsgRhFd/63DjRzG+79TxiaFVtbaQW4jaQmjCQuXoaGqkUFDt1znSPSDTvIyuRF8v' +
                    'JEkoxnmuCbd1nBVBKKq3IcqIBvSnXJ95O27XvsBvt3fpQ2otKLmVHYlGIcbuQ23wt8e9SDkMl224QOEFDPLLIFEkjOEFEDMWAHgK9MrJJbaC3AlWEMhtGuK/uhKsdK7cipPT5DJVtbG96TzyzBDMQ0sojVGf1O5V' +
                    'CYjz7dOJ2qK+OX4QD+Pc05TTOZtU0efVr1pQq20lvfn66oRq1CbkSxAh5KFAtfvzPM4mR9x/HJwhCQiPgwTVL+GfUzf6PcSK1mTIs1yylncNy/dihJFa0Dds185AyuJ5OdCJAqXVOdK8j+Z/Nc8eqLMptJoFljvb' +
                    'iRnVkB9L0S0S1DChqtKUy6GnyZTxdGieohjFdUy1zQ/OWkBbSzga7jtUjC6lauyFYrPdVoxHp+nUciv9csyY8sdhvXX3NePLjnuTV9Pe1BafmdriXMBmmhSUK18VkWCSRivwoW2O6nlQfDTERzzsfNTLBCj8mJ3/' +
                    'AJQ1jTYRLqHpQXDUKWskgWZq9wGoCKb1rmLLBKI3cuOeMjsyLQ9KnitLe3SeAvIBKkRercuLMalag0Jpmz0+M8IAIcDNkHESQWEXDPbX9z6bUKyyofAjkQQR3B7jNRPaR97s47xDVpFBM7LP6lApf91w2C7n7ZH4' +
                    'ZEAFkUfLpzpJCmnyvcxGRiqgjknp9WZQaCvVTX265Mx7mN96uuj3VrBW7tZFtGkq9zxZwY6GpUKCBQb7kdMlwEDcI4gUvuI9ISI+jLcG5Ut+7kRAhGxU8g1dx7DKyIshb0zy/oWgappyXdi19JA8IjpBplxPGsyM' +
                    '7svqJUFl9Tjse2bDHCMhYv5FxJykDvXzSzRvKuvQ6ldRX+l3pt5YmSGVLWcAqq0Q14Gh26HK4YpWbB+TOU41sUJ5in0lbWS8tFkluYJFhDMqW6iF5ro8QsfTcDqtchkMasfjmygDaF8q+dbXy3ZywPppu5ZblLnn' +
                    '63pcREwZR9k1ocGLOIDle6cmMyPNZ5n85Pr2jaVp31E2psQ6eqz+osgI4tQEDiRTrgy5uOIFclhj4STbFvU428XCiypIXDh/iGwp8NKilOtcx+jco+/fIpdiqK0zkdSs1XieU8Q4vvGauBRh3Xxwjmg8ns2nrp8U' +
                    'V19at7JJ2keCQW9vbxwSRAhk+B0atSKVzMFOEbWSSC4v7kmwt3mtBCls3pR+ojOpKUeNQeII2p06Y9U9GOPb6cyqktkOYtbJ3kTjvIZ6sxoteLLWvxVr3yug2WXpN5q3kbUPJ0/lnUJrPT9X+sQ6hp9472yuklrK' +
                    'SqytJMJVDIOG4NQageOQTExo83GEZiVjk8s84XXlJdRs9Y0G+t5rt9Sur29jtorhGNq90rwK5esbOFVnbi37QHUZjTMbsd7lQEqo9yUfmP5ot/OPnTVfMFmhSyuZW+q8l9N2hBJVnWpAYg/EAchlnxSJZ4ocEQGL' +
                    'ZU2uxV2KuxV7p5X8z6Npvk3R4rrWbE3UdhFENNd2SWN11YyD1DyC/ZPOg3AFTtmbCYERv+LcGcCZHbr+hGeZ9d8uXqB5vMgjpLrcKzWV1HcMyzurxt6cjD7W6oagU6HJTkD172MIyHTuQVzrXledpHl1a0nIlnnW' +
                    'NNSeFPTawSNIyojX4iVIqh2brkTKPf8Ab5MhGXd9nmjNK8w+SoLxEXUQqW8elK8st4rxesjx1cN6gBCAMZF3HtkhKN/JEoyrl3pTr/mrR4/Ll9PoeoRwazJHMS1tcqeSnUwvBY9mAaDegFOHXISmK25/tZRgeLcb' +
                    'fsedeeHt5dZt5rW6iuoH07TypgPwxlbZFMZFTRlKnkPHMfJz+DkY+XxLtO/L3z3q0MdzpnlrUrq3lXnFLHaylGTiH5BiACCDse/bEY5nkCpywHMhEj8q/wAzGFR5R1an/MJL/TJeDPuKPGh/ODGXhnc1K8dqHfKW' +
                    '5GtcODyERWvWrA7nw6ZknP5OMMHmrWF6tm0v1izS5jmFGV26CnaoPXJ4dRGBNx4gWGbTynVS4SG575mb/QLWGxiUUAQBpPi6nmQT8sE9Tv6IiI+35phptvXIyP2fJAMkxlMteTMatU9fnXMQm+blgVyUTby7mg39' +
                    '8VXRwSqakD78VVCCmxXc9gKnAlSMrAkcOnthQs9QBuRQcqeJH04q4zVAHAUHhXtiq5JDU8Y1JJqSf7cVVyvwhylWbcgb0p4YEqYddy6GgFRUbfhhQ4PbHizD4j9rY/wxVzXCqFWEDj3LDocVU3kBQqQhNeqihxVS' +
                    'IPQ9cVRAnFaBatyUiSpDCgAoKH2yziQpFXZ6uDVmoSeta7/ryPVKtdgRqltvygeVWBFDu236snPbbutC93lkt0tkjVgFElYyGIp1rQbHxyRJIqlUIIZJZkijqJGNFO9fw3yuMSTQVnPlPUtK0mLUrbVbj6u9xYpb' +
                    'qoRy5KCXkR8NOjCh9822lyQxiQkauNfe6vVYpzMTEXRv7lCfX49GW2j0C4W+ISW3ljnjkRlDy812rSnblXfK5Z/DoQN8xv72Qw8dnIK6/YpS+aPMthaxWs+nxRxcEjWTg9WVD8IJV6dT9OROpyxFGKxw4ZkkSS9f' +
                    'OGqwI1uIYUAUoylWqKih6nY5T+amNqDf+Wgd7Qep+Y9Q1W0WyuOC2yNzVUB67U6n2yrJnlMUeTbjwRgbHNlbfmhI2mxae+ntKYmLCd7lg5HxcR8KDoDT5DM89onh4a+1whoPVxX9jBpLlGCCOBE4sWJb42Yn+Ynr' +
                    'TNWZeTsBDzX2d3BbXXrzWiXNvvW1dmVSe3xDfbJQmIysix3McmMyjQlR73aheQ3s/rQ2kdoD9pIyzVY9SSxJ3xyTEjYFLixmAoyMkJlTc7FV4mkEBt6/ui4kI/ygCo/A4b2pFb23DO8HqcP92IUPXavfbwpiDSkW' +
                    'qG9naL0m+Kg3c1Lfa5bmu+574eIo4QoBmUEKxWuxoSOop+o4GTJdO8wSCKVJoGOnw8ZLn6qyQOU4CFE4uHUrzPLoTXfbMmOX5OLLF8151v1b22VY7t7OKOKa4iu54pXdYlLSOvqoU+JOgKn6cfE3HOl8PY8rUrnV' +
                    'Lua4R0Cxzxfv4IDwEqrUMlWjVQ7MhpQ7hdtgaYDMkpEAAtnkj1ldLmeWJYbWOQXau8Vuqn1pJAiKBSpWlOKUriTx15KBwX5oI3jaJqskmmPC5RfT9WMiaJuSAMVNFrX5ZGMzjlcWZgMkaklbsZHaRvtOSx+ZNTlJ' +
                    'NtoFLoWiSQNNH60Y3MfLhX6QDiFT2DzS1tEIbexjiQdArED9WXDLXINZhfVn+mXkqeW7TXL29trOxuuShGk3DBnUqVryJotaBczYy9AkSAHHkPVQYTqtz5bee31HTGRbyOeJ2hWN442VWBNQaAUpvQ98xJmF2G+I' +
                    'lyL1q0/Ny8uV53P6IsYKExpaXYViSd+S/WIqdPfNkNWTzofH9rhnAPNXvfzFlvND1xtO1OKK/tLCW6tXt7kPIJEZACF+szV691yR1FxlR3rv/agYaIsdXjXmPzRNr9nYpeMZtQWFfrdyQgMkgkkNW47k8WA3p8s1' +
                    'WTLxgXzc6EOEpXZX66ai8rS2u5HdJ0eUCQoFVhw2O1a1IPgMrjLh6BkRaLi1CzuZ7Sa60n1UhMZujCu8/EEMXIAqXJBO+SEgSLCKI6r/ADLdaLfTqdC0ibSUUkzW0jGQVNSDUiq7U+Hp4YchiT6RSwBHM2x+oJoD' +
                    'uegyhsVo7S6m2ht5ZDXjREZviJpTYda4aRaNXTdY0yeG8udOuoVgdZqzQSotInFSaqNgRQ4aI6IsHqyOfzzNDcTBrVpS8nqgs7xceVCRxdCd6da98s8RqGNVg/MGaCeS9fRVFtcNAGCSOikQBtgxRgS1SemHxPJf' +
                    'C81ml+fpIL1fUtIv0Y9j+jL2OY+tWD6wswmRTx/eoyhlC9/bEZN1OPZMdXt/yt13Vb3UJfMmrWPxbQjTUvfgU8Q3qi5UGu2SlwE3Z+TGJyAVQ+aXHRPypAYjzjqjGnwL+hQoJ9z9ab9WR4cfefky4sn80fNqLy/+' +
                    'XAjSW8806nDE4+F10mGQMfYLe8wP9ZRg4Yd5+X7V4p9w+f7EbZ6f+TlpBM9zr2paleCpt0k057WDboH9Kdn38QckBj7z8kE5D0HzQ8fmXyCL4zp+X0d1CgCm3j1O/wDQNK/EAfjqf8o/Rg44X9P2lPBOvq+wIfUI' +
                    '9G80XwTyz5UOkvMvGGztNQkuXjdSAZJ1uFYrHv1+Ae+A1I7Cki4jc38F8P5R/mDOYxFpBYTM8cLGaFVd41DMAWcbgEY+DPuR48O9m+m/kFdfVtKGtai9jfX0Mktyi20FzBavz4COWX1w3xJR0KowrtscvGn5WWk6' +
                    'nnQSXz3+UGteX7q3XRjL5kdhxcWMHMpHCoKl44izAFCDX6K5DJhMeW7PHnEuezCH8nebUeh0O9qUEtVt5GUIyh6lgCBQHep275RwS7m/xI96gNWvbu3FlDZwOBAYn9CCjuqhT6rhNmdApo5G1WPU1xsleEBOLHyN' +
                    '5y1nT0nsdHh+ryN6izeta28rLxAoVkmQ8duX2eu+SGORHJgckQdyqr+VHn6SKSVNJRoYhWWRb2xKoDtViJ6D6cPgz7l8aHe9h0H8wf8AnIHQNFs9Fi0nSHsrC1W3s5bua0V/Rt04L8S3iqxAXw3PXMuOTLEVQ/Hx' +
                    'cOWLDI3Z/HwUb788/wA9fWVI9FsLVYgolEcSTczQVbm07D4u3HbAdRl7kjT4u8v/2Q==' +
                    '" />';

var generalTabImage =     '<img src="' +
                    'data:image/jpeg;base64,' +
                    '/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAGQAA/+4ADkFkb2JlAGTAAAAAAf/bAIQAEQ0NDQ4NEg4OEhoRDxEaHxcSEhcfIhcXFxcXIiMbHh0dHhsjIykqLSopIzY2Ozs2NkFBQUFBQUFBQUFB' +
                    'QUFBQQESEREUFhQYFRUYFxMXExcdFxkZFx0sHR0gHR0sOCgjIyMjKDgyNS0tLTUyPT04OD09QUFBQUFBQUFBQUFBQUFB/8AAEQgB9AJYAwEiAAIRAQMRAf/EAIoAAQEBAQEBAQAAAAAAAAAAAAABAgMEBQYBAQEB' +
                    'AQAAAAAAAAAAAAAAAAABAgMQAAICAAMEBggDBwIFBQAAAAABEQIhMQNBURIEYXEi0pMFgZGhsTITVBXBQlLw0SMzFCQ0YnLh8aJTc4Ky4mNEEQEBAQADAQEBAQAAAAAAAAAAAREhMUECUYES/9oADAMBAAIRAxEA' +
                    'PwD8z9180+t5jxb94fdfNPreY8W/ePLAgw09X3XzT63mPFv3h9180+t5jxb948sCAPV9180+t5jxb94n3XzT67mPFv3jzQYvbhhZyB7V5r5r9bzHi37xfuvmn1vMeLfvHkjaIA9X3XzT63mPFv3h9180+t5jxb94' +
                    '8sCAPV9180+t5jxb94z9181eXO8wlv8Am37x54JZON29gel+beaLBc7zDf8A5b94x9281T/zuYdty1bwv+o80YYdmu17WYd0lFF6Sj2fdvNa425/mJ3fNv3jH3fzb67mPFv3jxw831lom3gsd+4o9v3bzZZ8/wAx' +
                    'O752p3iPzjzb63mPFv3jypbVjvswsWTTHr+7ebfXcx41+8T7v5t9dzHjX7x5UmvTBIxS9A0x615v5t9dzHjX7wXm/m2P99zGX/ev3jxRgzSWL6fxKY9a8382j/O5jP8A71+8T7v5th/fcx41+8eWuXpMbUB7vu/m' +
                    '2P8Afcx41+8Reb+bfXcx41+8eVr4jKzA9r8382n/ADuY8a/eL9282j/O5jxb948cdplJpj1vzfzbH++5jxb94fd/NoX99zHi37x47ZCIgD1vzfzbD++5jxb94v3fzaf87mPFv3jxRiaBj1fd/Np/zuY8W/eJ9382' +
                    '+u5jxr948kZ9BEsUij2/d/No/wA7mPFv3h9382w/vuY8a/ePGsYXpEYt7gY9i8382xf9dzHi37w+7ebfXcx41+8eVLAjXtwJpj1rzfzb67mN/wDNv3g/N/Npj+u5jxb948lVtCU2GmPZ9282n/O5jxb94PzfzaUv' +
                    '67mPFv3jyJZiMeoauPXbzbzbZz3MeLfvB+b+bKv+dzHi37x5HmhZDUx6fu/m313MeNfvGl5t5s1/ncx42p3jxJdlm4hC0kepeb+bYf33MY//AHX7xF5v5t9dzHi37x4hsKPZ9482+u5jxb94Lzjzb67mPG1O8ePh' +
                    'cJ7yBHvfm/mr/wD3cxP/AJdTvD7x5tk+e5hP/wAt+8eJ45LrCcqH6GFev7v5t9dzHjaneNPzbzbB/wBdzHjX7x4Xh+KKm1lluA9lfN/Nn/8Av5hdPztTvFt5x5q4jnuYW/8Ai6nePHg8dpIl47doHr+7+bLPnuZ8' +
                    'XU7xfu/m313M+NfvHicziHhtwA9n3fzb6/mPG1O8Pu/m313MeNfvHjj1bwB7Pu/m313MeNqd4fd/NvruY8a/ePEAj3PzfzacOe5jxr94n3fzb67mPGv3jxp4kA9v3fzb67mPG1O8PvHm313M+Nqd48QA9v3fzb67' +
                    'mPG1O8T7v5t9dzHjanePGCj2fePNvruY8bU7w+8ebfXcx42p3jxgD2/ePNo/zuY8a/eKvN/NvruY8a/ePCJZB7/u/m313MeLfvE+7+bfXcx4t+8eKWQK933jzb67mPFv3geJKAB7IEGoEGVZgQagQBk8+u02oN69' +
                    '2nwr0nnLEevTh0RqDyVs6OUe1YpPfiSjMCDUCArMGbNJxE22I6GLVSUtwtq2sDjbFx8T2JfChFav9d/YjpwWts4K/wDVH4E4E+xVYL4nve4DnWrs5eby/eVpfBXL8zOllwqF8TzZzajsLPaNEtbYvQWldorSbdW0' +
                    '6xhgNHOywf7dJm6iehz6zq0YusOte4QZ4c11+0i/K96j1Glse+GZtXswtjaAsQ36DEYr9tpt5TtgsKExoxtshHa6v3m0u1YKuf7bRpiLMGlWCwTVYiQ8zcEgaMxhgIwNQIGjEZ9JYxk00ILoxEFjA1AgaJBl59X4' +
                    'm4HCNEShEqsDUCCaIRLPrNwIAxHa9BWpTLGJYGjEcNSWc4JYst3+VZmeF8NXvyKjNo2e03ZqIW0lqutuFksnPSVFlxHp9JrTqrK3ogw64e86Vb0otGeaCs6bWNXtyOZtw7YbWSyizXSEX4qztrn1GcmWrh9DwYeP' +
                    'WUTpRdnRt6GZKnHU8wNfGo/MvaZLOEbsmW3a7W/MgytwgMrh45PaUZLsIAAAAAFAgAAAAIAAAVYY+ohpKMWFVIFUsEV7YEGoEGRmCXfBR23G4DSeDA+fqX47cUR0GDtr04LwlCeRyg3EQ9OhqLDTax2M856+WouD' +
                    'i4Yb27yVXWBBqBBkZgiopl4s3AgDneUsM3ggqqld282lLl+hGbvf8K2b3uA42bnBdu2FVuW8ipw9lY2ebOvDwzZ/HbN7kK0lTk37gqVrC3SRbHvj8Tq1ic6qIXR+JBGoxece4l6Sv22m+GfamEuzG2AOFVhXpTXq' +
                    'NOst9aZuFHU/eGsOtDRwjtpM2kow2DUWNbLadOGC2jHDi2WDUCCDMEg1AgKzAg1AgDMCDUCAMwINQSAJAg1AgDMA1AgDMCDUCAMwWCgDMGb2jBZlvaMFizF6utVLl2xLEapVcUWzawZ0tWsuXhiYqqulbJ9qspmG' +
                    '59rYGtR8S4trM0fFeXuOqUUUY4HDJwWDSi2oq7G5Zg1pPtr0+4yio1pqbpen1E1FFnueRvQ/mdSYvjTpq/ZbEejidMHRtZp4mDSwlbH+ApGQVoRhPoKIXeiZFexgJ3EK1DIAAAEBQEQFAAhQBAUAQoAFXRiy4LNy' +
                    'zKnI0luxJVipt5AsW3givoQINAyMwINADx85+T0k0ElrtdGBeczpjvwMaN0tZNuE8JfUa8GKpfKvvlfie6i7FepHz08Gt59HSx06PoQosCDQMjMCDQAw5yWb2kVVg/yrJGnmlvz6g/cBzdZeOWb/AARUpu9ywRVO' +
                    'b2KX+CNVnhU57QMxizFVs/3e86JYvr/BGa4u3Q2gEQSMTWZlNWeGz/kBjDFbiJYV9KNpRe07cvUVrKArk1KXQ0ag3EKCQQZgQaIBkQagkAQhqBAGYEGoIBAUQBAWABIEFAEBqBAEMXsqqNryNXsqrp2GNOnzHazc' +
                    'RiWDmlClfFMNbi6r+Doqv3i6a1bJY4x7S6ynUaWVFHqRpDTWD9TJSs55nTRVXW0vZj+8w3wqF8TeLRP1UvaKqi62YeCfQXU/mW6G4JsgqFHw2T3T7iItc5I8yjpp4O3So9bgjbTtVqJUfijVE3KWcr1KTN1/Ee6f' +
                    'YyejmjajB9LIquXhln6DSlKr3Nv1QWhanaWxN4GUnLpt/E6NzZV3NfuGouHWT3wyaJwT2Xns95z6Dvq4qtq7ThbFzvEKgKWHlt2lRkoIABQ16gBCkKAAAAAAAVZ7wLWrfQjolXeRf7f29JqU8DFrRCBQQe4ABAAj' +
                    'tWqmzSXSB4OZsrarjZh6jidNW7vdt+gwbiB7eTbem08k8DxHq5TVSnTcLamKPWADCgAAjwx27Bsj1lI0/wBtwBTGObzEJegrcKQAjPpMpRPWaAGTCok7R+bH0nQgEghSEEIaIFQhQBAUgEBQBCFAEBQBAUAAAAM2' +
                    'sqrEraSk897NsSCXs256cDroPtQ8uFf+5HKMG9qZvSz4tiSXsn8DXgzRzrKz38T9GJpuXL/Pi/eYSijs9uC/E7OKWdnlVJJdMCo5uy45pk1kSqm9K7JS9uJnim/E9rN6K/i1nf8AiUcm5be8bBtLs9JRJwgAAdtC' +
                    'y4oe1YC3xcOyyUe5GdNWTrZbW0us6cLjSbzTj0Zoze1LVS1YWV6+39kZqnatf/UvYb1EvmLpT9xdFTp16JJ4M1rNlZ7VK6xrpRO1bTpXY+te0aleKtp3YDeRiyXyt0Q0ccJbyWzA9DU6Uf6fwOetHCktolHKibeG' +
                    'w7fL+Ks9PWSnDRw2sNvWdU6tymsoLaOb06Ksxi8pOFlDPVevElDhbTmnVTXBztQlHAs4Nby2q69K2NGTSAK3jhsIAAARAAUCrFkNVSbh+gg6LBLZJqPXvJMQnmVSn0GGiEsgVwsWAPaAZ1LrTo7PZsCMa2vXSUZ2' +
                    'eSPBe9rubORazvZ2tmyG5EAAUAAB20uZvSFbtU9qPdW9bqauUfLN6WrbStxLLat5mwfSBK2VqqyyZTKgAAAAAAAICkAhCgDIKQioCgDIKQCAoAgAAAAAAABMinHVvOCGDOpeX0HPP8S237JZ10qdp1zlL3Sa6gxq' +
                    'Z9drNdWRrRTdbda91itKNJfqbTfW4N6dOGq6X+8W8DlqLtKiyqjOrbivO/H2GteOPDOMTk8/UWIh1TjWlb+Je85HS9LK1VtaSFHMuz0m9XPobfvj8CQuCdstewujNVLhiqm1VvaRqluF4kdLLHoTA7Uw0Z/S5Om1' +
                    'LZJnQadGun8DoqwYqsai7VX1+41VKlccltLbZ1mb6au5s3C2EGPnUSivaZztr2cwok630K2iMN5qujSuyXvZeB5v4l97gzDmNp7OFRGS6CfLpERhuL/ox4wdb9lvhrHScjUqAACCcdW4AgFCIVZoAAWAqRhIiMy5' +
                    'Yby2cpTn+AEdXXBkWaRXkF2bL1gdZUdrL9sw7Kqxc7jF9ScFkStU3mZz9UbtbHYtgN1Vc0BvmD6B4OZ1HfUddlcPSe3UvwUtZYwfMLEAAaQAAAAAAAB6+U1G503klKPUfM0rumpWyUtbOs+mYqgAIAAAAAAQoAhC' +
                    'gCEZQBkFIRQhQBAUkAQFAEBQBAU56l+CvS8gMaupHZWe04p4hTZxm2bukrKtfyrE10Mw2qpZuTrTC8vb2V1w0Z00uzZ5Y++DXEnW1lkryvSKGou3VbrNR12LqWtWldj/AByNV4XFtqces5a7VuFrJ4J9TJORhLir' +
                    'ezeKS9pNSrTe6Wl6CJuGtjzDbtboluDSOmnROkvbZI6Xn51Vnt6i0rCpXpn2G+Ht8W5QZ1XniaNt4Jr9vaY4W6rc8fbB3WnNa1zwl+k0tPBJ4RPtZdGflTezawWXqg18uZ6Ul7TqQgzWqq3G00UhBGp9AKABCgCB' +
                    'lM2tw1dnsA82rP5s9i2HItrOzl5sV37sfUdOog9parB23YLrJGS3m+Bqyq9hKObTWYSbcI3wuzn9WK6EjSUKNrzGmOUbQat/yMlFSER1bSpKCtLOSaMv2EkCCglJeoTgMQJBU4aIFmBt4MCz9oIr1822tLDa0meE' +
                    '9XO/k9J5SzpkABQAAAAAAAAPp6TnTq88EfMPpaP8qnUjNGwAZUAAAAAAAAIUAZBQBCFAEBSEEBQBAUgUIUAZs1VNvYeZfxL8Vslj6DV7fMtwrCqzFuzppLO2L6iiaSxteMFl1sUq72xw4k37TTTrWmmvis8Tdn8t' +
                    'pxhVNL1IDDU1hYQ+H14h17Lqvhs6qTSo+Ht48Vk36jb+F9Ev1Ac9W3BV1WdsuhQed/CuiUXUtxuXmZSmEakRqjScRLe/I1p07cbY9+Z1ry9Vdy5SyR1VK1iFltJaq8Kw6MigGRG0mlvyKc9RxqUUZnQAAAAAAEKR' +
                    'tLNx1gAOKn6l6yPU0lnZe8CnDmbQlXa8RbU03MO0f6cPaeduX7pNSIhZwggRoaq0rJvYW1pbc5mYecZ5DhfWTgWXnOeY43txnMvy3xcK6vVmX5eT6cRwcueZUkV1heifWTEoS0RtiGzUKMMXvAyDUSnClmQAnAhV' +
                    'i4CBUOFpw8Q94Vc8ARADvzd62tVVcuspnnDmcc9oEQABQAAAAAAAAPfy109KqbXFu25ngPTyujZ2Wq8KqY6dhKPYADCgAAAAAAAAAAEKAIQXuqKXMdAVq2UpygAAAEKG0lLyQEBKXV68STS6TQEOOtZv+HXN5ncy' +
                    '0lLSxYHnrp7E54nE9CzO3At271I1WsZ55FCsOqd+LcS6wm3wysDoRqVBBm3xVTzmTjq3srcFfT7zu12p3Hns27u7wm1fV+yLBxsobW5nq09Kr010rEltOvzUozxc9GZ2rVVqqrJFtFABlAAAcdSy+bRTiszseLWs' +
                    '/mTlGR20NW1nbieCLnGq7kx2FARMZ6CgADhqWjB6sdEL8DV9RcPwtrLHA4K9m4oq16v3iKOLQm7WWxwFWE2knGbzfqYm9U27Tu4WonpI+K2E4vZ1FGbW4klCRg76VJbTWGcsr0nWjldPp3F2DjWrs49J6KaOyziV' +
                    'LN6dFp16XmyylVtvpM2jPDpxlMdmvTsN1olC2V3Gay3xNR+lbkakgwqKXDn/AOWIhLPdBpLhTja5Ji3jlsYHPVo4lZYHJqP3HbWsq1jNvI8zez1moEsqJHqKnGKzNIYPoRHEoMmyQDzGPqIaWL9ARrPF7jHUbrVu' +
                    'jazMqrby6yKgNWUOFiwXR25xJXq1m1iec9POfHXqPMJ0gACgAAAAAAAAfQ5b+RX0+8+ee/lX/Br0T7zNHYAGVAAAAAAAAAAAADAHn1dJLt0fDdYwtpvU1tOixct5JHk1L3tFoaX5WWDpp8zbii56a2rZTVyfNbbc' +
                    'vM78vq8Ca3xAsHtPNzVn2arJ5npPJrWT1p/QvaSDvptY0SwpCNnHQlVx+J9pvrO4EI021uNCAIAAAAAzf4Y34I5Xo3ilm5nfCwO4aWHQBlKbOz6kaDaSbeSOP9Tp9IwdgeS3NXfwpI5/P1f1Fyi697fNsk3COfHb' +
                    '9T9Ys3Zy8WyGsAJtZABF47/qfrNLV1F+ZmAMV30NS9tRJ2lHovx5V9LPJo2VdRO2CPVbUTwVkukzex59RW4uG1pSI9JtpVlvM9FeFKFZO2818Kjbv6yarz301SFm2/cZppu0ucZxXRtOt12nazyySOlE/itEvYti' +
                    'GhWVh63vI5dnh2a+82lg42iqVapbiDlw31NSPyVzOjpxOMq19rNhtFEhIPhDjYRkDCDnqanBWdryJq6vAoSls42Tjiu5s8kWQYbbcvNkSkGqVVrQ8s2aRp0nDJI5vDo3dR2vw1TjCdhxbnIQqEKQ0gbX5WlMGTrp' +
                    'RPUvxJeli6birTznI1CicpJpfC282zTWMmL2rm6z/pr7QXUayYL4N858deo8x15jVrq2TqmoW05Gp0yAAoAAAAAAAAHv5X+SutngPXy+vp001WzhozR6gE00msnigZUAAAAAADNtXTq4tZJgaM31FRS59Bla+k3C' +
                    'scuZ1IUJ4PKAJbnF+WvrONtfUs3Lwew5Ha/L3rVWz3rcayDiJZp1SrLeO4yUAnDlABHv0NXjp01zPDZu1m3m2a0tT5dpMZuSSK+hRqmmnLsozMrXb1ISlNSji9aiqqqspCaWsuFwlhO6TKvQtSzyqdE5UnnvVvT4' +
                    'aNr3m+XtxaanNYMI6gEAAjYkDQIAJqfBbqZ80+jd9i3Uz5xr5AAFAAAAAAAAAAAD6CSiVnB8891Xguoz9CfKm3Fd47Ethsy2kpewlLOylqJyMq2CACyyAACA531eHBKWBnVpimvS2cVvYl2tNsTVK8VofTJvoa0a' +
                    'py3DLqPh1JWcYCtYph8X4pmLVs23JPRi0zi5InDN2hKFtOZqdIoACB00nFbM5icIF5WNq9qqFkS2o30GQMho23mAAgACgAAAAAAAAAAAAA+npfyqf7V7jR86mtq0wVsNzxNf1WtvXqM4r3g8i51xjTHrPTpXepRW' +
                    'a4Z2EwaABBjV03qJJW4VtOVuXrWrdU7W6T0HPV16aeDxe5AeO2heq4mjkel85f8ASoOFrcTmEuo1NEVo/wCJv51ojbET0HMFwVwyAAAAEAAANUcNTltRkqicctoV7aVx4qudkM7JYZQcdFcLdW5y4XvqdzAjIG0s' +
                    'ygZaBoQBAUgGb/BbqZ84+jf4LdTPnGvkoACoAAKAACkKQAAAB7E8EeM9cqtU30GfrxYxa9bNLZ0HRW6IWxHnpCm1slkbWool+olg7cQk5K1v+JpNb5INSJMnO2pZzwrBZsSDepqQoTxPO23iFji8X0lVZXROJuTE' +
                    'K7trOqUQnmjmsMd8m1jqPoJValRKwTklmksM3iWIUbDF8FvbJBybljZ1jNmrZI2jLAAQAAAAFAAEAAFAAAAAAAAAAAAAANaenbUtw1zMnr5LK/oJRa8nRfFZvdGB6QDKgBCDlr6vBXD4nkee1U406Pis/itvO+tp' +
                    'W1Gmngtg0NHgm1vifuKOeroOKVopiZfqOVtC9XETGZ69fU+XXOG8jxvW1Me1nmJow6tZrPIhXa1s3MZCVCUek0ICpN47EQAAAgAAoszrZadUrVeLyW7rOQGD06fNKqStXBYJozfmr2lV7K9pwLVcUomQJe87aGte' +
                    'r4fiRh6b4FdZZPoZNP40L0PoJypy6zRhPBKZNGRSFAGNT4LdTPmn0tT4LdTPmmvkAAVAABQAAUgAAABA6PU4tPheaiDmBihvTVbNq2zEwVTOG0UatZW2vqLWl28MI3m6KspLhndmzrBjVcr2hcObWZz7Vli/Qbul' +
                    'Vr9TZFEJ7J27SzoZhNuTbXDVVnrM2awSyRU+07RtAiTdojrOqpDb3mFaG3GY47EujpB57uWbdrbzky/MKqWDe4PpHRs2h7/UaRAAEC1aUyQAAAAABQAAAAAAAAAAAAAAAQD08mu3Z7lB5i1rxOFnsS2ij6hJJVcN' +
                    'K1eaSQZhVJB5/wCo/jcL+HL0npAhZSUvA5W5jSptl9B5NXWtqPHBbEWQdOa1KXdVVzwzL6zzgGgAARa3tRzVwLW4nOTeZAAAK0sIfWFQ1avCqt7VJkAAABVG0Vs6Oa5kAF47RE4PYQHWmq6PtVVl0gY4bpSd66ur' +
                    'RVdu1R7dx209bS1exEPczqq1S4UsNxkStq2U1copmmnXTnhyeMGiDN/gt1M+afSv8FupnzTXyAAKgAAoAAAACAAAAAAFmC1SCt1fDkb+bY54LEy22ZzVW1uKzsOJYGRBrEb3BYEUrqKRVBAQSzMoPHAsGkMI6WQM' +
                    'AAAVAAAAAAAAAAAAAAABAABQAAAAADvyiT1G3sUo4Hflf5lv9v4ol6Htkm0hL24KO2cGFeTUVVzGyJUnXVsrJ24+wsqrazy2s7WdnmyqtruEjWCvivil0JI2uXu04WK2Hp0qVpVZNradZW8mjxV5XUbU4GtTS0NL' +
                    '4m2/0m9bmYmunms2eNtty8WWbQw2AAqAACgAAAAABiwALVpWXFipxIAPUuXpertRzuOv9PXjq86pQ0eTR1HS2DhPM9D1bJTJm8DlfSjX4FgnjU9Wlqcde1hauFjx6mra1laXKJW7d23+Ycj221arLEy9euxHnBFx' +
                    '1vrTVpLNHjOzyOJr5SgAKAAAAACkEgAAAgACgXIgIoAAgVEAVqRJABZJPrAAJAABBCsgAAFQAAAAAAAAAAAAEAABQABAAFAAADem2nhhgYNUzJeljrxW3slrWdWmyGbPAzisG6ZSYN1eEGqkbkxazyRpuFJisbcz' +
                    'MVYSr0swauZNRAABAAAAAAAAFra1ZhtTnBJ3gAAOsro1jsYVDfzG1BgDBSrDEIEVutpKYWBeJkwVnI3JgsSgAKAAAAAIAAAAAAAKAAIAAKAAAFRARWoZCq0C2/eQQkgFAABAAFAAAAAAAAAAAAAAABAAAAAAAAAN' +
                    '6Tqm3bYsOswBVdFqdBL6nEoiDBSZBCjAFF4nEEEgA23mIK4gtWoIMFjIFkoYYyZNODIgtKu9lWubNWrwtrcSlrV+FtPoNPFEpGGiGowJVTJdEjCRBqqwYUQNMZNcXZ4fURkgAAUCJsAACgAAABCgACAAAAEAAUAA' +
                    'AAAAAEAAAAAAAgABIAAAAAAAAAAAAAAUAAAAAAAEAAAAAUAAQAAACAApBJV0hSAwukQAAIBQiFQAAYgAQsMABDNqq4J2kozJFmCbSjQxIADCIXYBNpQwBAUAAAAAIAAAAABAAFAAAAAQAAAAAFQKlgT0hUBQBAUY' +
                    'AQFkYAQQWCoDIK8xggCQLKIBAAEAAAAAAAFAAAAAQAAAABQAAAAEAABVDwCDAPA0lJllVoIL2BZqISMiRgBhBlAmAL6AGw3W6VeF5bzAIOny8M8zk8zavC3sy8xNKsdJPSMgUCFIBZEiABAABTVY2mQgN4bidnPY' +
                    'Z4mRuSYaricCAFQABQAAAAAEXAgIpIAACQAjdXKgwAFACgQFgNYAQFQAIegAC8DalLANNZ4F4+zw+sznmTkPSIAKBNpZxI3LAbSwt4WY6QICgCAAqAAAAAgAAoAAAAAAAAAAgAINhQCQAKQAAAA6wCoCFHtABEZS' +
                    'AUEAAFDcgJKukyWQL2d+JGQAAAAAAQABQAAAAAAAAABAAAAAAAAFCkKo2yBdkELK6SJ4gJAbxIBQEAAIAKAE4AEN8SacmEAWZppIztAGgSQBAAVAAAAAAABAABQAAAAAAAAABFWCwSSyBlgMAAAARYIWQEASQCkK' +
                    'iMCgFrWZxiAIlLEFcr0mq8HAnZS5JoylgVJSlvLxaW4q4M0iaq/LW9+o51XE4bg7VsmOLSWTRNo4WUPeQ3qNWcowbiAAAAAAAAgAIYACAAAAAABQFTxlEeIAABAABQAAAABdhJAAFSnIYEArUEBp1hSBkAAAAABY' +
                    'AEABUAAAAAAAEAAAAAAAAAAAAAAAAUYACAACgAAIYgAVEYRXkBUnGEYlSeJU7YQsDatj8Bm1XFzOOwSoiC7XKLgtjKjIThYM0+GMM9xmVuAqtFXXeZNO1f0mUUAGAgBIkKG1GxGa/EjpxV3kpHIGqtcTF3ORdGQ8' +
                    'QiwBAywQACgCAFW0CAAIFrWSFQVbLIyVwQCobSADomngqpdJl26ERNoMmDbaeKSWEwYbkYraaVauMXO1DoHV1Ss4asZbnYduB2rn8OWBxsocCUT0DEuBqlVZ8MwUYB3+T/q9hzvp8NkljJNhjAAKgAAoACoAAAAA' +
                    'AAAAAgAAAACgACAVECCqCkYEBQBEUIANoAAELsEAJeU4EYAFlxmXif6mHXhwlPqMgWek6adL2UpcRzNUtddmtmk9iJRv5Go/yxI/pr717f3E4rzHHbOMyW46qeJ+snP6Nf09t69pPkW3+8LjanifrM2dk4ljn9GX' +
                    'VrpCTNcKiTKW00LwP/iZK5ymSABAQbkAAAjVWlmJrJkDF1tukYGcG1uIBg6diCTXf6DAJhqtz0CGvSQFAAAAAAAGAAFwGABBkwAApABeJ72RyAAKm05RAB0+ZqRmZ4rSnOJkDAaebQAAAAIAAoAAAAAAAAAAAAAA' +
                    'AAAAgAAK0QAAAACAAAAAQoIAQBU4yApFmJYTfrABNrIhYAvE9447bWZEAa4nsZG5xbIALLiJIb0lLeEwiOIeBBkAuDW4oNLYQSAKlJbVdc1mZTNP4fSBnAskReoCAAAbVU95iGjpRkonAhwFs2mVE2qy6E4UdHkR' +
                    'ZDTGHVbCcJq5gsReEgBQAAAAAAAAKlJABY6SQAAEAAAAAgDaAAIUqAAAAAAACAACgAAAAAAAgAAAAAoAAAAAAAAAaSAyDcBLEmmMFg1b4iDREVgASCQaBRkABAAAAAAAAAFgQFQIsACAABJtWSXSYAASwAB0o8Dm' +
                    'BYN32GAAAAAAAIAAAIACgAAA1VTJVRTA0YBp1gyAAAQWYCzAUAAQAAAAFAAEAAAAAUAAAAAAAAAAQAAFAAAAAA0mpMgDXEgrYmQMNeiltKL8ecdk4yZBMNaBmWJLg0CSJIIACoAAAAUKgAA0sgECKpkpkRFwGG8g' +
                    'KAACAAChqtOKegydNNwm9wvRE+WyKj4lXeaeotkmqY2T6jO1WLV4TLZ11L0baabawTOJYlACwuGZx3FEAEgBIliQAAA0p2FVmniiVtEld0T+Cu+GK9JhuXJbWTrBkQAAUFmgFmgAABUAAAAAAAAAAAABAAAAAAAA' +
                    'AEABQCRLAASJAAsoYAQFwELeBAWOkQBAdK6GpZTVT6TFqWq4smhogAAAAIAAAAAAACgAAsiSACyQAAAAgAAAAAQaWCanMyJCqlKktbRlizJZQFcttvaSGXiQmvSQZBVw7ZHZ6Sgk2OFlTSW0vFXpHJwxDBvir0+o' +
                    'y42AQAAAAAAGAADAYAFmCpYgCAgKigAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACArNZMrvZ5tsgASxIACRgAAwAAAQAAhiAAAEiQAAAEKAICgAAAAAAAAoAAAQpAKQACkAAoAAAAAQoAhSFAAAC1zApnuBPV8' +
                    'ZABUAAAAAApABQQAUEAFBABQQAUEAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAEKAUAAQWuYFfiA9XxkAFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQQAUEAFB' +
                    'ABQQAUEAFAAAAAAQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWuYIswT1UBQVEBSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKQAUEAFBABQQAUEAFBABQAAAAAAAAAAAA' +
                    'AAAAAAAAAAAAAAWYCzBAABQAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAQoAAgAAoAAAACAAAAB/9k=' +
                    '" />';

var energyTabImage =     '<img src="' +
                    'data:image/jpeg;base64,' +
                    '/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAGQAA/+4ADkFkb2JlAGTAAAAAAf/bAIQAEQ0NDQ4NEg4OEhoRDxEaHxcSEhcfIhcXFxcXIiMbHh0dHhsjIykqLSopIzY2Ozs2NkFBQUFBQUFBQUFB' +
                    'QUFBQQESEREUFhQYFRUYFxMXExcdFxkZFx0sHR0gHR0sOCgjIyMjKDgyNS0tLTUyPT04OD09QUFBQUFBQUFBQUFBQUFB/8AAEQgB9AJYAwEiAAIRAQMRAf/EAIIAAQEBAQEBAQAAAAAAAAAAAAABAgMEBQYBAQEB' +
                    'AQAAAAAAAAAAAAAAAAABAgMQAAICAAQCCAUDBAICAwEAAAABEQIhMUESUQNhcdKTBFQFFYGRIjIToUJSscEjFOFi8DPR8XKCEQEBAQEAAgIDAAAAAAAAAAAAAREhMUFRYYECEv/aAAwDAQACEQMRAD8A/I+7+ree' +
                    '8R31+0Pd/VvPeI77mdo8cEZFez3j1bz3iO+5naHu/q3nvE99zO0eMFHs939W894nvuZ2i+7+ree8T33M7R4oLBB7Pd/VvPeI77mdoe7+ree8R33M7R4wB7Pd/VvPeI77mdonu/q3nvE99zO0eQgHt939W894jvuZ' +
                    '2h7v6t57xHfX7R4oNQB6/d/VvPeI77mdoe7+ree8R33M7R44LAHr939W894jvuZ2h7v6t57xHfX7R5IJDA9nu/q3nvEd9ftD3f1bz3iO+v2jxwWAPX7v6t57xHfX7Q939W894jvr9o8kCAPX7v6t57xHfX7Q939W' +
                    '894jvr9o8kCAPX7v6t57xHfX7Q939W894nvr9o8kCAPX7v6t57xHfcztD3f1bz3iO+v2jyQIA9fu/q3nvEd9ftD3f1bz3iO+v2jyQIA9fu/q3nvEd9ftD3f1bz3iO+v2jyQIA9fu/q3nvEd9ftD3f1bz3iO+v2jy' +
                    'QIA9fu/q3nvEd9ftD3f1bz3iO+v2jyQIA9fu/q3nvEd9ftD3f1bz3iO+v2jxwWAPX7v6t57xHfX7Q939W894jvr9o8cFgD1+7+ree8R31+0Pd/VvPeI76/aPJBIA9nu/q3nvEd9ftD3f1bz3iO+v2jxiAPZ7v6t5' +
                    '7xHfX7Q939W894jvr9o8YgD2e7+ree8R31+0Pd/VvPeI76/aPHAgD2e7+ree8R31+0Pd/VvPeI76/aPHAgD2e7+ree8R31+0Pd/VvPeI76/aPHAA9nu/q3nvEd9ftD3f1bz3iO+v2jx4DAD2e7+ree8R33M7Q939' +
                    'W894jvuZ2jxkA9vu/q3nvEd9zO0Pd/VvPeI76/aPEAPb7v6t57xHfX7Q939W894jvr9o8QQHt939W894jvr9oe7+ree8R31+0eOBAHs939W894jvr9oe7+ree8R31+0eOAB7Pd/VvPeI76/aHu/q3nvEd9ftHikS' +
                    'B7fd/VvPeI76/aHu/q3nvEd9ftHikFHt939W894jvr9oe7+ree8R31+0eIgR7vd/VvP+I76/aHvHq3nvEd9ftHhAHu939W894jvr9oe7+ree8R31+0eMQRXs939W894jvr9oe7+ree8R33M7R44DA9fu/q3nvEd9' +
                    'zO0Dxgo28EYOlkZgyuJBYKkIGmJAg1AgaMwINQIGjLRINsmAEgqQlEYFwLBlZo6wBiBBuBAGIEG4EAYgQbgQBiBBuBAGIEG4EAYgQbgQBiBBuBAGIEG4EAYgQbgQBhiDTqIGjMCDUCBozAg1AgaMwINQIGjMCDUC' +
                    'BoxgMBZYkgBIksCAMyxiWBBRIBqCQDEgQWADEEFAEEFAEgtUC0WYCBBuBBNGIJZYHSCWWA0cgWC7S6mMgrRAAAAAQIA2lgiwWqwRYJqsQRrE6QZssQMwBIKOloZIEMQzKmBJRdrG0CSJLAwAziDUom5ASC7RuG5l' +
                    '6EBoksqyAiWKO8HNLFHaCDMCDUCCDMCDcEgDMCDUFgDECDcCCjECDcElcSDMCC7qcSPmVKECDP5VoiPmPRAbgQc/yWJutxBjrAg4uTtRfSgEEg3BMCDm2kyO9ResuUYgo1+RcCb3wMgo1vZNzkg1QHaCwagQZHKy' +
                    'xMm7LEzBRAWCYAIAkjYAsEkSUAPqeSNKl30AZgQb/E9WPx11bJoxgTA6/jp0j8deA2DlJvlqS/iq8marWMBoQINYcRhxIMwSywOkGbLADilidNpKr6jrBdHF0U5jbVajmVxk5lHSKEmhgDBvdTgTeuBkDEdq4pMs' +
                    'Fp9iNQZViDF0doOfMRRxBpoF0xrdA3CyxMkVdzJL4gFAAAAC7XwAgNbLcCQ1miaIarkQ1UUVZo7nBZnoSwIJgYfMquk1zFNTztQB0/L0D8z4HMFHopbcpNGOSvo+J0ggxZOMDg3fVnqawON6gcsXqILBYGjMCDVV' +
                    'iWyGjEA0lLEMaJtJB1gn47DRzjA78tfQjP43B1ooqkBiylwZ2nS2aIQY24M5bZOzaiDFViXRh1gyd7qsY5GP8RZRzCTk6buXoh+SulRv0OqRYKsgZHO6lHDE9TRxaxLKOYNNEgogKQoheoGk4XWBN3M0eBN9/wCT' +
                    'NVl/TXFvQr5SX33S6FiEZ/LfiX8ttUmP8C0tYqty24XLw6xz4FrzKvB4GrNVzx6Ea/By7KVNTD5F64p7jPFZfMtooI9zzYTUw1D1TNQUZgsFgEFrZrpRt5SjmaWGAEovrO0HPl1mzeiOsoDjdYsxzKwlB6PpeaI6' +
                    'UshKPGD0W8P/AAc9DONq2q4soNajIKCj0UX0I2Tl/YjRzVmDHMR1OfN0KOTWANNYAaI8zJp5mSiAoACNdASwF38MCbmZBcTW9zKuYzAGK3gyoxXM2iUU9KyR5j0rJGQtkcLI72yOVgOUA2ktSwtC6rXJ+1nWDHLy' +
                    'OhERnOyxOjOdsQM7Fm2NtOJHVLMbaoKv0LFMbqdYSTcQVpLECb66Ib28qjqADdbgTddnRZGNQJ9fE68v7c56TkdeX9oRoyzRztatfucPggM15e6zenE2uUk8zH56JRVFXOT4Aa5lZXE8zWJ662VlgeW2F7LpLBIE' +
                    'AMqvSsikWSKZRDks2dmcl9zCs3UHM63tKMQ7KUiwZK1gMZhlsioyIwkCcIA9HJr/AI5/kR+HTeDH5a0SUy0sUP8AYX8SdBeHXE2uXSuZz/2OK+I30eMjo6buGRqeBx/Jy1r8DVeZSzaWD6SDV6V5ih56PU80ulnW' +
                    '2MHqSxjieK7m7fSWDqoeKyByTaco6VsrdYsNaGCARFd19NOs5uxm17sw7PgMRvcFcwmmWP0KrqrM1vTUWxRxTXEsrNEGeby61i1cnocjpzXkjmbnhHq5f/rRozyv/WjRgDnzdDoc+boBnQF0AVh5mTVszJoAUgQI' +
                    '04RYemBmyjWShC1t8i/T0syWMJ+ARZrw/UTT+L+ZIhwVVATXSTdWnqZ2oqpXpJcVo9NftR5zvT7UZFsc7G7GXkBhDcVZMwkFduU5TOhy5Op1CI8jnbM6s5XwAw5byLFnoN9uAm4USsnLK02Z+t6iLasDWzixtXEz' +
                    't4sbUBua8SO1AqKDMKcgLvotDrSHWVgcfgdeXjUI0eO07nOcnsOPM5ad1Za5lg4qlnIdH/wdfxP8ix+HQHy/8jhpToNHFO1XwNTv/wD0/wBTXN5cLAzy01fpKOleS39zjoL+CutmbTSTbaRj8lOJno6qqSiSNIx+' +
                    'anSPy0eUgakxgmZtZLXMyrKcxitWShijhYFq6vNhbE3VuODA5uXaEWyssGX6U1iavEcWUcQahLG2C/Vkd3lVbV+pUSHwLtsYbb1IXDW4tog92qMS+Jd9uIxNWQN7G5a1XwCtV5l6ZOVwZzZv6HxX6jZP2tMIwVKz' +
                    'eBHKcPAs4RoUdK2UfU0mVWr/ACOJcIM4uuj2v9yM46YmAXDW1ZrQSmoTjjJiWWX1jE1qKlreFDWHFGJWqLg9YGK1dqzW2WoM7bcGdq8zaklCSWg/O/5L5E36HTlYctJ5mjg+e/5foP8AYfWTKO5jmVtaIWRz/wBi' +
                    '/BGv9l/xGUNtuAH+yv4gZRzsQrakKtnlVsqoQ6rk3ecVNLkV/daQjgLqInM6xS3NVcqr9WY5ye920Yg5HSsOrnNOTAKNYNyzUSsDKNrIlCvLdnGvFnRcm/FE5e6ava1xZ3IOK5NuKO1VCgSCA6yTauJRIGFy0tSf' +
                    'hXFnQAYXKSybLsf8maAGdn/ZjZ0miSBl0ejDpbiakjulmBFRzmR1tEQbbaUwSrs5bULQDGy3ARZaHYmIGJM7XJ1DSegHJVZ0oorBHSrGxrJgbMv+mRP8i6SbnrUDlZNqLYS53HSqSSjLSxztd0eGT46D8tmohFG7' +
                    'Y2SiZzRytVq7hG5ao7LOTlaW4l9AgOvShtX8kZghRuK/yEU/kZgqQBqnFskLQ3C1NJUGjCwQiWdfoiIC2ynGRNVr6OXWIniSl6ZpQc73l5GVZrIYhzdzvNv/AOTBt2eazLyqpy7ZIvocgaiZehCoggFRRAVogAsE' +
                    'KBXea7XjwfAyAANNNQnm8TKcNPgaau2rNfdqQLLaZN3c2MiCAoKIAwALPH5gEBYZgZAAAAAAA9yrVZJIlubWil/BHntzXxLXlz9XM+Ff/kznyor35j6EateFEhtZJQuBys5HkZefSd6WXMrji8rLj0nAVs62VkXB' +
                    'q9HR8a6MwetRZJ/teh5rJTh9uQlETOtK2u9qwWpzhdQrzLVeGgHtShQhD4yeX/Y5nEf7F+gmUer4EPN/s36C/n5nFDKPRK4g835+ZxRfzXcZKBg9AxJy27VVra8DZBj6tF8yzb+P6o0AMzb+P6mXWz4fqdABz2W4' +
                    'V/URb+K+ZqyeDQrZW61mBj/J/H9RHMnKPidQBx/y8A3zeB2AHGeZ/Fjdfg1+p2AHB3vxfyLXmN5tfE6vIynjFs2Bn8nSvmi73wnqN7a8ETZR6IDm+an+2TNVTmXxSXQtTs6J4S0uBK8utcVnxAxzclVZGIUQ8jV/' +
                    'vZlt6YhXO1YIjbn4mHgzURrDQ1NohsyrLqNTXSSKjbbCU6hKXiRq1XngBuGsXJKurztt6w5gw8V0gbdaN/8AsRlqi/c31GbZ4Da4KjW9JOFnxCs/xvHanglxNJKtW3jOhHfluiq6udCDDf0JcMzJWoIaAqWBCgWM' +
                    'DMG0VVkmjmDq+W2sM3kzGx1s62zRdGIBW+GRCoHotXmOitOEZHnPZa9YhWWUdDM/sR5AHmyFFKjJqqbcVUsCwZ1PVTkpfdj0HHmw+bhELgSVWHmA+IKF9OoyatoZERQCFFB1pyL2xf0rpzBNgzVJfVZ4/tQbtM7p' +
                    'kkVa6TMR1BWnaeghMuoSMNUgAG6czbV1eKZ0fKSo4fSjgevl7b0T4YNEo82eJlqceGZWnWzq80wnD6NSjINWrGKyZkqAAAG6xtnVMyb5UO0NSmSq61VWvtT1Mvb/ABXzEw8MsjnaxmRW5XD9RK4M5SWS4mumHAqf' +
                    'QcpY3MYO2/DDd8ybsZxnrOSs0XcMHVWlxLnrKnOTscZnHUqtZPPMmDrv/wC1hvf8mcW3qSRg7b3/ACY3/wDZnGRJcHffb+TFrNrFnDc+IljB3/Jbix+a3H+hxTaD4kwdvy24v9DW6zwlx8DzHTlvFCwdbKYa1WZh' +
                    '5G7uK16jk7EVJxOi5e5HKTVLNMov4rSbrWvHE6pz8SbKkRhJaYm3VNHG6VHNcnmFbiwHMyS/Qwjdk7ZL4j8erwKrnZY9ZauVi8shfoJVpZl9I3mp+bMWrqduTRvF4JZGVWb2o8pwIObSShPFmDpzaKl4WRPx3tDW' +
                    'M6lgwDsvDX1aRzvS1HFvgy6iJnStsYzMVq7OEenlUpXJzbVkqt1rCxzOd4tzF/1zN8y6pXpeRxXHV5mRjm8va9yyenA5HrTlRnxk425NljX6kalHI7Plf4lbV4s5NPgdN72qLOGosmWjk3IAKy3Wk55adJ35eGFV' +
                    'CM8urvRTpqLxRRubs/6GL1pvmc5VW2uNv6HnRIKUVKVBGnXM2kbXB5cCarz2csh1vymvqriuHA5Goy6VtsW5KbPJvQ3XxDn6qp9JxIMHurfcphoHjVr0f0uATFZAzBpAAACkAFOnJvts1pY5Ag6c2ytzJXDEw8ya' +
                    'mnVKitONtAJOrNLa1liYAG4XAbUZTssFkJfEKuTN8vDmLgznmbX7XwZKK08VwZzcnbmKLW6cfmc7YsQYxLiClRkFAEKQFFkSQAUAEUAARCkKBRJAFU1y39SMGqfchR25mSfw+RzhvA6XiMphv+pzbcQ3C4GYqOEo' +
                    'ri9WVJ4cSQus1bmW2wkqzqs4KjSu1g9DrW2489U4l/A3VwyVXTmKUc+WqrGylnbM4NOrhkR13yYs2SrI5lqfgFZtiXGzVYx1LAq1W26JtoUemspQ9DNaKrdnjZ4ybBEcLpWvut9qy6TdJWERV5LgbdU2p0yJo22B' +
                    'TlznRxRvFv5G73VaO2cHkxs5ediwd9laNVSbb1eRqrrSrb04GK1u1tbmujNXTrWE8XoQYtZ2e5/AaSZ3Qo4CrTZVdata68TSyk5O2Zd+BB1lamLU5dsHg+KMbpKrRnkEcb8p0xzrozNds/VMdB6b4YWU11RxdFW6' +
                    '1o3M9BqVMas7RVRFUpVf7sw5bl48TV7brt6f2JErgFSUgnOPyMpcTUwBrdGCNbow/U5LBSVMYOiu5wM3qn9ShcSFUZPXAgxtX8kVJVacptaGYxN8uszZ5V/qaGLOWCpJtzM6LiAjIAKgAAAACgAAINv5AAAIAGiN' +
                    'ER25fLd1OSJ4VxR0X2mr8i1X9K3JivK5j0jrJaRq+afGq/Q46HfmraqJ54o5OuuggwCwVVkoyDe1iF/9DTGIEHTZZ5L5mlS3BE0xxgNHfb0pE211tI/oxygQdop0sTy+A0cIEHfdy9KpjdX+CQ0cYfAh3mv8akaX' +
                    'BDTHEHVpCKjTHItcze1EVWho6czL4/2Rz04HS/29UP8AQ5skVUhBEyyBZbzEwzIA7V5jgzzLLBmPqJHEYKrYm8HEaanOGbWQoqejwYr966yOGofwZeXLuk81qQejUpzxXMnR4GpxYRo48y257VjXK3E3b7HOGGaO' +
                    'NL32u19FgwMczNUXxYti4WSyJRO12+GLKsUaHqlJdCWJwbd3u+RL2Tjl1y/czaX/AAZGNmP9RZqtOl5HR7ap2awPPazvaX8Czo1XIy3DaKiXzkvsWjNPDqOacRB1nDElG1DrD+ZzWH0v7XkKva8GXmLVBWEozzEh' +
                    '4pMw3JcRSagIoskkSANJlaaU/M55G63aFhrLzkdGhbRJAg/peDxQGal5gAQrIylAAEAAAAAUEgAAAAN8vmOjXAwAPY7utd2a4jl81XwyZw5XNdPpeNdUV12P8nKe6qz6DGK78xLZj8DjSGmrZI3bmvcl8eszZKj3' +
                    'pTV/oBlrGP0CS4ZDcm5/UbqpqOIVvasHGYe5ZYnWK6tFmmjIjl9TQXLtmzsnwRQOP4m84NLlJHQAY/GpzCpVaI2AM7VokZaqs4NwhCA5/wCP/wAQin8X8jqSOkDGyj/azL5FdDpt6RFtGByXIxxwD5LX2uWdYuiT' +
                    'zOCYHGysk5TObPXut/Ezbbb7qv5FHmyB1fL5f8mn0lXKrON5Q0cQq2O9uVTKq+MnN0suI0YhiHxNECpGJUNSpAU6cn7m+Bzg68mIZEaeOJlYJt5vA3m88Cwm5gDnzZVFqsrRmcufbKqySPRZwmzxXcssGuX+7qDw' +
                    'X9CVeL6iZl9jXLzk6yc64Jsm4lDmW3WjRGQsymgF8k9ALY16iDKOiZhFyFI28DUzVmE8INLB/wBiK5P7YMm7KLNZGcF0moyhdCAoFkkACtENJp5kaIGklVbRujDiSrSeOKLa9rYaaIDIAKNWwajLQy8QAAHWEEAb' +
                    'ry72+1YcSvk8xftnqJquYHQ8AUC4Bf8AkljqIM4AvwHwAgAKBU2ssJzIANTjJ35V0/otk8jzvIqbTT1WRLFd3VttJQlgSnKdm5+1alvzElGrxcHakbVGUGRFyqcJNpJZElGXZvL/AOyDYM1c54NZmgAAAAAAAAAA' +
                    'AAAAAAAAAE214FAGdleA2xk2aAGXTpM/j6joAOX4/wDqugmyP2/qdgBwdOtFpsqocnYAcnXcm8ksU0YVlVpq8rVM7wc/w8tOX1gTnWwhHl1k6c20txloc0agLUskDKNL7ERmv2pEaIBCkZRQtURE1AtTTrCM1OiW' +
                    'GJKMpm51MRATIq81TVW+DOR3S3J145HDLAsZoEAaFIUQQQ1mjJQICsFCMJBXjtQIMno5PLTW+y//ACjny6Vbm7hLTidt7bnJZLqJasZ5tKy+ZKnWpituVONIT/Q6WStm0cHi8cOoQdqJpu1Zqk/sYd62W6t3Sy0O' +
                    'FlZOGQYmra1rObOWJIDQACAAEAAAAAAAFIAKdeXzXTDQ5GlWzyRKrry7O1nrJ2SaS4nmW7ltWa/5PTXm0spT6zNgLC+OqK3hgebm3te01T2otJ2NNYjB6K6lk8q5164aF/2LapDKPTJTz/7C1qX/AGKcGhlHeRJx' +
                    'XO5b1g0uZR5WRB0BjctGpE/IDYMyxIGgZ3DcBoE3CQKCSJAoAAAAAAAAJayrV2ehy/PRrHBPUDXM5u3BL46HFWbq7vqTK+c5dbLdX+xi9l9tftWRcGHiQMM0AACNTgg8iaIMKuhlmtDLEAMBhEOtLYQc6uMzolKl' +
                    'EqxWQS1gxJFVOHKMc1LdK1NSjN8kWeUrAANMhU9DWxP7WYaazJyr2K0QqtAaWaAAhquYDVvgCcQFXPMqvCgySWngMHT8kpprPUw+Adm1DjrIJE0zABQCAAokgAoCQIoAAABQKkuBdteBP68EHZrQg0q1TmDcnKrt' +
                    'nEmk6T9SdX0cSYNNiiTUL71o9TSWDcK1dWg60f3YPigKqX6JJam2ZtLtmZfKaU1+pL5mKPMDpOEaEaXACSKy6om01mIfAujG0bWbh8CY8C6jEMfUbA0Tffiy/m5nEYCEPwKufddJfzv+JmENqJwbXPWqNfmp0nHa' +
                    'htHB6FzOW9Sq1f5I82wm1jIPXjo0XHgeOLIs3WTYwevESeVczmrU1+fmIYPTIk868RbWsl/2E8NuLGUW3NzwmcjkrpNvanOSNNNcvd/I5tcRB1pzLv6VHxOV01Zp/oaexLBy9DOn9ywZYZGDSLAAIAICjaIwGRWQ' +
                    'wCoG03XBkptyefEWo645riT6G90mSVYJiqSzmCmWWFQBKTadUo+ZUYTaN7nHFamXWciKUyC/S+hjIjxBQNV4mTcfT1slIzxBG56gBSFIUAAEAAFAAAWBoyEwKBIIKQFCoXDUjIEa3uIWCMgFFlrIqu9cTIIOtc93' +
                    'LcPgdK3VphRfWnE8+TN7t/RdZMlivRVJ4qVxnNMzeib4N/IzS7twXMrp/JG8LVhZaPp4GRyAxeDzWbJJVWfkVpqMc9SbnsgPJAXa92zXjoRJtuM65h5oasBjt3aajFYvJ5PQLJh/ascgGKwaAbcp6l3PfOoElcC4' +
                    'CrxajB8QmtrlY5pgIXER0hxsTj6tWHthQ88wEMQytRZVTmRD3bVmQQDGRPxAFQwfQxj1AWPmXZuwSXWKqXGp2SSUIIlaJVSeO3I48/l1rV3WDPQebn33KFkmWeRxRWRZBmhlgMFQkAAAABUysyjRFiMhejU3WiSm' +
                    '3yGon43tTTkqs0otlwG21frrjUxMk8q09qf0kkhZKEiq3Z5ImY3PLRBFcdRk1vnNSR7dGBBLAKgAAKlroaf2wI+mESzyRGmQAVAAAAAEAAFAAAAAQkskAVZ6BPQSWJZAbkAFQAAUAAAAAdJbW5YWR1raVvX2PCy6' +
                    'eJ504cm6WVb5fTbAzYrpzK65NZ/2MTJ0h7XXCa4WfQzjlgyQa/aHkgvt6w8kFP3IqzZP3ILNgFkxoFkw/tAPNF/cR5ofuAqzYWTIs2FkwL+0PJE/aV5IA80XHcR5ofuAtW1ZxwFXhZcSLMV1YGlDr0rQTOZlfaUg' +
                    '7ctYTqV3+XE57oSRje8V8wjrzOZFcM3qeeJUBuX0FWBRnrzMs1Z4mWaggAKyAoCoAAHQjquWkvrfwOdbOrlG2yXSNp1TwUEaaTX7liuoxKmfmJc5z0kxSt3k1hrBl1a6tGV5yhOHRwKjKZWRjpKNLIkDQhAgCQVE' +
                    'AKBCoAK3VmXi5CljBEVAWECpiAAAAAgAAAQAUAAAABAAAAAFVRjiQFWYEK3OmRYGvQsyCf1IX/xDWQIVYqA/0IUdquVW8L6fpa4mLqLQxy/udYncoRbZdWBn2qVeDXHUryRiTbyQov7gs2P3BZsiiyYeSC+0PJAH' +
                    'mi/uI810F/cBFqVZBa/oRfaA/aV6B/amHoAf3IfuH7lAX3AFmwsmFqFkwC+0BfaAM2bkXrZRK+IusC15rwTyKhRO1oOq5PSc6R+aFk8j1Yko8nNrttHQc2dvEfeuo4M1AABWVVmsiABQDMqrxAhZ0DwwIAEgAJAA' +
                    'A1oZNV4EpE0Ia4owUoAAgUhQKkICNdZGkyUcSdIeYbwgACyAMgAqAACAAAAAKAAAAAAACAAChqqxRlG064JrLUlIkr6rfIh0tT6U05po+kfitCw+BNVzXzLhhwLdVVsMuBE4ZRCFZCoGm+GHBGSyQDac1XQczVXp' +
                    'OWSFWN/uC1NKjbnKupZ5VTKsJNqINLl2eBv8vLXEfm5fAdRPxOcS/i1Zfzcs0r8p6k6MLlfMmzOFgdoq4hyHUDi6KIfyDpjjitDptjEjVowCuTq5TEQzpiT+oHNakWR02zJh1jAoaAEAHNqGdAknW0liM/aq3WPE' +
                    '9iaaTWTyPErJSnk8zfL5z5eDxr/QWC+InfjwOLO3OvW7TrlBxLEoAQqKAVdQBWZsJJojMtMxLIzUuII+kqIACoABADS+Rk0iVYrzOZ1aOYhUABUCgAOBrEiNEaZZDpxXE5tNOGJUoACoAhQDAAAAAAAFAAAAAAAA' +
                    'CkKAiAIwKQa5d4+l5W0LLerZzKn19SJilmtDJXZkkqNNysNMzJZw6yAAC4LPPgUFWXi4XE3vrX7VjxZzbkEwad7WzZkApq4DDpIALhxGJABpXdTrTntZ4o4SXB9BMNe2nMrfLPVG4Pn41O1PEOueKM2K9DqRUFOZ' +
                    'W+WfA2QY2VMumubOhLJ6ZgcbV+ncsYOUnaYcpdaOVsejgWKgnC3SZmA8dSovL2u0WxTWHWYag0rbXKz4mZKi6EKsiFAgARSptGTVYTl4hVbcQNyEWs8iOtloTgrIyYoYg0CAKgECBWgggQdOByeDZpMXzniItYAB' +
                    'WVAAFRoyjRK0EvnPEpL6EnkrAANMhSFAAAAAABCkAAAAUgAoIUAXgyGkpTXxIo1pqiGnLSjXP4GViAIJBRW0+hkHUAKRFYb0WXEgZdZACoAhQAIAKAAAAAAAAnHVwGDACqrOrwwPRy/EaX+Z5p4jIlg9zq3ingT6' +
                    'kefl851UZo6PmtKa4rgZxVu1E5PU4NqegvM5rvCaSSOZZDVkrSnDFGRMFTQAFQWQGgCoAAgVLEhqreUwKRW282JBCNDXBkKSCoAAAAACKQSBZNfdVrhiYLVwyDIK1DBUAAB05f43O9tcIOn4+S8rwcFkUzWnb8Ff' +
                    '5o5cyrpba3JCWLCoACsgLgRhQABAAAQFAEAAAAACkKANUe2yeizMlCttbbOqeDxqycum6z6MzVfrrt/dXGvSuBK2alpY6mVYahshtVmlrap4mZWpUQqWunEYa4LhxI3P9kUG/kAQIoAAgAAFAAAAAAAAAAAAAAAB' +
                    'U3xMgCggApAAKCACgLIBUAARUpNfTGDxLy1KZLJE3qo7NkkZCSiySQAAIUAAQIFIAKEQoFfEhXMEC0AARamjNczRK1CDNjWJLZIQrIAKy7fnrb76J9JjmfjlOmuaMpEaJigAKgAWq3WSykCQDpblcyukroOYUAAA' +
                    'ABAAgFBCgWWnKwayN2at9dcLfuX9zmVTn+pFJlRxJBp2WnxZkAQoKiFAAAACAFAAAKAAIAAAAAAAAEAAAAAAAAAAAADUfSukhq2VeowItADdFjLyQRX9CS11Duv4icWzMRijLS7+hGW5K8SFQABRCkKEAAFAgALB' +
                    'UgsikVGZNGBEqgEKirMrlYoizK7dBFXdazmzmNSPIhq2QGAUFRURlWQehF9IACoAADVeZev2uDf55++qsjkCZFdo5N8ntfDQj8PdKaxZdByLW1q5NrqGA01moJD4HV8+7UNJvRwYdp/cx0SGIXEkLiWFxKJgM8i4' +
                    'dZJAuC6SNgAAAEAAAAAAgNquEv4IDBStLQgUAAAAgFIChEBSAUEKAIUAQFAEBSAAAAKQtcwNXMG7ZGCRaHWNtY45mafd1GmKRl5EbZYbEJZsKyCtohUCFARCkKAAAUAKBUCFIoZNGREoAQqKAVtaIKhXkQ0QjIAK' +
                    'gmG5AAAAAAAAAAAAAAAAIAKQACkAAoIAKDdKVdW24KuXTiybFxzCTeR1S5S0b6zW5PTDSBpjmqfN5Gti1ch2XAkqOBOqnMSUJcMTBrmfcZLPCAAKAjCQVJ/MCILFlrm54MJYSBAVLV5ImoAhQEAQoAAAAABAUgA1' +
                    'XVmTSyFWK/tRg3b7UYJCulMmGzKeECRhpLIHIKAAAAACFIAigAKoAIKCFQUMvM0ZeYiUABUBiChSAAQQBgqALDIFwBAEUFrVN44I6X5SqlinP9CauOQEEKigACAoAgAAAAAAUCAFAqKZTZrdxIpDGJJIBqSSQDDV' +
                    'ZACgUhQIVToQtWBvBNtZsqfLai1fijH9S9ZlVtXak091HkzOWSzN1sk3V41eaOeMxmAhY49RCuPiQ0gAAgAAIUhQBDVVVuLOFxK64/RLXEDBv9pNluBSVYW+1Iwbs8DAhVIUhUaT0YdeBkqcBSBBqUMCCEK+BkpQ' +
                    'ABFKRFCgAIBSFChl5mjLzEShACopSJSWAsUYEKRWQAVloAY8SNMwCgqYis6uUadk3LRMCwiCq6Twqiu/LdXNYtxRhpaCBw6gEF2uJKIAQIAAAAAAKQAAUAAAAIAKAAAACqOAGhBGEVqcSFGhOBARQNuQSWmEIENC' +
                    'WCgAAgAABCkAo+IHwChr+5nEtXipIRbmDdszMLiIUBVt4NkKiAAAWSFAdJCkAAACggAoIAKWTIC61KI8yAJoAAN1yBK5MpGlAgEGAWqlg1qYoAIoAAIUACzxUsTOhABSEKAjHAkAASBBrFDDhiExgGgUxAIARCgA' +
                    'AAAAAAAAQoAFQ1IUii1q/gQr46hxEgQSAVAEKAkYAAAAAAAVAUgRRiQuAAhQAmcxgAFQoARAUgAAAUhQBAAAAAAAAAAAAAAAAarqa6zCNY9DJViyg2mJrqoJOBFWr216wZbBcGgdFWm1N2x4Gdr0xJowDTTWagmO' +
                    'gAhQAIahkAggsMQBAWBBRAWBtYEwKqzliXbGqGCc7sVwJoy6xmhHA2rRjMvgyZ4yNGYazRINtdJNpdMYgG1WegkMamMgsCCmIBDAQAAApAFVjLqYReh5P9CKy18gXGvUw1qsUVGSggRQAlIAABQAACABAAACkKAA' +
                    'AAABQhQEQAACgAQAAAAAAAAAAAAAAAGqxqXDRkqG8SL6a2vMjWEk3W4kxAAAo3gNcGBiZVpWer+AdqvGIXQZEIDr+NwnKaDpFoUOdDn+nAs4RLnRkFdYzeP9CNYTJJbeL+JWqpZtv9AEKM4Ltw+m0vgSF/yEm2lX' +
                    'MKQlm/kJWOHUa/G1nZfAyAT+HQG282QAXamxHRBIZcQIyYmoBRnEYlIEGMdS9RIXEBiQv9QAicn8CNOcUUqs10gYdfgSGdnetomY16TLVG3H0/qXTHMG2vk9TMIamIiyhDIBpPR4rgHR50xX6oyanGZjpAz1jA27' +
                    'N5xbpM4cAJgAUon9SggAhSBAAAAABQAAAAUAAAAAQFIEUEKBAAAAAAAAAAAAAAAAbrkGpFcjUKFDxI0xBHJuGToGmMgAqOgLgQw0dRCjQohRACAWGWPQBIUUPNwyurX/AAQLdV/Swi9EjDQqdXO/Dq1G1ftfwZFZ' +
                    'KVqGt2BOPABgUhZAYxIEsSBIECfiGBI6SdBS4fIoyCtExCAEgACx0gCQXDL9QHiBI6Q6tDETGQGYQg6bpzI61bwcDTGCSbdWplZZsmGUY8SoyCwSGUAQBAAAAAAAAFBCgAAFAAAAAQIUBUKQoRAAAAAAAAAAAAAA' +
                    'AAbWSKZrkUjSkAAjBAVHXEjAMNAAKAAADQAAUACGq7/25gEGq78eGsh7YU/cAQYeeGQAKGnSOsAA+gIABjoOIAAAAGZ1ALEUABQtdus/AACPXP4kACAwAAuMaxqXCFuzAAy9s4SZx1AKHWTAAJUABUAAAAAAAAUA' +
                    'AAAAAAAABUAARSAAAAAAAAAACgACAAarkygEaikYAGQAVH//2Q==' +
                    '" />';

var staminaTabImage =     '<img src="' +
                    'data:image/jpeg;base64,' +
                    '/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAGQAA/+4ADkFkb2JlAGTAAAAAAf/bAIQAEQ0NDQ4NEg4OEhoRDxEaHxcSEhcfIhcXFxcXIiMbHh0dHhsjIykqLSopIzY2Ozs2NkFBQUFBQUFBQUFB' +
                    'QUFBQQESEREUFhQYFRUYFxMXExcdFxkZFx0sHR0gHR0sOCgjIyMjKDgyNS0tLTUyPT04OD09QUFBQUFBQUFBQUFBQUFB/8AAEQgB9AJYAwEiAAIRAQMRAf/EAHwAAAMBAQEBAAAAAAAAAAAAAAABAgMEBQYBAQEB' +
                    'AQAAAAAAAAAAAAAAAAABAgMQAAICAQMCAgoCAQUBAQEAAAABEQIhMRIDQVFhBXGB0SIyE5MEVBWRQqGxUtIjRMFiFBEBAQEAAwADAQAAAAAAAAAAAAERITFBUQISYf/aAAwDAQACEQMRAD8A+S/c+b/nfcfVv7Q/' +
                    'c+b/AJ33H1b+04oCCK7f3Pm/533H1b+0P3Pm7/8Ad9x9W/tOHBSA7f3Pm/533H1b+0P3Pm/533H1b+04oCAO39z5v+dz/Uv7Q/c+b/nfcfVv7TigIA7P3Pm/533H1b+0P3Pm/wCd9x9W/tOKAA7f3Pm/533H1b+0' +
                    'P3Pm/wCd9x9W/tOGBwB3fufN/wA77j6t/aH7nzf87n+pf2nCAHd+583/ADuf6l/aL9z5v+d9x9W/tOKAgDt/c+b/AJ33H1b+0P3Pm/533H1b+04ZCQO/9z5v+d9x9W/tD915v+dz/Uv7Tz5HgDu/deb/AJ3P9S/t' +
                    'D915v+d9x9W/tOKEJoDv/c+b/nfcfVv7Q/c+b/nfcfUv7TgTKA7f3Pm/533H1L+0P3Pm/wCdz/Uv7TigIA7f3Xm/53P9S/tD9z5v+dz/AFb+04YCAO39z5v+d9x9W/tD9z5v+d9x9W/tOKAA7f3Pm/533H1b+0P3' +
                    'Pm/533H1b+04hwB2fufN/wA77j6l/aH7nzf87n+rf2nFAQB2/uvN/wA7n+pf2h+583/O+4+rf2nFAQB2/uvN/wA7n+pf2j/c+b/nc/1b+04YHAHb+583/O5/qX9ov3Pm/wCd9x9W/tOIIA7v3Xm/53P9S/tF+583' +
                    '/O+4+rf2nHAoA7v3Pm/533H1b+0X7nzf877j6t/acYoA7f3Pm/533H1b+0P3Pm/533H1b+04oADu/deb/nc/1L+0P3Pm/wCdz/Uv7ThGB2/ufN/zuf6l/aH7rzf87n+pf2nFAQB2/ufN/wA7n+pf2i/c+b/nfcfV' +
                    'v7TigAO39z5v+d9x9W/tF+583/O+4+rf2nHAQB2/ufN/zvuPq39ov3Hm/wCd9x9W/wDyOOAaA7P3Pm7/APd9x9W/tB+c+b/nfcfVv/yOIIA7f3Hm3533H1b/APIP3Hm/533H1b/8jhGUdy8583/O+4+rf2h+583/' +
                    'ADvuPq39pwocEHb+583/ADvuPq39oLzjzdf+77j6t/acUBAHd+583/O+4+rf2i/c+b/nfcfVv7TiQAdn7nzf877j6t/aC8583X/u+4+rf2nGEAdv7nzf877j6t/aL9z5uv8A3fcfVv7TiDqB2/ufN3/7vuPq39of' +
                    'uPN/zvuPq3/5HGIDu/c+b/nfcfVv7Q/c+b/nfcfVv7TiCAO39z5v+d9x9W/tA4oAColihmkDaJqsnXsNKNS0hNsaYSQoKnAdAFAJYGtMjwNEQPaXAQNEQEFQOBozgcFQEDRME2wawZX+L0CCRDAqEMAACkyYAKp1' +
                    '7ErDGnBTSfpBggcCRaRBMBBUBA0RAQXAoGiYHA4kTUAIEh0UocDRMDgqAgaJgUFOCdyAICBTJSq0AQEDiAhtATADi2j/AJFttPgAYBwTtsEMoY0RkE2gNICCd495A4FAbkNNMBQEFQOBohITUuDSIRC7jQbRFhtG' +
                    'jN1JNoItWMllLElrJCKWGKQ4BoocE0ZLWCoFZNZKrlATA1kYJKQJdcjaLFbQaIgICuWXAEIcC0ZQCgCoAC0hbW0aOJFVTlmdaZQ6rWRLubNImJeg0Zq2clWyoRfy0NUgaiK8b6heqSNoM72Uw+o0Txy0UokqtUlg' +
                    'l1acoAagRcDgDMRptFEsKSMbxODoeEc1tSxEgMDSEAwAAAJABjUWxGR7LdiaoXRmiRmk10NapkqjaJo0aYskRmquSoKhhDGiIFdRUpqFLMbXb9BYLouhTgxVrLJara+ugsDdqoh3b0Nfk1GqJdBsGSpOWwjasI3g' +
                    'm0DRFa9WWkUkJtLBNEtSxQ0WkEMKlQxwPbIs18UAmhQWoYQBm6jVF2LglPMDRLopE+JPQ1iQQ1Mc7o0Gyy6HRA4L+jHNLKraWkauqYlxJOUNhhcjSQqw0Llq5kzTaEnA0aaclLJnvY1cZRpBNqtoqtkyoIrlahjN' +
                    'b0nTUz22TiDWpiqOcGqRltsnMGtXK0JRHJX3SKGrbcqDOkq0MToNonqa2TIaliVTWoXWMFVWJZMpsDNYZqlKFak5Q6PoLUTasFJSirBUmqlAU6gBdq5fcVZrqU/i8QtkilEjVYCuAbbCKgIGlgcATArUVtUWAGTr' +
                    'bRaFKsIuBQBDTAqHIMCRRksAIssHKzXl5P6oxNfUoAANMqquurC1m1DKr8ONSUpcEaSIqygRUwGlOXpb+SIES8jqUPTI4OVNrQ1rzW0iTNitwdZM1yv/AGMb5LdtvpIKiNSL8la6ZZEcl34A+KCiff5H4Frgqtcl' +
                    'UcYagt6ShojZXRFJRgmszLNVkggbUja7DSYEaBCeSmlqCQCgTSLgTSkCYBFYDPYBQESE27E7r1eVID29hTOHqL5i6poqqrZSgEJ0cyS+J7lDHavIsplFpCtXqRW/K9FI3yXXxVGC1oMzXLX0F1tV6MgIHBQgJsjO' +
                    '9FZwsFuZKSQ0YW4WlhyZurWqOtkuu7Us+xjlTaLXI+ps+OvYPk0bRdhh1aiXgwvdu7aZpytt7a6IxdWtUIVdeSwO90ZlpyslsI0rveZIta6csdLQa2qrVMiFe1l8IV2ty8C47bW6sdssB7k3HQzuoeOpo64lGdm7' +
                    'WSEFqVWGZrDOiukWIvxzoJVJZHDTBYwUQUtACoBBnLALOBKXkiqlDWck4epSwwKyAJgUAxAEMTYmxakUahAaApYBqJ9kUlBF7qmf4A5+WjrZ9UzMt2besihM6RMSNIe0aUDTDpZVedBvWUoJgJjBFKwkAyoBDCAJ' +
                    'N+Clp3PToRSqdkjfk5FRQiW+GKs4WDnVbclpegLfd+B0VULJnpQkkoEwbfQFLIHErIQkDQAJ3Swyl4C2phsjqBSBtIi1raVXrCq76gS+VTESUm30hC2ZkbfRFCs28IK1VdclN1jsx4gBFSKASIGJjgQChA2koSBo' +
                    'T0AG8SEpoldilVIAohtAgANtXqjO/CnlYNWJaZKMVXkXwv1DXK04uoZpDTlBatbaoaCrq3MibTthkW4FE1ZPFVyMg3gZm904KrPUgcjUQRmS2oAya2uS1FlkG+4msSiiL8KeamDTq4Z1UvOHqTyVV9Cy/KY5zSl2' +
                    'sGdqurhhXU1Rq6N+8gbc6GtXWITHbbVSzGqnclWWY1t78itZ3ZVKurllzIjR3qC5M6FYmRuHoRU2s9dpNb2s9INYlHO/dsIN6uWBFb5ADVpSTO1wHJeqbjUmlW1LAr4tAmE5FDSwFFZfFkBKzT8A+Y9xUINqmQKV' +
                    'sDmRakJWq/Ag1gTTErSOQISc5KmBNplJdwGY8yt2mpsJqSjhagJOi/HufYwtVpmpdQ0xktD3BQ2TIMRYlMBDCGCGlgnrgK1oms9UK1L626l8Su37yhLuauLOOxneVKiSSRbJ00BMyBjWhOZKkACBrQl+9oA2401J' +
                    'pubbbG8KBTCApk28CJbZSeYRRSWBhoBBLqmQ1tso0NYyJqQKWgtxFb5hl4YDkWoCgAbFI5JYBXUomSkwBoQWYkwLE30EghsAyiW2jToQkuoD3ShV+Ilp1z0FW02wUaPwHt7kuzTyUrogqETZpFLJnyVs/QUFsrAq' +
                    '2SwxNbURVOzkC713ZWCauywabZRFqNaADru1Mb12s1W6R2q2iy4MFI7WbwzXYq1nqY9TW6grba5NPmbmjOBQxkHZholOGc9btGi5EzNlVumZc1eqKpZWLtVNQQc1XkAvXawNf0aurdnKNNFAWuk3IviyZAsKWOuR' +
                    '4ga8CBWrKEliC5E0Aq0jVyFpWBp9OoARO1S0Jclb4NHlGbaphfE9EUNKtPFvoaKepFaw5eWxuy6gVKEZ7nOEVuhZIKaUQZPiSl6oveifmpPRoowdcNroQ+51tVun0bOWMtdjUqJYDEaQDEADbkqnHaz8CYOviptr' +
                    'nqZtxWi0CFqAPKa7mVQwCvwqddBxkgIkIgYAHpBQhRkTfQBfE/AIzA1gYENJBWEU6zmSdoFDJ2gpQFoAQNgRt94JhjHAAmmBMRoNW6MBtEMsTQEwNsIBgLUmzgZNu5Q62NUYVabNVboKKkxtZzgtudDPVgaJNozs' +
                    'tljajJ5VIEpu2pdWiFV1RdUBb0JbbRTAglVXUW1Jlk2XUAB1bCzVay9ehC5SinRtaZCqvo0HzGP5nrAnko2sI5rVdWdit1bG1WyiykS4jiVu5StXqXycEKaZ8DA1xRd1X+pA1HUt0TU1L0DjvD8DqTTRw6G3FydG' +
                    'Sz0jTlrKkBtyBlVctJkym1Vg3nLFZSgFSHVPqWc6q62lP1G6mABgsgJYIBrqtQrafSORNLUAvZVUsypr8y3qFZvkt/8Alai3JuKqUiina132RaSXiZu6Xixze3gBbbRLbegbe4gM3ayehdeStsPDE1klpJ5KNFVq' +
                    '3gzC9XSzTN9Hh47ByVXJXHxISpWCaeoNKJRIGk0ANZwDUOCgOvitNVJyJHRxykZ+yxuBE9yk0zCh4z3Jc9y9UICVqPItGNuWANkruyxMBSmxkxkqMAJy9CFOhpDQuoDQaCGALQZFrqmvXsWniQJYSPUUNADkI7jQ' +
                    'PIEJtOHoU86BEqDOXV50KLcghymsCaaIATB6AmBKr1E1nUuURZdShusLDJrx2b1Eps46G9cDoCUCsk1kpCspTIJTTQVbmCOKHKeqLdXVytCjQUhOAwyBoBJwPoBlyJWfVx2Ih9FJV7X6JwZu1vE1BSXIug5t1RCd' +
                    '1kfzhg0V0tVHpK3Ihc1erKnjfhJA969Jjzcce8tGa7H095BbNHgTgchVbNCYjbK7w8ojQaY7JRKH8VfHfMMDJAM5NdrTTBWOdfcci1c+kr51baqGZ/NNaxmSnZLUz+FS36DN2l+BFdKtOgzGtoNU5QA0Z8loUdWa' +
                    'nLy2lsQLN/drotWDce7X1k1s42rqaVSqvEtDrRLL1KkmXqDZA2xSTMgtBgoizGrRhisuq0LA7uGi1aLLszK709BScwM4BzUh7lozE6viq0zntWHBfrUsSnA7LR9xFxNUUQEscAVDXJdaWZS5rdcmYEyDoX3Ma1KX' +
                    '3FOqaOUCfmLrqfJS2jKqzkNeGz3bejJfqa6BilBuMqGhoncLcBbExTZhkCG4ZonghptCq2nlFEc795IpWXFRKzlvMGfJabz2Mm23L1NScRNbv7m3RJIa+57qPQc4F/MTXbXlVtMjlM4lZ1co2XI9srVaozYrbHTU' +
                    'TUmK5U37yh9zaepMVKq05RSt0Y0ybJNgKyeqEngqdoQnoBmm5yPrAWlDrkClVJYGnkE4FEOSCkORA1gDPjqlds21MeN+8zYtGbTT9par4/wc/wBxMrsYy1oWfXU13qqQ2zh33/3P+RO1nq2x+TXVfkotX6jG3Kv6' +
                    'r+TIaL+YaHZvURTgkqUGlVWNWn4aCrSzzBpxPbba1r1JasTXltRw8m1b1vla9UYcySvghNpytRmw1aqtzTJvTay7OYv1epai6hjVc4yrV2uBOrLqJAAKhtQCq2p6DXiDc+jsRTlvHRDJGRVpmtbQYSUrEwbXtCla' +
                    'nK3LKveVBNVLLIiqqMlSSkOSKcibFIAMqrzBMMU5Au1SFjBrqjO2RBN9UVTLIs5gqjiS+I20ZF1OSm8STRymZVi1DDo/AtqZXbKJpG6Ho8G0JNg2a7EkzKBKCRAMqEAAAzXhq23bojJJtwtTspVVol/Jn7VYEhiT' +
                    '6DkwpDFORgCE0A5AEJoYnhNgc2He06ZIgb0fiXam2ixnVm0TWjfVFPicELXBrazrVdxdGLUAm05G7N6iKKaTUrD7GnE26x2Mq2jHXobcShN9yXoXuCUKJE12MqvbJEuj8Arey1C1k9QLcWWBVWDOt0maq1WBNkKt' +
                    'ujNHoZNOQNB2eMEvFQUNEGfHKtk3MbymoNKuS0K9FZR/DOa1LVeUdbQNShLiY4gN78aWUhbZSaUGv0YyNKpMTqhaDsVZLoZlpk9RCuhfBV1JpSFM5DjtNdobLtPc57GVY3tus2SNppwxG2VJ9OhVbQxcaTtkLKLE' +
                    '/itrJWRjLThlVtAre9lEipsuoAuzA0h8lHV+BJpy2ltAuJ2purr2JLxyIkZOU4eAkooJFIEUmaVhVMykxUORSABSLqhIacAWkTddTSuUJqVBkLjcqCbKGKuLF8q0ZfRlbUFioraidpUGkb1W/jjqZ0lWhipyOj8D' +
                    'T5nG86MzzyFZON3bUy0foN1zU0Jd6WcRr1LN+Bq3xpZ6rQxaru93QXKmtqeqQ1Wu2VqRShIlx0G2Fa2tp0KJSbcLVmq4LN5aNKcarl6l5WhL9vhMKnHSmmvcbvVGbdu5EvuRW65KPXDDfR4TOdpMUdmXB0pZGzKn' +
                    'J0f8mrIENCGQMjkcUbHJHO4p6SwYVWnZuDrbq1Bhx7dkPVuUaVXUtC+WpwLkpLSRPJe1bYeOw+O9rPP8jnsQ+G3QFSyeUbu0E2umpG0c98WZfFqo16mdnNmy+JPdPY1ek9bySNoDCmvEHWrDUIcEGVqdidj1RoxJ' +
                    'mtBW9q4toapJ5BJRLJi0y3FehA7KSae646FNrQmycSgHeIGmZzNSuOYA1BCbzAEDaOe9LKWng6EyL13VaWpYOdZWWUqyRtcxBVLOrhmqBqGQaXaZmIlVS0M6EzmSN66E+yqtRPoQuBdTRWCcx/gm0ZfL2N/4Ivqd' +
                    'NlK9BhyLqWXkSlgdXDyPjyh2qgFyU/sgCtujAc9DOZsdlISwcdV7x2UiB9kTfiV/B9zlvS1Hles7X4Ecr/6mJRySA1V2Ta6aok0hrUomowsAAAUykhDIKpK9Bo+5KWBrsZENe8mU81a7CfQi1viAzbliADoyAAAA' +
                    'AHAG1WuWu2y95dSPltZlQKtnVuMCdpcvUzikdPHFKx1epzpw0zqq1ZSkT7Cb8la+L7Gf/wDQ/wDajOys2205J0LJDXQvuV1rHoK38N9cM5QH5hrofHXWtpM2jNI1fG1XcmOvQk2joq/dRz1e7HU2UquhKqwkhXzD' +
                    'LMgMfuHojY5+aXdIs7RSrG3HTUdveUJx3NWk6wYq6ThrKCpiHCafpHSzo4awy9/HbVE2cYTwUF+xLnaG4m9pwhIDalXc/wCDTi+CWZUW6yTZ0NRhaCpDJKjBnaZIq0UjOrkpOAHBFsKUs9y3bGP8kNtz70LuIJ3r' +
                    'u2LdZ5WYInOB7sdn3NYNFa0JuBW5G8dtDNtsUjE1r0L4pOeWjWnLDU6EsV0MWolZPQaZkJDgGuoAY8yaaa6mTbNuZ5nwOc39UpyAgNJqkaVtgyRrXv0XUzWjdtvpL4k3qo9PUK1WLtZ6Gu4yGkTaitqUmAHM6W43' +
                    'Ote4TJ0mduJa1/gDF8fVAaLQBow47RbJ0pPVM5+RbeVrxNaWzHfKLflGq7GfNPy3/ktXnplahyNfLt6CRWH2/wATfSCubjrDssMjhfvR4F81vdSLe08YIoQ0aUAAEFIqEyAVoZBslgTlMm3I0kJcs6kyir6owsza' +
                    '7msmDNfVKAAtV3LHxFRAABQyqoktYhEqpuosJF8iwiBOgPU34bNKDnNaY1JeiN3EyzPl43f3q+spawL5yq4smjM3xWNaNuCnxeJqrK6aq/e6Cqrud3Qu0HHWi1HdqHBL1ItfEE7DooUtYfY2rhQZ8V1EasqVV5y+' +
                    'y1FFRIRJM8j0rHpBb65s012AtVhNnMq8lrNLLXUvk5nLVfWyuK6ahesvMRTmlYs5bMLKXJpe0szbEVmOQYGkNJtg170IawG7w16gbcVIrnUuGZ03JeBc2MVRAmsid2ugvmvsA9o0ifmPsHzY1QGd7Pc12IlvAWc2' +
                    'YjciWmAJSIIYCAoAAANVuqk+5rVySrLYvAzXJDMdtOnDQlMwTW6saR1MjLnrNZ7HOl4nVZOydTlahw9Tf1SiPEAGsKSgquvQq1piqFa2MaDXuqerINdzfqwJJzl6dCE4fqkqrxL6mVWl2bRab65IWhQFpyOTGX0x' +
                    'ZaruVW6cPuAuSuNy9YGng9GAHJyPdyNruNOI8GKtlXIWsrLSOxoaXbTV69dRuzvRzgwTtVYeAl9RiL4GvmQ+ug+f44Mq2dbJroaWbs9zF70iBiGgogqAGskDVVBNtq9IXv0RnDYkGlbVsttvUyLVdX/9GuOzL2pV' +
                    'izku4jNuUSPQMFCGnDkQFRd2re8sPqQiqKXHcLVdXD/kn8UkpskW/iIq4cjnMika2rKRFq7amic1M+R9DMVCHuaUf5FEFqsto1UaVe5IjlThT/JpxV6dSuWs8b8DPquamLJmvIrT8RmvgZatu489C1Euz6irV2fh' +
                    '1ZLcm/Hb3Eur0F4gqqVVDwu3tHuSxVQjK1m3P8jd4UIziq3NJtkPnlaZJtaUQakQPLkE2nKACoqRSJAwoBAAD1Hqo7EyxDDXRx2xHUvczmVn3LpyOri2hmw1rZ4CtdyKaTUrRiq9uCKm1WnnQHVMu7TQtEBhekPw' +
                    'IUM6LJWwZ0pN46I1LwiG40BbXq8l8nG5bWglR20ULuNgm1WvEk6K8e1ZMbpKzgspYkAGssqNq1UQS+PJbaUMqUznrTF1dXg14+ScMMGd7x8P8l7HSo1Obmqt7aJW++JbXUdoWEJMqM0m3CHZQ47F8Km89Flk3atZ' +
                    'taGvU8FVL8B2cspLZXxeSOkkU5nHcuf8Ga1H1FVtOEUmR2KRkO9JytTJaNdVmDdMm9JytV/kA477q+KAx4nHJHRgXORDzPgUlgUZsil0LQow0T0NO5n3EE9TRvBmX/VFqQhokEwLGsuCZDdGhMVouNLUTvSuikyd' +
                    'rPVhAz5TVvls9CXuT94qqU5C9cbk5Q4ClP4hWpD1wxJl1fRl6DtxJ13cctLUyOpVtRY0Zleiadq6rVElLGRrR71tfqZkCZbEhtQ2gqm3Bq+LdVXr60FabcyTVw62q1Cw10IWbNvRGllx2UaW6Mzo2/d6oinyfEiq' +
                    '/H6UTy6odHmcjwaNuvvLp/oXi1G1o0RIceHanTVEHP8A1Kp8FiXjBVcUfiaqIVZtBryPKS6EVw59BV/ikXshNyk+vUTBokKJAAKgAAAOpquOcmR0aKWSkZ2qkZFXtufgIsACQDQMCWClWSeiKnoRWnHbYnV6dCre' +
                    'GTJPPga6ozRLnUtKUQ9Cq2aQA00FNurw2OZMLLLT16CDazVWmnhimtcoilaxnUhvoXBo+STF6lLULZWCzgTCiSqUbyQbccx4FvSRTrOAVUuo/RqRZJJ2blowqLXbwtCUtzgCqfEjfUR0WarxxXBzPKOnkVEl4it8' +
                    'ulYiZMyq5622v04Y6V3WzossGklJdFtrL65fo6F1E8lpZL0Qm5z3BlDQ65sJaFU7kqrbKroQy6GRSwWskIaxkg57rby/5Av7hZq+4G/NREpXclNOJWUTZe8yU7VeAq5rt1ckWUMLOUlED+KmdahEFT7qQkpkRUMB' +
                    'AUMaUkjTjQgbo0EmtLq3u2B8OZTwTflWdcs0VUugbVXVlVtV6EtVnbheWv4M5OtHO6q12tCy/KYFy2jbZzU0d6196uZM4jDyhxKhC4qnx1vTdTVamMYNON2o46FcnHHvrR6jfELi5dmHoK81vK+F5RkzWrV67G8/' +
                    '1Ys9EPDCnxSafItGWl2IqobVsdBswFm2VV6f6kW1CtnVjOBq2xWs1nwgfuWytewo6f4IrIr+grpKzSG/gNfCK/pV9wv1E/gr6R2yRUPuLGg46EsqAYhgAAAAVa7skiQAEpeBtMKYsmbWtWYmSWkYiNnVPoZ2rt6i' +
                    'USC1GmnrgEUUtTSj6GSfvF0eTNVb1BYYPuZuzkg3TRjyr3p7hu7lNysDoZROiCGh7rV6EOzbya5RUlcalmZtxi9Ki3E1bwehdVtTnoVd7reCBrcvUTRlvw46ibbrCJ6mlbqq8S4jMdQmZBFFN4G7Esc4RFCTvZV6' +
                    'dTS9VZRVqEOFWsLDfxMytdvCwuxOxLiYXQQgNMn0NFhQQlLSLJVBXG8wIScWIrV4ZSyTfo+4UeGQTzfDX0gPlyo9YF8Ete8yIybqs2a0B8a6OWTRzWQu6NtuLSjF6mpUrTjrNW/UZpe9BVLuuOgm4tI+Q7ceJX8E' +
                    'Gruuhm3JZpSAAKgK327kjTggpJ210NFVLQy3sN0ksqtXdIVmrJtKF3I2xlmlXWyhY8CKjVY1Q0KIt2Ne3+RRNXBTpuUT6BOsegqloZBk+Pp1MtGdPK3G5eswu1bPU1KlOeq0BPDJq4c6ltRlfDYCHqAAUClOTbjs' +
                    'm5b9XYnjrV4Za40r4wS0Y2+O3pCfdgT1YdCjRr/qr4MXQtKeODPJlSjIWHIQ7YWpUQMv5NyGmnDUMuoQwABAMRQ0ABgimrPuDffIQIBDEOAhoquokh0JWmqyiEslUYOZwZCaJ0WehrsbMuX3fdLBm225YCKg0ySN' +
                    'E2kRKXiG+wVaG7urU6E1snrhieWZxV5vZufUN/btqU49JNLaJ69zV2eg5gxVEnG5EpQ4Z0zVdIMr3pZ417iUSyq7ae9bVf1Eo17ZJot1m36WVCtZ2csUg9QKEMQyoqq6+osWiSBGK0aJsWhWWBBae7j9AuN+9Hcn' +
                    'htna+oW92wD5NUvAAvm0gPA23MPPYqqs86ET2DffREG16NrGpxtOXJ0L5jesDfHq08vUsuI5QNbYcNZ/1IeTWmJAuqq9Rt06IaYzAbEVAAAAAAAaZsFcWM5YSTF1rat7MnNLe90Bcl4iRN98snI6JVqrsybLayeH' +
                    'Ro0lPD0M9KKucfyJ8VPUS06vwKmV4MDHkqqvDlD47f1ejHenubzPKya7iL5OO1fR0JRvW1eSm1vJgIBOHg3paZnoYFVtCYsVNlDYh/FK69BFRtR4RDvJVehm6WlwZim2KrUy/wDAvSVStm5RpG3G6txkOdTWVqh7' +
                    'oURlDw14MwrkAdqtNoR0ZAxAAwEBAwFI3kKEOJEXxpWcNwKQvAvjWS7cVUm10JqmmpWOhnVOy7Bx2VrQuhVmozgz4dWyeC+OVe0/1MbXe5zlToze7dW2v7HM5NRKqqTt4GjokmzKuGbO2i7irGAjohPWqkWyj6fw' +
                    'P0mMCka/Lr0kXy+zGmJT94Lzge3bZByLA9VMtrOiKlxhJEVHogKs/c7u3+iHx4o33/8AgqvdVrqirY93soJ/BkxABpCGlkRdEnMhDSkcDnsIy0qo2pQqjbIMs1Zs1vruWvUzspyPis1K/goHogC9t0PQAJmQldyJ' +
                    'Hu8C4mqSTfxQaVb7z4mO5dg3sYavlsmlGq6mYNyC0LmQHUAYAAhiKgAYgAAGmuoCCB4AAAFWQ0IrXjhLXJUpMwljhsliuiU1D0Jh1zrUmq26nRSIMiE6Xrt6HNaro3V+o7XRarDM70laZRZcRy1cNM6LcdeSu/j1' +
                    '6o57JzpBfFyPjt4PVGr8wRpqEm3Lt5PfpqtTATkNymVErd1WqJbkdHDzo8MCqlq0MlJqV1QrJ6mVaW2X1HWtEYSwllwdO1TMhEaMwVy1dMzg1Vaw51ephbhc40Nd6B3Qlox+Tbuivkd7Fb6hvqXamBfb16thb7Zf' +
                    '1f8AJasnoG5rqTauOe3FevSfQSdbtg5r/E4NS6mJEMcrsUVTkhWTzKNE5VfQZKC6tJeCyZqly9F0Di1ZNnIceLIvieum6mqa1RztOVJ0r4TLlw8aszFZNBVvcNJvJWj2/wAs0GmUSikZAADa0XhIEWxZC5NB8jWO' +
                    '6IvoWeCUAkNamka8agjktNmaLCMbuXPV6mZ2tIBAbZBdE2nBBtRRxz3JelhbegaFYXiS4MqaeQtKEWotUDNWB4coVk0yZLg1tm0rRgKmVHVAT+DIAGbZIBxkTUOAAuiTwyCpVdNerJSHdRpoQX71qt9EQhFMSGIq' +
                    'GxDABAAAA0IAKhizoCbQ9SKSLV2kTGRxGpKHuxLL4+SMMxbkBhrsVy5TOStmh/NZnFPnq1nozA6qclbLbbqRycELdTK7GpfKlZ0ttY7U96V8LMyt2Ei4BbVb3pa8Doo+FLCycoTAs0dPI6ynXXqZuYlmlvf41br1' +
                    'BJNbX1MKxwJj5KOj8OjINxNMJEANVLFIgkGmEiAqae5jmz8RDTa0Iq9vJGhDrddGWuRj+YTn4GUPsKGa7yG5LKYkqcCEEMa1kFEOdegpCuujnHcz5Untb9ZXHovQHMvcfg5MTtWDtOFoFXDkkcxobxFqybhGqUat' +
                    'I525CWtGTDXR/aB933ObdbWQ320kn5NVbRvoS3gTbDoawA0IYGyeG+xk1jxQ+OXaOnVFYe/06egz0rIQ2BpkjVKyqspIhZaNLVjXL7kqwbk0IBEUOYFWzqyqyS0Ua4sjK1GvQKXGGXTknFv5GWImjiwGr466yBNn' +
                    'asIHtDcuwbma5ThSUZJdW8jq29SnKUkVkNVb8Aa6oaq8YKjd1S49v+Tng3tasQzAn1KBD0EaQDAe1xPQgkBw3oPZfsBIF/Kv2GuDkfQbDGYF24r1yyAKXJZCtZ2csGoEOAAAFFJitqAWRF8I24uRpw9DE24tqeRe' +
                    'iI5GnZ7dCDXm49r3LRmQnSABgyjSnJtptamepVbR4mSgp2jQzYrW3LVUaiW+hzDbkRZMSgAAoAAAAAAAAAAYCGQAIaSZWENXEwarglTuU9hUtWubKZLXy25rZ18CW1WNuO9NVjuSdLd1p7yIfy74+Gw1D4YdfQXf' +
                    '4XOO5FE6Zs4Um6tV6ZRm9q4XE4A7LcXHbpD8DN/b/wC1/wAmtiOeANXw8naTN1stU0XRIwAIQxAUPQQABrx4q3o+5qqVdfdMVDpGgldr4TGKNjWoNBvfUTtJeQ6/EsSW7X6pQLjjNmp7E2bs86dh6p72KRegHIDq' +
                    '8jesEx1Kt37gTEElSSVK0pL1eACu11huGBPRmVBJda2emhaQJFpOM4QotVqVPoKw8vTsZqnCjsiL3lwtAvafQSquJ6CT2hDhJFVja+5Fn0RQmIANMgurxHQgaJVjXisq2h6M2+ZU5GxySwdL5qrQh876GAD8mrd7' +
                    'WJmBCLhpsUDBBBEAO2GyQAqfdgkAApMkCjpq1dbbGF6OloZVLQzW9VyV/wD0tDHVVzoHqC1B5ZoARDNK1JuobGmICBgEIBjx2BiQG0gWChAOWxqEQSBUiAQDEUEl0U5fwolR1NLuKJLqS/Cpd36uwpXoEKRhqlZr' +
                    'Rj37mt2SAGJra062foRpW0pYOdNavLGr2WjwZxp0SNW8TmfJbuJ3t3H5qa69wbkzk327grsfk10unHbVZM7cH+1kLkaLXKOYrN8V10JOj5qM77Xlall+UxnAQGg9UUNJNR17k6SXXxH8q2vcmjIILdY1ZLa6F0xp' +
                    'RpUafcW1f7hS42oUPqQD8AhsG40FPUoti1r6ASkKuHkipEyraiKlIAAqApWjAnqIg0XJZeInZ2ckFTCwMXTC1sR0JkBhpzCJGxBKAACgAAAAAEAwARAAAFDAYQRRdy5RI2lCEIlAABQAAANGnHdpmRVXklixry0/' +
                    'uvWZYnGhvS2IZjyU2W8HoSfAtP3TO+ppVwjO2onZSAQGkA5EADEMQAMQAMGIAGIB5AF4hb/Quiqs29SFyNWconq+IAAKgAAACqp2wskjTa0cAFk04eogcvUAAAAAkYgAY5FIEUMKptwtRG9XspjV9RaJtW1Ky8z0' +
                    'M3ZvVlTa7glqGIUhpCL41N0mEDdlhk+Js+Jy30J2WfpJsVmA7JLHXqCRQ6i6gAUWeSQArIUdQBAAMBiABjotzgv5anuS1WQGlqYlGY3UAABQAAAAAAAAAAwBM0SUEtVniNAKiXgIGmAaEhkVLUCjsVdaMgsSiAge' +
                    'QCEAxFFbcLOXoToVXLVWFlD10IqqWg2aV6wzmynnBrx3glnoFK916oytqdVkrKVqc11kSlSAAaQAAAAAAAAAAAAwAAAim0IrpBAhQBVa77QFqurhjUSA3HQIKEAAAAAAAIAAcCAYCgBgQwVW6yRrfMVRnW21yG5k' +
                    'vaxTaqorr1ZmAFiUFUcWkkCinyXs9QljrRusi2k4UgCWAD6CYSIFAABUAAADAAIq+PEs06SR/Seo93umarXjyjPkrVvGpNeRrA0pmzHQyaEVGr7EmmaAACgAAAAAAApWehIAabqpCdpwtCBkxdUholFIlU2pUdSI' +
                    'NEjOyhtCACBDKhCKgQDTiyfYL2VrSlElVvWqa2y31YnV1Sb1YCsnhslOBttvJSSbAK8lqtPoVypYutGD45U9ULjtHuW0ZP7BEiyXejq4/gkoQDAqEAxAMQwAQxAAwACKBDECt/tolvqaXtTd7yxVf5OXK0HuefEl' +
                    'nJA9Z0noIGwKAAAIBDAAAAAAAAAQDCkxpSLqWsCkV8rGGZHRRpmN/jZJSpQRmAWpdFN14ZKjSydUkmsambbepdtz1iqfTqRbGFqSNEoDDHXKh4D3UESxAM0hAMGAgAAGAARWzrPGvSPYlUcxxSTV78GFZrU0u4qT' +
                    'eu1kWbZrsCfuskaTBqCoQABUAAAAAAAAAAASAAOSlZdyICCYu1tVruLkqpTXUzhg1Zakzns04CGKR+socMThBAALqa8jUKehmlNkPkeiJ7BK1LrG4XGpF/YDpSMOSsOUafMqlD1Is6uviSKafzK7f7LQyaYJurlG' +
                    'l1urvXrL0jMAAqEAxFAADAQwAAAAIoEMaAkY2oYgAAAIAAAAAABDACgFIxAAxF7U1h57EEFL3lHUTmc4YgNKe6RZy5HVtv0hteR6pIqtnSY1ZK6jrV2skKB2s3IpLtXONA2SNhiVnVg1A9j1E23qAgAYCAoTAkAA' +
                    'qGAARW7j5WSK2ScpFWf/AFJeJlJmRV35FbCRHWBLUfU1iL0wJw6+gTcAskVADYjTIAAAYgAAAAAAAAGAARVJlWzX0GZpXKjuSqzgYohwPJUAhiAqtknoTZzaQKpWXI/odG16CarORttKF06ibs9SBMAAoCuO+150' +
                    'eohMC+Sm1ytHoQaUsrLZb1MzsnVw9RPgIAAqAAABgIZAAAgGOYEhsKTcgAAAhgEACGUAgAAAYAAAIgaH4oQ12CrUXxbXozNppw9SpjQpPcve/knQy0K3NhakKU5RJe0NYZ0cairt30Oeld1ku5021x0J9liGpzog' +
                    'qwctgtDKqtGxwc5pdtVjuZSa+qUwDI0igQNyPb2YnVoCQGAQAAIK0taapPoZDbEJCqQNZCqyaWajxJRm0OYrAmD0CkxDYjTNNCAAGAgAAAAAAGAAAEU0VUlF1WYJVQ9WGUO6iwioAiQDQAjMGnwLxFRZb7Cs5cdi' +
                    'KQgEUORSABAACCHoaP8A7KyvirqZFUs6uRRIGnJVfHX4WZiUAABQDENAAhiAEUyRkUAIZUAABFIYhlQAAEUAABCAAKAYgArVzIyBpEU2mSdCrWyT/ki/G0p7ElLEUttbfgV8zBCAthFb2VWxmOrhkwPkc2INuTjx' +
                    'vWUZFnRSGABDTZUyQUhVgaAYEVAANFQgRSWBMGKqupLclLFWKqW7OhAlkLYNntSkws5YnJSAANIBiGAhgIAAYAIYAQAxDgKaKmGSU11Io5dU/Agu/wANWQJ0ATGIqNKWSq+5EiWoxgBAAAAAACGIqAAGBfHb+tvh' +
                    'ZN67XH8CNF/2V2v4loZ65VkAAaQDQgAAAAGDBAyKQABUMBBIAMQwAAEQMQAUAAAAADARSENakVdHttHQ1taFlSjmlyab711yiWDN4YSDctvuBQAOoMA3W27ZwIAAAGAAhoUFJEqmASgIMxoRSRqoNxW16wSkkauy' +
                    'SJVZORMtXzlCtl4AnMElxjJBYlABAyoQACAYABFA0+jAUAPaOBK0D1yiBQASxFFKBqSRqzIq7Zp6DI11q14GQiU0LqNCWpQANiAAAAAAEEAABQwACKBy05QekIj0AO8WW5a9SCqva/DqO9Iys1eg/ggAAqAAGASI' +
                    'AIAc4gEpHGJCpAAKgAAAAAAAAGAhgAAAAQA0hDWoUOsFWfuIaJs3HgQQMQzSAbJK6EWEADQAA8IUgMNxMgMDkBADQaJRVsgqfdaJVFWpyVbajIEMTWqiNCWyq3SWgNqZIpQtssz1NLy0klgiI1LEIAAoQDAqEMAI' +
                    'AckgDTDQACnKeotBDTAJGkmCgbkC6syKWon1JFIEAFQMBgAgAAAQwCEAAUMYgIpikJB9wEa8dv6vR6EQmiR2NL8cZXrRmdPH79fFGV6LVetEl8piBDEaQAAdQNKxCQWWBJNZBtmfWkiGI0yAAAAAAAAAAYCGQIBi' +
                    'KGNakjRFaPuTZtr0A5DJFQMQGmTGtGIERQAAAgGIqAACAAAACinEZADLScdAAChopR01ACUNfMIc9QAQIQAVAIAKhiAAAAAAGAAAABFA8gAD6oT1YAAgAAB6gAAAAAAAAEXXZ8u0/EZgAnoAACgGgAB118CXqAEV' +
                    'pw7t6j1l80Tj1gBL2MRABpDCuoAQaZJeoASNIAANMgAAAAAAAAAAYAACAAAYABbkT0ADLSAADTIGgAgAAAoAAAQABUMAAiv/2Q==' +
                    '" />';

var hitlistTabImage =     '<img src="' +
                    'data:image/jpeg;base64,' +
                    '/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAGQAA/+4ADkFkb2JlAGTAAAAAAf/bAIQAEQ0NDQ4NEg4OEhoRDxEaHxcSEhcfIhcXFxcXIiMbHh0dHhsjIykqLSopIzY2Ozs2NkFBQUFBQUFBQUFB' +
                    'QUFBQQESEREUFhQYFRUYFxMXExcdFxkZFx0sHR0gHR0sOCgjIyMjKDgyNS0tLTUyPT04OD09QUFBQUFBQUFBQUFBQUFB/8AAEQgB9AJYAwEiAAIRAQMRAf/EAH0AAQEBAQEBAQAAAAAAAAAAAAABAgMEBQYBAQEB' +
                    'AQAAAAAAAAAAAAAAAAABAgMQAQEAAgAEBAUDBAAGAwAAAAABEQIhMRIDQVFhBNKTVAUVcYEikTJCE6GxIzMUNPBSghEBAQEAAwEBAQEBAAAAAAAAAAERITFBEgJRYYH/2gAMAwEAAhEDEQA/APyH5j7t9d7n53c+' +
                    'I/Mfdvrvc/O7nxPEA9v5j7t9d7n53c+I/Mfdvr/c/O7nxPEA9v5j7t9d7n53c+I/MfdvrvcfO7nxPEA9v5f7t9f7n53c+I/Mfdvrvc/O7nxPEA9v5j7t9d7n53c+I/Mfdvr/AHPzu58TxAPb+Y+7fXe5+d3PiPzH' +
                    '3b673Pzu58TxAPb+Y+7fX+5+d3PiPzH3b673Pzu58TxAPb+Y+7fXe5+d3PiPzH3b673Pzu58TxAPb+Y+7fXe5+d3PiPzH3b673Pzu58TxAPb+Y+7fXe5+d3PiPzH3b673Pzu58TxAPb+Y+7fXe5+d3PiPzH3b673' +
                    'Pzu58TxAPbPu/wB2+u9z87ufEv5f7t9d7j53c+J45FwivZ+X+7fXe4+dv8R+X+7fXe4+dv8AE8mEwD2fl/u313uPnb/Efl/u313uPnb/ABPHgwD2fl/u313uPnb/ABH5f7t9d7j52/xPHgwD1/l/u313uPndz4k/' +
                    'MfdvrvcfO7nxPLhLAez8v92+u9x87ufEn5f7t9d7j53c+J5Eqj2fmPu313ufndz4j8x92+u9z87ufE8QI9v5j7t9f7n53c+I/Mfdvrvc/O7nxPEA9v5j7t9d7n53c+I/Mfdvrvc/O7nxPEA9v5j7t9d7j53c+I/M' +
                    'fdvrvc/O7nxPEA9v5f7t9d7n53c+I/L/AHb673Hzu58TxAPb+X+7fX+5+d3PiPy/3b673Pzu58TxAPb+X+7fXe4+d3PiPy/3b673Pzu58TxAPb+Y+7fXe5+d3PiPzH3b673Pzu58TxAPb+X+7fXe5+d3PiPzH3b6' +
                    '73Pzu58TxAPb+Y+7fXe4+d3PiPzH3b6/3Pzu58TxAPb+Y+7fXe5+d3PiPzH3b673Pzu58TxAPb+Y+7fXe5+d3PiPzH3b673Pzu58TxAPb+Y+7fXe5+d3PiPzH3b673Pzu58TxAPb+Y+7fXe5+d3PiPzH3b673Pzu' +
                    '58TxAPb+Y+7fXe5+d3PiPzH3b673Pzu58TxAPb+Y+7fXe5+d3PiPzH3b673Pzu58TxAPb+X+7fXe5+d3PiPzH3b6/wBz87ufE8aA9v5j7t9d7n53c+I/Mfdvrvc/O7nxPGgPb+Y+7fXe5+d3PiPy/wB2+u9z87uf' +
                    'E8QD2/l/u313ufndz4l/L/dvrvcfO7nxPEuKivZ+X+7fXe4+dv8AEPJ0gMgAAAAAAAAAAAgKogNTW0GVxW+mGE1cYxTpreA0xjpMYbYvGg3hrDnrtjnyddbreVSiYMN4MAxgw3gwaMYMN4TCaMYSt2M1Rio1WVSg' +
                    'AAAIphcAgAIqKoimDAIpgQAAAUEMAAAoIoCCgICghhQAIVAF8CAmBaBiCniKuFwksbnFAwNYoDiGBQIqAAYADCzAIigIKgAAhrM2R2w5a3FleiRP01GMGHTBhnVc8J0uuDBo8+98P6sPRv2+qevg5bdvfWZs4NSs' +
                    '2MCjSNTfacq3O9P8p/RyExXom+l8f6tYeVZbOVwmGvThMOM7u858Wv8AdPGf0TKrVZsXr1rN218zkZrLVsZaiUBQRfAX9AQXKcRQWICC4MCCLgxPEMQWRQxlVXBq4zhcFheaGJhbjwUDE/ZGj0niGJIdLXLhTIYz' +
                    'IYOPkv8AK+AM44I1i8jpuFTGRcAYFFDEFqouMiimJgkXBEMbkjerOvJ0mGVWQWWeYI8oo0qHIXgCUOS4BPEAQRTCiIqCAKBI6abXXh4MatyJWo7zFnBcOGts4x113niwrWDDUxeQIzgw1gwDlt2tNvDF8457e32/' +
                    'xsr04Rdpjx3XbXnMMvext2+3tz1xfOcF+kx4x6Nvbz/Hb9q53s9yeGf04rsTHMWyzmigAAAA0jRViYTDWFwmrjMi4XC4NMZwYq8jIMqs/QwDNRrETgIa5yLLQU/ZSevJZ6oIXFxPFcGuc5BMJhrFzbU8qCYXl4l5' +
                    'iiyZXpiTY6k5CXj6FtLy9UtoKzbxOKWSeqjXBk/ZeM8ATzMrzLPUEtOKzJcZoILn0QRbySTIQG5q666a+TGkdtMcWbWmpr+g1OQiPCIsmWxFamphNGBqxFEpkqAvEMoIAKAAjWcN3zc2s5jNaaiW/wAseBCzjkVm' +
                    'b7a3Mrtr7ictp+7hZlFyVHum0s4GXim11uZcOmvf2nOZZv5pr1I5693Tbxx+reWVUTIAmQoGc8+P6ud00v8Aj/RtAc72tPVP9WvnXRF2mRz/ANcTodEXaYzNYuFATBhQEwoAcGM8Wrf3TBBPPBaepIqJPFnFbvCM' +
                    '5qwpxjWKniueIEXj5mfGReKKnjxtMepsAmGuNjOVyBiTmf8AypbKs4gTlhrwZ4zwLagvgW8mc1LVwW8kzDn4luqoZLVnT5VP2AzDK8JyOIJJat5nGccnNBOPkmKtwcFE4k/U9CA66fu762Y/Xm4a121rFVvpmPEM' +
                    'iDwt6ObUvm6VI3bDqjP8f3WbRMUvHw5pi+a26+ZNtZ6g50auLcorOIKYUQXCAECAtWckWIrUTa+DU5MeNRWaA0yAoIs2215UQHWd/bxmW53tb6POJ8w2vV1S8rky8qzbacqz8rr0o4/7Np6r/t84fNXXQYnc9F64' +
                    'mUUTqh1RQEu2Em+TKNDPWl22MG2btGc59TmuIuSVJ/VeAHM/Y4eJwBONTCsqVrh48zikXILKc2VBcFz4mTKKqZvEyk8RFXkyuQVMGb5GRU8V/wCBjNymKI1jgzhc+pxvHPACFQ4XkC3lEi3HKM/so0mZCYt5IBbE' +
                    'U5CHqSgK3rePJ21u08HHW4dddvFmq3/1PKQTORkeTg3rJWW9MulSHRDojXExfNnVToh06ryJg0Y2kl4Jwa2xllqIiyCwEwy1ayRKECKNAeKK0l4XKiKxZxRu4sywsZo1OTMb8CkZoApguqx04XilpjjijrdbySa1' +
                    'dMYkyjt+0ZsmM4TTHNqJh27cnjFtI524ZzXbudvO2ZieibaTXTF5psHPKQFFtKVACAC+J+yKBmhKgLImDNPADC4SKCYa8M3imTPCgYJzxgysBIv7pwP0/qgtnHjTBeZxwKWXETDWLJOPEzt6CJrzSzDWs45tM49Q' +
                    'ZwuP4/uudvSLf7ZM8gZx6kxLlceqTHmBxyY4cizxynDztA8TlwOEKofqhwMwCWLmeSc+GF5A1rxz4Na3HDZzlb6vBKrU2nmJ1YEwc2tObDWvNqo3ckTmMqtwCeAM782WtmWohFygAioqUJzCA0uZMCVlVqTYq9rt' +
                    '/wCzbp5L4LrM639WK63+PDxjnbKkEnNprXWZl9GLzNEBFFy6a7OSylhHomKuI5a10lYsVLGNnS4cd7xWA3pzc466RaOsY70/g6Tk59/adOPNmdjzoDoypxBAwY9RRUwYPFfEDFMLUoICCLMLwZa4CkVPQmQMLnET' +
                    'iccAZq+CcTHADK5QxQXOUyuKmPVA8DK2cEx6qLlMmPUx6gZ4hj1MeoNeDDfDzZ4JAxUXKcFDJ+vBbE4AS8ShkQi5RMg1kZBV8F15oTmDpDhlMjKqZiHgCbc2WtmWogGeBkBFRUoQIDaWnguJP1ZVZpwztwvhGZtd' +
                    'NsxdtmFhXXfadyZ5beLlyM4W3JIjeu3Bm1kMXVQVUCFIg1G5WI1KlaXbbEcc+LvjMc7oRKzNnbt2Oc7drevbsmclwmu9sky8m+122y1vv/jP3cz8z0oA0gqAKgAoioAACAouTKKgvA4IuRQP2OOAXimQBUyuUA8M' +
                    'ovDGDHqAcMJj1W/qCHDJ+6zGeYJ4rThnmfuBktTE8wDNRTAi1CoK1c4TimVEOOEX90AAUUnNAHQDLLR48BMqDOyLsixDJkBBFRQABYtpInBFQXEMeSogYoAAAQAWkSkBszhJWuFZU6mucjGNctTSeFsLiuuMa8De' +
                    '9OmfHwTSWTHVlz7t6ricozOxyFwdLbOIL0liiC9NXpqaYyq9FJraarKr0VOmiAWWElBF1406aSXPDmDV0vOMtZ3nNcbbeCKzEXpsTgoueAgC5IhKCiZgCnBDIBeZwLzEMooAiyGL5AimKnFRcmUEFEFAAAAAAFxc' +
                    '4JPBbOKcc8EVZauWeIYa3zOLOt4+befRFY2ZdbjDHBZUrI1w81xDTGGprbx8F016tsf1ddpJwnCRLSRwvBddc8VsWXhicgSpwLWVhauUyCpq9VM5QQXHknJZW7rmepquYuOOKdNVMQi4qA1gkvgmVl48UVemt6Te' +
                    'eC62OmcT0ZtVz33us9a5TPku23Vbf6LLML1ETy4Gf1XJdryFTMS3ks2snCNZz4CM9R1xrMTWTiKl2lJZj1a6Z5HRqcDOZhMrtrMcDpgiW8GurP7HQzYcDWZccVmMueI10zzMGt7/ABNbJxjPR6r0epwrecsbazw5' +
                    'pZeeSa7WZyf9GbMI6XS+NZulXUwmuZlJcLLZ44AThfRLMc2+iw6bYaYwLjHCpj1VAMZXAIADp2uddeDj27ZnEy11W+DFnLUavknTwS7cPFnr9TKN9K4mGOv1S7+BlF0xxW9LEuF6vVcRcanTGc+q59Tka6C6ejMr' +
                    'UtOVZ21kgu94B4jHA/c4HDKgi3hwRUXXm3m2cmJza4xKsau3BnMJbnit2mEVOGSyY4LnWkktk9RHaazSST9bUa2uZGfBlXPdi3Eb2vByty1EoA0yAAuEF4UVI3KzgmYiul1m09W+zjb+O3905My5hxz1ThYz/ivT' +
                    'O1r5L/p7fjDtdyb658ZzjoiOG3t+1ON4Sc3l7kmu9mvGeFe3uzPb2/R4bGoGbEu1vOiKLJODWJi1J1eC/wAsegE04E142eRnaHVc5wnIdPqt1uOadXLgvWchOrHNMbS8+ZrtJML1TMoGNueTO15NdWuObOl8EUt2' +
                    '5WYWXbx1NuOMNmjHVxzipbLzljWv920Xb+2g526+C9UWThKztyVFm2rXVr5p4JtjhPNFXayzhU12kmKm3Tyj0e307d1zZLsviOU21XhXo29v2trnGP0ce92ddNerW49ENc7rKzdbPVqYv+WGc+d5KLpt4LbPPPmx' +
                    'mZT1MNWzj6JenExzOfiY8VDh4JhcLiiM1S60xQdO1yrW/LLHb2xng1tvLMYwze2mp/aziU65JjnPNmbwyjfTPGJtJJy5s3aXxam2vmcidOZyZ6Z5N9U80lzefA5GJJbVmkNed9W8LajPRq1O3OSzDpJlnarl/qg6' +
                    '2BtHkIDoyooiovVQwC9WPAynghg1mN9uTrl8Jxcno7On/T22vO8kovgl/tNLnW+cZ2ZVy2vgyu3NHSM0AEAAAAb4bThzT9Wc4a6pef8AVGtWcHScXHk1rti8UsG9d729uqcuVj2yzaSzlXi/5Vvs9z/Xt0bf23lU' +
                    'HX3G3T2768Hilen3dv8AH/6vKs6Rb5o1OTKjetkmFlmObAYuukwOYmGt68lwxLfBeq8smDXTEkmb5M23OfFZbOPmDc01rN018zrvkdXocql1xM5Wa7c5Uu0sw1Npg5ROnbmY3sw3LPCmb5pquf8ALWeherHGcGt/' +
                    'BqxdGOrbya7fbvdubwkNuD0dnXp0nqmo83d0mlwxNrOVw337ndyanRW5d9uVpevlcunt5zr0YnkzblHLte3mOrf+htt7eWzGXXbO2vTLhwvtvU3+jlvdM/wZd/8Ax8eLN7Oy7DHHC5bvb2jPTYumIZARbeJnH7og' +
                    'renG4drOLz65l4O07W+1zlmkLOHFz1mbcu99vvjhtn9XHF02/lMEVrpnkztrjlOC9U8y7TFxTkTXWbfovRM+Sa3Gq9a8jO2uF6eGZbk3uY1r/bDxEmtz/c6dFkz1VJeLW1nSzqsybWZluBrT+3iA8oDoy0AigZMg' +
                    'tYb8GSFXTW7bTXze3GOHhI4e2l6rtjhjGfV32vFn9EcO3z2jPduG9OF3rz77dVySclQMLwjaIAABAAwALMIA1jyP1SY/dUVqXw/ou06tfVMVrPBlU13zpe1t/wDmudmLirtc31N71fyaZTXmu0xWWtuMyenjKosU' +
                    'AKgCCi5EyqCocAUVAFMoAuVlt8WVl4g3ZZZm8Hr/AMeHk46dq77TbbhrHpYHzt83a1l7tu52c42wk07G/LDWjPYmNcuqzSSYnI6ayICIoIZAZsjWUoMXTWs3tRtTRxvaZvbsd2d7iLLRwz0tf7tpyc7zG8Z11nuN' +
                    '54ul317mrzLrbEs/iyt66y5lavajOl45b5xLqsXt3zZ6bnHi6Z8Gb/fFlqM9NWTfwbpk1cZl3i3qvGxvWtypv+Dl1Wch1uBNHkAdGWhFRQRQEVAevs63XtT14/1WXNWWTGvhJhi3p2YVnlN/V5+D0b8M/o8zX5Sm' +
                    'QGkAABZIdXlEDFMUzUAWWJhcKNSxbJZw4YZkwvFlSbYvFuzhmM2dXC8013s4UEs4klxfLxLeK6dzbTbqn9FGGpxljXcxt/1J/lznrGNeZ4nqGVvNFFAQQUURUAURUAAUMgIZOIgPV2+7yzZMeDfc7+s0uLxeIT5X' +
                    'S8bkmZyBpHs7G+2048Xd8+dzbWYlws7/AHJ4sfNV7rGcV5p7rfGLM+rf/kzxiZR0sZxXP/yePLgs72lnEyq3ktSb602s6ag5bd3jiJN96xMXZ2k8mrkE6tmd9rY6JtJhIPOF5jowLIgLFi5vmiINdW3mZuc+LKir' +
                    '1eZmeSLAb12k825vr6uMal4M2K6dWvmMZDByA4NsinEQBAFb7Ul2ueMkc3TtS3fhyxml6V2zi5XfFkrFXXbhisKbcdL5vM9F5WPPjjhr8pSHNq6458Ez5Khwn6pJbSS24jV2xOnX96CW+ETBJaKBxAF4NSZ5Q00z' +
                    'xvKLbeU5MqnEzfInAnPiK3N54zCb6Z/lPEt18eKTEvC8LziBNczhzZ21saks24cm+7JZld5Rns3+7S8tp/x8GNp07WeVwSyXPg6TXr1zrm3xn/JRyqN7zHC8LPBgiUXKCioACggYMIvEBFwcgWYk9UQUAAAAAACC' +
                    'wFkjW2LOSRdv7WVc6N6aXa8DfS63C74jOV6rjmmAVG5vWcAjpO55rd5Y4ifMXS8wVpF4YZUQDCChgMUAMnEBfBqYZjUkSqS8QxBFYAaZURQBAB17Nx1Xxw5OnZ/vx5peljeZWc2VmzFXOWcV0l6ozJrrbvfDlGZc' +
                    'Nb3OuQcttrtc1JM3Ea07e29xGtp/r/jON8a1vjLNvTOnX96mut2voa63a4jW1msxANrJwnJgFAF0mdpAdLw1k/qzLV35sMxV/Vc+TPGtThFEolAXK5jGQw1q2eRLZyuP0ZXIh+pwQDV4HBBRTKAGQAahhJxdJGaq' +
                    'co5102c1hQBWQAAAAABYiyWitxN74JxiXiziuna36and26tswnb/AI9WWDjdDJkFFycPJAC4EBFwYQyAYXIogZXIIvIMRAyZ9DCAs5t8GJGsFWLieYYoiuYDTIAAAA32rjuasLLiypR27k41yd+7ztcKkaJWpf6M' +
                    'LKuI9XVrp2s6+LyXjWpeGPCuna0kl325Tl+qdDNn+vXH+V5uVuW+5bbxYWJRZwmUKoOnZn8rfJzb04a2+aXonZtc1lagqiFoJQFZABQAQAFAAABAAVvVpzjUrNVdpwc29uTCxKAKgAAAABBXTXTLprphnSt5c7a0' +
                    '6TWWOHd06f5Tk6zZO5tOi5IPPdtrMeCcQbZRQAyIKKIAqACggLhMKgAAAALG5WOa8UqtZEzRMVgBpgAAAFAAd7c6a1xtdO3c6WeTnWZ6pkQaRXbubWdvXX0y4O3cxt29bPBm9xY425DwGkAAHWT+EcpM3DtvZrJP' +
                    'JKsc9mVtQQAUAAAAAAABAAAAAAVY0w1KlWLeTDWzJEoAqAAAAAuslrvO3rUtxZHGbYam1dP9erc00ngzbGnHrxzY22u36O3fmvTmc3nWf1KplBpFQABQEF4AIABwCgAAKiwwCAAsaZi8UqqJkQZAaZAAAAAAb7Vx' +
                    't+q7zi5y4srpvc8fNm9tTpzAaQWbWfogDVnCWcmW9eOuGEhQBUa0558ktzcp4CKAKgAKAAAAACAAAAAAoCzW3lARXTX2+958P1Tuduaf5S30TYYxagKUAEAAAXpopLh113cujZudu30ZuLNa62uuLp2pONcu7dbt' +
                    '/HkmS1U336r6MoNMqgKBViUAAAAAVAAAFQBUFBFEBYsSKirgMwQYAaQAEAAAAHTeYkmc5mXN0vH9kqxzFqKAAi63Fy1tPJnCy44I1GRbM8kVAAQAFAAAAHo0navauuP5yZy871aaaTs3uW5zEpHlAUABAACRqTBr' +
                    'ic16p5I07azTacJx8nLbuWXE4M9dlzOCW3a5vNJDVu+952oYXCiWItqKgAAAA667SOQlmkdrvFm8cDNT5XXbfucOmOILJiACgAABQAAAADIAAeACoAAoIACrlkyhreRnIYuoKioAAAAAANTZkBqzPFOmtTbMS2py' +
                    'vB0zxpmTkyCLlAUa5T1ZKBoAIACgAAAgqAoAAAIAANa69VSOvb4a2pa1GJI3jWTizeHFi7Wpmmt3uaz+2MXa1BcTQBReCAAAAHAAAAAAAAhkAAAAAAAFQAAAAAAAAAABRAAAAAAAAAACS3hAde3rnWsdzXprc3mm' +
                    'vTOfi57bXa5Zm6t6QBpkAAAAAFGscDWZqbVBAFQAFWa5OmtaqmrjnijqWTyTTHIbsjv2e1pvpbtPFdTHlG+5r073XyYswo1HWf8AbcZWv9l6enwZsWVna54IDSKCIKimVEBQBAAFBAAAAXwQzV4AgAAAAAAAAAAA' +
                    'AAHgAAAAAAAAAAAAAAAA3f464nO86zrOLVmUqxgaxiJg1MQawimICgmFxknFbfCIJnyScaN6zE6r+wF/jMeLBbmhCgCoACtQIIrS5QZUen2t/hf1eV6Pa3htFqOXuZju583LZ6PdzjrXnvJZ4iAKAABkAXgmAABQ' +
                    'BAAFBFiAAAAGQAMAAAYAAAAAAAAAAAAAAAAAAAAAAAAABrVcpeCWorVrOUDE0AwoGMtYxxqZQW3ExGQUWTNwu18Jyi/2zHjWEABUAAABWpyEioqqy0io7e1/v2no41vsbY7s9eB4jt7ufwl9Xk8Hs91/2v3jxzkT' +
                    'oQBpkAAAyKAAAAGQA4KgABwADACoUA8AAAAAUEAAVAAwAAtQCC8EwAAAAAAAAAAAAAuqNckIbcmVMAgpgCRrhP1LZryYp2vS25QFQb1nTOq8/BNZ43km1zUEtyAqAAAAAALFSchGlVAFqa7dO0vlS8mp0bTjcWck' +
                    'Hp9zc9nPnY8cenu3Ptpf0eWE6QAaQAAAAAAAFAAAAAADIAGAAAAAAXwQAAADAAuEPAFqLk4AkFwWAmTmE5gYMBkAXmAgAAAAALAEUUAMFvklqBoArISZGpwnqKW44RkAABAAAAAAFnIII0oigJhUoPRt/wCrP1ea' +
                    'PTv/AOrr+rzQiegXmKAAgAAAAAAAKGQAAAAAAAAAAAAAAAABeAgAC8wQyuEBcnqi+CCYBcqJOYvAQQBUAAFiKKAZRRAVAAQABZ5pblb5IKACAAAAAAAACoqKKgKqUAd+5/6+jzu/cv8A0O3+7gRKeICgAAAAAIAA' +
                    'AAACgAgAAAKAABwAAAAAAAAACBkAABUAAABcAIAIACrAQFQAAAABBeSQFABAAAAAAAAAABUUUARQAHXf/s6fu4t7XPb0nllgiUAUAAAAAAAAABAAAAAAAAAAAAAAUAEABQAAAAAAAADgBRQEAEABQAAAAAQAAAAA' +
                    'AAAAAAAAAAAAFFQBRANW8sIAAAAAAAAAAAAAAAAAgAAAAAKACAAoAIAAAAACgAgAKAAAAACAAAAAAAAAAoAIAAAAAAAAAAAAACgAAAAAgAKAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAoAIAAAAAAAAAA' +
                    'AAAAAAAAAAAAAAACgAAAAAgAAAKACAAAAAAoAAAAAAAAAIAAAAAAAAACgAgAKACAAAAr/9k=' +
                    '" />';

var propertyTabImage =     '<img src="' +
                    'data:image/jpeg;base64,' +
                    '/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAGQAA/+4ADkFkb2JlAGTAAAAAAf/bAIQAEQ0NDQ4NEg4OEhoRDxEaHxcSEhcfIhcXFxcXIiMbHh0dHhsjIykqLSopIzY2Ozs2NkFBQUFBQUFBQUFB' +
                    'QUFBQQESEREUFhQYFRUYFxMXExcdFxkZFx0sHR0gHR0sOCgjIyMjKDgyNS0tLTUyPT04OD09QUFBQUFBQUFBQUFBQUFB/8AAEQgB9AJYAwEiAAIRAQMRAf/EAIcAAQEBAQEBAQAAAAAAAAAAAAABAgMEBQYBAQEB' +
                    'AQAAAAAAAAAAAAAAAAABAgMQAAICAQMCAwcCBAQEBgMAAAABEQIhMUEDURJhcSKB0TKTVAUVkUKhsRMEwYLSI1JiMzTh8XJjFETwgyQRAQEBAQEBAQEAAwAAAAAAAAABERJBMSFR0fEC/9oADAMBAAIRAxEAPwD8' +
                    '1X7t90if/m8/zb/6g/u33T63n+bf/UeJOEZmWTpeX0fyv3NUU/3vPL/92/8AqJX7r9zn/vefH/u3/wBR43/IlXhvqOjl7vyv3N2X/wDZ/cfNv/qK/uv3Kf8AvOfGv+7f3njmFLMTKb6jo5e78r9z7W//AJnPl4/3' +
                    'b/6h+V+5/Wc/zb/6jxN6V6ahMdHL2/lfuf1nP82/vL+V+5/Wc/zb+88W0+xCR0cvcvun3P6zn+bf3m19z+5R/wB5z/Nv7zwrLg2OjHr/ACf3L6zn+bf3kf3T7lov7zn+bf3nlMzlvYdGPZ+V+5/V8/zb+8lvuv3K' +
                    'v/3Od/8A7b+88mrI6zoOjHrX3f7i/wD7nP8ANv7za+6fcXp/ec/zL+8+eqtM6V/mOjHs/J/cvrOf5t/ePyf3L6zn+bf3nkA6Mev8n9y+s5/m394/J/cvrOf5t/eeQDox6/yf3L6zn+bf3j8n9y+s5/m3955AOjHr' +
                    '/J/cvrOf5t/ePyf3L6zn+bf3nkA6Mev8n9y+s5/m394/J/cvrOf5t/eeQDox6/yf3L6zn+bf3j8n9y+s5/m3955AOjHr/J/cvrOf5t/ePyf3L6zn+bf3nkA6Mev8n9y+s5/m394/J/cvrOf5t/eeQDox6/yf3L6z' +
                    'n+bf3j8n9y+s5/m3955AOjHr/J/cvrOf5t/ePyf3L6zn+bf3nkA6Mev8n9y+s5/m394/J/cvrOf5t/eeQDox6/yf3L6zn+bf3j8n9y+s5/m3955AOjHr/J/cvrOf5t/ePyf3L6zn+bf3nkA6Mev8n9y+s5/m394/' +
                    'J/cvrOf5t/eeQDox6/yf3L6zn+bf3j8n9y+s5/m3955AOjHr/J/cvrOf5t/ePyf3L6zn+bf3nkA6Mev8n9y+s5/m394/J/cvrOf5t/eeQDox6/yf3L6zn+bf3j8n9y+s5/m3955AOjHr/J/cvrOf5t/ePyf3L6zn' +
                    '+bf3nkA6Mev8n9y+s5/m394/J/cvrOf5t/eeQDox6/yf3L6zn+bf3j8n9y+s5/m3955AOjHr/J/cvrOf5t/ePyf3L6zn+bf3nkA6Mev8n9y+s5/m394/J/cvrOf5t/eeQDox6/yf3L6zn+bf3j8n9y+s5/m3955A' +
                    'OjHr/J/cvrOf5t/ePyf3L6zn+bf3nkA6Mev8n9y+s5/m394/J/cvrOf5t/eeQDox6/yf3L6zn+bf3j8n9y+s5/m3955AOjHr/J/cvrOf5t/ePyf3L6zn+bf3nkA6Mev8n9y+s5/m394PIB0Y8lmK/El0yNMin7mY' +
                    'dFbNVWi2Rzy4XVnX4V4sUS7H/DX9TLy0izDbII3lpb4LJOhpaT+gCdF0KjJpdAOlFiTZEoUAqDcIxMKEW2qRG8kFQncmwYFWgtH6Bak1eoG1oUwm58GaKKCACggAoIAKCACggAoIAKCACggAoIAKCACggAoIAKCA' +
                    'CggAoIAKCACggAoIAKCACggAoIAKCACggAoIAKCACggAoIAKCADxtz7DS+GDL08WVhVqpv5GrObR0C9NTK3b3AtdW3sHp5hYr4sMgFbwl+oS/REQGlqdKKXPQ57HaqioFAJZ4jqEZnWxFllthREMiiMr2hV36E36' +
                    'hTqRQQa2f6DqR7bjZFFT1cabG001KMTjO5ate1hGgAUAABm91SJ30MrlbekLc53tW3ImtEjPckmgPUmnlZB5K2dX6XB1XO965A7AlLdyzruUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAACgAAAAA' +
                    'AAAAAAAAAADx62XgaWsma7mvAVSzJtAfQu8AXddEQBZA08VgiJJpEG6qbI6meNQp6mggYs07Q9EbOalJ2xnVAR66yV4WHrsRJt4K9c4IqOI0yXMJbEesal6vSAD108g/5YC1WcBTKkCvyDW3sIsvxKtZ9pRsGazL' +
                    'zg0EDg+Z2bqo7ep2vbtq7dDy01KNWjdESy+hbONsCm5PFZclUYZm+L6e0Jy4WSjdrZTTyjVeay+LK6mEtyAeivIrPCx1Zs86hVeRXlst5XiEegHNcye2eh0TlSAAAAAAAAAAAAAAAAAAAAAAAAAAAAATkgAAANQA' +
                    'GAAAAAAAFAAAAAAAAAAAAAB5K6DfyLoiLTO4UzIW7C0bY6IC9F0KsLxZBqBdTSUvtMpHXjUuXsQdNMAAqM3eI6mHHSHuafqthxGhltzkiijdw9iqdYkWlKGTEYed0AUTrHQuY1yyZSytdGVxMNaAM5ceAUZZMQlM' +
                    'bl21ywC3yVTkimPMYjKAqmJ3Npyk2c24qjVn20eYhCI5cvIrpVrnOplVjQzQ6FqsWeC0+EJuYZYS0IMu028DMKZWBaymCGkdl8HsOStqdVivsOcJzJIqrOQ1BK4heJvlaUD0RLKZ243lr2nA1xqLog9AAKgAAAAA' +
                    'AAAAAAAAAAAAAAAAAEb2IEy42BnQ0BQYs3oXuWJ3wBoAitLjYCjAADUAxbkSWNQNgibxO5QAAKAAAAAAAAAAA8bZdiPZB7IqrtA8Rv5DbzILGAVkSyBpI70UVjfc5UU2X6s7EQFnCbBjky1XqBlQq5WXoyKJzoWz' +
                    'soqy1lKYlBUeXCc9BZy4ajqKpNvMdApmdQLvhyiZ64Y6tLwgKJlKI1Arn2B42wiKHEfoMN4euwFcJIPpuNdHh7F31lAHrrjc58900q1c5zBbv0ts4dCxGqLJvYzXQrcKSX6pXfEM0yViJKBhqrmUYWhp1UNrUyai' +
                    'Or+D2HKUdnocrVr2prXckVa6rzOnJHbDOddUbulEsejDrENM3TMyY2xk3x7ijas9E9NmdTimpfU7EQABQAAAAAAAAAAAAAAAAADcAGzOdSavJp50IMiYQGHroRUUtdzG38UX4s6VRCi9ytSXidjOhVXLtbRB5zsw' +
                    'NyseOhHeNDKUtZ0M5loIs27XZ6Eq1KbNKbQtkY3a22YV0q7Wb6GzlLaVUdQgACgAAAAAAAAAAPGtRuENpKBR0XQEVSpENJS0kB14qwp6mwlCjoAgcprazl42Ol321f6I5SlWHXXRkEeus9Db7q11wzFYnOhWlMVC' +
                    'npjKyVSlKZLN6MvpxDzuAzhLUKXPVkfa5l5RcYTAKZc6ouZysomIy9XqMQ5eNAKtdIaC1eIhEW+faG4pZz4IDly2VoVdDKUvyI8Qbqa+RBJoqvDKTDMqyrS46lTeZ0RVVLI2clGJcdSFUNShoyo7M4urSTmZOkt1' +
                    'k5tuIZIqr4kbupUGF8SOl5jAo4x22iZR0o4ky8Wh6lpqKjpjXc7LRHJxGTVb4W68CK2AmmpQKgAAAAAAAAAAAAAAAAZsnM7GiNYIMmpxCMlQEYK40RCBDtj9q1JKemg1x1LP7arCKqROG4WrE9zwsIMTpSmu4EJZ' +
                    'aRtqVqHAxD8QIm9FuW1YSSfq3MrHsNKPitkCJtaGq+n4tzEf+BpJ3eXhAdUCJp5RQgACgAAAAAAADx4iB0HRF3ZVFuwP/NggqOvEsz0OZ6KKKr9WQUAFRz5PU1ReZmztitgkr2bmHsZct6yRWquMtSglL1joG7Vr' +
                    'DWCLtjOoDPd1gspuUogV7llBS/NgJxDUPqVvWVK2Ylz6tiQ1CmUwLlbSkshSkoXmR9U9divwcMBmMIxyv01XXJtx1yjlyv1R0Qn0Y3NrQxsjotC0CNKfEpIaesoCyTIETgDLSaJnGcDtdbQ/4CZZUdFpHgYWnVG9' +
                    'Ec4hYcEitJw5Oln6Zg5NvEo6J+mPAUYeXO4rqI3Y0A7EqonoxKZKqG1sQdq/Cimaae00EAAUAAAAAAAAAAAAAAAlrJeZBkDMS9wRV2hZZk0nGmrI1BUQTCVa6soThN7hUajAVlVNxkQ0perGjkB2tKW8shUnd91s' +
                    'JaGQFob7tNglLgsyuyNTOmOgFvDaVf2kNJ1rWdWzKUYA6Ltos5k2jlVKzl6I2rJ6bBGgAAABQAAAAAePVsq0ItGVaFU3KiFIN0U2S/U7nPiWJ66HQIGeRxXzwaOXI13papakE/2+z/mM0q24LyWq47V5lpVNaw0F' +
                    'L9y9LySzq0oUMJ27p1gWfdZTgCw1WU9SQnhuIDSTUOUJq051AYSzlNlUJt1ykhMbStwutVqA9LahQ9yzLSahkTbbnD0Lnu9T0ANuV3Ql1PPdzZvqa5HNsOUjBqRF3OhzWWdCVR4RE5zMmk4eSOO5tfwIBG4RRMFG' +
                    'VaXOpHDsmaSTb/wMxDiZA29DmpThnRmZloQSVJtfD7DFkpUG9hRj1VTjJXZNxEEVpcMuG/IqN9reZNQ04bnEmatvfQuVlmVdaaM0Y49zYQABQAAAAAAAAAAAAEAxjc2Y8AGXl76Ihl3ffGyNBVTgrUZ6mXoK9qlT' +
                    'lABowCCpT6rYRksO7jZB9swtiiPutFVhbi3asLbUS1Mbl7VWrdtWBE4cmX/xPco+KK6oBVJtToLxZyv27mU+htNJeYGTSar7dTEKuDVa9wHVPYphWnzRvVBAAFAAAAAB440RdSdWPAqqaSl4MrQ68Klz0IOyUJJb' +
                    'AAINwpexxrZpuzrKe5vkcKN2Zdr0rDWNmQYs1azaNutO2U8nOsSp03NX7cdoVa96UpYInVtu25X31UTglbVShoBiW1psJmFEMKYXb5iW3lQ0BZspa0CU6OGiOtlGZTD7XOcgFEercSqpvVPCLMYalHK1k8LYDO5A' +
                    'GbRqhsxQ2ZqjTekT4kU7qGWWRYApGp3gpl2hgRSk/wDAJyzVLRL8RM3kCmYSsoNPKxqYUq0NQxAhppP9TotDDzDNLQUZcOyf6i1e2yjcOsWUOZ6hvMNeQRum5p6GKas2SqlW1lM61vLho41UW0hG6uLIDqACoAAA' +
                    'AAAAAAAAAAGZ8DNkV2hS9ehzfJNkiDN03p+ppNRjYWTawZpj09NQrYSrLYI3CkgrYEzptuQC5iFuH21UbskwVL99s9EUQJO7m2iGuSS47VuAs03jQTGUGlVRuAI1HqeO4tYbzoH6orrBmU9ALaLP/wBOhDa7a16t' +
                    '6mEoA6V7aKXubXT9Dil3PwOm+HlaoI2BqgAABQAAHjgAqKq7Ho41FF45OFVNkv1PSRAANwm+gHK025Ir+0zyWtirXiWq5Pjrvqc3Z2tLCt07ZfcITtFdCp07IepK0bUpwQLdyw8h2TqlGSS1aXmCuys5jQBFtahO' +
                    'fixIi6Up4YXbpYBCVsOUJThJQyJRPbnoa7peVDQBu1U3+04HTklLtmVqctjUQIykKOldDRK6IpmqrpV17nKa3RlaGZUuHBoAMPDhgy1bWMdQKqzXWCVTnOqCcJFrqUabMzNpNPKhmEos1M4JAslKg2tDGZhqGbWg' +
                    'oxMtdTVs+wWcuvgS6jKb8gNU+J+RsxT4n5GyUZTcw8mlhrzMrtblOWjTA7AAqAAAAAAAAAAAAADFlmTlb0PGWdrLc5XhZ3eERW9Uc1FbRuzVJ7c6mbxV9z12A2AnjIIFXiEsgd0PSUHO5QCTs0pwCEGrNTC2Mljt' +
                    'WdSAWtZ9VtCNpvAfc4qitKqjcoicZMwlnrkpbRZKukARKWSyl4w0Ddart7mBhNo3RR6noznDWvsLLagDump8HoU50+GN0dE5QQASgAAAUeMsENBXXhWtvYdSVXbVLoUiBjleFXqbOLm/I+39v+ABvk414HOvia5b' +
                    'XhVt5l43VOLdCqt+xr06jttWvcngOqd4roS6tXDeGQKW7cxqPibeklV4r2tEVe5xMAHW1Wk3KE0hyshp1bTcwG6tRGQC7lHaJmXYsWia6I53t6Y66gcwOhTaIQoWoHVAB6GFLNNLCb67kMppuIhmigO7DWgMuriU' +
                    '00BpVTqpRmqyG4gVKLZ4JVy5NSZS9T28iA3LR02ObUOJk3sKMtNNbolrbMry15lu5QQr8XsOhzr8SOhKrDjuWMzqbMuzTysdTQHZaLyBK/CihAAAAAAAAAAAAABm7iOhi8RLUwXlslCYmVPUDHH3NtvR6C6TUvYy' +
                    'pd03hI6NSoCs0cqTRzrb1QtEdBRLNpYyyp2aUgzV2yn7AKUgIKq9zl6BtN4Jl4RWlVRuUROMlrV29VtCB2biqACrScsOsIgEiPJjLwi2U1XbqtiLAFvKSjVaoicOSpNuX+pmXLT2A0pdpOyw/M4q0I1Ruyc7aAdW' +
                    'AnKCmc6bBAAAeNHTjrNl0WTEHfirFZ3ZaOgAIM3t21b6HLjXJWLVUovM9KrzY770rmuFoUc7W7758jtWvG6y4k8/EptnQ9F61SlCjFaN5q4glnafVlo2leqlaama3i0vMkVbXVklEMio7ZTiBayblDstWvcn5gSY' +
                    'y8ldq2ahQK2VXlSMWbjEgGrVr3Th7HFtvU68qdFEymcTUQ3AQKIWnxIhqmovwdBKQM2nZSZVq1psszG4Mpp7FAMy7JqIz1NGHVKIfsEG5/8AJkoZtKemOpqo8Cyb0Ukq9doNyqsys2c5TAky0zZmySt6cKNDWwox' +
                    'ZJNRgtu5S9jMyzVsyi/xCvxI6nKvxI6marNqt6GjNq+l3Taa22NAdKfCjRjj0fmbCAAAAAAAAAAAAADly2WJ1WRVyvInKq9yb3RKWnGwVLp2caI2mmsZM8kvT2kphROUPBLOHCNozdpZ3FHKkDZltpqNNyks2lKy' +
                    'wL5gKWgQJjJa1dvVbQgbs0qooMJpTJWoRlgErXcg07KqipmHEvcC1U2MZ7mntoUWlUT1AvdCgjxWWiLqbtZPC0eoGDp3quhzhLHQtVLyB2TzK0Zo5pqO3daG6uV4hHDk5m/TXHV7gv8AcUhqy31Br8wYqpcdT0rC' +
                    'hHHhUueh2M0ADPJbto3vsBy7nbkdkpjTyQ5uTuqqxE5Y4rqspr2mOW3fyY00RZ9G+Gkpyasot2rJpcbhNOGc07T3atEVq1rpdrQpaiUWJe/dGIg1ZcfbK1A5xLhbs1ZXrCbwyVrZv07Bu0+rVAapeqlNEVe5xpuX' +
                    'vo69sZIqd28QBjlTT7W5g5mrubZ2M7GohsACiG6GDpTQl+EaJKTy4KYs2tsdSKqctvUpFEYKBGSZakuHroSErKHKCK3h59gqZaa1XtNVHilk3oZWjnY03BK6sBq0bMOO7SDYozfbQXWrT9hlytU0as5lFQrrU6HJ' +
                    'a1OpKqN/tnXYpmyT1Ra/CiDpxvVGzHHqzYQAAAAAAAAAAAAAY5Y7ZexzrbMJYOzUprXwPP359K1CulphxqYou15eXsbWhiM91noBu0RkxRy3slob18mc59UL2sDoACDKs22owjRl2hpdTRQCfaCEFU2cshq1sQjM' +
                    'NalFqlM9CWv3OFoRmklVSwMlluK6roTyKnDkDOE4W2xqqmWZaVn36PoADXc+5bDQqWGuu5hTuBtJr1vRanWYaa+FnLu9Paa4rKydemQOtqqyaejAq5XkAjPGoqvHJoAAceZ5Vfazscaxfkbejf8AIQb7+Ps2wtDz' +
                    '8adrHTnrWqUKGzPFK9SUl8HV/wBSqh6aE47qszuS/J3KIg3/ALbptKRFYxfk8GL0VWo3FeN2UzBlynDzGCi1/qL1VWBMuXvqVXtWva15Eq6z6tCDVnRx2rJOx9vemR9vd6dBdWrXLwBxbltgDc2gAQAdVojkdSUg' +
                    'VPo/YyGO5MmK0tAAAbgic2TLCthuPEnbFmpmCoN4w/YVaGHK1UG1oFXtdtHnozGic6o33JaqSUeX/iRGU1J0M2+PRLGxoVU5LTVLoSyUTv1M27lqonc1Z7FRFsdTitjsSqzZ1WppRGNCNkp8JB0p8XsOhyr8SOoA' +
                    'ABAAAAAAAAAAADhezVmoymdzlyOLaaoBVtrJi6bcbFpZvUt5jA9UURC2M2iudxRdqgtknqPQq5RoxW06aI0AcRL2CsmlAecESS9gFAAFrCcsjt3PwGuDTSqvEDAh2cdAVW7ZAtqpJGRmzlh4AQnRr9PMypSzqLNp' +
                    'Sg7Nw9mUVtsWcJb9SbEqksPcC6kpNXK2K4Whm0+wQelPPct9Qc+Kydex+wExHUAAZ5LdtG99jHHxd1ZmOhOVy1X2ljl41M4RRy5PjdZmMHbjtWqh/qcKza0vzZ6mqds4cLUUYxfk8ByUrWI3FaOymYM2Vk+15aIq' +
                    'pclVK0MzmXnc2+VurUZZnjdVb1aQUavyK1YWopWlk51Jydvd6dI2D44r3SQZSnC3JydyUWfkVK37djHI22k9UWfRkALQ0gQpALXU6HOmp0JSD0OR0b6mYEGyDIIp3QRQ7Nl7HbR56GVOfAqNXbaSmUFoYk6LQVUd' +
                    'W9P0MrRyalbkpIRJydDD+LSDZKqXc1ST30K61dW2spYaOdpWqjxNNvSQjK0R2OOx1FVLONVJatNYExvBK628yDa+JHQ5brzOoAABAAAAAAAAAAADHJonrBszbNWByrZzEYNvQ59/hqdFlSKrnVN27mbalQc7Ntwl' +
                    'CR1FHOVVwtTZh1i0mk5QopIy/EpGniAKAAAVXZy9AO5qsfxAtoWEZEPcAG4JLZUpYtt1AgXb8LBGspgJWxi6cz1N9sZWjD0ksoiT+L9Sma2bcddCpyA74ajYEayC/iPSAZvaKt76IyOXc3d2Wc49hrl5e6nbEN6l' +
                    '4bVrM4Zz57K18aJGp9F4a9z8Dd6dkQ9SUrdKaEtazfq2INp8lFpjUlbLv7rGnyp1aShk46VtVzqFOW1bRA46VtWXqc7JJtLRGnxOtZnzAkS4W+gtW1YTcphd0+nVB2tZ+rYArWrosHOzmzZ1XIlWIOJYiFIUogAA' +
                    '1Tc2ZpoaM0ZvoZrqatklVDLPg0AQirK3JXfzM2mdMFXwyXEW+qwaWhzls3sKI621SlETwdK2hRMeBikRlSBJlnQw1VW9OhslVOSzdEpmHoWKustbanNvJruaUeARlfCddkctjqtF5CqPBKtPT2lMz635EGmzqcjq' +
                    'tAAAIAAAAAAAAAAAAADg7Q3jRm6uV0gnI0rZ6Clk9CiXcaasvHPbktoiXscbcjcpYqWTUXkvLhaIV5GsNHMGsia71vV7x5m2jymq3tXRkv8AyuutXbMmjFeVbqPFGk09DNVQoTTYIBbtTghqtVHcZbTAS0ZdW0aI' +
                    '7PTRdQERjoDKtmP4mijCbhrdGkRtVclbUwBmIyamsJmbKUKqV2/oUaA0wwQdzlyuWq+06HFJ8l3G/wDJEg7f0qKsvZZZ5Vmx0uuTjUN4fiZ40pU6GvEdqcqSSaM0i15sb5VRVlJTtBmvE7VmYIHKqpqMdQ+OyXcn' +
                    '4mIcxq0afJZrtYVmG3Cy2ata8dtjNbdtpiTV7q7UaICVv2N4mQ7S3Y1W1OyHqZqk2k9ALyWo641OB15Uq6bnPdIsQ3KWsBxAGWQAo6V+EpFoDKpadiVclbh4Fd2XxFYQCIqw+1w14onGk1FlKMSaThKC4heta2iu' +
                    'hrYw27OWbYoxZ5LVtKUbn0tNSjNKqyhuPEDLbbnc6HO1e20TPidCVUvPZsO2rScw4MWZvuhJeARzWh1Xwo5rQ6V+FCisiaehrczaO9RXtkiqdK/CjkdK/CgNAgIKCACggAoIAKCACggAzyNQp0MVdFvEHS0drk8t' +
                    'mm8aGpNRvk5O7C+E5gGpEAAUAWCACptaEN8VFa6rbRgVcr3ybV6veCW/t7JxVq3hozk004ahmclXXfLwtzSrCyeatrVcpwdHzN4sv0JzTWzF02jSaaw89A0RXNLc2Ys9i0eDVRbKVAVZU7opnKt4MitGG2nCKp31' +
                    'DQQdnM7MFrGjAHW7irZypd0eFJrlei9rOvH2diUp7sT4OHNyd7WIg1xcfctYg5P1WbWjZ2ryWphaeJaJerq41Kr3ooj9Sd03Vn1OvJerphzJFc+OyVpsXlsrNRmDVOOtqS9WcmobS0A3x9rWYk54lx1NW44rMmUn' +
                    'bCA3elUpRlV7vCCNWTSZfWsrQDFsOOhIeoeppP0sqFV+pLahNkbkeiBalSlmlRpzsXRQVkMqzgqMM3XRFqKEQEVhwbVXZJIy0jVdU5gtRlpptPVHRpmHm73NsUYdnlbGqWVVlSHSrTaeehK1tavpUxqPwSzTs2sJ' +
                    'mznmYahnQUXkpTs7kot/Mi47XqnX9Be7de16Fq0ktnGpPBzW50r8KOSnJ0p8KLRokZkpLVpVp0by8oyobpoYNU0YGwQEFBABQQAUEAFBABSA4cnJ3YXw/wAyyai8nJPprpuzkAbkxAAFA9HFxcfJx5w08s4HTg+O' +
                    'JiUSjVv7e6+F9yOTTThqH0O1uS3G7UWfF65OTsrZtlkmqyBuCo7uaunJMyb/AKlbNq6XVbmKevhdd6uUaTUUv0w/aZVHw8d13V9M/ocrcHJXafI7f013XWjalGO+yvW9nM4ZZRw01N1u5Sbwenu47yrqI0nWDnb+' +
                    '3TzR66JjZ6MWUsjtGhb1slDUGIEHQjC0BFJUJgiX7f0LDWGBzcqwNuNWC6mLHfyNJ4bifAvJxdlZmZwYq7VcovJy2ukniAM11k9bvTscNaYRw4qd+HhF5OPsazMi/Rrj41ZOTN6qtoTkJ8lVKlJme593c85Irf8A' +
                    'u0XRGIbwtTd+VWULczWyraWAdrxFiJurlFvZWajYtL1ShgZdnZy9i/1MRBJUzs2a5HVrGoHOte6fAm0G/gp4s5wWIpBkIo3RGo6YFYjBTKpNvMSt1BQBn+mn8LL2tKA0hnZjRlh6G56qSNVeNAOUmm4wV8dtsoNe' +
                    'qGi/iMrLOhisd2Op0Yoy7J1ajJribSw4Odk1qmhshn4Ncjb5LSU57nUlEvxWVe+ZRmYSZq79DSNcTarjI38HJG6fCY/dbzN00LRolna0TsUy+5Zw0ZVS03IWmrA2ACAAAAAAAAARtJS9A2kpeh573dn4bIsmot+R' +
                    '2wsIwAdEAAAKQADSbUNYZkEG7K1X6tWYNOzermCbgAHEaiAN8VrK0Vcd2DdH2WtS6lPZHLTK2O/I4tTkj4lklVrvq1W0w1hr+Bjlq/Uv81f8TfZV2tWPiUowu9UV5bacNMgs1bpd5Twx22Ssk3NHKW0GK9qdq3WP' +
                    'A6pput09fTYDFOR1u+5yrKUa7eK6n4W+hi9XX/I8eTNdtbN/86leYEfBarlPuX8THg8M3PJWqtMtzVzsRXTo62zZaMDFm1lB3bfgwK1Tw/YUWJwACK6cdqqsSp3OFn3Wb6s3fj7a90yc66ln9R1pa1NNBe7s5Z6K' +
                    'uqpqmksnCle9voQbfJXtcPbCOfHVOZLyUVIh6me26UoBZJWwSaJPuUvYS3LZzLINpybtRKsmKptY1ZX3LD3FFrVPDLCraCJWeUZtKWdSKXt3W8FoDK1NGkIJBQQZhmk7LRgoDve6Kr1fgQkIfg6A5+paMqs/3ExW' +
                    'wROdCkEjpgnc0+poy8ssGav1G2Z7UIjQqN3dlxtPQlFRpd/sMO1moNVukoZPBlpK7Sytjoc25u2tzoKMuyyhX4S3fpcr2krVOqzA8GXhs1TR+ZnMtPJqm5aNEtHa856FJNZhkVS11MlXxIg2ACAAAAAAEtZVUsWs' +
                    'qqWee1nZy/YjUmpat7uz8OhkA2gAAAAAAAAAAKNi1tHtJggAIPUAdVd24nXtnt3OR14HF42soFVujTrWzcOrj2G+1q167XyvM5Vou61HqpgvrrSvInLTymZEbadbv/0280a/p1drrdqaku82rdZsprHUtGnWt5zX' +
                    'D8mBJv21u33T6WmZrZJNP4quUde3N6bW9VTmnF1Z6W18wOkJyk/TyKV5nC6ac6N6+aNukK3b8VHPsJfu0+Lu9SYgyjLw0zfp7U0/VuiPJRFhwDSahp7ACcnI7JKIHHXucGbx3ONDfHbscxI8Gr8bopmUStrVytGX' +
                    'kurxC0OtHVUSTTxkg4Wu7OXsdP6le3GsHOq7reGovRV0H4MvQwat0Iss1Erat2wHfua8DNpbFcPJMV0rdLEHOzlydL9vbiJOIn9K0gFoCikmASJA0mmDGhsCgAihGpKNAjMFVrLRkVupVDyUX+p1Q7k3qSCdpPwb' +
                    'LByhoTbqMNdIJBlXstcmldPDUDKJEhOy3HaPUgK22mi1tWIZnuzpgKGAXxPoaruZ7QpqB0Djtc1nxM963wXubTSfsIpX4UXdEShQOgHQEBkUEAFBAB57Nt522IW6izIdYyAJSa0wBIghddQQQAFAAAUgAAu5DThp' +
                    'dSCb4AAAqcNPo5MgD0cjSvW9WnOvsN1WbU2spXtOKqrcLaXqqzSvdKt9UsR5mVbb9FbvWjhmK0X9R0emxvvXdZXXarGG8V5F+19rAvrrVXmXVtNMnI9VZQ36qwdUps1+3kUrzMv/AKab1o4YEpZPts3r6bINNUa3' +
                    '43K8jFaLutR6/tZpO9VW6fdOHIHJqLQtNV5A1dxhqLVf8CNQk05kozo/BgMFEWp6acdXVSjz1Um1e9cS15kpBV7r9q0nBb8dqKW1BOO/ZaWpNcvLW6SX8QMJtZQdnZqTtxx2arxOLc2bAxbUIhUVGgARWbEK9SFR' +
                    'oABQjKzIKHQ5rU2KRSAEFIxIbAzAgjKioZL3OfAPBMMKqcsLUkZNV3AQGjRCKzlaMd1iypgYegQ7qvVFUTgkEdQNtSjPqWuxJstGO63UYLKGIJ3dUWKtNp+wC5Ql+ZpaGG2nnIV1V6vf9SnGUXyefAmDqDmrvc0r' +
                    'omDQImmUDjyL1+ZhKTpyQ2uu5g3PjKzGCEAFIWSFAAAAAAAAApCrUCFkPBAAAA7f279TrtZCq+Ljfkc62dbKy1R1vZ/1K3aiY9pmq03NKcm9XDJyUXe/+ZTU1Xss7Uq8WUhp9ier43D9hBzra/arJyqZg6LkUvvX' +
                    'bW6MVivLav7bae0rzx/83G/4AZbwrrWuH/gdEpVq7WXdXzMclE7ytLqV5krayqrJ4pt5gbtFq1u9/TY4aY6Hd3XqV12q+anK8OLJ/FqvEsEAaa1BRrihWl4HNdu3atEFx2de5aHMnokgA0ga0qZNW0ggyjREUVYo' +
                    'BHoQZKiFRpFABFRgAAjRABWQAAAAMgoRUG29SFZAKarozKNV0JVaIUhlWWiQ9i2fQiZpklwXuyV4JhhSZKtCRDKiA0iOpojcAROy3L3vdElFAs0fgOxPRkgkAbqmlHQj8jGZKrW8xg0X1bEVk9cMq8CK5AtsWZDb' +
                    'IaSnwQS6+xG0upLVFSrWj80Z/prZ+xnWuhppPUzpjzulktDJ6O3o4I6t6pMvRjgDq6V8a/xM/wBN7NMuxMYBWmtUQoDQFQBudRgq0DSjxIqQQsDQIh3fq4E96M4nb+3z3Ue6FDtralLdHFjXZat3SritlK3Mcafr' +
                    '4nvp5o6Wt6Kcm9XkyrlZ2dVK+BxJ0rejtrHcot5i69dq7cileaOVfVxtb1yUdXV9jqs243K8jCivJn4br+Zp1i1XR9tb/wAzFu9J0ansevmBv9iby+N58jPJRKza3XdU1W9HbOFZRbzLE1w5fG/4EHF2bSlzGgJZ' +
                    'Q/DbyBoV8lu3tWEYACAAKKtRbUVIQVaFBQoR6AjAhUQqCKQpAqMBgqKikRSKAEABgATJZAYQ1AgQANV0Mo1XQVY0QAyrFiGmQ0yqluGLVjKKtfEXmFJPVSZKjO5pFooAIrPaiQ0adG13L9CVclRMrBe4O0MYakCr' +
                    'UpFqUgjUk7Y0NPCM9wEaYWNTXcmMMoqtXfUdy2ZlosE/But6rU2mmpTODTNKyhTX2olg7A5qy2tHgzUvpPkTFaJCZO5b4LgDnZuto2JNXqjXKtGcjURbJJqNGQ080T6ODBYioEAF2D6jTUNyAC1U6CAB1unxcqac' +
                    'zlSardp2rdT3ZheJL+vhrbeuGFbFL9PSyKvfV8acxemxlxTklOa3z7Ga7UuW1XpZSjk6xWd04YHaH/TtT91HKFmm622uosYXJdNWfqnBe6vbel1271RBmqmtqP4llew01mrq4rdQ46mW0nXkT+LVG+19tqf5qso5' +
                    '27lh6UcA3f1Rbayh+YGjgADSAAA0sIyivQIgoAChHqUyChoyUJFIAFQAFRSgEVAAADAiWBChqCJwVFkSQICmq6GTS0JVikKQistMmTQKiKzRXaVBBAFKtzKUM0txRQARWquFEY6nJeB0pdJQzCE9R0rVOkM5I61r' +
                    '3KUckJ6NLUpnoaAGXG5oxbUQq9qHaxV9SNuSiqdyrQk7lRBSYKZa3AsEiNMEyi9zKL3X6yTOolMqAd91/wCJe+r1r+hAQa9Ha0n4nI1CJBYICwMQVEA2KAQIAO/Danbbjs4kzxLu7uOddPNGKQrJvTc3evbywsLV' +
                    'QZVty6U5FrXUl162trrHmF3p2408NTnxJ/Us6Jdua/u8iDNM0tXdZXsOjabpybPDMO1Fyq1NHqjp2YtxrT4qlo52pDst1leQreySunMYh9DbmK3a09NjFMWtTa2F/gBrvjurdZtlR1BZ9Nb70cWBB5wAbQC1BUAZ' +
                    'SLUpFAQACFZAioBAAAAoAAikACgAAFTghpARuSQWxFoBcGQAimlojJpaCrAAhBGRMMGkaJIUvGotVrVQQXcq1Zkq1YVoAEVntJDNNwSZRUTua0wJKvEQgGxozsUgpi2pszbUQqVyHhhOA8lQRpamVoVahWiWcIpH' +
                    'oQRPZhwjKK53KiwtioyioKu4AIAI3ATkA9DJsxuWFBLAKgUgAp15PVx0vusM4nbjvTsfHf8AUlFVs05P8rNpJclqPS6lHLiSurUeuqOjTdK8q1rqZVytX0eNHDClKt6uMwzpevrf/DyL+Jzppaj/APxoo3PJV24/' +
                    'i7s58Tna0qriLVw2dXb005N64ZL1XdZLS6leYGqutrOqeLrPmDilNX1QGDAANIFRDQIEKQigAAMgBUUAEAjKRgCohUUAARQAAAwAhkbAAQFBQNLQwb2JVgQACPUhXqHogjpxQry8GuWHXGTNFNvYL1irZn1XJGlq' +
                    'RFWpqkaIUEVi2SLUr1IVlp40ImIbJoBoq0Mo0tBVUhSMgQjMdB3dS6FEhovQsyTYDQAIrmV6DtYyVkRSSFoFaA2BAehmpowtSjZl6miWEKjaZACosEGQAN8bi6nR4ZkEG717eRp6GkrJ2orNLoOX1VpfrhhP4L/5' +
                    'WRTv5HRYUUazvgza9XyK9U0nqdaJLltR6XRysoq1vR/wA61VLO1Kv02UokWdE/3cbh+w5QnVPo4Ztq1LdtXCsvMDL9N8r02/kwSzs6qr/ZuAMAA0gaIikIEKQKAECAAKKBIIBGUhShUQoIAAigACBCgCFIVgCCAU' +
                    'U0ZKRQAAQNAAVNrK1NPkbUNGdiDBDS1IFqEaABFZsQrIWJW24MM09DIhWkVaGTSCqS2hSEGIgrcoNyI9MlREaMlQpGloUiKRUbgjySwRRohG8lTAIpEUgEhFDcAIIyyAMAaMODSCLsNxDIBACjtS/G+J0th7E4l3' +
                    '1tTfVGeKO9J6PAtXt5HXaTP+1dWm6V5VrXUci9at+26gyq8iduNPHTUnfyOnbiK774IM01dHudG+7iVv3UZjkurXV6prr5nWro7uqfputPEtGGl3eF1HtBexutqrWjwCDgAFqbRoAhFAAECFIUCkKAABBAUhQKQo' +
                    'AAEADIkAAQAUiWTTQEIWCFFKQpFAABGQ0GsBAhUyPIUC1IVahGgARUDiAyFF2EBaCQIVEKtQKACDBpfCxARRk0iQAiopFqUipYybehgsSjQRq2xEBQCsKEsUmxBEUytTZaRl6iMSGE9giRgZKgtAIUPQAJjK2O3P' +
                    'lV5FujgeiiV+B13WwoK2ePk6+mxpJV5nV6XRy4070tTdZRuzdqU5FrXUyrDr6LV3o59hlKaN71efI7Whcit+26hnKnpu6PR4ZRp1tS1XVwrbgqTtxOv7uNgDgVEKtDSKQpCKAAIEAKAAACQAElkgAuAQAUEEkFAk' +
                    'YAEKQoSCoAQAAUpkpBQQZCj1D0RC7QEUhWQKhVqQu4RohSEUZk09DJUrS+Ezk1XQgAu5k1uBQARU3C1I9QtSjUwQjcMSBSkKQDMGiTBQeURFAAAIAUhQMPU0GpCAbGUaMiJV3G5AUUglgAa40rWh7mQnDTWwG13c' +
                    'd2k4awara6VuNQ14+JedZrdaWQ7vVS/XDMqf1J4uxp9y3M8tq2dbV+KPUvE3CrytbWMduL13WV5AdU0r1a05FnzBwSlNrVZAwZNAFSBAAoQAqAAAIoBAAAEABQAAAAAAAAGQAKACCAAooAIAAAgAKAyABQAQXIAC' +
                    'hAALXQyAEEUADQAIrLG4BQepFqAEaKAFDL1AAqIABQgAAAAAAAR6gCFQAFQAAAAAdrf9Cs6zgwv+m/PABn/Kt8k+j/iK/wDq46ZAIOfH8TjTM+QAL6eP/9k=' +
                    '" />';


var aboutTabImage =     '<img src="' +
                    'data:image/jpeg;base64,' +
                    '/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAGQAA/+4ADkFkb2JlAGTAAAAAAf/bAIQAEQ0NDQ4NEg4OEhoRDxEaHxcSEhcfIhcXFxcXIiMbHh0dHhsjIykqLSopIzY2Ozs2NkFBQUFBQUFBQUFB' +
                    'QUFBQQESEREUFhQYFRUYFxMXExcdFxkZFx0sHR0gHR0sOCgjIyMjKDgyNS0tLTUyPT04OD09QUFBQUFBQUFBQUFBQUFB/8AAEQgB9AJYAwEiAAIRAQMRAf/EAIYAAQEBAQEBAQAAAAAAAAAAAAABAgMEBQYBAQEB' +
                    'AQAAAAAAAAAAAAAAAAABAgMQAAICAAUBBQYEBAYDAAMBAAABEQIhMUESA1FhcTITBYEi0pNUFZFCUgSh0TMU8LHBYiM0Q1MkcoKDRBEBAQEBAQACAwEAAAAAAAAAABEBEiExQVFhgQL/2gAMAwEAAhEDEQA/APzH' +
                    '3b1T639x82/xF+7eqfW/uPm3+I8ElTHS8vf919U+t/cfNv8AEPu3qn1vP82/8zwyVSOjl7l6r6p9bz/Nv8Q+7ep/W8/zb/zPFgE8SdHL2/dfVPrP3Hzb/wAx929U+s5/m3/meKWGx0cvW/VvVIX/ANv7jF/+2/xF' +
                    'fqvqmP8A9v7j5t/iPBPh7y2s3OBeiPb929U3L/7efL/23/mH6v6p9bz/ADb/ABHhTm2PQNjo5e77t6p9bz/Nv8Rfuvqn1vP82/xHhkSx0cvd919U+t5/m3+IfdvVPrf3Hzb/ABHiWQHRy9v3X1SP+5+4+bf4gvVv' +
                    'VPref5t/5ninAJk6OXu+7ep/W8/zb/zH3b1Sf+7z/Nv/ADPG2R4Do5e1+q+p/W86/wD63/mPu3qn1vP82/xHhbwI3hmOiPd929U+t/cfNv8AEX7r6p9b+4+bf4jwK2GAl9S9Ee/7t6n9bz/Nv/Mn3b1J/wD+39x8' +
                    '2/xHi3QYrZyKR9D7t6p9b+4+bf8AmX7r6p9b+4+bf4jwNwROR0R7/u3qf1v7j5t/5j7t6p9bz/Nv/M8MuRI6I933b1T63n+bf4h929U+t5/m3+I8Mx2hsdHL3fd/VPrOf5t/iJ939U+t5/m3+I8FrxBnexUj6P3b' +
                    '1T63n+bf4iP1b1T639x82/xHz9z6iWWkfQ+7eqR/3ef5t/iH3f1P63n+bf4j5+IgUj6C9X9T+t/cfNv8Rfu3qn1v7j5t/iPAsCzgTpeXu+7eqfW/uPm3+IfdvVPrf3Hzb/EeFPESx0cvd929U+t/cfNv8Qfq/qiX' +
                    '/d5/m3+I8MmHaWKke5er+qfW/uPm3+I0/VfVZw/e/uPm3+I8EfgVtvUvRy9/3X1XZ/3eeZz82/xE+7eqfXfuPm3+I8TcU7zOSTJ0cvd929U+u/cfNv8AEVereqN/979x82/xHh/My18awHRy91vVfVFh/e8/zb/E' +
                    'V+reqT/3ef5t/wCZ4uSVZkbHS8vb929U+t5/m3/mPu3qn1v7j5t/iPDOhdw6OXt+7eqfW/uPm3+IfdvVPrf3Hzb/ABHhbJI6Tl9BereqfW8/zb/EZXq3qn1v7j5t/iPCrYETxFI+h929U+t5/m3+IfdvVPrf3Hzb' +
                    '/EeGWSRVj6H3b1P639x82/xE+6+qfW/uPm3+I8M9hZHRy933b1P639x82/xC3q3qn1v7j5t/iPBLNXeC7x0R6/u3qn1v7j5t/iNP1b1Tan/ec/zb/EeBSau3WqUjo5e2vqvqjw/vf3Hzb/EafqvqeH/28/zb/wAz' +
                    '5m7tO6hqrSkUj2fdfU/ref5t/iNU9U9TdV/9nP8ANv8AzPFCyg1TwonRHZ+reqfW/uPm3+Iv3f1T63n+bf8AmeBvFjcWke/7t6p9bz/Nv/Mj9W9U+t5/m3+I8UpojcZDoj3L1b1T639x82/xA8MzqB0RkJgGG1TW' +
                    'pZJgCCyXUgw1AsuCSyy+gaAzj7veatMMzjNY6srWcgRTu9hGaXieOhLOpQkqxxZHesYIjsnjp0A0ljgVVZjfZvBCbMk0bahGUxVt4GkBehJKTUgPIz35FeRIbTnQozKWo3VMI1FerNIu/DBEV2sEkVqvRiOwnis7' +
                    'rPU1XPFjHQ6WXuUbzYowWUHM9gIIMSkKJfQiRXmiov0KqqDSphMSKtJ9SvklRBn0S1cFBNuhpXeDVciPks3lA9F5MK16nOWdeXKr1OWkgMAH/mMSg7RiYeBbTOJViu4qNL+m5zwMydbY1eWmBynuIrTl0RYUJMis' +
                    '2kk8jpSqtO5SyDLddzxQVqq2c9xWkrWhGsFyZaAc+TxTj7TLeJrlzRzthZMuDcElkT6iYArnqSe0EwA0mZWZak1KNTiJ6IgxILITnMhcQDZq+KRlmnGTZBqil92Jzs26z2m5qqv3lLMrytsOzfcMGDvx2itU9ZOU' +
                    '8KyTZfNqo20yyll1HpZK4I5p81lKhJko+TzNtngRWLeJkbwwLfxMhQUhzqWUQAmAACLBJDycAWAzKdWlMt/wLttZ5R2JAMWVvJYF8qzWKZVwv9K9rAm9zEFmzKuOybbaw6CWyDKma9skunDTYU7q4i2TAVz9iMX8' +
                    'RVn7CWzLnyLWrt4at9ptcXL0SN8cLjTbwNqsqWSjkuK2t47h5XGs7NnbapY2oXRy20qk64T1CyeJvlyXec1GIGowMjEEB5Iy8ma0I3gyjmkajAldDWBdDOCqrmC18VYNVdt14ggzWjc9hbqOOhuqeLZjl8NQMYiG' +
                    'RuCY9Cige92Ejq/wAPNFSI1isWy1rXVAVOicyaV6Pq32IVSjJHTjqlXvIOatMbaNlW6ZXHh2m6TCx0ZpYJdwHHkfJgrKqn+BiLRmjdl7u62DeXcY0KEOJkxNuptuVtMwmm9V/kMDF64mmlDZmsyaeTGi7Ft7YMpJ' +
                    '4GnZJKdUFei0bY9GklFYWLzOtMJOCs5UJ4aG15z8KVUQVqbW6msfM9hxfmzDcPqW3Hd2adpcSJ+w5nijnbQ3esVr1gy8i4I3IyGgKCKTMIApnAizNVzJqAwBR7CAMQoCcAMYK0naX0JoanXoBOTbhVLLNmXX3Fbt' +
                    'gjcuTf8A4v8A9v8AQqMGmvdTMmmnsXeNHTgtnR65HRYXXU80NOeh6K23OttcmZ1XG87nPUmBb+J95EUMNSzCyJKDAu5voDOAA0HEMB+FgTjjzKnsPHx+Oq7T2DUAAQYtlbuOWOZ1vlbuOXYFZ/NUWa2ssN2Rm3ha' +
                    'ALbPsRm3iNLP2IzbMv2O/GpopyOxz4f6aNogalJqyhHPlyXec0dOXJd5xTCtzOeBl4albMziFV4ojyYJHusIysvYVSRGlVLF2RRpYWqzfHi7vtMTTPdl2FryUqrRNpzIOlPEzPNC2kryNv3aNku7uHZbQMYNEq/y' +
                    'vNZFI1PeiiwQJyp11GADVGquqzcMy80SMQOivxrq+41XlwitWzFaqTrxrBvqTwZXJdtbapaC3mQlZpJ6l49O86VxriBxs/chvdDw7jCnPJM68n9Opx7CiY4knEsw5/EKqnsKjSUe0W1L0I9SKWx29iKn+JJyfYWm' +
                    'LkDaSWztNUfvNaGdympK3SvqyC3jczVn/wAi7jk7zaYZq1rbk4gCcuVe4w8kjfLMVnLQ5lwMEAIKEyH2AQwKiasImoFKiACyiSUECS2yRMCvIDLlF3PZGkkY/KyiS+prHZ7TBr8ntCIduHJd5xOvEvdntJvwrN/G' +
                    'zJbZtkAugnDIYACAd4KNB+Fly0I52sgcXjqes8vF/UqeomgDF7umO2Vqyp7satNBGL28SVscMDk03rB05ONNNt49TltUJzLCpEWicOottjtEJXiMCPbiigrRmHDchPEPMo7cd3WqSrMvM1vv0SjqzjxVV7NWmEpO' +
                    'laUdG2tcDOg+W6e7C1dY0NrlrbwpvuKk9sZRlBztx4u1XttMKALyNuqwaU6nNGr2tG3kWOltDEoDWGBG8X0GmZHmBQ52uRkHMOegHNrBGqVTZnKHmao9Ua34HTYlZYYQa48Fczi4NUhb5MjdO+THMpjoWjSZOXJA' +
                    'coZIWRXmJUlGYcqMX0NYTisSazkNcQDzWhNS28SGYG6vE6Uskob6nFYHXizJoUspXebq/dyMVwftOlciDlf+nXvOM4yzty+GtdZOFs8TWA8HBrTEix9hZ7S6KTQStCSQV5I1VIxORpXSGjShQVYcyg57nMxgi+Z7' +
                    '6ulHYINW8T7zfJ4q9xxd223ESLXvaJ0EHTl8NTkHazUN4EejLmCgMAAAAWY1KsyPMBkAAAAUgCw2oJiTcB0XDZ6pGlxKGndHGX0EsTUdfK4/1l28KUbmzjLGIn7Hb/gWkkdqRFawjliTEQbeRDMGkFBHQ1LIpIJD' +
                    'BZAFTD8LNYGbZMDKs6NWWZ6KPkut25Jdx5nkj1cH9NDUW3G2vEzPkVzTafYdQQeW9XVPdWW8rmZ93M9HL/Tt/jU80Lams9S4pE2IsmJcyNGVFiWRqGUjzCt8Vq1s23pgdK8jiEkcFmdK6k0xt8l4wgy7XlpvVBLD' +
                    '2Eawb7UQdOVq1X2M4JRkdeSFuXamc0XPgWQNCAa9gcw+4hdH3AY6FruTmuZNEWuD7Sjatuz8S0NUS9/uM3nB5WepaXxdb4WawZkbTaskOb8pVVzLWJnmfvVWgwcsdRBXteeHac2mnDLg3hqG0cwWJWm1KG5GQINb' +
                    'uw1XlayOYEK6eZbr2jzLdX+JiSSIVbNtyySAUJYkAAAAAAAqyYCyY0IICwIKJoV5IkYFencQCkKFAEytgRZh5hDUAUEIKCFADaIkewBBYWgxEsCQtQFOoyANEaNaEAiABRQQpAwBJAG+4WfusBJ2UL8SDGiPVxf0' +
                    '6nntXSidurg9HEmuNJqGXRsEbSxZLXrVZ+wiMctq7LVnHocY91dxpur43Zxvs8ewwrVVe0qp07iaFbTgk4FQWYeYlAAszuqPa3BwTaxWZXe7zeY3B6FWKeww09tp7GcZfXI15ttrq8ZJCu3KprOuDOKNcnJWyis5' +
                    'GE8BmKoZABSpN4Igab7AGyM2dK8lKrKe05KjepdqA6W5a3dVGE4jkrM6/wChhQnV9Gdm8Xo+nUmjiuayUTK/iZtd2WrfUuVWxWrzT7y+IuaxDqohiZZSK5NQwdGpRjTuNZqRBBq1naOwmIEhldWO8hRYEEKAhdRh' +
                    '/MEIL7owBAKGQAWSAFFWTAWTBAkgBQ0K9CFehAAAFBEivAKLMmpVmRgaJIAApkAUpABZEkGGoFTBBp0IK3+BBIkoCSECNAyBCtAygIV2wkj5eRYJpQIY21eDzMqy+Xl6mXazzszflrqVcdXqauJHL2g67EjO1CkY' +
                    'OicLvMwofUjq0BdSaELoBH2AoywKIIZYxIAgQAAhdRIAGpBAQVGliZRpMmq6UcSkpRjRv+Bqlkp1kzCmdCDNsl3mne1fd8S0nNGW8u8jfvSUH4TdckYbUYFrliNGhPaTJZYElgayMW/gy7iaDA0BAUGAAgAAAAAD' +
                    'EBAQpYYhgSGILIlZBRLMRkWSNpgIRYRkoFhZEYAEKABNAVjABqQqzI8wiyQpGFMBJAVKsrqJRkCFalDd2GQIVZEkASrIlkAFlggAAAAAAPQ1gZ6GsdBH4mGkhN4EjtNP8CNTimgMx1cljow8gugGH4X3lz7w/D7Q' +
                    '08yiQpJGBXJXWKVc5lGVJXkGveaEAQABEBQBAUFCAXQEUACAqBVGpIII8vaVpSR5e0pQSUCQm3kVKzyRBAb2PV+wi47Z6CjJPadNvUbRRyEnTYupNq6ijANxVaj3OpaMCDW6g310QGYEM1vXQm8ehAhob2NzHoLI' +
                    'hJKEWAMBiFABqBCgQwBSFAYkKVEGcwWyghRUsTLzLisiahFkjKRhUAGhUACwCICwIBEBYAEBQBAUgAAAQABHddhqXn/AllTSxlOvUw008cjMJF3Izur0cgVpaGl2Ii5I/LJmcZgCWb2R2laRGm6z2m3x3WhRzf8A' +
                    'oW1ppVdCusWabjCRarVKvqPwJPvPDMS4yLXa7NNxJraocT3gcxibrWrcaiyiyQo5gsiSgEWWRNoCpPIrqNz6B2azIJmElGLLsnGYL5dZxbFGfaJN+XXqx5de1i4Ob6TkV21Onl1SyJFXkkLg5rkayS/Avm36ltSz' +
                    'eFYC4rvQvies779SbrdWdPJv0L5NtYQuDjLGJ28pa3RFXjmHfAUjliIZ1/4dW2Sa6V9opHOBB0nKKrvGPYhSMQNrOm2zxlYZmVGPvZCqmy3Qvl26DCE9xX5afidu4eh5b6ol6bEsU56GW05gg9QABRSrEyWSCgki' +
                    'WFaCbTwJK1LKIEBYZBJjMCGhtwwJnkAx7yFeCIAWZnU2szBUaRGVECiGgyxGgRQJRJQUAlCV0CAE9gUtwkAAcoYgAMRiABMSgZABUelcLL5XYjrK6iV1MNOfldw8rB9dDpur1I71WoHB8fIs1vXeRLiXiTq+jO3m' +
                    '1xjQzbkrasdeoHF7dkrPdl2Hd3q+vccHWsKMJcGrcd6y1aUii8kOzwxgzZOta+9KeS6Gdzc7sW0at4aYAaVFbki2OGhlVcOLRGhtYc0ZYf6CritugGE3W3vKe4lrp2k2rNXTSnAztmW1AGXhAldA1CRvjaScpPEo' +
                    'xPYSXoj01dXV2aWYvCwSjWSX9Dgt70w6nT3K+63L6mtzdbJ9DjCVe0fI67qatE8yix1OdlFU1lqK3w2iDo+SmEJ9o86uMUZjcTd0E/Q6eY8PcUrqR3s8qpGNxNzEGnbkjdojG+3UstqDMFxNXc9WyT1EFgoSpWGB' +
                    'Vasv3VGhIEECcO0kssCAG54dhCwIQEkFhDApEBcACIipFEQmQZABQAAAAAAgANpz3lT6e0wbmUZ1SWiZjUoEIUaARZmdTazRl5lRVkQdgwAFJiNAKgAFAABAUgAABAAAAABAAVHq8p/qL5VdW2bbgGGmfKp0L5dO' +
                    'hoAZVKrJIu1LQJp5aFA8tsMllZ4HS7e1zXN4HK3+dmdbJ2TxyY0c7ra2utTLwrQ1yS2pz2i7T4+NF/A0rTzTlgK2itsJlhVXmQ+hhZNTqQaraLz2DQzWd+J0j3JGjjbJHXiruq9DlbI3x8uydUy/Q0k1g9Q+1j+4' +
                    'UKa4nPzOwk0rp+VnP8ofJhED8pYLGC1Rl1xiDpVe6jFtRgkNaEhmlWUm2NvaWjGIx6m9qG1CpGVmhqWMRGIUxepYfU6eWkpIkSjEdo2o0BRnbUqSkuJUSjCSbYjsNVzfaILRNpYErqMOpBGIZZqXzEkURJkeRXyd' +
                    'CPGrA5sBg0gAAAAAAAClRAiDUjUjgJw5Io8wM5YKLqZeZrVGHmMTVSARQINAXQAgEAoAAANV472UpYF8nk6CjmDp5NsZgvk/7kLg5A1eu1pTMmQgAAIACo9limGrREGknC6nNo3qYNM5ulm5NOtnVpOG8mArg7d5' +
                    'VbBS8zzzzUlRK1eZPPvEQixB4w/9x2ask8cJPNL69pXyXtg2WFa5G2/YZlxWXkR2bzck0LCuzulySnOBlPB44yc4GIhW0/exNz7kHGWi7nkTcWroZNGWXE0IAVA6flOZ0XhJq43ojFsWzU4LuMW1JitLBRIldQnV' +
                    'KsqWFbGFWQErqSa9Wabdc6wyS5yAkqUFM4FxlSRZgdPKvE7kRVs9UdnG32GEpaJRyacvEQ+ptpYmQG3tG2urYkqAqrR6sjoiqNTpW1UgObVIwqV8dUk4FonAzucROAFtWuigqy8KM2yOtVggMruOTyZ3SRxsodkM' +
                    'HJgrIbQAKAIUgFHsKCKY9ABoAKQuQCYAIyCrMy8yrMjzKmiARdZCmIGJAKgAAAAGlaEl0Cv2amAIOyU1t2k2tFq3gjF7aGRL5qDIBpAAAQB5go95CkMKoACBja6zGNf0s2ArxYRG2HJp8Vkm2slJq+MPKztmbvey' +
                    'Vq2UysGi0cIcTGHUybzp3aBVwTLUSWRGmsDKQUnHEMEaCCzKyxGJGBkAFQNrwmD08aXkvDqTVxhRCM21KskS5M+VH+Q1SFdN4JGXlQsYAa5HWzTTbIo6DbaFCzyKsHiQZea7yVzZq2S7zNc2X6HpfhRmrxg1+VGa' +
                    'r3jIxbxMyzV/EzDKAICjUiSACyQgAHpp4V3HmPTTwruJop5+TxM9J5uXxsYOZCkNIoAAAACghQoFkEEAKQsEFwgjxeAQaAKZRm2ZqcTNsy4miKRZlCjYBNAKAABCgCAADW/CI9pkAIAAAAAJqAwUe54IlXKOD5LP' +
                    'UbuTtx6GIr0Ip5p5O0TyvqB6FliU8v8Ayf7ixy9LCCX8C/8AyO+1KXEs41pZ/wDG3tbxNeRZ53YHNr3bSsQoVVisTp/b/wC4f2y/Uy+Dm3WMGZUHf+3r1Y/t6dWPBww6iV1O/wDb8faX+34+0XEcWvckwzrdJVaW' +
                    'SZyYxdZABpkPTxP/AIX7TzHo4v6TXeT/AF8LjCRLFWhLEVH4am01sfUw/DUAdN721j8pEZk0ngAtkjNc2Wz90lJlj6Hq/KjCzN/lRmuZkc7+JmGdOTxM5suCAryCgogEMQwCTeWIN8eDt3MxDecgD08fgXccGn0O' +
                    '/H4ETRo83L42ek8/KlvfcMHIAGkAAAAAABJ9Cw+gBZhBKAFWQQrIGQDgVzAmqJbM00pUGbZlwEUiLgAIUgAoNJIDINwughEo5lLaCFAhSAAAEAPaAJqACi1sq2TiexnoXPhhWX0PKVOCbhXpXJf9GfaXfyvKn8Tz' +
                    'qz6nReFT7GSK6b+WHNVgYf7h5bYZtTMaRmZstyxzRBh8zdlbbilA8+/QiUqV/mXa12+0vgefyE8/k/wjS7lJMF0Fz8ETzuXr/Anm8vU1gZ7YH8IebydWTzL/AKn+JXkcy4mrLKyFZRkABA9HD4H7Tzno4fA/aT/X' +
                    'wuMLIlv9CrIls/YT7Uf9OveyFf8ATr3syVFEkAVrQtczCN1zJo9H5V3Ga5m/yruMVzMjPJ4mczpyeI5suBAIQo6JGlRdTjIliD0KqWpq2WEHlxL7SQemXEyirJHlZ34vChB0OHJ433Hc4cmN/YBxABpADEYgAAAB' +
                    'cRiFAMeo6gCkSbcJZm1xX6YkGCw4NeXZuBsstUKMdCWWJdRZOciiIppcPI8YgvlNZtIUcyxGZ08tfqHlVf5iXByTEo6+VxrNsbOLtFxPXKUMDtt4loE6LKqFWOJdr6HTf2IPkYujlEaCTe/Uu6rzSF/Q5yJOn/Hr' +
                    'X8COtNPwLU9c5EmnCzqFeq/KgMg35vSqA9/B45gpCoqOicpJ6HI0mybi5rtv7Rvie1HGSp4ki1vidErbkbTpv2wY41KsarWORMm/It2lNUsTCslWIxOt4V03lGJjzaJKFlqwORDsr8d8LYNucSW45xoi0ctGLVaS' +
                    'fUQ1KeD6HXl/p07io5RgmC/lRlgQAFQPRwP3Gu8856OHwMn+vhcYSwI/9CrIWz9hFZ/8a7yF/Iu8jKgQpCio3XMwjdSauPT+VdxhZmk/dXcZrmYGeXxHOEdOXxHJlwGmiGlZxDxRNqfh/AoyUQ+gVX0KEhZou19G' +
                    'NrUZkFZ14fCcmn0Z14fDjhiTfgdGcb+N9x2k5cmbfUDgADSAAArUJPqTU1HuJ9HBkAUhVE45BQqzZXauVV+JVy2URBBeJLdLOqaRxfNcnnWJuaOzxcpwiKNcTk+WzJ5lhNK7e4sYHmJHDfYjsywrrbkMO7MSCxK1' +
                    'uLvMAQrW4bjIEK1uJuMgsK1JJIAlWRIAFkSQBa6K3XEeXV5OH0OZpNkgXpajh65A3yvw1/SsQL4RyQCBUGVECAuiCzGGElTSeRFa47Qrdpujb5MEY409rZvjb3wmZ37Vvkxfhk5NVwjjafQ6XtZWwf4mN9pmVKGC' +
                    'QtONkVrK1WlnkmbVruYtVdZ1OVrWlY+HKCjXJW1W3Zy2XlXuU6QYte1vE5N8r/46F/CMJ+6ZNJe4ZGGoAUqCUnbiyzjocquJ7cDrxJq0Zozq4yiWz9hdCPP2BU/Iu8hqqmvtLHcWjANx3CO4lIwjVSwZUyoA9Kfu' +
                    'LuMrMwuS0QWrcmReTxHP2nTknBnOYLgsMKQmJA2tz1Zva/1Gas6EE2v9TG1/qZcSgTb2sjUNYyaxMXq3GMAGc+V4o06v9RzvjbuLg5sGtst4pFXHP5kvaaqMA6eV/vr+I8pfrr+Ioi/pNdLT/AwdVSK2W9QFxV/9' +
                    'iJVc8TVE3eqzxNeXVf8AkRrjqqt33K0IDnyObuOpmP4DPEqXuO3VlGUlOJpKs4kWZUnMQBIqyQjrWjbgzelk3hgSjKVcDXJWlXFceplFZRgFZCoGjK1NaEMZIVgqAYQYVAAECkKAAAAAAXdnOM6ggIoQpCoFRDSB' +
                    'hEx3CGnioE5Fd3ZzbFkVazteJrj/AKiM1ja+uhvj/qIm/arz+NHFnbm8SMWo6rc8J0GDFauzaWikh14ZmyWDazMWrauepb6jOjOvKv8Ajp3HLRnfl/pUG/ODmv6bMG14GYGfZqFAKgdqN7U1oclU6Ve1bUpbM6uJ' +
                    'EIl8Ikqu08kZva1kp0GfKrTI17TFDQ35MUDHoR4EFMLQsohcGkbq11OUucxu7RB15HMRiYSJvfUb+0QdEq9CxXoct7/UN7/USaOuGgk573+o3WtrKa2nqhBZE9pydrJw3kNz/UIOsstX1OG59RufUQrrfkiKpe0w' +
                    '3NpM7n1Kp6lgbZ0Cr2BWulhbAu+/6h6Gx9Bsf6Rv5P1Mb+T9THo1SuFlGaM7H0NUtfdjbRmd/J+pgNj6G428Nm87GU+RuNz7y8llsrWdz1YHPBLtOkJ8SjOuaOe6u1qJbyYVnVyvaAWco7K9kklEnG2DmuRd79o3' +
                    'B23XeEwaau8JOD5G1BN6JNG3Ta+pLpYGXdaIOyjDBlmjLIVtEkqC1NaEWpdAMsAFFIxIkCAAIFIUABAAhQAKgRAKgACBUAgHQIqmcC4kUrkdONPzEycSW1t5zButnilG7roTVTkc2muO3MvInaJwwmC8eFms+rQs' +
                    '63xVoggnDtS/3ZGnTduTeWhlPy0rPHdmW/JOFNdQOFlCwyN8lY4qR7TfNt8tJdTjZt1SnAufSM4lVLPJFeRqr7S0iLh5OhfKus0a3dv8Q7LqS6sFRrNokReehZUZl3UUYNyQc3mwdZ4/0F3U/QKMN5RCIn1cHR2p' +
                    '+gzurPgAxL6mXdnZ2pD92GcEvwLgNsLHM06/jj/AUaVsVJUZghbPF6EkoApAAgQWGBIO1OGazZx0HDx7nutktDvZVjEzujz24rWbcoeQ4mVB128faI4f8SSq5eVXW48un6v4HV+StP8AMm7i/S/wLdGFx8UeJyaV' +
                    'OJasu7j/AEP8B5lP0P8AAnoy68emJPd/SdPMrpR/gPN/2MDnK/SjSraylVUGvN/2sza3I3NMksUBmXXQst+FfwLx8nJbBpNLNs6u9Vm13Acq8dm8cEcuRKtoTlI1fkvZysEsjGPQuDVVxtY595dvF1/ijGPQmPQf' +
                    '0dNvH1/iSOP/AAzGPQY9Cz9jUUJFCY9BiP6i+4X3DOIxAvuF9wziMRBqa9F/EzgMSYgamomvQkMQwLNf8IkroIYhgWV0JK6CGTECyuhHIxBQAAQAAVUC0rucZvoCDAAKiwVEllxCi0gYyFOAlyQdKUSXvzjkbjjR' +
                    'xl9RL6kiu+6iTSUJmV5cQ0zlut1Lut1EHZ343CdZjKR5lVlU47rdRvt1EGuW25ZQkZrxppNsvv2T1NUpdKGh9CeXxL8zGzi6s1st0Gy3RkpE8vh/U5Lt40o3SNj/AEsbX0Yovl1azRtOqW2URccrEnlEGvd6jdTr' +
                    'JPLD4loBd9CN0epPKM+SUatau14y9DgplHR8TqmzmsniXB0vG5z1t/kZnbdvuyEz4s8Z/Aw3LECzltmTUkwNIAQwB6eHjrs3PFs2+OrOK5LKtVVRBfNtqsDGq60pslTmc+ZW3KB58YNT3HK3JZtOcsi5mibn1Y3P' +
                    'qyTLlnXPjtKWGTKOcvqJfVkWaPReqXG+o1HCX1Evqya9p3tyVhVVU3qBySs8pLstq49pqLPN7UZiiztJFNjeVp9odLrSerRYo8mFWyyYo5jA60SvbbZZG+ThrtmuDRajzkkqcEApACgAAAAAAAAAJgAVprNRI3MW' +
                    'ta3icwBAAEAAAAAAAAAAAAABNrFYMAACHtw6IN16Iz0seOGWGsz0tvSCR1xHSx51VvI2uK+Z20ygRqidEcfLsPLt0O0AXRx8u3QeXbodxiKOGy/QbLdDviIYo4ttVSyIndas7qk5l2oUeebrUu/k/Udnx1YXHUUc' +
                    'd/J1Z0duSEa8tFVUtQOLty9pN3M+p32om1Cji7cvVh35NWzttXaSEKOO+/aWt7apnWEvaSEhRzta8awcz0Ne60eZzJcNas5s+8yXCO0uBUZBe0jzKACTbhKWda8F3ngSjC5LVWDgjta2bk714Izg35Vez8CXPwPK' +
                    'koc56EZ6vLamFVz1RytxNfl/AUc0sUerkVVRrI86rGNXiWzbbdsRqsJYo9HJVpPGZ0POniduVxeV0GjnVaLNmt1aKFjbVsimq3LNmGx8g3OZO4FyNIhVZrFEAHVcjlW1Qty2soaSr0RyTNZkipZRismQ0uhkIAAo' +
                    'AAAAAAAAAAAAAgAAAAAAAAAAAhlx7u40uK9tPxCsQI7Tt5KXiukNnCs7z3EpHGAdtnC8rR3gUjYkQhJhoxJiWQAKQoFIBARUWWZxAFllxMyWLaAWWtCyZxEgUKc5JjoIerA1LJLG1d5e4CSwUmADEQJGIBosSQAY' +
                    'txJ6tP8AgZ/t3+o7YAt0cfIejQfBd6o7SstRD1cCjguC/VB8LUS1jgd/4nPlvRRj7yySF0Rvj4nETYj/AHFtKx3nOj3XXVvMcje5qZSLELcnI82Z33/UzINQrouXkX5vxOi57xozzgkK9Hm0t46x2ovlJ40croee' +
                    'WVNpynDQhVtVJ9H0ZW5hG/MrdbeRQ9LGLUdX1q8rIBZz3Eptdluy1Dy7DIw1XE4ZBVbU5LtIVuXGgFdejkyAygaRk1TMmmI8yM1bMywAAKAAAAAAAAAACAAAAAAAAAAAHSnE7KX7terM1irmynohe9rubP2EV08z' +
                    'jphxqX+pnO3Je2b9hgCJVEkBRZBAB6h7Tl5uJfN6mJrTpgQw+RDehNGynPzKl31YmjYM76dSb69SQdCylqc91epJoIOjYl6Gd9VqTfWc8QNwyz2GN6y3F3LqBqS96MJ9GWerA0RvopJujUKyeoFl5ME3TiN0gXHo' +
                    'UzPaWQKCbkJXVAaRHWcySp6dpZU4fiBUo0AJnloBOWfLcM8h6eTkpsabxeiPMb/ymilYgMFQBABQQAUhSAU0rNKM10MFA3Er3cezUwE2nKwZ031vhfB/qX+pPhXMGrUtXHNaNZGVDzKALtxiRtwmU+wCGqYMkG64' +
                    'JsmmM2zMlblkKaAAIAAAAAAAAAAAAAAIAKQAAdOOsuX4a4swdLNV41RZvGxNVi1nazZkAqAAAAAAAAO+1R4Rsr0LunMNmPWk2V6E216FkSPRnYi7KtFksi6M+XULjqUYi7+Q2UGzj7SgUTy6do8ukYOClF0Y8uvU' +
                    'vldGaAujPl36hU5OqZrAYCjOyzzWRdtuhoEoy1ZaE/5JwqbntI7dpRmb/pI3yao3u/3Glfox/By3W6E3P9J23MjYv6HK1p0G7kickdYq80XDTLoxf0OG+/Ub7w+jO6gl1uq1kLn4HmhvIsNZnp406VjCdTnz+Jdx' +
                    'b6jiQpriaVst3YaRg2qWalLA1dLcvd24YojtOBKsYajMhpmSooIUCAACgADVL2rlitavI060spo4etX/AKHMEVcUxBVZPC2K66m9sLclur1QozWpLPQO3QzmABdrJDKAEMQEAAAAAAAAQFAEBQBAAAAAFDcuQAIA' +
                    'AAAAAFAgAA6llmQZaWWUgAoxAxIElJAkCgkiQKVGShVEsgzCEvQidpKWGAnqBiCKQSFqWWIb1Kiba9DSSRIBBcC9xkQnmFakkrUiUFlAWUTzF0GDELoEZd28sDF5wbOu1EvVOr6ouaOBaOLLGO0gNo63Slxbc1m2' +
                    'cpOvHfDaoTf5mHxTZ1TxWb0M/A5ENbLfjhJry2rRd7V1NUYBWkm4xXUgAsIgCEIAgFBABSqzq5ThmQB0d628VceqCqnlb8TmWSRa6bbrtHejCvZZF32E0rXsEGd7G9kmrWoG1vInmMeYxNLi7SbR5g80enhsY2Mv' +
                    'msvmrVD08Z2k2GvMr0HmLoPTxnaNprzK9Cb10Hp4ztG03vQ3roW6eMbRtNbkNyF1PGIIbs00ZKahSFCIAAKikAVQQAbBCmVC4EAGiyjIILIwIUAWDIA1BIQQAYFTJIAuJUmZGIGmICeAkikASSSorkkMu4SFSGC7' +
                    'hKCBJLgQCySRgO8CiUv9SYaAK53rD7HkZOtveUHNpo1ms6hpOy1zzMlkou5xt0JjqJJJAYIUqAAAEKAICkAAoAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUgApCgCAAAAANgAjQUgkCgAgoIAKAJAFIAKIIX2EAAAM' +
                    'C4EkSwBRKJIFAACBiFiAKqyIQmxZjTEio1BMSqXqWIAyDTQgqMwzLqzrJBRx2Mmyx3wJBeiOOy3QbLdDtHQ1tHRHn2WG1nZpTBdqHRHDaxDOzXYNo6I4QxDO0dgidB0RxgQddo2oUjkDs6rQztRakcwdNiG1Ckcw' +
                    'dNiGxCkcwb2IbBcIwQ3sGxi4RgG9jJtZaRkGtrG1ipGQWGIYIgLDEAQFgQBAWABAAAAAApABQBIACQBpJAhSNEASUCIuAgEADMuAEKmIKmwJiMWIsMtQLt6jBdpHIxZA7yrHBCILLfYBHJFJYLLYEBrJYamcdQEr' +
                    'vNKs4kVuwYsDTXQzD1RU4QmQo30CU54CcDLc4BGv8SH2MJqIJD7iCy0VWMwyw32AWWwIgKAomjTcYJEdlogl+IRdurwZI7Stokx2gXb7RDgjsWcAJDCqWVMDWADqliRVYbxgbrdQDTWLJCLZzhmJ7AJgIEgKQSCg' +
                    'CR2CCgIkCO0pJAQIGAkKCBIkCAsiSoDESJAkMbSyQBtRNqKAJtRNpoAZ2jaaAoxtG1GyFoxtQ2GysUjnsJtZ0ApHPawdAKRzABUCyQBVkCCgEalIzjqWUsiBiExLYlAXFkyKMNSAlOZZSwRIkuQCOo3dCS33FlLQ' +
                    'BHXEOETPsNYIDMIueAmRCAJQJ7RjoWAJ3sshtd5EnqAzRILnoWF7QJCWhUw3GGorHtAY5sOSuM9ehI1IqqsrERBZaWSJnmEFElkzKKuoFr2klruLgiJTiASjHMsiOpEpxYETjTEsyyNsqQVVWMcytpLImSlsy3IR' +
                    'asktlVowI3IBdQCFUBpVcEx6BEKTEYgCyQQAKTWDUV7QqEwDakuxxIEHcAEAO4gFwBIAFIAAAAFJIAFIAAkSQoCQQAUAAcwQG0USQpBcWCSWEFC5ELHUBJVBO4EFnoI1GAjtAS8ikwQx9gFl6COoQnoQMEIZUiPD' +
                    'tYDIKX3DvQbAq7CdiGfcXBAWIInoRS+41HQAlGEklzAfRZiY0xAsQHEdpJWoSnNwBarUveZntCxA1m50DwJIl6EUxeJSSJbAuDZcOsESwyxDiAK8cJCXaSrXQrYRLJTBZWgSwkoGXERqVJQTCTUoCNV6GYl4GrPo' +
                    'WEkBmJ1Jtc4MtkkWqbxgB72ZG28zUHOzx7gN96yJ7sMb30I3OgGYLDN4JZCV0FGapNdprEyqzjMB1fUA3DQd30GKaeZuGwOWZaqXiWyWgUFB1gbW8SzoK5tSQSGZOhh4PqUQFa6LEkMBj0K0wlaMJDdtQICpJlio' +
                    'GQVqCQwICwxAEBYZCgAkwBzABpAAAUAEFAAULiAQAAAUamsABoOYJpgAAW4q/iAQXEy51AA0jL7QAL3DEAAuzMmOoAFrE4mtQBoy4kYaZgAX/DLpgABcYIpAIKsyOJAAjmRriAUbcEAIFcjWAAGFm5NYgBUvp1Jp' +
                    'hIBUX3owMqJxzAAvu6j3ZW0AC4yHuAIHcAAqOZUC26QCoyzSnQABqR+IACkYAFxK5AIqV3aZFeWIARlxOA92QCiuIJoAAxGMgBVIAEX3gAFf/9k=' +
                    '" />';


var mwapLogo =     '<img src="' +
                    'data:image/jpeg;base64,' +
                    '/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAASwAA/+4ADkFkb2JlAGTAAAAAAf/bAIQAAwICAgICAwICAwUDAwMFBQQDAwQFBgUFBQUFBggGBwcHBwYICAkKCgoJCAwMDAwMDA4ODg4OEBAQEBAQ' +
                    'EBAQEAEDBAQGBgYMCAgMEg4MDhIUEBAQEBQREBAQEBARERAQEBAQEBEQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQ/8AAEQgAUAJYAwERAAIRAQMRAf/EALEAAAIDAQEBAQEAAAAAAAAAAAQFAwYHAgEIAAkB' +
                    'AAIDAQEBAAAAAAAAAAAAAAECAAMEBQYHEAACAQIFAgQFAgQDBQYHAAABAgMRBAAhEgUGMQdBUSITYXEyFAiBI5GhQhWxUiTBYnIzCfDR4fGCFpLCQ3M0NRcRAAICAQIEAwYEAwcEAwAAAAABEQIDIQQxURIFQRMU' +
                    'YXGBobHBkSIyFfDRBuHxQlJyIzSCsjM1YqIk/9oADAMBAAIRAxEAPwD41teJ2890IbdfQ1FUg1CmudagUyx4i+5slqz22PaJstO3dqIrmR43hDkEsgNclPTKtevxxht3BrxNq2VPEs+2djLeScyvblgw0iOrEAnx' +
                    'Kn/HGO/c7cJH9Hj5Fqg7E2iowMH7rHPIgAHpnmMZX3C3Mb01ASXsgscpjuLEKtCGfqevxoTnh1v3zJ6agOe0a20Rie10nOigAChzFcz44L3r5h9PQis+11mZQjAgyVNCQcxkfpFM/DCPfWJ6egTN2vs0QyW8MjMh' +
                    'qTQUFMvn5Yi3rD6eoCe20M8pMkLFzWmkkLmPEg4tW8a8QenqCXfbl4rfTpEjZBWVqNTpmVORwy3gPTVA4e1k6n9qP0nUWUMx6nOvxzxH3AHpaoZw9orBovb1yRMR6odfpNPKlMs8VPuFpD6Woztuzn3MaoZKNk39' +
                    'XzHzwvrnJPT1ILjslBCg+6ldGT1IhNHYMaZZ0zxYu4MHpqjC07P2Mto6vVJk9VNGfp+BoD+mKnvnIfT1Bl7TQe5UqW8UABoK+eH9YyeRU/XHamxt5QdLSLlpAqFBHTx8MD1zB5FT8e3kChliqp/pXOhr4Yi3jD5F' +
                    'SG27cv7jyEUU+kkBqgDzr4VxZ6xFfp0MIODSAtG6EJWgoDUDAe7D6aoVHwOGWQhC2qhavyHlhXvGD01Sa07f7fIB7kLSnyAYYre8YfT1PJO0cVxdO0duywt5k6h+gGeJ61h8ioFN2iFvqnt1aTVk0a1B8gc+uWD6' +
                    '5h8ip+t+1VxHkkLl/q9RIqehOWC96TyKjKPtmF/Yu4npkT6tJPyxU97bwJ5CD4u2m1NqLWxjrUDMnI+NfPCesvzJ5KCIO12zkpHMGoTQE1ND51GD625PIQzg7VcfjnjdwWpl1ND8KeAwvrLk8lDC47X7A6DTbEA5' +
                    'BqnMfphfVX5k8qoul7RcficyFf3Cvp8hT554b1d+ZFiqeJ262q1GkxZkeBqWHwqaYR7m78SxYqk0XD9oWN2FtrA6V61/jhXntzD5aDouIbZKCTCEB8PE+OB5tuZOlHMnC9sVgqwrQ+ORy8cN51uYOhAU3CNpkIY2' +
                    'wYHwGR/xwy3FuYPLQda9rdpmjad4AsZHQ0rn4ChwPUX5g6Ucz9rtjkoYrMIUICsPpI+IwfUX5i9FTiDtVsqtoEKqxGegZsPM5nLE9RfmHoQUO1W0Agm2B6VyPyxPU35g8qoLd9qtiYhRBpIOZqw/TLE9VfmFYqiy' +
                    'ftLsYd2gZ4pMiVOYNPAUBw63dyeTU5h7NJP6ChJNSWJZAAcxhvWWF8moRb9kNoTRrgLMMz6qBj1pQeWA93cnlVDv/wCT7UaxRxlDSpRTX/HAW7vzA8NSNezFswJVSmnPSa54dby4PJqep2a2xpGj1gvHpMilqsoY' +
                    'emoHT4VwfWWB5NQyPtRtVqmuRGYUqM8sL6uxFgqdrw/a1rEIRQddWKnmtzLFiqCvwvankCvbgerIg0K/EYnn25jeUidOHbG0BYW6kr6ZNOZOnKvmKjFfn2niN5SFtxwrbChjt4RHqoch1oMjmcHz7cxvKRXLjtvt' +
                    'LufdgWMN9WRrU+H6nFq3V14k8ioK/bfZkkWRoKsBRVQkgjzoMH1d+YfIqQRdutniuCI4PbaT6QKgk+PWtcF7u/MnkVINw7ZbPNGwlTS7NRqnMD4fDBrvLrxI9vUAParjgiKKhaT6QxY5U6EU64t9dk5lb2tRVedo' +
                    'dohmIXWGXIOSaHx+I8cXLuGSBPR1AZO0O16KKzmRc1o1AB8cWruNyt7SpBL2ns7ZS0yudX9St1U9cv0wf3CwPSVIIO0+3O5mWOYKRQJXwPiaYZ9xuBbSnIbf/wAt2i3SN1icuE/zZZdP4Yoe/u/EtW1pyI7jtltJ' +
                    'RHj1R+as1APPM0xFvrjPa0PTwbj+02rXFwooCilj0q5oKVI64Hq8l3CD6eiUjG37f7I/ufawMxajVDBs+uWfiOmKXvMnix1tqEF12w2iesW4WnutqDKhZgxPh0Iw9d/kXBge0o+KCZuF20GlHtQ0h+lzT0/9q0xW' +
                    't1bmWeRXkdvw2zUszW/7YU63FAwReuROdBhfU35h8mvIBueCbDLbiOJtek1JVqDT4dACf44srvMqYr29IOTwLbVV5phUspc62zov9RHWoGG9ZfgL6aok3DgtrcwRiFDo9Lhjqoynqc6Y1U3lk9Sq21q0LZ+CWzsG' +
                    'WNWNSyk1Jy8DSnyxct5bmVva1Fs3A7KW5C38RijqW1oQKlsvA5fxxct7ZLRlb2lW9UD3fbuxO3re2sjKqs6muf0tTwIp8cPXf36oYj2VYlFO3DZ5bQeLpT1MtSa+XQEUx1aZuo52TDBsnD9puknUj9wMGFVzHq6d' +
                    'KUOPNbi+h6HDXQzb8n15Pw/f9ln2/e7m3tr+2k9myt2kt1iELKCSyN+4WLE1I+GO/wBiWLLjsnRNp8Xr/cea7xbJTImrNJrhwD73t/z2TsPH3lk5/uStbWUDxbTGZY10G5EFGlSYEn1atRWpxKbnB617fyq8ePwn' +
                    'hBVfDl9MszyPhw+PvDPx32rup3847u3DpOe3+02GxTQXQkirNdStda10NMZo30LoJC1IqcTuj2+zvXIsSs7KPZp7IJsVm3FHR5Gkv44iL8fe4nPtk79bfxOffrvcrG7vJtrvIbyWS4WSOMvRlWRm0uCgII+XTGju' +
                    'e0wW2buqpNKdNCnY7jKtyquzabjU+p+ed9OzvGt6uOKco3y3hvIAFvrfRPOYmPqClrZCA3muqox4nB2vdZaq9KaP3fc9Rk323pbptbUX8a7x9ned75Bx/YuQQz7rc6ksbVYZ7ZZWGelWlRRqoMh44Obtm6xUdr00' +
                    'XuZMe+wZLdNbamFfmHzLmnHec7VxHbdzl2+0W0jvH+zkaJ5ZpZHSruhBICrkOmPT9g2uK+G17VTcxqcLu24yVyKlXCidC0cm7f2nb7h+8c4j7h3/APeHijSxfdb1jbwXU7qSwjhRqtp1BRoNOtPEc7BunuMtcXk1' +
                    '6Z16VrC9rNmbB5ON38xz4S9JGf478ivtx4jyLk3POXW+8QbZOjS35dhFbxLDqOszQwnM+WK+7beqy0pixura4c/myzt+ezx2tkvMePIew/kR2AC/6nkodmbqLO7FF+YixjfZd7/k+a/maP3Pbf5vkzQu3vIOE9zL' +
                    'F924VucV9BbM0E2mNlZGpUBkfSwr1FRnjm7na5sFunIobN2Dc48qmjkyf8zbTk2wcGseRbDvsu220V9HbXNlZ6oWnkmR2V2lRwdKBD6adTXwx3/6eWO+Z1tVNxxfh8Dkd4tdY1ato1Fn4nXm48l7R8tu97vri+u4' +
                    'bq4WCe5mkmdVWyVgFaQmlDn1xd3zFSm6xqqSULgvaVdqyWtgu229fsZb+J3IeTck7w2m071vV7d2j2l6zwT3U0qErFkdLMRUY7XfMGKm1brVJyvBHM7XlyWzpNt6PxAPyJ5LyjY++u9bRtW931raQy2axQRXc0aK' +
                    'Gt4iaKrADM+WLe1YMVtnV2qm9fBc2J3DNkrubJWaWnifYPL+5faztpPabbzfkEdhfXEKyx2xjkuJPb8HZYlZlB8NVK0yx4PBsNxuE3jrKR6rLu8OKFdwxTYfkT+Pu77jb2FrymNbi6kWGMy21xFGzSGg1PJGqgV8' +
                    'WNMaLdn3lU26cPaimvcdu3CsPuZ94Ozfbfe/7BzDforO/aJJXs1hmn0pJUozeyjBSRnQmtM8U7ftu5zV6qVlFmbe4cb6bWhiaT8kewElyNqt+SpcTu6xRpb2d1KJHYgKqFIjqJJoKY0ftG8iejT3r+ZQ+4beYVvk' +
                    'wrc+/PYjju+z8Z3Tf4Le/gYQzpoldI5KZq0qoUUivqzyORxXTte7vTrrRw/cNbfYa26XbUBtvyf/AB2WQBOTgMTQAWV2a/AUixb+zbz/ACfNfzK/3Lb/AOb5M1+EW17bRXNjVlnRZkjYGOTSwqCVIDDrmDmMcOya' +
                    'cM6qco4k2/8AbACUaoypn8hgDSG2O3a/bJUlBmDSlAOuIBsOl2u2nOl6Ev0Y9afPABIM2zQJLKkbFiciAK0NPM4hJPTtUkAEWnKnqYGhqfEj44gZGlnsIEKSaCSfpoAaeOHKnYlfb9HoZSAvT5nPwxASK5rP9wsK' +
                    'MVOanqAfDAHTAruxSZD6ehqqdM/n4Yg6Z7DtSyAIoMdTXSKsvx+WICQ5uNSIAWkAoPSPD9METqIhx2YsagLTMMR1wZJJIvFyWDS55fSMq/EnEknUHrtUvtiEAhUyVTShJ8qYAJO4bDSwMtSOtR4U86YMgZN9lGGb' +
                    'QQW8gBkcQUG+2lJVnoDUnTT+HTAGkjawSlWRmzGoefjiDSEW+1x1Sd10IfUFbEA2HXFtZBNS0I86V+fTBETZDHtQCARt6WzqPVn8cQPUeR7RqeoyZT1IzqMQjsEvDIoAMdPD54MiwZvxrYeOwc3u9/2+/wDfvr5r' +
                    'lLhfcrqq2oqR/u6cvKmL7ZLunS+CH6UW++iOllJ/8cZwoQyxF7gxD0tTUDSgIB8/HEksg8l2+5NWGWnof/LEkIJDNPaTmoPsHJwKVBOWrE4hgNntFKAl9VTkw6YrkIsuNuNCygklqkNSmQpgyMgSfbY4mEki6Wyo' +
                    'sfQgfOv8sCRjmKxDtLSPQXopZhnT54MhPLjb0UL7wqpIqVApl5eWAmQDnsrNRpgBUN4BV8M6VwybACPt7THRKgoTqyCmtPLP/Zh0yEH/ALfiuQXI6VpVc6eIB6AYPWQ7udgtHCs1TQZ1z+GIrshG+220KMkSjLIM' +
                    'SV00Fa1+GJ1MkAkm3zSiBZkRkk+mQekCo8szQjzwZCdx7RbxgIyj1UGpjVjUUHpIoBlgOxAKbjrSXUc8lZEhBKPUnNssly6YZX0JA/sePR+0sKRgRiqvIB5GtBTFLsEnm2MBHjC50yPUahgKxBTeWMivQqFIFfdG' +
                    'keQNB/icWpkBJ7G4los1JEoah0Hh0zrSmBKCBtxmGWVLmSJWeKtHp0qakAdAMP5jiCQSHalj9YVaqDn8+mZ64XqCCTbYaliAyEaSueZwVYkAF3slsoFBpYkhQT4n9MWLIwQKZtmtTcxxXo1CQlUBPoPwqcq4tWVx' +
                    'oDoFm58cjhhLIiIIiSdRB+k+mlfGueLaZnIlsZQ+ZWb2tpFGGjVlZBUOq6g2dRT+qvXHZ2t5Zy9xWEa/wrjz26xzLFragqwIof1yOOTmvJsxKDFfzhtJbXc+HNKVJktb0+k1pSWPHq/6cX5cnvR5fvbm1fczSNyt' +
                    'I1/AZZ/bOo7ZbHX4f/sUxzqf+4/6n/2l9v8A1/w+4l/6dEatdc3kcLpjTbWdnNAq6p6n9Mav6mUrH8fsVdkf6/gY32LaG5/KzY5IWWSKTfLpo3U1VlJlIII8CMdzuCjYWX/xX2OXtH/+te82PuT+R/Lpu+tz2v4H' +
                    'xzY4THuQ2aK73az995rky+0ZZGUjSpbwoT444W27Vi9Ks2S1uHVo405HVzb+/n+XSteMarxMc5zYct2/8n7Gw5wljDvUe7bMt4u0I0VmtTAU9tWFR6CK/HHc27xvYPy56em36uPicvN1rdLriZXDh4DP8x+B7Pwb' +
                    'vGlhtInpuVsl9dyXV1JdTSTTXEqs7PKSRUKPT4Yp7HuL5ds3aNHChRpCLe6Yq0zaeKk+hO6PYjgHa/8AHXmm5cWs2FxeWNo1xcXUjXM1Vli+lpK6QSxyWmPM7PfZs+9xq70TfDTmdrc7XFi21+lcUjM/xY5HY8H7' +
                    'CdxucX9h/co9puoH+yYKVlZ0SNFOsFQNbgk0JoMs8dXvOB5t5ionEp6mHt2ZYtvks1MMXcZ7h94++nDebNtO18Ys9u2Pbppd2LWLQ3H28kMpJgZS3rCxmhNM6Yty7PbbXLjm1229NdJ04iU3WfPS8KqSWun0HX/T' +
                    'qs5rvlXNFi9WiwtDorQE++1K4q/qZf7dPe/oHsri9vcaf+fNrNb9mrcSII1G7WelB0/5M+YOOR/Ti/8A1P8A0v7HR7w5wfFfcqn4Q2qT9kebOxoy3lzoHiT9gvTGzv8A/wArH7l/3GftL/2L+/7GNfhHEJu/Vih6' +
                    'fY35Nf8A7WO53/8A4j96OX2n/kL3MXflbCIfyR5DEDUCawz+dtDi3s//AAq/H6sTuP8AybfD6G6fk9+RO5dseZ23C+L7Bttzdx2lvcbhuW6Wq3JkEyAxogBUgKBmSf8Ax892rtVc+J3vZpTok4Ovv9+8V1WtVMcW' +
                    'YV+Ulj3DsuVbG3caLaIby421JrNdiheGH7d5ZCDIHA9da9PCmPQ9oeF47eV1ROvVzOR3BZOtdcTH+EaflvEiXPbiVVAabiu3O8lBqc1cVY+JoKVxT2Xhl/1ss7lxp/pR96cI4Xs8XGdlvhYW6yCzs3WUW8RcN7KE' +
                    'MGC1r8cfPM+SzyWUvi/E9firXoWi4I+Jp/xN77cJ7nryDYuORcn2/bNwS/tJ/uLeKK7jWX3VV0lkDqT0YU/jj3y7vtcuDptbpbUcHoeTfb8+PL1KvUk595b7/wDMDd+Bc1finPO2m1bbNt06R7qlsUluIAwVyUNC' +
                    'jMAwI9WMNeyVy4uvHlblaTwNT7m6ZOm+NKOJ9abfcNcx215a/TdRpKjkGumXSwNPkceItWHB6mZUlxfYSXfUdWkDL+r9MVwV9QZaWBEZqKdNdRnTBgWTv7OJwyUIByrXxHTLEDIK1o302orIGq7L/TnhQyG2+1en' +
                    '3Jf3HpmxJzz+ODArsFomQK0QDqo8R/34YQCmitmkdCSshWoJJwo4tntpJFHsIzCvUCgwGMj2LYbi4Gt/2zkQKjp4ZHEQXZEkthewiigFVqWoMzliCyiORbyG0jdQBQ5NmTRfDPBDpJxa3sn3BacAoerAnLPrl1wJ' +
                    'D0jp4lMSSMR0qAD1Hnhis6U+6hCHIj9fnXEkkAzrHXKtcq0J/jWmIEjPsrIXDaT1J/kMAJJ9uzVd/WK+lqZUwRZOZIodC6W65EdcgcAKOruRWVIR6ichXwH/AJYkkRza7XOdSu/7bjLwpgkbJX2x4E0LKVNQwAJy' +
                    'xGidUnUFxMpCy+vwBrT554kgaMt7k947fZ/urPYjqWzikuLy6+ptMbe3pjHSrv6FPzPhntw7d3a9rj+PcRvpUszbbOVbnte93b+7W52qHbp5nQKATdI5loD4KXWg8h8cab4k6prxb+Qa2ctPwg2HhnNbTk7S7Rum' +
                    'mPcI6rVMlkIAY6fI6TqHw+WObfH06+A704FmTZdvtyZI1qzDTrdi5oPmT/LFJOpgN8pCmihRTIjIYg6EF1A7xMqU9R8sFDgwury1HtCMSKwAqSQAQc/44kSQZQQq8au5Ols88yKZeGWK2E4ktvSTGrNnk3nXy8MA' +
                    'Y5+1ZqU8qEdf1wQA0+33Lp+3pBrUEglT8KYgRe+1QlTSJSAamgoKnOvlhpJJ4dtZmVvUCua/LyxJCepaiNmYLpJ8ulOhGeJJDqSy1Ufq1KKK9PkPHAkANJtkgj0uxlVs9DhafAdBgyEjex1ZMSrClAPAnLpSmJIT' +
                    'wWiIpLg66e2jA1pXKuXx+OJJDmztHaNSfUVJXUp1DL4nPEbIN0ijEAKkmnUfEfLCgOJIkZVUNVPM9Scga0xCAku2LcyfSpDCiyso1U8vMDB6gkc2zuM2HSgFDkQPngySQd7empiKUz+GBIwFNaqwOoEMa0H+9hpI' +
                    'Df2uSZGCBi+YDDJf5eOD1QECn24iMCdQWUZEEjMeGeB1DpCi4tEJjmaFVGo5ZMVY+VR/PE6h4K1u8cFw0srRtKdJUquRb/tTrjZRNFTaM/5+um0jt7aD2WqvqelVAGYGkHHZ2S1ls5e64aG/cL22KzPtxRikjEmO' +
                    'tdTef+zHIy21L68Druj+L/Fu+020Xu/7nebTJtccsUcdksJDCZlY6vdUmo042bHu19qrKtU55nM3mzrnadm1BfJvx241edkV7Eybnd/2sW8dmN0VIfutMdwtyMqaK1FDl0xSu4WW69RCmZjw4QN6VPB5U6GHb72V' +
                    '2r8ZOO3fB+227Xu78p7pTW2x7ZFdCCsCrr9+dRCoNEjkYsT0yx3qby29ur5apVxzZx9DnvbrbVdaNu19P7TDewfb7Z+3P5Y7TxHnF/Lb3W130kG3zRqscc10UJttfuV/bmVqCmdWGO7v89s2xd6LRrX3eP4HL22F' +
                    'Y90q2fB/3fifWnPfwl4FzHuG3czbt23Pi28ySJeu+2NEyteI+v7lfeVmRyaE0NK5+ePK4O85ceLynVWrw15cjt5e3475OtNp+wS7h+C3GLnm1r3B3fmW+bnu1tc2l3Jc7g1tMZ5bVkK+4/tg6fQBTwGWLP3zIsbx' +
                    '1pVJprSfEX9so7q7s2x13u/EbjffHl0HMt53u+2+6tbaO0jgtEhMemOR5NR91WatXPj4Yy7Hu2Ta43StU03Osl+52FM9+qzaLB+SEnC9q7H79tXOprq22SSC3tZrjbo0e5Le7H7ftq40FmYAEmgzJxT23zHuavGk' +
                    '7TOvAt3nQsL6m49nEzX8Tu0vbzfOwm9wx293e7BzW5uY7mx3OSFpES0ka3RlkgWOjekPUD0sMjjp923eam6T0VqJar26+Ji2G3x2wNaxZ/QYcW/BfjXE7HcrHjvO+S2NpviNb7nZ2klrCtzCUZVWRhF6gA5yNK5j' +
                    'C5O+XyQ7Y6trhxBXtlaSldpMu3Yv8V+I/j3um7blxveb7dJt4hit5Yr0QBUETmRSphQZk5Z4x9w7nfdVSsko5GjabKuBtptyWju92i473e4tccN5XE/21wfdhngektvcJXRNGTUalqRQ5EGhxg2m6vt8ivTj9TZn' +
                    'w0zU6bcDENg/6fvbvYNwtp5uS71e2SSrJc7UZIoIbgACqSGEK1GpQ0INPHHeyd/zXX6ap8+Ryqdqxp/qcEN5/wBPPts27XW7bJyPeNmjmd3gtLZoWECOa+2rsusgdBU1phq/1Bm6UrVqwPtWKZVmjFOU9mOxWz94' +
                    'dt7bbrPym33m9nsLWO4Eu23MTvOViSd3cl/WRrZaemtAMdrFvd1bbvIlSFPNfA52TbYa5VR9U6cj6o71fh92770bvab/ALrd3e07paxLbTXm3iKtxEgoglSUMKr4EUNOvhjy+y7tl21XWqTT5+B2tzsceZpuUyn8' +
                    'u/BLjvM5be95Xz3kO63NlD9vBNdtbS6IVJZUWsfpUVOWNeHvl8Sapjqk+UlOTtlbtdV7Ma9xPwz4j3aTjsm575uFmeO7bBstubdIP3YrcsRI4ZT6zqzplija94yYOrpqn1Pq8fEtz9vpliW9FBv+z8ZG0bDa7NbS' +
                    'M5s4IreOaRQSREgRSQKCuVTjhXt1Wb5s6S0UGIX/AOK2/X99dX9z3c5bHNPKzsIbmGKLU51UREACr4AAUGO1XudaqPJpp7DnW2TbnzLFS378CO3cm+x8t3/km9b1LLNC97DfTwyG6KIAwlmC+56tOdDl0FMa133N' +
                    'WnRWtV7vD4FC7Xjtfqs2zbrW0jtYIYoY9KRRqiKvQKgoFHyAx5t6uTumlNbKWEiChahp8KYWDNJz9rqV/I+A/wDDAgMkIhooKks3RR8cINIbbWdE1Fanq/TOuIkK2dPb5golaDpWmI0RMHmi96QQ10qOtMqnCjI9' +
                    'WxiZNCgkf1Hx6/HBgEkxgjjCQ0CjINXM4Ip1MkcDa/CnT9cR6EWos3J3qSvpAyKCmZ61wrZZVCyk7gQ0olTXrmevngDkE9iwK6HpmaqPL9cAKYHebtPtapFGVnWRtL6zTRQV6jPPBSDEjTZ9x2toVk3G8jjdw1Yg' +
                    'xGS1Pjn0wUhLJ+BI2/8AHUR5IJmopCOhVwwYgEekitKePTBgCTFu473t4kT2QLgFmDkMV9sDMGhXMHEgdJjbb7NLuyivYnoJRVog2oHSSMqEdaYgjep+uLMTBViiCvl6/H+GAFHcVhcReqSNZKeJyIwCShpHLHIo' +
                    'Q+mQf09P54aSuCO4jLrQtStaYAUV7lW4Q7Rx7cbwyi3ZYXWBjl+4ylUp8anDVUuB0j5d3TYUvYdwi/uKIb77NVYKW0pZCuk5/wBbVJx2qZulrThPzBbHM68Y+RNLs8Um5b1ucd+td3ghgWMrlEYaAGtc64RZfy1r' +
                    'H6W/mHo/M3PEeceP9t5Bb7vHeRqIzZl1zBrbVVzmcw6GmKLuaxHP5lkG/S30UhWaDSY2zUqcmBzBxywQR3Ultcj9zI5ZYgUKLiNIXcAAqMwDiDi2/CzjRFHUdTTz88FBRJt9reBfamLpAa+jwz60NMBwRsYf263W' +
                    'L/TuUJ8Q1BX5YgJZLBtMvt67iYyf5StFC/wxASDEZmGaQiZTRDX6wf5VwjQ6P0dg0z6ZEIIrmD5YAZP0m2aTrFQK5g0JHh/PEkAHJZMBqjGZrSuIE/faSLQkZrnnnl5YgZIzUBRo6itfjiEBZoFZPWCtDWnX44gT' +
                    '99qoAJFNQotcEknnsswCgZjqfAYgQmG1kLhlAKmtQcqADwwJASNYP9asfGtQAaYhJO0gSIDX5Vy/niEIpYA1MqD451GAQUXStDGMgScyB4Z/HDIdCsxT+0PuSJSQayIvt9TkKVPyrh5XgQgSSS2uVOshGYBszQKc' +
                    'jliPVBQTvVusFp7sUkepgP2vq1D/ACj54rrqx5KbcXEqXX7sYXVQrEDpApl8sX9KgksQ7hG0QanV8ldGFK+NcssaKiMofNNvWS6jSRvfSgJAAKhq5ZjpT5Y7G1tC0ObnUm1cK3JCBcRuQV+ok+mnSnzxx88mii0N' +
                    'f2TdgwiSlApqxPU5V/wxz24A6alxi3YUFwSFUfVXMBaVwU5I6ny32+7vdpuYd/uT93Oa8x2raLPjCtxzg+37heQxyMGzvb5UcggOfQjeKk+WPZZtpnx7WmLHRt2/NdpfhU4FNxivnte1klX8tdfxZjf5yXnbHet/' +
                    '2buf2r5ftm5brbSJb3kW23sMtxRGM0E6rGa1jYEE/FfLHZ7JXNWtsWWjS9q/FHP7lbHZq9LJv2P8D7T7Ndy4O+XYzbuc7ZePY7lc232m9yWpjM1tuUFEn0B0dV1GjpqU+lhljym72vp9w6NSlw9q8DtbfP52JWnX' +
                    '7mF/ht3f7pd3O4XMuOc93iTfrLa7NZ7G1lht4wki3oi1kxRqT6MdnvOxwYcNLY6w2/byMHbt1kvksrOUl9xH+WPeDuz2q7zcd43xTlNzbbbvBimvLGWCzkiSt37JSLVBrVNI8WY18cP2vZbfPt7WvRSvfy94N9uM' +
                    'uLLVVs4ZeP8AqE7LuB7M3e5Q7nLa2dpPbh9riSMxXPuXMar7rMpf0fUukjM54w9hsvUpRLa48tDV3RN4Hrw+eou/B7aNz2XsHt/Pd25Xd/2FTu2rjckdsLG39q5YvP7giE9fSTQuVzOXTFnfLK25dFVdWmus8OHI' +
                    'Ttiawqztprp4fzBO2XeHvD+VnNd7tO32+PwDt/xsp71/aW0U+63skxYRIHnV1QsFZiAKIBT1E4fcbPBscVfMXXkt4T+VfgV4txk3OR9D6aL8WD9zu7/eX8VOabRJzPepOf8ABN7k9qaW+hgi3S1ZANftzW6RBjpO' +
                    'pQ4o1Cvp+rB22z2++xvor0XXKYfwZM2fLtrJ2fVV8+KHv5j93Oa9u+33He4fazkclpb7zNbLbaYbaaCW1uLeS4STTPC76iAueqlPDFPaNnjy5bY8tZj3zPAs3+e9MavR8Tvgmy/kv3e7T7Hz7ce5bcZudwsY57Gx' +
                    '2rbrU61AKrcXcjjU7y01lU0qoIAGDnvtMGe1Fj6kn4t/gvcTFXPlxqzvErwX1K9+Lf5M9wt57rbn2E70yRblu1s93Dt29pEkUrXFjqMkUgiVVdWRSyNpDZUNa5aO59txVwLPh0Wkr3lOz3eR5Xiyavn7jJ++jFfz' +
                    'r4uASB9/x/p1/wCcuOnsv/W291jJu/8Am1+B9md7+9HbrtRx8tyvkjbBf7pHJHthtYBd3taUMsUGll9BIzcaK5Y8hstnlz2/JWUuPgvxO9uNxTEvzOJ/E+eu5vcrvRxbtnN3E4ryrljRRRwXMEu+8f2S3tJIJnVQ' +
                    'XEYEq6g4K+n9M647222+3vm8u1af9NrT/I5ubLlri662t8VU0/8AHPuPzjvj2FXkG5bmds5CtxdWsu52EMKM7W7KySCOSOSMVDgMNOdDSmOZ3DbY9tuulKawnDNm0zXzYJbh80UT8X/yM7nXfezf+xvfPc1vt1/c' +
                    'j2K5MEMH+ptau0Y9pUBWaE60JFfT8cdDuXb8K29c+BQvH4/yZi2m6yec8WV6+H8e0Z/k5yv8i+A9w+JWXarfmvE5Vemzg41NDZOGnVhIFRmiVxCUNHLN6KVLZ4r7bi2uXFd5ax0qZ1/iSzeXz0vXy3xfDT+IJvzG' +
                    '/JLeOzuw7DsvHbGOHlG+xG6uI7rTcRbaiKquAFOmR9bFVNSvpJzxX2rtldxazs/yr5j77e2w1SqvzP5FCblO5Lw1Nyfvduj8pa2972IdqK7elwyahCITt/qQE6a6qnr8MaViXmR5C6J56x7+oTr/ACT5r6vdp9DV' +
                    'vxZ759xu9XBOQbRz20n2bkGxpEF3qC1+0+5t7gOqyIsqGMSxsmdFK5g6euMfc9ni2+SrxuavwmYj7D7LPfLVq6hrxME7U/kT+UfMu6nJO2/G94O/3pS+tNpl3OO2S221YLkK17O0USFtEYKgUILsPSemO1u9hs8e' +
                    'CuWy6VpMTL04LU52Dc7i2W1E54xPh7T6i7IcI788S3q/ve73Pk5baXVuqWVgkAi9i5EquZFKoo06KimXyx5fe7ja5KpYcfS0/kdnb4c1W3e/Ujc43l0hkWlfE5Y5Empoile5WrDMEUNOtcK2OkjhVkH7rgZjJc60' +
                    '/XACDC/koxUEFTkTQgAeNcDqD0nkl43/ANRz8QMh/LEkkC6fcbgExwvqRugYk0wJH6UDTXU+VRUeNDUYkjQiJJ7hiQqEjPJjTEkkEV5dPaW8k0isFiUu+mjMQPAV8cREgzjduRW+43izKrK0ZD6dMiksKKNWgUYd' +
                    'ciT4Y0qrSHgC3RVtAsMupHcCN19ydslOo0Kg51PXywa6kIbRo2vYWGsAEBXrOclFP6wB/HBfAg/3aS1Fq3ue5RJwCxeeuoKenp/ktVxWpIQ8a3iy2jkEW4xagzao2ylkyfLJWVRX5nBacEalGuxbhA6RzVqXCsGI' +
                    'PQio8sUSUwTfeAsKtkehy/wxJBADPvO3axSdCRkDlUYg3Swqe5PtiWM1Ug0PXr1xJAkZ33ZvGueNPtlpOFuppIisAABdAGNSP8oI/li/C11S+A8GLXu38hSNlsox7n38ftqVSv2K6DIDWnT1f72OlW2Px5f/AGFs' +
                    'reHP5H6fb9+TcN5VY6WzwxrtEYAI99oWqzEZ0L0+rLEVsfTXnP5vdJGrS/kTWG272RZJKDqFqTduNP8A+XrjB/QDV8K/phbWprHPT3BStp7vmb/HJtU8Y9idXTopU1HTzxx2PqC3EkULmJZB8DkaYAyALuXWQVkr' +
                    '5mtcsEMHtu9rCutjma0HniEgLj3CdVBkj1KATl/3YAII5bwz0MSka/PwxAwdCe+iX2YqFKV6HM/riSSEDNHPLVZFIr1ODIAqymt7fXHds7kCkdCemAQP9v3rZZ4K066HzBp1FcyMCAESGKV3ilUI7fQOtR40rgND' +
                    'EV7YtXVGeo6dafLCjIDa3fSKDoaVpSmIE7NqjZMKAdajEIcrbBSSTWn05ZfGmIA/RtG197MMasEjDNcFqMhc5KFpnWnnhvAg0UxJkVFaUDU6jxwoDmSJZwSpAp5df44JCD+2UJJcEeBrU1+OAGRdvF1Y7NAs9+zB' +
                    'CSsdEZqvQmnpGRoPHD1q7PQklMm5JHc3nsWyCOCPT7pb/mHXnUjoD8K40+TC14g6tRnZ2MAtkms41iiYErGgpUk5mg6EnGe0zqWpg+5QJbRrIwqHb6K0LH9cSsth4CkW9vMQIwS1BlnUGvXPrh7SuIU5Obna1BVw' +
                    'QUqAxOTA1+XTFfUOCXmzW5Qe21VkH7iAqaAZjD1sxbMzvltlt73SvbJ7bIKEmhy6nPHY27cHPzDniF1BBFGRcPMkmcUhGrUDTPL5Ypy1lluO+hp2wbtJ70UXuuY0GnUaEmh8MqZDHPyYx+JXO/8A3A3XY+GR8N4Z' +
                    'K0vJ+a3CbHskIqro9x6ZJqitFjQnPwJGOl2nbVvleS/6KLqt8PA52/yutOmv6raIvvAOxPajjHFds40/H7C8baoEtpL+5s4JHuJQv7kjs6EsXYluvyxTl7jny5Hfqal8JGptMdKKsJx7AvmnYntZvvFtx2deMbfD' +
                    '97bvELqCygjlCyIV1I6oCrA5gg1BGLMO/wA1Lq3U3HtYt9tjtVrpWvsPkD8Oud7z2M7w8p7A8un9m131nghDErGNztQWgda0oJ4SV+J0Y9p3bGtxtq56eH0fH8H9zzuws8Od4reP1/tGH4g8it+znfDl+y9wbj/2' +
                    '1c7xZyW9jc31IbeSSO8E9BK9EIdASh1UOB3ir3G1pbF+aH4ceBNhGLPauTSefvK9+a/L9l5V3y4luW1bla7haWscCyXFtcR3MagXmo63RiBl1qcWdlxXrtrqyaft9wO5Wq8tIaf95v35t8w2XlP45bvJtN3Hd6pd' +
                    'vk9y3YSQMGvEFYpFJVly8Djgdlx2pu0mo4/Q6vcoe3bXs+oF+JP9s5X+IScHivEkuXG8W99awujT263k8qq0iA6l1KSVqBXww3d3bHv+uNNI+Anbkrbbpnn8yhfh/wAwi/Gbl3Ke0veErsEW8ywXey75d/tWFxLb' +
                    'h4yvvt6QJEYFSTkQVNDjod2x+sx0y4fzRxXj+Bj2T9Ne2PJpPB+B1+XPKB+S/LuN9n+zCx8jntLk3m67vZuJbC2Lp7S+5crVAqKzFzXyAq2WB2rH6Ols2b8qahJ8X8Bt9b1Fq4sX5ufIZfnjx+Hh/wCPnA+HQSme' +
                    'PYp9v25Z2FDJ9tYyRa6f7xFcJ2PL5m6vfnL/ABY3c8fRt615NfQvH4/fkh2q2DsPxnZub79Dxnddj2qKGbbdySSGW4hRT7M9sCp95JY6FdFc6imMe/7dntubWpXqTfFfR8oL9ru8VcNVZw0vH7GJfinxXkHdj8pd' +
                    '177WtjNacZ2+73G/jvZkKJLJcpJDBAhOTPR9T0+kDPqK9numWmDZLA3Nmkvw4s5+zpbLuXlS/LLFnfq7t7b85ON3t7KsFvBfbA888rBERFmQszM1AAB1JyxZsE322yXKwu803lfgR/8AUMcXHdrju6J+7YS7aogu' +
                    'h64ZFFzI/pcVU+lgcvAjE/p//wAFl4z9id3/APJV+Efc078lu8/bbl3Yvddl4lvse9Xc9vbf6exZp/ZRZoSXmCikSilPXTPLrjj9s2WfHula9YUvj8eHM6m93OK23aq5ceB3+CO+2cXaq322GU3F3Du9xJNYQyjW' +
                    'EkEQQulcgSDQnI0we/UfqJ8IQO0teRHjLEP5z9v924XyvYe/3C9VnfbdPbpeXEXWOSJw9rMaeTD228/SMa+x7iuSlsF+D/hr7mTumF1azV4rj9jW/wAe9/vfyB7h3P5I77YtZ7dtVnHsXELGSlI7qWNX3O5Wtf62' +
                    '9pWH9NfLHL7hVbXEtvVy2+qz9n+Ffc2bV+ffzWtEoX3f2M7/AOoJ2h5Py6TZ+dcatpNxbbYpoL20hUvIYXZXDoozOlqhgM6Gvgcbuw73HjnHZxJR3Ta3uleqmB92O/L7thv/ABHbdk7jblHxrkm2QR2e4Lfo8dvc' +
                    'NCoQTJKAVBYCrK1CDWlRjFv+zZ6ZHbEuqrcqPA0bXuWK1EruLLmbdxLvZwfn8e9bXwi+XcrTZYLU3O62+dq8tyJP2o2oCWQR1bw9Qxycu0y4VV5FDc6eOhvx56ZLPpcwfG/4T7nt23/lLzBNxuYrZr6HdLazE8ix' +
                    '+9O+4RFY01EamahoozOPY96q3sqQpiPoec7e0tzafb9T+ilpbxxD7iXSi9SxyCqPnj54epYFuHLIbaY2u327XqsAUlhdCGZq+kV6GoxAqnM7m3q1dRGshMqgCSFWDFfDOnkcsVsZVOlvmC6hIKDqnXw+OASAWW/R' +
                    'AwKgqxzGANAHJuIDFR08hghgAnvBQ+2csxliDQcLcsVozVriEg5+9aNzQ/LEJBFf34ksLla5mN/8MMuJIMzWBZLkMKqxp7g9VCcxkNWNc6BGvIbaTXAzOKgswFOn8wcJRkFn2zRvBJqpQg516V/4z/hh5IPd+iia' +
                    '2YFSTJKpqFZR9LdD7h/iNPyxXUCEe3wRtdx+4NLCRdKjUfH/AI8WWegxsUVwiWcKePtpX56RjEyqBXuN3KixGOZlJfSKHLP4fphkgwLdUnvfVnSnVada0wwRttlzNJb3TySs7QaisbfSSvw8OuFaAzEu8G5bnLuj' +
                    '7nB7S6LGSQKDcDVJBHLIBRZVGdAK0x1tmqtQ+fs9nsKsjaUoz253bkERuFVIiIZdxijBa6J1Wlus0RP73iWIx0q48bj3Ll4uH4Gd3v8AXmSrPyn3ZUeGKJA+1oZTJc0YXa1n00mzKEimFjFHF/4uXhw8AzeeHL+0' +
                    '827dOUywQmSJEWUM9TJdEAruCWtKe91EbasG+PFL1+n+WeXMlb35fXnBt3Ddubb23S2knM6xTLHFnKSoC1ofckcVz8KY4Ga3VDNyRYlRSD7nh0HjTGYYgdP6Yyc/Lx+eCMcqKNTTQePxxCDDb7hWb7aQUH9JOAxW' +
                    'gysAJ0Aek0I8sABI7RMKr16GnniEBzIqAkiuISBfNLqly9J8MEMHMO5vBMivKfbU1KA0FcGCQFXe6GVVmtwDIhDBT4jywIIkFRbpBdKpUjWVBMfQj4VPiMVtDwcSXUYXSWWqnNARUmuFJB0Zoj9QFMyWB6fxxAwc' +
                    'XKp9tLNHk6Rs6nIqCFJzwy4gKTsTSQbjc3txJMbhZo4rjWUNWk0kVooBUhx0xtutEhJNDkhUGq550FPLzxhGgiVIvcCJUU/qy8/LAGgzjfe5N/LDPYLBHGTqVZUMiurA0DAg9RjpU26mSlsqMu87nf8A7cl3O4Bq' +
                    'ysxIB+Fa41dCXgCTlnlWOolYVrqYmhPlX5YhCY883HYJYdoiSO4WMsTLIGLNkDnQ/HC+mrebA8yNCK/3QLcTSMpdWJFKsaVzyqcGtNAtir+6NFaz/bswpMgGZPUdK1xd0S1PIXqgtdpct/b7eR2oTGpPUnoMxXHI' +
                    'uvzM1Vvohbu3Iks4WhVwSy+qqVpX/DDUo2yOxl3LN7nedWtWVkORFCvzrQ4722w6anOz2Llsc0ckUNzLMFSQ0RhSla1zoTTGG6gtqX/ZZbVZgHALD0hVoGyH1DzxjyPQ0pF0sksBNHeRxIJYRr+5kALRqc2IPUdO' +
                    'gxheTSA9Bbl39YbIi/mAiGmRTShI/wB6tCBTCKwrpqd3e+JLaERaGVVTREp1Fx5iv+GL6MrdT5v76fjVt/djd7fmGyzzbFyK00NDucSg1MbakEi6gSUP0sCCPjj02w7tbb1dLLqq/A5e62FczVk4svE0DhW3c7s9' +
                    'mWx7jz2O+XKKkcF5ZWAtiy0CsZA8jgv/AFEqFHwxz8+XE7Timq9rk2YqX6YyNN+4YHZdlEzRvtKAMaamhj0mp6igr4Yp823Mu6FyODBHbs4tNuVkOUiSxLJD6cxpU0HUnwxFf2k6UWzi+4WkW3RBoIrS7kBM8MUa' +
                    'RE6SdNQvw+OM+RueMoiqiTc7Hj+8p7e62MF5GfqinjSRWHmVcEYFctq8HBHRPRqTva7PZNht/tdls7fboHarRW0SQoT/AMKAD9cC+W1nNnJK0S4Iyb8nezm79+Nj2Tje37lDttta3qXV9ezhpCkKRSIRHGtNTVcZ' +
                    'EgeZx1+2dwrtLWu1MqEjBvdo89VVONTQuK9uuGcZ4fx/h11YQ77b7DaxWdtPuEMUjukChfcZSCAT8Mc/Lvclslrpx1OdDTTb1rRU4woLvFPYiyW3soUtoohpigiURxIPDSq0oP0xmd3Zyyzogrs1tscsrXEu3xSy' +
                    'sfVJJErE1y6sCaYbzbRxG6ExRz7bdg3fjN2u4WEFwbf2iiPGrKpV1AorCnTF2DNZX0cAtjTWqKbuOycesuM3VvZ7fb20Rhd2jhhSNSwoQWCAAkfHGqmW7um22B0qq6IVbBFvMWxqnBks7beZpAtrcXcRaBJQ3paR' +
                    'YijMB5V/li+9qu/+5Lr7BHV9D6YTPd12z8l+Y7PccQ5fuPE9sguY2gud8srW/nvVSRaM8UErrCHp0qaA54trl2WO3XRXfsbUfjxMTx7my6W6r2qTTuBbXxztxw/aeC8eFNu2a3S3t3FPclYZvIwFBqdyWb4nHK3G' +
                    'a2bI724tm3FhWOiquCCOQ30d2kAJDoA+oMSNJNKCmKquC5Iq91xjht7NBcbhs9pdSlQfclhjc1+JZScaFnyJQrNCPHV8Uh/ZQ2VvZfZwQpb2+miwxqFjA+CrQYodm3LGiOAXbbZsdjyktaWkEbhiyssSBgfbBBBp' +
                    '1wLZLNcQKqjgWe7v6WUy1rVGrSvSlc8Z5JBTLK5kkmtQTT91Ms8vUMMWMZbdcJ/c7igqRrLE+eumEZI0GDXRX11qD/DywhIAZr0aiTnXLLxxBoF012dTBDT4V6YIxA9w4o2qg8cEh+W4alT1HShzzwSHL3efpHzz' +
                    '6fHEARz3ANvKg6FT/hgriQpwQiOSQBToNKmlRXLyxrANd8UXDWpkbU1Grqp5jxIxXUAuuo5A8SLEukMq1OnME08AMOgjTcixidWRGT3QWC+0cwrDMIoNf+KpwiALLRljuopAq11rQgLUUPywz4BNB+/VkjiJ+lVA' +
                    'HyXGQMAtzOskBNCQGAAyXrXxOGQrA/dk1V0j+GdMOE4v+QLse1TywxGa4ZXEdsGNGBoCSwB8DkDhq16mKzLuWRX+8wvO8AjEcD+4kbmQupDqy/RUkg+FMdDC1ViXUorsfGrwXr20uqT3fuJ5LksSqPLGI2qSlM1P' +
                    'pHwxqeZRPuQnl6joWd5ePJYrCVNqbWUzvUKxK1XS2nOmn1eWM8pKeclnHQ8TZnaxctbNSJnRY1dvcalysuoArmNSDP8Ay4PmRbj/ABAHWUaXxEXMIv5L9ET3pQ/uBvSWKgkLkMs8c3LGkFqDN/3iPZLGXdWiNwqF' +
                    'ECK1CNThdWQPQHCY69TgjOdsvJN12223J4jbm5jWX7diSU1eBqB/hgXr02aCnKCXBY1Va+Z8qYQIk3XmOwbBM1vul8kNyie6tqamWRCTQovUioxopgvdSloJa9Vo2VXkvdS0VPZ23ebWAMAZTA4kZPGjSkFNXgVV' +
                    'TT/PXG3Hs7eNWyl5a84FNj3Na0dZbHeYzCXWaVJ5DMjAZPHVzqUHzByOLbbVvjUnmV8GWOw728Zupkt74rE7kgvHMoSg8auMhjNbYZEpSD5teZdCZLy2iv7aIrHOgeIO66tLCoOenr16YwusOC5MWXKzRPSTJgQD' +
                    '6lPX5GmGSGkKsphI2kuKqBTPPPCNEDhFbvo0EOJFD1p0r88B6ATGK7PCbYmoC/00oDX4YWSSBkXMTpBKQ6saRsx8R4HzwrQ6ZHe75tm0WcqXlxBEZvct0MrhYzLStCCQT1zAw1KWb0QLMqe1XtxNIZn3zbpWRllk' +
                    'mSP0iJTkGzpTT/Uc+meNlkl4Mrkvdrvm3XxSS1uo51fXQxMGUmMDUAR5VGMFqNcS1OUTi5gSSoYUX+o1oPPPCDGAbjce5czSOuWtxq6/1GmPQVWhlZ+jvIV9CVLAdDSv6YnSwydB7W9invNwkmgjgilbVFOY1UrE' +
                    'xBKr1Osg4KlaJJ/AR66lU5nv1qntchs0W4t5rt7EMtwVcsyM4Ol1JooFK9KdMb9vhbmr0cTwMuXKlDWusAkvObae4mrZgKgqxaeoQH0+o0GRIw62jSWvyJ6hcjjj3L7fddwg2cbbQXs8Rjn98nTnpqF05j9cHNtn' +
                    'Srt1cFyK6bjqaUcTUAum2jhjch4QAW1eHlTHmb62bOrVaFT5P9zBbzNbgF26Mcwc/Lwxq2ym2oLPQyDeb+Q3WmYeoGjEZ0Pl0x6jFRQcnNY1zj+1TC3jd7yOVo82XNWz861GWPP5GnwN1C9bNeQwNH9/I2qMABlC' +
                    'FM61pSg6DwxzclWbastu27jttwvtRNQOFK1XxB6Z/DGRpofUY3V9ElIIiBqWtKimnp4VxEJANd3e5RMIIUVo2RWLe4EZTXp1xppECNagxlvZIU9wFTpIb/VUplQ9Gz+eHlCwRXctxItzGi1DezWlw6Fgo8Dqqv8A' +
                    '82GTJBBcGVBcSGlNSAKbop+v1en5f1YKf8QSAWW5Ms9xHFolMkyMmm80awv9QBb0gf5fHDJ8P5AgN2ie4XeazxlUEztr98tUe0wDaKmgz+j9fDCXa6SQWFr/ANtzKzADM0qKk+WMklkBNru0ckCuvUkj4inUUOA2' +
                    'DpIzuttcBoxIDl4UOkg4gYJYLieVHuY6FH+ss1SKZHKmXTAhkbQbBItsomLa69VrShPkMGBJkDubkxx3twGobUayPMjPrhlqGBFyndLG2tm2l7gNcToHMZGmi+5prX/0nF2Kr4kKzeTxX1q1tNKFhkqhoQPSWHx+' +
                    'GeNNW05A1JxsE1htPtpbXWqOCX3A5zYeNfDx/lhsjduKFSSLrLukd1IsxIJcVBBoKCg88ZOA0HEtyNRGWrTUDI/zxJIQzXeqNV608qeOeeCSCL7slYVDEKFrRR0+WCSAk3o9lRmVGVOlcz1wpIOrje5BN940jCRO' +
                    'spzOfp+WJBIB35He3GmszsK6gQxX1HLotPDwOJ0kg4i3grNG4JBBGimRBPjnidJIGMO8Ro7BkeNXOrUGGrzzpTrhIBASN2ieitK/pFZKAePllhekIOt+kzDSTrNSAaAmgrlnTA6WMeGQySMjIwYDUxbSCB/8WJBJ' +
                    'IRM0gVUIauWmo1DOnSuJBAe4lnhAVhpJ8a+RwyQSL7yo0llLDMLUfKmDBCQXEemSFnWuljrBJrQeGQwekWSrNMsjSKj66geL5UPyxpAOd9klDWwj9AFVBq3XL/LiuhBcbhg0dWMhLCo/cyzz6imWHggx3i4f2CxY' +
                    'lVkUZ+9kKEZalAp/w1GEqiCyC+Md0p1ftF09X7nnn4YdrQhav7jBPMYI2pmQkrMqpQeJJIxm6WNJ2JoWtCksiZyVorq2QHX0k0xEmB8Tn7y3aNvakDsFICCla9QMNAplr7ndSXck25wT6iKBvdjDLn9JDCmVfDHR' +
                    '6FGjQsnSbjZAgzxXSZ0akkBoCaA9cR0fNfMHUTJdWcquxFwKGka+5CQw86mlML0v2E6iA7jaqGIguVAFQfdgzzoemH6PavmDqPYt124yIk4uIq06zwV/2Yjow9RK+5WC6xElzI4FY1Wa29f88sL0P2fMnUF8f5Fc' +
                    'XG4R2E1nKLGb03JuJY5FUJ6tQjWtSCKYXJjSUzqBWbfAf8h7mcL4ba2iSTSXJYKI7WIJ7qw5gSEyMqkVFOtcVYtpkytxoC+VU4lQ533c49yNY+PbTbyT6LiJjuDKgt2DRMCqnVrqC4BypkcbcGzvRdVnGnDxKrZq' +
                    'twjLJw1zu0F1FEsMVlJ6pwSxbS9CqlQTnmCMddOKNNy2ZXraeEDC/wDthATLJ7onKB42Dqq1VFfU2WZKnFNJnTwLbNRqE3Um33F/FNa3EKwosClBKoLKgAcMD5/zxUupVhpzqFtToyKzWxi3hrqS4haMtKYl91S1' +
                    'X1aQBXzOGu30RD/ASrXVMo1dO5vELSxtGkeYARRwsPt42AdECnPOuY644722R2cGvzKwDt3H4nucq2m33ExuZXSONHhAUsxyHpqB/DEe2yVUtBWWrcIf2u5uNEkfocIDWoyyzOMrRacf3eY3CH3GMZqPqyX5Z4PS' +
                    'QkuuVLZoUnnJZRqVVdgxAyqB44ipJCKXmto2lWlYIpWkpEmsVzJ6eFcsHymRWgoe9cuuUu76O6tYp0gAnMheYBxK4CnTWgbpqx0seCrSh8Si2VqfYT2HKJo7i+pbQRrZgGYapWDqUqAo8MssLbCoWr1Csj19hZti' +
                    '37cZryF5LBLS0Alc3nr+lI1J063/AKqkDL+k4y5MVUuMstVnJBH3N41JH7lxummLUVZJHRCaN0YV6EZipwfRZJ0qTz68yk3262abraRRxe9b3cF1P7nVSyzaFpl4Y6Ncb6G/FNfQod/zJewQnct93NCm17LLOpX2' +
                    '557aNiS1QTQgGhzGWNax0r+qy+JQ8lnwQJuPJeQ/Yu+5RSQW91/p5EjlRC1EIGpVXV0FT/PFlMOPq/K5a14CWyWjVaFV5H3Fl5Oott7DS+3cG6WcFVYSNkaaFApmaDwrjoYtp5bmvKDFfcdShilL+3cy2xnjht7u' +
                    'jSM/QrG+oCtPhi90ejjVFasuHgy1cBkN3yrbWjZXjheKOAoKCitlT+OMG8UYbe0vw2m6NjvEcJJ66BCyStQ5E50JA+OPIKk6nb60VrfjELT2mvVE5KxRRIpUkmpFSeldJ+GNeGjTnwFtdRBknINqvre/l91aCP1z' +
                    'F2GSmp1Gg6Ux6XBZOpzM6hljtO4e4wXSwCKCJG0jSAzGpGVTlTGN7OsTqP57ktsXLr2RKSCGNHVi4BJHoFRStMYrbapormYpflFzHu0e52t9NBcsuhTD9JVcwpDEgrn442V266OlpNFLyPqmdTVuIb++7bWLnddI' +
                    'kSQgaWCF10qQ1AaD9McHcbfovFTpYsnUpY7vd1tzOgae2WqgKZ9bORq8CPnT54qrjaXiM3qDfe2j6XeWwdih0NRyKUrkT4HDQ/aQTb/vUllcTMntPCyRmdRCHFAgpq1daeHli3HSULZwV3e9/uTEB7orcEmRo1C6' +
                    'tIFCaU/zZY0Y6KSu1jvj+5+5dILkRyagup5ENKasqkHrU4XLWFoNVyWHdr4i2vJ7KWKKUPqEsTFZFah6k/1EVz8q4zUWqTLGVrbt53qK5F3ebtI6SSR+5bqQWpUUDP4imNV60ahVKlPFstcnMLOK1W5aYBGUyBwa' +
                    '+lQCxzqQKMP44xrA24gt60Dxc7tn13UcHsUkCNQsA6kGhBNcz1ApgvbvgTrRZtr5UIrURsJpTKGkEhUAHUa5CuQp4YoeMLaHm3b/AGt8sgZtBjI0B6LWhocq5kYqtVoAlvd/C7hOpvESznhvD7ZpqknT2lQDOoUC' +
                    'QnpmcW1ppMaygN6oqe/7lBuu5T3sk6yQKStvqGSR6i4GXmzHGvHKUIGgtN3YXMirLcxsyIVpWqlqHP4HFsWXgCUeRQFoFlj1RvF6/QNRIVCKUHgMF21AWWLfY7LbHE0wWTP2TpNFDkEUrUHxxm6ZY4PHy17Vdzn3' +
                    'W59kMYv7bGUJbS6VdgRXIPln8sO8Ux0/ESYbngATc2QLqG4MKGlQpAH8sOsL5E60GWXKrFpgJLx5QBRVPQ/IgDFdsT5DdSHMfI9v9tGuLhY5FDCWI1qGr59Dil1ZJR6d/wBtmgakn1AFRTrQjL54ENElEcVzCQlW' +
                    '9LUNa/7RgOwZJEv7Z5UDtmjAggeWBIJPL3k1tSSD3CqClV8zXI1p8MRVALJOUD2iHUszGmQ6jwJqMOqBIm5UqsZIr0wsKgAop05Zj6ScWLHPgDqREeURKTLNeKrMfVVAF6eQXDeU+ROpDjbt6t7+zDQEMvQyBiC1' +
                    'PECgyOKrUh6jTJ7c7mIYTO5Eca0qxYkioOYy8KVxFWQCN+V24J0bgWLZh9FAR59MaPKfIHUju05RZF4/d3I0cnIr9RNRT6a5jAeJ8gdSCbe31/vCRVqA2gr6vMdSMI2MM+STiSW3jRwhjqWBFaA0+IwmMALFbzKV' +
                    'uIWV1VhUhOvjkQxzwXYYKv7i3vQYYSI2eUyOWjagoD19Zrn8vlhK2gAst9naO4MrTxlSc1ZG6j/1dcWvIoANYqe4ilRIueqOhGryz1VFMVyGQu9+19uNYJnhXP3VNAQchlmcvicBJi9R7HPt0E/uSXiaVI1UPQH4' +
                    'VxGmGRJvVztN7bbjt8UrvFcmfXKVGSzA1oK50GWLaSmnyBxUC3+6Qx2y2qF/Z0iMOVo/pUDDRLkIptr+PbrOKyjkedbaOiqulXOkk5DpX4Yudeq08wJQoIbWeGHdd0v1muH/ALobYjUsapH9vGUAB1+IOeWGvLrW' +
                    'umk/MStYs3zD72Gx3OWzunnYTbc8kkYyIJeMoTl8Diut3WVzGtWWnyOLy59q2sJp5H020lvcMyqMzFkAamuZPXErMv2yCy4BV7ua/YzSRSH3pVjiQEgKQrlvqUmgz64rrVzqM0Uble5SXM0ltfohEEeuGJyRrRdN' +
                    'EB/y0c0Pnjp7ekQ0ZstZOF3iA/dRrBCPZubZYVaEFtDGLVUjqficTy3px4P7g5+9HW62uxpx6TkDhkaQe41ikrRoC70AqB4A4GO+TzOj5wLfHVV6iXjGxbFf7S92PftWWVohFHOXBC0NakDEz571tGj+AMeKrXL4' +
                    'gUH9tvdtuL/7RxcQzRwxlpyY2EmqhY6Kj6egxbZ2TSnSORWkmpj5nEdvZQ2cF41uGM08kTN75KKBoNVqpzzzwPMs21PBcidCSkg5FabDZ2l7JEss8luzBBJJRT6gKEgeR8MNhvks14SPfFVJkHFdl2vcIkvJlaAp' +
                    'KyFoJiaaSPHIg54fcZb1cezkHFiq9TTJ+S2cFtGkZNdKKh6+AFOuORXC2zoaHu38jtZ5mhMyh4/qByINPj1xL4WkAR8s5FDFvO128jBS/vgqoK+5qjIWprT0nPPGjBibpZ+4ov8AqRRpeWSR2ahdwd2+zldvU+rU' +
                    'txTX1rkMvPHTW3XVw8fsZOpxx8PuN973WMXN8El9hFsraSNaEmN2ZKydD9VaYzYqaKVOrHyNy9fAd7YlrLd7vbG4B0m09iMZGAPpqdWXWtcZrtpVcc/iWV1b+B+5TfX+57os1gzGO2T2SQuoOVdiTVevXDbfpVNQ' +
                    'ZOqdChScY3AB3iZianIK1STl0x2FuqGDyLlultTDcWtHasW2zFFJ9SuZQSMj0LMTjnK6af8AqRu6Ya9wH/fZLK2+wgkewaNwzyxMyMQqn1DT4saV8cW+Wm54lbyQo4FZ5Be3c9tJJHIjyuXZSRRgrrTLUK5DG/DW' +
                    'qZly2bQFt/G7C7tbe4aYiX2lMkXtAjVmTnXPI0xZk3Dq2o+ZXXFVpOQ//wBmW2j2JrgAoAQvsocmzzNTQ4pW88Y+Y7wKOJZdq2q12K192F6Mi0ikRAJEaoowoTQ4z5Myu4YK4nXUY20UG7yId0vJdTopqJlo7f1e' +
                    'l60IxislX9MfgaKqf1MQ7tHabfYya7VoboyJqV5o6FdRAI055Chxpo3Z6aoSNOTM53pVvVeUCq6xSssSgKUJqC2eZp/HHYxOH/eZ8ldBNtm/G3lD3ReKp1MUYHUR0Ir4YtvingU1ycx1Py9ZnAiutMZzjQrpanQk' +
                    'keeKq7eOKL/NrzC9v5DalwUnjVlSmmtKkDxJ8ThrY4XALvV+I42/n09rFos7m3RSAXjYEnUR1r8hniq22q3qmNXcOq0gsuz96BZWkduFUvqk1TNKoUZggUKnwxky9vrZ8TRXeLkNo++G3lVM14kbaSJ40hLeqmVH' +
                    'CgfwxjfbX4IuW8p4lI3zuZ/db+e5sL9hDJKFXUuQjC0oV+FOpxtx7JVSTRTbdVb0ZzJ3CGjRNObgxrJQ0RQKj4da4HpF4KBXuFzIbXuSlnbLMszR+pUZhUuB19FadD8cR7KXEC+pSUpkg7kz3Nto/uTqFH7ccsTe' +
                    'IPgX6kGmB6JJ/pCtzK/UCWXLRHA9bkDSaaJYwytpHjRzXr1w99vL4C1zacQ+37jPNagm7WIxmmhrfT08tL5jFT2UPh8yxbmVx+Rzb9zDbztqkX1Bi9I6Lln/AJv4Yj2MoHqPaM4e+W7WdusVpKgUEiNREDkfIsTh' +
                    'P22r4oD3PtOrLvLZNe29zvLtKcxIi0ogYE0GjpU0rhLdttD6QrdVlSz3cO7Gz3e4Q3VqsgMA9sKgbToObfVSta/ywK9vydLTgZ7mjtMhMHdTickqyXckwjf/AJ8YVqFgOtBkcV/t2VcBnusfMG3DufxmKZpNi1NQ' +
                    'am1xmnUEBanri6mxyR+YS26r/hZGneGSJGPuVYGNI4vb9Xt10k6hXMDBt29sFdzHFkc/dRpbiNKGWCMksXU6+laqMsxha7Bpa8S17msk57mWBuLe4SWRihZXEgXNHpkR8K1wvobw0R7mk8SW27lyS7zc2UkgaCIO' +
                    '0Q9pAfSVpmB5HC22MUT8SLcTdrwO73uRJbX7AgG3WP3KaADq1hQM8Cmymvtka24qn7AWTu7BNMQwoB19IYZDPw64s/bbQL6ygTbc7jaBL6S6URuxVVDJUV8KZEYrezcxBYtzWJC5O7ltDGscNzSq01qhH+OE/bm/' +
                    'Ab1WPmfk7v29VZpyQBmyFloQPDLE/bXyF9Vj5g173biuZQSyUUAdJCTSpqch54evbmgerpzFjdzSZa/dOHUVEUamvStelcXrt+nAR7uvMNve5rnbrafZ53Wdh+680StrbSBVSQSc+uK6bGLNWKrbjRQOtw59GuzS' +
                    '31pcpLNHFrZfaBGvRUg/rjNXaW60nwkveZdMhW19zo7IrG8C3HvCizkCMBlFGSgGVPHC32TfsGWZIOHcOK5ZFnhjCs+nUTXIdCBT+WE9I1wLFmRWdy7h3EHK7HbrK4jFhK1ssoa2TVSRqPnSo+GN2PaJ4nZrXXxM' +
                    '19w1kST0HG58sgs5rB7K4LMZkWUCJCzLRmNCehJAxmx4G05XgX3ypRDFh767YkrRBZY5AdBZ4xUFTQ+npXF37XkidCl7ygwtPyD459O4zTSFlIk1wCgocqFDnX+WFfacvhAvrMZ+l7+cTSINE8vUMiLAQv8AAnAX' +
                    'aszY3rMfMAj78bDJITc+44B9NEK5VJwz7TkCt7iPLjv/ALEJQ0ETqKUIoQVrllUYZdpyAe+xEA787Oz+80ksIBIWNUZsviajDftVyeuxEM/e7ZL+SIS3tyiJTWghNGzrnnh12vJXwQvrcTFG5dzeMyM9xHd3utiC' +
                    'REGSo6f5h4YvpsMvJCvd4vaN7PfbFdviltNxne1uNLJ+851ayAB/mBqaYothfU01qixZ6xoEXW/rb26Iruq56h7zkEUz8c8V1w6jPOhbbbnb/cNJFdSpKwqKTPWgHzxc8bjgBZkdpNaEGN7mWT+op9w/1HxI1YDq' +
                    '+XyGWVH6CaxhnS4WaQvG3oYTM3+3EdW1H2IstZJ9xv8Ab7mMhWlaN6a1aeQE0zHU4StGn4fgHzak1luuwWwNteylh9Skz5jLx1H4YW2O74fQPnVQh5HyfhUl0bW23djK6NDrIaRED0P1moyIoMasO2zJS6lN91je' +
                    'kkW5b+trZXX2Tquu5hkivmdTGyxxp6QSaHNeuHx4Jank9BbbhQ45g11zb77bW2y5RXQ+wir76Vb3GquYPQ+GHrtIt1L2+Ar3aag5sOfXmyWbQWbp7R1zOBcIwADBGNWqeuXXrg32iu9foBbzpWn1F1vym6t7S626' +
                    '6McpmnQlFnUH3FBIFQQa59MXPAm01y5FK3OjT58zk8quGtIre0mRVj92YNJcKwPQORWuQK54b06mX9CPcylH1IJeUXl0ZVvmSZWCCVBMq1MzBkII86Ydbetf06fDkH1bfEltOZS7UrW9gDFqeWQR++jjWgq9S1en' +
                    'jnhL7VWcv6C+rjRL5jnZ+Ybju9tdSywrIsKe40obSoUiqgU/zDocZ8m2rRqGWU3VrDaG8mUW11GkSLEFEL+4wIjbM1Pj1PzxQ6rVMuWdig7xuN7pnX3Myw0yanZdLFRQ+RGYxd5dVoKtzZnR3AlP9XEroV0Vki0m' +
                    'hNSNXXrgdEcPqF554ku48g2neop5LeQRyvbrBPEg15RMpqD1H0gUOBXDekJrSZA89LT7gS67hzRSl7aMRM0QGqI0ZngACl6irVOLFs01r/EiPdpPRB1tyfcREnqklmmo5zqTrNcyPHPFLwVn2Fy3GnAgk5S6hJyG' +
                    '0sokAVvVTVQ/4YZbZcAeqXIkbk95BcRavU0UE8jkE5oZg2nPrQP/ACwPT1a+K+hHuNfgys7nu++3ck1pt7maWBow5HpBATqS3jjdjxY6pN+Jjvkb0SFjb7vlkGh3NWQvkqsdWo1FR18saVipb9JT5rXFE8d1v8iq' +
                    '23xyPDIKwyBzGGWlTkTlTFLpjX6uJYrt8EMW5xOvHhs3tkXftmMzCjHWXqPXWvTFC2a6+qdC31K6OnxBtt5Tue3o91OWZQCjfu1OphQVFa9cWW29HovoVLLGpZuPcstpJ7RbuJJ3kUqyM+o0FTQrTLPrnnjBm21k' +
                    'nGhqx3o4kF3jc7T24LBYxdB3lJupWXOgJFSuR01pi3HS2regt70rCRXbKwT7K7trkRvM1uhN4ArornWPdFT4f7MbLX/MmuE8PsZUpTT5H//Z' +
                    '" />';

// FIXME: Find better icons for these
var checkedIcon = '<img src="data:image/gif;base64,R0lGODlhIAAgAOf/ABsABBgAEwcGGyIAECEAHhcGCwkLFwIWAwAYFBwQEQAaBAIbABIWGBAcBAUiAAAmASIbHxshKBEzHBE/Gxw/KgdQEBhNDgBUGiJKGilHNSVKJiZKNBpXKhtbEwRjEABlCA9fIABqATJWPwxlGy5bNDtXPgRvFBdoJgByCxxnKw1tIh1uCTBlMCBsGxNwHi1mOSFrNAB5FDxjSTJrIwB+DkZjTQaAAjNwKDhtRBh6IwCCHjxsSi9xQwCGADZyMCF7GDRzOjpyPReAHACJDzB6HgCNAwCLHCh9ODJ6PBmHDg+MBBWIG05zUgCTDQCSGi+FERyIL093QzODKUd6S1R4OS6GIwuUAFJ8NUx8RxqRDVJ5XRWSHEt9XVZ7WQCdCUOERA2ZF0+AV1CDQSuTHQ+aLDWPLDaQJSiUJxubCzaPNEeMMx6aIymaGlmHTEiMWkePRSaeHg+pAEOXJCehFj6YNUiVP2aIb1iRR2KLaFmOa1aVQ0WdMjmhNmKQZmKTSj6jLmCXRkKhPWGUYzamMDSpGi+qKkWlHUahRlCjLEWnKmKcUGWaYV2gSzSwJ1ygWSq2E0quDHCZgUyrPkGxNU2vNTy3GDq6CG6iXWGlaFuuM0O3LzO+K1a0LoGgeFS3KEO9HznAIkm8NG2uWISnhGe1WWyzZFu9N1LBMV+6XXKzb0nIGVzAMVnEHlLHHljFK3u1aF7CRIqxdG6+SoOyh2e/WWvCSFbNGmvBVHi8ZmXGQHPAX2DMM1zPK4+3jGfQLW7IbmrOQYq/eH3LXn/JfnrPWJ7Ek3LbOpbJj3LcRI3Ugn3cbInZcozbZpLYfpzVf4nbfozeb5fbdYziZI/jXpfgcqDbi4voYZ7fh6TfnJ/ogafoj5nyeqnqm8PeyL7np7rso7ruq634lqz7rc3yuLL/o7z8suLvz8P/rdz0183+u8z/tdP+zdP/xN39ztv/xuL90vb17OP/x+L/2+f88Ov+1e/93OT/6en/3Of/4/H96u//5f/4/vn86/X/+vn//+NhYSH5BAEKAP8ALAAAAAAgACAAQAj+AP8JHEiwoMGDB1k4g2YNmCteEG3ZUmXpUyVNicw8C0eqTBUPqQr6EaWrDKl138bdW9drVLd+/OjRY/eMz5AmXsA4QeEBiJaDHaokAdNDSZYkSZoUaaJ0CA0TI0Bw4LIB4cArgJw5q3aN1K1ahijBIkRoTqgzOdwgnHUnGrNMsighquWprqdQf+qAeyfvHt9ke5LYEHJkAsFFadjMabTlELZ7+Pyqe/ZnixKmSoZsQWHiBI8uVgla+PIFCIsXLIJMCcOkamirNbTMStWMFqlSb2Ysek2wjahs0qaZyrVq1cNKoD7FWb5pzpgcSPIcjPIqGzFTwE7t8tWq+ydCmiT+qfFGr148d9nkJPGA6TAuYZmeCCNHbo+cTJTGBBJ3zxxkecOgosMZZOjgQgpcEHQDKXxQsoI27bSDzjzz5JOPPuw0E8gSSoBhRRFwLPHBCGHYUZAFVbCBhhdZnEGKNuEoU0gRVnjx4RBG6GCCChfgoEUGoZ3wgw1EJoHCB1AIcaQHJ8CAww4U8CbllLxFIogeUrzRHpUGURFLMcdgk8wtxNxixi200EGEI1OK8Rs1cMpCDCfGnYLGJ6BU4oUSgRwhHUIYKAJcQ7u4YgwrvLDSiiV5VjJHFoOckYYLX/RhUCfBRLNNLqcg00qirFDUSiWNyEHEN+2oo44uZvxQRxD+BYlxDTG1mDIcMJCwwgohp2jChxTg1GNOPfSks8wfSYTwBkFYlLJMJvE9YV8tnHACyxiH7KWPPvLIk8ohS9Dw1AkkDCQGLrcgIgc55bBTDiNqqMFIOevcY287wxxyxho2kIGCCjDgMdAljPxCxwrcpDPOO/bM048/+8BzjzrNSLLFilb0MIQQKrBQAkE+6LIGG4OYwc06+KCDjr00SbLETUpcRoMOHoAQxscEtUDJHFY0sgQp2LDjzjnKTNIEGmDE7IQRMUAxQgolHnTDDzPCMYS0f6yBk41LbbajVFqIEFoHZQyVcRJbGGHEEE5xpkIKL+QhwZQV5CBECCa4cAIYCCqM8LSTMtTAZUEadMGEFjJEOfjiVgUEADs=" />';
var unCheckedIcon = '<img src="data:image/gif;base64,R0lGODlhIAAgAOf7AAAyAAYyAAA0AAA1AAYyGxYxDgA5AAA6AAo1Fw85JRA8JRI8JBRAJSU/GiM/KBdJFB1HLx1HMwtTBxpKNCZHNB5LNCVKKyZJMyBMMxFUES9JLh5ONixMIyJPJg5YCSNNOSNOMyROOCRPNDBNLiNQOStPMyVROCVTOShSPDNQMjBUKBpdGCdYKShWPCJcITVVPi9ZKS1ZPjFYQzpWPy1aQxlmFj5YPzBeLS1dRSJlHjVcQTlbQjlbQzZcQzBeRDxcNzJeQztdQjBgSDJgRDNhOj5eOTtfOTFhSTRjL0BfNjNlJj5fQg9yFSxoKDNjSTNjSyZqLy5pKSRvHD1jSj9mOURkTEljSipxIzJuMERmTUBnUjFvME5jUiRzMjtsNDduNC1zLT1rUSx0Kk1nTDFzKy12Jz1tVT5yNEptQ0VwOzV3MD51MkRwWUJ0P1BxOjF6Qkd0PSd/MS19NkR2OTp4SUdzXFFzQTx6O0N3Rkt1RT56Pk1zWk9zWUN5SE51WlZ1SSyGLz6AOEN/P0x5Ykd9TFJ4X111Z0t7ZSqLKlJ7U2B4SF13XjWILkiBPFt5VU9+SEaDNkmBQlx6WF15Y1V+VF97Ylt/UUCISFeCSmGARVaDWFOFUGCAaU2MRU+LTWiEXFeLS0yPSmOHbVKQR1WRR2WIclyMdmeMWVeQY1qSS2yKaFCWTj+cS2WPYVqWTGeRYV2VWGCWXGqSb2mSdGuTcF2aYVadW26XX2iWfGSYdG2XZ3yVdV+gZm6ceHSdZXOeaWqiZXGgaXmfblStW4acdXqhammmbVizVIaieoCjgoCmaXGrcYSjkX2oeoKqdoGsd4iqmXuzcomwcYqugouwfJKtio6vhIi0d46yhIm1dpC0d5ivnYe5hJuxnIW8eZG6gpO6gZW+gqa6n5/Ak6XCip/HiabHkKDJka/CrKLLh7HEsJ7QlajOm67NlLPNoK3PrrPPuazUoK/UnrHXpLffqrrgrcbgscHpqsvvr8jxt/b3++NhYeNhYeNhYeNhYeNhYSH5BAEKAP8ALAAAAAAgACAAQAj+AP8JHEiwoMGDB5OwO0cPoUM9oTIsKwjrFzKHGAn2qLLooIo0Xr5kFBiCxIRDHzK6yUTOnTh13QreGsXoGCA5qBAmEwZO3kiHUbb0KdhqTqqfCFsM2fOzgyZKRn6MWJKFj58pF5Aa5GKIGa113mJx24TkldY/xe5JM/dzWJwudGYddIStnlaDUjwYI9gsW7q7By0E4UQQxrRPgAlCiCGqksFGpNYARrEBBxsKGKk0EVNDDJaCC0yccGKGRoTEqJFC6xUpkC1eqQUqIoZuG7x3zr6NsxQsWic1npDa0Yavnb2MiJiwepML46l84QBfgkJIlsFd1tjFQ02mzCo8BdF1zKMW+4qEWgQT+SoXWyALIjoGtrmmrP0/Hi8mDQSmq5p9EDtYQVAez2ASGwYMFDJDQWe4AklqTuBSykFwKAEKYBUcMYgMGHHwiCA5ZKTAE0KYkgBSD9wBxgou3FBECiWIEAMQPoRRhxaxaaCKJGPY4IB97QUEADs=" />';

var running;                    // Is the autoplayer running?
var innerPageElt;               // The currently visible inner page
var cashNYElt;                  // NY cash DOM element
var cashCubaElt;                // Cuba cash DOM element
var cashMoscowElt;              // Moscow cash DOM element
var cash;                       // Cash array of values by city
var healthElt, health;          // Health DOM element and value
var maxHealthElt, maxHealth;    // Maximum health DOM element and value
var energyElt, energy;          // Energy DOM element and value
var maxEnergyElt, maxEnergy;    // Maximum energy DOM element and value
var staminaElt, stamina;        // Stamina DOM element and value
var maxStaminaElt, maxStamina;  // Maximum stamina DOM element and value
var influenceElt, influence;    // influence DOM element and value
var maxInfluenceElt, maxInfluence;  // Maximum stamina DOM element and value
var levelElt, level;            // Level DOM element and value
var curAttack,                  // Attack/Defense DOM element and values
    curDefense;
var curExpElt, curExp;          // Experience DOM element and value
var lvlExpElt, lvlExp;          // Level up experience DOM element and value
var energyPackElt, energyPack;  // Is an energy pack waiting?
var ptsToNextLevel;             // Experience to next level up
var mafia;                      // Mafia size
var invites;                    // Number of mafia invitations
var staminaFloor;               // Stamina to reserve for manual play
var staminaCeiling;             // Stamina level to reach to begin spending
var staminaFlag = false;        // Is stamina incremented?
var stats;                      // Skill points
var city;                       // Current city (0=New York, 1=Cuba, 2=Moscow)
var autoStamBurnif;             // Can auto-burn be used now?
var skipStaminaSpend = false;   // Skip stamina actions for now?
var clickAction;                // Action being attempted with click simulation
var clickContext;               // Context for clickAction
var modificationTimer;          // Timer used to wait for content changes
var fightTmp = '';              // "tmp" PHP parameter for fighting
var idle = true;                // Is the script currently idle?

if (!initialized) {
  var settingsOpen = false;
  var statsOpen = false;
  var scratchpad = document.createElement('textarea');
  var defaultClans = ['{', '[', '(', '<', '◄', '«', '™', 'Ψ', 'Ξ'];
  var defaultLogPass = ['LOST', 'punched', 'Whacked', 'you were robbed', 'ticket'];
  var defaultLogFail = [''];

  var debug = GM_getValue('enableDebug') == 'checked';

  var useClickSimulation = true;

  // Regular expression for cash matching.
  const REGEX_CASH = /[A-Z]?\$[\d,]*\d/;

  // Define property maintenance states.
  const PROP_OK      = 0;  // No damage.
  const PROP_PROTECT = 1;  // Needs protection.
  const PROP_REPAIR  = 2;  // Needs repairs & protection.

  // Define how stamina can be used.
  const STAMINA_HOW_FIGHT_RANDOM = 0;  // Random fighting.
  const STAMINA_HOW_FIGHT_LIST   = 1;  // List fighting.
  const STAMINA_HOW_ROB_RANDOM   = 2;  // Random robbing.
  const STAMINA_HOW_ROB_LIST     = 3;  // List robbing.
  const STAMINA_HOW_HITMAN       = 4;  // Hitman.
  var staminaSpendChoices = [];
  staminaSpendChoices[STAMINA_HOW_FIGHT_RANDOM] = 'Fight random opponents';
  staminaSpendChoices[STAMINA_HOW_FIGHT_LIST]   = 'Fight specific opponents';
  staminaSpendChoices[STAMINA_HOW_ROB_RANDOM]   = 'Rob random opponents';
  staminaSpendChoices[STAMINA_HOW_ROB_LIST]     = 'Rob specific opponents';
  staminaSpendChoices[STAMINA_HOW_HITMAN]       = 'Collect hitlist bounties';

  // Define Bounty Selection options
  const BOUNTY_SHORTEST_TIME  = 0;  // Select qualified bounties with shortest time.
  const BOUNTY_LONGEST_TIME   = 1;  // Select qualified bounties with longest time on the hitlist.
  const BOUNTY_HIGHEST_BOUNTY = 2;  // Select qualified bounties with the highest bounty.
  const BOUNTY_RANDOM         = 3;  // Select random qualified bounty.
  var bountySelectionChoices = [];
  bountySelectionChoices[BOUNTY_SHORTEST_TIME]  = 'Shortest time';
  bountySelectionChoices[BOUNTY_LONGEST_TIME]   = 'Longest time';
  bountySelectionChoices[BOUNTY_HIGHEST_BOUNTY] = 'Highest bounty';
  bountySelectionChoices[BOUNTY_RANDOM]         = 'No preference (random)';

  // Define AutoStat allocation mode
  const AUTOSTAT_TARGET        = 0;
  const AUTOSTAT_RATIO_LEVEL   = 1;
  const AUTOSTAT_RATIO_ATTACK  = 2;
  const AUTOSTAT_RATIO_DEFENSE = 3;
  const AUTOSTAT_RATIO_HEALTH  = 4;
  const AUTOSTAT_RATIO_ENERGY  = 5;
  const AUTOSTAT_RATIO_STAMINA = 6;

  // Auto Stat mode arrays
  var autoStatDescrips  = ['Level', 'Attack', 'Defense', 'Health', 'Energy', 'Stamina', 'Influence'];
  var autoStatModes     = ['autoStatAttackMode', 'autoStatDefenseMode', 'autoStatHealthMode',
                           'autoStatEnergyMode', 'autoStatStaminaMode', 'autoStatInfluenceMode'];
  var autoStatPrios     = ['autoStatAttackPrio', 'autoStatDefensePrio', 'autoStatHealthPrio',
                           'autoStatEnergyPrio', 'autoStatStaminaPrio', 'autoStatInfluencePrio'];
  var autoStatFallbacks = ['autoStatAttackFallback', 'autoStatDefenseFallback', 'autoStatHealthFallback',
                           'autoStatEnergyFallback', 'autoStatStaminaFallback', 'autoStatInfluenceFallback'];
  var autoStatBases     = ['autoStatAttackBase', 'autoStatDefenseBase', 'autoStatHealthBase',
                           'autoStatEnergyBase', 'autoStatStaminaBase', 'autoStatInfluenceBase'];
  var autoStatRatios    = ['autoStatAttackRatio', 'autoStatDefenseRatio', 'autoStatHealthRatio',
                           'autoStatEnergyRatio', 'autoStatStaminaRatio', 'autoStatInfluenceRatio'];

  // Stat Ordinal constants
  const ATTACK_STAT  = 0;
  const DEFENSE_STAT = 1;
  const HEALTH_STAT  = 2;
  const ENERGY_STAT  = 3;
  const STAMINA_STAT = 4;
  const INFLUENCE_STAT = 5;

  // Define cities.
  const NY     = 0;
  const CUBA   = 1;
  const MOSCOW = 2;
  var cities   = ['New York', 'Cuba', 'Moscow'];
  var cityIcons = ['cash Icon','cashCuba Icon', 'cashMoscow Icon'];

  cash = new Array(cities.length);

  // Force Heal options
  var healOptions = new Array(
    ['forceHealOpt1','Heal immediately'],
    ['forceHealOpt2','Heal when health reaches 20'],
    ['forceHealOpt3','Heal when stamina can be spent'],
    ['forceHealOpt4','Heal when stamina is full'],
    ['forceHealOpt5','Heal after 5 minutes']
  );

  // Define all jobs. The array elements are:
  // job description, unadjusted energy cost, job number, tab number, city, unadjusted exp payout
  var missions = new Array(
    ['Mugging',1,1,1,NY,1],
    ['Corner Store Hold-up',3,2,1,NY,3],
    ['Warehouse Robbery',5,3,1,NY,5],
    ['Auto Theft',7,4,1,NY,8],
    ['Beat Up Rival Gangster',2,5,1,NY,2],
    ['Rob a Pimp',3,8,1,NY,3],
    ['Collect on a Loan',2,37,1,NY,2],
    ['Collect Protection Money',2,6,2,NY,2],
    ['Rough Up Dealers',2,7,2,NY,2],
    ['Take Out a Rogue Cop',3,9,2,NY,3],
    ['Perform a Hit',3,10,2,NY,3],
    ['Bank Heist',10,11,2,NY,13],
    ['Jewelry Store Job',15,12,2,NY,20],
    ['Hijack a Semi',8,38,2,NY,9],
    ['Destroy Enemy Mob Hideout',5,13,3,NY,5],
    ['Kill a Protected Snitch',5,14,3,NY,5],
    ['Bust a Made Man Out of Prison',5,15,3,NY,5],
    ['Museum Break-in',18,16,3,NY,22],
    ['Fight a Haitian Gang',6,17,3,NY,6],
    ['Clip the Irish Mob\'s Local Enforcer',10,39,3,NY,11],
    ['Steal a Tanker Truck',8,40,3,NY,9],
    ['Federal Reserve Raid',25,18,4,NY,30],
    ['Smuggle Across the Border',7,19,4,NY,8],
    ['Liquor Smuggling',30,22,4,NY,35],
    ['Run Illegal Poker Game',20,26,4,NY,33],
    ['Wiretap the Cops',30,28,4,NY,45],
    ['Rob an Electronics Store',24,41,4,NY,26],
    ['Burn Down a Tenement',18,42,4,NY,22],
    ['Distill Some Liquor',10,23,4,NY,12],
    ['Manufacture Tokens',10,24,4,NY,12],
    ['Get Cheating Deck',10,25,4,NY,12],
    ['Overtake Phone Central',10,27,4,NY,12],
    ['Repel the Yakuza',13,29,5,NY,18],
    ['Disrupt Rival Smuggling Ring',15,30,5,NY,20],
    ['Invade Tong-controlled Neighborhood',25,31,5,NY,30],
    ['Sell Guns to the Russian Mob',25,32,5,NY,35],
    ['Protect your City against a Rival Family',35,33,5,NY,50],
    ['Assassinate a Political Figure',35,34,5,NY,50],
    ['Exterminate a Rival Family',40,35,5,NY,56],
    ['Obtain Compromising Photos',28,43,5,NY,32],
    ['Frame a Rival Capo',26,44,5,NY,33],
    ['Steal an Air Freight Delivery',32,45,6,NY,36],
    ['Run a Biker Gang Out of Town',35,46,6,NY,40],
    ['Flip a Snitch',25,47,6,NY,30],
    ['Steal Bank Records',30,48,6,NY,36],
    ['Loot the Police Impound Lot',60,49,6,NY,60],
    ['Recruit a Rival Crew Member',30,50,6,NY,39],
    ['Dodge an FBI Tail',20,51,6,NY,27],
    ['Whack a Rival Crew Leader',28,52,6,NY,38],
    ['Influence a Harbor Official',50,53,7,NY,65],
    ['Move Stolen Merchandise',36,54,7,NY,50],
    ['Snuff a Rat',44,55,7,NY,62],
    ['Help a Fugitive Flee the Country',40,56,7,NY,57],
    ['Dispose of a Body',25,57,7,NY,36],
    ['Ransom a Businessman\'s Kids',60,58,7,NY,70],
    ['Fix the Big Game',50,59,7,NY,60],
    ['Steal an Arms Shipment',45,60,7,NY,66],
    ['Extort a Corrupt Judge',24,61,8,NY,36],
    ['Embezzle Funds Through a Phony Company',50,62,8,NY,70],
    ['Break Into the Armory',50,63,8,NY,60],
    ['Rip Off the Armenian Mob',50,64,8,NY,68],
    ['Muscle in on a Triad Operation',45,65,8,NY,68],
    ['Ambush a Rival at a Sit Down',55,66,8,NY,80],
    ['Order a Hit on a Public Official',35,67,8,NY,55],
    ['Take Over an Identity Theft Ring',36,68,8,NY,52],
    ['Settle a Beef... Permanently',40,69,9,NY,64],
    ['Buy Off a Federal Agent',35,70,9,NY,50],
    ['Make a Deal with the Mexican Cartel',40,71,9,NY,60],
    ['Blackmail the District Attorney',44,72,9,NY,66],
    ['Shake Down a City Council Member',85,73,9,NY,124],
    ['Make Arrangements for a Visiting Don',40,74,9,NY,60],
    ['Take Control of a Casino',70,75,9,NY,110],
    ['Travel to the Old Country',52,76,9,NY,82],
    ['Rob Your Cab Driver',12,1,1,CUBA,16],
    ['Secure A Safehouse',36,2,1,CUBA,49],
    ['Intimidate The Locals',52,3,1,CUBA,70],
    ['Silence a Noisy Neighbor',32,4,1,CUBA,44],
    ['Smuggle In Some Supplies',34,5,1,CUBA,45],
    ['Set Up A Numbers Racket',44,6,1,CUBA,60],
    ['Establish Contact With The FRG',38,7,1,CUBA,50],
    ['Take Out The Local Police Chief',41,8,1,CUBA,55],
    ['"Persuade" A Local To Talk',51,41,1,CUBA,69],
    ['Assault A Snitch\'s Hideout',56,42,1,CUBA,75],
    ['Transport A Shipment of US Arms',42,9,2,CUBA,62],
    ['Meet With The FRG Leadership',38,10,2,CUBA,54],
    ['Hold Up A Tour Bus',45,11,2,CUBA,65],
    ['Ambush A Military Patrol',51,12,2,CUBA,72],
    ['Capture An Army Outpost',56,13,2,CUBA,79],
    ['Sneak A Friend Of The Family Into The Country',35,14,2,CUBA,50],
    ['Ransack A Local Plantation',43,15,2,CUBA,61],
    ['Burn Down A Hacienda',58,16,2,CUBA,82],
    ['Offer "Protection" To A Nightclub',38,17,3,CUBA,56],
    ['Rob The Banco Nacional Branch',52,18,3,CUBA,77],
    ['Shake Down A Hotel Owner',40,19,3,CUBA,58],
    ['Bring The Local Teamsters Under Your Control',46,20,3,CUBA,68],
    ['Help The FRG Steal A Truckload Of Weapons',51,21,3,CUBA,74],
    ['Hijack A Booze Shipment',45,22,3,CUBA,67],
    ['Pillage A Shipyard',52,23,3,CUBA,75],
    ['Take Over The Docks',60,24,3,CUBA,88],
    ['Muscle In On A Local Casino',44,25,4,CUBA,67],
    ['Establish A Loansharking Business',49,26,4,CUBA,74],
    ['Eliminate A Rival Family\'s Agent',42,27,4,CUBA,64],
    ['Pass On Some Intel To The FRG',45,28,4,CUBA,67],
    ['Execute A Regional Arms Dealer',50,29,4,CUBA,76],
    ['Sink A Competing Smuggler\'s Ship',52,30,4,CUBA,78],
    ['Gun Down An Enemy Crew At The Airport',56,31,4,CUBA,85],
    ['Assassinate An Opposing Consigliere',62,32,4,CUBA,93],
    ['Raid The Arms Depot',53,33,5,CUBA,81],
    ['Supply The FRG With Some Extra Muscle',46,34,5,CUBA,70],
    ['Capture The Airport',56,35,5,CUBA,85],
    ['Knock Off A Visiting Head Of State',52,36,5,CUBA,79],
    ['Set Up A High Volume Smuggling Operation',55,37,5,CUBA,85],
    ['Blow Up A Rail Line',50,38,5,CUBA,77],
    ['Attack The Army Command Post',58,39,5,CUBA,88],
    ['Storm The Presidential Palace',70,40,5,CUBA,106],
    ['Arrange A New York Drug Shipment',62,43,6,CUBA,95],
    ['Launder Money Through A Resort',72,44,6,CUBA,110],
    ['Loot The National Museum',78,45,6,CUBA,117],
    ['Send Some Help Home To New York',64,46,6,CUBA,98],
    ['Take Over The Havana Reconstruction',82,47,6,CUBA,123],
    ['Help Get An Associate A No Bid Contract',56,48,6,CUBA,85],
    ['Trans-Ship A Container Full of Refugees',48,49,6,CUBA,73],
    ['Meet With "The Russian"',58,50,6,CUBA,89],
    ['Smuggle Consumer Electronics for the Vory',46,1,1,MOSCOW,61],
    ['Arrange A Drug Shipment for the Mafiya',40,2,1,MOSCOW,53],
    ['Fight Off An Ultra-National Gang',112,3,1,MOSCOW,115],
    ['Kidnap A Local Gang Leader for the Vory',47,4,1,MOSCOW,63],
    ['Collect The Ransom',50,5,1,MOSCOW,64],
    ['Receive Vory Intel On Dmitri',40,6,1,MOSCOW,54],
    ['Kill A Local Gang Leader for the Mafiya',47,7,1,MOSCOW,63],
    ['Collect the Hit Payoff',56,8,1,MOSCOW,76],
    ['Buy Mafiya Intel On Dmitri',52,9,1,MOSCOW,74],
    ['Threaten A Gang\'s Supplier',58,10,1,MOSCOW,79],
    ['Hijack An Arms Shipment From A Militant Gang',67,11,1,MOSCOW,90],
    ['Hospitalize Some Nationalists',76,12,1,MOSCOW,104],
    ['Confront Gang Leader Dmitri Leonov',76,13,1,MOSCOW,104],
    ['Bribe An Election Official',57,14,2,MOSCOW,81],
    ['Silence A Political Critic',53,15,2,MOSCOW,77],
    ['Violently Break Up A Campaign Rally',137,16,2,MOSCOW,148],
    ['Fix A Local Election for the Vory',66,17,2,MOSCOW,96],
    ['Extract A Favor From The Winner',97,18,2,MOSCOW,134],
    ['Catch Karpov Accepting A Bribe',77,19,2,MOSCOW,110],
    ['Abduct A Candidate\'s Wife For the Mafiya',66,20,2,MOSCOW,96],
    ['"Convince" The Candidate To Withdraw',90,21,2,MOSCOW,126],
    ['Kill An Investigative Reporter',75,22,2,MOSCOW,107],
    ['Pay Off The Port Authority In Arkhangelsk',57,23,2,MOSCOW,81],
    ['Re-route An Equipment Shipment',80,24,2,MOSCOW,111],
    ['Circulate Damaging Photos',99,25,2,MOSCOW,144],
    ['Take Down Party Boss Karpov',76,26,2,MOSCOW,109]
  );

  var missionTabs = [];
  missionTabs[NY] = new Array(
    'Street Thug (Levels 1-4)',
    'Associate (Levels 5-8)',
    'Soldier (Levels 9-12)',
    'Enforcer (Levels 13-17)',
    'Hitman (Levels 18-24)',
    'Capo (Levels 25-34)',
    'Consigliere (Levels 35-59)',
    'Underboss (Levels 60-99)',
    'Boss (Levels 100+)'
  );
  missionTabs[CUBA] = new Array(
    'El Soldado (Levels 35-59)',
    'El Capitan (Levels 60-84)',
    'El Jefe (Levels 85-109)',
    'El Patron (Levels 110-129)',
    'El Padrino (Levels 130-150)',
    'El Cacique (Levels 151+)'
  );
  missionTabs[MOSCOW] = new Array(
    'Baklany',
    'Boets'
  );

  var requirementJob = new Array(
    ['Liquor', 'Distill Some Liquor'],
    ['Tokens', 'Manufacture Tokens'],
    ['Wiretap Device', 'Overtake Phone Central'],
    ['1 Wiretap Device', 'Overtake Phone Central'],
    ['Cards', 'Get Cheating Deck'],
    ['Untraceable Cell Phone', 'Rob an Electronics Store'],
    ['Concealable Camera', 'Rob an Electronics Store'],
    ['Computer Set-Up', 'Rob an Electronics Store'],
    ['Blackmail Photos', 'Obtain Compromising Photos'],
    ['Illegal Transaction Records', 'Steal Bank Records'],
    ['.22 Pistol', 'Beat Up Rival Gangster'],
    ['Revolver', 'Beat Up Rival Gangster'],
    ['9mm Semi-Automatic', 'Rob a Pimp'],
    ['Butterfly Knife', 'Collect Protection Money'],
    ['Brass Knuckles', 'Rough Up Dealers'],
    ['Tactical Shotgun', 'Perform a Hit'],
    ['.45 Revolver', 'Take Out a Rogue Cop'],
    ['C4', 'Destroy Enemy Mob Hideout'],
    ['Stab-Proof Vest', 'Kill a Protected Snitch'],
    ['Automatic Rifle', 'Bust a Made Man Out of Prison'],
    ['Lucky Shamrock Medallion', 'Clip the Irish Mob\'s Local Enforcer'],
    ['Semi-Automatic Shotgun', 'Fight a Haitian Gang'],
    ['Firebomb', 'Steal a Tanker Truck'],
    ['Armored Truck', 'Smuggle Across the Border'],
    ['Grenade Launcher', 'Repel the Yakuza'],
    ['.50 Caliber Rifle', 'Disrupt Rival Smuggling Ring'],
    ['Armored Car', 'Invade Tong-controlled Neighborhood'],
    ['RPG Launcher', 'Sell Guns to the Russian Mob'],
    ['Bodyguards', 'Protect your City against a Rival Family'],
    ['Night Vision Goggles', 'Assassinate a Political Figure'],
    ['Napalm', 'Exterminate a Rival Family'],
    ['Prop plane', 'Steal an Air Freight Delivery'],
    ['Chopper', 'Run a Biker Gang Out of Town'],
    ['Luxury Yacht', 'Influence a Harbor Official'],
    ['GX9', 'Ransom a Businessman\'s Kids'],
    ['Bookie\'s Holdout Pistol', 'Fix the Big Game'],
    ['Multi-Purpose Truck', 'Break Into the Armory'],
    ['BA-12 Assault Rifle', 'Rip Off the Armenian Mob'],
    ['Falsified Documents', 'Take Over an Identity Theft Ring'],
    ['Federal Agent', 'Buy Off a Federal Agent'],
    ['Private Jet', 'Make a Deal with the Mexican Cartel'],
    ['Police Cruiser', 'Blackmail the District Attorney'],
    ['Armoured Limousine', 'Shake Down a City Council Member'],
    ['Cigarette Boat', 'Take Over The Docks'],
    ['TNT', 'Raid The Arms Depot'],
    ['Si-14 Cargo Plane', 'Capture The Airport'],
    ['Armored State Car', 'Storm The Presidential Palace'],
    ['Dossier on Dmitri', 'Receive Vory Intel On Dmitri'],
    ['Dossier on Dmitri', 'Buy Mafiya Intel On Dmitri'],
    ['Ballistic Knife', 'Silence A Political Critic'],
    ['Severnyy Olen Snowbike', 'Extract A Favor From The Winner'],
    ['Set of Photos of Karpov', 'Kill An Investigative Reporter'],
    ['Set of Photos of Karpov', 'Catch Karpov Accepting A Bribe'],
    ['RAS-15', '"Convince" The Candidate To Withdraw']
  );

  // FIXME: Should this be selectable by users?
  // These jobs pays 5, 3, 2, 1 exp respectively.
  var expBurners = [2, 1, 4, 0];

  String.prototype.trim = function() {
    return this.replace(/^\s+|\s+$/g, '');
  }
  String.prototype.ltrim = function() {
    return this.replace(/^\s+/, '');
  }
  String.prototype.rtrim = function() {
    return this.replace(/\s+$/, '');
  }
  String.prototype.untag = function() {
    return this.replace(/<[^>]*>/g, '');
  }

  Array.prototype.searchArray = function(target, index) {
    // To use this method, "this" must be an array of arrays. Each array
    // contained in "this" has one of its elements (specified by the
    // "index" parameter) compared against the target parameter. An array
    // is returned that contains the indices of "this" in which a match
    // was found.
    //
    // NOTE: "target" can be a regular expression. If the array element
    //       is a string, it is compared for a pattern match.
    var returnArray = [];
    for (var i = 0, iLength = this.length; i<iLength; ++i) {
      if (typeof(target) == 'function' &&
          typeof(this[i][index]) == 'string') {
        // Assume target is a regex to be matched against the string.
        if (target.test(this[i][index])) {
          returnArray.push(i);
        }
      } else if (this[i][index] === target) {
        returnArray.push(i);
      }
    }
    return returnArray.length? returnArray : false;
  }

  // Array.unique() - Remove duplicate values
  Array.prototype.unique = function() {
    var a = [];
    var l = this.length;
    for (var i=0; i < l; ++i) {
      for (var j = i + 1; j < l; ++j) {
        // If this[i] is found later in the array
        if (this[i] === this[j])
          j = ++i;
      }
      a.push(this[i]);
    }
    return a;
  };

  // Set the initial run state.
  if (typeof GM_getValue('isRunning') != 'boolean') {
    // FIXME: Perhaps it should be false, and instead pop up an alert
    //        asking the user to check the settings?
    GM_setValue('isRunning', true);
  }
  running = GM_getValue('isRunning');

  // Check for a version change.
  if (GM_getValue('version') != SCRIPT.version ||
      GM_getValue('build') != SCRIPT.build) {
    handleVersionChange();
  }

  // Check for missing settings.
  if (GM_getValue('autoClick') == undefined) {
    saveDefaultSettings();
    addToLog('info Icon', 'If you want to perform jobs, fighting, and other actions automatically, please adjust your settings.');
  }

  var Reload = new Animate();
  Reload.desc = 'reload';
  var Autoplay = new Animate();
  Autoplay.desc = 'auto-play';
  Autoplay.fx = loadHome;

  // This line is optional, but it makes the menu display faster.
  customizeMasthead();

  // Add event listeners.
  setListenContent(true);
  setListenFBNotifications(true);
  setListenAutoSkip(true);

  // Make sure the modification timer goes off at least once.
  setModificationTimer();

  var initialized = true;
  DEBUG('Completed initialize.');
}

function Animate() {
  this.TOUT = null;
  this.desc = '';
  this.fx = null;
  this.delay = null;
}

Animate.prototype.clearTimeout = function() {
  if (this.TOUT) {
    DEBUG('Clearing ' + this.desc + ' timer ' + this.TOUT + '.');
    clearTimeout(this.TOUT);
    this.TOUT = null;
  }
}

Animate.prototype.setTimeout = function(fx, delay) {
  this.clearTimeout();
  this.fx = fx;
  this.delay = delay;
  // Make the handler clear TOUT. This prevents attempts
  // to clear timers that have already gone off.
  var obj = this;
  this.TOUT = window.setTimeout(function () { obj.TOUT = null; fx(); }, delay);
  DEBUG('Started ' + this.desc + ' timer ' + this.TOUT +
        ', delay=' + delay/1000 + ' sec.');
}

Animate.prototype.start = function() {
  if (running && settingsOpen === false) {
    this.setTimeout(this.fx, this.delay);
  } else if (settingsOpen === true) {
    DEBUG('Settings box open. Not starting ' + this.desc + ' timer.');
  } else {
    DEBUG('Autoplayer paused. Not starting ' + this.desc + ' timer.');
  }
}

if (!refreshGlobalStats()) {
  // Handle "try again" error pages.
  var tryAgainElt = document.getElementById('try_again_button');
  if (tryAgainElt) {
    var delay = 10;
    var p = document.createElement('p');
    var wait = function() {
      if (!delay) return tryAgainElt.click();
      p.innerHTML = 'You will automatically try again in ' +
                    delay-- + ' seconds.';
      window.setTimeout(wait, 1000);
    }
    DEBUG('Service interruption: "Try Again" button seen.');
    tryAgainElt.parentNode.appendChild(document.createElement('br'));
    tryAgainElt.parentNode.appendChild(p);
    wait();
    return;
  }

  // Start a timer to reload the page if nothing else happens.
  Autoplay.fx = function() {
    // Unrecognized page.
    if (!document.body) {
      DEBUG('No body. Possible redirect, white out or slow load?');
    } else {
      DEBUG('Can\'t read page. Possible white out?');
    }
    loadHome();
  }
  Autoplay.delay = 10000;
  Autoplay.start();

  // Stop the script. (The timer will still go off and reload.)
  return;
}

// Set up auto-reload (if enabled).
autoReload();

checkLanguage();

refreshSettings();

if (GM_getValue('logOpen') == 'open') {
  showMafiaLogBox();
}
return;
///////////////////////////////////////////////////////////////////////////////
//   End of top-level code. Automatic play is kicked off by doAutoPlay().    //
///////////////////////////////////////////////////////////////////////////////


function doAutoPlay () {
  // Set the default auto-play timer function and delay.
  Autoplay.fx = goHome;
  Autoplay.delay = getAutoPlayDelay();

  var propertyDamage = GM_getValue('propertyDamage', PROP_OK);
  var previouslyIdle = idle;
  idle = false;

  // Auto-heal
  if (running &&
      GM_getValue('autoHeal') == 'checked' &&
      health < GM_getValue('healthLevel', 0) &&
      (health > 19 || autoStamBurnif ||
       (health < 20 && canHeal()))) {
    autoHeal();
    return;
  }

  // Determine whether a job and/or fight/rob could be attempted.
  var autoMissionif = running && canMission();
  var autoStaminaSpendif = running && !skipStaminaSpend && canSpendStamina();
  var maxed = (autoMissionif && energy >= maxEnergy) ||
              (autoStaminaSpendif && stamina >= maxStamina);

  // Auto-accept
  if (running && !maxed && invites > 0 &&
      GM_getValue('acceptMafiaInvitations') == 'checked') {
    if (autoAccept()) return;
  }

  // Auto-repair
  if (running && !maxed &&
      GM_getValue('autoRepair') == 'checked' &&
      propertyDamage == PROP_REPAIR) {
    if (autoRepair()) return;
  }

  // Auto-protect
  if (running && !maxed &&
      GM_getValue('autoProtect') == 'checked' &&
      propertyDamage == PROP_PROTECT) {
    if (autoProtect()) return;
  }

  // Player updates
  if (running && !maxed && GM_getValue('logPlayerUpdates') == 'checked') {
    if (autoPlayerUpdates()) return;
  }

  // Auto-take for properties (NY)
  if (running && !maxed && GM_getValue('collectNYTake') == 'checked' && ((new Date() >= new Date(GM_getValue('nextNYTake', 0))) || GM_getValue('nextNYTake', 0) == 0)) {
      if (collectNYTake()) return;
  }

  // Auto-bank (NY)
  if (running &&
      city == NY &&
      GM_getValue('autoBank') == 'checked' &&
      cash[NY] >= parseInt(GM_getValue('bankConfig'))) {
    if (autoBankDeposit()) return;
  }

  // Auto-sell business output (Cuba).
  if (running && !maxed && level >= 35 &&
      GM_getValue('autoSellCrates') == 'checked' &&
      GM_getValue('sellHour' + cities[CUBA], -1) != new Date().getHours()) {
    if (autoSellCrates(CUBA)) return;
  }

  // Auto-bank (Cuba)
  if (running &&
      city == CUBA &&
      GM_getValue('autoBankCuba') == 'checked' &&
      cash[CUBA] >= parseInt(GM_getValue('bankConfigCuba'))) {
    if (autoBankDeposit()) return;
  }

  // Auto-sell business output (Moscow).
  if (running && !maxed && level >= 70 &&
      GM_getValue('autoSellCratesMoscow') == 'checked' &&
      GM_getValue('sellHour' + cities[MOSCOW], -1) != new Date().getHours()) {
    if (autoSellCrates(MOSCOW)) return;
  }

  // Auto-bank (Moscow)
  if (running &&
      city == MOSCOW &&
      GM_getValue('autoBankMoscow') == 'checked' &&
      cash[MOSCOW] >= parseInt(GM_getValue('bankConfigMoscow'))) {
    if (autoBankDeposit()) return;
  }

  // Auto-stat
  if (running && !maxed && stats > 0 && GM_getValue('autoStat') == 'checked' && !parseInt(GM_getValue('restAutoStat')) ) {
    if (autoStat()) return;
  }

  // Auto-buy properties
  if (running && !maxed && GM_getValue('autoBuy') == 'checked') {
    if (propertyBuy()) return;
  }

  // Auto-lotto
  if (running && !maxed && GM_getValue('autoLottoOpt') == 'checked') {
    if (autoLotto()) return;
  }

  // Auto-energypack
  var ptsFromEnergyPack = maxEnergy * 1.25 * getEnergyGainRate();
  var ptsToLevelProjStaminaUse = ptsToNextLevel - stamina*getStaminaGainRate();
  var autoEnergyPackWaiting = running && energyPack &&
                              ptsFromEnergyPack <= ptsToLevelProjStaminaUse &&
                              GM_getValue('autoEnergyPack') == 'checked';
  if (autoEnergyPackWaiting && energy <= 2) {
    //FIXME: Use click simulation instead of a URL.
    var link = 'http://apps.facebook.com/' + SCRIPT.name +
               SCRIPT.controller + 'index' +
               SCRIPT.action + 'use_and_energy_all' +
               SCRIPT.city + (city + 1);
    DEBUG('ptsToNextLevel=' + ptsToNextLevel +
          'ptsToLevelProjStaminaUse=' + ptsToLevelProjStaminaUse);
    addToLog('energyPack Icon', 'This energy pack should give you approximately ' + parseInt(ptsFromEnergyPack) + ' xp of your ' + parseInt(ptsToLevelProjStaminaUse) + ' projected remaining xp.' );
    takeAction(link, 'energypack');
    Autoplay.start();
    return;
  }

  // Do jobs or fight/rob. Give priority to spending stamina if it needs
  // to be burned and using one won't level up. Give priority to jobs if
  // within one stamina of leveling, or if an energy pack is waiting, or
  // if energy is fuller than than stamina (in percentage terms).
  if (autoMissionif &&
      !(autoStaminaSpendif && autoStamBurnif && ptsToNextLevel > 6) &&
      (ptsToNextLevel <= 6 ||
       autoEnergyPackWaiting ||
       energy/maxEnergy >= stamina/maxStamina)) {
    autoMission();
    return;
  }
  if (autoStaminaSpendif) {
    if (autoStaminaSpend()) return;

    // Attempt failed. Let some other action happen before trying again
    skipStaminaSpend = true;
  }
  if (autoMissionif) {
    autoMission();
    return;
  }

  // Auto-send energy pack
  if (running && GM_getValue('sendEnergyPack') == 'checked') {
    if (autoSendEnergyPack()) return;
  }

  // If we reach this point, the script is considered to be idle. Anything the
  // script might do when there is nothing else to do should go below here.
  idle = true;

  // If not previously idle, check the home page.
  if (running && !previouslyIdle) {
    DEBUG('Now idle. Checking the home page.');
    Autoplay.start();
    return;
  }

  // Check for property damage. This way we are not adding any overhead, except
  // on pages that we are not doing anything anyways. All this does is go to
  // the Properties page, which causes the damage to be checked automatically.
  if (running &&
      ((GM_getValue('autoProtect') == 'checked' &&
        propertyDamage < PROP_PROTECT) ||
       (GM_getValue('autoRepair') == 'checked' &&
        propertyDamage < PROP_REPAIR))) {
    // Make sure we're in New York.
    if (city != NY) {
      Autoplay.fx = goNY;
      Autoplay.start();
      return;
    }

    // Go to the property page.
    if (!onPropertyNav()) {
      Autoplay.fx = goPropertyNav;
      Autoplay.start();
      return;
    }
  }

  // If fight/rob is being skipped, turn it back on and go to the home page
  if (running && staminaFlag && skipStaminaSpend) {
    skipStaminaSpend = false;
    staminaFlag = false;
    Autoplay.start();
    return;
  }

  // Idle in preferred city (every 10 seconds of idling) if not in the same city
  if (running && idle && city != GM_getValue('idleLocation', NY)) {
    DEBUG('Idling. Moving to ' + cities[GM_getValue('idleLocation', NY)] + '. ');
    goLocation(GM_getValue('idleLocation',NY));
  }
}

function getAutoPlayDelay() {
  return Math.floor(parseFloat(GM_getValue('d1', '3')) + parseFloat((GM_getValue('d2', '5'))-parseFloat(GM_getValue('d1', '3')))*Math.random())*1000;
}

function autoReload() {
  if (GM_getValue('autoClick') == 'checked') {
    Reload.fx    = function() {
      // Try the "nice" way first, but reload completely if that doesn't work.
      goHome();
      Reload.fx = loadHome;
      Reload.delay = 10000;
      Reload.start();
    };
    Reload.delay = Math.floor(parseFloat(GM_getValue('r1', '30')) +
                   parseFloat((GM_getValue('r2', '110')) -
                   parseFloat(GM_getValue('r1', '30')))*Math.random())*1000;
    Reload.start();
  }
}

function autoRepair() {
  Autoplay.delay = getAutoPlayDelay();

  // Make sure we're in New York.
  if (city != NY) {
    Autoplay.fx = goNY;
    Autoplay.start();
    return true;
  }

  // Make sure we've got enough cash outside the bank.
  var cost = parseCash(GM_getValue('propertyDamageCost', 0));
  if (cost > cash[city]) {
    return autoBankWithdraw(cost - cash[city]);
  }

  if (!useClickSimulation) {
    var link = 'http://apps.facebook.com/' + SCRIPT.name +
               SCRIPT.controller + 'property' +
               SCRIPT.action + 'repair_all' +
               SCRIPT.city + (city + 1);
    takeAction(link, 'repair', { cost: cost });
    Autoplay.fx = goPropertyNav;
    Autoplay.start();
    return true;
  }

  // Make sure we're on the property page.
  if (!onPropertyNav()) {
    Autoplay.fx = goPropertyNav;
    Autoplay.start();
    return true;
  }

  // Repair the property.
  var elt = xpathFirst('.//a[contains(., "Repair all")]', innerPageElt);
  if (!elt) {
    addToLog('warning Icon', 'BUG DETECTED: Can\'t find repair link.');
    return false;
  }
  Autoplay.fx = function() {
    clickAction = 'repair';
    clickContext = { cost : cost };
    clickElement(elt);
  };
  Autoplay.start();
  return true;
}

function autoProtect() {
  Autoplay.delay = getAutoPlayDelay();

  // Make sure we're in New York.
  if (city != NY) {
    Autoplay.fx = goNY;
    Autoplay.start();
    return true;
  }

  // Make sure we've got enough cash outside the bank.
  var cost = parseCash(GM_getValue('propertyDamageCost', 0));
  if (cost > cash[city]) {
    return autoBankWithdraw(cost - cash[city]);
  }

  if (!useClickSimulation) {
    var link = 'http://apps.facebook.com/' + SCRIPT.name +
               SCRIPT.controller + 'property' +
               SCRIPT.action + 'protect_all' +
               SCRIPT.city + (city + 1);
    takeAction(link, 'protect', { cost: cost });
    Autoplay.fx = goPropertyNav;
    Autoplay.start();
    return true;
  }

  // Make sure we're on the property page.
  if (!onPropertyNav()) {
    Autoplay.fx = goPropertyNav;
    Autoplay.start();
    return true;
  }

  // Protect the property.
  var elt = xpathFirst('.//a[contains(., "Protect all")]', innerPageElt);
  if (!elt) {
    addToLog('warning Icon', 'BUG DETECTED: Can\'t find protection link.');
    return false;
  }
  Autoplay.fx = function() {
    clickAction = 'protect';
    clickContext = { cost : cost };
    clickElement(elt);
  };
  Autoplay.start();
  return true;
}

function autoAccept() {
  if (!useClickSimulation) {
    loadAccept();
    return true;
  }

  // Make sure we're on the recruiting page.
  var elt = xpathFirst('.//li[contains(@class, "tab_on")]//a[contains(., "Recruit")]', innerPageElt);
  if (!elt) {
    elt = xpathFirst('//div[@class="mafia_link"]//a[3]');
    if (!elt) {
      DEBUG('Can\'t find recruit link to click. Using fallback method.');
      loadAccept();
      return true;
    }
    Autoplay.fx = function() {
      clickElement(elt);
      DEBUG('Clicked to go to recruit tab.');
    };
    Autoplay.start();
    return true;
  }

  // Get the "accept all" link.
  elt = xpathFirst('.//a[contains(., "accept all")]', innerPageElt);
  if (!elt) {
    DEBUG('Can\'t find accept link to click. Using fallback method.');
    loadAccept();
    return true;
  }

  // Accept all invitations.
  Autoplay.fx = function() {
    clickAction = 'accept';
    clickElement(elt);
    DEBUG('Clicked to accept.');
  };
  Autoplay.start();
  return true;
}

function autoSendEnergyPack() {
  if (timeLeftGM('energyAllTimeLeft') > 0) return false;

  // Make sure we're on the home page.
  if (!onHome()) {
    Autoplay.fx = goHome;
    Autoplay.start();
    return true;
  }

  // Reset the timer.
  setGMTime('energyAllTimeLeft','1 hour');

  // Send energy packs.
  var sendPackButton = xpathFirst('.//div[@class="energy_all_prompt"]//a[contains(., "Send")]', innerPageElt);
  if (sendPackButton) {
    clickElement(sendPackButton);
    addToLog('info Icon','You have sent energy packs to your Mafia.');
    return true;
  } else {
      DEBUG('WARNING: Can\'t find inner button to send mafia energy pack.');
      return false;
  }

  return false;
}

function autoHeal() {
  // NOTE: In the interest of time, delays are waived.
  Autoplay.delay = 0;

  // Make sure we're in the preferred city.
  var healLocation = parseInt(GM_getValue('healLocation', NY));

  if (city != healLocation) {
    Autoplay.fx = function() { goLocation(healLocation); }
    Autoplay.start();
    return;
  }

  if (!useClickSimulation) {
    var link = 'http://apps.facebook.com/' + SCRIPT.name +
               SCRIPT.controller + 'hospital' +
               SCRIPT.action + 'heal' +
               SCRIPT.city + (city + 1);
    takeAction(link, 'heal');
    Autoplay.fx = goHome;
    Autoplay.start();
    return;
  }

  // Use our custom instant-heal element (if present).
  healElt = xpathFirst('.//a[contains(., "Heal your character")]', innerPageElt);
  if (!healElt) {
    var healElt = document.getElementById('ap_heal');
    if (!healElt) {
      DEBUG('WARNING: Can\'t find instant-heal link.');
      // Go to the hospital.
      var hospitalElt = xpathFirst('//a[@class="heal_link"]');
      if (hospitalElt) {
        Autoplay.fx = function() {
          clickElement(hospitalElt);
          DEBUG('Clicked to go to hospital.');
        };
        Autoplay.start();
      } else {
        addToLog('warning Icon', 'WARNING: Can\'t find hospital link.');
      }
      return;
    }
  }

  // Found a heal link. Click it.
  Autoplay.fx = function() {
    clickAction = 'heal';
    clickElement(healElt);
    DEBUG('Clicked to heal.');
  };
  Autoplay.start();

  return;
}

function autoSellCrates(sellCity) {
  // Go to the correct city.
  if (city != sellCity) {
    Autoplay.fx = goLocation(sellCity);
    Autoplay.start();
    return true;
  }

  // Go to the businesses.
  if (!xpathFirst('.//div[@class="business_description"]', innerPageElt)) {
    Autoplay.fx = goBusinessesNav;
    Autoplay.start();
    return true;
  }

  // Sell anything we can.
  elt = xpathFirst('.//div[@class="business_sell_row"]/div[@class="business_sell_button"]//a', innerPageElt);
  if (elt) {
    Autoplay.fx = function() {
      clickAction = 'sell output';
      clickElement(elt);
      DEBUG('Clicked to sell output.');
    };
    Autoplay.start();
    return true;
  }

  // Nothing to sell.
  GM_setValue('sellHour' + cities[sellCity], new Date().getHours());
  DEBUG('All business output in ' + cities[sellCity] + ' sold. Checking again in an hour.');
  return false;
}

function collectNYTake() {
  // Go to the correct city.
  if (city != NY) {
    Autoplay.fx = goNY;
    Autoplay.start();
    return true;
  }

  if (onPropertyNav()) {
    var takeTimer = xpathFirst('.//span[@id="' + SCRIPT.appID + '_prop_eng_timer_span"]', innerPageElt);
    if (takeTimer) {
      var prodReadyIn = timeLeft(takeTimer.innerHTML);
      if (prodReadyIn == 0 || prodReadyIn >= 10500) { //If the timer says between 0 or 2:55:00
        var elt = xpathFirst('.//a[contains(., "Collect take")]', innerPageElt);
        if (elt) {
          Autoplay.fx = function() {
            clickAction = 'collect ny take';
            clickElement(elt);
            DEBUG('Collecting NY Take');
            setGMTime("nextNYTake", "3:00:00");
          };
          Autoplay.start();
          return true;
        } else {
          // Nothing to collect.
          setGMTime("nextNYTake", takeTimer.innerHTML);
          var d = new Date();
          d.setMilliseconds(0);
          d.setTime(d.getTime()+(timeLeft(takeTimer.innerHTML)*1000));
          DEBUG('The take has been collected. Coming back at: ' + d);
          return false;
        }
      } else {
        //It's more than 5 minutes after a take being ready, so we'll come back when the next take is ready.
        setGMTime("nextNYTake", takeTimer.innerHTML);
        var d = new Date();
        d.setMilliseconds(0);
        d.setTime(d.getTime()+(timeLeft(takeTimer.innerHTML)*1000));
        DEBUG('Take will be available at: ' + d);
        return false;
      }
    } else {
      //Disabling collect NY take
      GM_setValue("collectNYTake", 0);
      DEBUG('Turning off collect NY Take. Player does not have take timer.')
    }
  } else {
    Autoplay.fx = goPropertyNav;
    Autoplay.start();
    return true;
  }
}

function autoPlayerUpdates() {
  // Get the updates.
  var pUpdates = xpath('.//div[@class="update_item"]', innerPageElt);
  var pUpdatesLen = pUpdates.snapshotLength;
  var logPlayerUpdatesCount = GM_getValue('logPlayerUpdatesCount');
  if (logPlayerUpdatesCount == undefined) {
    // The settings must have been cleared. Assume all updates were read.
    logPlayerUpdatesCount = pUpdatesLen;
    GM_setValue('logPlayerUpdatesCount', logPlayerUpdatesCount);
  }

  // Are there are less updates than we've already seen?
  // FIXME: This could be better. Need to also detect the case where we are
  //        on the home page with zero updates showing and a non-zero count.
  if (pUpdatesLen > 0 && logPlayerUpdatesCount > pUpdatesLen) {
    // The player updates must have been cleared.
    DEBUG('Player updates were unexpectedly cleared.');
    logPlayerUpdatesCount = 0;
    GM_setValue('logPlayerUpdatesCount', 0);
  }

  // Process new updates.
  if (logPlayerUpdatesCount < pUpdatesLen) {
    DEBUG('Parsing new player updates.');
    for (var i = pUpdatesLen - logPlayerUpdatesCount - 1; i >= 0; i--) {
      if (!parsePlayerUpdates(pUpdates.snapshotItem(i))) return true;
      GM_setValue('logPlayerUpdatesCount', ++logPlayerUpdatesCount);
    }
  }

  // Clear the updates.
  if (pUpdatesLen > GM_getValue('logPlayerUpdatesMax', 20) &&
      logPlayerUpdatesCount == pUpdatesLen) {
    Autoplay.fx = goDeleteNews;
    Autoplay.start();
    return true;
  }

  return false;
}

function autoStat() {
  var link = 'http://apps.facebook.com/' + SCRIPT.name +
             SCRIPT.controller + 'stats' +
             SCRIPT.action + 'upgrade' +
             SCRIPT.city + (city + 1);

  // Array containers for status settings
  var curStats = [curAttack,curDefense,maxHealth,maxEnergy,maxStamina,maxInfluence];
  var modeStats = [level,curAttack,curDefense,maxHealth,maxEnergy,maxStamina,maxInfluence];
  var statPts = new Array(curStats.length);
  var statFallbacks = new Array(curStats.length);

  for (var i = 0, iLength = curStats.length; i < iLength; ++i) {
    // Calculate the Points needed to reach target stat
    var ratio = new Number(GM_getValue(autoStatRatios[i]));
    var base = new Number(GM_getValue(autoStatBases[i]));
    statPts[i] = ratio * modeStats[GM_getValue(autoStatModes[i])] + base - curStats[i];

    // Account for priority
    statPts[i] = statPts[i] * (Math.pow(10,4) / Math.pow(10, GM_getValue(autoStatPrios[i])));

    // Fallback method
    statFallbacks[i] = GM_getValue(autoStatFallbacks[i]) == 'checked' ? i : '';

    //DEBUG(autoStatDescrips[i+1] + ' B/R/M/Cur/P/F/Pts: ' + GM_getValue(autoStatBases[i]) + '/' + GM_getValue(autoStatRatios[i]) + '/' + GM_getValue(autoStatModes[i]) + '/' + curStats[i] + '/' + GM_getValue(autoStatPrios[i]) + '/' + GM_getValue(autoStatFallbacks[i]) + '/' + statPts[i] );
  }

  // Get max "Points to Target" stat value, increment the stat with the highest PtsToTarget
  var maxPts = Math.max.apply(Math, statPts);

  DEBUG('Max: ' + maxPts + ' Att: ' + statPts[0] + ' Def: ' + statPts[1] +
        ' Hea: ' + statPts[2] + ' Ene: ' + statPts[3] + ' Sta: ' + statPts[4] +
        ' Inf: ' + statPts[5]);

  // Disable auto-stat when status goals are reached and autoStatDisable is checked
  if (maxPts <= 0 && GM_getValue('autoStatDisable') == 'checked') {
    addToLog('info Icon', 'All status goals met, please update your goals.');
    GM_setValue('autoStat', 0);
    return false;
  }

  // Increment the status corresponding to the nextStat variable (fallback)
  // by setting the corresponding stat as the maxPts
  if (maxPts <= 0) {
    maxPts = 1;
    if (statFallbacks.join('') != '') {
      DEBUG('Status GOALS reached, using fallback method.');
      var nextStat = parseInt(GM_getValue('nextStat', ATTACK_STAT));

      // Search for next Stat to increment
      while (statFallbacks.indexOf(nextStat) == -1)
        nextStat = (nextStat + 1) % curStats.length;

      DEBUG('Next stat in fallback mode: ' + autoStatDescrips[nextStat + 1]);
      statPts[nextStat] = maxPts;
    } else {
      // Do not call autoStat until next level Up
      DEBUG('Status GOALS reached, waiting till next level up.');
      GM_setValue('restAutoStat', 1);
      return false;
    }
  }

  GM_setValue('restAutoStat', 0);

  // Add stats to the attribute corresponding to the maxPts
  var statIndex = statPts.indexOf(maxPts);
  switch (statIndex) {
    case ATTACK_STAT    : link += '&upgrade_key=attack';         break;
    case DEFENSE_STAT   : link += '&upgrade_key=defense';        break;
    case HEALTH_STAT    : link += '&upgrade_key=max_health';     break;
    case ENERGY_STAT    : link += '&upgrade_key=max_energy';     break;
    case INFLUENCE_STAT : link += '&upgrade_key=max_influence';  break;
    case STAMINA_STAT   : if (stats < 2) {
                            GM_setValue('restAutoStat', 1);
                            DEBUG ('Not enough status points, waiting till next level up.');
                            return false;
                          }
                          link += '&upgrade_key=max_stamina';    break;
    default             :
      // Disable auto-stats when maxPts calculated is NaN
      GM_setValue('autoStat', 0);
      addToLog('warning Icon', 'BUG DETECTED: Invalid calculated maxPts value "' + maxPts + '". Auto-stat disabled.');
      return false;
  }
  DEBUG('Stats available.');

  takeAction(link, 'stats');
  Autoplay.start();
  return true;
}

function canMission() {
  if (GM_getValue('autoMission') != 'checked') return false;
  if (GM_getValue('multipleJobs') == 'checked' &&
      getSavedList('jobsToDo').length == 0) {
    var availableJobs = eval(GM_getValue("availableJobs", "({0:{},1:{},2:{}})"));
    var masteredJobs = eval(GM_getValue("masteredJobs", "({0:{},1:{},2:{}})"));
    var expLeft = lvlExp - curExp;
    var ratio = Math.round(expLeft / energy * 100) / 100;
    var multiple_jobs_list = getSavedList('selectMissionMultiple');
    var energyBonus = 1 - (GM_getValue('selectEnergyBonus', 0) / 100);
    var expBonusMultiplier = 1 + (GM_getValue('selectExpBonus', 0) / 100);
    var multiple_jobs_ratio_sorted = [];
    var jobs_selection = [];
    var singleJobLevelUp = [];
    var enoughEnergy = false;

    // mission mastery code
    var ignore_jobs_list = getSavedList('ignoredJobsList');
    var mastery_jobs_list = getSavedList('masteryJobsList');
    for (var i=0, iLength=mastery_jobs_list.length; i < iLength; ++i) {
      // Filters jobs on the ignorelist
      var job = mastery_jobs_list[i];

      // Only push jobs that does not exist on the main list
      if (multiple_jobs_list.indexOf(multiple_jobs_list[i]) == -1) {
        multiple_jobs_list.push(job);
        // Tag job as mastery
        missions[job][9] = true;
      }
    }

    for (var i=0, iLength= multiple_jobs_list.length; i < iLength; ++i) {
      var job = multiple_jobs_list[i];
      var mission = missions[job];
      // This should enable us to use mastery jobs for single job level ups
      var singleJobLevelUpPossible = false;

      // Ignore jobs that are not yet available
      if (availableJobs[mission[4]][mission[3]] != null &&
         availableJobs[mission[4]][mission[3]].indexOf(parseInt(job)) == -1) {
        continue;
      }

      // Determine the job's experience-to-energy ratio.
      // FIXME: Should somehow combine with calcEnergyCost()
      var cost = mission[1];
      if (cost > 5) {
        cost = Math.floor(cost * energyBonus);
      }
      var reward = mission[5];
      if (GM_getValue('hasPrivateIsland') == 'checked') {
        reward = Math.round(reward * 1.05);
      }
      reward = Math.floor(reward * expBonusMultiplier);
      var job_ratio = Math.round(reward / cost * 100) / 100;

      mission[6] = reward;
      mission[7] = job_ratio;
      mission[8] = cost;

      if (mission[8] <= energy) {
        enoughEnergy = true;
        if (mission[6] >= expLeft) {
          singleJobLevelUp.push(job);
          singleJobLevelUpPossible = true;
        }
      }

      // Ignore mastered jobs unless it can do a single job level up
      if (masteredJobs[mission[4]][mission[3]] != null &&
          masteredJobs[mission[4]][mission[3]].indexOf(parseInt(job)) != -1 &&
          singleJobLevelUpPossible == false) {
        continue;
      }

      multiple_jobs_ratio_sorted.push(job);
    }
    multiple_jobs_ratio_sorted.sort(function(a, b) { return missions[b][7] - missions[a][7]; });
    if (!enoughEnergy) return false;

    var doJob;
    if (singleJobLevelUp.length > 0) {
      singleJobLevelUp.sort(function(a, b) { return missions[b][6] - missions[a][6]; });
      // One job is enough to level up. Pick the one that pays the most.
      doJob = singleJobLevelUp[0];

      // Burn up exp before leveling up to maximize energy
      for (var i=0, iLength=expBurners.length; i < iLength; ++i) {
        var expBurner = expBurners[i];
        if( (energy - missions[singleJobLevelUp[0]][8]) > missions[expBurner][1] &&
           expLeft > Math.floor(missions[expBurner][5] * 1.5) ) {
          doJob = expBurner;
          break;
        }
      }
    } else {
      // Can't level up. Pick a job we can do whose ratio is high enough.
      for (var i=0; i < multiple_jobs_ratio_sorted.length; i++) {
        if (energy >= missions[multiple_jobs_ratio_sorted[i]][8] &&
            ratio <= missions[multiple_jobs_ratio_sorted[i]][7]) {
          jobs_selection.push(multiple_jobs_ratio_sorted[i]);
        }
      }
      if (jobs_selection.length == 0) {
        // No jobs meet the ratio necessary to level up. Go with the highest.
        doJob = multiple_jobs_ratio_sorted[0];
      } else {
        // Pick the one with the lowest ratio.
        doJob = jobs_selection[jobs_selection.length-1];
      }
    }
    if (GM_getValue('selectMission') != doJob) {
      addToLog('info Icon', 'Switching job to ' + missions[doJob][0] + '.');
      GM_setValue('selectMission', doJob);
    }
  }

  if (energy < calcEnergyCost()) {
    DEBUG('Skipping jobs: energy=' + energy + ', cost=' + calcEnergyCost());
    return false;
  }
  if (energy < maxEnergy && GM_getValue('waitForFull') == 'checked') {
    DEBUG('Skipping jobs: energy=' + energy + '/' + maxEnergy + ', waiting');
    return false;
  }
  return true;
}

function autoMission() {
  var jobno       = missions[GM_getValue('selectMission', 1)][2];
  var tabno       = missions[GM_getValue('selectMission', 1)][3];
  var cityno      = missions[GM_getValue('selectMission', 1)][4];

  // Go to the correct city.
  if (city != cityno) {
    Autoplay.fx = function() { goLocation(cityno); };
    Autoplay.start();
    return;
  }

  // Go to the correct job tab.
  if (!onJobTab(tabno)) {
    Autoplay.fx = function() { goJobTab(tabno); };
    Autoplay.start();
    return;
  }

  // Do the job.
  if (useClickSimulation) {
    Autoplay.fx = function() { goJob(jobno); };
    Autoplay.start();
  } else {
    var link = 'http://apps.facebook.com/' + SCRIPT.name +
               SCRIPT.controller + 'job' +
               SCRIPT.action + 'dojob' +
               SCRIPT.city + (city + 1) +
               '&job=' + jobno +
               '&tab=' + tabno;
    takeAction(link, 'job');
  }
}

function currentJobTab() {
  var elt = xpathFirst('.//ul[contains(@id, "' + SCRIPT.appID + '_jobs_bar")]/li[contains(@class, "tab_on")]//a', innerPageElt);
  if (!elt || !elt.getAttribute('onclick').match(/tab=(\d+)/)) {
    return -1;
  }
  return parseInt(RegExp.$1);
}

function onJobTab(tabno) {
  return currentJobTab() == tabno? true : false;
}

function canHeal() {
  // Heal immediately
  if (GM_getValue('forceHealOpt1') == 'checked')
    return true;

  // Heal when health reaches 20
  if (GM_getValue('forceHealOpt2') == 'checked' && health >= 20)
    return true;

  // Heal when stamina can be spent
  if (GM_getValue('forceHealOpt3') == 'checked' && canSpendStamina(1))
    return true;

  // Heal when stamina is full
  if (GM_getValue('forceHealOpt4') == 'checked' && stamina >= maxStamina)
    return true;

  // Heal after 5 minutes
  if (GM_getValue('forceHealOpt5') == 'checked' && GM_getValue('healWaitStarted') && !timeLeftGM('healWaitTime')) {
    GM_setValue('healWaitStarted',false);
    return true;
  }

  return false;
}

function canSpendStamina(minHealth) {
  if (!stamina) return false;
  if (GM_getValue('staminaSpend') != 'checked') return false;

  if (!minHealth) {
    var how = GM_getValue('staminaSpendHow');
    if (how == STAMINA_HOW_ROB_RANDOM) {
        // Up to 35 damage could be received in a failed rob attempt.
        minHealth = 36;
    } else if (how == STAMINA_HOW_ROB_LIST) {
        // Only up to 15 damage can be received in a successful rob attempt.
        // You didn't add someone that is too strong to your list, did you?
        minHealth = 20;
    } else {
        // Up to 28 damage can be received in a fight.
        minHealth = 29;
    }
  }
  if (health < minHealth) {
    DEBUG('Not spending stamina: health=' + health + ', minimum=' + minHealth);
    return false;
  }

  if (stamina <= staminaFloor && !autoStamBurnif) {
    DEBUG('Not spending stamina: stamina=' + stamina +
          ', floor=' + staminaFloor + ', burn=' + autoStamBurnif);
    return false;
  }

  if (stamina < staminaCeiling && !autoStamBurnif &&
      !GM_getValue('useStaminaStarted')) {
    DEBUG('Rebuilding stamina: stamina=' + stamina +
          ', ceiling=' + staminaCeiling + ', burn=' + autoStamBurnif);
    return false;
  }

  return true;
}

function autoFight(how) {
  // Go to the correct city.
  var loc = GM_getValue('fightLocation', NY);
  if (city != loc) {
    Autoplay.fx = function() { goLocation(loc); };
    Autoplay.delay = getAutoPlayDelay();
    Autoplay.start();
    return true;
  }

  // Get an opponent.
  var opponent = {};
  var id;
  if (how == STAMINA_HOW_FIGHT_LIST) {
    id = parseInt(GM_getValue('fightList', ''));
    if (!id) {
      // The user-specified list is empty or invalid.
      addToLog('warning Icon', 'Can\'t fight because the list of opponents is empty or invalid. Turning automatic fighting off.');
      GM_setValue('staminaSpend', 0);
      return false;
    }
  } else {
    // Check for any new opponents.
    id = findFightOpponent(innerPageElt);

    // For stealth mode fights, if we don't have a new opponent then
    // choose one of the inactive opponents we've already fought.
    if ((!id || id == -1) && GM_getValue('fightStealth') == 'checked') {
      var opponentList = getSavedList('fightListInactive');
      if (opponentList.length) {
        id = opponentList[Math.floor(Math.random() * opponentList.length)];
      }
    }

    if (id == -1) {
      DEBUG('No opponents even after seeing the fight list.');
      return false;
    }

    if (!id) {
      // Go to the fight list to find opponents.
      addToLog('process Icon', 'No opponents. Going to fight list.');
      Autoplay.fx = goFightNav;
      Autoplay.start();
      return true;
    }
  }

  // Make ID into an object.
  // FIXME: Should make logic above find an opponent object instead of an ID.
  //        Then this part won't be necessary, and we may not even need an ID.
  if (!id) return false;
  opponent.id = String(id);

  if (!useClickSimulation) {
    if (!opponent.id) return false;

    // NOTE: This line isn't needed if using click simulation.
    getDisplayedOpponents.opponents = undefined;

    // Attack!
    var link = 'http://apps.facebook.com/' + SCRIPT.name +
               SCRIPT.controller + 'fight' +
               SCRIPT.action + 'attack' +
               SCRIPT.city + (city + 1) +
               '&tmp=' + fightTmp +
               SCRIPT.opponent + id;
    takeAction(link, 'fight', opponent);
    return true;
  }

  if (!opponent.attack) {
    if (!opponent.id) return false;
    if (!onFightTab()) {
      Autoplay.fx = goFightNav;
      Autoplay.start();
      return true;
    }
    var elt = xpathFirst('.//table[@class="main_table fight_table"]//a[contains(@onclick, "reg_fight_view_attack")]', innerPageElt);
    if (elt && elt.getAttribute('onclick').match(/reg_fight_view_attack[^,]+,\s*(\d+)/)) {
      elt.setAttribute('onclick', elt.getAttribute('onclick').replace(RegExp.$1, id));
      opponent.attack = elt;
    }
  }

  // Attack!
  if (!opponent.attack) {
    DEBUG('No way to attack opponent (' + id + ').');
    return false;
  }
  Autoplay.fx = function() {
    clickAction = 'fight';
    clickContext = opponent;
    clickElement(opponent.attack);
    DEBUG('Clicked to fight (' + id + ').');
    //DEBUG('Clicked to attack: name=' + opponent.name +
    //      ', id= + opponent.id + ', level=' + opponent.level +
    //      ', mafia=' + opponent.mafia);
  };
  Autoplay.delay = getAutoPlayDelay();
  Autoplay.start();

  return true;
}

function autoRob(how) {
  if (city != NY) {
    // Robbing is only supported in New York.
    Autoplay.fx = goNY;
    Autoplay.delay = getAutoPlayDelay();
    Autoplay.start();
    return true;
  }

  // Get an opponent.
  var id;
  if (how == STAMINA_HOW_ROB_LIST) {
    id = parseInt(GM_getValue('robList', ''));
    if (!id) {
      // The user-specified list is empty or invalid.
      addToLog('warning Icon', 'Can\'t rob because the list of opponents is empty or invalid. Turning automatic robbing off.');
      GM_setValue('staminaSpend', 0);
      return false;
    }
  } else {
    id = findRobOpponent(innerPageElt);
    if (id == -1) {
      addToLog('process Icon', 'No opponents even after seeing the rob list.');
      return false;
    }
    if (!id) {
      // Go to the rob list.
      //addToLog('process Icon', 'No opponents. Going to rob list.');
      Autoplay.fx = goRobTab;
      Autoplay.start();
      return true;
    }
  }
  if (!id) return false;

  // Rob the filthy animal
  DEBUG('Rob the filthy animal ' + id + '.');
  // NOTE: This line isn't needed if using click simulation.
  getDisplayedOpponents.opponents = undefined;
  var link = 'http://apps.facebook.com/'+ SCRIPT.name +
             SCRIPT.controller + 'robbing' +
             SCRIPT.action + 'attack' +
             SCRIPT.city + (city + 1) +
             '&tmp=' + fightTmp +
             SCRIPT.opponent + id +
             '&property_id=' + parseInt(GM_getValue('propertyId', ''));
  takeAction(link, 'rob', { id: String(id) });
  setRobOpponentRobbed(id);

  return true;
}

function autoHitman() {
  if (!useClickSimulation) {
    addToLog('warning Icon', 'Hitlist bounty collection cannot work because click simulation is required. Turning off bounty collection.');
    GM_setValue('staminaSpend', 0);
  }

  // Go to the correct city.
  var loc = GM_getValue('hitmanLocation', NY);
  if (city != loc) {
    Autoplay.fx = function() { goLocation(loc); };
    Autoplay.start();
    return true;
  }

  // Make sure we're on the hitlist tab.
  if (!onHitlistTab()) {
    Autoplay.fx = goHitlistTab;
    Autoplay.start();
    return true;
  }

  // Get the list of targets.
  var opponents = getHitlist(innerPageElt);
  if (!opponents) return false;

  // Get the targets that are acceptable.
  DEBUG('Applying criteria to displayed targets.');
  var blacklist = getSavedList('hitmanListAvoid').concat(getSavedList('fightListAvoid'));
  var bountyMin = parseCash(GM_getValue('hitmanBountyMin', 0));
  var avoidNames = GM_getValue('hitmanAvoidNames') == 'checked';
  var blacklistCount = 0;
  var bountyCount = 0;
  var namesCount = 0;
  var opponentsQualified = [];
  for (var i = 0, iLength=opponents.length; i < iLength; i++) {
    var opponent = opponents[i];
    if (blacklist.indexOf(opponent.id) != -1) {
      blacklistCount++;
      continue;
    }
    var bounty = parseCash(opponent.bounty);
    if (bounty && bounty < bountyMin) {
      bountyCount++;
      continue;
    }
    if (avoidNames && isFamily(decodeHTMLEntities(opponent.name))) {
      namesCount++;
      continue;
    }
    opponentsQualified.push(opponent);
  }
  DEBUG(bountyCount + ' disqualified on bounty, ' +
        namesCount + ' on name, ' + blacklistCount + ' on blacklist.');

  if (!opponentsQualified.length) return false;

  // Pick a target based on saved settings.
  var bountyIndex = 0;

  switch (GM_getValue('bountySelection', BOUNTY_HIGHEST_BOUNTY)) {
    case BOUNTY_LONGEST_TIME:
      bountyIndex = (opponentsQualified.length - 1);
      break;

    case BOUNTY_HIGHEST_BOUNTY:
      var bigBounty = 0;
      for (var i = 0, iLength=opponentsQualified.length; i < iLength; i++) {
        if (parseCash(opponentsQualified[i].bounty) > bigBounty) {
          bountyIndex = i;
          bigBounty = parseCash(opponentsQualified[i].bounty)
        }
      }
      break;

    case BOUNTY_RANDOM:
      bountyIndex = Math.floor(Math.random() * opponentsQualified.length);
      break;

    case BOUNTY_SHORTEST_TIME:
    default:
      bountyIndex = 0;
  }
  Autoplay.fx = function() {
    clickAction = 'hitman';
    clickContext = opponentsQualified[bountyIndex];
    clickElement(clickContext.attack);
    DEBUG('Clicked to hit ' + clickContext.name +
          ' (' + clickContext.id + ').');
  };
  Autoplay.delay = 0;
  Autoplay.start();
  return true;
}

function autoStaminaSpend() {
  if (GM_getValue('staminaSpend') != 'checked') return false;

  if (staminaFloor &&
      GM_getValue('allowStaminaToLevelUp') == 'checked' &&
      GM_getValue('autoStamBurn') !== autoStamBurnif) {
    GM_setValue('autoStamBurn', autoStamBurnif);
    if (autoStamBurnif) {
      addToLog('process Icon', staminaIcon + '<span style="color:#009966; font-weight: bold;">Burning through stamina reserve to level up.</span>');
    } else {
      DEBUG('Not within reach of a level up. Stamina burning is off.');
    }
  }

  var how = GM_getValue('staminaSpendHow');
  switch (GM_getValue('staminaSpendHow')) {
    case STAMINA_HOW_FIGHT_RANDOM:
    case STAMINA_HOW_FIGHT_LIST:
      return autoFight(how);

    case STAMINA_HOW_ROB_RANDOM:
    case STAMINA_HOW_ROB_LIST:
      return autoRob(how);

    case STAMINA_HOW_HITMAN:
      return autoHitman(how);

    default:
      addToLog('warning Icon', 'BUG DETECTED: Unrecognized stamina setting: ' +
               'staminaSpendHow=' + how);
  }

  return false;
}

function autoBankDeposit(amount) {
  // Make sure we're at the bank.
  var formElt = xpathFirst('.//form[@id="' + SCRIPT.appID + '_bank_deposit"]', innerPageElt);
  if (!formElt) {
    Autoplay.fx = goBank;
    Autoplay.start();
    return true;
  }

  // Set the amount (if provided).
  if (amount) {
    var amountElt = xpathFirst('.//input[@type="text"]', formElt);
    if (!amountElt) {
      addToLog('warning Icon', 'BUG DETECTED: No text input at bank.');
      return false;
    }
    amountElt.value = amount;
  }

  // Make the deposit.
  var submitElt = xpathFirst('.//input[@type="submit"]', formElt);
  if (!submitElt) {
    addToLog('warning Icon', 'BUG DETECTED: No submit input at bank.');
    return false;
  }
  Autoplay.fx = function() {
    clickAction = 'deposit';
    submitElt.click();
    DEBUG('Clicked to deposit.');
  }
  Autoplay.start();
  return true;
}

function autoBankWithdraw(amount) {
  // Make sure we're at the bank.
  var formElt = xpathFirst('.//form[@id="' + SCRIPT.appID + '_bank_withdraw"]', innerPageElt);
  if (!formElt) {
    Autoplay.fx = goBank;
    Autoplay.start();
    return true;
  }

  // Set the amount (if provided).
  if (amount) {
    var amountElt = xpathFirst('.//input[@type="text"]', formElt);
    if (!amountElt) {
      addToLog('warning Icon', 'BUG DETECTED: No text input at bank.');
      return false;
    }
    amountElt.value = amount;
  }

  // Make the withdrawal.
  var submitElt = xpathFirst('.//input[@type="submit"]', formElt);
  if (!submitElt) {
    addToLog('warning Icon', 'BUG DETECTED: No submit input at bank.');
    return false;
  }
  Autoplay.fx = function() {
    clickAction = 'withdraw';
    submitElt.click();
    DEBUG('Clicked to withdraw.');
  }
  Autoplay.start();
  return true;
}

function placeBounty () {
  var depositBox = xpathFirst('.//input[@name="amount"]', innerPageElt);
  depositBox.value = GM_getValue('bountyAmount', 10000);
  var sform = xpathFirst('.//input[@type="submit"]', innerPageElt);
  sform.click();
  placeBountyCheck();
}

function placeBountyCheck () {
  if (xpathFirst('.//td[@class="message_body" and contains(text(), "You just set a")]', innerPageElt)) {
    DEBUG('Bounty set successfully.');
  } else {
    DEBUG('Bounty not set.');
  }
}

// Returns a non-empty array of the displayed opponents, or undefined.
function getHitlist(element, forceRefresh) {
  // If the list was already seen, don't read it again.
  if (!forceRefresh && getHitlist.opponents) {
    if (!getHitlist.opponents.length) return;
    return getHitlist.opponents;
  }
  getHitlist.opponents = [];

  // Get each target in the displayed list.
  var rows = $x('.//table[@class="hit_list"]//tr', element);
  for (var i = 0, iLength=rows.length; i < iLength; ++i) {
    // Get the data cells in the row.
    var rowData = rows[i].getElementsByTagName('td');
    if (rowData.length < 5) continue;

    // Get the target's profile and attack links.
    var opponent = {
      attack:  xpathFirst('.//a', rowData[4]),
      payer:   xpathFirst('.//a', rowData[1]),
      profile: xpathFirst('.//a', rowData[0]),
      time:    rowData[3].innerHTML.untag().trim()
    };
    if (!opponent.profile || !opponent.attack) continue;

    // Get the target's id, name, title, and bounty.
    if (opponent.profile.getAttribute('onclick').match(/user=(\w+)/)) {
      opponent.id = RegExp.$1
    }
    opponent.name = opponent.profile.innerHTML;
    if (opponent.profile.previousSibling &&
        opponent.profile.previousSibling.nodeValue.match(/\w+(?: \w+)*/)) {
      opponent.title = RegExp.lastMatch;
    }
    if (rowData[2].innerHTML.match(REGEX_CASH)) {
      opponent.bounty = RegExp.lastMatch;
    }

    getHitlist.opponents.push(opponent);
  }
  DEBUG(getHitlist.opponents.length + ' hitlist target(s) found.');

  if (!getHitlist.opponents.length) return;

  //for (var i = 0; i < getHitlist.opponents.length; i++) {
  //  var opponent = getHitlist.opponents[i];
  //  GM_log('Saw id=' + opponent.id +
  //         ', title=' + opponent.title +
  //         ', name=' + opponent.name +
  //         ', bounty=' + opponent.bounty +
  //         ', time=' + opponent.time);
  //}

  return getHitlist.opponents;
}

// Returns a non-empty array of the displayed opponents, or undefined.
function getDisplayedOpponents(element, forceRefresh) {
  // If the list was already seen, don't read it again.
  if (!forceRefresh && getDisplayedOpponents.opponents) {
    if (!getDisplayedOpponents.opponents.length) return;
    return getDisplayedOpponents.opponents;
  }
  getDisplayedOpponents.opponents = [];
  var fight = !onRobTab();

  // First, look for a traditional fight table (one with real links).
  var links = $x('.//table[@class="main_table fight_table"]//a[contains(@href, "opponent_id") and not(contains(@href, "property"))]', element);

  // Get each potential opponent in the displayed list.
  for (var i = 0, iLength=links.length; i < iLength; i++) {
    var linkElt = links[i];
    var opponent = {};
    var row     = linkElt.parentNode.parentNode;
    var rowData = row.getElementsByTagName('td');
    // We need this for robbing to go to the previous tr that contains the
    // name and level. (In the fight list it is all on one line.)
    if (!fight) {
      var nameAndLevel = row.previousSibling;
      while ( nameAndLevel.nodeType != 1 ) {
        nameAndLevel = nameAndLevel.previousSibling;
      }
    } else {
      nameAndLevel = row;
    }

    // Get the opponent's details.
    opponent.id      = parseInt(linkElt.href.split(SCRIPT.opponent)[1]);
    opponent.profile = nameAndLevel.getElementsByTagName('a')[0];
    if (!opponent.id || !opponent.profile) continue;
    opponent.attack  = linkElt;
    opponent.mafia   = rowData[1] ? parseInt(rowData[1].innerHTML) : 0;
    opponent.level   = parseInt(nameAndLevel.innerHTML.split('Level ')[1]);
    opponent.name    = opponent.profile.innerHTML;
    if (opponent.profile.previousSibling &&
        opponent.profile.previousSibling.nodeValue.match(/\w+(?: \w+)*/)) {
      opponent.title = RegExp.lastMatch;
    }
    if (!opponent.level) {
      addToLog('warning Icon', 'BUG DETECTED: Unable to read opponent level.');
      addToLog('warning Icon', 'Row contents: '+ row.innerHTML);
    } else if (!opponent.mafia) {
      addToLog('warning Icon', 'BUG DETECTED: Unable to read opponent mafia.');
      addToLog('warning Icon', 'Row contents: '+ row.innerHTML);
    } else {
      getDisplayedOpponents.opponents.push(opponent);
    }
  }

  if (!getDisplayedOpponents.opponents.length) {
    // No traditional list was found. Look for a newer-style list.

    //var ids = unsafeWindow['a10979261223_fight_list_ids'];
    //GM_log('ids=' + ids);

    // Find level elements.
    var levelElts = $x('.//table[@class="main_table fight_table"]//td/span[contains(@id, "' + SCRIPT.appID + '_fight_view_level_")]', element);
    for (var i = 0, iLength=levelElts.length; i < iLength; ++i) {
      var levelElt = levelElts[i];
      if (!levelElt.innerHTML.match(/evel (\d+)/i)) continue;

      // Found an opponent.
      var opponent = {};
      opponent.level = parseInt(RegExp.$1);
      var row = levelElt.id.match(/\d+$/);
      var rowElt = levelElt.parentNode.parentNode;
      opponent.profile = xpathFirst('.//*[@id="' + SCRIPT.appID + '_fight_view_namelink_' + row + '"]/a', rowElt);
      if (!opponent.profile) continue;
      opponent.name = opponent.profile.firstChild.innerHTML;
      opponent.title = xpathFirst('.//*[@id="' + SCRIPT.appID + '_fight_view_title_' + row + '"]', rowElt).innerHTML;
      opponent.mafia = parseInt(xpathFirst('.//*[@id="' + SCRIPT.appID + '_fight_view_groupsize_' + row + '"]', rowElt).innerHTML);
      opponent.attack = xpathFirst('.//*[@id="' + SCRIPT.appID + '_fight_view_action_' + row + '"]/a', rowElt);
      getDisplayedOpponents.opponents.push(opponent);
    }
  }

  if (fight && !getDisplayedOpponents.opponents.length) {
    // Look for a hybrid fight table (mix of links & non-links).
    var links = $x('.//table[@class="main_table fight_table"]//a[contains(@onclick, "reg_fight_view_attack")]', element);

    // Get each potential opponent in the displayed list.
    for (var i = 0, iLength=links.length; i < iLength; ++i) {
      var linkElt = links[i];
      var opponent = {};
      var row     = linkElt.parentNode.parentNode;
      var rowData = row.getElementsByTagName('td');
      nameAndLevel = row;

      // Get the opponent's details.
      opponent.profile = nameAndLevel.getElementsByTagName('a')[0];
      if (!opponent.profile) continue;
      opponent.id      = parseInt(opponent.profile.href.split('user=')[1]);
      if (!opponent.id) continue;
      opponent.attack  = linkElt;
      opponent.mafia   = rowData[1] ? parseInt(rowData[1].innerHTML) : 0;
      opponent.level   = parseInt(nameAndLevel.innerHTML.split('Level ')[1]);
      opponent.name    = opponent.profile.innerHTML;
      if (opponent.profile.previousSibling &&
          opponent.profile.previousSibling.nodeValue.match(/\w+(?: \w+)*/)) {
        opponent.title = RegExp.lastMatch;
      }
      if (!opponent.level) {
        addToLog('warning Icon', 'BUG DETECTED: Unable to read opponent level.');
        addToLog('warning Icon', 'Row contents: '+ row.innerHTML);
      } else if (!opponent.mafia) {
        addToLog('warning Icon', 'BUG DETECTED: Unable to read opponent mafia.');
        addToLog('warning Icon', 'Row contents: '+ row.innerHTML);
      } else {
        getDisplayedOpponents.opponents.push(opponent);
      }
    }
  }

  if (!getDisplayedOpponents.opponents.length) return;

  DEBUG(getDisplayedOpponents.opponents.length + ' opponents listed.');
  //for (var i = 0; i < getDisplayedOpponents.opponents.length; ++i) {
  //  var opponent = getDisplayedOpponents.opponents[i];
  //  GM_log('Saw id=' + opponent.id +
  //         ', mafia=' + opponent.mafia +
  //         ', level=' + opponent.level +
  //         ', title=' + opponent.title +
  //         ', name=' + opponent.name);
  //}

  return getDisplayedOpponents.opponents;
}

// Searches the fight table in the subtree of the given element for new
// random targets. Returns a new opponent, or undefined.
function findFightOpponent(element) {
  // Don't bother searching if we still have plenty.
  var newOpponents = getSavedList('fightListNew');
  var len = newOpponents.length;
  if (len >= 50) {
    return newOpponents[Math.floor(Math.random() * len)];
  }

  // Check the fight table.
  var opponents = getDisplayedOpponents(element);
  if (!opponents) {
    // No opponents displayed on this page.
    return newOpponents[Math.floor(Math.random() * len)];
  }

  // Get the user's criteria for opponents.
  var opponentLevelMax = parseInt(GM_getValue('fightLevelMax', 100));
  var opponentMafiaMax = parseInt(GM_getValue('fightMafiaMax', 501));
  var opponentMafiaMin = parseInt(GM_getValue('fightMafiaMin', 1));
  var avoidNames = GM_getValue('fightAvoidNames') == 'checked';

  // Make any relative adjustments (if enabled).
  if (GM_getValue('fightLevelMaxRelative', false)) {
    opponentLevelMax = opponentLevelMax + level;
  }
  if (GM_getValue('fightMafiaMaxRelative', false)) {
    opponentMafiaMax = opponentMafiaMax + mafia;
  }
  if (GM_getValue('fightMafiaMinRelative', false)) {
    opponentMafiaMin = mafia - opponentMafiaMin;
  }
  if (opponentMafiaMin > 501) {
    opponentMafiaMin = 501;
  }

  // Make a blacklist of opponents.
  var avoidList = getSavedList('fightListAvoid');
  DEBUG('new=' + newOpponents.join(', '));
  DEBUG('avoid=' + avoidList.join(', '));
  var blacklist = newOpponents.concat(avoidList);
  if (GM_getValue('fightStealth') == 'checked' || newOpponents.length) {
    var activeList   = getSavedList('fightListActive');
    var inactiveList = getSavedList('fightListInactive');
    blacklist = blacklist.concat(activeList, inactiveList);
    DEBUG('inactive=' + inactiveList.join(', '));
    DEBUG('active=' + activeList.join(', '));
  }

  // Figure out which opponents are acceptable.
  DEBUG('Applying criteria to displayed opponents: ' +
        'level <= ' + opponentLevelMax + ', mafia between ' +
        opponentMafiaMin + ' and ' + opponentMafiaMax + '.');
  var levelMaxCount = 0;
  var mafiaMaxCount = 0;
  var mafiaMinCount = 0;
  var namesCount = 0;
  var blacklistCount = 0;
  for(var i = 0, iLength=opponents.length; i < iLength; ++i) {
    var opponent = opponents[i];
    if (opponent.level > opponentLevelMax) {
      levelMaxCount++;
      continue;
    }
    if (opponent.mafia > opponentMafiaMax) {
      mafiaMaxCount++;
      continue;
    }
    if (opponent.mafia < opponentMafiaMin) {
      mafiaMinCount++;
      continue;
    }
    if (avoidNames && isFamily(decodeHTMLEntities(opponent.name))) {
      namesCount++;
      continue;
    }
    if (!opponent.id) continue;

    // This opponent is acceptable. Save the ID (if new).
    var idString = opponent.id.toString();
    if (blacklist.indexOf(idString) != -1) {
      blacklistCount++;
      continue;
    }
    newOpponents.push(idString);
    DEBUG('Found new fight opponent: name=' + opponent.name +
          ', id=' + opponent.id + ', level=' + opponent.level +
          ', mafia=' + opponent.mafia);
  }
  DEBUG(levelMaxCount + ' disqualified on max level, ' +
        mafiaMaxCount + ' on max mafia, ' +
        mafiaMinCount + ' on min mafia, ' +
        namesCount + ' on name, ' +
        blacklistCount + ' on blacklist.');

  if (!newOpponents.length) return -1;

  if (newOpponents.length > len) {
    setSavedList('fightListNew', newOpponents);
  }

  return newOpponents[Math.floor(Math.random() * newOpponents.length)];
}

// Searches the rob table in the subtree of the given element for new
// random targets. Returns a new opponent, or undefined.
function findRobOpponent(element) {
  // Don't bother searching if we still have plenty.
  var newOpponents = getSavedList('robListNew');
  var len = newOpponents.length;
  if (len >= 50) {
    return newOpponents[Math.floor(Math.random() * len)];
  }

  // Check the displayed rob list.
  var opponents = getDisplayedOpponents(element);
  if (!onRobTab() || !opponents) {
    // No opponents displayed on this page.
    return newOpponents[Math.floor(Math.random() * len)];
  }

  // Get the user's criteria for opponents.
  var opponentLevelMax = parseInt(GM_getValue('robLevelMax', 100));
  var opponentMafiaMax = parseInt(GM_getValue('robMafiaMax', 501));
  var opponentMafiaMin = parseInt(GM_getValue('robMafiaMin', 1));
  var avoidNames = GM_getValue('robAvoidNames') == 'checked';

  // Make any relative adjustments (if enabled).
  var mafiaForRob = level < mafia? level : mafia;
  if (GM_getValue('robLevelMaxRelative', false)) {
    opponentLevelMax = opponentLevelMax + level;
  }
  if (GM_getValue('robMafiaMaxRelative', false)) {
    opponentMafiaMax = opponentMafiaMax + mafiaForRob;
  }
  if (GM_getValue('robMafiaMinRelative', false)) {
    opponentMafiaMin = mafiaForRob - opponentMafiaMin;
  }
  if (opponentMafiaMin > 501) {
    opponentMafiaMin = 501;
  }

  // Make a blacklist of opponents.
  var avoidList = getSavedList('robListAvoid');
  var robbedList = getSavedList('robListRobbed');
  var blacklist = newOpponents.concat(avoidList, robbedList);
  DEBUG('new=' + newOpponents);
  DEBUG('avoid=' + avoidList);
  DEBUG('robbed=' + robbedList);

  // Figure out which opponents are acceptable.
  DEBUG('Applying criteria to displayed opponents.');
  var levelMaxCount = 0;
  var mafiaMaxCount = 0;
  var mafiaMinCount = 0;
  var namesCount = 0;
  var blacklistCount = 0;
  for(var i = 0, iLength=opponents.length; i < iLength; ++i) {
    var opponent = opponents[i];
    if (opponent.level > opponentLevelMax) {
      levelMaxCount++;
      continue;
    }
    if (opponent.mafia > opponentMafiaMax) {
      mafiaMaxCount++;
      continue;
    }
    if (opponent.mafia < opponentMafiaMin) {
      mafiaMinCount++;
      continue;
    }
    if (avoidNames && isFamily(decodeHTMLEntities(opponent.name))) {
      namesCount++;
      continue;
    }
    if (!opponent.id) continue;

    // This opponent is acceptable. Save the ID (if new).
    var idString = opponent.id.toString();
    if (blacklist.indexOf(idString) != -1) {
      blacklistCount++;
      continue;
    }
    newOpponents.push(idString);
    DEBUG('Found new rob opponent ' + opponent.name + ' (' + idString + ').');
  }
  DEBUG(levelMaxCount + ' disqualified on max level, ' +
        mafiaMaxCount + ' on max mafia, ' +
        mafiaMinCount + ' on min mafia, ' +
        namesCount + ' on name, ' +
        blacklistCount + ' on blacklist.');

  if (!newOpponents.length) return -1;

  if (newOpponents.length > len) {
    setSavedList('robListNew', newOpponents);
  }

  return newOpponents[Math.floor(Math.random() * newOpponents.length)];
}

function setFightOpponentActive(opponent) {
  if (!opponent) return;

  // Add the opponent to the active list.
  DEBUG('Marking opponent ' + opponent + ' active.');
  addSavedListItem('fightListActive', opponent, 10);

  // Remove the opponent from the other fight lists.
  while(removeSavedListItem('fightListInactive', opponent));
  while(removeSavedListItem('fightListNew', opponent));
  while(removeSavedListItem('fightListAvoid', opponent));
}

function setFightOpponentInactive(opponent) {
  if (!opponent) return;

  // Add the opponent to the inactive list.
  DEBUG('Marking opponent ' + opponent + ' inactive.');
  addSavedListItem('fightListInactive', opponent, 10);

  // Remove the opponent from the other fight lists.
  while(removeSavedListItem('fightListActive', opponent));
  while(removeSavedListItem('fightListNew', opponent));
  while(removeSavedListItem('fightListAvoid', opponent));
}

function setRobOpponentRobbed(opponent) {
  if (!opponent) return;

  // Add the opponent to the robbed list.
  DEBUG('Marking rob opponent ' + opponent + ' as robbed.');
  addSavedListItem('robListRobbed', opponent, 10);

  // Remove the opponent from the other rob lists.
  while(removeSavedListItem('robListNew', opponent));
}

function setRobOpponentAvoid(opponent) {
  if (!opponent) return;

  // Add the opponent to the avoid list.
  DEBUG('Marking rob opponent ' + opponent + ' avoid.');
  addSavedListItem('robListAvoid', opponent, 50);

  // Remove the opponent from all other rob lists.
  while(removeSavedListItem('robListNew', opponent));
  // Only remove the first occurence from the user-supplied list.
  removeSavedListItem('robList', opponent);
}

function setHitmanOpponentAvoid(opponent) {
  if (!opponent) return;

  // Add the opponent to the avoid list.
  DEBUG('Marking hitlist opponent ' + opponent + ' avoid.');
  addSavedListItem('hitmanListAvoid', opponent, 100);
}

function setFightOpponentAvoid(opponent) {
  if (!opponent) return;

  // Add the opponent to the avoid list.
  DEBUG('Marking fight opponent ' + opponent + ' avoid.');
  addSavedListItem('fightListAvoid', opponent, 50);

  // Remove the opponent from all other fight lists.
  while(removeSavedListItem('fightListActive', opponent));
  while(removeSavedListItem('fightListInactive', opponent));
  while(removeSavedListItem('fightListNew', opponent));
  // Only remove the first occurence from the user-supplied list.
  removeSavedListItem('fightList', opponent);
}

function toggleSettings() {
  if (settingsOpen === false) {
    // Stop any running timers so the settings box won't disappear.
    Autoplay.clearTimeout();
    Reload.clearTimeout();

    settingsOpen = true;
    createSettingsBox();
    showSettingsBox();
  } else {
    settingsOpen = false;
    //hideSettingsBox();
    destroySettingsBox();

    // Restart the timers.
    Autoplay.delay = 150;
    Autoplay.start();
    autoReload();
  }
}

function toggleStats() {
  if (settingsOpen === true) {
    toggleSettings();
  }
  if (statsOpen === false) {
    statsOpen = true;
    if (!document.getElementById('statsWindow')) {
      createStatWindow();
    }
    showStatsWindow();
    // Stop any running timers so the settings box won't disappear.
    Autoplay.clearTimeout();
    Reload.clearTimeout();
  } else {
    statsOpen = false;
    hideStatsWindow();
    Autoplay.delay = 150;
    Autoplay.start();
    autoReload();
  }
}

function showSettingsBox() {
  var settingsBoxContainer = document.getElementById('GenDialogPopDialog');
  if (settingsBoxContainer) {
    settingsBoxContainer.style.display = 'block';
  }
}

function showMafiaLogBox() {
  if (!document.getElementById('mafiaLogBox')) {
    createLogBox();
  } else {
    var mafiaLogBoxDiv = document.getElementById('mafiaLogBox');
    mafiaLogBoxDiv.style.display = 'block';
  }
  if (!debug && GM_getValue('logOpen') != 'open' &&
      GM_getValue('autoLog') != 'checked') {
    alert('Logging is not enabled. To see new activity here, please open your settings and check "Enable logging" in the General tab.');
  }
  GM_setValue('logOpen', 'open');
}

function showStatsWindow() {
  var statsWindowContainer = document.getElementById('sWindowGenDialogPopDialog');
  if (statsWindowContainer) {
    statsWindowContainer.style.display = 'block';
  }
}

function hideSettingsBox() {
  var settingsBoxContainer = document.getElementById('GenDialogPopDialog');
  if (settingsBoxContainer) {
    settingsBoxContainer.style.display = 'none';
  }
}

function destroySettingsBox() {
  var settingsBoxContainer = document.getElementById('GenDialogPopDialog');
  if (settingsBoxContainer) {
    settingsBoxContainer.parentNode.removeChild(settingsBoxContainer);
  }
}

function hideMafiaLogBox() {
  var mafiaLogBoxDiv = document.getElementById('mafiaLogBox');
  mafiaLogBoxDiv.style.display = 'none';
  GM_setValue('logOpen', 'closed');
}

function hideStatsWindow() {
  var statsWindowContainer = document.getElementById('sWindowGenDialogPopDialog');
  if (statsWindowContainer) {
    statsWindowContainer.style.display = 'none';
  }
}

function upgradeFightRobTab() {
  // Get the fight/rob tab settings that need to change.
  var autoFightOn = GM_getValue('autoFight') == 'checked';
  var autoRobOn = GM_getValue('autoRob') == 'checked';
  var useFightList = GM_getValue('rFightList') == 'checked';
  var list = GM_getValue('fightList', '');
  var levelMax = parseInt(GM_getValue('fightLevel', 100));
  var mafiaMax = parseInt(GM_getValue('fightmafiaSize', 501));
  var mafiaMin = parseInt(GM_getValue('fightmafiaMinSize', 1));
  var levelMaxRelative = GM_getValue('fightLevelRelative', 0);
  var mafiaMaxRelative = GM_getValue('fightMafiaRelative', 0);
  var mafiaMinRelative = GM_getValue('fightMafiaMinRelative', 0);
  var avoidNames = GM_getValue('clanMember', 0);
  var removeStronger = GM_getValue('fightRemoveStronger', 'checked');
  var loc = NY;
  if (GM_getValue('fightLocationCUBA') == 'checked') {
    loc = CUBA;
  } else if (GM_getValue('fightLocationMOSCOW') == 'checked') {
    loc = MOSCOW;
  }

  // Spend stamina automatically?
  if (autoFightOn || autoRobOn) {
    GM_setValue('staminaSpend', 'checked');
  }

  // How?
  if (autoRobOn) {
    if (useFightList) {
      GM_setValue('staminaSpendHow', STAMINA_HOW_ROB_LIST);
    } else {
      GM_setValue('staminaSpendHow', STAMINA_HOW_ROB_RANDOM);
    }
  } else {
    if (useFightList) {
      GM_setValue('staminaSpendHow', STAMINA_HOW_FIGHT_LIST);
    } else {
      GM_setValue('staminaSpendHow', STAMINA_HOW_FIGHT_RANDOM);
    }
  }

  // Other settings
  GM_setValue('fightLocation', loc);
  GM_setValue('fightLevelMax', levelMax);
  GM_setValue('fightLevelMaxRelative', levelMaxRelative);
  GM_setValue('fightMafiaMax', mafiaMax);
  GM_setValue('fightMafiaMaxRelative', mafiaMaxRelative);
  GM_setValue('fightMafiaMin', mafiaMin);
  GM_setValue('fightMafiaMinRelative', mafiaMinRelative);
  GM_setValue('fightAvoidNames', avoidNames);
  GM_setValue('fightList', list);
  GM_setValue('fightRemoveStronger', removeStronger);
  GM_setValue('robLevelMax', levelMax);
  GM_setValue('robLevelMaxRelative', levelMaxRelative);
  GM_setValue('robMafiaMax', mafiaMax);
  GM_setValue('robMafiaMaxRelative', mafiaMaxRelative);
  GM_setValue('robMafiaMin', mafiaMin);
  GM_setValue('robMafiaMinRelative', mafiaMinRelative);
  GM_setValue('robAvoidNames', avoidNames);
  GM_setValue('robList', list);
  GM_setValue('robRemoveStronger', removeStronger);
  GM_setValue('hitmanLocation', loc);
  GM_setValue('hitmanAvoidNames', avoidNames);
}

function handleVersionChange() {
  addToLog('updateGood Icon', 'Now running version ' + SCRIPT.version + ' build ' + SCRIPT.build);
  GM_setValue('version', SCRIPT.version);
  GM_setValue('build', SCRIPT.build);

  // Check for invalid settings and upgrade them.

  // In an old version, the bonus had been up to 15%.
  var val = GM_getValue('selectEnergyBonus');
  if (val > 11) {
    GM_setValue('selectEnergyBonus', 11);
  }

  // In an old version, there was no cap. But it definitely must be under 100,
  // and it probably wouldn't work properly with more than 75.
  var val = parseInt(GM_getValue('logPlayerUpdatesMax', '100'));
  if (isNaN(val) || val > 75) {
    GM_setValue('logPlayerUpdatesMax', '75');
  }

  // Heal location used to be radio buttons.
  if (GM_getValue('healLocation') == undefined) {
    var loc = NY;
    if (GM_getValue('healLocationCuba') == 'checked') {
      loc = CUBA;
    } else if (GM_getValue('healLocationMoscow') == 'checked') {
      loc = MOSCOW;
    }
    GM_setValue('healLocation', loc);
  }

  // Handle force healing changes
  if (GM_getValue('forceHealOpt1') == undefined) {
    if (GM_getValue('hideInHospital') == 'checked') {
      for (var i=0,iLength=healOptions.length; i < iLength; i++)
        GM_setValue(healOptions[i][0],0);
    }
    if (GM_getValue('hideInHospital') == 'checked') {
      GM_setValue('forceHealOpt2', 'checked');
      if (GM_getValue('forceHeal') == 'checked') {
        GM_setValue('forceHealOpt3', 'checked');
      }
    } else {
      GM_setValue('forceHealOpt1', 'checked');
    }
  }

  // Upgrade fight/rob tab (builds 522 and under) to stamina tab settings.
  if (GM_getValue('staminaSpend') == undefined &&
      GM_getValue('autoFight') != undefined) {
    upgradeFightRobTab();
    addToLog('process Icon', 'Upgraded fight/rob tab settings.');
  }

  // Upgrade Misc Tab settings
  clearOldCheckBoxStatuValues()
}

function clearOldCheckBoxStatuValues() {
  // Clear old checkbox values

  for (var i = 0, iLength=autoStatBases.length; i < iLength; i++)
    if (isNaN (parseInt (GM_getValue(autoStatBases[i]))))
      GM_setValue(autoStatBases[i], 0);

  for (var i = 0, iLength=autoStatRatios.length; i < iLength; i++)
    if (isNaN (parseInt (GM_getValue(autoStatRatios[i]))))
      GM_setValue(autoStatRatios[i], 0);

}

function saveDefaultSettings() {
  // Assume all settings have been cleared and set defaults.
  // For groups of radio buttons, one must be checked and all others cleared.
  // For checkboxes, no need to default if the option should be off.

  // General tab.
  GM_setValue('autoClick', 'checked');
  GM_setValue('r1', '30');
  GM_setValue('r2', '110');
  GM_setValue('autoHeal', 'checked');
  GM_setValue('healthLevel', '50');
  GM_setValue('forceHealOpt1', 'checked');
  GM_setValue('healLocation', NY);
  GM_setValue('bankConfig', '50000');
  GM_setValue('bankConfigCuba', '50000');
  GM_setValue('bankConfigMoscow', '50000');
  GM_setValue('autoPauseBefore', 'checked');
  GM_setValue('autoPauseAfter', 0);
  GM_setValue('autoPauseExp', '50');
  GM_setValue('autoLog', 'checked');
  GM_setValue('autoLogLength', '300');
  GM_setValue('logPlayerUpdates', 'checked');
  GM_setValue('logPlayerUpdatesMax', '25');
  GM_setValue('d1', '3');
  GM_setValue('d2', '5');
  GM_setValue('idleLocation', NY);
  GM_setValue('autoHelp', 'checked');

  // Misc Tab
  GM_setValue('autoStat', 0);
  GM_setValue('autoStatDisable', 0);

  for (var i = 0, iLength=autoStatModes.length; i < iLength; ++i)
    GM_setValue(autoStatModes[i], 0);

  for (var i = 0, iLength=autoStatPrios.length; i < iLength; ++i)
    GM_setValue(autoStatPrios[i], 0);

  for (var i = 0, iLength=autoStatBases.length; i < iLength; ++i)
    GM_setValue(autoStatBases[i], 0);

  for (var i = 0, iLength=autoStatRatios.length; i < iLength; ++i)
    GM_setValue(autoStatRatios[i], 0);

  for (var i = 0, iLength=autoStatFallbacks.length; i < iLength; ++i)
    GM_setValue(autoStatFallbacks[i], 0);

  GM_setValue('filterLog', 0);
  GM_setValue('logFilterPass', defaultLogPass.join('\n'));
  GM_setValue('logFilterFail', defaultLogFail.join('\n'));

  // Energy tab.
  GM_setValue('estimateJobRatio', '1');

  // Stamina tab.
  GM_setValue('staminaSpendHow', STAMINA_HOW_FIGHT_RANDOM);
  GM_setValue('fightLocation', NY);
  GM_setValue('fightLevelMax', 100);
  GM_setValue('fightMafiaMax', 501);
  GM_setValue('fightMafiaMin', 1);
  GM_setValue('fightStealth', 'checked');
  GM_setValue('fightAvoidBodyguards', 'checked');
  GM_setValue('fightAvoidNames', 'checked');
  GM_setValue('fightRemoveStronger', 'checked');
  GM_setValue('robLevelMax', 100);
  GM_setValue('robMafiaMax', 501);
  GM_setValue('robMafiaMin', 1);
  GM_setValue('robAvoidNames', 'checked');
  GM_setValue('robRemoveStronger', 'checked');
  GM_setValue('hitmanLocation', NY);
  GM_setValue('hitmanAvoidNames', 'checked');
  GM_setValue('clanName', defaultClans.join('\n'));
  GM_setValue('selectStaminaKeep', 10);
  GM_setValue('selectStaminaUse', 10);

  // Property tab.
  GM_setValue('buyMinAmount', '0');

  // Other settings.
  GM_setValue('logOpen', 'open');

  addToLog('process Icon', 'Options reset to defaults.');
}

function helpSettings() {
  // Open the instructions page.
  // FIXME: Would be nice to jump to the relevant section of the instructions
  //        depending on which settings tab is currently active.
  window.open('http://mafiawarsplayer.org/forum/viewtopic.php?f=11&t=21');
}

function saveSettings() {
/*
  //FIXME: works once then crashes... not good

  // Transfer statLog to graphBox
  if (typeof(GM_getValue('statLog') != 'undefined')) {
    GM_setValue('graphBox', GM_getValue('statLog'));
    GM_deleteValue('statLog');
  }
*/

  // Validate the settings and alert the user if the settings are invalid.
  var logPlayerUpdates = (document.getElementById('logPlayerUpdates').checked === true);
  var logPlayerUpdatesMax = parseInt(document.getElementById('logPlayerUpdatesMax').value);
  if (logPlayerUpdates && (isNaN(logPlayerUpdatesMax) || logPlayerUpdatesMax < 0 || logPlayerUpdatesMax > 75)) {
    alert('The maximum number of player updates must be between 0 and 75.');
    return;
  }
  var autoBankOn      = (document.getElementById('autoBank').checked === true);
  var autoBankCubaOn  = (document.getElementById('autoBankCuba').checked === true);
  var autoBankMoscowOn  = (document.getElementById('autoBankMoscow').checked === true);
  var bankConfig      = document.getElementById('bankConfig').value;
  var bankConfigCuba      = document.getElementById('bankConfigCuba').value;
  var bankConfigMoscow      = document.getElementById('bankConfigMoscow').value;
  var bankConfigInt   = parseInt(bankConfig);
  var bankConfigCubaInt   = parseInt(bankConfigCuba);
  var bankConfigMoscowInt   = parseInt(bankConfigMoscow);
  if (autoBankOn && (isNaN(bankConfigInt) || bankConfigInt < 1)) {
    alert('Minimum auto-bank amount must be 1 or higher.');
    return;
  }

  GM_setValue('idleLocation', document.getElementById('idleLocation').selectedIndex);

  if (autoBankCubaOn && (isNaN(bankConfigCubaInt) || bankConfigCubaInt < 1)) {
    alert('Minimum Cuba auto-bank amount must be 1 or higher.');
    return;
  }
  if (autoBankMoscowOn && (isNaN(bankConfigMoscowInt) || bankConfigMoscowInt < 1)) {
    alert('Minimum Moscow auto-bank amount must be 1 or higher.');
    return;
  }
  var estimateJobRatio = parseFloat(document.getElementById('estimateJobRatio').value);
  var autoEnergyPackOn = (document.getElementById('autoEnergyPack').checked === true );

  // Validate the estimated job ratio setting.
  if (autoEnergyPackOn) {
    if (isNaN(estimateJobRatio)) {
      alert('Please enter a number between 0 and 3 for your estimated job xp to energy ratio');
      return;
    }
  }

  // Validate the auto-stat setting.
  var autoStatOn = (document.getElementById('autoStat').checked === true);
  for (var i = 0, iLength=autoStatBases.length; i < iLength; ++i) {
    if (autoStatOn && isNaN(document.getElementById(autoStatBases[i]).value)) {
      alert('Please enter valid numbers for auto-stat ' + autoStatDescrips[i+1] + ' (Misc tab). : ' + document.getElementById(autoStatBases[i]).value);
      return;
    }
  }

  for (var i = 0, iLength=autoStatRatios.length; i < iLength; ++i) {
    if (autoStatOn && isNaN(document.getElementById(autoStatRatios[i]).value)) {
      alert('Please enter valid numbers for auto-stat ' + autoStatDescrips[i+1] + ' (Misc tab).');
      return;
    }
  }

  // Validate the stamina tab.
  var staminaTabSettings = validateStaminaTab();
  if (!staminaTabSettings) return;
  //var testStaminaTab = function() {
  //  var s = validateStaminaTab();
  //  GM_log('s='+s);
  //  for (var setting in s) {
  //    GM_log(setting + '=' + s[setting]);
  //  }
  //}
  //testStaminaTab();

  //
  // All settings are valid. Save them.
  //
  GM_setValue('restAutoStat', 0);
  for (var i = 0, iLength=autoStatBases.length; i < iLength; ++i)
    GM_setValue(autoStatBases[i], document.getElementById(autoStatBases[i]).value);
  for (var i = 0, iLength=autoStatRatios.length; i < iLength; ++i)
    GM_setValue(autoStatRatios[i], document.getElementById(autoStatRatios[i]).value);
  for (var i = 0, iLength=autoStatModes.length; i < iLength; ++i)
    GM_setValue(autoStatModes[i], document.getElementById(autoStatModes[i]).value);
  for (var i = 0, iLength=autoStatPrios.length; i < iLength; ++i)
    GM_setValue(autoStatPrios[i], document.getElementById(autoStatPrios[i]).value);

  GM_setValue('logFilterPass', document.getElementById('logFilterPass').value);
  GM_setValue('logFilterFail', document.getElementById('logFilterFail').value);

  GM_setValue('healLocation', document.getElementById('healLocation').value);

  // Place all checkbox element saving here
  saveCheckBoxElementArray(['autoClick','autoLog','logPlayerUpdates','hideAttacks',
                            'autoHitlist','autoMission','autoBank','waitForFull', 'autoBankMoscow',
                            'autoBankCuba','autoHeal','forceHealOpt1','forceHealOpt2',
                            'forceHealOpt3','forceHealOpt4','forceHealOpt5',
                            'autoStat','autoStatDisable','autoStatAttackFallback',
                            'autoStatDefenseFallback','autoStatHealthFallback','autoStatEnergyFallback',
                            'autoStatStaminaFallback','autoStatInfluenceFallback', 'hourlyStatsOpt','autoGiftSkipOpt',
                            'autoBuy','autoRepair','autoProtect','autoSellCrates','autoEnergyPack',
                            'hasHelicopter', 'hasPrivateIsland', 'hasGoldenThrone','isManiac',
                            'sendEnergyPack', 'autoAskJobHelp','autoPause','hideAds',
                            'moveEmailBar','acceptMafiaInvitations','autoLottoOpt',
                            'leftAlign','filterLog','autoHelp','autoSellCratesMoscow','collectNYTake']);

  if (document.getElementById('masterAllJobs').checked === true) {
    GM_setValue('repeatJob', 0);
  } else {
    GM_setValue('repeatJob', 'checked');
  }

  var selectProperties = '';
  if (saveCheckBoxElement('abandoned'))
    selectProperties += 'Abandoned Lot';
  if (saveCheckBoxElement('commercial'))
    selectProperties += 'Commercial Block';
  if (saveCheckBoxElement('downtown'))
    selectProperties += 'Prime Downtown Lot';
  if (saveCheckBoxElement('beachfront'))
    selectProperties += 'Beachfront Property';
  if (saveCheckBoxElement('mike'))
    selectProperties += 'Mafia Mike\'s';
  if (saveCheckBoxElement('rent'))
    selectProperties += 'Rent House';
  if (saveCheckBoxElement('restaurant'))
    selectProperties += 'Italian Restaurant';
  if (saveCheckBoxElement('apartment'))
    selectProperties += 'Apartment Complex';
  if (saveCheckBoxElement('valu'))
    selectProperties += 'Valu-Mart';
  if (saveCheckBoxElement('tourist'))
    selectProperties += 'Marina Tourist Shops';
  if (saveCheckBoxElement('office'))
    selectProperties += 'Office Building';
  if (saveCheckBoxElement('hotel'))
    selectProperties += '5-Star Hotel';
  if (saveCheckBoxElement('casino'))
    selectProperties += 'Mega Casino';

  GM_setValue('selectProperties', selectProperties);
  GM_setValue('estimateJobRatio', document.getElementById('estimateJobRatio').value);

  if (saveCheckBoxElement('autoPauseBefore')) {
    GM_setValue('autoPauselvlExp', lvlExp);
    GM_setValue('autoPauseActivated', false);
  }

  if (saveCheckBoxElement('autoPauseAfter')) {
    GM_setValue('autoPauselvlExp', lvlExp);
  }

  GM_setValue('notificationHandle', document.getElementById('notificationHandle').selectedIndex);
  GM_setValue('bankConfig', bankConfig);
  GM_setValue('bankConfigCuba', bankConfigCuba);
  GM_setValue('bankConfigMoscow', bankConfigMoscow);
  GM_setValue('r1', document.getElementById('r1').value);
  GM_setValue('r2', document.getElementById('r2').value);
  GM_setValue('d1', document.getElementById('d1').value);
  GM_setValue('d2', document.getElementById('d2').value);
  GM_setValue('propertyId', '12');
  GM_setValue('healthLevel', document.getElementById('healthLevel').value);
  GM_setValue('selectStaminaKeep', document.getElementById('selectStaminaKeep').selectedIndex );
  GM_setValue('selectStaminaUse', document.getElementById('selectStaminaUse').selectedIndex );
  GM_setValue('autoPauseExp', document.getElementById('autoPauseExp').value);
  GM_setValue('autoLogLength', document.getElementById('autoLogLength').value);
  GM_setValue('logPlayerUpdatesMax', logPlayerUpdatesMax);
  GM_setValue('bountyAmount', document.getElementById('bountyAmount').value);
  GM_setValue('buyMinAmount', document.getElementById('buyMinAmount').value);
  GM_setValue('autoAskJobHelpMinExp', document.getElementById('autoAskJobHelpMinExp').value);
  GM_setValue('autoAskJobHelpMessage', document.getElementById('autoAskJobHelpMessage').value);

  if (saveCheckBoxElement('multipleJobs')) {
    var multiple_jobs_list = [];
    for (var i = 0, iLength = missions.length; i < iLength; i++) {
      if (document.getElementById(missions[i][0]).checked)
        multiple_jobs_list.push(i);
    }
    setSavedList('selectMissionMultiple', multiple_jobs_list);
  } else {
    GM_setValue('selectMission', document.getElementById('selectMissionS').selectedIndex);
  }

  // Save the stamina tab settings.
  for (var key in staminaTabSettings) {
    //GM_log('Setting GM value \'' + key + '\'=' + staminaTabSettings[key]);
    GM_setValue(key, staminaTabSettings[key]);
  }

  // Clear the job state.
  setSavedList('jobsToDo', []);
  setSavedList('itemList', []);

  // Clear lists for mastered and available jobs.
  GM_setValue('masteredJobs', "({0:{},1:{},2:{}})");
  GM_setValue('availableJobs', "({0:{},1:{},2:{}})");

  // Clear the fight/rob state.
  setSavedList('fightListNew', []);
  fightTmp = '';
  skipStaminaSpend = false;

  toggleSettings();
  updateLogStats();

}

function updateMastheadMenu() {
  var menuElt = document.getElementById('ap_menu');
  if (!menuElt) return;

  var elt = document.getElementById('pauseButton');
  if (running) {
    if (elt) return;

    // Remove the resume button and paused image.
    elt = document.getElementById('resumeButton');
    if (elt) {
      elt.parentNode.removeChild(elt);
    }
    elt = document.getElementById('ap_pause_img');
    if (elt) {
      elt.parentNode.removeChild(elt);
    }

    // Show a pause button.
    elt = makeElement('span', null, {'id':'pauseButton'});
    elt.appendChild(document.createTextNode('Pause'));
    elt.addEventListener('click', pause, false);
    menuElt.insertBefore(elt, menuElt.firstChild);
  } else {
    // Remove the pause button.
    if (elt) {
      elt.parentNode.removeChild(elt);
    }

    // Show a resume button and paused image.
    elt = document.getElementById('resumeButton');
    if (elt) return;
    elt = makeElement('span', null, {'id':'resumeButton'});
    elt.appendChild(document.createTextNode('Resume'));
    menuElt.insertBefore(elt, menuElt.firstChild);
    elt.addEventListener('click', unPause, false);
    makeElement('div', menuElt.parentNode, {'id':'ap_pause_img', 'style':'background: transparent url(' + stripURI(pausedMessageImage) + ') no-repeat scroll 20px; position: absolute; top: 0; left: 0; bottom: 0; width: 250px'});
  }
}

function pause() {
  if (GM_getValue('isRunning') === false) {
    // Must have been paused already. Make sure the log is current.
    refreshLog();
  }

  // Update the running state.
  GM_setValue('isRunning', false);
  running = false;

  // Clear all timers.
  Autoplay.clearTimeout();
  Reload.clearTimeout();

  addToLog('pause Icon', 'Autoplayer is paused. Log & stats do not track manual activity.');
  updateMastheadMenu();
}

function unPause() {
  if (GM_getValue('isRunning') === true) {
    // Must have been resumed already. Make sure the log is current.
    refreshLog();
  }

  // Clear lists for mastered and available jobs.
  GM_setValue('masteredJobs', "({0:{},1:{},2:{}})");
  GM_setValue('availableJobs', "({0:{},1:{},2:{}})");

  // Update the running state.
  GM_setValue('isRunning', true);
  running = true;

  addToLog('play Icon', 'Autoplayer resuming...');
  updateMastheadMenu();

  // Set up auto-reload.
  autoReload();

  // Kick off play.
  Autoplay.fx = goHome;
  Autoplay.delay = 150;
  Autoplay.start();
}

function calcEnergyCost() {
  var cost = missions[GM_getValue('selectMission', 1)][1];
  if (cost > 5) {
    // Adjust for energy bonus.
    cost = Math.floor(cost * (1 - GM_getValue('selectEnergyBonus', 0)/100));
  }
  return cost;
}

function isFamily(username) {
  var patterns = getSavedList('clanName');
  for (var i = 0, iLength=patterns.length; i < iLength; ++i) {
    var pattern = patterns[i];
    if (pattern && username.indexOf(pattern) != -1) {
      return true;
    }
  }
  return false;
}

// Can be enhanced by regular expressions but will "regular" folks get it?
function isLoggable(line) {
  // Do not filter logs if in DEBUG mode OR
  // if log filtering is disabled
  if (debug || GM_getValue('filterLog') != 'checked')
    return true;

  if (line.indexOf('Log filtering') != -1) return true;

  var logPatternPass = getSavedList('logFilterPass');
  var logPatternFail = getSavedList('logFilterFail');

  // Do not filter if both lists are empty
  if ( (logPatternPass.length + logPatternFail.length) == 0 ) return true;

  // Log if line ONLY contains any pattern from list
  for (var i = 0, iLength=logPatternPass.length; i < iLength; ++i) {
    var pattern = logPatternPass[i];
    if ( pattern && line.indexOf(pattern) != -1) {
      return true;
    }
  }

  var failLength = logPatternFail.length;
  if (failLength == 0) {
    return false;
  }

  // Do not log if line contains any pattern from list
  for (var i = 0; i < failLength; i++) {
    var pattern = logPatternFail[i]
    if ( pattern && line.indexOf(pattern) != -1) {
      return false;
    }
  }

  if (logPatternPass.length == 0) {
    return true;
  }

  return false;
}

function addToLog(icon, line) {
  if (!debug && GM_getValue('autoLog') != 'checked') {
    // Logging is turned off.
    return;
  }

  // Do not log anything if log filter condition is met
  if (!isLoggable(line)) {
    return;
  }

  // Create a datestamp, formatted for the log.
  var currentTime = new Date();
  var m_names = new Array('Jan', 'Feb', 'Mar',
    'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
    'Oct', 'Nov', 'Dec');
  var timestampdate = m_names[currentTime.getMonth()] + ' ' + currentTime.getDate();

  // Create a timestamp, formatted for the log.
  var hours = currentTime.getHours();
  if (hours >= 12) {
    hours = hours - 12;
    var ampm = ' PM';
  } else {
    var ampm = ' AM';
  }
  if (hours == 0) {
    hours = 12;
  }
  var timestamptime = hours + ':' +
    (currentTime.getMinutes() < 10 ? 0 : '') +
    currentTime.getMinutes() + ':' +
    (currentTime.getSeconds() < 10 ? 0 : '') +
    currentTime.getSeconds() +
    ampm;

  // Get a log box to work with.
  var logBox = document.getElementById('logBox');
  if (!logBox) {
    if (!addToLog.logBox) {
      // There's no log box, so create one.
      addToLog.logBox = document.createElement('div');
      addToLog.logBox.innerHTML = GM_getValue('itemLog', '');
    }
    logBox = addToLog.logBox;
  }
  var logLen = logBox.childNodes.length;

  // Determine whether the new line repeats the most recent one.
  var repeatCount;
  if (logLen) {
    var elt = logBox.firstChild.childNodes[1];
    if (elt && elt.innerHTML.untag().indexOf(String(line).untag()) == 0) {
      if (elt.innerHTML.match(/\((\d+) times\)$/)) {
        repeatCount = parseInt(RegExp.$1) + 1;
      } else {
        repeatCount = 2;
      }
      line += ' (' + repeatCount + ' times)';
    }
  }

  // Create the new log entry.
  var lineToAdd = document.createElement('div');
  lineToAdd.className = 'logEvent ' + icon;
  lineToAdd.innerHTML = '<div class="eventTime">' + timestampdate + '<br/>' +
                        timestamptime + '</div><div class="eventBody">' +
                        line + '</div><div class="clear"></div>';

  // Put it in the log box.
  if (repeatCount) {
    logBox.replaceChild(lineToAdd, logBox.firstChild);
  } else {
    logBox.insertBefore(lineToAdd, logBox.firstChild);

    // If the log is too large, trim it down.
    var logMax = parseInt(GM_getValue('autoLogLength', 300));
    //GM_log('logLen=' + logLen + ', logMax=' + logMax);
    if (logMax > 0) {
      while (logLen-- > logMax) {
        logBox.removeChild(logBox.lastChild);
      }
    }
  }

  // Save the log.
  GM_setValue('itemLog', logBox.innerHTML);
}

function updateLogStats() {
  var fightCount = document.getElementById('fightCount');
  if (!fightCount) return;
    fightCount.firstChild.nodeValue = makeCommaValue(GM_getValue('fightWinCountInt', 0) + GM_getValue('fightLossCountInt', 0));
  document.getElementById('fightWinCount').firstChild.nodeValue = makeCommaValue(GM_getValue('fightWinCountInt', 0));
  var fightWinPct = (GM_getValue('fightWinCountInt', 0)/(GM_getValue('fightWinCountInt', 0) + GM_getValue('fightLossCountInt', 0)) * 100).toFixed(1);
    document.getElementById('fightWinPct').firstChild.nodeValue =  (isNaN(fightWinPct)) ? '0.0%' : fightWinPct + '%';
  document.getElementById('fightLossCount').firstChild.nodeValue = makeCommaValue(GM_getValue('fightLossCountInt', 0));
  var fightLossPct = (GM_getValue('fightLossCountInt', 0)/(GM_getValue('fightWinCountInt', 0) + GM_getValue('fightLossCountInt', 0)) * 100).toFixed(1)
    document.getElementById('fightLossPct').firstChild.nodeValue =  (isNaN(fightLossPct)) ? '0.0%' : fightLossPct + '%';

  var how = GM_getValue('staminaSpendHow');
  switch (GM_getValue('staminaSpendHow')) {
    case STAMINA_HOW_ROB_RANDOM:
    case STAMINA_HOW_ROB_LIST:
      var robCount = document.getElementById('robCount');
      if (!robCount) return;
      document.getElementById('robCount').firstChild.nodeValue = makeCommaValue(GM_getValue('robWinCountInt', 0) + GM_getValue('robLossCountInt', 0));
      document.getElementById('robWinCount').firstChild.nodeValue = makeCommaValue(GM_getValue('robWinCountInt', 0));
      var robWinPct = (GM_getValue('robWinCountInt', 0)/(GM_getValue('robWinCountInt', 0) + GM_getValue('robLossCountInt', 0)) * 100).toFixed(1);
        document.getElementById('robWinPct').firstChild.nodeValue =  (isNaN(robWinPct)) ? '0.0%' : robWinPct + '%';
      document.getElementById('robLossCount').firstChild.nodeValue = makeCommaValue(GM_getValue('robLossCountInt', 0));
      var robLossPct = (GM_getValue('robLossCountInt', 0)/(GM_getValue('robWinCountInt', 0) + GM_getValue('robLossCountInt', 0)) * 100).toFixed(1);
        document.getElementById('robLossPct').firstChild.nodeValue =  (isNaN(robLossPct)) ? '0.0%' : robLossPct + '%';
      break;

    case STAMINA_HOW_HITMAN:
      //Update new hitman stats
      var hitmanCount = document.getElementById('hitmanCount');
      if (!hitmanCount) return;
      document.getElementById('hitmanCount').firstChild.nodeValue = makeCommaValue(parseInt(GM_getValue('hitmanWinCountInt', 0)) + parseInt(GM_getValue('hitmanLossCountInt', 0)));
      document.getElementById('hitmanWinCount').firstChild.nodeValue = makeCommaValue(GM_getValue('hitmanWinCountInt', 0));
      var hitmanWinPct = (GM_getValue('hitmanWinCountInt', 0)/(GM_getValue('hitmanWinCountInt', 0) + GM_getValue('hitmanLossCountInt', 0)) * 100).toFixed(1);
        document.getElementById('hitmanWinPct').firstChild.nodeValue =  (isNaN(hitmanWinPct)) ? '0.0%' : hitmanWinPct + '%';
      document.getElementById('hitmanLossCount').firstChild.nodeValue = makeCommaValue(GM_getValue('hitmanLossCountInt', 0));
      var hitmanLossPct = (GM_getValue('hitmanLossCountInt', 0)/(GM_getValue('hitmanWinCountInt', 0) + GM_getValue('hitmanLossCountInt', 0)) * 100).toFixed(1);
        document.getElementById('hitmanLossPct').firstChild.nodeValue =  (isNaN(hitmanLossPct)) ? '0.0%' : hitmanLossPct + '%';
      break;

    default:
      DEBUG('Neither Rob nor Hitman Stats');
      break;
  }

  document.getElementById('totalWinDollars').firstChild.nodeValue = '$' + makeCommaValue(parseInt(GM_getValue('totalWinDollarsInt', 0)));  //Accomodates up to $999,999,999,999
  document.getElementById('totalLossDollars').firstChild.nodeValue = '$' + makeCommaValue(parseInt(GM_getValue('totalLossDollarsInt', 0)));
  document.getElementById('totalExp').firstChild.nodeValue = makeCommaValue(GM_getValue('totalExpInt', 0));

  //FIXME: These values currently only get refreshed when stamina is spent,
  //       which isn't often enough. Perhaps other stats that only need to
  //       be refreshed after stamina is spent would be more useful anyway?
  //       And the xps to next level stat already appears in the main window.
  var rate = getStaminaGainRate();
  document.getElementById('expRate').firstChild.nodeValue = rate.toFixed(2);
  document.getElementById('expToNext').firstChild.nodeValue = makeCommaValue(ptsToNextLevel);
  document.getElementById('stamToNext').firstChild.nodeValue = rate? (ptsToNextLevel / rate).toFixed(0): 'n/a';
}

function logFilterOnOff() {
  // Toggle logFilter flag
  var msgLog =  'Log filtering has been ' + (toggleCheckElt('filterLog') ? 'enabled' : 'disabled') + '.';
  addToLog('info Icon', msgLog);
  if (GM_getValue('logOpen') != 'open') {
    alert(msgLog);
  }
}

function debugOnOff() {
  var debugElt = document.getElementById('ap_debug_log');
  if (GM_getValue('enableDebug') == 'checked') {
    addToLog('info Icon', 'Debug logging disabled.');
    GM_setValue('enableDebug', 0);
    debug = false;
    if (GM_getValue('logOpen') != 'open') {
      alert('Debug logging disabled.');
    } else if (debugElt) {
      debugElt.style.display = 'none';
    }
  } else {
    GM_setValue('enableDebug', 'checked');
    debug = true;
    showMafiaLogBox();
    addToLog('info Icon', 'Debug logging enabled.');
    if (debugElt) {
      debugElt.style.display = 'block';
    }
    debugDumpSettings();
    checkLanguage();
  }
}

function DEBUG(line, level) {
  var level = (level == null) ? 0 : level;
  if (debug) {
    addToLog('info Icon', line);
    GM_log(line, level);
  }
}

// Get a saved list of player objects.
function getSavedPlayerList(listName, forceRefresh) {
  if (!listName) return [];

  if (forceRefresh || !getSavedPlayerList[listName]) {
    // Get any saved list of player ID's from storage.
    var ids = getSavedList(listName);

    // Convert the ID list (strings) into a player list (objects).
    var l = [];
    for (var i = 0, iLength=ids.length; i < iLength; ++i) {
      l.push({ id: ids[i]});
    }
    getSavedPlayerList[listName] = l;
  }

  return getSavedPlayerList[listName];
}

// Save a list of player objects.
function setSavedPlayerList(listName, list) {
  // Build a list of player ID's.
  var l = [];
  for (var i = 0, iLength=list.length; i < iLength; ++i) {
    var player = list[i];
    if (player && player.id) {
      l.push(player.id);
    }
  }

  return setSavedList(listName, l);
}

function CyclePropertyList() {
  DEBUG('CyclePropertyList(): '+ GM_getValue('propertyId', ''));
  if (GM_getValue('propertyId') <= 6) {
    CycleRobList();
    var i = 12; //back to casinos
  } else {
    var i = GM_getValue('propertyId') - 1;
  }
  GM_setValue('propertyId', i);
}

function refreshLog() {
  var logBox = document.getElementById('logBox');
  if (logBox) {
    logBox.innerHTML = GM_getValue('itemLog', '');
  }
}

function clearLog() {
  GM_setValue('itemLog', '');

  //reset the log box
  var logBox = document.getElementById('logBox');
    logBox.innerHTML = '';
}

function clearStats() {
  //reset log statistics
  GM_setValue('fightWinCountInt', 0);
  GM_setValue('fightLossCountInt', 0);
  GM_setValue('robWinCountInt', 0);
  GM_setValue('robLossCountInt', 0);
  GM_setValue('hitmanWinCountInt',0);
  GM_setValue('hitmanWinDollarsInt','0');
  GM_setValue('hitmanLossCountInt',0);
  GM_setValue('hitmanLossDollarsInt','0');

  GM_setValue('totalExpInt', 0);
  GM_setValue('totalWinDollarsInt', '0');
  GM_setValue('totalLossDollarsInt', '0');

  GM_setValue('lastHitXp', 0);
  GM_setValue('totalHits', 0);
  GM_setValue('totalXp', 0);
  GM_setValue('currentHitXp', 0);
  GM_setValue('currentHitDollars','0');



  //ATK
  //New tracking stats for NY
  GM_setValue('hourlyStats', '0');
  GM_setValue('fightExpNY', 0);          //Number of exper. points earned from fights in NY
  GM_setValue('fightWinsNY', 0);         //Count of fights won in NY
  GM_setValue('fightWin$NY', '0');       //$ won from fights in NY
  GM_setValue('fightLossesNY', 0);       //Count of fights lost in NY
  GM_setValue('fightLoss$NY', '0');      //$ lost from fights in NY
  GM_setValue('fightLossBGCHNY', 0);     //NY Bodyguard Critical Hit losses
  GM_setValue('fightLossBGCH$NY', '0');  //NY$ lost by Bodyguard Critical Hit
  GM_setValue('fightLossCHNY', 0);       //NY Critical Hit fight losses
  GM_setValue('fightLossCH$NY', '0');    //$ lost from Critical Hit in NY fights
  GM_setValue('fightLossStrongNY', 0);   //Too Strong loss type count from NY fights
  GM_setValue('fightLossStrong$NY', '0');//$ lost from Too Strong in NY fights
  //New tracking stats for Cuba
  GM_setValue('fightExpCuba', 0);        //Number of exper. points earned from fights in Cuba
  GM_setValue('fightWinsCuba', 0);       //Count of fights won in Cuba
  GM_setValue('fightWin$Cuba', '0');     //Cuban pesos won from fights
  GM_setValue('fightLossesCuba', 0);     //Count of fights lost in Cuba
  GM_setValue('fightLoss$Cuba', '0');    //Cuban pesos lost from fights
  GM_setValue('fightLossBGCHCuba', 0);   //Bodyguard Critical Hit loss type count from Cuba fights
  GM_setValue('fightLossBGCH$Cuba', '0');//$ lost from Bodyguard Critical Hit in Cuba fights
  GM_setValue('fightLossCHCuba', 0);     //Critical Hit loss type count from Cuba fights
  GM_setValue('fightLossCH$Cuba', '0');  //$ lost from Critical Hit in Cuba fights
  GM_setValue('fightLossStrongCuba', 0); //Too Strong loss type count from Cuba fights
  GM_setValue('fightLossStrong$Cuba', '0');//$ lost from Too Strong in Cuba fights
  //New tracking stats for Moscow
  GM_setValue('fightExpMoscow', 0);        //Number of exper. points earned from fights in Moscow
  GM_setValue('fightWinsMoscow', 0);       //Count of fights won in Moscow
  GM_setValue('fightWin$Moscow', '0');     //Moscown pesos won from fights
  GM_setValue('fightLossesMoscow', 0);     //Count of fights lost in Moscow
  GM_setValue('fightLoss$Moscow', '0');    //Moscown pesos lost from fights
  GM_setValue('fightLossBGCHMoscow', 0);   //Bodyguard Critical Hit loss type count from Moscow fights
  GM_setValue('fightLossBGCH$Moscow', '0');//$ lost from Bodyguard Critical Hit in Moscow fights
  GM_setValue('fightLossCHMoscow', 0);     //Critical Hit loss type count from Moscow fights
  GM_setValue('fightLossCH$Moscow', '0');  //$ lost from Critical Hit in Moscow fights
  GM_setValue('fightLossStrongMoscow', 0); //Too Strong loss type count from Moscow fights
  GM_setValue('fightLossStrong$Moscow', '0');//$ lost from Too Strong in Moscow fights
  updateLogStats();
}

function clearHitlistArray () {
  GM_setValue('onHitlist', 0);
}

function clearHitStats () {
  GM_setValue('lastHitXp', 0);
  GM_setValue('totalHits', 0);
  GM_setValue('totalXp', 0);
  GM_setValue('currentHitXp', 0);
}

function minBankCheck() {
  // Don't allow zero value in autobank setting.
  var amount = parseInt(document.getElementById('bankConfig').value);
  if (isNaN(amount) || amount < 1) {
    alert('Minimum auto-bank amount must be 1 or higher');
    document.getElementById('bankConfig').focus();
  }

  var amountCuba = parseInt(document.getElementById('bankConfigCuba').value);
  if (isNaN(amountCuba) || amountCuba < 1) {
    alert('Minimum Cuba auto-bank amount must be 1 or higher');
    document.getElementById('bankConfigCuba').focus();
  }

  var amountMoscow = parseInt(document.getElementById('bankConfigMoscow').value);
  if (isNaN(amountMoscow) || amountMoscow < 1) {
    alert('Minimum Moscow auto-bank amount must be 1 or higher');
    document.getElementById('bankConfigMoscow').focus();
  }
}

function takeAction(link, action, context) {
  if (!link) {
    addToLog('warning Icon', 'BUG DETECTED: No link passed to takeAction().');
    return;
  }

  DEBUG('Action set to: ' + action);
  GM_xmlhttpRequest({ method: 'GET',
    url: link,
    headers:{'Content-type':'application/x-www-form-urlencoded'},
    onload: function(responseDetails) { handleResponse(responseDetails, action, context); },
    onerror: function(responseDetails) { addToLog('warning Icon', 'error status '+ responseDetails.status); }
  });
}

function createLogBox() {
  // Define CSS styles.
  makeElement('style', document.getElementsByTagName('head')[0], {'type':'text/css'}).appendChild(document.createTextNode(
    '#mafiaLogBox div.mouseunderline:hover{text-decoration:underline}' +
    '#mafiaLogBox .logEvent{border-bottom:1px solid #333; padding:4px 0px}' +
    '#mafiaLogBox .eventTime{color:#888; font-size: 11px; width:75px;  float:left}' +
    '#mafiaLogBox .eventBody{width:315px; float:right}' +
    '#mafiaLogBox .eventTime,#mafiaLogBox .eventIcon,#mafiaLogBox .eventBody{}' +
    '#mafiaLogBox .eventBody .good {color:#52E259;font-weight:bold;}' +
    '#mafiaLogBox .eventBody .bad {color:#EC2D2D;font-weight:bold;}' +
    '#mafiaLogBox .eventBody .warn {color:#EC2D2D;}' +
    '#mafiaLogBox .eventBody .money {color:#00CC00;font-weight:bold;}' +
    '#mafiaLogBox .eventBody .expense {color:#FFD927;}' +
    '#mafiaLogBox .eventBody .loot {color:#FF6633;}' +
    '#mafiaLogBox .eventBody .user {color:#FFD927;}' +
    '#mafiaLogBox .eventBody .attacker {color:#EC2D2D;}' +
    '#mafiaLogBox .eventBody .job {color:#52E259;font-weight:bold;}' +
    '#mafiaLogBox .clear{clear:both}' +
    '#mafiaLogBox .logEvent.Icon{background-repeat: no-repeat; background-position: 75px}' +
    '#mafiaLogBox .logEvent.process.Icon{background-image:url(' + stripURI(processIcon) + ')}' +
    '#mafiaLogBox .logEvent.search.Icon{background-image:url(' + stripURI(searchIcon) + ')}' +
    '#mafiaLogBox .logEvent.warning.Icon{background-image:url(' + stripURI(warningIcon) + ')}' +
    '#mafiaLogBox .logEvent.info.Icon{background-image:url(' + stripURI(infoIcon) + ')}' +
    '#mafiaLogBox .logEvent.lootbag.Icon{background-image:url(' + stripURI(lootbagIcon) + ')}' +
    '#mafiaLogBox .logEvent.found.Icon{background-image:url(' + stripURI(lootbagIcon) + ')}' +
    '#mafiaLogBox .logEvent.updateGood.Icon{background-image:url(' + stripURI(updateGoodIcon) + ')}' +
    '#mafiaLogBox .logEvent.updateBad.Icon{background-image:url(' + stripURI(updateBadIcon) + ')}' +
    '#mafiaLogBox .logEvent.pause.Icon{background-image:url(' + stripURI(pauseIcon) + ')}' +
    '#mafiaLogBox .logEvent.play.Icon{background-image:url(' + stripURI(playIcon) + ')}' +
    '#mafiaLogBox .logEvent.good.Icon{background-image:url(' + stripURI(goodIcon) + ')}' +
    '#mafiaLogBox .logEvent.bad.Icon{background-image:url(' + stripURI(badIcon) + ')}' +
    '#mafiaLogBox .logEvent.experience.Icon{background-image:url(' + stripURI(experienceIcon) + ')}' +
    '#mafiaLogBox .logEvent.experience.Icon{background-image:url(' + stripURI(experienceIcon) + ')}' +
    '#mafiaLogBox .logEvent.health.Icon{background-image:url(' + stripURI(healthIcon) + ')}' +
    '#mafiaLogBox .logEvent.cash.Icon{background-image:url(' + stripURI(cashIcon) + ')}' +
    '#mafiaLogBox .logEvent.cashCuba.Icon{background-image:url(' + stripURI(cashCubaIcon) + ')}' +
    '#mafiaLogBox .logEvent.cashMoscow.Icon{background-image:url(' + stripURI(cashMoscowIcon) + ')}' +
    '#mafiaLogBox .logEvent.energyPack.Icon{background-image:url(' + stripURI(energyPackIcon) + ')}'
  ));


  var mafiaLogBox = makeElement('div', document.body, {'id':'mafiaLogBox', 'style':'position: fixed; right: 5px; top: 55px; bottom: 30px; width: 427px; background: black url(http://mwdirectfb3.static.zynga.com/mwfb/graphics/MW_FB_Background_760.gif); text-align: left; padding: 5px; border: 1px solid; border-color: #FFFFFF; z-index: 98; font-size: 10pt;'});

  var logClrButton = makeElement('div', mafiaLogBox, {'class':'mouseunderline', 'style':'position: absolute; left: 5px; top: 0px; font-weight: 600; cursor: pointer; color: rgb(255, 217, 39);'});
    logClrButton.appendChild(document.createTextNode('clear log'));
    logClrButton.addEventListener('click', clearLog, false);

  var logClrStatsButton = makeElement('div', mafiaLogBox, {'class':'mouseunderline', 'style':'position: absolute; left: 85px; top: 0px; font-weight: 600; cursor: pointer; color: rgb(255, 217, 39);'});
    logClrStatsButton.appendChild(document.createTextNode('clear stats'));
    logClrStatsButton.addEventListener('click', clearStats, false);

  var closeLogButton = makeElement('div', mafiaLogBox, {'class':'mouseunderline', 'style':'position: absolute; right: 5px; top: 0px; font-weight: 600; cursor: pointer; color: rgb(255, 217, 39);'});
    closeLogButton.appendChild(document.createTextNode('close'));
    closeLogButton.addEventListener('click', hideMafiaLogBox, false);

  var debugElt = makeElement('div', mafiaLogBox, {'id':'ap_debug_log', 'style':'display: none; position: absolute; left: 180px; top: 0px; font-weight: 600;color: rgb(255, 0, 0);'});
  debugElt.appendChild(document.createTextNode('Debug Log'));
  if (debug) {
    debugElt.style.display = 'block';
  }

  var logBox = makeElement('div', mafiaLogBox, {'id':'logBox', 'style':'position: absolute; overflow: auto; right: 0px; top: 20px; bottom: 68px; width: 425px; background-color: #111111; font-size:11px; color: #BCD2EA; text-align: left; padding: 5px; border: 1px solid;'});
    logBox.innerHTML = GM_getValue('itemLog', '');

  //Change Stats Displayed based on current stamina burner
  //fight Stats are currently default for leftmost portion of Stats
  makeElement('div', mafiaLogBox, {'style':'position: absolute; left: 5px; bottom: 33px; font-weight: 100;color: #666666;'}).appendChild(document.createTextNode('Fights:'));
  makeElement('div', mafiaLogBox, {'id':'fightCount', 'style':'position: absolute; right: 335px; bottom: 33px; font-weight: 600;color: #BCD2EA;'}).appendChild(document.createTextNode(makeCommaValue(GM_getValue('fightWinCountInt', 0) + GM_getValue('fightLossCountInt', 0))));
  makeElement('div', mafiaLogBox, {'style':'position: absolute; left: 5px; bottom: 18px; font-weight: 100;color: #666666;'}).appendChild(document.createTextNode('Won:'));
  makeElement('div', mafiaLogBox, {'id':'fightWinCount', 'style':'position: absolute; right: 335px; bottom: 18px; font-weight: 600;color: #52E259;'}).appendChild(document.createTextNode(makeCommaValue(GM_getValue('fightWinCountInt', 0))));
  var fightWinPct = (GM_getValue('fightWinCountInt', 0)/(GM_getValue('fightWinCountInt', 0) + GM_getValue('fightLossCountInt', 0)) * 100).toFixed(1);
    makeElement('div', mafiaLogBox, {'id':'fightWinPct', 'style':'position: absolute; right: 280px; bottom: 18px; font-weight: 100;color: #52E259;'}).appendChild(document.createTextNode((isNaN(fightWinPct)) ? '0.0%' : fightWinPct + '%'));
  makeElement('div', mafiaLogBox, {'style':'position: absolute; left: 5px; bottom: 3px; font-weight: 100;color: #666666;'}).appendChild(document.createTextNode('Lost:'));
  makeElement('div', mafiaLogBox, {'id':'fightLossCount', 'style':'position: absolute; right: 335px; bottom: 3px; font-weight: 600;color: #EC2D2D;'}).appendChild(document.createTextNode(makeCommaValue(GM_getValue('fightLossCountInt', 0))));
  var fightLossPct = (GM_getValue('fightLossCountInt', 0)/(GM_getValue('fightWinCountInt', 0) + GM_getValue('fightLossCountInt', 0)) * 100).toFixed(1);
    makeElement('div', mafiaLogBox, {'id':'fightLossPct', 'style':'position: absolute; right: 280px; bottom: 3px; font-weight: 100;color: #EC2D2D;'}).appendChild(document.createTextNode((isNaN(fightLossPct)) ? '0.0%' : fightLossPct + '%'));

  var how = GM_getValue('staminaSpendHow');
  switch (GM_getValue('staminaSpendHow')) {
    case STAMINA_HOW_ROB_RANDOM:
    case STAMINA_HOW_ROB_LIST:
      makeElement('div', mafiaLogBox, {'style':'position: absolute; left: 165px; bottom: 33px; font-weight: 100;color: #666666;'}).appendChild(document.createTextNode('Robs:'));
      makeElement('div', mafiaLogBox, {'id':'robCount', 'style':'position: absolute; right: 185px; bottom: 33px; font-weight: 600;color: #BCD2EA;'}).appendChild(document.createTextNode(makeCommaValue((GM_getValue('robWinCountInt', 0) + GM_getValue('robLossCountInt', 0)))));
      makeElement('div', mafiaLogBox, {'style':'position: absolute; left: 165px; bottom: 18px; font-weight: 100;color: #666666;'}).appendChild(document.createTextNode('Succ:'));
      makeElement('div', mafiaLogBox, {'id':'robWinCount', 'style':'position: absolute; right: 185px; bottom: 18px; font-weight: 600;color: #52E259;'}).appendChild(document.createTextNode(makeCommaValue(GM_getValue('robWinCountInt', 0))));
      var robWinPct = (GM_getValue('robWinCountInt', 0)/(GM_getValue('robWinCountInt', 0) + GM_getValue('robLossCountInt', 0)) * 100).toFixed(1);
        makeElement('div', mafiaLogBox, {'id':'robWinPct', 'style':'position: absolute; right: 130px; bottom: 18px; font-weight: 100;color: #52E259;'}).appendChild(document.createTextNode((isNaN(robWinPct)) ? '0.0%' : robWinPct + '%'));
      makeElement('div', mafiaLogBox, {'style':'position: absolute; left: 165px; bottom: 3px; font-weight: 100;color: #666666;'}).appendChild(document.createTextNode('Fail:'));
      makeElement('div', mafiaLogBox, {'id':'robLossCount', 'style':'position: absolute; right: 185px; bottom: 3px; font-weight: 600;color: #EC2D2D;'}).appendChild(document.createTextNode(makeCommaValue(GM_getValue('robLossCountInt', 0))));
      var robLossPct = (GM_getValue('robLossCountInt', 0)/(GM_getValue('robWinCountInt', 0) + GM_getValue('robLossCountInt', 0)) * 100).toFixed(1);
        makeElement('div', mafiaLogBox, {'id':'robLossPct', 'style':'position: absolute; right: 130px; bottom: 3px; font-weight: 100;color: #EC2D2D;'}).appendChild(document.createTextNode((isNaN(robLossPct)) ? '0.0%' : robLossPct + '%'));
      break;

    case STAMINA_HOW_HITMAN:
      makeElement('div', mafiaLogBox, {'style':'position: absolute; left: 165px; bottom: 33px; font-weight: 100;color: #666666;'}).appendChild(document.createTextNode('Hits:'));
      makeElement('div', mafiaLogBox, {'id':'hitmanCount', 'style':'position: absolute; right: 185px; bottom: 33px; font-weight: 600;color: #BCD2EA;'}).appendChild(document.createTextNode(makeCommaValue((GM_getValue('hitmanWinCountInt', 0) + GM_getValue('hitmanLossCountInt', 0)))));
      makeElement('div', mafiaLogBox, {'style':'position: absolute; left: 165px; bottom: 18px; font-weight: 100;color: #666666;'}).appendChild(document.createTextNode('Succ:'));
      makeElement('div', mafiaLogBox, {'id':'hitmanWinCount', 'style':'position: absolute; right: 185px; bottom: 18px; font-weight: 600;color: #52E259;'}).appendChild(document.createTextNode(makeCommaValue(GM_getValue('hitmanWinCountInt', 0))));
      var hitmanWinPct = (GM_getValue('hitmanWinCountInt', 0)/(GM_getValue('hitmanWinCountInt', 0) + GM_getValue('hitmanLossCountInt', 0)) * 100).toFixed(1);
        makeElement('div', mafiaLogBox, {'id':'hitmanWinPct', 'style':'position: absolute; right: 130px; bottom: 18px; font-weight: 100;color: #52E259;'}).appendChild(document.createTextNode((isNaN(hitmanWinPct)) ? '0.0%' : hitmanWinPct + '%'));
      makeElement('div', mafiaLogBox, {'style':'position: absolute; left: 165px; bottom: 3px; font-weight: 100;color: #666666;'}).appendChild(document.createTextNode('Fail:'));
      makeElement('div', mafiaLogBox, {'id':'hitmanLossCount', 'style':'position: absolute; right: 185px; bottom: 3px; font-weight: 600;color: #EC2D2D;'}).appendChild(document.createTextNode(makeCommaValue(GM_getValue('hitmanLossCountInt', 0))));
      var hitmanLossPct = (GM_getValue('hitmanLossCountInt', 0)/(GM_getValue('hitmanWinCountInt', 1) + GM_getValue('hitmanLossCountInt', 0)) * 100).toFixed(1);
        makeElement('div', mafiaLogBox, {'id':'hitmanLossPct', 'style':'position: absolute; right: 130px; bottom: 3px; font-weight: 100;color: #EC2D2D;'}).appendChild(document.createTextNode((isNaN(hitmanLossPct)) ? '0.0%' : hitmanLossPct + '%'));
      break;

    default:
      DEBUG('Neither Rob nor Hitman Stats');
      break;
  }


  makeElement('div', mafiaLogBox, {'id':'totalWinDollars', 'style':'position: absolute; right: 5px; bottom: 18px; font-weight: 600;color: #52E259;'}).appendChild(document.createTextNode('$' + makeCommaValue(parseInt(GM_getValue('totalWinDollarsInt', 0)))));  //Accomodates up to $999,999,999,999
  makeElement('div', mafiaLogBox, {'id':'totalLossDollars', 'style':'position: absolute; right: 5px; bottom: 3px; font-weight: 600;color: #EC2D2D;'}).appendChild(document.createTextNode('$' + makeCommaValue(parseInt(GM_getValue('totalLossDollarsInt', 0)))));
  makeElement('div', mafiaLogBox, {'style':'position: absolute; left: 5px; bottom: 50px; font-size: 11px; font-weight: 100;color: #666666;'}).appendChild(document.createTextNode('Exp Gained:'));
  makeElement('div', mafiaLogBox, {'id':'totalExp', 'style':'position: absolute; right: 329px; bottom: 50px; font-size: 11px; font-weight: 600;color: #52E259;'}).appendChild(document.createTextNode(makeCommaValue(GM_getValue('totalExpInt', 0))));
  makeElement('hr', mafiaLogBox, {'style':'position: absolute; left: 0; bottom: 42px; height: 1px; border: 0px; width: 90%; margin-left: 5%; color: #666666; background-color: #666666'});
  makeElement('div', mafiaLogBox, {'style':'position: absolute; right: 5px; bottom: 33px; font-weight: 100;color: #666666;'}).appendChild(document.createTextNode('Total $ Won/Lost'));
  makeElement('div', mafiaLogBox, {'style':'position: absolute; right: 267px; bottom: 50px; font-size: 11px; font-weight: 100;color: #666666;'}).appendChild(document.createTextNode('Gain Rate:'));
  var rate = getStaminaGainRate();
    makeElement('div', mafiaLogBox, {'id':'expRate', 'style':'position: absolute; right: 240px; bottom: 50px; font-size: 11px; font-weight: 600;color: #04B4AE;'}).appendChild(document.createTextNode(rate.toFixed(2)));
  makeElement('div', mafiaLogBox, {'style':'position: absolute; right: 175px; bottom: 50px; font-size: 11px; font-weight: 100;color: #666666;'}).appendChild(document.createTextNode('Nxt Lvl In:'));
  makeElement('div', mafiaLogBox, {'id':'expToNext', 'style':'position: absolute; right: 141px; bottom: 50px; font-size: 11px; font-weight: 600;color: #04B4AE;'}).appendChild(document.createTextNode(makeCommaValue(ptsToNextLevel)));
  makeElement('div', mafiaLogBox, {'style':'position: absolute; right: 36px; bottom: 50px; font-size: 11px; font-weight: 100;color: #666666;'}).appendChild(document.createTextNode('Stam Req\'d to Lvl:'));
  makeElement('div', mafiaLogBox, {'id':'stamToNext', 'style':'position: absolute; right: 2px; bottom: 50px; font-size: 11px; font-weight: 600;color: #04B4AE;'}).appendChild(document.createTextNode(rate? (ptsToNextLevel / rate).toFixed(0) : 'n/a'));
}

function createSettingsBox() {
  if (document.getElementById('settingsBox')) return;

  if (!document.getElementById('ap_settings_css')) {
    makeElement('style', document.getElementsByTagName('head')[0], {'id':'ap_settings_css', 'type':'text/css'}).appendChild(document.createTextNode(
      '#settingsBox #tabNav div{border-right:1px solid #000;float:left;padding:0 7px;position:static;text-align:center}' +
      '#settingsBox #tabNav div.selected{background-image:url(' + stripURI(tabSelectedImage) + ')}' +
      '#settingsBox #tabNav div a{color:#fff;font-weight:700}' +
      '#settingsBox .sexy_button{position:absolute;background-image:url(' + stripURI(redBgImage) + ');border:1px solid #FFD927;color:#FFD927;cursor:pointer;display:block;float:left;font-size:14px;font-weight:700;padding:5px;text-decoration:none;width:auto}' +
      '#settingsBox .sexy_button button{background:transparent;border:medium none #FFF;color:#FFD927;cursor:pointer;font-size:14px;font-weight:700;margin:0}' +
      '#settingsBox .sexy_button button:hover{color:#BCD2EA;font-weight:700;text-decoration:none}' +
      '#settingsBox .tabcontent{display:none;height:420px;top:110px;width:600px}' +
      '#settingsBox div,#settingsBox select,#settingsBox textarea{position:absolute}' +
      '#settingsBox label {font-weight: normal; color: #BCD2EA}' +
      '#settingsBox #staminaTab div {position: static;}' +
      '#settingsBox #staminaTab select {position: static;}' +
      '#settingsBox #staminaTab textarea {position: static;}' +
      '#settingsBox #staminaTab input {position: static; margin: 0;}' +
      '#settingsBox #staminaTab .lhs {position: static; width: 40%; float: left; text-align: right; padding: 5px;}' +
      '#settingsBox #staminaTab .rhs {position: static; float: left; padding: 5px;}' +
      '#settingsBox #staminaTab .single {position: static; text-align: center}' +
      '#settingsBox #staminaTab .hide {clear: both; visibility: hidden;}' +
      '#settingsBox #energyTab div {position: static;}' +
      '#settingsBox #energyTab select {position: static;}' +
      '#settingsBox #energyTab textarea {position: static;}' +
      '#settingsBox #energyTab input {position: static; margin: 0;}' +
      '#settingsBox #energyTab .lhs {position: static; width: 35%; float: left; text-align: right; padding: 5px;}' +
      '#settingsBox #energyTab .rhs {position: static; float: left; padding: 5px;}' +
      '#settingsBox #energyTab .single {position: static; text-align: center}' +
      '#settingsBox #energyTab .hide {clear: both; visibility: hidden;}'
    ));
  }

  // This creates the settings box just like a facebook popup
  var elt = makeElement('div', document.body, {'class':'generic_dialog pop_dialog', 'id':'GenDialogPopDialog'});
  elt = makeElement('div', elt, {'class':'generic_dialog_popup', 'style':'top: 30px; width: 620px;'});
  elt = makeElement('div', elt, {'class':'pop_content popcontent_advanced', 'id':'pop_content'});
  var settingsBox = makeElement('div', elt, {'style':'position: relative; width: 600px; height: 580px; font-size: 14px; color: #BCD2EA; background: black no-repeat scroll 0 110px', 'id':'settingsBox'});
  //End settings box

  var settingsBoxTopBG = makeElement('div', settingsBox, {'style':'background: black; position: static; height: 80px;'});

    var settingsBoxTitle = makeElement('div', settingsBoxTopBG, {'style':'font-size: 18px; font-weight: bold;'});
    makeElement('img', settingsBoxTopBG, {'src':stripURI(mwapLogo), 'style':'position: absolute; top: 0px; left: 0px;'});
    makeElement('img', settingsBoxTopBG, {'src':stripURI(closeButtonIcon), 'style':'position: absolute; top: 0px; right: 0px; cursor: pointer;'}).addEventListener('click', toggleSettings, false);


  // NOTE: Use the 1st line below to center the button bar, or the 2nd line
  //       to put the bar on the left side.
  //elt = makeElement('div', settingsBox, {'style':'position: static; margin-left: auto; margin-right: auto; width: 100%; text-align: center'});
  elt = makeElement('div', settingsBox, {'style':'position: static; width: 100%; text-align: left'});

  var tabNav = makeElement('div', elt, {'id':'tabNav', 'style':'position: static; display: inline-block; background: transparent url(' + stripURI(redBgImage) + ') repeat-x scroll 0 0; border: 1px solid #FFFFFF; fontsize: 13px; line-height: 28px; height: 30px;'});
    var generalTabLink = makeElement('div', tabNav, {'class':'selected'});
      makeElement('a', generalTabLink, {'href':'#', 'rel':'generalTab'}).appendChild(document.createTextNode('General'));
    var miscTabLink = makeElement('div', tabNav);
      makeElement('a', miscTabLink, {'href':'#', 'rel':'miscTab'}).appendChild(document.createTextNode('Misc'));
    var energyTabLink = makeElement('div', tabNav);
      makeElement('a', energyTabLink, {'href':'#', 'rel':'energyTab'}).appendChild(document.createTextNode('Energy'));
    var staminaTabLink = makeElement('div', tabNav);
      makeElement('a', staminaTabLink, {'href':'#', 'rel':'staminaTab'}).appendChild(document.createTextNode('Stamina'));
    var hitlistTabLink = makeElement('div', tabNav);
      makeElement('a', hitlistTabLink, {'href':'#', 'rel':'hitlistTab'}).appendChild(document.createTextNode('Hitlist'));
    var propertyTabLink = makeElement('div', tabNav);
      makeElement('a', propertyTabLink, {'href':'#', 'rel':'propertyTab'}).appendChild(document.createTextNode('Property'));
    var aboutTabLink = makeElement('div', tabNav);
      makeElement('a', aboutTabLink, {'href':'#', 'rel':'aboutTab'}).appendChild(document.createTextNode('About'));

  var generalTab = makeElement('div', settingsBox, {'id':'generalTab', 'class':'tabcontent', 'style':'background-image:url(' + stripURI(generalTabImage) + ')'});

  var autoClick = makeElement('div', generalTab, {'style':'top: 25px;'});
  makeElement('input', autoClick, {'type':'checkbox', 'id':'autoClick', 'value':'checked'}, 'autoClick', 'checked');
  autoClick.appendChild(document.createTextNode('Enable auto-refresh '));
  makeElement('img', autoClick, {'src':stripURI(energyIcon)});

  var refreshTimes = makeElement('div', generalTab, {'style':'left: 20px; top: 50px;'});
  refreshTimes.appendChild(document.createTextNode('Refresh every '));
  makeElement('input', refreshTimes, {'type':'text', 'value':GM_getValue('r1', '30'), 'id':'r1', 'size':'2'});
  refreshTimes.appendChild(document.createTextNode(' to '));
  makeElement('input', refreshTimes, {'type':'text', 'value':GM_getValue('r2', '110'), 'id':'r2', 'size':'2'});
  refreshTimes.appendChild(document.createTextNode(' seconds'));

  // Healing options
  var autoHeal = makeElement('div', generalTab, {'style':'top:75px;'});
  makeElement('input', autoHeal, {'type':'checkbox', 'id':'autoHeal', 'value':'checked'}, 'autoHeal', 'checked');
  autoHeal.appendChild(document.createTextNode('Heal in '));
  id = 'healLocation';
  var healLocation = makeElement('select', autoHeal, {'id':id, 'style':'position: static'});
  for (var i = 0, iLength=cities.length; i < iLength; ++i) {
    var choice = document.createElement('option');
    choice.value = i;
    choice.appendChild(document.createTextNode(cities[i]));
    healLocation.appendChild(choice);
  }
  healLocation.selectedIndex = GM_getValue('healLocation', NY);
  autoHeal.appendChild(document.createTextNode(' if health falls below '));
  makeElement('input', autoHeal, {'type':'text', 'style':'position: static', 'value':GM_getValue('healthLevel', '50'), 'id':'healthLevel', 'size':'1'});

  var forceHeal = makeElement('div', generalTab, {'style':'top:100px; left:23px'});
  makeElement('img', forceHeal, {'src':stripURI(healthIcon)});
  forceHeal.appendChild(document.createTextNode(' If under 20 health: '));
  elt = makeElement('div', forceHeal, {'style':'position: static; left: 20px; width: 250px; height: 90px '});
  for (var i = 0, iLength=healOptions.length; i < iLength; i++) {
    id = healOptions[i][0];
    title = healOptions[i][1];
    var optElt = makeElement('div', elt);
    makeElement('input', optElt, {'type':'checkbox', 'id':id, 'title':title, 'style':'vertical-align:middle', 'value':'checked'}, id);
    label = makeElement('label', optElt, {'for':id, 'title':title});
    label.appendChild(document.createTextNode(title));
    makeElement('br', elt);
  }

  var autoBank = makeElement('div', generalTab, {'style':'top: 230px;'});
  makeElement('input', autoBank, {'type':'checkbox', 'id':'autoBank', 'value':'checked'}, 'autoBank');
  autoBank.appendChild(document.createTextNode('Enable NY banking '));
  makeElement('img', autoBank, {'src':stripURI(cashIcon)});
  makeElement('input', autoBank, {'type':'text', 'style':'width: 80px;margin-left:5px;', 'title':'Minimum size for each deposit in New York', 'value':GM_getValue('bankConfig', '50000'), 'id':'bankConfig', 'size':'5'});
  autoBank.addEventListener('change', minBankCheck, false);

  var autoBankCuba = makeElement('div', generalTab, {'style':'top: 255px;'});
  makeElement('input', autoBankCuba, {'type':'checkbox', 'id':'autoBankCuba', 'value':'checked'}, 'autoBankCuba');
  autoBankCuba.appendChild(document.createTextNode('Enable Cuba banking '));
  makeElement('img', autoBankCuba, {'src':stripURI(cashCubaIcon)});
  makeElement('input', autoBankCuba, {'type':'text', 'style':'width: 80px;margin-left:5px;', 'title':'Minimum size for each deposit in Cuba', 'value':GM_getValue('bankConfigCuba', '50000'), 'id':'bankConfigCuba', 'size':'5'});
  autoBankCuba.addEventListener('change', minBankCheck, false);

  var autoBankMoscow = makeElement('div', generalTab, {'style':'top: 280px;'});
  makeElement('input', autoBankMoscow, {'type':'checkbox', 'id':'autoBankMoscow', 'value':'checked'}, 'autoBankMoscow');
  autoBankMoscow.appendChild(document.createTextNode('Enable Moscow banking '));
  makeElement('img', autoBankMoscow, {'src':stripURI(cashMoscowIcon)});
  makeElement('input', autoBankMoscow, {'type':'text', 'style':'width: 80px;margin-left:5px;', 'title':'Minimum size for each deposit in Moscow', 'value':GM_getValue('bankConfigMoscow', '50000'), 'id':'bankConfigMoscow', 'size':'5'});
  autoBankMoscow.addEventListener('change', minBankCheck, false);

  var autoPause = makeElement('div', generalTab, {'style':'top: 305px;'});
  makeElement('input', autoPause, {'type':'checkbox', 'id':'autoPause', 'value':'checked'}, 'autoPause');
  autoPause.appendChild(document.createTextNode('Enable auto-pause'));
  autoPause.addEventListener('click', clickAutoPause, false);

  var autoPauseBefore = makeElement('div', generalTab, {'style':'top: 307px; left: 135px;'});
  makeElement('input', autoPauseBefore, {'type':'radio', 'name':'r3', 'id':'autoPauseBefore', 'value':'checked'}, 'autoPauseBefore');
  autoPauseBefore.appendChild(document.createTextNode('Before level up'));

  var autoPauseAfter = makeElement('div', generalTab, {'style':'top: 307px; left: 245px;'});
  makeElement('input', autoPauseAfter, {'type':'radio', 'name':'r3', 'id':'autoPauseAfter', 'value':'checked'}, 'autoPauseAfter');
  autoPauseAfter.appendChild(document.createTextNode('After level up'));

  var autoPauseExp = makeElement('div', generalTab, {'style':'top: 325px; left: 20px;'});
  autoPauseExp.appendChild(document.createTextNode('Experience left to pause at '));
  makeElement('input', autoPauseExp, {'type':'text', 'value':GM_getValue('autoPauseExp', '50'), 'id':'autoPauseExp', 'size':'2'});

  lottoTitle = 'Plays free auto-generated lottery ticket daily'
  var autoLottoOpt = makeElement('div', generalTab, {'style':'top: 350px;'});
  makeElement('input', autoLottoOpt, {'type':'checkbox', 'id':'autoLottoOpt', 'title':lottoTitle, 'value':'checked'}, 'autoLottoOpt');
  autoLottoOpt.appendChild(document.createTextNode('Enable auto-lotto'));

  notificationStopTitle = 'Handles undoing notification pop-ups alerting other users.';
  notificationID = 'notificationHandle';
  notificationLabel = makeElement('div', generalTab, {'id':'notificationLabel', 'title':notificationStopTitle, 'style':'top: 375px; float: left; margin-left: 100px'});
  notificationLabel.appendChild(document.createTextNode('Undo which notifications'));
  var notificationHandle = makeElement('select', generalTab, {'id':notificationID, 'title':notificationStopTitle, 'style':'top: 375px; width: 8em; display: block'}, 'notificationLabel');
  var choice = document.createElement('option');
  choice.value = 0;
  choice.appendChild(document.createTextNode('None'));
  notificationHandle.appendChild(choice);
  choice = document.createElement('option');
  choice.value = 1;
  choice.appendChild(document.createTextNode('Fight/Rob'));
  notificationHandle.appendChild(choice);
  choice = document.createElement('option');
  choice.value = 2;
  choice.appendChild(document.createTextNode('All'));
  notificationHandle.appendChild(choice);
  if (GM_getValue('notificationHandle', 'unk') == 'unk') {
    GM_setValue('notificationHandle', 1);
  }
  notificationHandle.selectedIndex = GM_getValue('notificationHandle', 1);

  var acceptMafiaInvitations = makeElement('div', generalTab, {'style':'top: 400px;'});
  makeElement('input', acceptMafiaInvitations, {'type':'checkbox', 'id':'acceptMafiaInvitations', 'value':'checked'}, 'acceptMafiaInvitations', 'checked');
  acceptMafiaInvitations.appendChild(document.createTextNode('Accept mafia invitations'));

  var autoLog = makeElement('div', generalTab, {'style':'top: 25px; right: 10px;'});
  autoLog.appendChild(document.createTextNode('Enable logging '));
  makeElement('input', autoLog, {'type':'checkbox', 'id':'autoLog', 'value':'checked'}, 'autoLog');

  var logLength = makeElement('div', generalTab, {'style':'top: 50px; right: 10px;'});
  logLength.appendChild(document.createTextNode('Max # of messages in Log '));
  makeElement('input', logLength, {'type':'text', 'id':'autoLogLength', 'value':GM_getValue('autoLogLength', '300'), 'size':'2'});

  var logPlayerUpdates = makeElement('div', generalTab, {'style':'top: 75px; right: 10px;'});
  logPlayerUpdates.appendChild(document.createTextNode('Log Player Updates '));
  makeElement('input', logPlayerUpdates, {'type':'checkbox', 'id':'logPlayerUpdates', 'title':'Send Player Updates to Mafia Log', 'value':'checked'}, 'logPlayerUpdates');

  var logPlayerUpdatesMax = makeElement('div', generalTab, {'style':'top: 100px; right: 10px;'});
  logPlayerUpdatesMax.appendChild(document.createTextNode('Max # of updates '));
  makeElement('input', logPlayerUpdatesMax, {'type':'text', 'id':'logPlayerUpdatesMax', 'value':GM_getValue('logPlayerUpdatesMax', '25'), 'size':'2'});

  // Idle-in location
  var item = makeElement('div', generalTab, {'style':'top: 130px; right: 86px;'});
  item.appendChild(document.createTextNode('Idle in :'));
  id = 'idleLocation';
  var idleLocation = makeElement('select', item, {'id':id});
  for (var i = 0, iLength=cities.length; i < iLength; i++) {
    var choice = document.createElement('option');
    choice.value = i;
    choice.appendChild(document.createTextNode(cities[i]));
    idleLocation.appendChild(choice);
  }
  idleLocation.selectedIndex = GM_getValue('idleLocation', NY);

  var hideAds = makeElement('div', generalTab, {'style':'top: 155px; right: 10px;'});
  hideAds.appendChild(document.createTextNode('Hide advertising'));
  makeElement('input', hideAds, {'type':'checkbox', 'id':'hideAds', 'value':'checked'}, 'hideAds');

  var moveEmailBar = makeElement('div', generalTab, {'style':'top: 178px; right: 10px; '});
  moveEmailBar.appendChild(document.createTextNode('Move email options to the bottom'));
  makeElement('input', moveEmailBar, {'type':'checkbox', 'id':'moveEmailBar', 'value':'checked'}, 'moveEmailBar');

  var leftAlign = makeElement('div', generalTab, {'style':'right: 10px; top: 202px; text-align:right;'});
  leftAlign.appendChild(document.createTextNode('Align game to the left'));
  makeElement('input', leftAlign, {'type':'checkbox', 'id':'leftAlign', 'value':'checked'}, 'leftAlign');

  var delayTimes = makeElement('div', generalTab, {'style':'right: 10px; top: 230px; text-align:right;'});
  delayTimes.appendChild(document.createTextNode('Delay '));
  makeElement('input', delayTimes, {'type':'text', 'value':GM_getValue('d1', '3'), 'id':'d1', 'size':'2'});
  delayTimes.appendChild(document.createTextNode(' to '));
  makeElement('input', delayTimes, {'type':'text', 'value':GM_getValue('d2', '5'), 'id':'d2', 'size':'2'});
  delayTimes.appendChild(document.createTextNode(' seconds'));
  makeElement('br', delayTimes);
  delayTimes.appendChild(document.createTextNode('in-between actions'));

  var autoHelp = makeElement('div', generalTab, {'style':'top: 275px; right: 10px;'});
  autoHelp.appendChild(document.createTextNode('Automatically Help on Jobs'));
  makeElement('input', autoHelp, {'type':'checkbox', 'id':'autoHelp', 'value':'checked'}, 'autoHelp', 'checked');

  var autoGiftSkip = makeElement('div', generalTab, {'style':'top: 300px; right: 10px;'});
  autoGiftSkip.appendChild(document.createTextNode('Skip Gift Wall Posts'));
  makeElement('input', autoGiftSkip, {'type':'checkbox', 'id':'autoGiftSkipOpt', 'value':'checked'}, 'autoGiftSkipOpt');

  var autoLog = makeElement('div', generalTab, {'style':'top: 325px; right: 10px;'});
  autoLog.appendChild(document.createTextNode('Enable Hourly Stats Updates [Beta]'));
  makeElement('input', autoLog, {'type':'checkbox', 'id':'hourlyStatsOpt', 'value':'checked'}, 'hourlyStatsOpt');

  title = 'Check if you want to ask for help automatically with jobs.';
  var autoAskJobHelp = makeElement('div', generalTab, {'style':' right: 10px; top: 350px;'});
  autoAskJobHelp.appendChild(document.createTextNode('Automatically ask for job help'));
  makeElement('input', autoAskJobHelp, {'type':'checkbox', 'id':'autoAskJobHelp', 'title':title, 'value':'checked'}, 'autoAskJobHelp');

  title = 'Enter the minimum experience to ask for job help, or 0 for no minimum.';
  var autoAskJobHelpMinExp = makeElement('div', generalTab, {'style':' right: 10px; top: 375px;'});
  autoAskJobHelpMinExp.appendChild(document.createTextNode('Minimum experience for job help '));
  makeElement('input', autoAskJobHelpMinExp, {'type':'text', 'value':GM_getValue('autoAskJobHelpMinExp', '0'), 'id':'autoAskJobHelpMinExp', 'size':'2'});

  title = 'Enter a message to publish to your wall when asking for help with a job. If you don\'t want to publish to your wall, leave this blank.';
  var autoAskJobHelpMessage = makeElement('div', generalTab, {'style':' right: 10px; top: 400px;'});
  autoAskJobHelpMessage.appendChild(document.createTextNode('Message to post on Wall for job help '));
  makeElement('input', autoAskJobHelpMessage, {'type':'text', 'value':GM_getValue('autoAskJobHelpMessage', ''), 'id':'autoAskJobHelpMessage', 'size':'10'});

  // Create Misc tab.
  var miscTab = createMiscTab();
  settingsBox.appendChild(miscTab);

  // Create energy tab.
  var energyTab = createEnergyTab();
  settingsBox.appendChild(energyTab);

  // Create stamina tab.
  var staminaTab = createStaminaTab();
  settingsBox.appendChild(staminaTab);

  // Create Hitlist tab.
  var hitlistTab = createHitlistTab();
  settingsBox.appendChild(hitlistTab);

  // Create Property tab.
  var propertyTab = makeElement('div', settingsBox, {'id':'propertyTab', 'class':'tabcontent', 'style':'background-image:url(' + stripURI(propertyTabImage) + ')'});

  var autoBuy = makeElement('div', propertyTab, {'style':'top: 25px;'});
  makeElement('input', autoBuy, {'type':'checkbox', 'id':'autoBuy', 'value':'checked'}, 'autoBuy');
  autoBuy.appendChild(document.createTextNode('Enable Auto-buy'));

  var selectProperties = makeElement('div', propertyTab, {'style':'top: 50px;'});
  selectPropertiesTitle = makeElement('span', selectProperties, {'style':'margin-left:6px;'});
  selectPropertiesTitle.appendChild(document.createTextNode('Select the properties you want to buy:'));
  makeElement('br', selectProperties);
  makeElement('br', selectProperties);
  makeElement('input', selectProperties, {'type':'checkbox', 'id':'abandoned', 'value':'checked'}, 'abandoned', 'checked');
  selectProperties.appendChild(document.createTextNode('Abandoned Lot *'));
  makeElement('br', selectProperties);
  makeElement('input', selectProperties, {'type':'checkbox', 'id':'commercial', 'value':'checked'}, 'commercial', 'checked');
  selectProperties.appendChild(document.createTextNode('Commercial Block *'));
  makeElement('br', selectProperties);
  makeElement('input', selectProperties, {'type':'checkbox', 'id':'downtown', 'value':'checked'}, 'downtown', 'checked');
  selectProperties.appendChild(document.createTextNode('Prime Downtown Lot *'));
  makeElement('br', selectProperties);
  makeElement('input', selectProperties, {'type':'checkbox', 'id':'beachfront', 'value':'checked'}, 'beachfront', 'checked');
  selectProperties.appendChild(document.createTextNode('Beachfront Property *'));
  makeElement('br', selectProperties);
  makeElement('input', selectProperties, {'type':'checkbox', 'id':'mike', 'value':'checked'}, 'mike', 'checked');
  selectProperties.appendChild(document.createTextNode('Mafia Mike\'s *'));
  makeElement('br', selectProperties);
  makeElement('input', selectProperties, {'type':'checkbox', 'id':'rent', 'value':'checked'}, 'rent', 'checked');
  selectProperties.appendChild(document.createTextNode('Rent House *'));
  makeElement('br', selectProperties);
  makeElement('input', selectProperties, {'type':'checkbox', 'id':'restaurant', 'value':'checked'}, 'restaurant');
  selectProperties.appendChild(document.createTextNode('Italian Restaurant'));
  makeElement('br', selectProperties);
  makeElement('input', selectProperties, {'type':'checkbox', 'id':'apartment', 'value':'checked'}, 'apartment');
  selectProperties.appendChild(document.createTextNode('Apartment Complex'));
  makeElement('br', selectProperties);
  makeElement('input', selectProperties, {'type':'checkbox', 'id':'valu', 'value':'checked'}, 'valu');
  selectProperties.appendChild(document.createTextNode('Valu-Mart'));
  makeElement('br', selectProperties);
  makeElement('input', selectProperties, {'type':'checkbox', 'id':'tourist', 'value':'checked'}, 'tourist');
  selectProperties.appendChild(document.createTextNode('Marina Tourist Shops'));
  makeElement('br', selectProperties);
  makeElement('input', selectProperties, {'type':'checkbox', 'id':'office', 'value':'checked'}, 'office');
  selectProperties.appendChild(document.createTextNode('Office Building'));
  makeElement('br', selectProperties);
  makeElement('input', selectProperties, {'type':'checkbox', 'id':'hotel', 'value':'checked'}, 'hotel');
  selectProperties.appendChild(document.createTextNode('5-Star Hotel'));
  makeElement('br', selectProperties);
  makeElement('input', selectProperties, {'type':'checkbox', 'id':'casino', 'value':'checked'}, 'casino');
  selectProperties.appendChild(document.createTextNode('Mega Casino'));
  makeElement('br', selectProperties);
  makeElement('br', selectProperties);
  selectPropertiesNote = makeElement('span', selectProperties, {'style':'margin-left:21px'});
  selectPropertiesNote.appendChild(document.createTextNode('* Properties that cannot be robbed'));

  title = 'Never spend below this amount of cash';
  var buyMinAmount = makeElement('div', propertyTab, {'style':'top: 50px; right: 10px;'});
  buyMinAmount.appendChild(document.createTextNode('Minimum cash: '));
  makeElement('input', buyMinAmount, {'type':'text', 'style':'width: 80px;', 'title':title, 'value':GM_getValue('buyMinAmount', '0'), 'id':'buyMinAmount', 'size':'5'});

  var autoRepair = makeElement('div', propertyTab, {'style':'top: 100px; right: 10px;'});
  autoRepair.appendChild(document.createTextNode('Enable auto-repair property'));
  makeElement('input', autoRepair, {'type':'checkbox', 'id':'autoRepair', 'value':'checked'}, 'autoRepair');

  var autoProtect = makeElement('div', propertyTab, {'style':'top: 125px; right: 10px;'});
  autoProtect.appendChild(document.createTextNode('Enable auto-protect property'));
  makeElement('input', autoProtect, {'type':'checkbox', 'id':'autoProtect', 'value':'checked'}, 'autoProtect');

  var autoSellCrates = makeElement('div', propertyTab, {'style':'top: 150px; right: 10px;'});
  autoSellCrates.appendChild(document.createTextNode('Sell Cuban business output'));
  makeElement('input', autoSellCrates, {'type':'checkbox', 'id':'autoSellCrates', 'value':'checked'}, 'autoSellCrates');

  var autoSellCratesMoscow = makeElement('div', propertyTab, {'style':'top: 175px; right: 10px;'});
  autoSellCratesMoscow.appendChild(document.createTextNode('Sell Moscow business output'));
  makeElement('input', autoSellCratesMoscow, {'type':'checkbox', 'id':'autoSellCratesMoscow', 'value':'checked'}, 'autoSellCratesMoscow');

  var collectNYTake = makeElement('div', propertyTab, {'style':'top: 200px; right: 10px;'});
  collectNYTake.appendChild(document.createTextNode('Automatically collect NY take'));
  makeElement('input', collectNYTake, {'type':'checkbox', 'id':'collectNYTake', 'value':'checked'}, 'collectNYTake');

  var aboutTab = makeElement('div', settingsBox, {'id':'aboutTab', 'class':'tabcontent', 'style':'background-image:url(' + stripURI(aboutTabImage) + ')'});
    var versionInfo = makeElement('div', aboutTab, {'style':'top: 25px;font-size: 18px; font-weight: bold;'});
      versionInfo.appendChild(document.createTextNode('Version '+ SCRIPT.version));
      makeElement('br', versionInfo);
      versionInfo.appendChild(document.createTextNode('Build '+SCRIPT.build));

    var devs = makeElement('div', aboutTab, {'style':'top: 75px; left: 10px; font-size: 12px; font-weight: bold;'});
      devs.appendChild(document.createTextNode('Contributors:'));
      devList = makeElement('span', devs, {'style':'position: relative; left: 15px;'});
      makeElement('br', devList);
      devList.appendChild(document.createTextNode('StevenD'));
      makeElement('br', devList);
      devList.appendChild(document.createTextNode('CharlesD'));
      makeElement('br', devList);
      devList.appendChild(document.createTextNode('Eric Ortego'));
      makeElement('br', devList);
      devList.appendChild(document.createTextNode('Jeremy'));
      makeElement('br', devList);
      devList.appendChild(document.createTextNode('Liquidor'));
      makeElement('br', devList);
      devList.appendChild(document.createTextNode('AK17710N'));
      makeElement('br', devList);
      devList.appendChild(document.createTextNode('Fragger'));
      makeElement('br', devList);
      devList.appendChild(document.createTextNode('<x51>'));
      makeElement('br', devList);
      devList.appendChild(document.createTextNode('CyB'));
      makeElement('br', devList);
      devList.appendChild(document.createTextNode('int1'));
      makeElement('br', devList);
      devList.appendChild(document.createTextNode('Janos112'));
      makeElement('br', devList);
      devList.appendChild(document.createTextNode('int2str'));
      makeElement('br', devList);
      devList.appendChild(document.createTextNode('Doonce'));
      makeElement('br', devList);
      devList.appendChild(document.createTextNode('Eric Layne'));
      makeElement('br', devList);
      devList.appendChild(document.createTextNode('Tanlis'));
      makeElement('br', devList);
      devList.appendChild(document.createTextNode('Cam'));
      makeElement('br', devList);
      devList.appendChild(document.createTextNode('vmzildjian'));
      makeElement('br', devList);
      devList.appendChild(document.createTextNode('ChrisMSB'));
      makeElement('br', devList);
      devList.appendChild(document.createTextNode('Scrotal'));

  // Create save button
  var saveButton = makeElement('span', settingsBox, {'class':'sexy_button', 'style':'left: 10px; bottom: 10px;'});
  makeElement('button', saveButton).appendChild(document.createTextNode('Save Settings'));
  saveButton.addEventListener('click', saveSettings, false);

  // Create Help button
  var helpButton = makeElement('span', settingsBox, {'class':'sexy_button', 'style':'left: 260px; bottom: 10px;'});
  makeElement('button', helpButton).appendChild(document.createTextNode('Help'));
  helpButton.addEventListener('click', helpSettings, false);

  // Create Update button
  var updateButton = makeElement('span', settingsBox, {'class':'sexy_button', 'style':'right: 10px; bottom: 10px;'});
  makeElement('button', updateButton).appendChild(document.createTextNode('Check for Updates'));
  updateButton.addEventListener('click', updateScript, false);

  // FIXME: Is it necessary to recreate this stuff repeatedly? Or is it just
  //        a memory leak?
//Tab code from:http://www.dynamicdrive.com/dynamicindex17/tabcontent.htm converted into a data URI
  makeElement('script', document.getElementsByTagName('head')[0], {'type':'text/javascript', 'src':
    "data:application/x-javascript;base64,Ly8qKiBUYWIgQ29udGVudCBzY3JpcHQgdjIuMC0gqSBEeW5hbWljIERyaXZlIERIVE1MIGNvZGUgbGlicmFyeSAoaHR0cDovL3d3dy5keW5hbWljZHJpdmUuY29tKQ0KLy8qKiBVcGRhdGVkIE9jdCA3dGgsIDA3IHRvIHZlcnNpb24gMi4wLiBDb250YWlucyBudW1lcm91cyBpbXByb3ZlbWVudHM6DQovLyAgIC1BZGRlZCBBdXRvIE1vZGU6IFNjcmlwdCBhdXRvIHJvdGF0ZXMgdGhlIHRhYnMgYmFzZWQgb24gYW4gaW50ZXJ2YWwsIHVudGlsIGEgdGFiIGlzIGV4cGxpY2l0bHkgc2VsZWN0ZWQNCi8vICAgLUFiaWxpdHkgdG8gZXhwYW5kL2NvbnRyYWN0IGFyYml0cmFyeSBESVZzIG9uIHRoZSBwYWdlIGFzIHRoZSB0YWJiZWQgY29udGVudCBpcyBleHBhbmRlZC8gY29udHJhY3RlZA0KLy8gICAtQWJpbGl0eSB0byBkeW5hbWljYWxseSBzZWxlY3QgYSB0YWIgZWl0aGVyIGJhc2VkIG9uIGl0cyBwb3NpdGlvbiB3aXRoaW4gaXRzIHBlZXJzLCBvciBpdHMgSUQgYXR0cmlidXRlIChnaXZlIHRoZSB0YXJnZXQgdGFiIG9uZSAxc3QpDQovLyAgIC1BYmlsaXR5IHRvIHNldCB3aGVyZSB0aGUgQ1NTIGNsYXNzbmFtZSAic2VsZWN0ZWQiIGdldCBhc3NpZ25lZC0gZWl0aGVyIHRvIHRoZSB0YXJnZXQgdGFiJ3MgbGluayAoIkEiKSwgb3IgaXRzIHBhcmVudCBjb250YWluZXINCi8vKiogVXBkYXRlZCBGZWIgMTh0aCwgMDggdG8gdmVyc2lvbiAyLjE6IEFkZHMgYSAidGFiaW5zdGFuY2UuY3ljbGVpdChkaXIpIiBtZXRob2QgdG8gY3ljbGUgZm9yd2FyZCBvciBiYWNrd2FyZCBiZXR3ZWVuIHRhYnMgZHluYW1pY2FsbHkNCi8vKiogVXBkYXRlZCBBcHJpbCA4dGgsIDA4IHRvIHZlcnNpb24gMi4yOiBBZGRzIHN1cHBvcnQgZm9yIGV4cGFuZGluZyBhIHRhYiB1c2luZyBhIFVSTCBwYXJhbWV0ZXIgKGllOiBodHRwOi8vbXlzaXRlLmNvbS90YWJjb250ZW50Lmh0bT90YWJpbnRlcmZhY2VpZD0wKSANCg0KLy8vL05PIE5FRUQgVE8gRURJVCBCRUxPVy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KDQpmdW5jdGlvbiBkZHRhYmNvbnRlbnQodGFiaW50ZXJmYWNlaWQpew0KCXRoaXMudGFiaW50ZXJmYWNlaWQ9dGFiaW50ZXJmYWNlaWQgLy9JRCBvZiBUYWIgTWVudSBtYWluIGNvbnRhaW5lcg0KCXRoaXMudGFicz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0YWJpbnRlcmZhY2VpZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKSAvL0dldCBhbGwgdGFiIGxpbmtzIHdpdGhpbiBjb250YWluZXINCgl0aGlzLmVuYWJsZXRhYnBlcnNpc3RlbmNlPXRydWUNCgl0aGlzLmhvdHRhYnNwb3NpdGlvbnM9W10gLy9BcnJheSB0byBzdG9yZSBwb3NpdGlvbiBvZiB0YWJzIHRoYXQgaGF2ZSBhICJyZWwiIGF0dHIgZGVmaW5lZCwgcmVsYXRpdmUgdG8gYWxsIHRhYiBsaW5rcywgd2l0aGluIGNvbnRhaW5lcg0KCXRoaXMuY3VycmVudFRhYkluZGV4PTAgLy9JbmRleCBvZiBjdXJyZW50bHkgc2VsZWN0ZWQgaG90IHRhYiAodGFiIHdpdGggc3ViIGNvbnRlbnQpIHdpdGhpbiBob3R0YWJzcG9zaXRpb25zW10gYXJyYXkNCgl0aGlzLnN1YmNvbnRlbnRpZHM9W10gLy9BcnJheSB0byBzdG9yZSBpZHMgb2YgdGhlIHN1YiBjb250ZW50cyAoInJlbCIgYXR0ciB2YWx1ZXMpDQoJdGhpcy5yZXZjb250ZW50aWRzPVtdIC8vQXJyYXkgdG8gc3RvcmUgaWRzIG9mIGFyYml0cmFyeSBjb250ZW50cyB0byBleHBhbmQvY29udGFjdCBhcyB3ZWxsICgicmV2IiBhdHRyIHZhbHVlcykNCgl0aGlzLnNlbGVjdGVkQ2xhc3NUYXJnZXQ9ImxpbmsiIC8va2V5d29yZCB0byBpbmRpY2F0ZSB3aGljaCB0YXJnZXQgZWxlbWVudCB0byBhc3NpZ24gInNlbGVjdGVkIiBDU1MgY2xhc3MgKCJsaW5rcGFyZW50IiBvciAibGluayIpDQp9DQoNCmRkdGFiY29udGVudC5nZXRDb29raWU9ZnVuY3Rpb24oTmFtZSl7IA0KCXZhciByZT1uZXcgUmVnRXhwKE5hbWUrIj1bXjtdKyIsICJpIik7IC8vY29uc3RydWN0IFJFIHRvIHNlYXJjaCBmb3IgdGFyZ2V0IG5hbWUvdmFsdWUgcGFpcg0KCWlmIChkb2N1bWVudC5jb29raWUubWF0Y2gocmUpKSAvL2lmIGNvb2tpZSBmb3VuZA0KCQlyZXR1cm4gZG9jdW1lbnQuY29va2llLm1hdGNoKHJlKVswXS5zcGxpdCgiPSIpWzFdIC8vcmV0dXJuIGl0cyB2YWx1ZQ0KCXJldHVybiAiIg0KfQ0KDQpkZHRhYmNvbnRlbnQuc2V0Q29va2llPWZ1bmN0aW9uKG5hbWUsIHZhbHVlKXsNCglkb2N1bWVudC5jb29raWUgPSBuYW1lKyI9Iit2YWx1ZSsiO3BhdGg9LyIgLy9jb29raWUgdmFsdWUgaXMgZG9tYWluIHdpZGUgKHBhdGg9LykNCn0NCg0KZGR0YWJjb250ZW50LnByb3RvdHlwZT17DQoNCglleHBhbmRpdDpmdW5jdGlvbih0YWJpZF9vcl9wb3NpdGlvbil7IC8vUFVCTElDIGZ1bmN0aW9uIHRvIHNlbGVjdCBhIHRhYiBlaXRoZXIgYnkgaXRzIElEIG9yIHBvc2l0aW9uKGludCkgd2l0aGluIGl0cyBwZWVycw0KCQl0aGlzLmNhbmNlbGF1dG9ydW4oKSAvL3N0b3AgYXV0byBjeWNsaW5nIG9mIHRhYnMgKGlmIHJ1bm5pbmcpDQoJCXZhciB0YWJyZWY9IiINCgkJdHJ5ew0KCQkJaWYgKHR5cGVvZiB0YWJpZF9vcl9wb3NpdGlvbj09InN0cmluZyIgJiYgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGFiaWRfb3JfcG9zaXRpb24pLmdldEF0dHJpYnV0ZSgicmVsIikpIC8vaWYgc3BlY2lmaWVkIHRhYiBjb250YWlucyAicmVsIiBhdHRyDQoJCQkJdGFicmVmPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRhYmlkX29yX3Bvc2l0aW9uKQ0KCQkJZWxzZSBpZiAocGFyc2VJbnQodGFiaWRfb3JfcG9zaXRpb24pIT1OYU4gJiYgdGhpcy50YWJzW3RhYmlkX29yX3Bvc2l0aW9uXS5nZXRBdHRyaWJ1dGUoInJlbCIpKSAvL2lmIHNwZWNpZmllZCB0YWIgY29udGFpbnMgInJlbCIgYXR0cg0KCQkJCXRhYnJlZj10aGlzLnRhYnNbdGFiaWRfb3JfcG9zaXRpb25dDQoJCX0NCgkJY2F0Y2goZXJyKXthbGVydCgiSW52YWxpZCBUYWIgSUQgb3IgcG9zaXRpb24gZW50ZXJlZCEiKX0NCgkJaWYgKHRhYnJlZiE9IiIpIC8vaWYgYSB2YWxpZCB0YWIgaXMgZm91bmQgYmFzZWQgb24gZnVuY3Rpb24gcGFyYW1ldGVyDQoJCQl0aGlzLmV4cGFuZHRhYih0YWJyZWYpIC8vZXhwYW5kIHRoaXMgdGFiDQoJfSwNCg0KCWN5Y2xlaXQ6ZnVuY3Rpb24oZGlyLCBhdXRvcnVuKXsgLy9QVUJMSUMgZnVuY3Rpb24gdG8gbW92ZSBmb3dhcmQgb3IgYmFja3dhcmRzIHRocm91Z2ggZWFjaCBob3QgdGFiICh0YWJpbnN0YW5jZS5jeWNsZWl0KCdmb3dhcmQvYmFjaycpICkNCgkJaWYgKGRpcj09Im5leHQiKXsNCgkJCXZhciBjdXJyZW50VGFiSW5kZXg9KHRoaXMuY3VycmVudFRhYkluZGV4PHRoaXMuaG90dGFic3Bvc2l0aW9ucy5sZW5ndGgtMSk%2FIHRoaXMuY3VycmVudFRhYkluZGV4KzEgOiAwDQoJCX0NCgkJZWxzZSBpZiAoZGlyPT0icHJldiIpew0KCQkJdmFyIGN1cnJlbnRUYWJJbmRleD0odGhpcy5jdXJyZW50VGFiSW5kZXg%2BMCk%2FIHRoaXMuY3VycmVudFRhYkluZGV4LTEgOiB0aGlzLmhvdHRhYnNwb3NpdGlvbnMubGVuZ3RoLTENCgkJfQ0KCQlpZiAodHlwZW9mIGF1dG9ydW49PSJ1bmRlZmluZWQiKSAvL2lmIGN5Y2xlaXQoKSBpcyBiZWluZyBjYWxsZWQgYnkgdXNlciwgdmVyc3VzIGF1dG9ydW4oKSBmdW5jdGlvbg0KCQkJdGhpcy5jYW5jZWxhdXRvcnVuKCkgLy9zdG9wIGF1dG8gY3ljbGluZyBvZiB0YWJzIChpZiBydW5uaW5nKQ0KCQl0aGlzLmV4cGFuZHRhYih0aGlzLnRhYnNbdGhpcy5ob3R0YWJzcG9zaXRpb25zW2N1cnJlbnRUYWJJbmRleF1dKQ0KCX0sDQoNCglzZXRwZXJzaXN0OmZ1bmN0aW9uKGJvb2wpeyAvL1BVQkxJQyBmdW5jdGlvbiB0byB0b2dnbGUgcGVyc2lzdGVuY2UgZmVhdHVyZQ0KCQkJdGhpcy5lbmFibGV0YWJwZXJzaXN0ZW5jZT1ib29sDQoJfSwNCg0KCXNldHNlbGVjdGVkQ2xhc3NUYXJnZXQ6ZnVuY3Rpb24ob2Jqc3RyKXsgLy9QVUJMSUMgZnVuY3Rpb24gdG8gc2V0IHdoaWNoIHRhcmdldCBlbGVtZW50IHRvIGFzc2lnbiAic2VsZWN0ZWQiIENTUyBjbGFzcyAoImxpbmtwYXJlbnQiIG9yICJsaW5rIikNCgkJdGhpcy5zZWxlY3RlZENsYXNzVGFyZ2V0PW9ianN0ciB8fCAibGluayINCgl9LA0KDQoJZ2V0c2VsZWN0ZWRDbGFzc1RhcmdldDpmdW5jdGlvbih0YWJyZWYpeyAvL1JldHVybnMgdGFyZ2V0IGVsZW1lbnQgdG8gYXNzaWduICJzZWxlY3RlZCIgQ1NTIGNsYXNzIHRvDQoJCXJldHVybiAodGhpcy5zZWxlY3RlZENsYXNzVGFyZ2V0PT0oImxpbmtwYXJlbnQiLnRvTG93ZXJDYXNlKCkpKT8gdGFicmVmLnBhcmVudE5vZGUgOiB0YWJyZWYNCgl9LA0KDQoJdXJscGFyYW1zZWxlY3Q6ZnVuY3Rpb24odGFiaW50ZXJmYWNlaWQpew0KCQl2YXIgcmVzdWx0PXdpbmRvdy5sb2NhdGlvbi5zZWFyY2gubWF0Y2gobmV3IFJlZ0V4cCh0YWJpbnRlcmZhY2VpZCsiPShcXGQrKSIsICJpIikpIC8vY2hlY2sgZm9yICI%2FdGFiaW50ZXJmYWNlaWQ9MiIgaW4gVVJMDQoJCXJldHVybiAocmVzdWx0PT1udWxsKT8gbnVsbCA6IHBhcnNlSW50KFJlZ0V4cC4kMSkgLy9yZXR1cm5zIG51bGwgb3IgaW5kZXgsIHdoZXJlIGluZGV4IChpbnQpIGlzIHRoZSBzZWxlY3RlZCB0YWIncyBpbmRleA0KCX0sDQoNCglleHBhbmR0YWI6ZnVuY3Rpb24odGFicmVmKXsNCgkJdmFyIHN1YmNvbnRlbnRpZD10YWJyZWYuZ2V0QXR0cmlidXRlKCJyZWwiKSAvL0dldCBpZCBvZiBzdWJjb250ZW50IHRvIGV4cGFuZA0KCQkvL0dldCAicmV2IiBhdHRyIGFzIGEgc3RyaW5nIG9mIElEcyBpbiB0aGUgZm9ybWF0ICIsam9obixnZW9yZ2UsdHJleSxldGMsIiB0byBlYXNpbHkgc2VhcmNoIHRocm91Z2gNCgkJdmFyIGFzc29jaWF0ZWRyZXZpZHM9KHRhYnJlZi5nZXRBdHRyaWJ1dGUoInJldiIpKT8gIiwiK3RhYnJlZi5nZXRBdHRyaWJ1dGUoInJldiIpLnJlcGxhY2UoL1xzKy8sICIiKSsiLCIgOiAiIg0KCQl0aGlzLmV4cGFuZHN1YmNvbnRlbnQoc3ViY29udGVudGlkKQ0KCQl0aGlzLmV4cGFuZHJldmNvbnRlbnQoYXNzb2NpYXRlZHJldmlkcykNCgkJZm9yICh2YXIgaT0wOyBpPHRoaXMudGFicy5sZW5ndGg7IGkrKyl7IC8vTG9vcCB0aHJvdWdoIGFsbCB0YWJzLCBhbmQgYXNzaWduIG9ubHkgdGhlIHNlbGVjdGVkIHRhYiB0aGUgQ1NTIGNsYXNzICJzZWxlY3RlZCINCgkJCXRoaXMuZ2V0c2VsZWN0ZWRDbGFzc1RhcmdldCh0aGlzLnRhYnNbaV0pLmNsYXNzTmFtZT0odGhpcy50YWJzW2ldLmdldEF0dHJpYnV0ZSgicmVsIik9PXN1YmNvbnRlbnRpZCk%2FICJzZWxlY3RlZCIgOiAiIg0KCQl9DQoJCWlmICh0aGlzLmVuYWJsZXRhYnBlcnNpc3RlbmNlKSAvL2lmIHBlcnNpc3RlbmNlIGVuYWJsZWQsIHNhdmUgc2VsZWN0ZWQgdGFiIHBvc2l0aW9uKGludCkgcmVsYXRpdmUgdG8gaXRzIHBlZXJzDQoJCQlkZHRhYmNvbnRlbnQuc2V0Q29va2llKHRoaXMudGFiaW50ZXJmYWNlaWQsIHRhYnJlZi50YWJwb3NpdGlvbikNCgkJdGhpcy5zZXRjdXJyZW50dGFiaW5kZXgodGFicmVmLnRhYnBvc2l0aW9uKSAvL3JlbWVtYmVyIHBvc2l0aW9uIG9mIHNlbGVjdGVkIHRhYiB3aXRoaW4gaG90dGFic3Bvc2l0aW9uc1tdIGFycmF5DQoJfSwNCg0KCWV4cGFuZHN1YmNvbnRlbnQ6ZnVuY3Rpb24oc3ViY29udGVudGlkKXsNCgkJZm9yICh2YXIgaT0wOyBpPHRoaXMuc3ViY29udGVudGlkcy5sZW5ndGg7IGkrKyl7DQoJCQl2YXIgc3ViY29udGVudD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnN1YmNvbnRlbnRpZHNbaV0pIC8vY2FjaGUgY3VycmVudCBzdWJjb250ZW50IG9iaiAoaW4gZm9yIGxvb3ApDQoJCQlzdWJjb250ZW50LnN0eWxlLmRpc3BsYXk9KHN1YmNvbnRlbnQuaWQ9PXN1YmNvbnRlbnRpZCk%2FICJibG9jayIgOiAibm9uZSIgLy8ic2hvdyIgb3IgaGlkZSBzdWIgY29udGVudCBiYXNlZCBvbiBtYXRjaGluZyBpZCBhdHRyIHZhbHVlDQoJCX0NCgl9LA0KDQoJZXhwYW5kcmV2Y29udGVudDpmdW5jdGlvbihhc3NvY2lhdGVkcmV2aWRzKXsNCgkJdmFyIGFsbHJldmlkcz10aGlzLnJldmNvbnRlbnRpZHMNCgkJZm9yICh2YXIgaT0wOyBpPGFsbHJldmlkcy5sZW5ndGg7IGkrKyl7IC8vTG9vcCB0aHJvdWdoIHJldiBhdHRyaWJ1dGVzIGZvciBhbGwgdGFicyBpbiB0aGlzIHRhYiBpbnRlcmZhY2UNCgkJCS8vaWYgYW55IHZhbHVlcyBzdG9yZWQgd2l0aGluIGFzc29jaWF0ZWRyZXZpZHMgbWF0Y2hlcyBvbmUgd2l0aGluIGFsbHJldmlkcywgZXhwYW5kIHRoYXQgRElWLCBvdGhlcndpc2UsIGNvbnRyYWN0IGl0DQoJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZChhbGxyZXZpZHNbaV0pLnN0eWxlLmRpc3BsYXk9KGFzc29jaWF0ZWRyZXZpZHMuaW5kZXhPZigiLCIrYWxscmV2aWRzW2ldKyIsIikhPS0xKT8gImJsb2NrIiA6ICJub25lIg0KCQl9DQoJfSwNCg0KCXNldGN1cnJlbnR0YWJpbmRleDpmdW5jdGlvbih0YWJwb3NpdGlvbil7IC8vc3RvcmUgY3VycmVudCBwb3NpdGlvbiBvZiB0YWIgKHdpdGhpbiBob3R0YWJzcG9zaXRpb25zW10gYXJyYXkpDQoJCWZvciAodmFyIGk9MDsgaTx0aGlzLmhvdHRhYnNwb3NpdGlvbnMubGVuZ3RoOyBpKyspew0KCQkJaWYgKHRhYnBvc2l0aW9uPT10aGlzLmhvdHRhYnNwb3NpdGlvbnNbaV0pew0KCQkJCXRoaXMuY3VycmVudFRhYkluZGV4PWkNCgkJCQlicmVhaw0KCQkJfQ0KCQl9DQoJfSwNCg0KCWF1dG9ydW46ZnVuY3Rpb24oKXsgLy9mdW5jdGlvbiB0byBhdXRvIGN5Y2xlIHRocm91Z2ggYW5kIHNlbGVjdCB0YWJzIGJhc2VkIG9uIGEgc2V0IGludGVydmFsDQoJCXRoaXMuY3ljbGVpdCgnbmV4dCcsIHRydWUpDQoJfSwNCg0KCWNhbmNlbGF1dG9ydW46ZnVuY3Rpb24oKXsNCgkJaWYgKHR5cGVvZiB0aGlzLmF1dG9ydW50aW1lciE9InVuZGVmaW5lZCIpDQoJCQljbGVhckludGVydmFsKHRoaXMuYXV0b3J1bnRpbWVyKQ0KCX0sDQoNCglpbml0OmZ1bmN0aW9uKGF1dG9tb2RlcGVyaW9kKXsNCgkJdmFyIHBlcnNpc3RlZHRhYj1kZHRhYmNvbnRlbnQuZ2V0Q29va2llKHRoaXMudGFiaW50ZXJmYWNlaWQpIC8vZ2V0IHBvc2l0aW9uIG9mIHBlcnNpc3RlZCB0YWIgKGFwcGxpY2FibGUgaWYgcGVyc2lzdGVuY2UgaXMgZW5hYmxlZCkNCgkJdmFyIHNlbGVjdGVkdGFiPS0xIC8vQ3VycmVudGx5IHNlbGVjdGVkIHRhYiBpbmRleCAoLTEgbWVhbmluZyBub25lKQ0KCQl2YXIgc2VsZWN0ZWR0YWJmcm9tdXJsPXRoaXMudXJscGFyYW1zZWxlY3QodGhpcy50YWJpbnRlcmZhY2VpZCkgLy9yZXR1cm5zIG51bGwgb3IgaW5kZXggZnJvbTogdGFiY29udGVudC5odG0%2FdGFiaW50ZXJmYWNlaWQ9aW5kZXgNCgkJdGhpcy5hdXRvbW9kZXBlcmlvZD1hdXRvbW9kZXBlcmlvZCB8fCAwDQoJCWZvciAodmFyIGk9MDsgaTx0aGlzLnRhYnMubGVuZ3RoOyBpKyspew0KCQkJdGhpcy50YWJzW2ldLnRhYnBvc2l0aW9uPWkgLy9yZW1lbWJlciBwb3NpdGlvbiBvZiB0YWIgcmVsYXRpdmUgdG8gaXRzIHBlZXJzDQoJCQlpZiAodGhpcy50YWJzW2ldLmdldEF0dHJpYnV0ZSgicmVsIikpew0KCQkJCXZhciB0YWJpbnN0YW5jZT10aGlzDQoJCQkJdGhpcy5ob3R0YWJzcG9zaXRpb25zW3RoaXMuaG90dGFic3Bvc2l0aW9ucy5sZW5ndGhdPWkgLy9zdG9yZSBwb3NpdGlvbiBvZiAiaG90IiB0YWIgKCJyZWwiIGF0dHIgZGVmaW5lZCkgcmVsYXRpdmUgdG8gaXRzIHBlZXJzDQoJCQkJdGhpcy5zdWJjb250ZW50aWRzW3RoaXMuc3ViY29udGVudGlkcy5sZW5ndGhdPXRoaXMudGFic1tpXS5nZXRBdHRyaWJ1dGUoInJlbCIpIC8vc3RvcmUgaWQgb2Ygc3ViIGNvbnRlbnQgKCJyZWwiIGF0dHIgdmFsdWUpDQoJCQkJdGhpcy50YWJzW2ldLm9uY2xpY2s9ZnVuY3Rpb24oKXsNCgkJCQkJdGFiaW5zdGFuY2UuZXhwYW5kdGFiKHRoaXMpDQoJCQkJCXRhYmluc3RhbmNlLmNhbmNlbGF1dG9ydW4oKSAvL3N0b3AgYXV0byBjeWNsaW5nIG9mIHRhYnMgKGlmIHJ1bm5pbmcpDQoJCQkJCXJldHVybiBmYWxzZQ0KCQkJCX0NCgkJCQlpZiAodGhpcy50YWJzW2ldLmdldEF0dHJpYnV0ZSgicmV2IikpeyAvL2lmICJyZXYiIGF0dHIgZGVmaW5lZCwgc3RvcmUgZWFjaCB2YWx1ZSB3aXRoaW4gInJldiIgYXMgYW4gYXJyYXkgZWxlbWVudA0KCQkJCQl0aGlzLnJldmNvbnRlbnRpZHM9dGhpcy5yZXZjb250ZW50aWRzLmNvbmNhdCh0aGlzLnRhYnNbaV0uZ2V0QXR0cmlidXRlKCJyZXYiKS5zcGxpdCgvXHMqLFxzKi8pKQ0KCQkJCX0NCgkJCQlpZiAoc2VsZWN0ZWR0YWJmcm9tdXJsPT1pIHx8IHRoaXMuZW5hYmxldGFicGVyc2lzdGVuY2UgJiYgc2VsZWN0ZWR0YWI9PS0xICYmIHBhcnNlSW50KHBlcnNpc3RlZHRhYik9PWkgfHwgIXRoaXMuZW5hYmxldGFicGVyc2lzdGVuY2UgJiYgc2VsZWN0ZWR0YWI9PS0xICYmIHRoaXMuZ2V0c2VsZWN0ZWRDbGFzc1RhcmdldCh0aGlzLnRhYnNbaV0pLmNsYXNzTmFtZT09InNlbGVjdGVkIil7DQoJCQkJCXNlbGVjdGVkdGFiPWkgLy9TZWxlY3RlZCB0YWIgaW5kZXgsIGlmIGZvdW5kDQoJCQkJfQ0KCQkJfQ0KCQl9IC8vRU5EIGZvciBsb29wDQoJCWlmIChzZWxlY3RlZHRhYiE9LTEpIC8vaWYgYSB2YWxpZCBkZWZhdWx0IHNlbGVjdGVkIHRhYiBpbmRleCBpcyBmb3VuZA0KCQkJdGhpcy5leHBhbmR0YWIodGhpcy50YWJzW3NlbGVjdGVkdGFiXSkgLy9leHBhbmQgc2VsZWN0ZWQgdGFiIChlaXRoZXIgZnJvbSBVUkwgcGFyYW1ldGVyLCBwZXJzaXN0ZW50IGZlYXR1cmUsIG9yIGNsYXNzPSJzZWxlY3RlZCIgY2xhc3MpDQoJCWVsc2UgLy9pZiBubyB2YWxpZCBkZWZhdWx0IHNlbGVjdGVkIGluZGV4IGZvdW5kDQoJCQl0aGlzLmV4cGFuZHRhYih0aGlzLnRhYnNbdGhpcy5ob3R0YWJzcG9zaXRpb25zWzBdXSkgLy9KdXN0IHNlbGVjdCBmaXJzdCB0YWIgdGhhdCBjb250YWlucyBhICJyZWwiIGF0dHINCgkJaWYgKHBhcnNlSW50KHRoaXMuYXV0b21vZGVwZXJpb2QpPjUwMCAmJiB0aGlzLmhvdHRhYnNwb3NpdGlvbnMubGVuZ3RoPjEpew0KCQkJdGhpcy5hdXRvcnVudGltZXI9c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0YWJpbnN0YW5jZS5hdXRvcnVuKCl9LCB0aGlzLmF1dG9tb2RlcGVyaW9kKQ0KCQl9DQoJfSAvL0VORCBpbnQoKSBmdW5jdGlvbg0KDQp9IC8vRU5EIFByb3RvdHlwZSBhc3NpZ25tZW50"
  }).appendChild(document.createTextNode(
    '/***********************************************\n' +
    '* Tab Content script v2.2- © Dynamic Drive DHTML code library (www.dynamicdrive.com)\n' +
    '* This notice MUST stay intact for legal use\n' +
    '* Visit Dynamic Drive at http://www.dynamicdrive.com/ for full source code\n' +
    '***********************************************/\n'
  ));
  makeElement('script', document.getElementsByTagName('head')[0], {'type':'text/javascript'}).appendChild(document.createTextNode(
    'var tabs=new ddtabcontent("tabNav"); //enter ID of Tab Container\n' +
    'tabs.setpersist(true); //toogle persistence of the tabs\' state\n' +
    'tabs.setselectedClassTarget("linkparent"); //"link" or "linkparent"\n' +
    'tabs.init();'
  ));


  DEBUG('Menu created.');
}

function createMiscTab() {
  var elt, title, id, label;
  var miscTab = makeElement('div', null, {'id':'miscTab', 'class':'tabcontent', 'style':'background-image:url(' + stripURI(generalTabImage) + ')'});

  var autoStats = makeElement('div', miscTab, {'style':'text-align: right; top: 5px; right: 430px;'});
  makeElement('img', autoStats, {'src':stripURI(plussignIcon)});
  autoStats.appendChild(document.createTextNode('Enable auto-stat '));
  makeElement('input', autoStats, {'type':'checkbox','style':'vertical-align: middle', 'id':'autoStat', 'value':'checked'}, 'autoStat');

  title = 'Disable AutoStat when status goals are reached';
  id = 'autoStatDisable';
  var divStatDisable = makeElement('div', miscTab, {'style':'text-align: right; top: 7px; left: 200px; '});
  elt = makeElement('input', divStatDisable, {'type':'checkbox', 'style':'vertical-align: middle', 'id':id, 'title':title, 'style':'vertical-align: middle', 'value':'checked'}, 'autoStatDisable');
  label = makeElement('label', divStatDisable, {'for':id, 'title':title});
  label.appendChild(document.createTextNode(' Disable auto-stat when status goals are reached'));

  // Display Adjustments
  var xTop = 35;
  var yLeft = 10;

  var yLeftCur = yLeft + 10;
  var xTopCur = xTop;

  // Status Labels
  var yLeftCur = yLeft + 10;
  var xTopCur = xTop + 2;

  // Stat labels
  for (var i = 0, iLength=autoStatRatios.length; i < iLength; ++i ) {
    var div = makeElement('div', miscTab, {'style':'top:' + xTopCur + 'px; left:' + yLeftCur + 'px;'});
    div.appendChild(document.createTextNode(autoStatDescrips[i + 1]));

    xTopCur += 25;
  }

  // Status ratio
  var yLeftCur = yLeft + 75;
  var xTopCur = xTop;

  for (var i = 0, iLength=autoStatRatios.length; i < iLength; ++i ) {
    var title = 'Please set ratio of' + autoStatDescrips[i + 1] + ' stat';
    var id = autoStatRatios[i];
    var div = makeElement('div', miscTab, {'style':'top:' + xTopCur + 'px; left:' + yLeftCur + 'px;'});
    div.appendChild(document.createTextNode(' = '));
    makeElement('input', div, {'type':'text', 'style':'width: 40px;', 'value':GM_getValue(id, 0), 'id':id, 'size':'1'});
    div.appendChild(document.createTextNode(' x '));

    xTopCur += 25;
  }

  // Status Allocation Mode Settings
  var yLeftCur = yLeft + 150;
  var xTopCur = xTop;

  for (var i = 0, iLength=autoStatModes.length; i < iLength; ++i ) {
    var title = 'Please select where to base ' + autoStatDescrips[i + 1] + ' stat';
    var id = autoStatModes[i];
    var sel = makeElement('select', miscTab, {'id':id, 'title':title, 'style':'width:60px; top: ' + xTopCur + 'px; left: ' + yLeftCur + 'px;'});
    xTopCur += 25;
    for (var j = 0, jLength=autoStatDescrips.length; j < jLength; ++j) {
      var choice = document.createElement('option');
      choice.value = j;
      choice.appendChild(document.createTextNode(autoStatDescrips[j]));
      sel.appendChild(choice);
    }
    sel.selectedIndex = GM_getValue(autoStatModes[i], 0);
  }

  // Status base
  var yLeftCur = yLeft + 215;
  var xTopCur = xTop;

  for (var i = 0, iLength=autoStatBases.length; i < iLength; ++i ) {
    var id = autoStatBases[i];
    var div = makeElement('div', miscTab, {'style':'top:' + xTopCur + 'px; left:' + yLeftCur + 'px;'});
    div.appendChild(document.createTextNode(' + '));
    makeElement('input', div, {'type':'text', 'style':'width: 40px;', 'value':GM_getValue(id, 0), 'id':id, 'size':'1'});
    xTopCur += 25;
  }

  // Left-over points
  var yLeftCur = yLeft + 280;
  var xTopCur = xTop;

  for (var i = 0, iLength=autoStatFallbacks.length; i < iLength; ++i ) {
    var title = 'Check this to distribute points to ' + autoStatDescrips[i + 1] + ' when goals are reached';
    var id = autoStatFallbacks[i];
    var div = makeElement('div', miscTab, {'style':'top: ' + xTopCur + 'px; left:' + yLeftCur + 'px; '});
    makeElement('input', div, {'type':'checkbox', 'id':id, 'title':title, 'style':'vertical-align: middle', 'value':'checked'}, autoStatFallbacks[i]);
    var label = makeElement('label', div, {'for':id, 'title':title});
    label.appendChild(document.createTextNode(' Use ' + autoStatDescrips[i+1] + ' as fallback'));
    xTopCur += 25;
  }

  // Priority Settings
  title = 'Please select priority level for stat distribution';
  var yLeftCur = yLeft + 460;
  var xTopCur = xTop;

  for (var i = 0, iLength=autoStatPrios.length; i < iLength; ++i ) {
    var id = autoStatPrios[i];
    var sel = makeElement('select', miscTab, {'id':id, 'title':title,'style':' top: ' + xTopCur + 'px; left: ' + yLeftCur + 'px;'});
    xTopCur += 25;
    for (var j = 0, jLength=autoStatRatios.length; j < jLength; ++j) {
      var choice = document.createElement('option');
      choice.value = j;
      choice.appendChild(document.createTextNode('Priority ' + (j + 1)));
      sel.appendChild(choice);
    }
    sel.selectedIndex = GM_getValue(autoStatPrios[i], 0);
  }

  title = 'Check this to enable log-filtering';
  id = 'filterLog';
  var filterLog = makeElement('div', miscTab, {'style':'text-align: right; top: ' + (xTop + 155) + 'px; right: 430px;'});
  makeElement('img', filterLog, {'src':stripURI(goodIcon)});
  filterLog.appendChild(document.createTextNode('Enable log-filtering'));
  makeElement('input', filterLog, {'type':'checkbox','style':'vertical-align: middle', 'title':title, 'id':id, 'value':'checked'}, id);

  var filterPass = makeElement('div', miscTab, {'style':'text-align: left; top: ' + (xTop + 180) + 'px; left: 20px;'});
  var filterFail = makeElement('div', miscTab, {'style':'text-align: left; top: ' + (xTop + 275) + 'px; left: 20px;'});

  makeElement('label', filterPass, {'style':'font-size: small;'}).appendChild(document.createTextNode(' Patterns to accept:'));
  makeElement('br', filterPass);
  makeElement('textarea', filterPass, {'style':'position: static; width: 15em; height: 6em;', 'id':'logFilterPass', 'title':'Enter each pattern on a separate line.'}).appendChild(document.createTextNode(GM_getValue('logFilterPass', defaultLogPass.join('\n'))));

  makeElement('label', filterFail, {'style':'font-size: small;'}).appendChild(document.createTextNode(' Patterns to reject:'));
  makeElement('br', filterFail);
  makeElement('textarea', filterFail, {'style':'position: static; width: 15em; height: 6em;', 'id':'logFilterFail', 'title':'Enter each pattern on a separate line.'}).appendChild(document.createTextNode(GM_getValue('logFilterFail', defaultLogFail.join('\n'))));
  makeElement('br', filterFail);
  makeElement('font', filterFail, {'style':'font-size: small;'}).appendChild(document.createTextNode('Enter each pattern on a separate line.'));

  return miscTab;
}

function createEnergyTab() {
  var elt, title, id, label;
  var energyTab = makeElement('div', null, {'id':'energyTab', 'class':'tabcontent', 'style':'background-image:url(' + stripURI(energyTabImage) + ')'});

  // Container for a list of settings.
  var list = makeElement('div', energyTab, {'style':'position: relative; top: 10px; margin-left: auto; margin-right: auto; width: 95%; line-height:125%;'});

  // How to spend energy
  var item = makeElement('div', list);
  var lhs = makeElement('div', item, {'class':'lhs'});
  var rhs = makeElement('div', item, {'class':'rhs'});
  makeElement('br', item, {'class':'hide'});
  title = 'Spend energy automatically.';
  id = 'autoMission';
  makeElement('input', lhs, {'type':'checkbox', 'id':id, 'title':title, 'style':'vertical-align: middle', 'value':'checked'}, 'autoMission');
  label = makeElement('label', lhs, {'for':id, 'title':title});
  label.appendChild(document.createTextNode(' Spend energy to:'));
  title = ' Master jobs one at a time';
  id = 'masterAllJobs';
  label = makeElement('label', rhs, {'for':id, 'title':title});
  var masterAllJobs = makeElement('input', label, {'type':'radio', 'name':'r5', 'id':id, 'title':title, 'style':'vertical-align:middle', 'value':'checked'});
  masterAllJobs.defaultChecked = true;
  label.appendChild(document.createTextNode(title));
  makeElement('br', rhs);
  title = ' Perform any combination of jobs';
  id = 'multipleJobs';
  label = makeElement('label', rhs, {'for':id, 'title':title});
  var multipleJobs = makeElement('input', label, {'type':'radio', 'name':'r5', 'id':id, 'title':title, 'style':'vertical-align:middle', 'value':'checked'}, 'multipleJobs');
  label.appendChild(document.createTextNode(title + ' '));

  var boxType = 'radio';
  var multJob = false;
  if (GM_getValue('multipleJobs') == 'checked') {
    boxType = 'checkbox';
    multJob = true;
  }

  var unChkHandler = function () {
    var eltChoice;
    var eltChoiceImg;
    for (var i = 0, iLength=missions.length; i < iLength; ++i) {
      eltChoice = document.getElementById(missions[i][0]);
      eltChoiceImg = document.getElementById('img' + missions[i][0]);
      if (eltChoiceImg && eltChoice.checked) eltChoiceImg.src = stripURI(unCheckedIcon);
      if (eltChoice && eltChoice.checked) eltChoice.checked = false;
    }
  }

  var unChkAll = makeElement('input', label, {'id':'unCheckAll','style':'font-size: smaller; display : ' + (multJob ? '':'none'),'type':'button', 'value':'Uncheck All'});
  unChkAll.addEventListener('click', unChkHandler, false);

  //
  // Job selector.
  //
  var item = makeElement('div', list);
  var lhs = makeElement('div', item, {'class':'lhs'});
  var rhs = makeElement('div', item, {'class':'rhs'});
  makeElement('br', item, {'class':'hide'});
  title = '...set by handler...';
  id = 'selectMission';
  label = makeElement('label', lhs, {'for':id, 'title':title});
  label.appendChild(document.createTextNode('...set by handler...'));

  var selectMissionM = makeElement('div', rhs, {'id':id + 'M', 'title':title, style:'display : ' + (multJob ? '' : 'none') + '; overflow: auto; width: 300px; height: 150px; border:1px solid #999999; padding: 2px 2px 2px 2px'});
  var selectMissionS = makeElement('select', rhs, {'id':id + 'S', 'title':title, 'style':'display : ' + (multJob ? 'none' : '')});
  if (multJob) selectMissionM.setAttribute('multiple', 'multiple');
  var selectMissionLabel = label;

  // Create the rows of the list.
  var cityno = -1;
  var tabno = -1;
  var divChoice;
  var chkImg;
  var choiceM;
  var choiceS;
  var label;
  var energyBonus = 1 - (GM_getValue('selectEnergyBonus', 0) / 100);
  var expBonusMultiplier = 1 + (GM_getValue('selectExpBonus', 0) / 100);

  var chkHandler = function () {
    var eltId = this.getAttribute('chkId');
    var chkElt = document.getElementById(eltId);
    var chkImgElt = document.getElementById('img' + eltId);

    if (chkElt) {
      if(chkElt.checked) {
        chkElt.checked = '';
        chkImgElt.src=stripURI(unCheckedIcon);
      } else {
        chkElt.checked = 'checked';
        chkImgElt.src=stripURI(checkedIcon);
      }
    }
  }

  for (var i = 0, iLength=missions.length; i < iLength; ++i) {
    var mission = missions[i];
    if (mission[4] != cityno) {
      // Add a row for the city.
      cityno = mission[4];
      choiceM = makeElement('div');
      choiceM.innerHTML = '=== ' + cities[cityno].toUpperCase() + ' MISSIONS ===';
      choiceM.className = 'ap_optgroup1';
      selectMissionM.appendChild(choiceM);

      choiceS = document.createElement('optgroup');
      choiceS.label = '=== ' + cities[cityno].toUpperCase() + ' MISSIONS ===';
      choiceS.className = 'ap_optgroup1';
      selectMissionS.appendChild(choiceS);
    }
    if (mission[3] != tabno) {
      // Add a row for the tab.
      tabno = mission[3];
      choiceM = makeElement('div');
      choiceM.innerHTML = missionTabs[cityno][tabno - 1];
      choiceM.className = 'ap_optgroup2';
      selectMissionM.appendChild(choiceM);

      choiceS = document.createElement('optgroup');
      choiceS.label = missionTabs[cityno][tabno - 1];
      choiceS.className = 'ap_optgroup2';
      selectMissionS.appendChild(choiceS);
    }

    // Determine the job's experience-to-energy ratio.
    // FIXME: Should somehow combine with calcEnergyCost()
    var cost = mission[1];
    if (cost > 5) {
      cost = Math.floor(cost * energyBonus);
    }
    var reward = mission[5];
    if (GM_getValue('hasPrivateIsland') == 'checked') {
      reward = Math.round(reward * 1.05);
    }
    reward = Math.floor(reward * expBonusMultiplier);
    var ratio = Math.round(reward / cost * 100) / 100;

    // Add a row for the job.
    id = missions[i][0];
    title = mission[0] + ' (' + parseFloat(ratio) + ')';

    // Get the check state of the box
    var checkState = false;
    if (getSavedList('selectMissionMultiple').indexOf(String(i)) != -1) {
      checkState = true;
    }

    // Multiple job choices
    divChoice = makeElement('div', null, {'class':'ap_option', 'chkid':id});
    divChoice.addEventListener('click', chkHandler, false);
    makeElement('img', divChoice, {'style':'width: 15px; height: 15px;', 'id':'img' + id, 'src': checkState ? stripURI(checkedIcon) : stripURI(unCheckedIcon)});
    choiceM = makeElement('input', divChoice, {'type':boxType, 'id':id, 'title':title, 'style':'vertical-align: middle; display: none', 'value':'checked'});
    choiceM.checked = checkState;
    divChoice.appendChild(document.createTextNode(' ' + title));
    selectMissionM.appendChild(divChoice);

    // Single job choices
    var choiceS = document.createElement('option');
    choiceS.text = mission[0] + ' (' + parseFloat(ratio) + ')';
    selectMissionS.appendChild(choiceS);
  }
  selectMissionS.selectedIndex = GM_getValue('selectMission', 1);

  // Handler to change selection style (multiple vs. single)
  var handler = function() {
    if (multipleJobs.checked) {
      var labelText = 'Job selection:';
      var title = 'Select one or more jobs to perform. Jobs will be performed in an automatically optimized order.';
      selectMissionLabel.firstChild.nodeValue = labelText;
      selectMissionLabel.title = title;
      selectMissionM.title = title;
      //selectMissionM.setAttribute('multiple', 'multiple');
      selectMissionM.style.display = '';
      selectMissionS.style.display = 'none';
    } else {
      var labelText = 'Next job to master:';
      var title = 'Select the next job to master. Once mastered, another job will be picked automatically.';
      selectMissionLabel.firstChild.nodeValue = labelText;
      selectMissionLabel.title = title;
      selectMissionS.title = title;
      //selectMissionS.removeAttribute('multiple');
      selectMissionM.style.display = 'none';
      selectMissionS.style.display = '';
    }

    var unChkElt = document.getElementById('unCheckAll');
    if (unChkElt) unChkAll.style.display = multipleJobs.checked ? '' : 'none';
  }
  handler();

  masterAllJobs.addEventListener('change', handler, false);
  multipleJobs.addEventListener('change', handler, false);

  // Wait for full energy?
  var item = makeElement('div', list);
  var lhs = makeElement('div', item, {'class':'lhs'});
  var rhs = makeElement('div', item, {'class':'rhs'});
  makeElement('br', item, {'class':'hide'});
  title = 'Perform jobs only when energy is completely full.';
  id = 'waitForFull';
  makeElement('input', rhs, {'type':'checkbox', 'id':id, 'title':title, 'style':'vertical-align:middle', 'value':'checked'}, 'waitForFull');
  label = makeElement('label', rhs, {'for':id, 'title':title});
  label.appendChild(document.createTextNode(' Perform jobs only when energy is full'));

  // Spend energy packs?
  var item = makeElement('div', list);
  var lhs = makeElement('div', item, {'class':'lhs'});
  var rhs = makeElement('div', item, {'class':'rhs'});
  makeElement('br', item, {'class':'hide'});
  title = 'Spend energy packs if it will not waste any energy, as determined by the estimated job ratio setting and your stamina statistics.';
  id = 'autoEnergyPack';
  makeElement('input', rhs, {'type':'checkbox', 'id':id, 'title':title, 'style':'vertical-align:middle', 'value':'checked'}, 'autoEnergyPack');
  label = makeElement('label', rhs, {'for':id, 'title':title});
  label.appendChild(document.createTextNode(' Spend energy packs'));

  // Estimated xp-to-energy ratio for jobs.
  var item = makeElement('div', list);
  var lhs = makeElement('div', item, {'class':'lhs'});
  var rhs = makeElement('div', item, {'class':'rhs'});
  makeElement('br', item, {'class':'hide'});
  title = 'Estimate the average experience-to-energy ratio of the jobs you will be performing. For example, a job that paid 10 experience points and required 5 energy would have a ratio of 2. Enter 0 if you prefer to have energy packs fire regardless of waste.';
  id = 'estimateJobRatio';
  label = makeElement('label', lhs, {'for':id, 'title':title});
  label.appendChild(document.createTextNode('Estimated job ratio:'));
  makeElement('input', rhs, {'type':'text', 'id':id, 'title':title, 'maxlength':4, 'style':'width: 30px; border: 1px solid #781351', 'value':GM_getValue('estimateJobRatio', '1'), 'size':'1'});

  // Periodically send energy packs?
  var item = makeElement('div', list);
  var lhs = makeElement('div', item, {'class':'lhs'});
  var rhs = makeElement('div', item, {'class':'rhs'});
  makeElement('br', item, {'class':'hide'});
  title = 'Periodically send energy packs to your fellow mafia members.';
  id = 'sendEnergyPack';
  makeElement('input', rhs, {'type':'checkbox', 'id':id, 'title':title, 'style':'vertical-align: middle', 'value':'checked'}, 'sendEnergyPack');
  label = makeElement('label', rhs, {'for':id, 'title':title});
  label.appendChild(document.createTextNode(' Send energy packs to my mafia'));

  // Horizontal line
  //var item = makeElement('div', list);
  //makeElement('hr', item, {'style':'width: 100%'});

  // Maniac character type?
  var item = makeElement('div', list);
  var lhs = makeElement('div', item, {'class':'lhs'});
  var rhs = makeElement('div', item, {'class':'rhs'});
  makeElement('br', item, {'class':'hide'});
  title = 'Check this box if your character type is Maniac (as opposed to Fearless or Mogul).';
  id = 'isManiac';
  makeElement('input', rhs, {'type':'checkbox', 'id':id, 'title':title, 'style':'vertical-align:middle', 'value':'checked'}, 'isManiac', 'checked');
  label = makeElement('label', rhs, {'for':id, 'title':title});
  label.appendChild(document.createTextNode(' Character type is Maniac'));

  // Mastery items owned.
  var item = makeElement('div', list);
  var lhs = makeElement('div', item, {'class':'lhs'});
  var rhs = makeElement('div', item, {'class':'rhs'});
  makeElement('br', item, {'class':'hide'});
  title = 'Check the mastery items you already own.',
  label = makeElement('label', lhs, {'title':title});
  label.appendChild(document.createTextNode('Job mastery items owned:'));
  title = 'Check this if you were awarded the Helicopter for mastering all Consigliere jobs.';
  id = 'hasHelicopter';
  makeElement('input', rhs, {'type':'checkbox', 'id':id, 'title':title, 'style':'vertical-align:middle', 'value':'checked'}, 'hasHelicopter');
  label = makeElement('label', rhs, {'for':id, 'title':title});
  label.appendChild(document.createTextNode(' Helicopter  '));
  title = 'Check this if you were awarded the Private Island for mastering all Underboss jobs.';
  id = 'hasPrivateIsland';
  makeElement('input', rhs, {'type':'checkbox', 'id':id, 'title':title, 'style':'vertical-align:middle', 'value':'checked'}, 'hasPrivateIsland');
  label = makeElement('label', rhs, {'for':id, 'title':title});
  label.appendChild(document.createTextNode(' Private Island  '));
  title = 'Check this if you were awarded the Golden Throne for mastering all Boss jobs.';
  id = 'hasGoldenThrone';
  makeElement('input', rhs, {'type':'checkbox', 'id':id, 'title':title, 'style':'vertical-align:middle', 'value':'checked'}, 'hasGoldenThrone');
  label = makeElement('label', rhs, {'for':id, 'title':title});
  label.appendChild(document.createTextNode(' Golden Throne'));

  return energyTab;
}

function createStaminaTab() {
  var elt, title, id, label;
  var staminaTab = makeElement('div', null, {'id':'staminaTab', 'class':'tabcontent', 'style':'background-image:url(' + stripURI(staminaTabImage) + ')'});

  // Container for a list of settings.
  var list = makeElement('div', staminaTab, {'style':'position: relative; top: 10px; margin-left: auto; margin-right: auto; width: 95%; line-height:125%;'});

  //
  // How to spend stamina (fight/rob/hitlist).
  //
  var item = makeElement('div', list);
  var lhs = makeElement('div', item, {'class':'lhs'});
  var rhs = makeElement('div', item, {'class':'rhs'});
  makeElement('br', item, {'class':'hide'});

  title = 'Spend stamina automatically.';
  id = 'staminaSpend';
  makeElement('input', lhs, {'type':'checkbox', 'id':id, 'title':title, 'style':'vertical-align: middle', 'value':'checked'}, 'staminaSpend');
  label = makeElement('label', lhs, {'for':id, 'title':title});
  label.appendChild(document.createTextNode(' Spend stamina to:'));

  id = 'staminaSpendHow';
  var staminaSpendHow = makeElement('select', rhs, {'id':id});
  for (var i = 0, iLength=staminaSpendChoices.length; i < iLength; ++i) {
    var choice = document.createElement('option');
    choice.value = i;
    choice.appendChild(document.createTextNode(staminaSpendChoices[i]));
    staminaSpendHow.appendChild(choice);
  }

  // Bordered container for varying settings content.
  var staminaTabSub = makeElement('div', list, {'id':'staminaTabSub', 'style':'position: static; border: 1px inset #FFD927; margin-left: auto; margin-right: auto; margin-top: 5px; margin-bottom: 5px;'});

  // Spend stamina percentage
  var item = makeElement('div', list, {'class':'single'});
  title = 'Start spending stamina when stamina percentage is reached';
  id = 'selectStaminaUse';
  item.appendChild(document.createTextNode('Start spending stamina when '));
  var elt = makeElement('select', item, {'id':id, 'title':title});
  for (i = 100; i >= 0; i -= 10) {
    var choice = document.createElement('option');
    choice.value = i;
    choice.appendChild(document.createTextNode(i + '%'));
    elt.appendChild(choice);
  }
  if (GM_getValue(id, 'NotSet') == 'NotSet' ||
      GM_getValue(id, 0) > elt.length - 1) {
    GM_setValue(id, elt.length - 1);
  }
  elt.selectedIndex = GM_getValue(id, 0);
  item.appendChild(document.createTextNode(' of stamina is accumulated.'));

  // Stamina to reserve for manual play.
  var item = makeElement('div', list, {'class':'single'});
  title = 'Suspend automatic play below this level of stamina.';
  id = 'selectStaminaKeep';
  item.appendChild(document.createTextNode('Reserve '));
  var elt = makeElement('select', item, {'id':id, 'title':title});
  for (i = 100; i >= 0; i -= 10) {
    var choice = document.createElement('option');
    choice.value = i;
    choice.appendChild(document.createTextNode(i + '%'));
    elt.appendChild(choice);
  }
  if (GM_getValue('selectStaminaKeep', 'NotSet') == 'NotSet' ||
      GM_getValue('selectStaminaKeep', 0) > elt.length - 1) {
    GM_setValue('selectStaminaKeep', elt.length - 1);
  }
  elt.selectedIndex = GM_getValue('selectStaminaKeep', 0);
  item.appendChild(document.createTextNode(' of stamina for manual play.'));

  // Level up
  var item = makeElement('div', list, {'class':'single'});
  title = 'Ignore minimum stamina settings if a level up is within reach.';
  id = 'allowStaminaToLevelUp';
  makeElement('input', item, {'type':'checkbox', 'id':id, 'title':title, 'style':'vertical-align: middle', 'value':'checked'}, 'allowStaminaToLevelUp');
  label = makeElement('label', item, {'for':id, 'title':title});
  label.appendChild(document.createTextNode(' Don\'t reserve stamina if within reach of the next level.'));

  //
  // Settings for random fighting
  //

  // Container for a list of settings.
  var list = makeElement('div', staminaTabSub, {'id':'fightRandomSub', 'style':'position: static; margin-left: auto; margin-right: auto; width: 100%; line-height:125%; display: none;'});

  // Location setting
  var item = makeElement('div', list);
  var lhs = makeElement('div', item, {'class':'lhs'});
  var rhs = makeElement('div', item, {'class':'rhs'});
  makeElement('br', item, {'class':'hide'});
  lhs.appendChild(document.createTextNode('Fight in:'));
  id = 'fightRandomLoc';
  var fightRandomLoc = makeElement('select', rhs, {'id':id});
  for (var i = 0, iLength=cities.length; i < iLength; ++i) {
    var choice = document.createElement('option');
    choice.value = i;
    choice.appendChild(document.createTextNode(cities[i]));
    fightRandomLoc.appendChild(choice);
  }
  fightRandomLoc.selectedIndex = GM_getValue('fightLocation', NY);

  // Maximum level.
  var item = makeElement('div', list);
  var lhs = makeElement('div', item, {'class':'lhs'});
  var rhs = makeElement('div', item, {'class':'rhs'});
  makeElement('br', item, {'class':'hide'});
  title = 'Avoid opponents higher than this level.';
  id = 'fightLevelMax';
  label = makeElement('label', lhs, {'for':id, 'title':title});
  label.appendChild(document.createTextNode('Maximum level:'));
  makeElement('input', rhs, {'type':'text', 'id':id, 'title':title, 'maxlength':5, 'style':'width: 30px; border: 1px solid #781351', 'value':GM_getValue('fightLevelMax', '100'), 'size':'1'});

  // Maximum level relative?
  title = 'Make the maximum level be relative to your own. For example, if your level is 10, and maximum level is set to 5, opponents higher than level 15 will be avoided.';
  id = 'fightLevelMaxRelative';
  makeElement('input', rhs, {'type':'checkbox', 'id':id, 'title':title, 'style':'vertical-align: middle; margin-left: 0.5em;', 'value':'checked'}, 'fightLevelMaxRelative');
  label = makeElement('label', rhs, {'for':id, 'title':title});
  label.appendChild(document.createTextNode(' Add my level'));

  // Maximum mafia size.
  var item = makeElement('div', list);
  var lhs = makeElement('div', item, {'class':'lhs'});
  var rhs = makeElement('div', item, {'class':'rhs'});
  makeElement('br', item, {'class':'hide'});
  id = 'fightMafiaMax';
  title = 'Avoid opponents with mafia sizes larger than this.',
  label = makeElement('label', lhs, {'for':id, 'title':title});
  label.appendChild(document.createTextNode('Maximum mafia:'));
  makeElement('input', rhs, {'type':'text', 'id':id, 'title':title, 'style':'width: 30px; border: 1px solid #781351', 'value':GM_getValue('fightMafiaMax', '501'), 'size':'1'});

  // Maximum mafia relative?
  title = 'Make the maximum mafia size be relative to your own. For example, if you have 300 mafia members, and maximum mafia is set to 50, opponents with more than 350 mafia members will be avoided.';
  id = 'fightMafiaMaxRelative';
  makeElement('input', rhs, {'type':'checkbox', 'id':id, 'title':title, 'style':'vertical-align: middle; margin-left: 0.5em;', 'value':'checked'}, 'fightMafiaMaxRelative');
  label = makeElement('label', rhs, {'for':id, 'title':title});
  label.appendChild(document.createTextNode(' Add my mafia size'));

  // Minimum mafia size.
  var item = makeElement('div', list);
  var lhs = makeElement('div', item, {'class':'lhs'});
  var rhs = makeElement('div', item, {'class':'rhs'});
  makeElement('br', item, {'class':'hide'});
  id = 'fightMafiaMin';
  title = 'Avoid opponents with mafia sizes smaller than this.',
  label = makeElement('label', lhs, {'for':id, 'title':title});
  label.appendChild(document.createTextNode('Minimum mafia:'));
  makeElement('input', rhs, {'type':'text', 'id':id, 'title':title, 'style':'width: 30px; border: 1px solid #781351', 'value':GM_getValue('fightMafiaMin', '1'), 'size':'1'});

  // Maximum mafia relative?
  title = 'Make the minimum mafia size be relative to your own. For example, if you have 300 mafia members, and minimum mafia is set to 50, opponents with less than 250 mafia members will be avoided.';
  id = 'fightMafiaMinRelative';
  makeElement('input', rhs, {'type':'checkbox', 'id':id, 'title':title, 'style':'vertical-align: middle; margin-left: 0.5em;', 'value':'checked'}, 'fightMafiaMinRelative');
  label = makeElement('label', rhs, {'for':id, 'title':title});
  label.appendChild(document.createTextNode(' Subtract from my mafia size'));

  // Use stealth fighting?
  var item = makeElement('div', list);
  var lhs = makeElement('div', item, {'class':'lhs'});
  var rhs = makeElement('div', item, {'class':'rhs'});
  makeElement('br', item, {'class':'hide'});
  title = 'Prefer opponents who won\'t be notified of your attacks.';
  id = 'fightStealth';
  makeElement('input', rhs, {'type':'checkbox', 'id':id, 'title':title, 'style':'vertical-align:middle', 'value':'checked'}, 'fightStealth', 'checked');
  label = makeElement('label', rhs, {'for':id, 'title':title});
  label.appendChild(document.createTextNode(' Use fight stealth'));

  // Avoid Top Mafia bodyguards?
  var item = makeElement('div', list);
  var lhs = makeElement('div', item, {'class':'lhs'});
  var rhs = makeElement('div', item, {'class':'rhs'});
  makeElement('br', item, {'class':'hide'});
  title = 'Avoid opponents known to be Top Mafia bodyguards. This may ' +
          'decrease the frequency of losses due to critical hits.';
  id = 'fightAvoidBodyguards';
  makeElement('input', rhs, {'type':'checkbox', 'id':id, 'title':title, 'style':'vertical-align:middle', 'value':'checked'}, 'fightAvoidBodyguards', 'checked');
  label = makeElement('label', rhs, {'for':id, 'title':title});
  label.appendChild(document.createTextNode(' Avoid Top Mafia bodyguards'));

  // Family names
  var item = makeElement('div', list);
  var lhs = makeElement('div', item, {'class':'lhs'});
  var rhs = makeElement('div', item, {'class':'rhs'});
  makeElement('br', item, {'class':'hide'});
  title = 'Avoid random opponents whose names contain specific patterns.';
  id = 'fightAvoidNames';
  makeElement('input', lhs, {'type':'checkbox', 'id':id, 'title':title, 'style':'vertical-align:middle', 'value':'checked'}, 'fightAvoidNames', 0);
  label = makeElement('label', lhs, {'for':id, 'title':title});
  label.appendChild(document.createTextNode(' Avoid mafia families:'));
  makeElement('textarea', rhs, {'style':'position: static; width: 15em; height: 8em;', 'id':'fightClanName', 'title':'Enter each pattern (such as a clan name) on a separate line.'}).appendChild(document.createTextNode(GM_getValue('clanName', defaultClans.join('\n'))));;
  makeElement('br', rhs);
  makeElement('font', rhs, {'style':'font-size: small;'}).appendChild(document.createTextNode('Enter each name pattern on a separate line.'));
  // End of options specific to random fighting


  //
  // Settings for list fighting
  //

  // Container for a list of settings.
  var list = makeElement('div', staminaTabSub, {'id':'fightListSub', 'style':'position: static; margin-left: auto; margin-right: auto; width: 100%; line-height:125%; display: none'});

  // Location setting
  var item = makeElement('div', list);
  var lhs = makeElement('div', item, {'class':'lhs'});
  var rhs = makeElement('div', item, {'class':'rhs'});
  makeElement('br', item, {'class':'hide'});
  lhs.appendChild(document.createTextNode('Fight in:'));
  id = 'fightListLoc';
  var fightListLoc = makeElement('select', rhs, {'id':id});
  for (var i = 0, iLength=cities.length; i < iLength; ++i) {
    var choice = document.createElement('option');
    choice.value = i;
    choice.appendChild(document.createTextNode(cities[i]));
    fightListLoc.appendChild(choice);
  }
  fightListLoc.selectedIndex = GM_getValue('fightLocation', NY);

  // Opponent list
  var item = makeElement('div', list);
  var lhs = makeElement('div', item, {'class':'lhs'});
  var rhs = makeElement('div', item, {'class':'rhs'});
  makeElement('br', item, {'class':'hide'});
  lhs.appendChild(document.createTextNode('Fight these opponents:'));
  makeElement('textarea', rhs, {'style':'position: static; width: 180px; height: 105px;', 'id':'fightList', 'title':'Enter each opponent\'s ID (not their name) on a separate line.'}).appendChild(document.createTextNode(GM_getValue('fightList', '')));
  makeElement('br', rhs);
  makeElement('font', rhs, {'style':'font-size: small;'}).appendChild(document.createTextNode('Enter each Facebook ID on a separate line.'));

  // Remove stronger opponents?
  var item = makeElement('div', list);
  var lhs = makeElement('div', item, {'class':'lhs'});
  var rhs = makeElement('div', item, {'class':'rhs'});
  makeElement('br', item, {'class':'hide'});
  title = 'Remove stronger opponents from the list automatically.';
  id = 'fightRemoveStronger';
  makeElement('input', rhs, {'type':'checkbox', 'id':id, 'title':title, 'style':'vertical-align:middle', 'value':'checked'}, 'fightRemoveStronger', 'checked');
  label = makeElement('label', rhs, {'for':id, 'title':title});
  label.appendChild(document.createTextNode(' Remove stronger opponents'));

  // End of options specific to list fighting


  //
  // Settings for random robbing
  //

  // Container for a list of settings.
  var list = makeElement('div', staminaTabSub, {'id':'robRandomSub', 'style':'position: static; margin-left: auto; margin-right: auto; width: 100%; line-height:125%; display: none'});

  // Maximum level.
  var item = makeElement('div', list);
  var lhs = makeElement('div', item, {'class':'lhs'});
  var rhs = makeElement('div', item, {'class':'rhs'});
  makeElement('br', item, {'class':'hide'});
  title = 'Don\'t rob opponents higher than this level.';
  id = 'robLevelMax';
  label = makeElement('label', lhs, {'for':id, 'title':title});
  label.appendChild(document.createTextNode('Maximum level:'));
  makeElement('input', rhs, {'type':'text', 'id':id, 'title':title, 'maxlength':5, 'style':'width: 30px; border: 1px solid #781351', 'value':GM_getValue('robLevelMax', '100'), 'size':'1'});

  // Maximum level relative?
  title = 'Make the maximum level be relative to your own. For example, if your level is 10, and maximum level is set to 5, opponents higher than level 15 will be avoided.';
  id = 'robLevelMaxRelative';
  makeElement('input', rhs, {'type':'checkbox', 'id':id, 'title':title, 'style':'vertical-align: middle; margin-left: 0.5em;', 'value':'checked'}, 'robLevelMaxRelative');
  label = makeElement('label', rhs, {'for':id, 'title':title});
  label.appendChild(document.createTextNode(' Add my level'));

  // Maximum mafia size.
  var item = makeElement('div', list);
  var lhs = makeElement('div', item, {'class':'lhs'});
  var rhs = makeElement('div', item, {'class':'rhs'});
  makeElement('br', item, {'class':'hide'});
  id = 'robMafiaMax';
  title = 'Don\'t rob opponents with mafia sizes larger than this.',
  label = makeElement('label', lhs, {'for':id, 'title':title});
  label.appendChild(document.createTextNode('Maximum mafia:'));
  makeElement('input', rhs, {'type':'text', 'id':id, 'title':title, 'style':'width: 30px; border: 1px solid #781351', 'value':GM_getValue('robMafiaMax', '501'), 'size':'1'});

  // Maximum mafia relative?
  title = 'Make the maximum mafia size be relative to your own. For example, if you have 300 mafia members, and maximum mafia is set to 50, opponents with more than 350 mafia members will be avoided. However, if your mafia size is larger than your level, the limit is set relative to your level instead.';
  id = 'robMafiaMaxRelative';
  makeElement('input', rhs, {'type':'checkbox', 'id':id, 'title':title, 'style':'vertical-align: middle; margin-left: 0.5em;', 'value':'checked'}, 'robMafiaMaxRelative');
  label = makeElement('label', rhs, {'for':id, 'title':title});
  label.appendChild(document.createTextNode(' Add my mafia size'));

  // Minimum mafia size.
  var item = makeElement('div', list);
  var lhs = makeElement('div', item, {'class':'lhs'});
  var rhs = makeElement('div', item, {'class':'rhs'});
  makeElement('br', item, {'class':'hide'});
  id = 'robMafiaMin';
  title = 'Avoid opponents with mafia sizes smaller than this.',
  label = makeElement('label', lhs, {'for':id, 'title':title});
  label.appendChild(document.createTextNode('Minimum mafia:'));
  makeElement('input', rhs, {'type':'text', 'id':id, 'title':title, 'style':'width: 30px; border: 1px solid #781351', 'value':GM_getValue('robMafiaMin', '1'), 'size':'1'});

  // Maximum mafia relative?
  title = 'Make the minimum mafia size be relative to your own. For example, if you have 300 mafia members, and minimum mafia is set to 50, opponents with less than 250 mafia members will be avoided. However, if your mafia size is larger than your level, the limit is set relative to your level instead.';
  id = 'robMafiaMinRelative';
  makeElement('input', rhs, {'type':'checkbox', 'id':id, 'title':title, 'style':'vertical-align: middle; margin-left: 0.5em;', 'value':'checked'}, 'robMafiaMinRelative');
  label = makeElement('label', rhs, {'for':id, 'title':title});
  label.appendChild(document.createTextNode(' Subtract from my mafia size'));

  // Family names
  var item = makeElement('div', list);
  var lhs = makeElement('div', item, {'class':'lhs'});
  var rhs = makeElement('div', item, {'class':'rhs'});
  makeElement('br', item, {'class':'hide'});
  title = 'Avoid random opponents whose names contain specific patterns.';
  id = 'robAvoidNames';
  makeElement('input', lhs, {'type':'checkbox', 'id':id, 'title':title, 'style':'vertical-align:middle', 'value':'checked'}, 'robAvoidNames', 0);
  label = makeElement('label', lhs, {'for':id, 'title':title});
  label.appendChild(document.createTextNode(' Avoid mafia families:'));
  makeElement('textarea', rhs, {'style':'position: static; width: 15em; height: 8em;', 'id':'robClanName', 'title':'Enter each pattern (such as a clan name) on a separate line.'}).appendChild(document.createTextNode(GM_getValue('clanName', defaultClans.join('\n'))));;
  makeElement('br', rhs);
  makeElement('font', rhs, {'style':'font-size: small;'}).appendChild(document.createTextNode('Enter each name pattern on a separate line.'));
  // End of options specific to random robbing


  //
  // Settings for list robbing
  //

  // Container for a list of settings.
  var list = makeElement('div', staminaTabSub, {'id':'robListSub', 'style':'position: static; margin-left: auto; margin-right: auto; width: 100%; line-height:125%; display: none'});

  // Opponent list
  var item = makeElement('div', list);
  var lhs = makeElement('div', item, {'class':'lhs'});
  var rhs = makeElement('div', item, {'class':'rhs'});
  makeElement('br', item, {'class':'hide'});
  lhs.appendChild(document.createTextNode('Rob these opponents:'));
  makeElement('textarea', rhs, {'style':'position: static; width: 180px; height: 105px;', 'id':'robList', 'title':'Enter each opponent\'s ID (not their name) on a separate line.'}).appendChild(document.createTextNode(GM_getValue('robList', '')));
  makeElement('br', rhs);
  makeElement('font', rhs, {'style':'font-size: small;'}).appendChild(document.createTextNode('Enter each Facebook ID on a separate line.'));

  // Remove stronger opponents?
  var item = makeElement('div', list);
  var lhs = makeElement('div', item, {'class':'lhs'});
  var rhs = makeElement('div', item, {'class':'rhs'});
  makeElement('br', item, {'class':'hide'});
  title = 'Remove stronger opponents from the list automatically.';
  id = 'robRemoveStronger';
  makeElement('input', rhs, {'type':'checkbox', 'id':id, 'title':title, 'style':'vertical-align:middle', 'value':'checked'}, 'robRemoveStronger', 'checked');
  label = makeElement('label', rhs, {'for':id, 'title':title});
  label.appendChild(document.createTextNode(' Remove stronger opponents'));
  // End of options specific to list robbing


  //
  // Settings for hitman
  //

  // Container for a list of settings.
  var list = makeElement('div', staminaTabSub, {'id':'hitmanSub', 'style':'position: static; margin-left: auto; margin-right: auto; width: 100%; line-height:125%; display: none'});

  // Location setting
  var item = makeElement('div', list);
  var lhs = makeElement('div', item, {'class':'lhs'});
  var rhs = makeElement('div', item, {'class':'rhs'});
  makeElement('br', item, {'class':'hide'});
  lhs.appendChild(document.createTextNode('Collect bounties in:'));
  id = 'hitmanLoc';
  var hitmanLoc = makeElement('select', rhs, {'id':id});
  for (var i = 0, iLength=cities.length; i < iLength; ++i) {
    var choice = document.createElement('option');
    choice.value = i;
    choice.appendChild(document.createTextNode(cities[i]));
    hitmanLoc.appendChild(choice);
  }
  hitmanLoc.selectedIndex = GM_getValue('hitmanLocation', NY);

  // Minimum bounty
  var item = makeElement('div', list);
  var lhs = makeElement('div', item, {'class':'lhs'});
  var rhs = makeElement('div', item, {'class':'rhs'});
  makeElement('br', item, {'class':'hide'});
  id = 'hitmanBountyMin';
  title = 'Ignore targets with bounties below this measly amount.',
  label = makeElement('label', lhs, {'for':id, 'title':title});
  label.appendChild(document.createTextNode('Minimum bounty:'));
  makeElement('input', rhs, {'type':'text', 'id':id, 'title':title, 'style':'width: 7em; border: 1px solid #781351', 'value':GM_getValue('hitmanBountyMin', '0')});

  // Bounty selection
  var item = makeElement('div', list);
  var lhs = makeElement('div', item, {'class':'lhs'});
  var rhs = makeElement('div', item, {'class':'rhs'});
  makeElement('br', item, {'class':'hide'});
  lhs.appendChild(document.createTextNode('Prefer targets with:'));
  id = 'bountySelection';
  var bountySelection = makeElement('select', rhs, {'id':id});
  for (var i = 0, iLength=bountySelectionChoices.length; i < iLength; ++i) {
    var choice = document.createElement('option');
    choice.value = i;
    choice.appendChild(document.createTextNode(bountySelectionChoices[i]));
    bountySelection.appendChild(choice);
  }
  bountySelection.selectedIndex = GM_getValue('bountySelection', BOUNTY_HIGHEST_BOUNTY);

  // Family names
  var item = makeElement('div', list);
  var lhs = makeElement('div', item, {'class':'lhs'});
  var rhs = makeElement('div', item, {'class':'rhs'});
  makeElement('br', item, {'class':'hide'});
  title = 'Avoid random opponents whose names contain specific patterns.';
  id = 'hitmanAvoidNames';
  makeElement('input', lhs, {'type':'checkbox', 'id':id, 'title':title, 'style':'vertical-align:middle', 'value':'checked'}, 'hitmanAvoidNames', 0);
  label = makeElement('label', lhs, {'for':id, 'title':title});
  label.appendChild(document.createTextNode(' Avoid mafia families:'));
  makeElement('textarea', rhs, {'style':'position: static; width: 15em; height: 8em;', 'id':'hitmanClanName', 'title':'Enter each pattern (such as a clan name) on a separate line.'}).appendChild(document.createTextNode(GM_getValue('clanName', defaultClans.join('\n'))));;
  makeElement('br', rhs);
  makeElement('font', rhs, {'style':'font-size: small;'}).appendChild(document.createTextNode('Enter each name pattern on a separate line.'));
  // End of options specific to hitman


  // Handler for switching sub-areas.
  var handleSpendChanged = function() {
    // Hide all but the selected sub-area.
    for (i = 0, iLength=staminaSpendHow.length; i < iLength; ++i) {
      if (i != staminaSpendHow.selectedIndex) {
        staminaTabSub.childNodes[i].style.display = 'none';
      }
    }
    staminaTabSub.childNodes[staminaSpendHow.selectedIndex].style.display = 'block';
  }
  staminaSpendHow.selectedIndex = GM_getValue('staminaSpendHow', 0);
  handleSpendChanged();
  staminaSpendHow.addEventListener('change', handleSpendChanged, false);

  return staminaTab;
}

// Validates the settings on the stamina tab. If all settings are valid, an
// object containing each key and value to be saved is returned.
function validateStaminaTab() {
  var elt, id;

  var checked = function(id) {
    return document.getElementById(id).checked === true? 'checked' : 0;
  }

  // Create an empty object to hold the settings.
  var s = {};

  // Get the common settings.
  s.staminaSpend = checked('staminaSpend');
  s.staminaSpendHow = document.getElementById('staminaSpendHow').selectedIndex;
  s.selectStaminaUse = document.getElementById('selectStaminaUse').selectedIndex;
  s.selectStaminaKeep = document.getElementById('selectStaminaKeep').selectedIndex;
  s.allowStaminaToLevelUp = checked('allowStaminaToLevelUp');

  // The method of getting and verifying the rest of the settings depends
  // on how stamina will be spent.
  switch (s.staminaSpendHow) {
    case STAMINA_HOW_FIGHT_RANDOM: // Random fighting
      // Get the settings.
      s.fightLocation = document.getElementById('fightRandomLoc').selectedIndex;
      s.fightLevelMax = parseInt(document.getElementById('fightLevelMax').value);
      s.fightLevelMaxRelative = checked('fightLevelMaxRelative');
      s.fightMafiaMax = parseInt(document.getElementById('fightMafiaMax').value);
      s.fightMafiaMaxRelative = checked('fightMafiaMaxRelative');
      s.fightMafiaMin = parseInt(document.getElementById('fightMafiaMin').value);
      s.fightMafiaMinRelative = checked('fightMafiaMinRelative');
      s.fightStealth = checked('fightStealth');
      s.fightAvoidBodyguards = checked('fightAvoidBodyguards');
      s.fightAvoidNames = checked('fightAvoidNames');
      s.clanName = document.getElementById('fightClanName').value;

      // Validate the maximum level settings.
      if (isNaN(s.fightLevelMax)) {
        alert('Please enter a maximum level for fighting.');
        return;
      } else if (s.fightLevelMaxRelative && s.fightLevelMax < 0) {
        alert('Please enter a maximum relative level of zero or more.');
        return;
      } else if (!s.fightLevelMaxRelative && s.fightLevelMax < level) {
        alert('Please enter a fight level of ' + level +
              ' (your current level) or more for fighting.');
        return;
      } else if (!s.fightLevelMaxRelative && level >= 180 &&
                 s.fightLevelMax < 200) {
        alert('Once you reach level 180, only opponents of level 180 and up are displayed. In order to find random opponents, please enter a maximum fight level of 200 at the very least. If necessary, lower the maximum mafia size to compensate.');
        return;
      } else if (s.fightLevelMaxRelative && level >= 180 &&
                level + s.fightLevelMax < 200) {
        alert('Once you reach level 180, only opponents of level 180 and up are displayed. In order to find random opponents, please enter a relative fight level of at least ' + (200 - s.fightLevelMax) + '. If necessary, lower the maximum mafia size to compensate.');
        return;
      }

      // Validate the maximum mafia size settings.
      if (isNaN(s.fightMafiaMax)) {
        alert('Please enter a maximum mafia size for fighting.');
        return;
      } else if (!s.fightMafiaMaxRelative && (s.fightMafiaMax < 1)) {
        alert('Please enter a maximum mafia size of one or more for fighting.');
        return;
      } else if (s.fightMafiaMaxRelative && (s.fightMafiaMax + mafia < 1)) {
        alert('Please enter a larger relative mafia size for fighting.');
        return;
      }

      // Validate the minimum mafia size settings.
      if (isNaN(s.fightMafiaMin)) {
        alert('Please enter a minimum mafia size for fighting.');
        return;
      } else if (!s.fightMafiaMinRelative && (s.fightMafiaMin < 1)) {
        alert('Please enter a minimum mafia size of one or more for fighting.');
        return;
      } else if (s.fightMafiaMinRelative && (mafia - s.fightMafiaMin < 1)) {
        alert('Please enter a smaller relative mafia size for fighting.');
        return;
      }
      break;

    case STAMINA_HOW_FIGHT_LIST: // List fighting
      // Get the settings.
      s.fightLocation = document.getElementById('fightListLoc').selectedIndex;
      s.fightList = document.getElementById('fightList').value;
      s.fightRemoveStronger = document.getElementById('fightRemoveStronger').checked === true? 'checked' : 0;

      // Validate the fight list.
      var list = s.fightList.split('\n');
      if (!list[0]) {
        alert('Enter the Facebook ID of at least one opponent to fight.');
        return;
      }
      break;

    case STAMINA_HOW_ROB_RANDOM: // Random robbing
      // Get the settings.
      s.robLevelMax = parseInt(document.getElementById('robLevelMax').value);
      s.robLevelMaxRelative = checked('robLevelMaxRelative');
      s.robMafiaMax = parseInt(document.getElementById('robMafiaMax').value);
      s.robMafiaMaxRelative = checked('robMafiaMaxRelative');
      s.robMafiaMin = parseInt(document.getElementById('robMafiaMin').value);
      s.robMafiaMinRelative = checked('robMafiaMinRelative');
      s.robAvoidNames = checked('robAvoidNames');
      s.clanName = document.getElementById('robClanName').value;

      // Validate the maximum level settings.
      if (isNaN(s.robLevelMax)) {
        alert('Please enter a maximum level for robbing.');
        return;
      } else if (s.robLevelMaxRelative && (s.robLevelMax < 0)) {
        alert('Please enter a maximum relative level of zero or more.');
        return;
      } else if (!s.robLevelMaxRelative && (s.robLevelMax < level)) {
        alert('Please enter a maximum level of ' + level +
              ' (your current level) or more for robbing.');
        return;
      }

      // Validate the maximum mafia size settings.
      var mafiaForRob = level < mafia? level : mafia;
      if (isNaN(s.robMafiaMax)) {
        alert('Please enter a maximum mafia size for robbing.');
        return;
      } else if (!s.robMafiaMaxRelative && (s.robMafiaMax < 1)) {
        alert('Please enter a maximum mafia size of one or more for robbing.');
        return;
      } else if (s.robMafiaMaxRelative && (s.robMafiaMax + mafiaForRob < 1)) {
        alert('Please enter a larger relative mafia size for robbing.');
        return;
      }

      // Validate the minimum mafia size settings.
      if (isNaN(s.robMafiaMin)) {
        alert('Please enter a minimum mafia size for robbing.');
        return;
      } else if (!s.robMafiaMinRelative && (s.robMafiaMin < 1)) {
        alert('Please enter a minimum mafia size of one or more for robbing.');
        return;
      } else if (s.robMafiaMinRelative && (mafiaForRob - s.robMafiaMin < 1)) {
        alert('Please enter a smaller relative mafia size for robbing.');
        return;
      }
      break;

    case STAMINA_HOW_ROB_LIST: // List robbing
      // Get the settings.
      s.robList = document.getElementById('robList').value;
      s.robRemoveStronger = document.getElementById('robRemoveStronger').checked === true? 'checked' : 0;

      // Validate the rob list.
      var list = s.robList.split('\n');
      if (!list[0]) {
        alert('Enter the Facebook ID of at least one opponent to rob.');
        return;
      }
      break;

    case STAMINA_HOW_HITMAN: // Hitlist bounty collection ("auto-hitman")
      // Get the settings.
      s.hitmanLocation = document.getElementById('hitmanLoc').selectedIndex;
      s.hitmanBountyMin = document.getElementById('hitmanBountyMin').value;
      s.bountySelection = document.getElementById('bountySelection').selectedIndex;
      s.hitmanAvoidNames = checked('hitmanAvoidNames');
      s.clanName = document.getElementById('hitmanClanName').value;

      // Validate the minimum bounty.
      var min = parseCash(s.hitmanBountyMin);
      if (isNaN(min) || min < 0) {
        alert('Please enter a minimum bounty amount.');
        return;
      }
      break;

    default:
      addToLog('warning Icon', 'BUG DETECTED: Unrecognized stamina setting: ' +
               'staminaSpendHow=' + s.staminaSpendHow);
  }

  return s;
}

function createHitlistTab() {
  var elt, title, id, label;
  var eltStack = [];
  var hitlistTab = makeElement('div', null, {'id':'hitlistTab', 'class':'tabcontent', 'style':'background-image:url(' + stripURI(hitlistTabImage) + ')'});

  //
  // First column of options.
  //
  elt = makeElement('div', hitlistTab,
                    {'style':'top: 25px; text-decoration: line-through;'});
  title = 'Keep Players on Hitlist.';
  id = 'autoHitlist';
  var autoHitlistCheckbox = makeElement('input', elt, {'type':'checkbox', 'id':id, 'title':title, 'style':'vertical-align:middle', 'value':'checked'}, 'autoHitlist');
  label = makeElement('label', elt, {'for':id, 'title':title});
  label.appendChild(document.createTextNode('Enable auto-hitlist '));

  elt = makeElement('div', elt, {'style':'position: static; margin-left: 13px'});
  title = 'Use a custom list of opponents. Enter each opponent\'s ID' +
          ' (not their name) on a separate line.';
  id = 'toHitlist';
  makeElement('textarea', elt, {'style':'position: static; width: 180px; height: 105px;', 'id':id, 'title':title}).appendChild(document.createTextNode(GM_getValue(id, '')));

  elt = makeElement('div', hitlistTab,
                    {'style':'top: 175px;'});
  title = 'Only Show Summary of Attacks.';
  id = 'hideAttacks';
  var hideAttacksCheckbox = makeElement('input', elt, {'type':'checkbox', 'id':id, 'title':title, 'value':'checked'}, 'hideAttacks');
  label = makeElement('label', elt, {'for':id, 'title':title});
  label.appendChild(document.createTextNode('Summarize Attacks From Player Updates '));

  //second column of Hitlist Tab
  elt = makeElement('div', hitlistTab, {'style':'top: 25px; right: 10px; text-decoration: line-through;'});
  title = 'This will be the bounty amount for all auto-hitlists.';
  id = 'bountyAmount';
  label = makeElement('label', elt, {'for':id, 'title':title});
  label.appendChild(document.createTextNode('Bounty Amount: '));
  var bountyAmountCheckbox = makeElement('input', elt, {'type':'text', 'style':'width: 80px;', 'title':title, 'value':GM_getValue(id, '10000'), 'id':id, 'size':'1'});

  makeElement('br', elt);
  elt = makeElement('div', elt, {'style':'position: static; margin-right: 10px'});
  title = 'Players currently on hitlist';
  id = 'onHitlist';
  makeElement('textarea', elt, {'style':'position: static; width: 180px; height: 105px;', 'id':id, 'title':title}).appendChild(document.createTextNode(GM_getValue(id, '')));

  title = 'Press this button to clear all the names and return them to the auto-hitlist array.';
  id = 'clrHitlistArray';
  var clearHitlistButton = makeElement('span', elt, {'class':'sexy_button', 'title':title});
  makeElement('button', clearHitlistButton).appendChild(document.createTextNode('Clear Players'));
  clearHitlistButton.addEventListener('click', clearHitlistArray, false);

  return hitlistTab;
}

function createStatWindow() {
  if (settingsOpen === true) {
    toggleSettings()
  };

  makeElement('style', document.getElementsByTagName('head')[0], {'type':'text/css'}).appendChild(document.createTextNode(
    '#statsWindow #sWindowTabNav div{border-right:1px solid #000;float:left;padding:0 7px;position:static;text-align:center}' +
    '#statsWindow #sWindowTabNav div.selected{background-image:url(' + stripURI(tabSelectedImage) + ')}' +
    '#statsWindow #sWindowTabNav div a{color:#fff;font-weight:700}' +
    '#statsWindow .sexy_button{position:absolute;background-image:url(' + stripURI(redBgImage) + ');border:1px solid #FFD927;color:#FFD927;cursor:pointer;display:block;float:left;font-size:14px;font-weight:700;padding:5px;text-decoration:none;width:auto}' +
    '#statsWindow .sexy_button button{background:transparent;border:medium none #FFF;color:#FFD927;cursor:pointer;font-size:14px;font-weight:700;margin:0}' +
    '#statsWindow .sexy_button button:hover{color:#BCD2EA;font-weight:700;text-decoration:none}' +
    '#statsWindow .tabcontent{display:none;}' +
    '#statsWindow label {font-weight: normal; color: #BCD2EA}'
  ));

  // This creates the stats box just like a facebook popup
  var elt = makeElement('div', document.body, {'class':'generic_dialog pop_dialog', 'id':'sWindowGenDialogPopDialog'});
  elt = makeElement('div', elt, {'class':'generic_dialog_popup', 'style':'top: 30px; width: 620px;'});
  elt = makeElement('div', elt, {'class':'pop_content popcontent_advanced', 'id':'pop_content'});
  var statsWindow = makeElement('div', elt, {'style':'position: relative; width: 600px; height: 580px; font-size: 14px; color: #BCD2EA; background: black no-repeat scroll 0 110px', 'id':'statsWindow'});
  //End settings box

  var statsWindowTopBG = makeElement('div', statsWindow, {'style':'background: black; height: 80px;'});
    var statsWindowTitle = makeElement('div', statsWindowTopBG, {'style':'font-size: 18px; font-weight: bold;'});
      statsWindowTitle.appendChild(document.createTextNode('Facebook Mafia Wars Autoplayer'));
      makeElement('br', statsWindowTitle);
      statsWindowTitle.appendChild(document.createTextNode('Player Stats '));
      makeElement('br', statsWindowTitle);
    makeElement('img', statsWindowTopBG, {'src':stripURI(mwLogoSmall), 'style':'position: absolute; top: 0px; right: 25px;'});
    makeElement('img', statsWindowTopBG, {'src':stripURI(closeButtonIcon), 'style':'position: absolute; top: 0px; right: 0px; cursor: pointer;'}).addEventListener('click', toggleStats, false);


  // NOTE: This container is for placing the buttons horizontally.
  elt = makeElement('div', statsWindow, {'style':'text-align: left'});
  // Make the button bar.
  var sWindowTabNav = makeElement('div', elt, {'id':'sWindowTabNav', 'style':'position: static; display: inline-block; background: transparent url(' + stripURI(redBgImage) + ') repeat-x scroll 0 0; border: 1px solid #FFFFFF; fontsize: 13px; line-height: 28px; height: 30px;'});
    var graphTabLink = makeElement('div', sWindowTabNav, {'class':'selected'} );
      makeElement('a', graphTabLink, {'href':'#', 'rel':'graphTab'}).appendChild(document.createTextNode('Graphs'));
    var statTabLink = makeElement('div', sWindowTabNav );
      makeElement('a', statTabLink, {'href':'#', 'rel':'statTab'}).appendChild(document.createTextNode('Stats'));


  var graphTab = makeElement('div', statsWindow, {'id':'graphTab', 'class':'tabcontent'});
    var graphBox = makeElement('div', graphTab, {'id':'graphBox', 'style':'position: static; overflow: auto; height: 443px; width: 578px; background-color: #111111; font-size:11px; color: #BCD2EA; text-align: center; margin: 5px; padding: 5px; border: 1px inset;'});
      graphBox.innerHTML = GM_getValue('graphBox', 'Enable Stats with the Checkbox on the General tab of the AutopPlay settings.<br><br>Stats will populate after the 2nd hour of running.');

  var statTab = makeElement('div', statsWindow, {'id':'statTab', 'class':'tabcontent'});
    var autoClick = makeElement('div', statTab, {'style':'top: 25px;'});
    makeElement('img', autoClick, {'style':'position: absolute; top: 5px; left: 200px', 'src':stripURI(energyIcon)});


//Tab code from:http://www.dynamicdrive.com/dynamicindex17/tabcontent.htm converted into a data URI
  makeElement('script', document.getElementsByTagName('head')[0], {'type':'text/javascript', 'src':
    "data:application/x-javascript;base64,Ly8qKiBUYWIgQ29udGVudCBzY3JpcHQgdjIuMC0gqSBEeW5hbWljIERyaXZlIERIVE1MIGNvZGUgbGlicmFyeSAoaHR0cDovL3d3dy5keW5hbWljZHJpdmUuY29tKQ0KLy8qKiBVcGRhdGVkIE9jdCA3dGgsIDA3IHRvIHZlcnNpb24gMi4wLiBDb250YWlucyBudW1lcm91cyBpbXByb3ZlbWVudHM6DQovLyAgIC1BZGRlZCBBdXRvIE1vZGU6IFNjcmlwdCBhdXRvIHJvdGF0ZXMgdGhlIHRhYnMgYmFzZWQgb24gYW4gaW50ZXJ2YWwsIHVudGlsIGEgdGFiIGlzIGV4cGxpY2l0bHkgc2VsZWN0ZWQNCi8vICAgLUFiaWxpdHkgdG8gZXhwYW5kL2NvbnRyYWN0IGFyYml0cmFyeSBESVZzIG9uIHRoZSBwYWdlIGFzIHRoZSB0YWJiZWQgY29udGVudCBpcyBleHBhbmRlZC8gY29udHJhY3RlZA0KLy8gICAtQWJpbGl0eSB0byBkeW5hbWljYWxseSBzZWxlY3QgYSB0YWIgZWl0aGVyIGJhc2VkIG9uIGl0cyBwb3NpdGlvbiB3aXRoaW4gaXRzIHBlZXJzLCBvciBpdHMgSUQgYXR0cmlidXRlIChnaXZlIHRoZSB0YXJnZXQgdGFiIG9uZSAxc3QpDQovLyAgIC1BYmlsaXR5IHRvIHNldCB3aGVyZSB0aGUgQ1NTIGNsYXNzbmFtZSAic2VsZWN0ZWQiIGdldCBhc3NpZ25lZC0gZWl0aGVyIHRvIHRoZSB0YXJnZXQgdGFiJ3MgbGluayAoIkEiKSwgb3IgaXRzIHBhcmVudCBjb250YWluZXINCi8vKiogVXBkYXRlZCBGZWIgMTh0aCwgMDggdG8gdmVyc2lvbiAyLjE6IEFkZHMgYSAidGFiaW5zdGFuY2UuY3ljbGVpdChkaXIpIiBtZXRob2QgdG8gY3ljbGUgZm9yd2FyZCBvciBiYWNrd2FyZCBiZXR3ZWVuIHRhYnMgZHluYW1pY2FsbHkNCi8vKiogVXBkYXRlZCBBcHJpbCA4dGgsIDA4IHRvIHZlcnNpb24gMi4yOiBBZGRzIHN1cHBvcnQgZm9yIGV4cGFuZGluZyBhIHRhYiB1c2luZyBhIFVSTCBwYXJhbWV0ZXIgKGllOiBodHRwOi8vbXlzaXRlLmNvbS90YWJjb250ZW50Lmh0bT90YWJpbnRlcmZhY2VpZD0wKSANCg0KLy8vL05PIE5FRUQgVE8gRURJVCBCRUxPVy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KDQpmdW5jdGlvbiBkZHRhYmNvbnRlbnQodGFiaW50ZXJmYWNlaWQpew0KCXRoaXMudGFiaW50ZXJmYWNlaWQ9dGFiaW50ZXJmYWNlaWQgLy9JRCBvZiBUYWIgTWVudSBtYWluIGNvbnRhaW5lcg0KCXRoaXMudGFicz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0YWJpbnRlcmZhY2VpZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKSAvL0dldCBhbGwgdGFiIGxpbmtzIHdpdGhpbiBjb250YWluZXINCgl0aGlzLmVuYWJsZXRhYnBlcnNpc3RlbmNlPXRydWUNCgl0aGlzLmhvdHRhYnNwb3NpdGlvbnM9W10gLy9BcnJheSB0byBzdG9yZSBwb3NpdGlvbiBvZiB0YWJzIHRoYXQgaGF2ZSBhICJyZWwiIGF0dHIgZGVmaW5lZCwgcmVsYXRpdmUgdG8gYWxsIHRhYiBsaW5rcywgd2l0aGluIGNvbnRhaW5lcg0KCXRoaXMuY3VycmVudFRhYkluZGV4PTAgLy9JbmRleCBvZiBjdXJyZW50bHkgc2VsZWN0ZWQgaG90IHRhYiAodGFiIHdpdGggc3ViIGNvbnRlbnQpIHdpdGhpbiBob3R0YWJzcG9zaXRpb25zW10gYXJyYXkNCgl0aGlzLnN1YmNvbnRlbnRpZHM9W10gLy9BcnJheSB0byBzdG9yZSBpZHMgb2YgdGhlIHN1YiBjb250ZW50cyAoInJlbCIgYXR0ciB2YWx1ZXMpDQoJdGhpcy5yZXZjb250ZW50aWRzPVtdIC8vQXJyYXkgdG8gc3RvcmUgaWRzIG9mIGFyYml0cmFyeSBjb250ZW50cyB0byBleHBhbmQvY29udGFjdCBhcyB3ZWxsICgicmV2IiBhdHRyIHZhbHVlcykNCgl0aGlzLnNlbGVjdGVkQ2xhc3NUYXJnZXQ9ImxpbmsiIC8va2V5d29yZCB0byBpbmRpY2F0ZSB3aGljaCB0YXJnZXQgZWxlbWVudCB0byBhc3NpZ24gInNlbGVjdGVkIiBDU1MgY2xhc3MgKCJsaW5rcGFyZW50IiBvciAibGluayIpDQp9DQoNCmRkdGFiY29udGVudC5nZXRDb29raWU9ZnVuY3Rpb24oTmFtZSl7IA0KCXZhciByZT1uZXcgUmVnRXhwKE5hbWUrIj1bXjtdKyIsICJpIik7IC8vY29uc3RydWN0IFJFIHRvIHNlYXJjaCBmb3IgdGFyZ2V0IG5hbWUvdmFsdWUgcGFpcg0KCWlmIChkb2N1bWVudC5jb29raWUubWF0Y2gocmUpKSAvL2lmIGNvb2tpZSBmb3VuZA0KCQlyZXR1cm4gZG9jdW1lbnQuY29va2llLm1hdGNoKHJlKVswXS5zcGxpdCgiPSIpWzFdIC8vcmV0dXJuIGl0cyB2YWx1ZQ0KCXJldHVybiAiIg0KfQ0KDQpkZHRhYmNvbnRlbnQuc2V0Q29va2llPWZ1bmN0aW9uKG5hbWUsIHZhbHVlKXsNCglkb2N1bWVudC5jb29raWUgPSBuYW1lKyI9Iit2YWx1ZSsiO3BhdGg9LyIgLy9jb29raWUgdmFsdWUgaXMgZG9tYWluIHdpZGUgKHBhdGg9LykNCn0NCg0KZGR0YWJjb250ZW50LnByb3RvdHlwZT17DQoNCglleHBhbmRpdDpmdW5jdGlvbih0YWJpZF9vcl9wb3NpdGlvbil7IC8vUFVCTElDIGZ1bmN0aW9uIHRvIHNlbGVjdCBhIHRhYiBlaXRoZXIgYnkgaXRzIElEIG9yIHBvc2l0aW9uKGludCkgd2l0aGluIGl0cyBwZWVycw0KCQl0aGlzLmNhbmNlbGF1dG9ydW4oKSAvL3N0b3AgYXV0byBjeWNsaW5nIG9mIHRhYnMgKGlmIHJ1bm5pbmcpDQoJCXZhciB0YWJyZWY9IiINCgkJdHJ5ew0KCQkJaWYgKHR5cGVvZiB0YWJpZF9vcl9wb3NpdGlvbj09InN0cmluZyIgJiYgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGFiaWRfb3JfcG9zaXRpb24pLmdldEF0dHJpYnV0ZSgicmVsIikpIC8vaWYgc3BlY2lmaWVkIHRhYiBjb250YWlucyAicmVsIiBhdHRyDQoJCQkJdGFicmVmPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRhYmlkX29yX3Bvc2l0aW9uKQ0KCQkJZWxzZSBpZiAocGFyc2VJbnQodGFiaWRfb3JfcG9zaXRpb24pIT1OYU4gJiYgdGhpcy50YWJzW3RhYmlkX29yX3Bvc2l0aW9uXS5nZXRBdHRyaWJ1dGUoInJlbCIpKSAvL2lmIHNwZWNpZmllZCB0YWIgY29udGFpbnMgInJlbCIgYXR0cg0KCQkJCXRhYnJlZj10aGlzLnRhYnNbdGFiaWRfb3JfcG9zaXRpb25dDQoJCX0NCgkJY2F0Y2goZXJyKXthbGVydCgiSW52YWxpZCBUYWIgSUQgb3IgcG9zaXRpb24gZW50ZXJlZCEiKX0NCgkJaWYgKHRhYnJlZiE9IiIpIC8vaWYgYSB2YWxpZCB0YWIgaXMgZm91bmQgYmFzZWQgb24gZnVuY3Rpb24gcGFyYW1ldGVyDQoJCQl0aGlzLmV4cGFuZHRhYih0YWJyZWYpIC8vZXhwYW5kIHRoaXMgdGFiDQoJfSwNCg0KCWN5Y2xlaXQ6ZnVuY3Rpb24oZGlyLCBhdXRvcnVuKXsgLy9QVUJMSUMgZnVuY3Rpb24gdG8gbW92ZSBmb3dhcmQgb3IgYmFja3dhcmRzIHRocm91Z2ggZWFjaCBob3QgdGFiICh0YWJpbnN0YW5jZS5jeWNsZWl0KCdmb3dhcmQvYmFjaycpICkNCgkJaWYgKGRpcj09Im5leHQiKXsNCgkJCXZhciBjdXJyZW50VGFiSW5kZXg9KHRoaXMuY3VycmVudFRhYkluZGV4PHRoaXMuaG90dGFic3Bvc2l0aW9ucy5sZW5ndGgtMSk%2FIHRoaXMuY3VycmVudFRhYkluZGV4KzEgOiAwDQoJCX0NCgkJZWxzZSBpZiAoZGlyPT0icHJldiIpew0KCQkJdmFyIGN1cnJlbnRUYWJJbmRleD0odGhpcy5jdXJyZW50VGFiSW5kZXg%2BMCk%2FIHRoaXMuY3VycmVudFRhYkluZGV4LTEgOiB0aGlzLmhvdHRhYnNwb3NpdGlvbnMubGVuZ3RoLTENCgkJfQ0KCQlpZiAodHlwZW9mIGF1dG9ydW49PSJ1bmRlZmluZWQiKSAvL2lmIGN5Y2xlaXQoKSBpcyBiZWluZyBjYWxsZWQgYnkgdXNlciwgdmVyc3VzIGF1dG9ydW4oKSBmdW5jdGlvbg0KCQkJdGhpcy5jYW5jZWxhdXRvcnVuKCkgLy9zdG9wIGF1dG8gY3ljbGluZyBvZiB0YWJzIChpZiBydW5uaW5nKQ0KCQl0aGlzLmV4cGFuZHRhYih0aGlzLnRhYnNbdGhpcy5ob3R0YWJzcG9zaXRpb25zW2N1cnJlbnRUYWJJbmRleF1dKQ0KCX0sDQoNCglzZXRwZXJzaXN0OmZ1bmN0aW9uKGJvb2wpeyAvL1BVQkxJQyBmdW5jdGlvbiB0byB0b2dnbGUgcGVyc2lzdGVuY2UgZmVhdHVyZQ0KCQkJdGhpcy5lbmFibGV0YWJwZXJzaXN0ZW5jZT1ib29sDQoJfSwNCg0KCXNldHNlbGVjdGVkQ2xhc3NUYXJnZXQ6ZnVuY3Rpb24ob2Jqc3RyKXsgLy9QVUJMSUMgZnVuY3Rpb24gdG8gc2V0IHdoaWNoIHRhcmdldCBlbGVtZW50IHRvIGFzc2lnbiAic2VsZWN0ZWQiIENTUyBjbGFzcyAoImxpbmtwYXJlbnQiIG9yICJsaW5rIikNCgkJdGhpcy5zZWxlY3RlZENsYXNzVGFyZ2V0PW9ianN0ciB8fCAibGluayINCgl9LA0KDQoJZ2V0c2VsZWN0ZWRDbGFzc1RhcmdldDpmdW5jdGlvbih0YWJyZWYpeyAvL1JldHVybnMgdGFyZ2V0IGVsZW1lbnQgdG8gYXNzaWduICJzZWxlY3RlZCIgQ1NTIGNsYXNzIHRvDQoJCXJldHVybiAodGhpcy5zZWxlY3RlZENsYXNzVGFyZ2V0PT0oImxpbmtwYXJlbnQiLnRvTG93ZXJDYXNlKCkpKT8gdGFicmVmLnBhcmVudE5vZGUgOiB0YWJyZWYNCgl9LA0KDQoJdXJscGFyYW1zZWxlY3Q6ZnVuY3Rpb24odGFiaW50ZXJmYWNlaWQpew0KCQl2YXIgcmVzdWx0PXdpbmRvdy5sb2NhdGlvbi5zZWFyY2gubWF0Y2gobmV3IFJlZ0V4cCh0YWJpbnRlcmZhY2VpZCsiPShcXGQrKSIsICJpIikpIC8vY2hlY2sgZm9yICI%2FdGFiaW50ZXJmYWNlaWQ9MiIgaW4gVVJMDQoJCXJldHVybiAocmVzdWx0PT1udWxsKT8gbnVsbCA6IHBhcnNlSW50KFJlZ0V4cC4kMSkgLy9yZXR1cm5zIG51bGwgb3IgaW5kZXgsIHdoZXJlIGluZGV4IChpbnQpIGlzIHRoZSBzZWxlY3RlZCB0YWIncyBpbmRleA0KCX0sDQoNCglleHBhbmR0YWI6ZnVuY3Rpb24odGFicmVmKXsNCgkJdmFyIHN1YmNvbnRlbnRpZD10YWJyZWYuZ2V0QXR0cmlidXRlKCJyZWwiKSAvL0dldCBpZCBvZiBzdWJjb250ZW50IHRvIGV4cGFuZA0KCQkvL0dldCAicmV2IiBhdHRyIGFzIGEgc3RyaW5nIG9mIElEcyBpbiB0aGUgZm9ybWF0ICIsam9obixnZW9yZ2UsdHJleSxldGMsIiB0byBlYXNpbHkgc2VhcmNoIHRocm91Z2gNCgkJdmFyIGFzc29jaWF0ZWRyZXZpZHM9KHRhYnJlZi5nZXRBdHRyaWJ1dGUoInJldiIpKT8gIiwiK3RhYnJlZi5nZXRBdHRyaWJ1dGUoInJldiIpLnJlcGxhY2UoL1xzKy8sICIiKSsiLCIgOiAiIg0KCQl0aGlzLmV4cGFuZHN1YmNvbnRlbnQoc3ViY29udGVudGlkKQ0KCQl0aGlzLmV4cGFuZHJldmNvbnRlbnQoYXNzb2NpYXRlZHJldmlkcykNCgkJZm9yICh2YXIgaT0wOyBpPHRoaXMudGFicy5sZW5ndGg7IGkrKyl7IC8vTG9vcCB0aHJvdWdoIGFsbCB0YWJzLCBhbmQgYXNzaWduIG9ubHkgdGhlIHNlbGVjdGVkIHRhYiB0aGUgQ1NTIGNsYXNzICJzZWxlY3RlZCINCgkJCXRoaXMuZ2V0c2VsZWN0ZWRDbGFzc1RhcmdldCh0aGlzLnRhYnNbaV0pLmNsYXNzTmFtZT0odGhpcy50YWJzW2ldLmdldEF0dHJpYnV0ZSgicmVsIik9PXN1YmNvbnRlbnRpZCk%2FICJzZWxlY3RlZCIgOiAiIg0KCQl9DQoJCWlmICh0aGlzLmVuYWJsZXRhYnBlcnNpc3RlbmNlKSAvL2lmIHBlcnNpc3RlbmNlIGVuYWJsZWQsIHNhdmUgc2VsZWN0ZWQgdGFiIHBvc2l0aW9uKGludCkgcmVsYXRpdmUgdG8gaXRzIHBlZXJzDQoJCQlkZHRhYmNvbnRlbnQuc2V0Q29va2llKHRoaXMudGFiaW50ZXJmYWNlaWQsIHRhYnJlZi50YWJwb3NpdGlvbikNCgkJdGhpcy5zZXRjdXJyZW50dGFiaW5kZXgodGFicmVmLnRhYnBvc2l0aW9uKSAvL3JlbWVtYmVyIHBvc2l0aW9uIG9mIHNlbGVjdGVkIHRhYiB3aXRoaW4gaG90dGFic3Bvc2l0aW9uc1tdIGFycmF5DQoJfSwNCg0KCWV4cGFuZHN1YmNvbnRlbnQ6ZnVuY3Rpb24oc3ViY29udGVudGlkKXsNCgkJZm9yICh2YXIgaT0wOyBpPHRoaXMuc3ViY29udGVudGlkcy5sZW5ndGg7IGkrKyl7DQoJCQl2YXIgc3ViY29udGVudD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnN1YmNvbnRlbnRpZHNbaV0pIC8vY2FjaGUgY3VycmVudCBzdWJjb250ZW50IG9iaiAoaW4gZm9yIGxvb3ApDQoJCQlzdWJjb250ZW50LnN0eWxlLmRpc3BsYXk9KHN1YmNvbnRlbnQuaWQ9PXN1YmNvbnRlbnRpZCk%2FICJibG9jayIgOiAibm9uZSIgLy8ic2hvdyIgb3IgaGlkZSBzdWIgY29udGVudCBiYXNlZCBvbiBtYXRjaGluZyBpZCBhdHRyIHZhbHVlDQoJCX0NCgl9LA0KDQoJZXhwYW5kcmV2Y29udGVudDpmdW5jdGlvbihhc3NvY2lhdGVkcmV2aWRzKXsNCgkJdmFyIGFsbHJldmlkcz10aGlzLnJldmNvbnRlbnRpZHMNCgkJZm9yICh2YXIgaT0wOyBpPGFsbHJldmlkcy5sZW5ndGg7IGkrKyl7IC8vTG9vcCB0aHJvdWdoIHJldiBhdHRyaWJ1dGVzIGZvciBhbGwgdGFicyBpbiB0aGlzIHRhYiBpbnRlcmZhY2UNCgkJCS8vaWYgYW55IHZhbHVlcyBzdG9yZWQgd2l0aGluIGFzc29jaWF0ZWRyZXZpZHMgbWF0Y2hlcyBvbmUgd2l0aGluIGFsbHJldmlkcywgZXhwYW5kIHRoYXQgRElWLCBvdGhlcndpc2UsIGNvbnRyYWN0IGl0DQoJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZChhbGxyZXZpZHNbaV0pLnN0eWxlLmRpc3BsYXk9KGFzc29jaWF0ZWRyZXZpZHMuaW5kZXhPZigiLCIrYWxscmV2aWRzW2ldKyIsIikhPS0xKT8gImJsb2NrIiA6ICJub25lIg0KCQl9DQoJfSwNCg0KCXNldGN1cnJlbnR0YWJpbmRleDpmdW5jdGlvbih0YWJwb3NpdGlvbil7IC8vc3RvcmUgY3VycmVudCBwb3NpdGlvbiBvZiB0YWIgKHdpdGhpbiBob3R0YWJzcG9zaXRpb25zW10gYXJyYXkpDQoJCWZvciAodmFyIGk9MDsgaTx0aGlzLmhvdHRhYnNwb3NpdGlvbnMubGVuZ3RoOyBpKyspew0KCQkJaWYgKHRhYnBvc2l0aW9uPT10aGlzLmhvdHRhYnNwb3NpdGlvbnNbaV0pew0KCQkJCXRoaXMuY3VycmVudFRhYkluZGV4PWkNCgkJCQlicmVhaw0KCQkJfQ0KCQl9DQoJfSwNCg0KCWF1dG9ydW46ZnVuY3Rpb24oKXsgLy9mdW5jdGlvbiB0byBhdXRvIGN5Y2xlIHRocm91Z2ggYW5kIHNlbGVjdCB0YWJzIGJhc2VkIG9uIGEgc2V0IGludGVydmFsDQoJCXRoaXMuY3ljbGVpdCgnbmV4dCcsIHRydWUpDQoJfSwNCg0KCWNhbmNlbGF1dG9ydW46ZnVuY3Rpb24oKXsNCgkJaWYgKHR5cGVvZiB0aGlzLmF1dG9ydW50aW1lciE9InVuZGVmaW5lZCIpDQoJCQljbGVhckludGVydmFsKHRoaXMuYXV0b3J1bnRpbWVyKQ0KCX0sDQoNCglpbml0OmZ1bmN0aW9uKGF1dG9tb2RlcGVyaW9kKXsNCgkJdmFyIHBlcnNpc3RlZHRhYj1kZHRhYmNvbnRlbnQuZ2V0Q29va2llKHRoaXMudGFiaW50ZXJmYWNlaWQpIC8vZ2V0IHBvc2l0aW9uIG9mIHBlcnNpc3RlZCB0YWIgKGFwcGxpY2FibGUgaWYgcGVyc2lzdGVuY2UgaXMgZW5hYmxlZCkNCgkJdmFyIHNlbGVjdGVkdGFiPS0xIC8vQ3VycmVudGx5IHNlbGVjdGVkIHRhYiBpbmRleCAoLTEgbWVhbmluZyBub25lKQ0KCQl2YXIgc2VsZWN0ZWR0YWJmcm9tdXJsPXRoaXMudXJscGFyYW1zZWxlY3QodGhpcy50YWJpbnRlcmZhY2VpZCkgLy9yZXR1cm5zIG51bGwgb3IgaW5kZXggZnJvbTogdGFiY29udGVudC5odG0%2FdGFiaW50ZXJmYWNlaWQ9aW5kZXgNCgkJdGhpcy5hdXRvbW9kZXBlcmlvZD1hdXRvbW9kZXBlcmlvZCB8fCAwDQoJCWZvciAodmFyIGk9MDsgaTx0aGlzLnRhYnMubGVuZ3RoOyBpKyspew0KCQkJdGhpcy50YWJzW2ldLnRhYnBvc2l0aW9uPWkgLy9yZW1lbWJlciBwb3NpdGlvbiBvZiB0YWIgcmVsYXRpdmUgdG8gaXRzIHBlZXJzDQoJCQlpZiAodGhpcy50YWJzW2ldLmdldEF0dHJpYnV0ZSgicmVsIikpew0KCQkJCXZhciB0YWJpbnN0YW5jZT10aGlzDQoJCQkJdGhpcy5ob3R0YWJzcG9zaXRpb25zW3RoaXMuaG90dGFic3Bvc2l0aW9ucy5sZW5ndGhdPWkgLy9zdG9yZSBwb3NpdGlvbiBvZiAiaG90IiB0YWIgKCJyZWwiIGF0dHIgZGVmaW5lZCkgcmVsYXRpdmUgdG8gaXRzIHBlZXJzDQoJCQkJdGhpcy5zdWJjb250ZW50aWRzW3RoaXMuc3ViY29udGVudGlkcy5sZW5ndGhdPXRoaXMudGFic1tpXS5nZXRBdHRyaWJ1dGUoInJlbCIpIC8vc3RvcmUgaWQgb2Ygc3ViIGNvbnRlbnQgKCJyZWwiIGF0dHIgdmFsdWUpDQoJCQkJdGhpcy50YWJzW2ldLm9uY2xpY2s9ZnVuY3Rpb24oKXsNCgkJCQkJdGFiaW5zdGFuY2UuZXhwYW5kdGFiKHRoaXMpDQoJCQkJCXRhYmluc3RhbmNlLmNhbmNlbGF1dG9ydW4oKSAvL3N0b3AgYXV0byBjeWNsaW5nIG9mIHRhYnMgKGlmIHJ1bm5pbmcpDQoJCQkJCXJldHVybiBmYWxzZQ0KCQkJCX0NCgkJCQlpZiAodGhpcy50YWJzW2ldLmdldEF0dHJpYnV0ZSgicmV2IikpeyAvL2lmICJyZXYiIGF0dHIgZGVmaW5lZCwgc3RvcmUgZWFjaCB2YWx1ZSB3aXRoaW4gInJldiIgYXMgYW4gYXJyYXkgZWxlbWVudA0KCQkJCQl0aGlzLnJldmNvbnRlbnRpZHM9dGhpcy5yZXZjb250ZW50aWRzLmNvbmNhdCh0aGlzLnRhYnNbaV0uZ2V0QXR0cmlidXRlKCJyZXYiKS5zcGxpdCgvXHMqLFxzKi8pKQ0KCQkJCX0NCgkJCQlpZiAoc2VsZWN0ZWR0YWJmcm9tdXJsPT1pIHx8IHRoaXMuZW5hYmxldGFicGVyc2lzdGVuY2UgJiYgc2VsZWN0ZWR0YWI9PS0xICYmIHBhcnNlSW50KHBlcnNpc3RlZHRhYik9PWkgfHwgIXRoaXMuZW5hYmxldGFicGVyc2lzdGVuY2UgJiYgc2VsZWN0ZWR0YWI9PS0xICYmIHRoaXMuZ2V0c2VsZWN0ZWRDbGFzc1RhcmdldCh0aGlzLnRhYnNbaV0pLmNsYXNzTmFtZT09InNlbGVjdGVkIil7DQoJCQkJCXNlbGVjdGVkdGFiPWkgLy9TZWxlY3RlZCB0YWIgaW5kZXgsIGlmIGZvdW5kDQoJCQkJfQ0KCQkJfQ0KCQl9IC8vRU5EIGZvciBsb29wDQoJCWlmIChzZWxlY3RlZHRhYiE9LTEpIC8vaWYgYSB2YWxpZCBkZWZhdWx0IHNlbGVjdGVkIHRhYiBpbmRleCBpcyBmb3VuZA0KCQkJdGhpcy5leHBhbmR0YWIodGhpcy50YWJzW3NlbGVjdGVkdGFiXSkgLy9leHBhbmQgc2VsZWN0ZWQgdGFiIChlaXRoZXIgZnJvbSBVUkwgcGFyYW1ldGVyLCBwZXJzaXN0ZW50IGZlYXR1cmUsIG9yIGNsYXNzPSJzZWxlY3RlZCIgY2xhc3MpDQoJCWVsc2UgLy9pZiBubyB2YWxpZCBkZWZhdWx0IHNlbGVjdGVkIGluZGV4IGZvdW5kDQoJCQl0aGlzLmV4cGFuZHRhYih0aGlzLnRhYnNbdGhpcy5ob3R0YWJzcG9zaXRpb25zWzBdXSkgLy9KdXN0IHNlbGVjdCBmaXJzdCB0YWIgdGhhdCBjb250YWlucyBhICJyZWwiIGF0dHINCgkJaWYgKHBhcnNlSW50KHRoaXMuYXV0b21vZGVwZXJpb2QpPjUwMCAmJiB0aGlzLmhvdHRhYnNwb3NpdGlvbnMubGVuZ3RoPjEpew0KCQkJdGhpcy5hdXRvcnVudGltZXI9c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0YWJpbnN0YW5jZS5hdXRvcnVuKCl9LCB0aGlzLmF1dG9tb2RlcGVyaW9kKQ0KCQl9DQoJfSAvL0VORCBpbnQoKSBmdW5jdGlvbg0KDQp9IC8vRU5EIFByb3RvdHlwZSBhc3NpZ25tZW50"
  }).appendChild(document.createTextNode(
    '/***********************************************\n' +
    '* Tab Content script v2.2- © Dynamic Drive DHTML code library (www.dynamicdrive.com)\n' +
    '* This notice MUST stay intact for legal use\n' +
    '* Visit Dynamic Drive at http://www.dynamicdrive.com/ for full source code\n' +
    '***********************************************/\n'
  ));
  makeElement('script', document.getElementsByTagName('head')[0], {'type':'text/javascript'}).appendChild(document.createTextNode(
    'var statTabs=new ddtabcontent("sWindowTabNav"); //enter ID of Tab Container\n' +
    'statTabs.setpersist(true); //toogle persistence of the tabs\' state\n' +
    'statTabs.setselectedClassTarget("linkparent"); //"link" or "linkparent"\n' +
    'statTabs.init();'
  ));
  DEBUG('Stat Menu Created.');
}

function clickAutoPause() {
  if (this.checked) {
    // check to ensure at least one radio box is checked
    // enable Before level up by default
    if (document.getElementById('autoPauseBefore').checked === false &&
        document.getElementById('autoPauseAfter').checked === false) {
      document.getElementById('autoPauseBefore').checked = true;
    }
  }
}

function handleModificationTimer() {
  // The timer has gone off, so assume that page updates have finished.
  //GM_log('Changes finished.');
  modificationTimer = undefined;

  if (!document.getElementById(SCRIPT.appID + '_mw_masthead')) return;

  refreshGlobalStats();
  refreshSettings();

  // Find the visible inner page.
  var pageChanged = false;
  var prevPageElt = innerPageElt;
  var contentRowElt = document.getElementById(SCRIPT.appID + '_content_row');
  var result = xpath('./*[contains(@id, "' + SCRIPT.appID + '_inner_page")]', contentRowElt);
  for (var i = 0, iLength=result.snapshotLength; i < iLength; i++) {
    var elt = result.snapshotItem(i);
    if (elt.style.display != 'none') {
      innerPageElt = elt;
      break;
    }
  }
  if (!innerPageElt) return;

  // Make sure our private AJAX page exists and isn't visible.
  var ajaxID = SCRIPT.appID + '_' + SCRIPT.ajaxPage;
  var elt = xpathFirst('//div[@id="' + ajaxID + '"]');
  if (!elt) {
    elt = makeElement('div', innerPageElt.parentNode, {'id':ajaxID});
  }
  elt.style.display = 'none';

  // Determine if the displayed page has changed.
  if (!xpathFirst('./div[@id="ap_inner"]', innerPageElt)) {
    setListenContent(false);
    makeElement('div', innerPageElt, {'id':'ap_inner', 'style':'display: none'});
    setListenContent(true);
    DEBUG('New inner page content: ' + innerPageElt.id);
    pageChanged = true;
  } else if (prevPageElt != innerPageElt) {
    DEBUG('Switched inner page to: ' + innerPageElt.id);
    pageChanged = true;
  }

  // Handle changes to the inner page.
  if (pageChanged) {
    try {
      innerPageChanged();
    } catch(ex) {
      addToLog('warning Icon', ex);
    }
  }
}

function setModificationTimer() {
  if (modificationTimer) window.clearTimeout(modificationTimer);
  modificationTimer = window.setTimeout(handleModificationTimer, 500);
  //GM_log('Modification timer set.');
}

function handleDOMSubtreeModified(e) {
  if (ignoreElement(e.target)) return;
  logElement(e.target, 'subtree');
}

function handleContentModified(e) {
  if (ignoreElement(e.target)) return;
  //logElement(e.target, 'content');
  setModificationTimer();
}

function handlePublishNotificationsInternal(e) {
  //if (!ignoreElement(e.target)) logElement(e.target, 'handlePublishNotifications');

  var popup = e.target;

  if (popup.id == 'pop_content') {
    if (popup.innerHTML.match(/no network/i)) {
      // Close "No Network" popups.
      var elt = xpathFirst('.//input[@value="Okay"]', popup);
      if (elt) {
        clickElement(elt);
        DEBUG('Clicked to skip "no network" popup.');
      }
    }

    var skipPost = xpathFirst('.//input[@value="Skip"]', popup);
    if (skipPost) {
      // Gift skipping.
      var giftCheck = xpathFirst('.//div[@class="CopyTitle" and contains(text(), "sent")]/a[contains(@href, "sendgiftshort")]', popup);
      if (giftCheck && GM_getValue('autoGiftSkipOpt') == 'checked') {
        clickElement(skipPost);
        DEBUG('Clicked to skip gift publishing.');
        return;
      }

      // Job Help skipping.
      var jobHelpCheck = xpathFirst('.//div[@class="CopyTitle" and contains(text(),"requested help")]', popup);
      if (jobHelpCheck && GM_getValue('autoAskJobHelp') == 'checked') {
        var msg = GM_getValue('autoAskJobHelpMessage');
        var msgElt = document.getElementById("feedform_user_message");
        var publishPost = xpathFirst('.//input[@value="Publish"]', popup);
        if (msg && msgElt && publishPost) {
          msgElt.value = msg;
          clickElement(publishPost);
          DEBUG('Clicked to publish job help request.');
          return;
        } else {
          clickElement(skipPost);
          DEBUG('Clicked to skip job help request publishing.');
          return;
        }
      }

      // Lotto skipping.
      var lottoCheck = xpathFirst('.//div[@class="CopyTitle"]/text()[contains(., "prizes are given away each week")]', popup);
      if (lottoCheck && GM_getValue('autoLottoOpt') == 'checked') {
        clickElement(skipPost);
        DEBUG('Clicked to skip lotto publishing.');
        return;
      }
    }
  }

  if (popup.parentNode &&
      popup.parentNode.className.indexOf('pop_content') != -1) {
    if (popup.innerHTML.match(/minor issue/i)) {
      // Close "minor issue" popups.
      var elt = xpathFirst('.//input[@value="Okay"]', popup);
      if (elt) {
        clickElement(elt);
        DEBUG('Clicked to skip "minor issue" popup.');
      }
    }
  }
}

function handlePublishNotifications(e) {
  // Wrapping the call with setTimeout is necessary to make Greasemonkey
  // API calls available (such as GM_getValue).
  setTimeout(function() { handlePublishNotificationsInternal(e) }, 0);
}

function handleFBNotificationsInternal(e) {
  //logElement(e.target, 'handleFBNotifications');

  var parentElt = e.target.parentNode;
  if (!parentElt) return;

  // Watch for sent notifications and get rid of some of them.
  if (parentElt.className == 'Beeps') {
    filterNotifications(e.target);
  }
}

function handleFBNotifications(e) {
  // Wrapping the call with setTimeout is necessary to make Greasemonkey
  // API calls available (such as GM_getValue).
  setTimeout(function() { handleFBNotificationsInternal(e) }, 0);
}

// Turns on/off the high-level event listener for the game.
function setListenContent(on) {
  var elt = document.getElementById('app_content_10979261223');
  if (!elt) return;
  if (on) {
    elt.addEventListener('DOMSubtreeModified', handleContentModified, false);
  } else {
    elt.removeEventListener('DOMSubtreeModified', handleContentModified, false);
  }
}

// Turns on/off the event listener for publish pop-ups.
function setListenAutoSkip(on) {
  if (!document.body) return;
  if (on) {
    document.body.addEventListener('DOMNodeInserted', handlePublishNotifications, false);
  } else {
    document.body.removeEventListener('DOMNodeInserted', handlePublishNotifications, false);
  }
}

// Turns on/off the event listener for Facebook notifications.
function setListenFBNotifications(on) {
  var elt = document.getElementById('presence_bar_right');
  if (!elt) return;
  if (on) {
    elt.addEventListener('DOMNodeInserted', handleFBNotifications, false);
  } else {
    elt.removeEventListener('DOMNodeInserted', handleFBNotifications, false);
  }
}

// Turns on/off the event listener for the stats section of the page.
function setListenStats(on) {
  var elt = document.getElementById(SCRIPT.appID + '_game_stats');
  if (!elt) return;
  if (on) {
    elt.addEventListener('DOMNodeInserted', statsInserted, false);
  } else {
    elt.removeEventListener('DOMNodeInserted', statsInserted, false);
  }
}

function statsInserted(e) {
  //if (!ignoreElement(e.target)) logElement(e.target, 'statsInserted');

  // Check for a change in a particular statistic. This is where we'll
  // notice some types of changes that happen without user or script
  // actions, such as earning energy.
  var parentElt = e.target.parentNode;
  if (!parentElt) return;
  if (parentElt == energyElt) {
    energy = parseInt(e.target.nodeValue);
    energyElt.style.textDecoration = (energy == maxEnergy)? 'blink' : 'none';
    setLevelUpRatio();
  } else if (parentElt == staminaElt) {
    var newStamina = parseInt(e.target.nodeValue);
    if (stamina != newStamina) {
      stamina = newStamina;
      staminaFlag = true;
    }
    staminaElt.style.textDecoration = (stamina == maxStamina)? 'blink' : 'none';
  } else if (parentElt == cashNYElt && city == NY) {
    cash[NY] = parseCash(e.target.nodeValue);
  } else if (parentElt == cashCubaElt && city == CUBA) {
    cash[CUBA] = parseCash(e.target.nodeValue);
  } else if (parentElt == cashMoscowElt && city == MOSCOW) {
    cash[MOSCOW] = parseCash(e.target.nodeValue);
  } else if (parentElt == healthElt) {
    // NOTE: At one time, health was updated on with a timer. Leave
    //       this here in case it goes back to being that way.
    health = parseInt(e.target.nodeValue);
    healthElt.style.textDecoration = (health > 19 && health < 29)? 'blink' : 'none';
  }
}

function innerPageChanged() {
  // Reset auto-reload (if enabled).
  autoReload();

  // Customize the display.
  setListenContent(false);
  customizeMasthead();
  customizeStats();
  customizeNames();
  if (!customizeHome() &&
      !customizeJobs() &&
      !customizeProfile() &&
      !customizeHitlist()) {
    if (onPropertyNav()) {
      // Property
      propertyGetDamage(innerPageElt);
      propertyGet();
    } else {
      customizeFight();
    }
  }
  setListenContent(true);

  // Get tmp parameter
  getTmpParameter();

  // Check for deleted news.
  if (xpathFirst('.//td[text()="News deleted"]', innerPageElt)) {
    DEBUG('The player updates were cleared.');
    GM_setValue('logPlayerUpdatesCount', 0);
  }

  // If a click action was taken, check the response.
  if (clickAction) {
    var action = clickAction;
    var context = clickContext;
    clickAction = undefined;
    clickContext = undefined;
    if (!logResponse(innerPageElt, action, context)) {
      // No further action was taken. Kick off auto-play.
      doAutoPlay();
    }
  } else {
    // Kick off auto-play.
    doAutoPlay();
  }
}

function refreshGlobalStats() {
  // NOTE: In this function, only elements displayed in and above the
  //       navigation bar should be examined. Everything in the inner page
  //       (what is displayed below the navigation bar) should instead be
  //       examined via innerPageChanged().

  var cityElt = document.getElementById(SCRIPT.appID + '_mw_city_wrapper');
  if (!cityElt) return false;

  // Set all the element globals. They change.
  cashNYCElt = document.getElementById(SCRIPT.appID+'_user_cash_nyc');
  cashCubaElt = document.getElementById(SCRIPT.appID+'_user_cash_cuba');
  cashMoscowElt = document.getElementById(SCRIPT.appID+'_user_cash_moscow');
  healthElt = document.getElementById(SCRIPT.appID+'_user_health');
  maxHealthElt = document.getElementById(SCRIPT.appID+'_user_max_health');
  energyElt = document.getElementById(SCRIPT.appID+'_user_energy');
  maxEnergyElt = document.getElementById(SCRIPT.appID+'_user_max_energy');
  staminaElt = document.getElementById(SCRIPT.appID+'_user_stamina');
  maxStaminaElt = document.getElementById(SCRIPT.appID+'_user_max_stamina');
  influenceElt = document.getElementById(SCRIPT.appID+'_user_influence');
  maxInfluenceElt = document.getElementById(SCRIPT.appID+'_user_max_influence');
  levelElt = document.getElementById(SCRIPT.appID+'_user_level');
  curExpElt = document.getElementById(SCRIPT.appID+'_user_experience');
  lvlExpElt = document.getElementById(SCRIPT.appID+'_exp_for_next_level');

  // Update basic player information.
  switch(cityElt.className){
    case 'mw_city1':
     city = NY;
     cash[NY] = parseCash(cashNYCElt.innerHTML);
     break;
  case 'mw_city2':
     city = CUBA;
     cash[CUBA] = parseCash(cashCubaElt.innerHTML);
     break;
  case 'mw_city3':
     city = MOSCOW;
     cash[MOSCOW] = parseCash(cashMoscowElt.innerHTML);
     break;
  }

  health = parseInt(healthElt.innerHTML);
  maxHealth = parseInt(maxHealthElt.innerHTML);
  energy = parseInt(energyElt.firstChild.nodeValue);
  maxEnergy = parseInt(maxEnergyElt.innerHTML);
  stamina = parseInt(staminaElt.firstChild.nodeValue);
  maxStamina = parseInt(maxStaminaElt.innerHTML);
  if (maxInfluenceElt) {
    influence = parseInt(influenceElt.firstChild.nodeValue);
    maxInfluence = parseInt(maxInfluenceElt.innerHTML);
  }

  // Remove this when influence stat is released to public
  if (isNaN(influence))
    influence = 0;
  if (isNaN(maxInfluence))
    maxInfluence = 0;

  level = parseInt(levelElt.innerHTML);
  curExp = parseInt(curExpElt.innerHTML);
  lvlExp = parseInt(lvlExpElt.innerHTML);
  ptsToNextLevel = lvlExp - curExp;

  // Get the mafia size and pending invites.
  // NOTE: Using contains() for compatibility with "Exp Remaining" script.
  var mafiaLinks = xpath('//div[contains(@class, "mafia_link")]//a');
  mafia = mafiaLinks.snapshotItem(1);
  mafia = document.getElementById(SCRIPT.appID + '_user_group_size');
  if (mafia) {
    mafia = parseInt(mafia.innerHTML.untag());
  }
  if (!mafia || mafia < 1) {
    addToLog('warning Icon', 'BUG DETECTED: Unable to read mafia size.');
  }
  invites = mafiaLinks.snapshotItem(2);
  if (invites && invites.innerHTML.untag().match(/\+(\d+)/)) {
    invites = parseInt(RegExp.$1);
  } else {
    invites = 0;
  }

  // Get the skill points waiting to be spent.
  var skillElt = document.getElementById(SCRIPT.appID+'_user_skill');
  if (skillElt) {
    stats = parseInt(skillElt.innerHTML);
    if (isNaN(stats)) {
      stats = 0;
    } else if (stats > 1) {
      GM_setValue('restAutoStat', 0);
    }
  } else {
    stats = 0;
  }

  // Show congratulations if level has increased.
  if (running && level > GM_getValue('currentLevel')) {
    GM_setValue('currentLevel', level);
    addToLog('experience Icon', '<span style="color:#00FFCC;"> Congratulations on reaching level <strong>' + level + '</strong>!</span>');
    GM_setValue('restAutoStat', 0);
  }

  // Trick auto-buy into checking the property page if mafia has grown.
  if (running && mafia && mafia != GM_getValue('currentMafia')) {
    GM_setValue('currentMafia', mafia);
    GM_setValue('buyCost', 1);
  }

  //ATK
  // Check if hourly stats need updating.
  if (GM_getValue('hourlyStatsOpt') == 'checked') {
    var currentTime = new Date();
    if (GM_getValue('hourOfDay') != currentTime.getHours()) {
      updateHourlyStats();
    }
  }

  return true;
}

function refreshSettings() {
  // NOTE: In this function, only elements displayed in and above the
  //       navigation bar should be examined. Everything in the inner page
  //       (what is displayed below the navigation bar) should instead be
  //       examined via innerPageChanged().

  // Determine the minimum stamina to keep on hand (the "stamina floor").
  staminaFloor = Math.round(maxStamina * (1 - parseInt(GM_getValue('selectStaminaKeep', 0)) * .10));
  if (staminaFloor >= maxStamina) {
    // Subtract one or else fight/rob will never run.
    staminaFloor = maxStamina - 1;
  }

  // Determine the threshold for spending stamina (the "stamina ceiling").
  staminaCeiling = Math.round(maxStamina * (1 - parseInt(GM_getValue('selectStaminaUse', 0)) * .10));

  if (running && GM_getValue('staminaSpend') == 'checked') {
    // Log any change to the floor.
    if (staminaFloor != GM_getValue('staminaFloorLast')) {
      GM_setValue('staminaFloorLast', staminaFloor);
      if (staminaFloor > 1) {
        addToLog('info Icon', staminaIcon + '<span style="color:#04B4AE;";> Stamina is set to keep above <strong>' + staminaFloor + '</strong>.</span>');
      }
    }

    // Log any change to the ceiling.
    if (staminaCeiling != GM_getValue('staminaCeilingLast')) {
      GM_setValue('staminaCeilingLast', staminaCeiling);
      if (staminaCeiling > staminaFloor) {
        addToLog('info Icon', staminaIcon + '<span style="color:#04B4AE;";> Stamina refill level set to <strong>' + staminaCeiling + '</strong>.</span>');
      }
    }

    // Determine whether stamina spending needs to start or stop.
    if (stamina >= staminaCeiling && !GM_getValue('useStaminaStarted')) {
      GM_setValue('useStaminaStarted', true);
    } else if (stamina <= staminaFloor && staminaCeiling > staminaFloor &&
               GM_getValue('useStaminaStarted')) {
      GM_setValue('useStaminaStarted', false);
      addToLog('info Icon', staminaIcon + '<span style="color:#04B4AE;";> Refilling stamina to <strong>' + staminaCeiling + '</strong>.</span>');
    }
  }

  // Set if auto-burn can be used.
  autoStamBurnif = GM_getValue('allowStaminaToLevelUp') == 'checked' &&
                   ptsToNextLevel < stamina * getStaminaGainRate() +
                                    energy * getEnergyGainRate();

  // Auto-pause reset
  if (GM_getValue('autoPauseActivated') === true &&
      GM_getValue('autoPauseBefore') == 'checked' &&
      GM_getValue('autoPauselvlExp') < lvlExp) {
    GM_setValue('autoPauselvlExp', lvlExp);
    GM_setValue('autoPauseActivated', false);
  }

  // Auto-pause logic
  if (running && GM_getValue('autoPause') == 'checked') {
    if (GM_getValue('autoPauseBefore') == 'checked' &&
        GM_getValue('autoPauseExp', '') >= lvlExp - curExp &&
        GM_getValue('autoPauseActivated', false) === false) {
      addToLog('pause Icon', 'Auto-pause in effect. Experience threshold reached.');
      GM_setValue('autoPauseActivated', true);
      pause();
    } else if (GM_getValue('autoPauseAfter') == 'checked' &&
               GM_getValue('autoPauselvlExp', '') < lvlExp) {
      addToLog('pause Icon', 'Auto-pause in effect. Leveled up.');
      GM_setValue('autoPauselvlExp', lvlExp);
      pause();
    }
  }
}

function getStaminaGainRate() {
  var expGained    = GM_getValue('totalExpInt', 0);
  var staminaSpent = GM_getValue('fightWinCountInt', 0) +
                     GM_getValue('fightLossCountInt', 0) +
                     GM_getValue('robWinCountInt', 0) +
                     GM_getValue('robLossCountInt', 0) +
                     GM_getValue('hitmanWinCountInt',0) +
                     GM_getValue('hitmanLossCountInt',0);
  if (!expGained || !staminaSpent) return 0;

  return expGained / staminaSpent;
}

function getEnergyGainRate() {
  var rate = parseFloat(GM_getValue('estimateJobRatio', '1.0'));
  return rate? rate : 0;
}

function checkLanguage() {
  if (document.documentElement.lang == 'en') return;

  DEBUG('Language is "' + document.documentElement.lang + '".');
  DEBUG('Unfortunately, only the English version of the game is fully supported. If you experience problems, set your Facebook language to English and try again.');
}

function customizeLayout() {
  // Left align.
  if (GM_getValue('leftAlign') == 'checked') {
    var mainFrame = xpathFirst('//div[@class="UIStandardFrame_Container clearfix"]');
    if (mainFrame) {
      mainFrame.setAttribute("style", "margin:0", 0);
    }
  }

  // Deal with ads.
  if (GM_getValue('hideAds') == 'checked') {
    var adsTop = xpathFirst('//iframe[contains(@src, "zbar")]');
    if (adsTop) {
      adsTop.setAttribute("style", "margin:0; height:0; display:none", 0);
    }
    var adsRight = xpathFirst('//div[@class="UIStandardFrame_SidebarAds"]');
    if (adsRight) {
      adsRight.setAttribute("style", "margin:0; height:0; display:none", 0);
    }
  }

  // Deal with the email bar.
  if (GM_getValue('moveEmailBar') == 'checked') {
    var emailBar = xpathFirst('//table[@class="fb_email_prof_header"]');
    var layoutElt = xpathFirst('//div[@class="UIStandardFrame_Content"]');
    if (emailBar && layoutElt)
      layoutElt.appendChild(emailBar);
  }
}

function customizeMasthead() {
  if (document.getElementById('ap_menu')) return;

  // Get the masthead.
  var mastheadElt = document.getElementById(SCRIPT.appID + '_mw_masthead');
  if (!mastheadElt) return;

  // Set custom styles with CSS.
  if (!document.getElementById('nodeInsertedCss')) {
    makeElement('style', document.getElementsByTagName('head')[0], {'id':'nodeInsertedCss', 'type':'text/css'}).appendChild(document.createTextNode(
      '#ap_menu span:hover{text-decoration:underline}'+
      '#ap_menu span{font-size: 12px; font-weight: bold; cursor: pointer; color: #FFD927}' +
      '.ap_optgroup1 {background-color: #FFFF77; text-align: center; color: #000000; font-weight: bold; font-size: small}' +
      '.ap_optgroup2 {background-color: #996633; text-align: center; color: #FFFFFF; font-size: small}' +
      '.ap_option    {font-size: small; cursor: default;}' +
      '.ap_option:hover {background-color:#660000;}'
    ));
  }

  // Make a container for the autoplayer menu.
  var mwapTitle = 'MWAP ' + SCRIPT.version + ' (Build ' + SCRIPT.build + ')';
  makeElement('div', mastheadElt, {'style':'position: absolute; top: 24px; right: 17px; text-align: left; font-size: 11px; font-weight: bold; color: #FFFFFF'}).appendChild(document.createTextNode(mwapTitle));
  var menuElt = makeElement('div', mastheadElt, {'id':'ap_menu', 'style':'position: absolute; top: 38px; right: 17px; text-align: left;'});

  // Settings Link
  menuElt.appendChild(document.createTextNode(' | '));
  var lobjAutoPlay = makeElement('span', menuElt, {'id':'autoPlay'});
  lobjAutoPlay.appendChild(document.createTextNode('Settings'));
  lobjAutoPlay.addEventListener('click', toggleSettings, false);

  // View log button.
  menuElt.appendChild(document.createTextNode(' | '));
  var lobjViewLogButton = makeElement('span', menuElt);
  lobjViewLogButton.appendChild(document.createTextNode('Log'));
  lobjViewLogButton.addEventListener('click', showMafiaLogBox, false);

  // Show resume or paused based on if we are running or not.
  updateMastheadMenu();
}

function customizeStats() {
  // Don't watch the stats area while we're making changes to it.
  setListenStats(false);

  // Make health icon clickable for instant healing.
  var healLinkElt = document.getElementById('ap_heal');
  var healImgElt = xpathFirst('//img[@alt="Health"]');
  if (healImgElt && !healLinkElt) {
    healLinkElt = makeElement('a', null, {'id':'ap_heal', 'title':'Click to heal immediately.'})
    healImgElt.parentNode.insertBefore(healLinkElt, healImgElt);
    healLinkElt.appendChild(healImgElt);
  }

  if (healLinkElt) {
    healLinkElt.href = 'http://apps.facebook.com/' + SCRIPT.name +
                       SCRIPT.controller + 'hospital' +
                       SCRIPT.action + 'heal' +
                       SCRIPT.city + (city + 1);

    // Substitute the "hide" icon if currently hiding in the hospital.
    var hideImgElt = healLinkElt.childNodes[1];
    if (running && healImgElt && health < 20 &&
        GM_getValue('hideInHospital') == 'checked') {
      healImgElt.style.display = 'none';
      if (!hideImgElt) {
        hideImgElt = makeElement('img', healLinkElt, {'class':'icon', 'width':'16', 'height':'16', 'title':'Currently hiding in the hospital. Click to heal immediately.', 'src':stripURI(hideIcon)});
      }
      hideImgElt.style.display = '';
    } else if (hideImgElt) {
      hideImgElt.style.display = 'none';
      healImgElt.style.display = '';
    }

    // Substitute AJAX navigation if code is available.
    var hospitalElt = xpathFirst('//a[@class="heal_link"]');
    if (hospitalElt) {
      healLinkElt.setAttribute("onclick", hospitalElt.getAttribute("onclick").replace(/view/, 'heal'));
      if (!running) {
        // Make instant heal work without switching pages.
        healLinkElt.setAttribute("onclick", healLinkElt.getAttribute("onclick").replace(/'inner_page'/, "'" + SCRIPT.ajaxPage + "'"));
      }
    }
  }

  // Show points until next level.
  // FIXME: Assumes English.
  var elt = xpathFirst('//span[@class="stat_title" and contains(text(), "Experience")]');
  if (elt) {
    elt.innerHTML = 'Experience (' + (ptsToNextLevel > 0? '-' : '+') +
                    Math.abs(ptsToNextLevel) + ')';
  }

  // Blink maxed out energy or stamina.
  energyElt.style.textDecoration = (energy == maxEnergy)? 'blink' : 'none';
  staminaElt.style.textDecoration = (stamina == maxStamina)? 'blink' : 'none';

  // Blink dangerous health levels.
  healthElt.style.textDecoration = (health > 19 && health < 29)? 'blink' : 'none';

  // Once health is below 20, set the timer (this is for the conditional healing logic)
  if (health < 20 && GM_getValue('healWaitStarted') != true) {
    setGMTime('healWaitTime', '05:00');
    GM_setValue('healWaitStarted', true);
  }

  setListenStats(true);
}

function customizeNames() {
  var elts = $x('.//a[contains(@onclick, "user=")]', innerPageElt);
  for (var i = 0, iLength=elts.length; i < iLength; ++i) {
    var elt = elts[i];
    if (!elt.innerHTML.replace(/\xAD/g, '').trim()) {
      if (elt.getAttribute('onclick').match(/user=(\d+)/)) {
        elt.innerHTML = chickenIcon + ' Chicken ' + RegExp.$1;
      } else {
        elt.innerHTML = chickenIcon + ' Chicken';
      }
    }
  }

  var elts = $x('.//span[contains(@id, "_fight_view_name_")]', innerPageElt);
  for (var i = 0, iLength=elts.length; i < iLength; ++i) {
    var elt = elts[i];
    if (!elt.innerHTML.untag().trim()) {
      elt.innerHTML = chickenIcon + ' Chicken';
    }
  }
}

function customizeHome() {
  if (!onHome()) return false;

  // Get the wheelman bonus.
  var elt = xpathFirst('.//span[@class="good" and contains(text(), "Less Energy")]', innerPageElt);
  if (elt && elt.innerHTML.untag().match(/(\d+)%/)) {
    var bonus = parseInt(RegExp.$1);
    if (bonus && bonus !== GM_getValue('selectEnergyBonus')) {
      GM_setValue('selectEnergyBonus', bonus);
      DEBUG('Set Wheelman bonus to ' + GM_getValue('selectEnergyBonus') + '%');
    }
  }

  // Get the mastermind bonus.
  var elt = xpathFirst('.//span[@class="good" and contains(text(), "More Experience")]', innerPageElt);
  if (elt && elt.innerHTML.untag().match(/(\d+)%/)) {
    var bonus = parseInt(RegExp.$1);
    if (bonus && bonus !== GM_getValue('selectExpBonus')) {
      GM_setValue('selectExpBonus', bonus);
      DEBUG('Set Mastermind bonus to ' + GM_getValue('selectExpBonus') + '%');
    }
  }

  // Is an energy pack waiting to be used?
  energyPackElt = xpathFirst('.//span[@class="sexy_pack_use" and contains(text(), "Use energy pack")]', innerPageElt);
  energyPack = energyPackElt? true : false;

  // Display a message next to the energy pack button.
  if (energyPackElt) {
    var energyGainRate = getEnergyGainRate();
    var ptsFromEnergyPack = maxEnergy * 1.25 * energyGainRate;
    var ptsNeeded = ptsToNextLevel - energy * energyGainRate -
                    stamina * getStaminaGainRate();
    var txt = ' XP from Energy Pack = ' + parseInt(ptsFromEnergyPack) +
              ', Projected XP needed = ' + parseInt(ptsNeeded);
    var linkElt = energyPackElt.parentNode;
    linkElt.parentNode.appendChild(document.createElement('br'));
    linkElt.parentNode.appendChild(document.createTextNode(txt));
  }

  // Fetch Player Stats
  getPlayerStats();

  return true;
}

// Get the tmp parameter from homepage
function getTmpParameter(c) {
  var pJavaScripts = xpath(".//script[@type='text/javascript']", c || document);
  var tmpParam;

  // Start from the last (bottom page code)
  for (var i=pJavaScripts.snapshotLength - 1; i >= 0; i--) {
    tmpParam = pJavaScripts.snapshotItem(i).innerHTML.match(/&xw_action=attack&xw_city=\d+&tmp=([^&"'<]+)/);
    if (tmpParam) {
      fightTmp = tmpParam[1];
      //GM_log('tmp=' + fightTmp);
      return true;
    }
  }
}

function getPlayerStats() {
  var statElt = $x('.//*[@class="profile_stat_number"]', innerPageElt);

  // Fetch defense and attack values from old home format
  if (!(statElt == null)) {
    if (!(statElt[0] == null))
      curAttack  = parseInt(statElt[0].innerHTML);
    if (!(statElt[1] == null))
      curDefense = parseInt(statElt[1].innerHTML);
  }

  // Some players would have the beta homepage (flash updates)
  // Try retrieving Attack/Defense details from mw_* tags in javascript
  if (isNaN (curDefense) || isNaN(curAttack)) {
    var pJavaScripts = xpath("//script[@type='text/javascript']");
    var tempStat;

    for (var i=0, iLength=pJavaScripts.snapshotLength; i < iLength; ++i ) {
      tempStat = pJavaScripts.snapshotItem(i).innerHTML.match(/"mw_attack", "([0-9]+)/);
      if (tempStat) {
        curAttack = tempStat[1];
      }
      tempStat = pJavaScripts.snapshotItem(i).innerHTML.match(/"mw_defense", "([0-9]+)/);
      if (tempStat) {
        curDefense = tempStat[1];
        return true;
      }
    }
  }

  return true;
}

function customizeProfile() {
  // Extra options for the profile page.
  var statsTable = xpathFirst('.//td[@class="stats_left"]', innerPageElt);
  if (!statsTable) return false;

  if (xpathFirst('.//a[contains(text(), "Sucker Punch")]', innerPageElt)) {
    var suckerPunch = xpathFirst('.//a[contains(text(), "Sucker Punch")]', innerPageElt);
    var statsDiv = suckerPunch.parentNode;
    var elt = xpathFirst('.//li[contains(@class, "tab_on")]//a[contains(text(), "Profile")]', innerPageElt);
    if (statsDiv && elt && elt.getAttribute('onclick').match(/user=(\d+)/)) {
      var id = RegExp.$1;
      //makeElement('br', statsDiv);
      makeElement('a', statsDiv, {'href':'http://www.facebook.com/profile.php?id=' + id}).appendChild(document.createTextNode('Facebook Profile'));
      statsDiv.appendChild(document.createTextNode(' | '));
      makeElement('a', statsDiv, {'href':'http://www.facebook.com/addfriend.php?id=' + id}).appendChild(document.createTextNode('Add as Friend'));
      statsDiv.appendChild(document.createTextNode(' | '));
      makeElement('a', statsDiv, {'href':'http://apps.facebook.com/' + SCRIPT.name + '/status_invite.php?from=' + id}).appendChild(document.createTextNode('Add to Mafia'));
      statsDiv.appendChild(document.createTextNode(' | '));
      makeElement('a', statsDiv, {'href':'http://apps.facebook.com/' + SCRIPT.name + SCRIPT.controller + 'group' + SCRIPT.action + 'view' + SCRIPT.city + (city + 1) + '&promote=yes&uid=' + id}).appendChild(document.createTextNode('Promote'));
      statsDiv.appendChild(document.createTextNode(' | '));
      var el = makeElement('a', statsDiv, {'id':id});
      var fightList = getSavedList('fightList');
      if (fightList.indexOf(id) != -1) {
        el.appendChild(document.createTextNode('Remove from Fight List'));
        el.addEventListener('click', clickFightListRemove, false);
      } else {
        el.appendChild(document.createTextNode('Add to Fight List'));
        el.addEventListener('click', clickFightListAdd, false);
      }
      statsDiv.appendChild(document.createTextNode(' | '));
      var el = makeElement('a', statsDiv, {'id':id});
      var robList = getSavedList('robList');
      if (robList.indexOf(id) != -1) {
        el.appendChild(document.createTextNode('Remove from Rob List'));
        el.addEventListener('click', clickRobListRemove, false);
      } else {
        el.appendChild(document.createTextNode('Add to Rob List'));
        el.addEventListener('click', clickRobListAdd, false);
      }

      //makeElement('br', statsDiv);
      //el = makeElement('a', statsDiv, {'id':'gift' + id});
      //el.appendChild(document.createTextNode('Add as gift recipient'));
      //el.addEventListener('click', saveRecipientInfo, false);

      //statsDiv.appendChild(document.createTextNode(' | '));
      //makeElement('a', statsDiv, {'href':'http://apps.facebook.com/' + SCRIPT.name + SCRIPT.controller + 'group' + SCRIPT.action + 'energy' + SCRIPT.city + (city + 1) + '&fid=' + id}).appendChild(document.createTextNode('Send Energy Pack'));
    }

    // Other profile customizations: add counts of weapons, armor, and
    // vehicles if on our own profile page.
    var currentPageText = xpath('.//ul[@class="nice_list items_list clearfix"]', innerPageElt);
    var otherPerson = xpath('.//span[@class="levels"]', innerPageElt);
    if ((otherPerson.snapshotLength > 0) && (otherPerson.snapshotLength < 5)) {
      for (zz = 0, zzLength=otherPerson.snapshotLength; zz < zzLength; zz++) {
        if ((otherPerson.snapshotItem(zz).innerHTML == '(Your Character)') && (currentPageText.snapshotLength > 0)) {
          profileFix();
          break;
        }
      }
    }

    return true;
  }
}

function customizeJobs() {
  // Extras for jobs pages.
  var jobTable = xpathFirst('.//table[@class="job_list"]', innerPageElt);
  if (!jobTable) return false;

  var availableJobs = eval(GM_getValue("availableJobs", "({0:{},1:{},2:{}})"));
  var masteredJobs = eval(GM_getValue("masteredJobs", "({0:{},1:{},2:{}})"));
  var currentTab = currentJobTab();
  availableJobs[city][currentTab] = [];
  masteredJobs[city][currentTab] = [];

  // Display an experience to energy payoff ratio for each job.
  var bestJobs = [], worstJobs = [];
  var bestRatio = 0, worstRatio = 10;
  var reselectJob = false;
  var jobInfo = xpath('.//td[@class="job_name"]', innerPageElt);
  var energies = xpath('.//td[@class="job_energy"]/span[@class="bold_number"]', innerPageElt);
  var rewards = xpath('.//td[@class="job_reward"]/span[@class="bold_number"]', innerPageElt);
  var requiredItems = xpath('.//td[@class="job_required_items"]', innerPageElt);
  var jobButton = xpath('.//td[@class="job_action"]', innerPageElt);
  for (var i = 0, iLength = energies.snapshotLength; i < iLength; ++i) {
    // Determine available jobs
    if (GM_getValue('multipleJobs') == 'checked' &&
        GM_getValue('isRunning') === true) {
      var jobName = jobInfo.snapshotItem(i).innerHTML.split('<br>')[0].trim();
      var jobMatch = missions.searchArray(jobName, 0)[0];

      if (jobMatch) {
        // FIXME: Try to buy the required items if the item is store bought.
        //        If job loot, should we add the job that drops it on selectMissionMultiple?

        // Ignore mastered jobs
        if (missions[jobMatch][9] == true &&
            jobInfo.snapshotItem(i).innerHTML.indexOf('Mastered') != -1) {
          masteredJobs[city][currentTab].push(jobMatch);
          DEBUG('The job ' + missions[jobMatch][0] + ' is already 100%. Adding to ignore list.');
        }

        // Ignore jobs with item requirements/locked jobs
        if (jobButton.snapshotItem(i).innerHTML.indexOf('sexy_button_locked') == -1) {
          if(requiredItems.snapshotItem(i).innerHTML.indexOf('need_item') == -1) {
            DEBUG('Available Job: ' + missions[jobMatch][0] + '(' + jobMatch + ')');
            availableJobs[city][currentTab].push(jobMatch);
          } else {
            DEBUG('Items needed in Job: ' + missions[jobMatch][0] + '(' + jobMatch + ')');
            // FIXME: Buy code here
          }
        } else {
          DEBUG('Job ' + missions[jobMatch][0] + '(' + jobMatch + ') is not available yet. Skipping.');
        }
      }
    }

    elt = energies.snapshotItem(i);
    var cost = parseInt(elt.firstChild.nodeValue);
    var reward = parseInt(rewards.snapshotItem(i).firstChild.nodeValue);
    var ratio = Math.round(reward / cost * 100) / 100;

    makeElement('br', elt.parentNode);
    makeElement('span', elt.parentNode, {'style':'color:#666666; font-size: 11px'}).appendChild(document.createTextNode('Pays ' + ratio + 'x'));

    // Keep track of the best & worst payoffs.
    if (ratio > bestRatio) {
      bestRatio = ratio;
      bestJobs = [elt];
    } else if (ratio == bestRatio) {
      bestJobs.push(elt);
    }
    if (ratio < worstRatio) {
      worstRatio = ratio;
      worstJobs = [elt];
    } else if (ratio == worstRatio) {
      worstJobs.push(elt);
    }

    // Calculate time left for each job and display under the do job button
    var timePerEnergy = GM_getValue('isManiac') == 'checked' ? 3 : 5;
    timePerEnergy = GM_getValue('hasHelicopter') == 'checked' ? timePerEnergy - .5: timePerEnergy;
    timePerEnergy = GM_getValue('hasGoldenThrone') == 'checked' ? timePerEnergy/2: timePerEnergy;
    if (cost > energy) {
      jobTimeLeft = (cost - energy) * timePerEnergy;
      if (jobTimeLeft < 60)
        jobTimeLeftText = 'Time: < ' + (Math.round((jobTimeLeft) * 10) / 10) + ' min';
      else {
        jobTimeLeft = Math.round((jobTimeLeft/60) * 100) / 100;
        if (jobTimeLeft < 24)
          jobTimeLeftText = 'Time: < ' + jobTimeLeft + ' hr';
        else
          jobTimeLeftText = 'Time: < ' + Math.round(jobTimeLeft/24) + ' days';
      }
    } else {
      jobTimeLeftText = 'Time: 0 min';
    }
    makeElement('br', jobButton.snapshotItem(i));
    makeElement('span', jobButton.snapshotItem(i), {'style':'color:#666666; font-size: 11px'}).appendChild(document.createTextNode(jobTimeLeftText));
  }

  // Highlight the best and worst jobs.
  if (worstRatio != bestRatio) {
    while (bestJobs.length) {
      elt = bestJobs.pop().parentNode;
      makeElement('br', elt);
      elt = makeElement('span', elt, {'style':'color:#52E259; font-size: 11px'});
      makeElement('img', elt, {'src':stripURI(goodIcon), 'width':'12', 'height':'12', 'style':'vertical-align:middle'});
      elt.appendChild(document.createTextNode(' BEST'));
    }
    while (worstJobs.length) {
      elt = worstJobs.pop().parentNode;
      makeElement('br', elt);
      elt = makeElement('span', elt, {'style':'color:#EC2D2D; font-size: 11px'});
      makeElement('img', elt, {'src':stripURI(badIcon), 'width':'12', 'height':'12', 'style':'vertical-align:middle'});
      elt.appendChild(document.createTextNode(' WORST'));
    }
  }

  // Show the experience to energy ratio needed to level up.
  elt = makeElement('div', null, {'id':'level_up_ratio', 'style':'text-align:center; display:none'});
  makeElement('img', elt, {'src':stripURI(infoIcon), 'style':'vertical-align:middle'});
  elt.appendChild(document.createTextNode(''));
  jobTable.parentNode.insertBefore(elt, jobTable);

  setLevelUpRatio();
  if(reselectJob) canMission();
  GM_setValue("availableJobs", availableJobs.toSource());
  GM_setValue("masteredJobs", masteredJobs.toSource());

  return true;
}

function customizeFight() {
  var opponents = getDisplayedOpponents(innerPageElt, true);
  if (!opponents) return false;

  // Customize the opponent list.
  var blacklist = getSavedList('fightListAvoid');
  for (var i = 0, iLength=opponents.length; i < iLength; ++i) {
    var opponent = opponents[i];
    if (!opponent.profile || !opponent.id) continue;

    // Mark targets that should be avoided.
    if (blacklist.indexOf(opponent.id) != -1) {
      var parentElt = opponent.profile.parentNode;
      var elt = makeElement('img', null, {'src':stripURI(badIcon), 'width':'12', 'height':'12', 'style':'vertical-align:middle', 'title':'You have already lost to this opponent during automatic play.'});
      parentElt.insertBefore(elt, parentElt.firstChild);
    }
  }
}

function customizeHitlist() {
  // Extras for hitlist.
  if (!onHitlistTab()) return false;

  // Get the displayed opponents.
  var opponents = getHitlist(innerPageElt, true);
  if (!opponents) return true;

  // Customize the opponent list.
  var blacklist = getSavedList('hitmanListAvoid').concat(getSavedList('fightListAvoid'));
  var kills = getSavedList('hitmanListKilled');
  for (var i = 0, iLength=opponents.length; i < iLength; ++i) {
    var opponent = opponents[i];
    if (!opponent.profile) continue;

    // Mark targets that should be avoided.
    if (blacklist.indexOf(opponent.id) != -1) {
      var parentElt = opponent.profile.parentNode;
      var elt = makeElement('img', null, {'src':stripURI(badIcon), 'width':'12', 'height':'12', 'style':'vertical-align:middle', 'title':'You have already lost to this opponent during automatic play.'});
      parentElt.insertBefore(elt, parentElt.firstChild);
    }

    // Mark targets on which bounties have already been collected.
    if (kills.indexOf(opponent.id) != -1) {
      var parentElt = opponent.profile.parentNode;
      var elt = makeElement('img', null, {'src':stripURI(lootbagIcon), 'width':'12', 'height':'12', 'style':'vertical-align:middle', 'title':'You have already collected a bounty on this target during automatic play.'});
      parentElt.insertBefore(elt, parentElt.firstChild);
    }
  }

  return true;
}

function filterNotifications(elt) {
  var handleCheck = GM_getValue('notificationHandle', 1);
  if (!handleCheck) return;

  // Get all beeps (pop-ups about notifications).
  var beeps = xpath('.//div[@class="UIBeep_Title"]', elt);
  for (var i = 0, iLength=beeps.snapshotLength; i < iLength; i++) {
    var beepElt = beeps.snapshotItem(i);
    if (beepElt && beepElt.innerHTML.indexOf('You sent a notification')) {
      // A notification was sent.
      var undoElt = xpathFirst('.//a[@class="undo_link"]', beepElt);
      if (!undoElt) continue;

      // Cancel certain types of notifications.
      if (beepElt.innerHTML.match(/fought you/i)) {
          clickElement(undoElt);
          addToLog('info Icon', 'Canceled attack notification.');
      } else if (beepElt.innerHTML.match(/robbed you/i)) {
          clickElement(undoElt);
          addToLog('info Icon', 'Canceled rob notification.');
      } else if (handleCheck == 2) {
          //FIXME: Should make sure it is a Mafia Wars notification.
          clickElement(undoElt);
          addToLog('info Icon', 'Canceled notification.');
      }
    }
  }
}

function setLevelUpRatio() {
  var elt = document.getElementById('level_up_ratio');
  if (elt) {
    if (energy) {
      var ratio = Math.round((lvlExp - curExp) / energy * 100) / 100;
      elt.childNodes[1].nodeValue = ' A ' + (ratio > 10? '>10' : ratio) + 'x pay ratio would be needed to level up on energy alone.';
      elt.style.display = 'block';
    } else {
      elt.style.display = 'none';
    }
  }
}

// Callback for clicking 'Add to Fight List' on profile page.
function clickFightListAdd() {
  addSavedListItem('fightList', this.id);
  this.firstChild.nodeValue = 'Remove from Fight List';
  this.removeEventListener('click', clickFightListAdd, false);
  this.addEventListener('click', clickFightListRemove, false);
  var el = document.getElementById('fightList');
  if (el) {
    el.value = GM_getValue('fightList', '');
  }
}

// Callback for clicking 'Remove from Fight List' on profile page.
function clickFightListRemove() {
  while(removeSavedListItem('fightList', this.id));
  this.firstChild.nodeValue = 'Add to Fight List';
  this.removeEventListener('click', clickFightListRemove, false);
  this.addEventListener('click', clickFightListAdd, false);
  var el = document.getElementById('fightList');
  if (el) {
    el.value = GM_getValue('fightList', '');
  }
}

// Callback for clicking 'Add to Rob List' on profile page.
function clickRobListAdd() {
  addSavedListItem('robList', this.id);
  this.firstChild.nodeValue = 'Remove from Rob List';
  this.removeEventListener('click', clickRobListAdd, false);
  this.addEventListener('click', clickRobListRemove, false);
  var el = document.getElementById('robList');
  if (el) {
    el.value = GM_getValue('robList', '');
  }
}

// Callback for clicking 'Remove from Rob List' on profile page.
function clickRobListRemove() {
  while(removeSavedListItem('robList', this.id));
  this.firstChild.nodeValue = 'Add to Rob List';
  this.removeEventListener('click', clickRobListRemove, false);
  this.addEventListener('click', clickRobListAdd, false);
  var el = document.getElementById('robList');
  if (el) {
    el.value = GM_getValue('robList', '');
  }
}

function getJobRow(jobName, contextNode) {
  // WARNING: Call for xpath differs based on quoting. This won't work if
  //          the job name has both double quotes (") and apostrophes (').
  var xQuote = (jobName.indexOf('"') != -1) ?  '\'' : '"';
  var rowElt = xpathFirst('.//tr[contains(., ' + xQuote + jobName + xQuote + ') and contains(., "Do Job")]', contextNode);
  if (!rowElt) {
    addToLog('warning Icon', 'Unable to find job row for ' + jobName + '.');
  }
  return rowElt;
}

function jobReqs (element) {
  // If we are here then we have already failed the job.
  addToLog('process Icon', 'Getting job requirements.');

  // Find the job row.
  var currentJob = missions[GM_getValue('selectMission', 1)][0];
  var currentJobRow = getJobRow(currentJob, element);
  if (!currentJobRow) return;

  // Do we need to buy something?
  var buyElt = xpathFirst('.//a[contains(., "Buy Item")]', element);
  if (buyElt) {
    addToLog('search Icon', 'Attempting to purchase required items.');
    Autoplay.fx = function() { goLinkElement(buyElt); };
    return;
  }
  DEBUG('Nothing to buy; moving to prerequisite job.');

  var items = getSavedList('itemList');
  var jobs = getSavedList('jobsToDo', '');
  var necessaryItems = $x('.//div[@class="req_item need_item"]//img', currentJobRow);

  // Save the current job for later. The current job should not already
  // exist in the list, so check first.
  if (jobs.indexOf(currentJob) == -1) {
    jobs.push(currentJob);
    DEBUG('Saving ' + currentJob + ' for later.');
    setSavedList('jobsToDo', jobs);
  } else {
    DEBUG(currentJob + ' is already in the jobs to-do list.');
  }

  // Figure out which loot items are needed before this job can be attempted
  // again and, consequently, which jobs will have to be done to get them.
  if (necessaryItems.length > 0) {
    necessaryItems.forEach(
      function(i){
        DEBUG('Missing : ' +i.alt);
        requirementJob.forEach(
          function(j){
            if (j[0] == i.alt) {
              jobs.push(j[1]);
              items.push(i.alt);
            }
          }
        );
      }
    );
  } else { addToLog('warning Icon', 'BUG DETECTED: Broken item detection.'); }

  // Set the very next job to perform.
  var doJob = jobs.pop();
  setSavedList('jobsToDo', jobs);
  setSavedList('itemList', items.unique());
  var i = 0;
  DEBUG('Will do job ' + doJob + ' next.');
  missions.forEach(
    function(f) {
        // Help locate name mismatches.
        //DEBUG(f[0] +'  :<<f>>: ' + missions[i][0]);
      if (f[0] == doJob) {
        GM_setValue('selectMission', i);
        addToLog('process Icon', 'Switching job to ' + doJob + '.');
      }
      i++;
    }
  );

  return;
}

function jobProgress(element) {
  if (GM_getValue('multipleJobs') == 'checked') {
    // Cycle jobs with the same ratio
    var availableJobs = eval(GM_getValue("availableJobs", "({0:{},1:{},2:{}})"));
    var multiple_jobs_list = getSavedList('selectMissionMultiple');
    var cycle_jobs = new Object();

    // Group selected jobs by ratio
    for (var i=0, iLength=multiple_jobs_list.length; i < iLength; ++i) {
      var job = multiple_jobs_list[i];
      var mission = missions[job];

      // Put non-available jobs at the end of the queue
      if (availableJobs[mission[4]][mission[3]] != null &&
          availableJobs[mission[4]][mission[3]].indexOf(parseInt(job)) == -1) {
        mission[7] = 0;
      }

      if (cycle_jobs[mission[7]] == null) {
        cycle_jobs[mission[7]] = [];
      }
      cycle_jobs[mission[7]].push(multiple_jobs_list[i]);
    }

    // Rebuild the job list array
    multiple_jobs_list = [];
    for (var i in cycle_jobs) {
      if (cycle_jobs[i].length > 1) {
        // Only cycle the current job's ratio group
        if (missions[GM_getValue('selectMission', 1)][7] == i) {
          cycle_jobs[i].push(cycle_jobs[i].shift());
        }
        for (var n = 0, nLength=cycle_jobs[i].length; n < nLength; ++n) {
          multiple_jobs_list.push(cycle_jobs[i][n]);
        }
      } else {
        multiple_jobs_list.push(cycle_jobs[i][0]);
      }
    }
    setSavedList('selectMissionMultiple', multiple_jobs_list);

    DEBUG('Exiting jobProgress function; multipleJobs is checked.');
    return;
  }

  if (GM_getValue('repeatJob') == 'checked') {
    DEBUG('Exiting jobProgress function; repeatJob is checked.');
    return;
  }

  var selectMission = parseInt(GM_getValue('selectMission', 1));
  var currentJob = missions[selectMission][0];
  var jobno      = missions[selectMission][2];
  var tabno      = missions[selectMission][3];
  var cityno     = missions[selectMission][4];
  DEBUG('Calculating progress for ' + currentJob + '.');
  // WARNING: Call for xpath differs based on quoting. This won't work if
  //          the job name has both double quotes (") and apostrophes (').
  var xQuote = (currentJob.indexOf('"') != -1) ?  '\'' : '"';
  // FIXME: This assumes the button label is "Do Job" when it actually could be
  //        "Pick Vory" or "Pick Mafiya" instead. Need to find a better way.
  //        Maybe find the rows with: .//td[@class="job_action"]/..
  //        But then some rows could be locked, throwing off the calculation.
  var currentJobRow = xpath('.//tr[contains(., ' + xQuote + currentJob + xQuote + ') and contains(., \'Do Job\')]', element);
  if (!currentJobRow.snapshotLength) {
    addToLog('warning Icon', 'Unable to find job row for ' + currentJob + '.');
    var tierJobs = $x('.//tr/td[@class="job_name"]', element);
    if (typeof(tierJobs[0]) == 'undefined') {
      addToLog('warning Icon', 'No jobs found in result. Checking page contents.');
      if (element.innerHTML.indexOf('Try Again')>0) {
        addToLog('warning Icon', "We are on the 'Try Again' error page.");
      }
    } else {
      addToLog('process Icon', tierJobs.length + ' jobs found in result page.');
      tierJobs.forEach(
        function(f) {
          DEBUG("Found job: " + f.innerHTML.untag().trim());
        });
    }
    return;
  }

  // Calculate tier mastery.
  DEBUG("Checking mastery for each job.");
  var currentJobRowIndex = currentJobRow.snapshotLength - 1;
  var tierLevel;
  if (currentJobRow.snapshotItem(currentJobRowIndex).innerHTML.match(/level (\d+)/i)) {
    tierLevel = RegExp.$1
  }
  // FIXME: Need to ignore job rows with "locked" buttons so they don't
  //        throw off the calculation.
  var tierJobs = $x('.//tr/td[@class="job_name"]', element);
  var tierPercent = 0;
  tierJobs.forEach(
    function(f) {
      if (f.innerHTML.indexOf('Mastered') != -1) {
        tierPercent += 100;
      } else if (f.innerHTML.match(/Mastery\s+(\d+)%/i)) {
        tierPercent += parseInt(RegExp.$1);
      }
      // FIXME: Some jobs appear with no bar even if mastered, such as
      //        Fight Off An Ultra-National Gang
    }
  );
  if (tierJobs.length) {
    tierPercent = Math.floor(tierPercent / tierJobs.length);
  }
  if (GM_getValue('tierCompleteStatus') != tierLevel + '|' + tierPercent) {
    GM_setValue('tierCompleteStatus', tierLevel + '|' + tierPercent);
    addToLog('info Icon', 'Job tier level ' + tierLevel + ' is ' +
             tierPercent + '% complete.');
  }

  // Calculate job mastery.
  DEBUG("Checking current job mastery.");
  var currentJobMastered = currentJobRow.snapshotItem(currentJobRowIndex).innerHTML.indexOf('Mastered');
  if (currentJobMastered > 0) {
    var jobList = getSavedList('jobsToDo');
    if (!jobList.length) {
      addToLog('info Icon', 'You have mastered <span class="job">' + currentJob + '</span>.');
      DEBUG('Checking job tier mastery.');
      if (tierPercent == 100) {
        // Find the first job of the next tier.
        // NOTE: This assumes that the missions array is sorted by city and
        //       then by tier.
        var nextTierJob;
        for (var i = selectMission + 1, iLength=missions.length; i < iLength; ++i) {
          if (missions[i][4] != cityno) {
            nextTierJob = i;
            addToLog('info Icon', 'You have mastered the final job tier in ' +
                     cities[cityno] + '! Moving to the next tier in ' +
                     cities[missions[nextTierJob][4]] + '.');
            break;
          }
          if (missions[i][3] != tabno) {
            nextTierJob = i;
            addToLog('info Icon', 'Current job tier is mastered. Moving to next tier in ' + cities[cityno] + '.');
            break;
          }
        }
        if (!nextTierJob) {
          addToLog('info Icon', 'You have mastered all jobs!');
        } else {
          GM_setValue('selectMission', nextTierJob);
          addToLog('info Icon', 'Job switched to <span class="job">' + missions[GM_getValue('selectMission', 1)][0] + '</span>.');
        }
      } else {
          // Find the first unmastered job of this next tier.
          var findMastery = function(v, i, a) { return (a[i].innerHTML.indexOf('Mastery') > 0)? 1:0; };
          var nonMasteredJobs = tierJobs.filter(findMastery);
          var jobName = nonMasteredJobs[0].innerHTML.split('<br>')[0].trim();
          var matches = missions.searchArray(jobName, 0);
          if (!matches) {
            addToLog('warning Icon', 'BUG DETECTED: ' + jobName +
                     ' not found in mission array.');
            return;
          }
          GM_setValue('selectMission', matches[0]);
          addToLog('info Icon', 'Job switched to <span class="job">' + missions[GM_getValue('selectMission', 1)][0] + '</span>.');
      }
    } else {
      DEBUG("There are jobs in the to-do list.");
    }
  } else {
    DEBUG("Job is not mastered. Checking percent of mastery.");
    var jobPercentComplete = currentJobRow.snapshotItem(currentJobRowIndex).innerHTML.split('Mastery ')[1].split('%')[0];
    if (GM_getValue('jobCompleteStatus') != (currentJob + '|' + String(jobPercentComplete))) {
      GM_setValue('jobCompleteStatus', (currentJob + '|' + String(jobPercentComplete)));
      addToLog('info Icon', '<span class="job">' + currentJob + '</span> is ' + jobPercentComplete + '% complete.');
    }
  }
  return;
}

function jobLoot(element) {
  var lootbag = [];

  // See what loot was gained.
  var messages = $x('.//td[@class="message_body"]', element);
  var numMessages = messages.length;
  for (var i = 1; i < numMessages; i++) {
    var innerNoTags = messages[i].innerHTML.untag();
    if (innerNoTags.match(/You\s+gained(?:\s+an?)?\s+(.+)\./) ||
        innerNoTags.match(/found(?:\s+an?)?\s+(.*?)\s+on\s+the/i) ||
        innerNoTags.match(/earned(?:\s+an?)?\s+(.*?)\.\s+you\s+/i)) {
      var loot = RegExp.$1;
      addToLog('lootbag Icon', '<span class="loot">'+' Found ' + loot + ' in the job.' + '</span>');
      lootbag.push(loot);
    }
  }

  var items = getSavedList('itemList');
  if (typeof(items[0]) == 'undefined' || items.length == 0) {
    DEBUG('No items in required item list.');
    return;
  }
  DEBUG('Found ' + lootbag.length + ' item(s) on this job.');

  var itemFound = false;
  var itemName;
  // NOTE: The single equal sign is intentional in this while() condition.
  while (itemName = lootbag.pop()) {
    DEBUG('Looking for ' + itemName + ' in needed items list.');
    DEBUG('We need ' + items.length + ' item(s).');
    for (var j = 0, jLength=items.length; j < jLength; j++) {
      if (itemName.indexOf(items[j]) != -1 ) {
        // we found some needed loot
        itemFound = true;
        addToLog('found Icon', itemName + ' is the item we were looking for!');
        removeSavedListItem('itemList', itemName);
        var jobList = getSavedList('jobsToDo');
        var doJob = jobList.pop();
        setSavedList('jobsToDo', jobList);

        for (var k = 0, numMissions=missions.length; k < numMissions; k++) {
          if (missions[k][0] == doJob) {
            addToLog('info Icon', 'Switching job to ' + doJob + '.');
            GM_setValue('selectMission', k);
            break;
          }
        }
      }
    }
  }
  if (!itemFound) {
    var jobResult;
    for (var i = 0, numItems=items.length; i < numItems; ++i) {
      jobResult = requirementJob.searchArray(items[i], 0);
      if (jobResult === false) {
        addToLog('warning Icon', 'BUG DETECTED: ' + items[i] + ' not found in requirementJob array.');
      } else {
        if (missions[GM_getValue('selectMission', 1)][0] != requirementJob[jobResult][1]) {
          DEBUG(items[i] + ' cannot be found doing this job.');
        }
      }
      DEBUG(items[i] + ' not found.');
    }
  }
}

function debugDumpSettings() {
  // Use showIfUnchecked() to show 0 value as "un-checked", or showIfSelected()
  // to show 0 value as "not selected" (for radio buttons).

  var jobSelected;
  if (GM_getValue('multipleJobs') == 'checked') {
    var multiple_jobs_list = getSavedList('selectMissionMultiple');
    var jobNames = [];
    for (var i=0, numJobs=multiple_jobs_list.length; i < numJobs; ++i) {
      jobNames.push(missions[multiple_jobs_list[i]][0]);
    }
    jobSelected = jobNames.join(', ');
  } else {
    jobSelected = missions[GM_getValue('selectMission')][0];
  }

  DEBUG('>  >  >  >  >  BEGIN SETTINGS DUMP  <  <  <  <  <<br>' +
        'Script Version: <strong>' + SCRIPT.version + ' build ' + SCRIPT.build + '</strong><br>' +
        'Language: <strong>' + document.documentElement.lang + '</strong><br>' +
        'Player current level: <strong>' + level + '</strong><br>' +
        'Player points to next level: <strong>' + ptsToNextLevel + '</strong><br>' +
        'Player mafia size: <strong>' + mafia + '</strong><br>' +
        'Player attack: <strong>' + curAttack + '</strong><br>' +
        'Player defense: <strong>' + curDefense + '</strong><br>' +
        'Player health: <strong>' + health + '/' + maxHealth + '</strong><br>' +
        'Player energy: <strong>' + energy + '/' + maxEnergy + '</strong><br>' +
        'Player stamina: <strong>' + stamina + '/' + maxStamina + '</strong><br>' +
        'Player influence: <strong>' + influence + '</strong><br>' +
        'Player skill points: <strong>' + stats + '</strong><br>' +
        'Energy pack waiting? <strong>' + energyPack + '</strong><br>' +
        'Current location: <strong>' + cities[city] + '</strong><br>' +
        'Player NY cash: <strong>' + (cash[NY] == undefined? 'unknown' : '$' + makeCommaValue(cash[NY])) + '</strong><br>' +
        'Player Cuba cash: <strong>' + (cash[CUBA] == undefined? 'unknown' : 'C$' + makeCommaValue(cash[CUBA])) + '</strong><br>' +
        'Player Moscow cash: <strong>' + (cash[MOSCOW] == undefined? 'unknown' : 'R$' + makeCommaValue(cash[MOSCOW])) + '</strong><br>' +
        '-------------------General Tab-------------------<br>' +
        'Enable auto-refresh: <strong>' + showIfUnchecked(GM_getValue('autoClick'))+ '</strong><br>' +
        '&nbsp;&nbsp;-Refresh rate low: <strong>'+ GM_getValue('r1') + '</strong><br>' +
        '&nbsp;&nbsp;-Refresh rate high: <strong>' + GM_getValue('r2') + '</strong><br>' +
        'Enable auto-heal: <strong>' + showIfUnchecked(GM_getValue('autoHeal')) + '</strong><br>' +
        '&nbsp;&nbsp;-Heal in : <strong>' + cities[GM_getValue('healLocation')] + '</strong><br>' +
        '&nbsp;&nbsp;-Minimum health: <strong>' + GM_getValue('healthLevel') + '</strong><br>' +
        '&nbsp;&nbsp;&nbsp;-Heal immediately: <strong>' + showIfUnchecked(GM_getValue('forceHealOpt1')) + '</strong><br>' +
        '&nbsp;&nbsp;&nbsp;-Heal when health reaches 20: <strong>' + showIfUnchecked(GM_getValue('forceHealOpt2')) + '</strong><br>' +
        '&nbsp;&nbsp;&nbsp;-Heal when stamina can be spent: <strong>' + showIfUnchecked(GM_getValue('forceHealOpt3')) + '</strong><br>' +
        '&nbsp;&nbsp;&nbsp;-Heal when stamina is full: <strong>' + showIfUnchecked(GM_getValue('forceHealOpt4')) + '</strong><br>' +
        '&nbsp;&nbsp;&nbsp;-Heal after 5 minutes: <strong>' + showIfUnchecked(GM_getValue('forceHealOpt5')) + '</strong><br>' +
        'Enable auto-bank in NY: <strong>' + showIfUnchecked(GM_getValue('autoBank')) + '</strong><br>' +
        '&nbsp;&nbsp;-Minimum deposit: $<strong>' + GM_getValue('bankConfig') + '</strong><br>' +
        'Enable auto-bank in Cuba: <strong>' + showIfUnchecked(GM_getValue('autoBankCuba')) + '</strong><br>' +
        '&nbsp;&nbsp;-Minimum deposit: C$<strong>' + GM_getValue('bankConfigCuba') + '</strong><br>' +
        'Enable auto-bank in Moscow: <strong>' + showIfUnchecked(GM_getValue('autoBankMoscow')) + '</strong><br>' +
        '&nbsp;&nbsp;-Minimum deposit: R$<strong>' + GM_getValue('bankConfigMoscow') + '</strong><br>' +
        'Enable auto-pause: <strong>' + showIfUnchecked(GM_getValue('autoPause')) + '</strong><br>' +
        '&nbsp;&nbsp;-After level up: <strong>' + showIfSelected(GM_getValue('autoPauseAfter')) + '</strong><br>' +
        '&nbsp;&nbsp;-Before level up: <strong>' + showIfSelected(GM_getValue('autoPauseBefore')) + '</strong><br>' +
        '&nbsp;&nbsp;-Exp to pause at: <strong>'+ GM_getValue('autoPauseExp') + '</strong><br>' +
        'Left-align main frame: <strong>'+ showIfUnchecked(GM_getValue('leftAlign')) + '</strong><br>' +
        'Hide ads: <strong>'+ showIfUnchecked(GM_getValue('hideAds')) + '</strong><br>' +
        'Move email options: <strong>'+ showIfUnchecked(GM_getValue('moveEmailBar')) + '</strong><br>' +
        'Undo notifications: <strong>'+ GM_getValue('notificationHandle') + '</strong><br>' +
        'Accept mafia invitations: <strong>'+ showIfUnchecked(GM_getValue('acceptMafiaInvitations')) + '</strong><br>' +
        'Enable logging: <strong>' + showIfUnchecked(GM_getValue('autoLog')) + '</strong><br>' +
        '&nbsp;&nbsp;-Logging length: <strong>' + GM_getValue('autoLogLength') + '</strong><br>' +
        'Log player updates: <strong>' + showIfUnchecked(GM_getValue('logPlayerUpdates')) + '</strong><br>' +
        '&nbsp;&nbsp;-Updates length: <strong>' + GM_getValue('logPlayerUpdatesMax') + '</strong><br>' +
        'Idle in: <strong>' + cities[GM_getValue('idleLocation', NY)] + '</strong><br>' +
        'Delay rate low: <strong>'+ GM_getValue('d1') + '</strong><br>' +
        'Delay rate high: <strong>' + GM_getValue('d2') + '</strong><br>' +
        'Automatically Help on Jobs: <strong>' + showIfUnchecked(GM_getValue('autoHelp')) + '</strong><br>' +
        'Skip gift wall posts: <strong>' + GM_getValue('autoGiftSkipOpt') + '</strong><br>' +
        'Enable auto-lotto: <strong>' + GM_getValue('autoLottoOpt') + '</strong><br>' +
        'Automatically asks for job help: <strong>' + showIfUnchecked(GM_getValue('autoAskJobHelp')) + '</strong><br>' +
        'Minimum experience for job help: <strong>' + GM_getValue('autoAskJobHelpMinExp') + '</strong><br>' +
        'Message to post on wall for job help: <strong>' + GM_getValue('autoAskJobHelpMessage') + '</strong><br>' +
        '---------------------Misc Tab--------------------<br>' +
        'Enable auto-stat: <strong>' + showIfUnchecked(GM_getValue('autoStat')) + '</strong><br>' +
        '&nbsp;&nbsp;-Attack Base: <strong>' + GM_getValue('autoStatAttackBase') + '</strong><br>' +
        '&nbsp;&nbsp;-Defense Base: <strong>' + GM_getValue('autoStatDefenseBase') + '</strong><br>' +
        '&nbsp;&nbsp;-Health Base: <strong>' + GM_getValue('autoStatHealthBase') + '</strong><br>' +
        '&nbsp;&nbsp;-Energy Base: <strong>' + GM_getValue('autoStatEnergyBase') + '</strong><br>' +
        '&nbsp;&nbsp;-Stamina Base: <strong>' + GM_getValue('autoStatStaminaBase') + '</strong><br>' +
        '&nbsp;&nbsp;-Influence Base: <strong>' + GM_getValue('autoStatInfluenceBase') + '</strong><br>' +
        '&nbsp;&nbsp;-Attack Ratio: <strong>' + GM_getValue('autoStatAttackRatio') + '</strong><br>' +
        '&nbsp;&nbsp;-Defense Ratio: <strong>' + GM_getValue('autoStatDefenseRatio') + '</strong><br>' +
        '&nbsp;&nbsp;-Health Ratio: <strong>' + GM_getValue('autoStatHealthRatio') + '</strong><br>' +
        '&nbsp;&nbsp;-Energy Ratio: <strong>' + GM_getValue('autoStatEnergyRatio') + '</strong><br>' +
        '&nbsp;&nbsp;-Stamina Ratio: <strong>' + GM_getValue('autoStatStaminaRatio') + '</strong><br>' +
        '&nbsp;&nbsp;-Influence Ratio: <strong>' + GM_getValue('autoStatInfluenceRatio') + '</strong><br>' +
        '&nbsp;&nbsp;-Attack Mode: <strong>' + GM_getValue('autoStatAttackMode') + '</strong><br>' +
        '&nbsp;&nbsp;-Defense Mode: <strong>' + GM_getValue('autoStatDefenseMode') + '</strong><br>' +
        '&nbsp;&nbsp;-Health Mode: <strong>' + GM_getValue('autoStatHealthMode') + '</strong><br>' +
        '&nbsp;&nbsp;-Energy Mode: <strong>' + GM_getValue('autoStatEnergyMode') + '</strong><br>' +
        '&nbsp;&nbsp;-Stamina Mode: <strong>' + GM_getValue('autoStatStaminaMode') + '</strong><br>' +
        '&nbsp;&nbsp;-Influence Mode: <strong>' + GM_getValue('autoStatInfluenceMode') + '</strong><br>' +
        '&nbsp;&nbsp;-Attack Prio: <strong>' + GM_getValue('autoStatAttackPrio') + '</strong><br>' +
        '&nbsp;&nbsp;-Defense Prio: <strong>' + GM_getValue('autoStatDefensePrio') + '</strong><br>' +
        '&nbsp;&nbsp;-Health Prio: <strong>' + GM_getValue('autoStatHealthPrio') + '</strong><br>' +
        '&nbsp;&nbsp;-Energy Prio: <strong>' + GM_getValue('autoStatEnergyPrio') + '</strong><br>' +
        '&nbsp;&nbsp;-Stamina Prio: <strong>' + GM_getValue('autoStatStaminaPrio') + '</strong><br>' +
        '&nbsp;&nbsp;-Influence Prio: <strong>' + GM_getValue('autoStatInfluencePrio') + '</strong><br>' +
        '&nbsp;&nbsp;-Attack Fallback: <strong>' + GM_getValue('autoStatAttackFallback') + '</strong><br>' +
        '&nbsp;&nbsp;-Defense Fallback: <strong>' + GM_getValue('autoStatDefenseFallback') + '</strong><br>' +
        '&nbsp;&nbsp;-Health Fallback: <strong>' + GM_getValue('autoStatHealthFallback') + '</strong><br>' +
        '&nbsp;&nbsp;-Energy Fallback: <strong>' + GM_getValue('autoStatEnergyFallback') + '</strong><br>' +
        '&nbsp;&nbsp;-Stamina Fallback: <strong>' + GM_getValue('autoStatStaminaFallback') + '</strong><br>' +
        '&nbsp;&nbsp;-Influence Fallback: <strong>' + GM_getValue('autoStatInfluenceFallback') + '</strong><br>' +
        '&nbsp;&nbsp;-Rest AutoStat: <strong>' + GM_getValue('restAutoStat') + '</strong><br>' +
        '&nbsp;&nbsp;-Next Stat: <strong>' + GM_getValue('nextStat') + '</strong><br>' +
        'Enable log-filtering: <strong>' + showIfUnchecked(GM_getValue('filterLog')) + '</strong><br>' +
        '&nbsp;&nbsp;-Filter pass : <strong>' + showIfUnchecked(GM_getValue('logFilterPass')) + '</strong><br>' +
        '&nbsp;&nbsp;-Filter fail : <strong>' + showIfUnchecked(GM_getValue('logFilterFail')) + '</strong><br>' +
        '-------------------Energy Tab--------------------<br>' +
        'Enable auto-mission: <strong>' + showIfUnchecked(GM_getValue('autoMission')) + '</strong><br>' +
        '&nbsp;&nbsp;-Job selected: <strong>' + jobSelected + '</strong><br>' +
        '&nbsp;&nbsp;-Repeat Job: <strong>' + showIfUnchecked(GM_getValue('repeatJob')) + '</strong><br>' +
        '&nbsp;&nbsp;-Multiple Jobs: <strong>' + showIfUnchecked(GM_getValue('multipleJobs')) + '</strong><br>' +
        'Mastermind bonus: <strong>' + GM_getValue('selectExpBonus') + '%</strong><br>' +
        'Wheelman savings: <strong>' + GM_getValue('selectEnergyBonus') + '%</strong><br>' +
        'Wait until energy full: <strong>' + showIfUnchecked(GM_getValue('waitForFull')) + '</strong><br>' +
        'Enable auto-energy pack: <strong>' + showIfUnchecked(GM_getValue('autoEnergyPack')) + '</strong><br>' +
        'Estimated job ratio: <strong>' + GM_getValue('estimateJobRatio') + '</strong><br>' +
        'Has helicopter: <strong>' + showIfUnchecked(GM_getValue('hasHelicopter')) + '</strong><br>' +
        'Has private island: <strong>' + showIfUnchecked(GM_getValue('hasPrivateIsland')) + '</strong><br>' +
        'Has golden throne: <strong>' + showIfUnchecked(GM_getValue('hasGoldenThrone')) + '</strong><br>' +
        'Is Maniac: <strong>' + showIfUnchecked(GM_getValue('isManiac')) + '</strong><br>' +
        'Auto send energy pack: <strong>' + showIfUnchecked(GM_getValue('sendEnergyPack')) + '</strong><br>' +
        '-------------------Stamina Tab-------------------<br>' +
        'Spend stamina: <strong>' + showIfUnchecked(GM_getValue('staminaSpend')) + '</strong><br>' +
        'How: <strong>' + staminaSpendChoices[GM_getValue('spendStaminaHow'), 0] + '</strong><br>' +
        '&nbsp;&nbsp;-Fight in: <strong>' + cities[GM_getValue('fightLocation', 0)] + '</strong><br>' +
        '&nbsp;&nbsp;-Random fight max level: <strong>' + GM_getValue('fightLevelMax') + ' (' + showIfRelative('fightLevelMaxRelative') + ')</strong><br>' +
        '&nbsp;&nbsp;-Random fight max mafia: <strong>' + GM_getValue('fightMafiaMax') + ' (' + showIfRelative('fightMafiaMaxRelative') + ')</strong><br>' +
        '&nbsp;&nbsp;-Random fight min mafia: <strong>' + GM_getValue('fightMafiaMin') + ' (' + showIfRelative('fightMafiaMinRelative') + ')</strong><br>' +
        '&nbsp;&nbsp;-Random fight stealth: <strong>' + showIfUnchecked(GM_getValue('fightStealth')) + '</strong><br>' +
        '&nbsp;&nbsp;-Random fight avoid bodyguards: <strong>' + showIfUnchecked(GM_getValue('fightAvoidBodyguards')) + '</strong><br>' +
        '&nbsp;&nbsp;-Random fight avoid names: <strong>' + showIfUnchecked(GM_getValue('fightAvoidNames')) + '</strong><br>' +
        '&nbsp;&nbsp;-List fight opponents: <strong>' + GM_getValue('fightList') + '</strong><br>' +
        '&nbsp;&nbsp;-List fight remove stronger: <strong>' + showIfUnchecked(GM_getValue('fightRemoveStronger')) + '</strong><br>' +
        '&nbsp;&nbsp;-Random rob max level: <strong>' + GM_getValue('robLevelMax') + ' (' + showIfRelative('robLevelMaxRelative') + ')</strong><br>' +
        '&nbsp;&nbsp;-Random rob max mafia: <strong>' + GM_getValue('robMafiaMax') + ' (' + showIfRelative('robMafiaMaxRelative') + ')</strong><br>' +
        '&nbsp;&nbsp;-Random rob min mafia: <strong>' + GM_getValue('robMafiaMin') + ' (' + showIfRelative('robMafiaMinRelative') + ')</strong><br>' +
        '&nbsp;&nbsp;-Random rob avoid names: <strong>' + showIfUnchecked(GM_getValue('robAvoidNames')) + '</strong><br>' +
        '&nbsp;&nbsp;-List rob opponents: <strong>' + GM_getValue('robList') + '</strong><br>' +
        '&nbsp;&nbsp;-List rob remove stronger: <strong>' + showIfUnchecked(GM_getValue('robRemoveStronger')) + '</strong><br>' +
        '&nbsp;&nbsp;-Collect hitman bounties in: <strong>' + cities[GM_getValue('hitmanLocation', 0)] + '</strong><br>' +
        '&nbsp;&nbsp;-Hitman min bounty: <strong>' + parseCash(GM_getValue('hitmanBountyMin')) + '</strong><br>' +
        '&nbsp;&nbsp;-Hitman bounty selection: <strong>' + bountySelectionChoices[(GM_getValue('bountySelection'))] + '</strong><br>' +
        '&nbsp;&nbsp;-Hitman avoid names: <strong>' + showIfUnchecked(GM_getValue('hitmanAvoidNames')) + '</strong><br>' +
        'Families list: <strong>' + GM_getValue('clanName') + '</strong><br>' +
        'Stamina threshold: <strong>' + (100-(GM_getValue('selectStaminaUse')*10)) + '% (refill to ' + staminaCeiling + ')</strong><br>' +
        '&nbsp;&nbsp;-Stamina use started: <strong>' + GM_getValue('useStaminaStarted') + '</strong><br>' +
        'Stamina reserve: <strong>' + (100-(GM_getValue('selectStaminaKeep')*10)) + '% (keep above ' + staminaFloor + ')</strong><br>' +
        'Ignore reserve to level-up: <strong>' + showIfUnchecked(GM_getValue('allowStaminaToLevelUp')) + '</strong><br>' +
        '-------------------Hitlist Tab-------------------<br>' +
        'Enable auto-hitlist: <strong>' + showIfUnchecked(GM_getValue('autoHitlist')) + '</strong><br>' +
        '&nbsp;&nbsp;-Bounty amount: <strong>' + GM_getValue('bountyAmount') + '</strong><br>' +
        'Ride Hitlist: <strong>' + showIfUnchecked(GM_getValue('hideAttacks')) + '</strong><br>' +
        '------------------Property Tab-------------------<br>' +
        'Enable auto-buy <strong>' + showIfUnchecked(GM_getValue('autoBuy')) + '</strong><br>' +
        '&nbsp;&nbsp;-Min cash: <strong>' + GM_getValue('buyMinAmount') + '</strong><br>' +
        'Enable auto-repair property: <strong>' + showIfUnchecked(GM_getValue('autoRepair')) + '</strong><br>' +
        'Enable auto-protect property: <strong>' + showIfUnchecked(GM_getValue('autoProtect')) + '</strong><br>' +
        'Sell Cuban business output: <strong>' + showIfUnchecked(GM_getValue('autoSellCrates')) + '</strong><br>' +
        'Sell Moscow business output <strong>' + showIfUnchecked(GM_getValue('autoSellCratesMoscow')) + '</strong><br>' +
        'Collect NY Take: <strong>' + showIfUnchecked(GM_getValue('collectNYTake')) + '</strong><br>' +
        'Next take availble at:' + GM_getValue('nextNYTake', 0) + '</strong><br>' +
        '>  >  >  >  >  END SETTINGS DUMP  <  <  <  <  <');
}

// This function returns false if some further action has been taken and the
// caller should not make additional calls until that action has completed.
function parsePlayerUpdates(messagebox) {
  // Get the timestamp (e.g. "3 minutes ago")
  var minutesAgo = xpathFirst('div[@class="update_timestamp"]', messagebox);
  minutesAgo = minutesAgo? minutesAgo.innerHTML + ' ' : '';
  minutesAgo = minutesAgo.indexOf('0') == 0? '' : minutesAgo;

  // Get the text and links.
  var messageTextElt = xpathFirst('div[@class="update_txt"]', messagebox);
  if (!messageTextElt) {
    addToLog('warning Icon', 'BUG DETECTED: Unable to read update text.');
    return true;
  }
  var messageText = messageTextElt.innerHTML;
  var messageTextNoTags = messageText.untag();
  var links = messageTextElt.getElementsByTagName('a');

  if (messageTextNoTags.indexOf('attacked by') != -1) {
    // Attacked by some fool with a death wish.
    var user = linkToString(links[0], 'user');
    var result = 'Attacked';
    if (links[0] && links[0].nextSibling && links[0].nextSibling.nodeValue &&
        links[0].nextSibling.nodeValue.match(/\d+ times/i)) {
      result += ' ' + RegExp.lastMatch;
    }
    result += ' by ' + user;
    if (messageTextNoTags.match(/you won.*you gained .*?(\d+) experience points?.*?([A-Z]?\$[\d,]*\d)/i)) {
      // The fight was won.
      var cost = RegExp.$2;
      var experience = RegExp.$1;
      result += '<span class="good">' + ' WON ' + cost + '</span>' + ' and ' +
                '<span class="good">' + experience +' experience.</span>';
      cost = parseCash(cost);
      experience = parseInt(experience);

      if (GM_getValue('hideAttacks') == 'checked') {
        DEBUG('Riding Hitlist fight won.');
        GM_setValue('currentHitXp', parseInt((GM_getValue('currentHitXp', 0)) + experience));
        GM_setValue('currentHitDollars', '' + (parseInt(GM_getValue('currentHitDollars', 0)) + cost));
        DEBUG(result);
        if (experience == 0) {
          DEBUG('Zero experience detected; turning off auto-heal.');
          GM_setValue('autoHeal', 0);
        }
      } else {
        addToLog('updateGood Icon', minutesAgo + result);
      }

//      NEEDS FIX - player updates need their own stats and a place to put them in the log (tabbed log
//      perhaps?)
//      The setValue commands below should not be updating auto-fight/auto-rob stats as it thows off
//      the gain rate, stamina req'd to level and ultimately  the auto-burn stamina for level up action.
//      Leaving in as placeholders. --AK17710N
//
//      GM_setValue('fightWinCountInt', (GM_getValue('fightWinCountInt', 1) + 1));
//      GM_setValue('totalExpInt', GM_getValue('totalExpInt', 0) + experience);
//      GM_setValue('totalWinDollarsInt', (parseInt(GM_getValue('totalWinDollarsInt', 1)) + cost));
    } else if (messageTextNoTags.match(/you lost.*and losing .*?([A-Z]?\$[\d,]*\d)/i)) {
      // The fight was lost.
      var cost   = RegExp.$1;
      result += '<span class="bad">' + ' LOST ' + cost + '.</span>';
      cost = parseCash(cost);

      if (GM_getValue('hideAttacks') == 'checked') {
        DEBUG('Ride Hitlist fight lost.');
        GM_setValue('currentHitDollars', '' + (parseInt(GM_getValue('currentHitDollars', 0)) - cost));
        DEBUG(result);
      } else {
        addToLog('updateBad Icon', minutesAgo + result);
      }

//      NEEDS FIX - player updates need their own stats and a place to put them in the log (tabbed log
//      perhaps?)
//      The setValue commands below should not be updating auto-fight/auto-rob stats as it thows off
//      the gain rate, stamina req'd to level and ultimately  the auto-burn stamina for level up action.
//      Leaving in as placeholders. --AK17710N
//
//      GM_setValue('fightLossCountInt', (GM_getValue('fightLossCountInt', 1) + 1));
//      GM_setValue('totalLossDollarsInt', '' + (parseInt(GM_getValue('totalLossDollarsInt', 1)) + cost));
    } else {
      addToLog('warning Icon', 'BUG DETECTED: Unable to read update win/loss.');
    }

  } else if (messageTextNoTags.indexOf('You were snuffed') != -1) {
    // Death. Ouch.
    addToLog('updateBad Icon', minutesAgo + 'You <span class="bad">' + 'DIED' + '</span>.');

  } else if (messageTextNoTags.indexOf('You were knocked out') != -1) {
    // Hitlist ride has ended.
    var hitman = linkToString(links[0], 'user');
    var user = linkToString(links[1], 'attacker');
    var bounty = parseCash(messageTextNoTags.split(' who claimed the ')[1]);
    var result = 'Whacked by '+ hitman + ' who claimed the $' +
                 makeCommaValue(parseInt(bounty)) + ' bounty set by ' +
                 user + '.';

    if (GM_getValue('hideAttacks') == 'checked') {
      DEBUG('Whacked riding hitlist.');
      GM_setValue('currentHitXp', parseInt(GM_getValue('currentHitXp', 0)) - 6);
      GM_setValue('totalHits', parseInt(GM_getValue('totalHits', 0)) + 1);
      GM_setValue('totalXp', parseInt(GM_getValue('totalXp', 0)) + parseInt(GM_getValue('currentHitXp', 0)));
      GM_setValue('lastHitXp', parseInt(GM_getValue('currentHitXp', 0)));
      GM_setValue('totalHitDollars', '' + (parseInt(GM_getValue('currentHitDollars', 0)) + parseInt(GM_getValue('totalHitDollars', 0))));
      if (GM_getValue('currentHitXp', 0) < 0) {
        var currentHitXp = '<span class="bad">LOST ' + GM_getValue('currentHitXp', 0) + '</span>';
      } else {
        var currentHitXp = '<span class="good">GAINED ' + GM_getValue('currentHitXp', 0) + '</span>';
      }
      if (parseInt(GM_getValue('currentHitDollars', 0)) < 0) {
        var currentHitDollars = '<span class="bad">' +
                                ' LOST $' + makeCommaValue(parseInt(GM_getValue('currentHitDollars', 0))) + '</span>';
        addToLog('updateBad Icon', minutesAgo + currentHitXp + ' experience and ' + currentHitDollars + ' on the hitlist.');
      } else {
        var currentHitDollars = '<span class="good">' +
                                ' WON $' + makeCommaValue(parseInt(GM_getValue('currentHitDollars', 0))) + '</span>';
        addToLog('updateGood Icon', minutesAgo + currentHitXp + ' experience and ' + currentHitDollars + ' on the hitlist.');
      }

      DEBUG('Hitlist total values set; now clearing current values.');
      GM_setValue('currentHitXp', 0);
      GM_setValue('currentHitDollars', '0');
      DEBUG('Ensure that autoHeal is enabled.');
      GM_setValue('autoHeal', 'checked');

    }
    addToLog('updateBad Icon', minutesAgo + result);

  } else if (messageTextNoTags.indexOf('You were punched') != -1) {
    // Punched by some wuss.
    var user = linkToString(links[0], 'attacker');
    var result = 'You were punched in the face by ' + user + '.';
    addToLog('updateBad Icon', minutesAgo + result);

  } else if (messageTextNoTags.indexOf('You fought as') != -1) {
    // Helped a fellow mafia member in a fight.
    var capo = linkToString(links[0], 'user');
    var user = linkToString(links[1], 'user');
    var cost = messageTextNoTags.match(REGEX_CASH);
    var result = 'You fought as ' + capo + "'s Capo and defeated " +
                 user + ', receiving ' + '<span class="good">' +
                 cost + '</span> for your efforts.';
    addToLog('updateGood Icon', minutesAgo + result);

  } else if (messageTextNoTags.indexOf('needs your help') != -1) {
    if (GM_getValue('autoHelp') == 'checked') {
      // Help requested by a fellow mafia member.
      if (!useClickSimulation) {
        messageText.split(/target_id=(\d+)/);
        var targetid = RegExp.$1;
        if (targetid) {
          var link = 'http://apps.facebook.com/' + SCRIPT.name +
                     SCRIPT.controller + 'job' +
                     SCRIPT.action + 'give_help' +
                     SCRIPT.city + (city + 1) +
                     '&target_id=' + RegExp.$1 +
                     '&skip_interstitial=1';
          takeAction(link, 'help');
          return false;
        } else {
          addToLog('warning Icon','BUG DETECTED: Unable to read help target id.');
        }
      } else {
        var userElt = xpathFirst('.//a[contains(@onclick, "controller=stats")]', messagebox);
        var elt = xpathFirst('.//a[contains(text(), "Click here to help")]', messagebox);
        if (elt) {
          // Help immediately.
          Autoplay.fx = function() {
            clickAction = 'help';
            clickContext = {
              user: linkToString(userElt, 'user'),
              help: linkToString(elt)
            };
            clickElement(elt);
            DEBUG('Clicked to help with a job.');
          };
          Autoplay.delay = 0;
          Autoplay.start();
          return false;
        } else {
          addToLog('warning Icon', 'BUG DETECTED: Unable to find help element.');
        }
      }
    }

  } else if (messageTextNoTags.indexOf('claimed your $') != -1) {
    // Bounty claimed. Whoever was hitlisted is sleeping with the fishes.
    var hitman = linkToString(links[0], 'user');
    var user = linkToString(links[1], 'attacker');
    var result = hitman + ' claimed your ' +
                 messageTextNoTags.match(REGEX_CASH)[0] +
                 ' bounty on ' + user + '.';
    addToLog('updateGood Icon', minutesAgo + result);

  } else if (messageTextNoTags.match(/tried\s+to\s+rob\s+you\s*(\d+ times)?/i)) {
    // Robbery.
    var thief = linkToString(links[0], 'attacker');
    var result = thief + ' tried to rob you';
    if (RegExp.$1) {
      result += ' <span class="attacker">' + RegExp.$1 + '</span>';
    }
    result += '!';
    if (messageTextNoTags.match(/dealing (\d+)/i)) {
      var damage = RegExp.$1;
      result += ' You taught \'em a lesson and spanked \'em for ' +
                 damage + ' damage.';
    }
    addToLog('updateGood Icon', minutesAgo + result);

  } else if (messageTextNoTags.match(/you earned.*achievement/i)) {
    // You earned an achievement.
    addToLog('updateGood Icon', minutesAgo + messageText);

  } else if (messageTextNoTags.match(/earned some great items/i)) {
    // Social reward, no need to collect. Ignore it.
    DEBUG(minutesAgo + messageText);

  } else if (messageTextNoTags.match(/earned the.*achievement/i)) {
    // Someone else earned an achievement. Who cares!
    DEBUG(minutesAgo + messageText);

  } else {
    // Just copy the update text straight into the log.
    addToLog('info Icon', minutesAgo + messageText);
  }

  return true;
}

function profileFix() {
  var lists = $x('.//ul[@class="nice_list items_list clearfix"]', innerPageElt);
  if (lists.length < 3) return;

  // Count the number of items in each item list.
  var itemCount = [];
  for (var whichblock = 0; whichblock < 3; whichblock++) {
    itemCount[whichblock] = 0;
    var i = 0;
    var nexti = 0;
    while ((i != -1) && (nexti < lists[whichblock].innerHTML.length)) {
      i = lists[whichblock].innerHTML.indexOf('X&nbsp;',nexti);
      if (i != -1) {
        var nextwhitespace = lists[whichblock].innerHTML.indexOf('</div>', i);
        itemCount[whichblock] += parseInt(lists[whichblock].innerHTML.substring(i+7, nextwhitespace));
        nexti = i + 1;
      }
    }
  }

  var findWeapons = xpath('.//div[@class="title"]', innerPageElt);
  var greenText = 'color:#52E259;';
  var redText = 'color:#EC2D2D;';
  if ((findWeapons.snapshotLength > 5) && (findWeapons.snapshotLength < 10)) {
    for (locateBlock = 0, numWeapons=findWeapons.snapshotLength; locateBlock < numWeapons; ++locateBlock) {
      if (findWeapons.snapshotItem(locateBlock).innerHTML.ltrim().rtrim() == 'Weapons')
        break;
    }

    if (findWeapons.snapshotItem(locateBlock).innerHTML.ltrim().rtrim() == 'Weapons') {
      if ((mafia <= itemCount[0]) || (itemCount[0] > 500))
        j = makeElement('span', findWeapons.snapshotItem(locateBlock), {'style':greenText});
      else
        j = makeElement('span', findWeapons.snapshotItem(locateBlock), {'style':redText});
      j.appendChild(document.createTextNode('(' + itemCount[0] + ')'));
    }

    locateBlock = locateBlock + 1;
    if (findWeapons.snapshotItem(locateBlock).innerHTML.ltrim().rtrim() == 'Armor') {
      if ((mafia <= itemCount[1]) || (itemCount[1] > 500))
        j = makeElement('span', findWeapons.snapshotItem(locateBlock), {'style':greenText});
      else
        j = makeElement('span', findWeapons.snapshotItem(locateBlock), {'style':redText});
      j.appendChild(document.createTextNode(' (' + itemCount[1] + ')'));
    }

    locateBlock = locateBlock + 1;
    if (findWeapons.snapshotItem(locateBlock).innerHTML.ltrim().rtrim() == 'Vehicles') {
      if ((mafia <= itemCount[2]) || (itemCount[2] > 500))
        j = makeElement('span', findWeapons.snapshotItem(locateBlock), {'style':greenText});
      else
        j = makeElement('span', findWeapons.snapshotItem(locateBlock), {'style':redText});
      j.appendChild(document.createTextNode('(' + itemCount[2] + ')'));
    }
  }
}

function autoLotto() {
  Autoplay.delay = getAutoPlayDelay();

  var lottoButton = xpathFirst('.//a/span[contains(@class, "sexy_lotto") and contains(text(), "Play Now and Win Big")]', innerPageElt);
  if (lottoButton) {
    Autoplay.fx = function() {
      clickElement(lottoButton);
      DEBUG('Clicked to go to lotto.');
    };
    Autoplay.start();
    return true;
  }

  var weeklylottoCheck = xpathFirst('.//a/span[contains(@class, "sexy_lotto") and contains(text(), "See if you won")]', innerPageElt);
  if (weeklylottoCheck) {
    Autoplay.fx = function() {
      clickElement(weeklylottoCheck);
      DEBUG('Clicked to see lotto results.');
    };
    Autoplay.start();
    return true;
  }

  var randomTicket = xpathFirst('.//div[@class="sexy_button" and contains(text(), "Auto-Select Numbers")]', innerPageElt);
  if (randomTicket) {
    clickElement(randomTicket);
    var submitTicket = xpathFirst('.//span[@class="sexy_button"]/input[@class="sexy_lotto" and @type="submit" and @value="Submit Ticket(s)"]', innerPageElt);

    if (submitTicket) {
      var ticket = ' ';
      for (var i = 1; i < 6; i++) {
        var searchstring = './/div[@id="' + SCRIPT.appID + '_ticket_1_selected_' + i + '"]';
        lottonum = xpathFirst(searchstring, innerPageElt);
        ticket = ticket + lottonum.innerHTML;
        if (i<5)
          ticket = ticket + '-';
      }
      Autoplay.fx = function() {
        clickElement(submitTicket);
        addToLog('info Icon', '<span style="font-weight:bold;color:rgb(255,217,39);">Lotto</span>: Played ticket' + ticket + '.');
      };
      Autoplay.start();
      return true;
    }
    // FIXME: It is a bug to reach this point?
    Autoplay.fx = goHome;
    Autoplay.start();
    return true;
  }

  var lottoResults = xpathFirst('.//li[contains(@class, "tab_on")]//a[contains(text(), "Results")]', innerPageElt);
  if (lottoResults) {
    var totalwinning = 0;
    var lottotable = xpath('.//table//tbody//tr//td[contains(text(), "Ticket #")]', innerPageElt);
    if (lottotable.snapshotLength == 0) {
      var noticketsEntered = xpath('.//center//div', innerPageElt);
      if ((noticketsEntered) && (noticketsEntered.snapshotLength>0) &&
         (noticketsEntered.snapshotItem(1).parentNode.innerHTML.indexOf("You didn't enter any tickets")!=-1))
        addToLog('info Icon', '<span style="font-weight:bold;color:rgb(255,217,39);">Lotto</span>: No tickets entered for the last drawing.');
      else
        addToLog('warning Icon', 'BUG DETECTED: Can\'t find lotto results.');
      return false;
    }
    var winningtickets = [0, 0, 0, 0, 0, 0];
    for (var j = 0, numTickets=lottotable.snapshotLength; j < numTickets; j++) {
      var eachticket = lottotable.snapshotItem(j).parentNode.innerHTML;
      var count = 0;
      for (var k = 0, ticketLength=eachticket.length; k < ticketLength; k++) {
        if (eachticket.substr(k, 'gold'.length) == 'gold')
          count++;
      }
      winningtickets[count] = winningtickets[count] + 1;
    }
    var lottoLog = '<span style="font-weight:bold;color:rgb(255,217,39);">Lotto winners</span>: ';
    var atleastOneWinner = false;
    for (var j = 1; j < 6; j++)
      if (winningtickets[j]>0) {
        atleastOneWinner = true;
        if (winningtickets[j] == 1)
          lottoLog += winningtickets[j] + ' ticket';
        else
          lottoLog += winningtickets[j] + ' tickets';
        if (j == 1)
          lottoLog +=  ' matching ' + j + ' number;';
        else
          lottoLog += ' matching ' + j + ' numbers;';
      }
    if (lottoLog[lottoLog.length-1]==';')
      lottoLog = lottoLog.substring(0, lottoLog.length-1)+'.';
    else if (!atleastOneWinner)
      lottoLog += 'no winning tickets.';
    addToLog('info Icon', lottoLog);

    // Log any displayed prizes.
    if (atleastOneWinner) {
      var prizes = $x('.//table[@class="messages"]//center', innerPageElt);
      for (var i = 0, numPrizes=prizes.length; i < numPrizes; ++i) {
        var description = prizes[i].innerHTML.untag().trim();
        if (description) {
          addToLog('good Icon', '<span style="font-weight:bold;color:rgb(255,217,39);">Prize</span>: ' + description);
        }
      }
    }

    Autoplay.fx = goHome;
    Autoplay.start();
    return true;
  }

  return false;
}

// This function returns false if nothing was done, true otherwise.
function propertyBuy() {
  var buyCost = parseInt(GM_getValue('buyCost', 0));
  var buyMinAmount = parseInt(GM_getValue('buyMinAmount', 0));

  // Make sure there something to buy and the amounts are valid.
  if (!buyCost || isNaN(buyMinAmount) || !cash[NY]) return false;

  // Make sure enough cash will be left over.
  if (buyCost > cash[NY] - buyMinAmount) return false;

  // Make sure we're in New York.
  if (city != NY) {
    Autoplay.fx = goNY;
    Autoplay.start();
    return true;
  }

  if (!onPropertyNav()) {
    Autoplay.fx = goPropertyNav;
    Autoplay.start();
    return true;
  }

  var buyType = GM_getValue('buyType', 0);
  var buyName = GM_getValue('buyName', '');
  var buySelection = GM_getValue('selectProperties', '');
  var buyRequired  = GM_getValue('buyRequired', '');
  var buySuccess = false;
  DEBUG('Auto-buy: name=' + buyName + ', id=' + buyType + ', cost=' + buyCost + ', req=' + buyRequired + ', mafia=' + mafia);
  if (buyType > 0 && (buyRequired || buySelection.indexOf(buyName) > -1)) {
    var buyamountSelects = xpathFirst('.//form[@id="'+SCRIPT.appID+'_propBuy_' + buyType + '"]/table/tbody/tr/td/select[@name="amount"]', innerPageElt);
    if (buyamountSelects && buyamountSelects.length) {
      buyamountSelects[buyamountSelects.length - 1].selected = true;
      var buyform = xpathFirst('.//form[@id="'+SCRIPT.appID+'_propBuy_' + buyType + '"]/table/tbody/tr/td[2]/span/input', innerPageElt);
      if (buyform) {
        buySuccess = true;
        buyform.click();
        return true;
      }
    }
  } else {
    addToLog('warning Icon', 'BUG DETECTED: Can\'t buy ' + buyName + '.');
  }

  return false;
}

function onHome() {
  // Return true if we're on the home page, false otherwise.
  if (xpathFirst('.//div[@class="playerupdate_box"]', innerPageElt)) {
    return true;
  }

  return false;
}

function onPropertyNav() {
  // Return true if we're on the property nav, false otherwise.
  if (city == NY && xpathFirst('.//input[@name="buy_props"]', innerPageElt)) {
    return true;
  }

  return false;
}

function onFightTab() {
  // Return true if we're on the rob tab, false otherwise.
  if (xpathFirst('.//li[contains(@class, "tab_on")]//a[contains(., "Fight")]', innerPageElt)) {
    return true;
  }

  return false;
}

function onRobTab() {
  // Return true if we're on the rob tab, false otherwise.
  if (xpathFirst('.//li[contains(@class, "tab_on")]//a[contains(., "Rob")]', innerPageElt)) {
    return true;
  }

  return false;
}

function onHitlistTab() {
  // Return true if we're on the hitlist tab, false otherwise.
  if (xpathFirst('.//table[@class="hit_list"]', innerPageElt)) {
    return true;
  }

  return false;
}

function propertyGetDamage(rootElt) {
  // Check for a protection offer.
  var protect = xpathFirst('.//a[contains(., "Protect all")]', rootElt);
  if (protect && protect.innerHTML.untag().match(REGEX_CASH)) {
    var cost = RegExp.lastMatch;
    DEBUG('Property is not fully protected, need ' + cost);
    GM_setValue('propertyDamage', PROP_PROTECT);
    GM_setValue('propertyDamageCost', cost);
    return;
  }

  // See if repairs are needed.
  var repair = xpathFirst('.//a[contains(., "Repair all")]', rootElt);
  if (repair && repair.innerHTML.untag().match(REGEX_CASH)) {
    var cost = RegExp.lastMatch;
    DEBUG('Property is not fully repaired, need ' + cost);
    GM_setValue('propertyDamage', PROP_REPAIR);
    GM_setValue('propertyDamageCost', cost);
    return;
  }

  // Fully repaired and protected.
  GM_setValue('propertyDamage', PROP_OK);
  GM_setValue('propertyDamageCost', 0);
}

function propertyGet() {
//FIXME: Why is reloading necessary? If it is, then the caller should be
//       checking this function's return value. If it isn't necessary
//       then it should be removed.
  var reloadProperty = false;

  if (running) {
    // check for messages
    var messageCheck = xpathFirst('.//div[@class="message_float"]', innerPageElt);

    if (messageCheck) {
      messageCheck = messageCheck.innerHTML.untag();
      if (messageCheck.match(/you just bought (.*) for ([A-Z]?\$[\d,]*\d)/i)) {
        addToLog(cityIcons[city], '<strong>Bought</strong> ' +
                 '<span class="good">' +
                 RegExp.$1 + '</span>' + ' for ' +
                 '<span class="expense">' + RegExp.$2 + '</span>.');
      } else {
        addToLog('warning Icon', 'Auto-buy error: ' + messageCheck);
      }
      reloadProperty = true;

    } else {
      var messageCheck = xpathFirst('.//td[@class="message_body"]', innerPageElt);
      if (messageCheck) {
        messageCheck = messageCheck.innerHTML.untag();
        if (messageCheck.match(/successfully sold (.*) for ([A-Z]?\$[\d,]*\d)/i)) {
          addToLog(cityIcons[city], '<strong>Sold</strong> ' +
                   '<span class="bad">' +
                   RegExp.$1 + '</span>' + ' for ' +
                   '<span class="money">' + RegExp.$2 + '</span>.');
        } else {
          addToLog('info Icon', messageCheck);
        }
        reloadProperty = true;
      }
    }
  }

  var allPropertyRowsPath = './/table[@class="main_table"]/tbody/tr';
  var allPropertyRows = xpath(allPropertyRowsPath, innerPageElt);

  // get number of payments per day
  var tempObj = xpathFirst('.//div[contains(text(), "Cash Flow")]', innerPageElt);
  if (tempObj && tempObj.innerHTML.match(/every (.+) minutes/i)) {
    var payments = 1440 / parseInt(RegExp.$1);
  } else {
    var payments = 24;
  }

  if (allPropertyRows.snapshotLength > 0) {
    var allProperties = new Array();
    var bestProperty = { id:false, roi:0, row:0 };
    var selectProperties = GM_getValue('selectProperties');
    if (!selectProperties && GM_getValue('autoBuy') == 'checked') {
      addToLog('warning Icon', 'Auto-buy cannot work because no properties have been selected in the Properties tab of the settings menu. Turning auto-buy off.');
      GM_setValue('autoBuy', 0);
    }

    for (var currentRow = 0, numRows=allPropertyRows.snapshotLength; currentRow < numRows; ++currentRow) {
      var currentRowHtml = allPropertyRows.snapshotItem(currentRow).innerHTML;

      if (/prop_[\w\d]+\.jpg/.test(currentRowHtml)) {
        var currentProperty = { id:0, roi:0, cost:0, name:'', row:0, path:'', income:0, mobsize:0, amount:0, owned:0, requiredId:0, requiredCost:0, requiredName:'' }
        var currentRowXpath = allPropertyRowsPath + "[" + (currentRow+1) + "]/";

        // get id
        var tempObj = xpathFirst(currentRowXpath + 'td[3]/table/tbody/tr/td[2]/form/table/tbody/tr/td/input[@name="property"]', innerPageElt);
        if (tempObj) {
          currentProperty.id = tempObj.value;
        }

        // get required mafia size
        tempObj = xpathFirst(currentRowXpath + "td[3]/table/tbody/tr[1]/td[1]", innerPageElt);
        if (tempObj) {
          currentProperty.mobsize = tempObj.innerHTML.match(/<strong>(\d+)<\/strong>/) ? parseInt(RegExp.$1) : 0;
        }

        // get max buy amount and select
        tempObj = xpathFirst('.//form[@id="'+SCRIPT.appID+'_propBuy_' + currentProperty.id + '"]/table/tbody/tr/td/select[@name="amount"]', innerPageElt);
        if (tempObj) {
          if (tempObj.length) {
            currentProperty.amount = tempObj.length;
            tempObj[currentProperty.amount - 1].selected = true;
          }
        }

        // get name & income
        tempObj = xpath(currentRowXpath + "td[2]/strong | " + currentRowXpath + "td[2]/div/strong", innerPageElt);
        if (tempObj.snapshotLength > 1) {
          currentProperty.name = tempObj.snapshotItem(0).innerHTML;
          currentProperty.income = parseCash(tempObj.snapshotItem(1).innerHTML);
        }

        //tempObj = xpath(currentRowXpath + "/td[3]/table/tbody/tr[2]/td | " + currentRowXpath + "td[2]/div/strong", innerPageElt);

        // get cost
        tempObj = xpathFirst(currentRowXpath + "td[3]/table/tbody/tr[1]/td", innerPageElt);
        if (tempObj) {
          tempObj = tempObj.innerHTML;
          if (tempObj) {
            // cost of required undeveloped space
            if (tempObj.match(/Built on: ([\w\s]+)/i)) {
              for (var j = 0, numProps=allProperties.length; j < numProps; ++j) {
                if (allProperties[j].name == RegExp.$1) {
                  var property = allProperties[j]
                  currentProperty.requiredCost = property.cost;
                  if (property.owned < currentProperty.amount) {
                    currentProperty.requiredId   = property.id;
                    currentProperty.requiredName = property.name;
                  }
                  break;
                }
              }
            }
            // cost of property
            if (tempObj.match(REGEX_CASH)) {
              currentProperty.cost = parseCash(RegExp.lastMatch);
            }
          }
        }

        // get number of owned
        tempObj = xpathFirst(currentRowXpath + "td[3]/table/tbody/tr[2]/td", innerPageElt);
        if (tempObj && tempObj.innerHTML.match(/(\d+)/)) {
          currentProperty.owned = RegExp.$1;
        } else {
          tempObj = xpathFirst(currentRowXpath + "td[2]/div/strong[2]", innerPageElt);
          if (tempObj && tempObj.innerHTML.match(/(\d+)/)) {
            currentProperty.owned = RegExp.$1;
          }
        }

        // calculate roi and check if its the highest
        if (currentProperty.income > 0 && currentProperty.cost > 0) {
          currentProperty.roi = currentProperty.income / (currentProperty.cost + currentProperty.requiredCost);
          if (selectProperties.indexOf(currentProperty.name) != -1 && bestProperty.roi < currentProperty.roi && mafia >= currentProperty.mobsize) {
            bestProperty = currentProperty;
            bestProperty.row  = currentRow;
            bestProperty.path = xpathFirst(currentRowXpath + "td[3]/table/tbody/tr[1]/td/strong", innerPageElt);
          }
        }

        // display roi & total income on page
        if (currentProperty.roi > 0) {
          var tempItem = xpath(currentRowXpath + 'td[2]/strong', innerPageElt).snapshotLength == 1 ? 0 : 1;
          var roiText = xpath(currentRowXpath + 'td[2]/div', innerPageElt);
          roiText = makeElement('div', roiText.snapshotItem(tempItem), {'style':'margin:10px 0 10px 0; font-size:13px'});
          roiText.appendChild(document.createTextNode('Total Income: $' + makeCommaValue(currentProperty.owned * currentProperty.income)));
          roiText.appendChild(document.createElement("br"));
          roiText.appendChild(document.createTextNode('ROI: '));
          makeElement('strong', roiText, { 'style':'color:#FFD927'}).appendChild(document.createTextNode(''+Math.round(currentProperty.roi*100000000)/100000));
          var roiTime = (1/currentProperty.roi) / payments; // days
          if (roiTime > 3652.5) { // display years
            roiTime /= 365.25;
            var roiTimeText = ' years)';
          } else if (roiTime > 365.25) { // display months
            roiTime /= 30.4375;
            var roiTimeText = ' months)';
          } else {
            var roiTimeText = ' days)';
          }
          roiText.appendChild(document.createTextNode(' (' + (Math.round(roiTime * 100) / 100) + roiTimeText));
        }

        allProperties.push(currentProperty);
      }
    }

    // highlight best property
    if (bestProperty.row > 0) {
      allPropertyRows.snapshotItem(bestProperty.row).style.backgroundColor="#020";
      best = makeElement('div', bestProperty.path, {'style':'color:#52E259; font-size: 11px; margin-top:10px'});
      makeElement('img', best, {'src':stripURI(goodIcon), 'width':'12', 'height':'12', 'style':'vertical-align:middle'});
      best.appendChild(document.createTextNode(' BEST'));
    }

    if (GM_getValue('autoBuy') == 'checked') {
      if (bestProperty.amount) {
        // Display next property for auto-buy.
        if (bestProperty.requiredId > 0) {
          makeElement('div', xpathFirst('.//div[@class="text"]', innerPageElt), {'style':'margin-top:12px'}).appendChild(document.createTextNode('Next auto-buy property: ' + bestProperty.amount + 'x ' + bestProperty.requiredName + ' ($' + makeCommaValue(bestProperty.requiredCost * bestProperty.amount) + ') to build ' + bestProperty.name));
        } else {
          makeElement('div', xpathFirst('.//div[@class="text"]', innerPageElt), {'style':'margin-top:12px'}).appendChild(document.createTextNode('Next auto-buy property: ' + bestProperty.amount + 'x ' + bestProperty.name + ' ($' + makeCommaValue(bestProperty.cost * bestProperty.amount) + ')'));
        }

        // Remember the next property for auto-buy.
        if (bestProperty.requiredId > 0 && (GM_getValue('buyType', 0) != bestProperty.requiredId || GM_getValue('buyCost', 0) != bestProperty.requiredCost * bestProperty.amount)) {
          GM_setValue('buyName', bestProperty.requiredName);
          GM_setValue('buyType', bestProperty.requiredId);
          // Save as a string because 32-bit integers aren't big enough.
          GM_setValue('buyCost', '' + bestProperty.requiredCost * bestProperty.amount);
          GM_setValue('buyRequired', true);
          addToLog('process Icon', 'Next auto-buy property: ' + bestProperty.amount + 'x <span class="good">' + bestProperty.requiredName + '</span> (<span class="expense">$' + makeCommaValue(bestProperty.requiredCost * bestProperty.amount) + '</span>) to build ' + bestProperty.name);
        } else if (GM_getValue('buyType', 0) != bestProperty.id || GM_getValue('buyCost', 0) != bestProperty.cost * bestProperty.amount) {
          GM_setValue('buyName', bestProperty.name);
          GM_setValue('buyType', bestProperty.id);
          // Save as a string because 32-bit integers aren't big enough.
          GM_setValue('buyCost', '' + bestProperty.cost * bestProperty.amount);
          GM_setValue('buyRequired', false);
          addToLog('process Icon', 'Next auto-buy property: ' + bestProperty.amount + 'x <span class="good">' + bestProperty.name + '</span> (<span class="expense">$' + makeCommaValue(bestProperty.cost * bestProperty.amount) + '</span>)');
        }

        DEBUG('Next auto-buy: name=' + GM_getValue('buyName', '') + ', id=' + GM_getValue('buyType', '') + ', cost=' + GM_getValue('buyCost', '') + ', req=' + GM_getValue('buyRequired', '') + ', reqMafia=' + bestProperty.mobsize + ', mafia=' + mafia);
      } else {
        // Nothing available to buy.
        GM_setValue('buyCost', 0);
        makeElement('div', xpathFirst('.//div[@class="text"]', innerPageElt), {'style':'margin-top:12px'}).appendChild(document.createTextNode('Next auto-buy property: Nothing available for purchase.'));
        addToLog('process Icon', 'Next auto-buy property: Nothing available for purchase.');
      }
    }
  }

  if (reloadProperty == true) {
    Autoplay.fx = goPropertyNav;
    Autoplay.delay = getAutoPlayDelay();
    Autoplay.start();
    return true;
  }

  return false;
}

function loadHome() {
  document.location = 'http://apps.facebook.com/inthemafia/index.php';
}

function loadBank() {
  document.location = 'http://apps.facebook.com/' + SCRIPT.name +
                      SCRIPT.controller + 'bank' +
                      SCRIPT.action + 'view' +
                      SCRIPT.city + (city + 1);
}

function loadJobTab(tabno) {
  DEBUG('Switching to job tab ' + tabno + '.');
  document.location = 'http://apps.facebook.com/' + SCRIPT.name +
                      SCRIPT.controller + 'job' +
                      SCRIPT.action + 'view' +
                      SCRIPT.city + (city + 1) +
                      '&tab=' + tabno +
                      '&bar=' + (tabno < 6? '0' : '1');
}

function loadFightNav() {
  document.location = 'http://apps.facebook.com/' + SCRIPT.name +
                      SCRIPT.controller + 'fight' +
                      SCRIPT.action + 'view' +
                      SCRIPT.city + (city + 1);
}

function loadRobTab() {
  document.location = 'http://apps.facebook.com/' + SCRIPT.name +
                      SCRIPT.controller + 'robbing' +
                      SCRIPT.action + 'view' +
                      SCRIPT.city + (city + 1);
}

function loadPropertyNav() {
  document.location = 'http://apps.facebook.com/' + SCRIPT.name +
                      SCRIPT.controller + 'property' +
                      SCRIPT.action + 'view' +
                      SCRIPT.city + (city + 1);
}

function loadBusinessesNav() {
  document.location = 'http://apps.facebook.com/' + SCRIPT.name +
                      SCRIPT.controller + 'business' +
                      SCRIPT.action + 'view' +
                      SCRIPT.city + (city + 1);
}

function loadAccept() {
  var link = 'http://apps.facebook.com/' + SCRIPT.name +
             SCRIPT.controller + 'recruit' +
             SCRIPT.action + 'accept' +
             SCRIPT.user + 'all';

  if (document.location == link) {
    // Sometimes the "+XX" still displays after accepting by URL.
    DEBUG('Already invited; reloading to clear masthead.');
    loadHome();
    return;
  }

  // Accept all invitations.
  addToLog('process Icon', 'Accepting ' + invites + ' mafia ' +
           (invites > 1 ? ' invites.' : ' invite.'));
  window.location = link;
  return;
}

function loadDeleteNews() {
  document.location = 'http://apps.facebook.com/' + SCRIPT.name +
                      SCRIPT.controller + 'index' +
                      SCRIPT.action + 'deletenews' +
                      SCRIPT.city + (city + 1);
}

function loadLocation(toCity) {
  var cityDest = parseInt(toCity);

  if (cityDest < 0 || cityDest >= cities.length) {
      addToLog('warning Icon', 'BUG DETECTED: Unrecognized destination "' + cityDest + '".');
      return;
  }

  document.location = 'http://apps.facebook.com/' + SCRIPT.name +
                      SCRIPT.controller + 'travel' +
                      SCRIPT.action + 'travel' +
                      SCRIPT.city + (city + 1) +
                      '&destination=' + (cityDest + 1) +
                      '&from=index';
}

function goLinkElement(elt) {
  if (!elt) {
    addToLog('warning Icon', 'BUG DETECTED: Null element passed to goLinkElement().');
    return;
  }

  if (!useClickSimulation) {
    document.location = elt.href;
  } else {
    clickElement(elt);
    DEBUG('Clicked element.');
  }
}

function goHome() {
  if (!useClickSimulation) {
    loadHome();
    return;
  }

  // Find the visible home link.
  var elts = $x('//div[@class="nav_link home_link"]//a');
  var elt;
  for (var i = 0, numElts=elts.length; i < numElts; ++i) {
    if (elts[i].scrollWidth) {
      elt = elts[i];
      break;
    }
  }
  if (!elt) {
    DEBUG('Can\'t find home link to click. Using fallback method.');
    loadHome();
    return;
  }
  clickElement(elt);
  DEBUG('Clicked to go home.');
}

function goBank() {
  if (!useClickSimulation) {
    loadBank();
    return;
  }

  var elt = xpathFirst('//a[@class="bank_deposit"]');
  if (!elt) {
    addToLog('warning Icon', 'Can\'t find bank link to click. Using fallback method.');
    loadBank();
    return;
  }
  clickElement(elt);
  DEBUG('Clicked to go to bank.');
}

function goJobsNav() {
  var elt = xpathFirst('//div[@class="nav_link jobs_link"]/a');
  if (!elt) {
    addToLog('warning Icon', 'Can\'t find jobs nav link to click.');
    return;
  }
  clickElement(elt);
  DEBUG('Clicked to go to jobs.');
}

function goJobTab(tabno) {
  if (!useClickSimulation) {
    loadJobTab(tabno);
    return;
  }

  var currentTab = currentJobTab();
  if (currentTab == -1) {
    // We're not even on a jobs page yet. Go there.
    goJobsNav();
    return;
  }
  if (currentTab == tabno) {
    DEBUG('Already on job tab ' + tabno + '.');
    return;
  }

  // No job tab. Make sure we're on the correct job bar.
  var barno = city == NY? (tabno < 6? 0 : 1) : 0;
  var currentBar = city == NY? (currentTab < 6? 0 : 1) : 0;
  if (currentBar != barno) {
    var elt = xpathFirst('.//ul[@id="' + SCRIPT.appID + '_jobs_bar' + barno + '"]//a[contains(@onclick, "&bar=' + barno + '")]', innerPageElt);
    if (!elt) {
      addToLog('warning Icon', 'BUG DETECTED: Can\'t find jobs bar ' + barno + ' link to click. Currently on job bar ' + currentBar + ', tab ' + currentTab + '.');
      return;
    }
    clickElement(elt);
    DEBUG('Clicked to go to job bar ' + barno + '.');
    return;
  }

  if (city == MOSCOW) {
    var elt = xpathFirst('.//ul[@id="' + SCRIPT.appID + '_jobs_bar' + barno + '"]//a[contains(@onclick, "&episode_tab=' + tabno + '")]', innerPageElt);
  } else {
    var elt = xpathFirst('.//ul[@id="' + SCRIPT.appID + '_jobs_bar' + barno + '"]//a[contains(@onclick, "&tab=' + tabno + '")]', innerPageElt);
  }
  if (!elt) {
    addToLog('warning Icon', 'BUG DETECTED: Can\'t find job bar ' + barno + ', tab ' + jobno + ' link to click. Currently on job bar ' + currentBar + ', tab ' + currentTab + '.');
    return;
  }
  clickElement(elt);
  DEBUG('Clicked to go to job tab ' + tabno + '.');
}

function goJob(jobno, context) {
  var elt = xpathFirst('.//table[@class="job_list"]//a[contains(@onclick, "job=' + jobno + '&")]', innerPageElt);
  if (!elt) {
    addToLog('warning Icon', 'Can\'t find job ' + jobno + ' link to click.');
    return;
  }
  clickAction = 'job';
  clickContext = context;
  clickElement(elt);
  DEBUG('Clicked job ' + jobno + '.');
}

function goFightNav() {
  if (!useClickSimulation) {
    loadFightNav();
    return;
  }

  var elts = $x('//div[@class="nav_link fight_link"]//a');
  var elt;
  for (var i = 0, numElts=elts.length; i < numElts; ++i) {
    if (elts[i].scrollWidth) {
      elt = elts[i];
      break;
    }
  }
  if (!elt) {
    addToLog('warning Icon', 'Can\'t find fight nav link to click. Using fallback method.');
    loadFightNav();
    return;
  }
  clickElement(elt);
  DEBUG('Clicked to go to fights.');
}

function goRobTab() {
  var elt = xpathFirst('.//div[@class="tab_content"]//a[contains(@onclick, "controller=robbing")]', innerPageElt);
  if (!elt) {
    goFightNav();
    return;
  }
  clickElement(elt);
  DEBUG('Clicked to go to robbing.');
}

function goHitlistTab() {
  var elt = xpathFirst('.//div[@class="tab_content"]//a[contains(., "Hitlist")]', innerPageElt);
  if (!elt) {
    goFightNav();
    return;
  }
  clickElement(elt);
  DEBUG('Clicked to go to hitlist.');
}

function goPropertyNav() {
  if (!useClickSimulation) {
    loadPropertyNav();
    return;
  }

  var elts = $x('//div[@class="nav_link properties_link"]//a');
  var elt;
  for (var i = 0, numElts=elts.length; i < numElts; ++i) {
    if (elts[i].scrollWidth) {
      elt = elts[i];
      break;
    }
  }
  if (!elt) {
    addToLog('warning Icon', 'Can\'t find properties nav link to click. Using fallback method.');
    loadPropertyNav();
    return;
  }
  clickElement(elt);
  DEBUG('Clicked to go to properties.');
}

function goBusinessesNav() {
  if (!useClickSimulation) {
    loadBusinessesNav();
    return;
  }

  var elt = xpathFirst('//*[@id="' + SCRIPT.appID + '_nav_link_businesses"]//a');
  if (!elt) {
    addToLog('warning Icon', 'Can\'t find businesses nav link to click. Using fallback method.');
    loadBusinessesNav();
    return;
  }
  clickElement(elt);
  DEBUG('Clicked to go to businesses.');
}

function goDeleteNews() {
  if (!useClickSimulation) {
    loadDeleteNews();
    return;
  }

  var elt = xpathFirst('//a[contains(text(), "clear all updates")]');
  if (!elt) {
    DEBUG('Can\'t find delete news link to click. Using fallback method.');
    loadDeleteNews();
    return;
  }
  clickElement(elt);
  DEBUG('Clicked to delete news.');
}

function goNY() {
  goLocation(NY);
}

function goCuba() {
  goLocation(CUBA);
}

function goMoscow() {
  goLocation(MOSCOW);
}

function goLocation(toCity) {
  if (toCity == city) {
    DEBUG('Already in ' + cities[toCity] + '.');
    return;
  }
  if (!useClickSimulation) {
    loadLocation(toCity);
    return;
  }

  // Find and click the travel element for the given destination.
  var elt = xpathFirst('//div[@id="' + SCRIPT.appID + '_travel_menu"]//a[contains(., "' + cities[toCity] + '")]');

  if (elt) {
    clickElement(elt);
    DEBUG('Clicked to travel to ' + cities[toCity] + '.');
    return;
  }

  addToLog('warning Icon', 'Unable to find ' + cities[toCity] +
           ' travel link. Using fallback method.');
  loadLocation(toCity);
}

function handleResponse(responseDetails, action, context) {
  //  DEBUG('handleResponse: status='+ responseDetails.status);
  //  DEBUG('handleResponse: statusText='+ responseDetails.statusText);
  //  DEBUG('handleResponse: responseHeaders='+ responseDetails.responseHeaders);
  //  DEBUG('handleResponse: responseText='+ responseDetails.responseText);

  // Check for error pages.
  if (responseDetails.responseText.indexOf('Error while loading page') != -1) {
    DEBUG('Response: "Error while loading page..." (service interruption)');
    return;
  }
  if (responseDetails.responseText.indexOf('request was not processed') != -1) {
    DEBUG('Request was not processed.');
    return;
  }
  if (responseDetails.responseText.indexOf('Login to Facebook') != -1) {
    addToLog('warning Icon', '<span class="warn">WARNING:</span> Reached the Mafia Wars login page.');
    addToLog('warning Icon', '<span class="warn">Please adjust your browser\'s settings to allow third-party cookies.</span>');
    addToLog('warning Icon', '<span class="warn">Or is this Facebook user logged in on another computer?</span>');
    return;
  }

  // Interpret the response.
  var doc = document.createElement('div');
  doc.innerHTML = responseDetails.responseText;
  logResponse(doc, action, context);
}

//ATK
//Hourly Stats Tracking - Experimental Work in Progress
function updateHourlyStats() {
//Planned data package order:  [0]Hour of the Day |
//  [1]NY Fight Exp | [2]NY Fight Win Count   | [3]NY Fight Loss Count | [4]NY Fight $ Won | [5]NY Fight $Lost |
//  [6]NY Rob Exp   | [7]NY Rob Success Count | [8]NY Rob Fail Count   | [9]NY Rob $Won    | [10]NY Rob $Lost  |
//  [11]NY Fight Loss Crit Hit Count | [12]NY Fight Loss Bodyguard Count | [13]NY Fight Loss Too Strong Count |
//  Variables below not yet created
//  [x]NY Capo $US | [x]NY Assist Exp | [x]NY Assist $US |
//  [x]NY Attacked Exp(net after deaths) | [x]NY Attacked $Won | [x]NY Attacked $Lost |
//  [x]NY Robbed Exp                     | [x]NY Robbed $Won   | [x]NY Robbed $Lost   |
//  [x]NY Job Count | [x]NY Job Exp | [x]NY Job $Made |
//  >>> BEGIN CUBA <<<
//  [x]Cuba Fight Exp | [x]Cuba Fight Win Count | [x]Cuba Fight Loss Count | [x]Cuba Fight $C Won | [x]Cuba Fight $C Lost |
//  [x]Cuba Fight Loss Crit Hit Count | [x]Cuba Fight Loss Bodyguard Count | [x]Cuba Fight Loss Too Strong Count |
//  [x]Cuba Capo $C | [x]Cuba Assist Exp | [x]Cuba Assist $C |
//  [x]Cuba Attacked Exp(net after deaths) | [x]Cuba Attacked $C Won | [x]Cuba Attacked $C Lost |
//  [x]Cuba Robbed Exp                     | [x]Cuba Robbed $C Won   | [x]Cuba Robbed $C Lost   |
//  [x]Cuba Job Count | [x]Cuba Job Exp | [x]Cuba Job $C Made

//  Max potential storage 41 * 24 = 984 elements

  var currentTime = new Date();
  var currentHour = currentTime.getHours();

  var hrDataPack = "";
  hrDataPack = currentHour + '|' + GM_getValue('fightExpNY', 0) + '|' + GM_getValue('fightWinsNY', 0) + '|' +
     GM_getValue('fightLossesNY', 0) + '|' + GM_getValue('fightWin$NY', 0) + '|' + GM_getValue('fightLoss$NY', 0) + '|' +
     GM_getValue('fightLossCHNY', 0) + '|' + GM_getValue('fightLossBGCHNY', 0) + '|'+ GM_getValue('fightLossStrongNY', 0);

  if (GM_getValue('hourlyStats', '0') == '0') {
    GM_setValue('hourlyStats', hrDataPack);
  } else {
    //pull existing stored hourly stats
    var splitValues = GM_getValue('hourlyStats', '').split(',');
    if (splitValues.length < 24) {
      splitValues.push(currentHour + '|0|0|0|0|0|0|0|0');
    }else {
      if ((GM_getValue('hourOfDay')*1 == 23 && currentHour != 0 )|| currentHour -1 != GM_getValue('hourOfDay')*1 && GM_getValue('hourOfDay') != isNaN(GM_getValue('hourOfDay'))){
        //We missed some hours so we need to carry the last good values forward
        if (GM_getValue('hourOfDay')*1 > currentHour){
          var tempHour = currentHour + 24;
        }else{
          var tempHour = currentHour;
        }

        for (var i = GM_getValue('hourOfDay')*1 + 1; i < GM_getValue('hourOfDay')*1 + (tempHour - GM_getValue('hourOfDay')*1); i++){
          var valString = splitValues[GM_getValue('hourOfDay')];
          valString = valString.substring(valString.indexOf('|'), valString.length);
          if (i > 23){
            splitValues.push(String(i-24) + valString);
          }else {
            splitValues.push(i + valString);
          }
        }
      }
    }
    //create temp arrays
    var hourlyFightExpNY = new Array(24);     //position [1]
    var hourlyFightWinsNY = new Array(24);    //position [2]
    var hourlyFightLossesNY = new Array(24);  //position [3]
    var hourlyFightWin$NY = new Array(24);    //position [4]
    var hourlyFightLoss$NY = new Array(24);   //position [5]
    var hourlyLossCrHitNY = new Array(24);    //position [6]
    var hourlyLossBgCrHitNY = new Array(24);  //position [7]
    var hourlyLossStrongNY = new Array(24);   //position [8]

    // Organize Hourly stat data into ordered sets
    for (var i = 0; i < splitValues.length; i++){
      //check length of each datapack to ensure it is the right size and fills missing with zeroes
      //this addresses issues when adding new metrics to the datapackage
      if (splitValues[i].split('|').length < 9) {
        for (var n = splitValues[i].split('|').length; n < 9; n++){
          splitValues[i] += '|0';
        }
      }
      if (splitValues[i].split('|')[0] == currentHour) {
        //pull data from same time day prior for "25th" hour
        var fightExpNY25 = splitValues[i].split('|')[1]*1;
        var fightWinsNY25 = splitValues[i].split('|')[2]*1;
        var fightLossesNY25 = splitValues[i].split('|')[3]*1;
        var fightWin$NY25 = splitValues[i].split('|')[4]*1;
        var fightLoss$NY25 = splitValues[i].split('|')[5]*1;
        var fightLossCrHitNY25 = splitValues[i].split('|')[6];
        var fightLossBgCrHitNY25 = splitValues[i].split('|')[7];
        var fightLossStrongNY25 = splitValues[i].split('|')[8];
        //Insert current hour values
        hourlyFightExpNY[splitValues[i].split('|')[0]] = hrDataPack.split('|')[1]*1;
        hourlyFightWinsNY[splitValues[i].split('|')[0]] = hrDataPack.split('|')[2]*1;
        hourlyFightLossesNY[splitValues[i].split('|')[0]] = hrDataPack.split('|')[3]*1;
        hourlyFightWin$NY[splitValues[i].split('|')[0]] = hrDataPack.split('|')[4]*1;
        hourlyFightLoss$NY[splitValues[i].split('|')[0]] = hrDataPack.split('|')[5]*1;
        hourlyLossCrHitNY[splitValues[i].split('|')[0]] = hrDataPack.split('|')[6]*1;
        hourlyLossBgCrHitNY[splitValues[i].split('|')[0]] = hrDataPack.split('|')[7]*1;
        hourlyLossStrongNY[splitValues[i].split('|')[0]] = hrDataPack.split('|')[8]*1;
      } else {
        //populate other hourly data
        hourlyFightExpNY[splitValues[i].split('|')[0]] = splitValues[i].split('|')[1]*1;
        hourlyFightWinsNY[splitValues[i].split('|')[0]] = splitValues[i].split('|')[2]*1;
        hourlyFightLossesNY[splitValues[i].split('|')[0]] = splitValues[i].split('|')[3]*1;
        hourlyFightWin$NY[splitValues[i].split('|')[0]] = splitValues[i].split('|')[4]*1;
        hourlyFightLoss$NY[splitValues[i].split('|')[0]] = splitValues[i].split('|')[5]*1;
        hourlyLossCrHitNY[splitValues[i].split('|')[0]] = splitValues[i].split('|')[6]*1;
        hourlyLossBgCrHitNY[splitValues[i].split('|')[0]] = splitValues[i].split('|')[7]*1;
        hourlyLossStrongNY[splitValues[i].split('|')[0]] = splitValues[i].split('|')[8]*1;
      }
    }

//Prep Arrays for hourly graphing
    var fightExpNY = prepStatsArray(hourlyFightExpNY, currentHour);
    var fightWinsNY = prepStatsArray(hourlyFightWinsNY, currentHour);
    var fightLossesNY = prepStatsArray(hourlyFightLossesNY, currentHour);
    var fightWin$NY = prepStatsArray(hourlyFightWin$NY, currentHour);
    var fightLoss$NY = prepStatsArray(hourlyFightLoss$NY, currentHour);
    var fightLossCHNY = prepStatsArray(hourlyLossCrHitNY, currentHour);
    var fightLossBGCHNY = prepStatsArray(hourlyLossBgCrHitNY, currentHour);
    var fightLossStrongNY = prepStatsArray(hourlyLossStrongNY, currentHour);

//Add 25th hour data to beginning of graphing arrays
    fightExpNY.unshift(fightExpNY25);
    fightWinsNY.unshift(fightWinsNY25);
    fightLossesNY.unshift(fightLossesNY25);
    fightWin$NY.unshift(fightWin$NY25);
    fightLoss$NY.unshift(fightLoss$NY25);
    fightLossCHNY.unshift(fightLossCrHitNY25);
    fightLossBGCHNY.unshift(fightLossBgCrHitNY25);
    fightLossStrongNY.unshift(fightLossStrongNY25);

//create hour labels based on current hour
    var hourLabels = "";
    for (i = 0; i < 24; i += 2) {
      var ind;
      var hrdisp;
      ind = (currentHour *1) - i;
      if (ind < 0) {ind = 24 + ind;}
      if (ind > 11) {hrdisp = String((12 - ind) * -1) + 'p';} else {hrdisp = String(ind) + 'a';}
      hrdisp = (hrdisp == '0a') ? '12a' : hrdisp;
      hrdisp = (hrdisp == '0p') ? '12p' : hrdisp;
      hourLabels = '|' + hrdisp + hourLabels;
    }
    hourLabels = '|' + hourLabels.split('|')[12] + hourLabels;

//lets make some graphs!
    //statSpecs Array Format: [0]Min, [1]Max. [2]Avg [3]Sum [4]Valid Data Count
    var statSpecsArrayA = [];
    var statSpecsArrayB = [];

    var graphOutput = "";

    //Gain rate per hour
    gainRateNY = [];
    for (var i = 0; i < fightWinsNY.length; i++) {
      gainRateNY[i] = fightExpNY[i]/(fightWinsNY[i] + fightLossesNY[i]);
      if (isNaN(gainRateNY[i])) { gainRateNY[i] = 0; }
      gainRateNY[i] = Math.round(gainRateNY[i] * Math.pow(10,2))/Math.pow(10,2);
    }
    statSpecsArrayA = getStatSpecs(gainRateNY, 0);
    graphOutput = '<IMG SRC="' + 'http://chart.apis.google.com/chart?cht=ls&chf=bg,s,111111&chts=BCD2EA,12&chtt=NY+Fight+Gain+Rate+per+Hr+of+Day|Min.+=+' + String(statSpecsArrayA[0]) + '+++Max.+=+' +String(statSpecsArrayA[1]) + '+++Avg+=+' + String(statSpecsArrayA[2]) + '/hr&chs=315x150&chxt=x,y&chxl=0:' + hourLabels + '&chxtc=0,10|1,-300&chxr=1,' + statSpecsArrayA[0] + ',' + statSpecsArrayA[1] + '&chds=' + statSpecsArrayA[0] + ',' + statSpecsArrayA[1] + '&chm=D,04B4AE,0,0,4|o,05E6DE,0,-1.0,6&chd=t:' + String(gainRateNY) + '"/>';

    //NY Fight XP gains per hour
    var diffArrayA = getArrayDiffs(fightExpNY);
    statSpecsArrayA = getStatSpecs(diffArrayA, 0);
    graphOutput += '<br><br>' + '<IMG SRC="' + 'http://chart.apis.google.com/chart?cht=ls&chf=bg,s,111111&chts=BCD2EA,12&chtt=Total+NY+Fight+XP+Gained+per+Hr+of+Day|Min.+=+' + String(statSpecsArrayA[0]) + '+++Max.+=+' +String(statSpecsArrayA[1]) + '+++Avg+=+' + String(statSpecsArrayA[2]) + '/hr&chs=315x150&chxt=x,y&chxl=0:' + hourLabels + '&chxtc=0,10|1,-300&chxr=1,' + statSpecsArrayA[0] + ',' + statSpecsArrayA[1] + '&chds=' + statSpecsArrayA[0] + ',' + statSpecsArrayA[1] + '&chm=D,92ED97,0,0,4|o,25DA2E,0,-1.0,6&chd=t:' + String(diffArrayA) + '"/>';

    //NY Fight Wins/Losses since reset chart
    var NYfightWinPct = (GM_getValue('fightWinsNY', 0)/(GM_getValue('fightWinsNY', 0) + GM_getValue('fightLossesNY', 0)))*100;
    if (isNaN(NYfightWinPct)){NYfightWinPct = 0;} else {NYfightWinPct = Math.round(NYfightWinPct * Math.pow(10, 1))/Math.pow(10, 1);}
    var NYfightLosePct = (GM_getValue('fightLossesNY', 0)/(GM_getValue('fightWinsNY', 0) + GM_getValue('fightLossesNY', 0)))*100;
    if (isNaN(NYfightLosePct)) {NYfightLosePct = 0; } else {NYfightLosePct = Math.round(NYfightLosePct * Math.pow(10, 1))/Math.pow(10, 1);}

    //NY Fight Loss Type breakdown pie
    var NYStrongLossPct = (GM_getValue('fightLossStrongNY', 0)/GM_getValue('fightLossesNY', 0))*100;
    if (isNaN(NYStrongLossPct)){NYStrongLossPct = 0;}else{NYStrongLossPct = Math.round(NYStrongLossPct * Math.pow(10, 1))/Math.pow(10, 1);}
    var NYCHLossPct = (GM_getValue('fightLossCHNY', 0)/GM_getValue('fightLossesNY', 0))*100;
    if (isNaN(NYCHLossPct)){NYCHLossPct = 0;}else{NYCHLossPct = Math.round(NYCHLossPct * Math.pow(10, 1))/Math.pow(10, 1);}
    var NYBGCHLossPct = (GM_getValue('fightLossBGCHNY', 0)/GM_getValue('fightLossesNY', 0))*100;
    if (isNaN(NYBGCHLossPct)){NYBGCHLossPct = 0;}else{NYBGCHLossPct = Math.round(NYBGCHLossPct * Math.pow(10, 1))/Math.pow(10, 1);}

    graphOutput += '<br><br>' + '<IMG SRC="' + 'http://chart.apis.google.com/chart?cht=p3&chf=bg,s,111111&chts=BCD2EA,12&chco=52E259|EC2D2D&chdl=' + String(NYfightWinPct) + '%|'+ String(NYfightLosePct) + '%&chdlp=t&chtt=NY+Fight+Wins+vs+Losses|since+stats+reset&chs=157x150&chd=t:' + String(NYfightWinPct) + ',' + String(NYfightLosePct) + '"/>' +
                          '<IMG SRC="' + 'http://chart.apis.google.com/chart?cht=p3&chf=bg,s,111111&chts=BCD2EA,12&chco=EC2D2D&chdl=CH:' + String(NYCHLossPct) + '%|BG:'+ String(NYBGCHLossPct) + '%|TS:'+ String(NYStrongLossPct) + '%&chdlp=t&chtt=NY+Fight+Losses+by+Type&chs=157x150&chd=t:' + String(NYCHLossPct) + ',' + String(NYBGCHLossPct) + ',' + String(NYStrongLossPct) + '"/><br>' +
                          '<span style="color:#888888;">CH = Critical Hit &#166; BG = Bodyguard Critical Hit &#166; TS = Too Strong</span>';

    //NY Fight $ Won/lost line graph
    statSpecsArrayA = getStatSpecs(fightWin$NY, 0);
    statSpecsArrayB = getStatSpecs(fightLoss$NY, 0);
    if (statSpecsArrayB[0]*1 < statSpecsArrayA[0]*1) {
      statSpecsArrayA[0] = statSpecsArrayB[0];
    }
    if (statSpecsArrayB[1]*1 > statSpecsArrayA[1]*1) {
      statSpecsArrayA[1] = statSpecsArrayB[1];
    }
    graphOutput += '<br><br>' + '<IMG SRC="' + 'http://chart.apis.google.com/chart?cht=ls&chf=bg,s,111111&chts=BCD2EA,12&chtt=Total+NY+Fight+$+Won+vs.+Lost+by+Hr+of+Day&chs=315x150&chxt=x,y&chxl=0:' + hourLabels + '&chxtc=0,10|1,-300&chxr=1,' + statSpecsArrayA[0] + ',' + statSpecsArrayA[1] + '&chds=' + statSpecsArrayA[0] + ',' + statSpecsArrayA[1] + '&chm=D,92ED97,0,0,4|o,25DA2E,0,-1.0,6|D,F05C5C,1,0,4|o,D21414,1,-1.0,6&chd=t:' + String(fightWin$NY) + '|' + String(fightLoss$NY) + '"/>';

    //addToLog('info Icon', graphOutput);
    graphOutput = '<span style="color:#669999;">Stats as of: ' + currentTime.toLocaleString() + '</span><br>' + graphOutput;
    GM_setValue('graphBox', graphOutput);

//re-pack hourly stats and save to GM variable
    hrDataPack = []
    for (i = 0; i < 24; i++){
      hrDataPack[i]= i + '|' + hourlyFightExpNY[i] + '|' + hourlyFightWinsNY[i] + '|' + hourlyFightLossesNY[i] + '|' +
          hourlyFightWin$NY[i] + '|' + hourlyFightLoss$NY[i] + '|' + hourlyLossCrHitNY[i] + '|' + hourlyLossBgCrHitNY[i] +
          '|' + hourlyLossStrongNY[i];
    }
    GM_setValue('hourlyStats', String(hrDataPack));

  }
  GM_setValue('hourOfDay', String(currentHour));
}

function prepStatsArray(workingArray, currentHour){
  for (var i = 0; i < workingArray.length; i++){
    if (isNaN(workingArray[i])) {
      workingArray[i] = 0;
    }
  }
  currentHour = currentHour * 1;
  var outputVals = [];
  for (i = 0; i < 24; i++){
    var ind;
    ind = currentHour - i;
    if (ind < 0) {ind = 24 + ind}
      outputVals.unshift(workingArray[ind]);
  }
  return outputVals;
}

//statSpecs Array
//Return Format: [0]Min, [1]Max. [2]Avg [3]Sum [4]Valid Count
function getStatSpecs(workingArray, includeZeroVals){
  var tempArray = [];
  var runningSum = 0;
  for (var i = 0; i < workingArray.length; i++) {
    if (workingArray[i] != 0 && includeZeroVals == 0) {
      tempArray.push(workingArray[i]);
      runningSum += workingArray[i];
    }else {
      runningSum += workingArray[i];
    }
  }
  if (includeZeroVals == 0) {
    tempArray.sort( function (a, b) { return a-b});
    var dataLen = tempArray.length;
    var dataMin = tempArray[0];
    var dataMax = tempArray[dataLen - 1];
  } else {
    workingArray.sort( function (a, b) { return a-b});
    var dataLen = workingArray.length;
    var dataMin = workingArray[0];
    var dataMax = workingArray[dataLen - 1];
  }
  var dataAvg = runningSum/dataLen;
  dataAvg = Math.round(dataAvg*Math.pow(10, 2))/Math.pow(10, 2);
//  alert("Sum: " + runningSum + "    len: " + dataLen + "   avg: " + dataAvg);
  return[dataMin, dataMax, dataAvg, runningSum, dataLen];
}

// This function gets the users gift ID and also sets the ID of
// the recipient of gifts.
function saveRecipientInfo() {
  var giftKey = document.body.innerHTML.match(/gift_key=([0-9a-f]+)/) ? RegExp.$1 : 'Not Found';
  GM_setValue("giftKey", giftKey);

  var recipientID = document.body.innerHTML.match(/recipients\[0\]=([0-9]+)/) ? RegExp.$1 : 'Not Found';
  GM_setValue("recipientID", recipientID);
  alert('Recipient:' + recipientID + '  Gift key:' + giftKey);
}

function takeFightStatistics(experience, cashStr, resultType) {
  var loc = NY;
  if (cashStr.search(/C\$/)) {
    loc = CUBA;
  } else if (cashStr.search(/R\$/)) {
    loc = MOSCOW;
  }
  var xp = parseInt(experience);
  var cashInt = parseCash(cashStr);

  if (xp) {
    // WON the fight.
    GM_setValue('totalExpInt', GM_getValue('totalExpInt', 0) + xp);
    GM_setValue('fightWinCountInt', GM_getValue('fightWinCountInt', 0) + 1);
    GM_setValue('totalWinDollarsInt', '' + (parseInt(GM_getValue('totalWinDollarsInt', 0)) + cashInt));

    switch(loc) {
      case CUBA:
        // Fight Win Cuba Stats
        GM_setValue('fightWinsCuba', GM_getValue('fightWinsCuba', 0) + 1);
        GM_setValue('fightExpCuba', GM_getValue('fightExpCuba', 0) + xp);
        GM_setValue('fightWin$Cuba', '' + (parseInt(GM_getValue('fightWin$Cuba', 0)) + cashInt));
        break;
      case NY:
        // Fight Win NY Stats
        GM_setValue('fightWinsNY', GM_getValue('fightWinsNY', 0) + 1);
        GM_setValue('fightExpNY', GM_getValue('fightExpNY', 0) + xp);
        GM_setValue('fightWin$NY', '' + (parseInt(GM_getValue('fightWin$NY', 0)) + cashInt));
        break;
      case MOSCOW:
        // Fight Win Moscow Stats
        GM_setValue('fightWinsMOSCOW', GM_getValue('fightWinsMOSCOW', 0) + 1);
        GM_setValue('fightExpMOSCOW', GM_getValue('fightExpMOSCOW', 0) + xp);
        GM_setValue('fightWin$MOSCOW', '' + (parseInt(GM_getValue('fightWin$MOSCOW', 0)) + cashInt));
    }
  } else {
    // LOST the fight.
    GM_setValue('fightLossCountInt', GM_getValue('fightLossCountInt', 0) + 1);
    GM_setValue('totalLossDollarsInt', '' + (parseInt(GM_getValue('totalLossDollarsInt', 0)) + cashInt));

    switch (loc) {
      case CUBA:
        //Fight Loss Cuba Stats
        GM_setValue('fightLossesCuba', GM_getValue('fightLossesCuba', 0) + 1);
        GM_setValue('fightLoss$Cuba', '' + (parseInt(GM_getValue('fightLoss$Cuba', 0)) + cashInt));
        if (resultType == 2) {
          GM_setValue('fightLossBGCHCuba', GM_getValue('fightLossBGCHCuba', 0) + 1);
          GM_setValue('fightLossBGCH$Cuba', '' + (parseInt(GM_getValue('fightLossBGCH$Cuba', 0)) + cashInt));
        } else if (resultType == 1) {
          GM_setValue('fightLossCHCuba', GM_getValue('fightLossCHCuba', 0) + 1);
          GM_setValue('fightLossCH$Cuba', '' + (parseInt(GM_getValue('fightLossCH$Cuba', 0)) + cashInt));
        } else {
          GM_setValue('fightLossStrongCuba', GM_getValue('fightLossStrongCuba', 0) + 1);
          GM_setValue('fightLossStrong$Cuba', '' + (parseInt(GM_getValue('fightLossStrong$Cuba', 0)) + cashInt));
        }
        break;
      case NY:
        //Fight Loss NY Stats
        GM_setValue('fightLossesNY', (GM_getValue('fightLossesNY', 0) + 1));
        GM_setValue('fightLoss$NY', '' + (parseInt(GM_getValue('fightLoss$NY', 0)) + cashInt));
        if (resultType == 2) {
          GM_setValue('fightLossBGCHNY', GM_getValue('fightLossBGCHNY', 0) + 1);
          GM_setValue('fightLossBGCH$NY', '' + (parseInt(GM_getValue('fightLossBGCH$NY', 0)) + cashInt));
        } else if (resultType == 1) {
          GM_setValue('fightLossCHNY', GM_getValue('fightLossCHNY', 0) + 1);
          GM_setValue('fightLossCH$NY', '' + (parseInt(GM_getValue('fightLossCH$NY', 0)) + cashInt));
        } else {
          GM_setValue('fightLossStrongNY', GM_getValue('fightLossStrongNY', 0) + 1);
          GM_setValue('fightLossStrong$NY', '' + (parseInt(GM_getValue('fightLossStrong$NY', 0)) + cashInt));
        }
        break;
      case MOSCOW:
        //Fight Loss MOSCOW Stats
        GM_setValue('fightLossesMOSCOW', (GM_getValue('fightLossesMOSCOW', 0) + 1));
        GM_setValue('fightLoss$MOSCOW', '' + (parseInt(GM_getValue('fightLoss$MOSCOW', 0)) + cashInt));
        if (resultType == 2) {
          GM_setValue('fightLossBGCHMOSCOW', GM_getValue('fightLossBGCHMOSCOW', 0) + 1);
          GM_setValue('fightLossBGCH$MOSCOW', '' + (parseInt(GM_getValue('fightLossBGCH$MOSCOW', 0)) + cashInt));
        } else if (resultType == 1) {
          GM_setValue('fightLossCHMOSCOW', GM_getValue('fightLossCHMOSCOW', 0) + 1);
          GM_setValue('fightLossCH$MOSCOW', '' + (parseInt(GM_getValue('fightLossCH$MOSCOW', 0)) + cashInt));
        } else {
          GM_setValue('fightLossStrongMOSCOW', GM_getValue('fightLossStrongMOSCOW', 0) + 1);
          GM_setValue('fightLossStrong$MOSCOW', '' + (parseInt(GM_getValue('fightLossStrong$MOSCOW', 0)) + cashInt));
        }
        break;
      default:
        break;
    }
  }
}

function logFightResponse(rootElt, resultElt, context) {
  var how = GM_getValue('staminaSpendHow');
  var inner = resultElt? resultElt.innerHTML : '';
  var innerNoTags = inner.untag();
  var messages = $x('.//td[@class="message_body"]', resultElt);
  var elt = messages[0]? messages[0].firstChild : undefined;

  if (resultElt.className == "fight_results") {
    // A fight took place. Results are in the "VS" format.

    if (how == STAMINA_HOW_FIGHT_RANDOM) {
      // Look for any new opponents in the displayed list.
      findFightOpponent(rootElt);
    } else if (how == STAMINA_HOW_FIGHT_LIST) {
      cycleSavedList('fightList');
    }

    // Determine whether the opponent is alive and may see future attacks.
    if (inner.indexOf('Attack Again') != -1) {
      setFightOpponentActive(context.id);
    } else {
      setFightOpponentInactive(context.id);
    }

    // Get the opponent, experience & cash.
    if (!innerNoTags.match(/(\d+)\s*experience/i)) {
      addToLog('warning Icon', 'BUG DETECTED: Unable to read "vs" win/loss.');
      addToLog('warning Icon', 'Result content: ' + inner);
      return false;
    }
    var experience = parseInt(RegExp.$1);
    var cost = innerNoTags.match(REGEX_CASH)? RegExp.lastMatch : undefined;

    // Get the opponent's details.
    var opponentElt = xpathFirst('.//div[@class="fightres_opponent"]', resultElt);
    var user, userSize, userBoost;
    if (opponentElt) {
      elt = xpathFirst('.//div[@class="fightres_name"]/a', opponentElt);
      user = linkToString(elt, 'user');
      elt = xpathFirst('.//div[contains(@class, "fightres_group_size")]', opponentElt);
      if (elt) {
        userSize = elt.innerHTML.untag().trim();
      }
      elt = xpathFirst('.//div[@class="fightres_top3_boost"]//img',opponentElt);
      if (elt) {
        userBoost = elt.title;
      }
    }

    // Did we win or lose?
    var resultType;
    var result = 'Fought ' + user + '\'s mafia of ' + userSize;
    if (experience) {
      result += ' <span class="good">' + 'WON ' + cost + '</span>' + ' and ' +
                '<span class="good">' + experience + ' experience</span>.';
      addToLog('good Icon', result);
    } else {
      result += ' <span class="bad">' +
                'LOST ' + cost + '</span>.';
      resultType = 0;
      // Check for a critical hit.
      if (innerNoTags.match(/critical hit/i)) {
        resultType++;
        if (innerNoTags.match(/bodyguard/i)) {
          resultType++;
          result += ' <span class="warn">(bodyguard critical hit)</span>';
          if (how == STAMINA_HOW_FIGHT_RANDOM &&
              GM_getValue('fightAvoidBodyguards') == 'checked') {
            setFightOpponentAvoid(context.id);
          }
        } else {
          result += ' <span class="warn">(critical hit)</span>';
        }
      } else {
        // Show any boost the opponent used.
        if (userBoost && userBoost.match(/[^(]+/)) {
          result += ' <span class="warn">('+RegExp.lastMatch.trim()+')</span>';
        }

        // Don't fight this opponent again.
        result += ' Too strong!';
        if (how == STAMINA_HOW_FIGHT_RANDOM ||
            GM_getValue('fightRemoveStronger') == 'checked') {
          result += ' Avoiding.';
          setFightOpponentAvoid(context.id);
        }
      }
      addToLog('bad Icon', result);
    }

    // Check for any fatalities.
    if (innerNoTags.match(/body\s+count\s+to\s+(\d+)/i)) {
      addToLog('info Icon', killedMobsterIcon + ' You <span class="bad">' + 'KILLED' + '</span> ' + user + '. Your body count has increased to <span class="bad">' + RegExp.$1 + '</span>.');
    }
    if (innerNoTags.indexOf('You were snuffed') != -1) {
      addToLog('bad Icon', 'You <span class="bad">' + 'DIED' + '</span> in the fight.');
    }

    // Look for any loot.
    if (innerNoTags.match(/found (an? .*) while fighting/i)) {
      addToLog('lootbag Icon', '<span class="loot">'+' Found '+
               RegExp.$1 + ' in the fight.</span>');
    }

    // Update the statistics.
    takeFightStatistics(experience, cost, resultType);
    updateLogStats();

  } else if (elt && elt.nodeValue &&
             elt.nodeValue.indexOf(' fought against ') != -1) {
    // First, look for any new opponents in the displayed list.
    // NOTE: This is at the top because putting it lower would risk
    //       it not getting called at all if an error occurs. This
    //       can lead to fighting the same opponents over and over.
    if (how == STAMINA_HOW_FIGHT_RANDOM) {
      findFightOpponent(rootElt);
    }

    // If fighting from the user-specified list, cycle it.
    if (how == STAMINA_HOW_FIGHT_LIST) {
      cycleSavedList('fightList');
    }

    // Determine whether the opponent is alive and may see future attacks.
    if (inner.indexOf('Attack Again') != -1) {
      setFightOpponentActive(context.id);
    } else {
      setFightOpponentInactive(context.id);
    }

    // Get the opponent.
    var user = linkToString(elt.nextSibling, 'user');
    var userSize;
    if (messages[1] && messages[1].innerHTML.match(/<\/a>'s mafia of (\d+)/i)) {
      userSize = RegExp.$1;
    }

    if (innerNoTags.match(/You WON.*You gained .*?([A-Z]?\$[\d,]*\d).*?(\d+) experience points/i)) {
      // The fight was won.
      var cost = RegExp.$1;
      var experience = RegExp.$2;
      var result = 'Fought ' + user + '\'s mafia of ' + userSize +
                   ' <span class="good">' + 'WON ' + cost + '</span>' +
                   ' and ' + '<span class="good">' + experience +
                   ' experience</span>.';

      // Check for a lucky win.
      if (innerNoTags.indexOf('against all odds') != -1) {
        result += ' <span class="warn">(against all odds)</span>';
        if (how == STAMINA_HOW_FIGHT_RANDOM ||
            GM_getValue('fightRemoveStronger') == 'checked') {
          result += ' Avoiding.';
          setFightOpponentAvoid(context.id);
        }
      }

      // Record the result.
      addToLog('good Icon', result);
      takeFightStatistics(experience, cost);
    } else if (innerNoTags.match(/You LOST.*along with .*?([A-Z]?\$[\d,]*\d)/i)) {
      // The fight was lost.
      var fightLossType = 0;
      var cost   = RegExp.$1;
      var result = 'Fought ' + user + '\'s mafia of ' + userSize +
                   ' <span class="bad">' + 'LOST ' + cost + '.</span>';

      // Check for a critical hit.
      if (innerNoTags.indexOf('critical hit') != -1) {
        fightLossType += 1;
        if (innerNoTags.indexOf('Top Mafia Bodyguard') != -1) {
          fightLossType += 1;
          result += ' <span class="warn">(bodyguard critical hit)</span>';
          if (how == STAMINA_HOW_FIGHT_RANDOM &&
              GM_getValue('fightAvoidBodyguards') == 'checked') {
            setFightOpponentAvoid(context.id);
          }
        } else {
          result += ' <span class="warn">(critical hit)</span>';
        }
      } else {
        // Don't fight this opponent again.
        result += ' Too strong!';
        if (how == STAMINA_HOW_FIGHT_RANDOM ||
            GM_getValue('fightRemoveStronger') == 'checked') {
          result += ' Avoiding.';
          setFightOpponentAvoid(context.id);
        }
      }

      // Record the result.
      addToLog('bad Icon', result);
      takeFightStatistics(experience, cost, fightLossType);
    } else {
      addToLog('warning Icon', 'BUG DETECTED: Unable to read "classic" win/loss.');
      addToLog('warning Icon', 'Message box content: ' + inner);
    }

    // Check for any fatalities.
    if (innerNoTags.indexOf('took out your opponent') != -1) {
      addToLog('info Icon', killedMobsterIcon + ' You <span class="bad">' + 'KILLED' + '</span> ' + user + '.');
    }
    if (innerNoTags.indexOf('You were snuffed') != -1) {
      addToLog('bad Icon', 'You <span class="bad">' + 'DIED' + '</span> in the fight.');
    }

    // Look for any loot.
    if (innerNoTags.match(/found an? (.*) while fighting/i)) {
      addToLog('lootbag Icon', '<span class="loot">'+' Found '+
               RegExp.$1 + ' in the fight.</span>');
    }

    // Update fight log tracking statistics.
    updateLogStats();
  } else if (innerNoTags.indexOf('too weak') != -1) {
    addToLog('info Icon', '<span style="color:#FF9999;">' + 'Too weak to fight.'+ '</span>');
  } else if (innerNoTags.match(/you cannot fight|part of your mafia/i)) {
    if (context.id) {
      DEBUG('Opponent (' + context.id + ') is part of your mafia. Avoiding.');
      setFightOpponentAvoid(context.id);
    }
  } else {
    DEBUG('Unrecognized fight response:');
    DEBUG(inner);
  }

  if (!useClickSimulation) {
    Autoplay.start();
    return true;
  }

  return false;
}

// Interprets the response to an action that was taken.
//
// rootElt: An element whose descendents contain the response to interpret.
// action:  The action taken, such as 'rob', 'fight', 'heal', etc.
// context: (optional) Any further data needed to describe the action
// Returns: true if something has been done that will cause the inner page
//          to change, such as clicking somewhere or loading another page.
function logResponse(rootElt, action, context) {
  // Set default timer properties.
  Autoplay.fx = goHome;
  Autoplay.delay = getAutoPlayDelay();

  var messagebox = xpathFirst('.//div[@class="fight_results"]', rootElt);
  if (!messagebox) {
    messagebox = xpathFirst('.//table[@class="messages"]', rootElt);
  }

  if (action == 'fight' || action == 'rob') {
    // Get the "tmp" PHP parameter.
    var fightTmpOld = fightTmp;
    if (!fightTmp) {
      getTmpParameter(rootElt);
    }
    if (!fightTmp) {
      var elt = xpathFirst('.//a[contains(@onclick, "xw_action=attack")]', rootElt);
      if (elt && elt.getAttribute('onclick').match(/tmp=([^&"'<]+)/)) {
        fightTmp = RegExp.$1;
      }
    }
    if (fightTmp && fightTmp != fightTmpOld) {
      DEBUG('"tmp" parameter for ' + action + ' is: ' + fightTmp);
      if (!messagebox && !fightTmpOld) {
          Autoplay.start();
          return true;
      }
    }
  }

  if (!messagebox) {
    DEBUG('logResponse: HTML=' + rootElt.innerHTML);
    DEBUG('Unexpected response page: no message box found!');

    // If fighting/robbing from a user-specified list, cycle it.
    // Otherwise, the problem might repeat indefinitely.
    if (action == 'fight' &&
        GM_getValue('staminaSpendHow') == STAMINA_HOW_FIGHT_LIST) {
      addToLog('warning Icon', 'Opponent ' + context.id +
               ' in your fight list may be invalid.');
      cycleSavedList('fightList');
    } else if (action == 'rob' &&
               GM_getValue('staminaSpendHow') == STAMINA_HOW_ROB_LIST) {
      addToLog('warning Icon', 'Opponent ' + context.id +
               ' in your rob list may be invalid.');
      cycleSavedList('robList');
    }

    return false;
  }

  // Since the attempted action received a response, stop skipping fight/rob.
  skipStaminaSpend = false;

  var inner = messagebox? messagebox.innerHTML : '';
  var innerNoTags = inner.untag();
  //var xw_time = rootElt.innerHTML.match(/xw_time=[^&]*/i);
  //var xw_exp_sig = rootElt.innerHTML.match(/xw_exp_sig=[^&]*/i);

  switch (action) {
    case 'fight':
      return logFightResponse(rootElt, messagebox, context);
      break;

    case 'heal':
      if (innerNoTags.indexOf('doctor healed') != -1) {
        var addHealth = inner.split('doctor healed <strong>')[1].split('health')[0];
        var cost = innerNoTags.match(REGEX_CASH);
        addToLog('health Icon', '<span style="color:#FF9999;">' + ' Health +'+ addHealth + ' for <span class="expense">' + cost + '</span>.</span>');
      } else if (innerNoTags.indexOf('You cannot heal so fast') != -1) {
        addToLog('warning Icon', '<span style="color:#FF9999;">' + 'Attempted to heal too quickly.' + '</span>');
      }
      break;

    case 'job':
      xpGainElt = xpathFirst('.//dd[@class="message_experience"]', messagebox);
      if (xpGainElt) {
        // Job completed successfully.
        var result = 'You performed ' + '<span class="job">' +
                     missions[GM_getValue('selectMission')][0] +
                     '</span> earning <span class="good">' +
                     xpGainElt.innerHTML.toLowerCase() + '</span>';
        var cashGainElt = xpathFirst('.//dd[@class="message_cash"]', messagebox);
        if (cashGainElt) {
          result += ' and <span class="good">' + cashGainElt.innerHTML + '</span>';
        }
        result += '.';
        if (innerNoTags.indexOf('you spent no energy') != -1) {
          result += ' You spent 0 energy on this job.';
        }
        addToLog('process Icon', result);
        jobProgress(rootElt);
        jobLoot(rootElt);
        // Add message if job tier prize found.
        if (innerNoTags.match(/.*(An* .+ was added to your inventory[^.]*.)/i)) {
          addToLog('lootbag Icon', RegExp.$1);
        }

        // Ask for help if auto ask is on and enough experience was gained.
        var xpGain = parseInt(xpGainElt.innerHTML);
        var xpGainMin = parseInt(GM_getValue('autoAskJobHelpMinExp'));
        if (GM_getValue('autoAskJobHelp') == 'checked' &&
            (!xpGainMin || xpGain >= xpGainMin)) {
          var elt = xpathFirst('.//div[@class="message_buttons"]//input[@class="sexy_jobhelp"]', messagebox);
          if (elt) {
            Autoplay.fx = function() {
              clickElement(elt);
              addToLog('process Icon', 'Asked for help with <span class="job">' + missions[GM_getValue('selectMission')][0] + '</span>.');
            }
            Autoplay.start();
            return true;
          }
        }

        if (useClickSimulation) return false;
      } else if (innerNoTags.indexOf('You don\'t have the necessary items to perform this job') != -1) {
        addToLog('info Icon', 'You don\'t have the items necessary to do ' + missions[GM_getValue('selectMission', 1)][0] + '.');
        jobReqs(rootElt);
      } else if (innerNoTags.indexOf('You are not high enough level to do this job') != -1) {
        addToLog('warning Icon', 'You are not high enough level to do ' + missions[GM_getValue('selectMission', 1)][0] + '.');
        addToLog('warning Icon', 'Job processing will stop');
        GM_setValue('autoMission', 0);
      } else if (innerNoTags.match(/You need.*more energy.*requires.*?(\d+).*you only have.*?(\d+)/i)) {
        addToLog('warning Icon', missions[GM_getValue('selectMission', 1)][0] +
                 ' requires ' + RegExp.$1 + ' energy. You only have ' +
                 RegExp.$2 + '.');
        addToLog('warning Icon', 'Is your wheelman bonus set correctly?');
      } else {
        DEBUG('Unrecognized job response.');
      }
      Autoplay.start();
      return true;
      break;

    case 'rob':
      var how = GM_getValue('staminaSpendHow');
      // NOTE: This is at the top because putting it lower would risk
      //       it not getting called at all if an error occurs. This
      //       can lead to robbing the same opponent over and over.
      if (how == STAMINA_HOW_ROB_LIST) {
          cycleSavedList('robList');
      }

      if (innerNoTags.indexOf('You successfully robbed') != -1) {
        var user = linkToString(xpathFirst('.//td[@class="message_body"]//a', messagebox), 'user');
        if (inner.match(/<\/a>('s mafia of \d+)/i)) {
          user += RegExp.$1;
        }
        innerNoTags.match(/taking\s.*?(\d+\s+damage).*dealing\s.*?([\d.]+%\s+damage).*?([A-Z]?\$[\d,]*\d).*?(\d+\s+experience)/i);
        var damage_taken = RegExp.$1;
        var damage_dealt = RegExp.$2;
        var gained       = RegExp.$3;
        var experience   = RegExp.$4;
        addToLog('good Icon', 'Robbed ' + user +
                 ', taking ' + '<span class="bad">' + damage_taken + '</span>' +
                 ', dealing ' + '<span class="good">' + damage_dealt+'</span>' +
                 ' and gaining ' + '<span class="good">' + gained + '</span>'+
                 ' and ' + '<span class="good">' + experience + '</span>.');
        if (innerNoTags.match(/You put .* out of business!/i)) {
          addToLog('good Icon', '<span class="good">' + RegExp.lastMatch + '<span>');
        }

        GM_setValue('robWinCountInt', (GM_getValue('robWinCountInt', 0) + 1));
        GM_setValue('totalExpInt', GM_getValue('totalExpInt', 0) + parseInt(experience));
        GM_setValue('totalWinDollarsInt', '' + (parseInt(GM_getValue('totalWinDollarsInt', 0)) + parseCash(gained.split('$')[1])));
        setRobOpponentRobbed(context.id);
      } else if (innerNoTags.indexOf('police investigation') != -1) {
        addToLog('process Icon', 'Police investigation. Moving on quietly...');
        setRobOpponentRobbed(context.id);
      } else if (innerNoTags.indexOf('You failed to rob') != -1) {
        var user = linkToString(xpathFirst('.//td[@class="message_body"]//a', messagebox), 'user');
        if (inner.match(/<\/a>('s mafia of \d+)/i)) {
         user += RegExp.$1;
        }
        var damage_taken;
        var loss;
        if (innerNoTags.match(/taking\s.*?(\d+\s+damage).*losing.*?([A-Z]?\$[\d,]*\d)/i)) {
          damage_taken = RegExp.$1;
          loss         = RegExp.$2;
        } else {
          DEBUG('BUG DETECTED: Can\'t read rob failure damage or cash loss.');
          DEBUG('Untagged message: ' + innerNoTags);
        }
        var result = '<strong>Failed</strong> to rob ' + user +
                     ' taking <span class="bad">' + damage_taken + '</span>' +
                     ' losing <span class="bad">' + loss + '</span>.';
        if (how == STAMINA_HOW_ROB_LIST &&
            GM_getValue('robRemoveStronger') == 'checked') {
          result += ' Avoiding.';
          setRobOpponentAvoid(context.id);
        }
        if (innerNoTags.match(/used\s+an?\s+(.*?)\s+to\s+boost\s+their/i)) {
          result += '<span class="warn">(' + RegExp.$1 + ' boost)</span>';
        }
        addToLog('bad Icon', result);

        // Update statistics.
        if (loss) {
          loss = parseCash(loss.split('$')[1]);
          GM_setValue('totalLossDollarsInt', '' + (parseInt(GM_getValue('totalLossDollarsInt', 0)) + loss));
        }
        GM_setValue('robLossCountInt', (GM_getValue('robLossCountInt', 0) + 1));
      } else if (innerNoTags.indexOf('You cannot rob') != -1) {
        if (context.id) {
          addToLog('process Icon', 'Removing family member from target list.');
          setRobOpponentAvoid(context.id);
        }
      } else {
        // not enough stam or health
        DEBUG('Rob response: ' + innerNoTags);
        DEBUG('Stamina or health may be too low. Or robbing a nonexistent casino.');
      }

      if (innerNoTags.indexOf('You were snuffed') != -1) {
        addToLog('bad Icon', 'You <span class="bad">DIED</span>.');
      }

      // Refresh statistics display.
      updateLogStats();

      Autoplay.start();
      return true;
      break;

    case 'hitman':
      // If the target is gone, there is nothing to do.
      if (innerNoTags.indexOf('someone else took out') != -1) {
        DEBUG(inner);
        return false;
      }

      // Default action is to reload the hitlist.
      if (stamina) {
        Autoplay.fx = goHitlistTab;
      }

      var targetKilled = (innerNoTags.indexOf('You knocked out') != -1);
      if (innerNoTags.indexOf('You WON') != -1) {
        var cashGain = innerNoTags.match(/gained.*?([A-Z]?\$[\d,]*\d)/i);
        var cashWon = RegExp.$1
        var experience = innerNoTags.match(/\d+\s+experience\s+points?/i);
        addToLog('good Icon', 'Hit ' + linkToString(context.profile, 'user') +
                 ', <span class="good">WON ' + cashWon + '</span> and ' +
                 '<span class="good">' + experience + '</span>.');
        GM_setValue('hitmanWinCountInt',GM_getValue('hitmanWinCountInt',0)+1);
        GM_setValue('hitmanWinDollarsInt', '' + (parseInt(GM_getValue('hitmanWinDollarsInt', 1)) + parseCash(cashWon.split('$')[1])));
        GM_setValue('totalExpInt', GM_getValue('totalExpInt', 0) + parseInt(experience));
        GM_setValue('totalWinDollarsInt', '' + (parseInt(GM_getValue('totalWinDollarsInt', 1)) + parseCash(cashWon.split('$')[1])));

        if (!targetKilled && canSpendStamina() && ptsToNextLevel > 6) {
          var elt = xpathFirst('.//a[contains(.,"Attack Again")]', messagebox);
          if (elt) {
            // Attack again immediately.
            Autoplay.fx = function() {
              clickAction = action;
              clickContext = context;
              clickElement(elt);
              DEBUG('Clicked to repeat the hit on ' + clickContext.name +
                    ' (' + clickContext.id + ').');
            }
            Autoplay.delay = 0;
          }
        }
      } else if (innerNoTags.indexOf('You LOST') != -1) {
        var t = innerNoTags.match(/LOST.*?([A-Z]?\$[\d,]*\d)/i);
        var cashLoss = RegExp.$1;
        var result = 'Hit ' + linkToString(context.profile, 'user') +
                     ' <span class="bad">LOST ' + cashLoss + '.</span>';
        GM_setValue('hitmanLossCountInt',GM_getValue('hitmanLossCountInt',0)+1);
        GM_setValue('hitmanLossDollarsInt', '' + (parseInt(GM_getValue('hitmanLossDollarsInt', 0)) + parseCash(cashLoss.split('$')[1])));
        GM_setValue('totalLossDollarsInt', '' + (parseInt(GM_getValue('totalLossDollarsInt', 0)) + parseCash(cashLoss.split('$')[1])));
        if (context.id) {
          // Add the opponent to the avoid list.
          setHitmanOpponentAvoid(context.id);
          result += ' Avoiding.';
        }
        addToLog('bad Icon', result);
      } else if (innerNoTags.indexOf('You cannot fight') != -1) {
        if (context.id) {
          setHitmanOpponentAvoid(context.id);
        }
      } else {
        DEBUG(inner);
      }
      if (innerNoTags.indexOf('You were snuffed') != -1) {
        addToLog('updateBad Icon', 'You <span class="bad">DIED</span>.');
      }
      if (targetKilled) {
        if (context.id) {
          addSavedListItem('hitmanListKilled', context.id, 100);
        }
        addToLog('lootbag Icon', killedMobsterIcon +
                 ' You <span class="bad">KILLED</span> ' +
                 linkToString(context.profile, 'user') +
                 ' and collected the <span class="money">' +
                 context.bounty + '</span> bounty set by ' +
                 linkToString(context.payer, 'user') + '.');

        GM_setValue('hitmanWinCountInt',GM_getValue('hitmanWinCountInt',0)+1);
        GM_setValue('hitmanWinDollarsInt', '' + (parseInt(GM_getValue('hitmanWinDollarsInt', 1) + parseCash(context.bounty))));
        GM_setValue('totalExpInt', GM_getValue('totalExpInt', 0) + parseInt(experience));
        GM_setValue('totalWinDollarsInt', '' + (parseInt(GM_getValue('totalWinDollarsInt', 1)) + parseCash(context.bounty)));
      }
      updateLogStats();
      Autoplay.start();
      return true;
      break;

    case 'stats':
      if (innerNoTags.match(/You just upgraded your (\w+)/i)) {
        var stat = RegExp.$1.toLowerCase();
        switch (stat) {
          case 'attack':
            curAttack++;
            GM_setValue('nextStat' , DEFENSE_STAT)
            addToLog('process Icon', '<span style="color:#885588;">'+'You upgraded '+ attackIcon + ' attack.</span>');
            break;
          case 'defense':
            curDefense++;
            GM_setValue('nextStat' , HEALTH_STAT)
            addToLog('process Icon', '<span style="color:#885588;">'+'You upgraded '+ defenseIcon + ' defense.</span>');
            break;
          case 'health':
            maxHealth++;
            GM_setValue('nextStat' , ENERGY_STAT)
            addToLog('process Icon', '<span style="color:#885588;">'+'You upgraded '+ healthIcon + ' health.</span>');
            break;
          case 'energy':
            maxEnergy++;
            GM_setValue('nextStat' , STAMINA_STAT)
            addToLog('process Icon', '<span style="color:#885588;">'+'You upgraded '+ energyIcon + ' energy.</span>');
            break;
          case 'stamina':
            maxStamina++;
            GM_setValue('nextStat' , INFLUENCE_STAT)
            addToLog('process Icon', '<span style="color:#885588;">'+'You upgraded '+ staminaIcon + ' stamina.</span>');
            break;
          case 'influence':
            maxInfluence++;
            GM_setValue('nextStat' , ATTACK_STAT)
            addToLog('process Icon', '<span style="color:#885588;">'+'You upgraded '+ influenceIcon + ' influence.</span>');
            break;
          default:
            addToLog('process Icon', '<span style="color:#885588;">'+'You upgraded ' + stat + '.</span>');
        }
      } else {
        DEBUG('Failed to increment stat.');
      }
      break;

    case 'accept':
      var accepts = innerNoTags.match(/You joined/gi);
      if (accepts) {
        addToLog('process Icon', 'Accepted ' + accepts.length + ' mafia ' +
                 (accepts.length > 1 ? ' invites.' : ' invite.'));
      } else {
        DEBUG('Unrecognized response for "accept" action.');
        DEBUG(inner);
      }
      break;

    case 'repair':
      if (innerNoTags.indexOf('You need more cash') != -1) {
        addToLog('warning Icon', 'Someone must have robbed you again before we could repair...');
      } else {
        addToLog('process Icon', 'For <span class="expense">$' +
                 makeCommaValue(context.cost) +
                 '</span>, you repaired all of your properties.');
        DEBUG(inner);
      }
      propertyGetDamage(rootElt);
      break;

    case 'protect':
      if (innerNoTags.indexOf('You need more cash') != -1) {
        addToLog('warning Icon', 'Someone must have robbed you again before we could protect...');
      } else {
        addToLog('process Icon', 'For <span class="expense">$' +
                 makeCommaValue(context.cost) +
                 '</span>, you protected all of your properties.');
        DEBUG(inner);
      }
      propertyGetDamage(rootElt);
      break;

    case 'energypack':
      addToLog('energyPack Icon', 'Used an <span class="good">Energy Pack</span>.');
      DEBUG(inner);
      break;

    case 'help':
      DEBUG('Parsing job help.');

      // Help attempt was processed. Increment the update count.
      GM_setValue('logPlayerUpdatesCount', 1 + GM_getValue('logPlayerUpdatesCount', 0));

      var user = linkToString(messagebox.getElementsByTagName('a')[0], 'user');
      if (context && !user) {
        user = context.user;
      }
      if (innerNoTags.indexOf('not your friend') != -1 ||
          innerNoTags.indexOf('You need to be friends') != -1) {
        addToLog('info Icon', 'Failed to help' + (user? ' ' + user : '') +
                 ' with job. Reason: not friends.');
      } else if (innerNoTags.indexOf('You are too late') != -1) {
          addToLog('info Icon', 'You are too late to help ' +
                   (user? ' ' + user : '') + ' with this job.');
      } else if (innerNoTags.indexOf('Not Again') != -1) {
          addToLog('info Icon', 'Already helped ' + user + ' with this job.');
      } else if (innerNoTags.indexOf('You received') != -1) {
          var cost = innerNoTags.match(REGEX_CASH);
          var experience = parseInt(innerNoTags.match(/\d+\s+experience\s+points?/i));
          if (innerNoTags.indexOf('Special Bonus') != -1) {
            var loot = innerNoTags.split('gained a ')[1];
            addToLog('lootbag Icon', '<span class="loot">'+' Found a '+ loot.split('.<span')[0] + ' while helping on a job.</span>');
          }
          var result = 'You received ' + '<span class="good">' +
                   cost + '</span>' + ' and ' +
                   '<span class="good">' + experience + ' experience</span>' +
                   ' for helping ' + user + ' complete the job.';
          addToLog('updateGood Icon', result);
      } else {
        addToLog('info Icon', 'WARNING: Not sure what happened when ' +
                 'trying to help' + (user? ' ' + user : '') + '.' +
                 (context? ' ' + context.help : '') +
                 ' Perhaps you interfered by clicking on something?');
      }
      Autoplay.start();
      return true;
      break;

    case 'sell output':
      // Log any message from a sale of Cuban business output.
      if (inner.match(/sold|collected/i)) {
        addToLog(cityIcons[city], inner);
      } else {
        DEBUG(inner);
      }
      break;

    case 'deposit':
      if (innerNoTags.match(/deposited/i)) {
        addToLog(cityIcons[city], inner);
      } else {
        DEBUG(inner);
      }
      break;

    case 'withdraw':
      if (innerNoTags.match(/withdrew/i)) {
        addToLog(cityIcons[city], inner);
      } else {
        DEBUG(inner);
      }
      break;

    case 'collect ny take':
      if (innerNoTags.match(/You just collected take for production of/i)) {
        var production = innerNoTags.match(/^You just collected take for production of \d+ worth \$[\d,]*./i);
        addToLog(cityIcons[city], production);
      } else {
        DEBUG(inner);
      }
      break;

    default:
      addToLog('warning Icon', 'BUG DETECTED: Unrecognized action "' +
               action + '".');
      DEBUG(inner);
  }

  return false;
}

//update the script (by Richard Gibson; changed by ms99 and blannie)
function updateScript() {
  try {
    if (!GM_getValue) {
      return;
    }
    GM_xmlhttpRequest({
      method: 'GET',
      url: SCRIPT.url + '?source', // don't increase the 'installed' count; just for checking
      onload: function(result) {
        if (result.status != 200) {
          return;
        }
        if (!result.responseText.match(/build:\s+'(\d+)/)) return;
        var theOtherBuild = parseInt(RegExp.$1);
        var runningBuild = parseInt(SCRIPT.build);
        var theOtherVersion = result.responseText.match(/@version\s+([\d.]+)/)? RegExp.$1 : '';
        if (theOtherBuild < runningBuild) {
          if (window.confirm('You have a beta version (build ' + runningBuild + ') installed.\n\nDo you want to DOWNGRADE to the most recent official release (version ' + theOtherVersion + ')?\n')) {
            //clearSettings();
            window.location.href = SCRIPT.url;
          }
          return;
        } else if (theOtherBuild > runningBuild ||
                   theOtherVersion != SCRIPT.version) {
          if (window.confirm('Version ' + theOtherVersion + ' is available!\n\n' + 'Do you want to upgrade?' + '\n')) {
            //clearSettings();
            window.location.href = SCRIPT.url;
          }
        } else {
          alert('You already have the latest version.');
          return;
        }
      }
    });
  } catch (ex) {
    addToLog('warning Icon', ex);
  }
}

///////////////////////////////////////////////////////////////////////////////
//                           UTILITY METHODS                                 //
///////////////////////////////////////////////////////////////////////////////


/******************************** General ********************************/

function clearSettings() {
  if (typeof GM_listValues == 'function' &&
      typeof GM_deleteValue == 'function') {
    var values = GM_listValues();
    for (var i in values) {
      GM_deleteValue(values[i]);
    }
  } else {
    alert('In order to do this you need at least GreaseMonkey version: 0.8.20090123.1. Please upgrade and try again.');
  }
}

/******************************** Array ********************************/

function getArrayDiffs(workingArray) {
  diffArray = [];
  for (var i = 1; i < workingArray.length; i++) {
    if (workingArray[i] - workingArray[i-1] < 0) {
      diffArray.push(0)
    } else {
      diffArray.push(workingArray[i] - workingArray[i-1]);
    }
  }
  diffArray.unshift(0);
  return diffArray;
}

// Save an array of strings. The strings must not contain "\n".
function setSavedList(listName, list) {
  GM_setValue(listName, list.join('\n'));
}

// Get an array of strings that was saved with setSavedList().
function getSavedList(listName) {
  var savedList = GM_getValue(listName, '');
  return savedList? savedList.split('\n') : [];
}

// Add an item to a list saved with setSavedList().
// If the size of the list is greater than the "max"
// parameter, the first item in the list is removed.
function addSavedListItem(listName, item, max) {
  var savedList = getSavedList(listName);

  // Only add if it isn't already there.
  if (savedList.indexOf(item) != -1) {
    return;
  }

  savedList.push(item);
  if (max > 0) {
    while (max < savedList.length) {
      var item = savedList.shift();
      DEBUG('Removing ' + item + ' from ' + listName + '.');
    }
  }
  setSavedList(listName, savedList);
}

// Remove an item from a list saved with setSavedList().
function removeSavedListItem(listName, item) {
  var savedList = getSavedList(listName);
  var idx = savedList.indexOf(item);
  if (idx != -1) {
    savedList.splice(idx, 1);
    setSavedList(listName, savedList);
    return true;
  }
  // No matches.
  return false;
}

function cycleSavedList(listName) {
  // Move the first item to the end of the list.
  var opponents = GM_getValue(listName, '').split('\n');
  var first = opponents.shift();
  if (first) {
    opponents.push(first);
  }
  GM_setValue(listName, opponents.join('\n'));
}

/******************************** HTML/DOM ********************************/

function stripURI(img) {
  img = img.split('"')[1];
  return img.replace('" />', '');
}

function showIfUnchecked(setting) {
  if (setting == '0') {
    setting = 'unchecked';
  }
  return setting;
}

function showIfSelected(setting) {
  if (setting == '0') {
    setting = 'not selected';
  } else {
    setting = 'selected';
  }
  return setting;
}

function showIfRelative(key) {
  return GM_getValue(key) == 'checked'? 'relative' : 'absolute';
}

// Converts a link element to an HTML string with an optional CSS class.
function linkToString(link, className) {
  if (!link) return;

  var str = '<a';
  if (className)
    str += ' class="' + className + '"';
  var onclick = link.getAttribute('onclick');
  if (onclick)
    str += ' onclick="' + onclick + '"';
  str += ' href="' + link.href + '">' + link.innerHTML + '</a>';

  return str;
}

function decodeHTMLEntities(str) {
  if (!str) return str;

  scratchpad.innerHTML = str;
  return scratchpad.value;
}

function clickElement(elt) {
  if (!elt) {
    addToLog('warning Icon', 'BUG DETECTED: Null element passed to clickElement().');
    return;
  }

  // Simulate a mouse click on the element.
  var evt = document.createEvent('MouseEvents');
  evt.initMouseEvent("click", true, true, window,
                     0, 0, 0, 0, 0, false, false, false, false, 0, null);
  elt.dispatchEvent(evt);
}

function ignoreElement(element) {
  var parentElt = element.parentNode;
  if (parentElt) {
    var id = parentElt.id;
    if (id && (id.indexOf('countdown') != -1 || id.indexOf('timer') != -1))
      return true;
  }

  var id = element.id;
  if (id && (id.indexOf('countdown') != -1 || id.indexOf('timer') != -1))
    return true;

  return false;
}

function logElement(element, heading) {
  if (!element) return;

  // Write information about the element to the javascript console.
  var elt = element;
  GM_log((heading? heading + ' ' : '') +
         'tag=' + elt.tagName +
         ', id=' + elt.id +
         ', class=' + elt.className +
         ', value=' + elt.nodeValue
  );
  elt = element.parentNode;
  if (elt) {
    GM_log((heading? heading + ' ' : '') +
           'parent tag=' + elt.tagName +
           ', id=' + elt.id +
           ', class=' + elt.className +
           ', value=' + elt.nodeValue
    );
  }
}

function xpathFirst(p, c) {
  return document.evaluate(p, c || document, null, XPathResult.ANY_UNORDERED_NODE_TYPE, null).singleNodeValue;
}

function $x(p, c) {
  var i, r = [], x = document.evaluate(p, c || document, null, XPathResult.UNORDERED_NODE_ITERATOR_TYPE, null);
  while (i = x.iterateNext()) r.push(i);
  return r;
}

function xpath(query, element) {
  var element = (element == null) ? document : element;
  return document.evaluate(query, element, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
}

// Toggle checkbox element and return true if it is checked
function toggleCheckElt(eltId) {
  if (GM_getValue(eltId) == 'checked') {
    GM_setValue(eltId, '0');
    return false;
  } else {
    GM_setValue(eltId, 'checked');
    return true;
  }
}

// Save an array of checkbox elements
function saveCheckBoxElementArray(arrayEltIds) {
  for (var i=0; i<arrayEltIds.length; i++)
    saveCheckBoxElement(arrayEltIds[i])
}

// Save checkbox element and return true if it is checked
function saveCheckBoxElement(eltId) {
  if (document.getElementById(eltId).checked === true) {
    GM_setValue(eltId, 'checked');
    return true;
  } else {
    GM_setValue(eltId, 0);
    return false;
  }
}

function makeElement(type, appendto, attributes, checked, chkdefault) {
  var element = document.createElement(type);
  if (attributes != null) {
    for (var i in attributes) {
      element.setAttribute(i, attributes[i]);
    }
  }
  if (checked != null) {
    if (GM_getValue(checked, chkdefault) == 'checked') {
      element.setAttribute('checked', 'checked');
    }
  }
  if (appendto) {
    appendto.appendChild(element);
  }
  return element;
}

/******************************** CASH PARSING ********************************/

// Parse a monetary value such as "C$50,000" and return an integer.
function parseCash(cash) {
  var c = cash;
  if (typeof(c) == 'string') {
    c = c.trim().replace(/[A-Z$,'']/g, '');
  }
  return parseInt(c);
}

function makeCommaValue(nStr) {
  nStr += '';
  x = nStr.split('.');
  x1 = x[0];
  var rgx = /(\d+)(\d{3})/;
  while (rgx.test(x1)) {
    x1 = x1.replace(rgx, '$1' + ',' + '$2');
  }
  return x1;
}

/******************************** DATE/TIME ********************************/

// reads a date string from a stored GM value and converts it to seconds since 1970
function getGMTime(GMvalue) {
  var tempVal = GM_getValue(GMvalue, 0);
  var d = Date.parse(tempVal);
  return d/1000;
}

// takes a string input in the form of a countdown 'MM:SS', 'HH:MM:SS', 'MM minutes and SS seconds' and stores the
// time when the countdown is zero in a GM value.  Also takes an input of 'now' and stores the current time.
function setGMTime(GMvalue, countdownStr) {
  var d = new Date();
  d.setMilliseconds(0);

  if (countdownStr != 'now')
    d.setTime(d.getTime()+(timeLeft(countdownStr)*1000));

  GM_setValue(GMvalue, d.toString());
}

// returns the number of seconds left until a date stored in a GM value
function timeLeftGM(GMvalue) {
  var timeToCompare = getGMTime(GMvalue);

  var d = new Date();
  d.setMilliseconds(0);

  return Math.max(timeToCompare-(d.getTime()/1000), 0);
}

// takes a string input in the form of 'MM:SS', 'HH:MM:SS', or 'MM minutes and SS seconds' and returns the number of seconds it represents
function timeLeft(timeToConvert) {
  if (!timeToConvert)
    return 0;

  var returnVal = 0;

  var temp = new Array();
  temp = timeToConvert.split(':');

  if (temp.length == 2)  // MM:SS
    returnVal = ((parseInt(temp[0]) * 60) + parseInt(temp[1]));
  else if (temp.length == 3) // HH:MM:SS
    returnVal = ((parseInt(temp[0]) * 60 * 60) + (parseInt(temp[1]) * 60) + parseInt(temp[2]));
  else if (temp.length == 1) {  // 'HH hours and MM minutes and SS seconds'
    temp = timeToConvert.split(' and ');
    for (i = 0; i < temp.length; i++) {
      spaceIndex = temp[i].indexOf(' ');
      if (spaceIndex != -1) {
        firstPart = temp[i].substring(0, spaceIndex);
        secondPart = temp[i].substring(spaceIndex+1, temp[i].length);
        if ((secondPart == 'minutes') || (secondPart == 'minute'))
          returnVal = returnVal + (parseInt(firstPart) * 60);
        else if ((secondPart == 'seconds') || (secondPart == 'second'))
          returnVal = returnVal + (parseInt(firstPart));
        else if ((secondPart == 'hours') || (secondPart == 'hour'))
          returnVal = returnVal + (parseInt(firstPart * 60 * 60));
      }
    }
  }

  return(returnVal);
}