403Webshell
Server IP : 182.53.201.61  /  Your IP : 216.73.217.175
Web Server : Apache/2.2.15 (Fedora)
System : Linux km10.dyndns.org 2.6.31.5-127.fc12.i686.PAE #1 SMP Sat Nov 7 21:25:57 EST 2009 i686
User : apache ( 48)
PHP Version : 5.3.3
Disable Function : NONE
MySQL : ON  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : ON  |  Pkexec : ON
Directory :  /opt/google/chrome/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /opt/google/chrome//chrome.pak
|61M nM#XE2ôCsyQMROc/bd{7N0OSOR	lS
	$/		~
	.	0VE
h
[$
'#($Gy$Rl%Y_I3
@
-;hvi	kIo	F
	F&5
[<s
x
Y67

Ko
m
'>d
eeJ	
n5;


v(
`
FF(FFYFi
h

3&- Ddd$D5FV~glh*ydF6DzFFJF$SO(
J$"F
']T*^5yA=MLZZL[[|\v}\~h9?s9x~u%)tr%wI!$rIrԨR&+Ql`e3yqzwַ`2Jts1wp-Lqyi
r=wHvwfx'Oy@(z.{3N|;w}|B~CtDImNl`TP[`gn(t-wkw}y}jy4PXS,8F>U"zqdeMJ7r^A	E0?@@AH	BHQBHBODjE)GGHISISEJWJKL@MN
O;7QWQWQ`ERTUW~XXWYYH=ZHZNZL[[d\+]I^b#(hl
w\{:,w1ӫasPîï?ǶK~Kh(+]K0Gw-
`*p"	')
,v0-7O>?MeBGLPU}/VxVz[%`+PdhYm?or	u+ 4w!x"y#k}
'$x%&g'()*d+#*,	!-*r./!B0c1~N23u4 5

y6718\9\W:5;Z<BO=@>?b@bA]B'.
CJ1D:E	CF&F
GP\H@cIgJyePQJbRwS#T	UVW
aXd
Yjp+Z@1[rf\y]R^e7_`a?	b cXdUee;f06gM!hoiH	j^?k!lm&nn,oV5pPwqir
~Vsct uvwz +$ |'k./4:A(IYISKRLsM3NON4OOPiQ=RRT@Ua1V]adga&hahahfNilosp
-{a{@Bw
1sj#%tm(&+c,)-2)5 
 ?Da,X~"Yڠ`<!DOCTYPE HTML>

<!--
about:memory template page
-->
<html id="t">
  <head>
    <title>About Memory</title>

<style>
body {
  font-size: 84%;
  font-family: Arial, Helvetica, sans-serif;
  padding: 0.75em;
  margin: 0;
  min-width: 45em;
}

h1 {
  font-size: 110%;
  font-weight: bold;
  color: #4a8ee6;
  letter-spacing: -1px;
  padding: 0;
  margin: 0;
}
h2 {
  font-size: 110%;
  letter-spacing: -1px;
  font-weight: normal;
  color: #4a8ee6;
  padding: 0;
  margin: 0;
  padding: 0.5em 1em;
  color: #3a75bd;
  margin-left: -38px;
  padding-left: 38px;

  border-top: 1px solid #3a75bd;
  padding-top: 0.5em;

}
h2:first-child {
  border-top: 0;
  padding-top: 0;
}
span.th {
  padding-left: 0.35em;
}
a {
  color: black;
}

div#header {
  padding: 0.75em 1em;
  padding-top: 0.6em;
  padding-left: 0;
  margin-bottom: 0.75em;
  position: relative;
  overflow: hidden;
  background: #5296de;
  background-size: 100%;
  border: 1px solid #3a75bd;
  border-radius: 6px;
  color: white;
  text-shadow: 0 0 2px black;
}
div#header h1 {
  padding-left: 37px;
  margin: 0;
  display: inline;
  background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPCAQAAACouOyaAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQdJREFUKJFl0CFOA1EQBuAnED3BChQoFJyCG6BwOC4ApqooOACoqgqqUBhMTVURmAoqHqLJbsJLuiSvockKzIdoS1jIqJn5Msk/QRAE+27MdDfdg8qlzroLm+GLrFIZuPWoVqrct8lYaS6aq5RKUdRvk54kil49m4miN6dtUll4NXSoUBiYiyZbsufMvSy5EH5qqFLqOxaCicbKwlTxi+yqlZKFq2BkpZbMtiEFQSFLSu+ug6FPtWT+j2RJ0gv2dGUf6m0CQdD3JXty6mA7WqMThY7CncanaTv0rSzLoqkFGtl5m0w0smyl0Whky7/fXUfPxl6sNhdHbRJ0JSMdO3Y8Weo5Wm++Ac2ic0DR0k0+AAAAAElFTkSuQmCC") 12px 60% no-repeat;
  color: white;
}
div#header p {
  font-size: 84%;
  font-style: italic;
  padding: 0;
  margin: 0;
  color: white;
  padding-left: 0.4em;
  display: inline;
}
div#header div.navigation {
  position: absolute;
  top: 0;
  right: 1em;
  line-height: 3.5em;
  font-size: 92%;
}
div#header select {
  font-size: 100%;
  font-family: Arial, Helvetica, sans-serif;
  border: 1px solid #3a75bd;
  line-height: 140%;
  color: #315d94;
}
div#header select option {
  padding: 0 0.2em;
}

div#sidebar {
  display: none;
  float: left;
  margin-left: 26px;
  width: 45em;
  min-height: 20em;
  padding: 0.75em;
  padding-top: 0;

  border-right: 1px solid #cfcfcf;
}
div#content {
  margin-left: 0px;
}

div.viewOptions {
  float: right;
  font-size: 92%;
  color: #5f5f5f;
  margin-top: 1em;
}
hr {
  visibility: hidden;
  display: inline;
  padding: 0 0.5em;
}
div.viewOptions input {
  font-family: Arial, Helvetica, sans-serif;
  font-size: 100%;
  border: 1px solid #b5b5b5;
  border-radius: 6px;
  padding: 0.3em 0.4em;
}
div.viewOptions input:focus {
  border-color: white;
}

.k {
  opacity: 0.4;
  font-weight: normal;
  padding-left: 0.1em;
}

.legend {
  font-size: 84%;
  padding: 0;
  padding-top: 0.4em;
  margin-top: 2em;
  text-align: right;
  line-height: 140%;
  color: #7f7f7f;
}
.legend h3 {
  padding: 0;
  padding-right: 0.5em;
  margin: 0;
  font-weight: normal;
  color: black;
  display: inline;
  font-size: 100%;
}
.legend .swatch {
  opacity: 0.66;
  padding: 0 0.5em;
  display: inline-block;
  margin-right: 0.2em;
  height: 0.9em;
}
.legend .swatch.heavyUse {
  background: #cc0000;
}

table.list {
  width: 100%;
  line-height: 200%;
  border-collapse: collapse;
  font-size: 84%;
  table-layout: fixed;
}
table.list:not([class*='filtered']) tr:nth-child(odd) td {
  background: #eff3ff;
}
.hidden {
  display: none;
}
table.list th {
  padding: 0 0.5em;
  vertical-align: top;
  font-weight: bold;
  color: #315d94;
  color: black;
  white-space: nowrap;
}
table.list .firstRow th {
  text-align: left;
  line-height: 100%;
}
table.list .secondRow * {
  text-align: left;
  border-bottom: 1px solid #b5c6de;
}
table.list td {
  padding: 0 0.5em;
  vertical-align: top;
  line-height: 1.4em;
  padding-top: 0.35em;
}
table.list tr td:nth-last-child(1),
table.list tr th:nth-last-child(1) {
  padding-right: 1em;
}
table.list:not([class*='filtered']) .tab .name {
  padding-left: 1.5em;
}

table.list .name {
  width: 100%;
}

table.list .name div {
  height: 1.6em;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}
table.list .pid {
  width: 4em;
  text-align: right;
}
table.list .pid .th {
  padding: 0;
}
table.list .type {
  width: 5em;
}
table.list .number {
  width: 7em;
  text-align: right;
}
table.list .total {
  font-weight: bold;
}
table.list .total .name {
  color: #315d94;
  text-align: right;
}
table.list .total td {
  border-top: 1px solid #b5c6de;
  background: white !important;
}
table.list .noResults {
  display: none;
}
table.list.noResults .noResults {
  display: table-row;
}
table.list .noResults td {
  text-align: center;
  padding: 3em 0;
  color: #3f3f3f;
}

.heavyUse {
  color: #cc0000;
  font-weight: bold;
}

table.list#memoryDetails tr:not([class*='firstRow']) > *:nth-child(2),
table.list#memoryDetails tr:not([class*='firstRow']) > *:nth-child(5),
table.list#memoryDetails tr.firstRow th:nth-child(2) {
  border-right: 1px solid #b5c6de;
}

table.list#browserComparison tr:not([class*='firstRow']) > *:nth-child(1),
table.list#browserComparison tr:not([class*='firstRow']) > *:nth-child(4),
table.list#browserComparison tr.firstRow th:nth-child(1) {
  border-right: 1px solid #b5c6de;
}
table.list#browserComparison .name {
  padding-left: 25px;
  background-position: 5px center;
  background-repeat: no-repeat;
}

div.help {
  display: inline-block;
  width: 14px;
  margin: -1px 0;
  height: 14px;
  background: url("data:image/gif;base64,R0lGODlhDAAMAMQAAAAAAP////T4/ujx/ery/UKP7k6W71CX71KY71Sa8Gak8XGr8nWu83ev83qv83ux83yx832y85XA9aHH96rN+KvO+KzO+K3O+LnV+cTc+tDj+9Xm+////wAAAAAAAAAAACH5BAEAABwALAAAAAAMAAwAAAVKIMcRVoMgjUWI3BYVcOxs41tIGqbAEQkvgshkECv9XopAzBQrKASX2KmZyTRRzUYia2lqdkWCrbAwxHqtRxMGoYkIFcbhwKCsOCEAOw==") center bottom no-repeat;
  opacity: 0.33;
}
div.help:hover {
  opacity: 1;
}
div.help div {
  display: none;
}
#helpTooltip {
  z-index: 1000;
  position: absolute;
  background: #d6e8ff;
  padding: 0.3em 0.8em;
  max-width: 30em;
  -webkit-box-shadow: 3px 3px 4px rgba(0, 0, 0, 0.33);
  border: 1px solid #a8cfff;
  border-radius: 0;
  line-height: 140%;
  font-size: 92%;
}
#helpTooltip p {
  margin: 0.6em 0;
}
div.otherbrowsers {
  font-family: Arial, Helvetica, sans-serif;
  font-size: 84%;
  width: 100%;
  text-align: center;
}
</style>
<script>
function reload() {
  if (document.getElementById('helpTooltip'))
    return;
  history.go(0);
}

function formatNumber(str) {
  str += '';
  if (str == '0') {
    return 'N/A ';
  }
  var x = str.split('.');
  var x1 = x[0];
  var x2 = x.length > 1 ? '.' + x[1] : '';
  var regex = /(\d+)(\d{3})/;
  while (regex.test(x1)) {
    x1 = x1.replace(regex, '$1' + ',' + '$2');
  }
  return x1;
}

function addToSum(id, value) {
  var target = document.getElementById(id);
  var sum = parseInt(target.innerHTML);
  sum += parseInt(value);
  target.innerHTML = sum;
}

function handleHelpTooltipMouseOver(event) {
  var el = document.createElement('div');
  el.id = 'helpTooltip';
  el.innerHTML = event.toElement.getElementsByTagName('div')[0].innerHTML;
  el.style.top = 0;
  el.style.left = 0;
  el.style.visibility = 'hidden';
  document.body.appendChild(el);

  var width = el.offsetWidth;
  var height = el.offsetHeight;

  if (event.pageX - width - 50 + document.body.scrollLeft >= 0 ) {
    el.style.left = (event.pageX - width - 20) + 'px';
  } else {
    el.style.left = (event.pageX + 20) + 'px';
  }


  if (event.pageY - height - 50 + document.body.scrollTop >= 0) {
    el.style.top = (event.pageY - height - 20) + 'px';
  } else {
    el.style.top = (event.pageY + 20) + 'px';
  }

  el.style.visibility = 'visible';
}

function handleHelpTooltipMouseOut(event) {
  var el = document.getElementById('helpTooltip');
  el.parentNode.removeChild(el);
}

function enableHelpTooltips() {
  var helpEls = document.getElementsByClassName('help');

  for (var i = 0, helpEl; helpEl = helpEls[i]; i++) {
    helpEl.onmouseover = handleHelpTooltipMouseOver;
    helpEl.onmouseout = handleHelpTooltipMouseOut;
  }
}

//setInterval("reload()", 10000);
</script>
</head>
<body>
    <div id='header'>
      <h1>
        About memory
      </h1>
      <p>
        Measuring memory usage in a multi-process browser
      </p>
    </div>

    <div id='content'>
      <h2>
        Summary
        <div class='help'>
          <div>
            <p>
                Summary of memory used by currently active browsers.
                For browsers which use multiple processes, memory reflects
                aggregate memory used across all browser processes.<p>
                For Chromium, processes used to to display diagnostics
                information (such as this "about:memory") are excluded.
            </p>
          </div>
        </div>
      </h2>

      <table class='list' id='browserComparison'>
        <colgroup>
          <col class='name' />
          <col class='number' />
          <col class='number' />
        </colgroup>
        <tr class='firstRow doNotFilter'>
          <th>
          </th>
          <th colspan='2'>
            Memory
            <div class='help'>
              <div>
                <p>
                  <strong>Memory</strong>
                </p>
                <p>
                  <strong>Private:</strong>
                  Resident memory size that is not shared with any other process.
                  This is the best indicator of browser memory resource usage.
                </p>
                <p>
                  <strong>Proportional:</strong>
                  Accounts for each page of memory as a fraction based on the number of
                  processes that have it mapped. Thus, for each page of memory mapped by two
                  processes, this sum will count half of the bytes towards each.
                  Therefore, this number is greater than the private count.
                </p>

                <p><i>(Note that the memory for this tab is not included in the browser totals)</i></p>
              </div>
            </div>
          </th>
        </tr>
        <tr class='secondRow doNotFilter'>
          <th class='name'>
            Browser
          </th>
          <th class='name'>
            Private
          </th>
          <th class='number'>
            Proportional
          </th>
        </tr>
        <tr jsselect="browsers">
          <td class='name'>
            <div>
              <strong jscontent="name"></strong> <span jscontent="version"></span>
            </div>
          </td>
          <td class='number'>
            <span class='th' jscontent="formatNumber(ws_priv)"></span><span class='k'>k</span>
          </td>
          <td class='number'>
            <span class='th' jscontent="formatNumber(ws_shared)"></span><span class='k'>k</span>
          </td>
        </tr>
      </table>
      <div class=otherbrowsers jsdisplay="show_other_browsers && browsers.length == 1">
        Note: If other browsers (e.g. IE, Firefox, Safari) are running,
        I'll show their memory details here.
      </div>

      <br /><br /><br />

      <h2>
        Processes
        <div class='help'>
          <div>
            <p>
                Details of memory usage for each of Chromium's processes.
            </p>
          </div>
        </div>
      </h2>

      <table class='list' id='memoryDetails'>
        <colgroup>
          <col class='pid' />
          <col class='name' />
          <col class='number' />
          <col class='number' />
        </colgroup>
        <tr class='firstRow doNotFilter'>
          <th>
          </th>
          <th>
          </th>
          <th colspan='2'>
            Memory
          </th>
        </tr>
        <tr class='secondRow doNotFilter'>
          <th class='pid'>
            PID
          </th>
          <th class='name'>
            Name
          </th>
          <th class='number'>
            Private
          </th>
          <th class='number'>
            Proportional
          </th>
        </tr>

        <tr jsselect="browzr_data">
          <td class='pid'>
            <span class='th' jscontent="pid"></span>
          </td>
          <td class='name'>
            <div>
              Browser
            </div>
          </td>
          <td class='number'>
            <span class='th' jseval="addToSum('tot_ws_priv', $this.ws_priv)" jscontent="formatNumber(ws_priv)"></span><span class='k'>k</span>
          </td>
          <td class='number'>
            <span class='th' jscontent="formatNumber(ws_shared)"></span><span class='k'>k</span>
          </td>
        </tr>
        <tr jsselect="child_data">
          <td class='pid'>
            <span class='th' jscontent="pid"></span>
          </td>
          <td class='name'>
            <div jscontent="child_name"></div>
            <div jsselect="titles">
              <span jscontent="$this"></span><br>
            </div>
          </td>
          <td class='number'>
            <span class='th' jseval="addToSum('tot_ws_priv', $this.ws_priv)" jscontent="formatNumber(ws_priv)"></span><span class='k'>k</span>
          </td>
          <td class='number'>
            <span class='th' jscontent="formatNumber(ws_shared)"></span><span class='k'>k</span>
          </td>
        </tr>
        <tr class='total doNotFilter'>
          <td class='pid'>
          </td>
          <td class='name'>
            &Sigma;
          </td>
          <td class='number'>
            <span class='th' id="tot_ws_priv">0</span><span class='k'>k</span>
          </td>
          <td class='number'>
          </td>
        </tr>

        <tr class='noResults'>
          <td colspan='99'>
            No results found.
          </td>
        </tr>
      </table>

      <div class="otherbrowsers">(The memory usage of our renderer processes is slightly less accurate when they are sandboxed.)</div>

    </div>
</body>
<script>
  enableHelpTooltips();
</script>
</html>
<!DOCTYPE HTML>

<html id="t">
  <head>
    <title>About Stats</title>

<style>
body {
  border-top: 10px solid #3B85E3;
  color: #333;
  font-family: Verdana, Helvetica, Arial, sans-serif;
}
body, td {
  font-size: 11px;
}
a:link, a:visited {
  color: #2C3EBA;
  text-decoration: none;
}
a:hover {
  color: red;
  text-decoration: underline;
}
h1 {
  border-left: 10px solid #FFF;
  font-size: 16px;
  font-weight: bold;
  margin: 0;
  padding: 0.2em;
  color: #3B85E3;
}
h2 {
  border-left: 10px solid #FFF;
  font-size: 11px;
  font-weight: normal;
  margin: 0;
  padding: 0 6em 0.2em 0.2em;
}
.details {
  margin: 0.4em 1.9em 0 1.2em;
  padding: 0 0.4em 0.3em 0;
  white-space: nowrap;
}
.details .outer {
  padding-right: 0;
  vertical-align: top;
}
.details .top {
  border-top: 2px solid #333;
  font-weight: bold;
  margin-top: 0.4em;
}
.details .header2 {
  font-weight: bold;
  padding-left: 0.9em;
}
.details .key {
  padding-left: 1.1em;
  vertical-align: top;
}
.details .value {
  text-align: right;
  color: #333;
  font-weight: bold;
}
.details .zebra {
  background: #EEE;
}
.lower {
  text-transform: lowercase;
}
</style>
<script>

/* Counter accessor for Name Node. */
function getCounterNameFromCounterNode(node) {
  return node.childNodes[1];
}

/* Counter accessor for Value Node. */
function getCounterValueFromCounterNode(node) {
  return node.childNodes[3];
}

/* Counter accessor for Delta Node. */
function getCounterDeltaFromCounterNode(node) {
  return node.childNodes[5];
}

/* Timer accessor for Name Node. */
function getTimerNameFromTimerNode(node) {
  return node.childNodes[1];
}

/* Timer accessor for Value Node. */
function getTimerValueFromTimerNode(node) {
  return node.childNodes[3];
}

/* Timer accessor for Time Node. */
function getTimerTimeFromTimerNode(node) {
  return node.childNodes[5];
}

/* Timer accessor for Average Time Node. */
function getTimerAvgTimeFromTimerNode(node) {
  return node.childNodes[7];
}

/* Do the filter work.  Hide all nodes matching node.*/
function filterMatching(text, nodelist, functionToGetNameNode) {
  var showAll = text.length == 0;
  for (var i = 0, node; node = nodelist[i]; i++) {
    var name = functionToGetNameNode(node).innerHTML.toLowerCase();
    if (showAll || name.indexOf(text) >= 0) {
      node.style.display = "table-row";
    } else {
      node.style.display = "none";
    }
  }
}

/* Hides or shows counters based on the user's current filter selection. */
function doFilter() {
  var filter = document.getElementById("filter");
  var text = filter.value.toLowerCase();
  var nodes = document.getElementsByName("counter");
  filterMatching(text, nodes, getCounterNameFromCounterNode);
  var nodes = document.getElementsByName("timer");
  filterMatching(text, nodes, getTimerNameFromTimerNode);
}

/* Colors the counters based on increasing or decreasing value. */
function doColor() {
  var nodes = document.getElementsByName("counter");
  for (var i = 0, node; node = nodes[i]; i++) {
    var child = getCounterDeltaFromCounterNode(node);
    var delta = child.innerHTML;
    if (delta > 0) {
      child.style.color = "Green";
    } else if (delta == 0) {
      child.style.color = "Black";
    } else {
      child.style.color = "Red";
    }
  }
}

/* Counters with no values are null. Remove them. */
function removeNullValues() {
  var nodes = document.getElementsByName("counter");
  for (var i = nodes.length - 1; i >= 0; i--) {
    var node = nodes[i];
    var value = getCounterValueFromCounterNode(node).innerHTML;
    if (value == "null") {
      node.parentNode.removeChild(node);
    }
  }
  var nodes = document.getElementsByName("timer");
  for (var i = 0, node; node = nodes[i]; i++) {
    var value_node = getTimerValueFromTimerNode(node);
    if (value_node.innerHTML == "null") {
      value_node.innerHTML = "";
    }
  }
}

/* Compute the average time for timers */
function computeTimes() {
  var nodes = document.getElementsByName("timer");
  for (var i = 0, node; node = nodes[i]; i++) {
    var count = getTimerValueFromTimerNode(node).innerHTML;
    if (count.length > 0) {
      var time = getTimerTimeFromTimerNode(node).innerHTML;
      var avg = getTimerAvgTimeFromTimerNode(node);
      avg.innerHTML = Math.round(time / count * 100) / 100;
    }
  }
}

/* All the work we do onload. */
function onLoadWork() {
  doColor();
  removeNullValues();
  computeTimes();
  document.getElementById("filter").focus();
}

// The function should only be used as the event handler
// on a table cell element. To use it, put it in a <td> element:
//  <td onclick="sort('string')" ...>
//
// The function sorts rows after the row with onclick event handler.
//
// type: the data type, 'string', 'number'
function sort_table(type){
  var cell = event.target;
  var cnum = cell.cellIndex;

  var row = cell.parentNode;
  var start_index = row.rowIndex + 1;

  var tbody = row.parentNode;
  var table = tbody.parentNode;

  var rows = new Array();

  var indexes = new Array();
  // skip the first row
  for (var i = start_index; i < table.rows.length; i++)
    rows.push(table.rows[i]);

  // a, b are strings
  function compare_strings(a,b) {
    if (a == b) return 0;
    if (a < b) return -1;
    return 1;
  }

  // a, b are numbers
  function compare_numbers(a,b) {
    var x = isNaN(a) ? 0 : a;
    var y = isNaN(b) ? 0 : b;
    return x - y;
  }

  var sort_func = undefined;
  if (type === 'string') {
    sort_func = function(a, b) {
      var x = a.cells[cnum].innerText;
      var y = b.cells[cnum].innerText;
      return compare_strings(x, y);
    } ;

  } else if (type === 'number') {
    sort_func = function(a, b) {
      var x = parseFloat(a.cells[cnum].innerText);
      var y = parseFloat(b.cells[cnum].innerText);
      return compare_numbers(x, y);
    }
  }

  rows.sort(sort_func);

  // change tables
  if (cell._reverse) {
    for (var i = rows.length - 1; i >= 0; i--)
      tbody.appendChild(rows[i]);
    cell._reverse = false;
  } else {
    for (var i = 0; i < rows.length; i++)
      tbody.appendChild(rows[i]);
    cell._reverse = true;
  }
}

</script>
</head>
<body onload="onLoadWork()">
  <div style="float: right">
    <br>Filter: <input id="filter" type="text" value="" onkeyup="doFilter()">
  </div>
  <h1 class="lower">About Stats</h1>
  <h2>Shhh!  This page is secret!</h2><br/>
  <table class="details" cellspacing="0" cellpadding="0" border="0">
    <tbody>
      <tr>
        <td class="outer">
          <table cellspacing="0" cellpadding="0" border="0">
            <tbody>
              <tr>
                <td class="top" width="100">Counters</td>
                <td class="top value" colspan=2></td>
              </tr>
              <tr>
                <td class="header2 lower" width="200" onclick="sort_table('string')">name</td>
                <td class="header2 lower" onclick="sort_table('number')">value</td>
                <td class="header2 lower" onclick="sort_table('number')">delta</td>
              </tr>
              <tr jsselect="counters" name="counter">
                <td class="key" width="200" jscontent="name"></td>
                <td class="value" jscontent="value"></td>
                <td class="value" jscontent="delta"></td>
              </tr>
            </tbody>
          </table>
        </td>
        <td width="15"/>
        <td class="outer">
          <table cellspacing="0" cellpadding="0" border="0">
            <tbody>
              <tr>
                <td class="top" width="100">Timers</td>
                <td class="top value"></td>
                <td class="top value" colspan=3></td>
              </tr>
              <tr>
                <td class="header2 lower" width="200" onclick="sort_table('string')">name</td>
                <td class="header2 lower" onclick="sort_table('number')">count</td>
                <td class="header2 lower" onclick="sort_table('number')">time (ms)</td>
                <td class="header2 lower" onclick="sort_table('number')">avg time (ms)</td>
              </tr>
              <tr jsselect="timers" name="timer">
                <td class="key" width="200" jscontent="name"></td>
                <td class="value" jscontent="value"></td>
                <td class="value" jscontent="time"></td>
                <td class="value"></td>
              </tr>
            </tbody>
          </table>
        </td>
      </tr>
    </tbody>
  </table><br/>
</body>
</html>
<html>
</html>
<html id="t">
<head>
<title>About Sync</title>

<style type="text/css">
body {
  font-size: 84%;
  font-family: Arial, Helvetica, sans-serif;
  padding: 0.75em;
  margin: 0;
  min-width: 45em;
}

h1 {
  font-size: 110%;
  font-weight: bold;
  color: #4a8ee6;
  letter-spacing: -1px;
  padding: 0;
  margin: 0;
}
h2 {
  font-size: 110%;
  letter-spacing: -1px;
  font-weight: normal;
  color: #4a8ee6;
  padding: 0;
  margin: 0;
  padding: 0.5em 1em;
  color: #3a75bd;
  margin-left: -38px;
  padding-left: 38px;

  border-top: 1px solid #3a75bd;
  padding-top: 0.5em;

}
h2:first-child {
  border-top: 0;
  padding-top: 0;
}

div#header {
  padding: 0.75em 1em;
  padding-top: 0.6em;
  padding-left: 0;
  margin-bottom: 0.75em;
  position: relative;
  overflow: hidden;
  background: #5296de;
  background-size: 100%;
  border: 1px solid #3a75bd;
  border-radius: 6px;
  color: white;
  text-shadow: 0 0 2px black;
}
div#header h1 {
  padding-left: 37px;
  margin: 0;
  display: inline;
  background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPCAQAAACouOyaAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQdJREFUKJFl0CFOA1EQBuAnED3BChQoFJyCG6BwOC4ApqooOACoqgqqUBhMTVURmAoqHqLJbsJLuiSvockKzIdoS1jIqJn5Msk/QRAE+27MdDfdg8qlzroLm+GLrFIZuPWoVqrct8lYaS6aq5RKUdRvk54kil49m4miN6dtUll4NXSoUBiYiyZbsufMvSy5EH5qqFLqOxaCicbKwlTxi+yqlZKFq2BkpZbMtiEFQSFLSu+ug6FPtWT+j2RJ0gv2dGUf6m0CQdD3JXty6mA7WqMThY7CncanaTv0rSzLoqkFGtl5m0w0smyl0Whky7/fXUfPxl6sNhdHbRJ0JSMdO3Y8Weo5Wm++Ac2ic0DR0k0+AAAAAElFTkSuQmCC") 12px 60% no-repeat;
  color: white;
}

.desc {
  font-size: 84%;
}

.err {
  color: red;
}

div#header p {
  font-size: 84%;
  font-style: italic;
  padding: 0;
  margin: 0;
  color: white;
  padding-left: 0.4em;
  display: inline;
}

table.list {
  line-height: 200%;
  border-collapse: collapse;
  font-size: 84%;
  table-layout: fixed;
}
table.list:not([class*='filtered']) tr:nth-child(odd) td {
  background: #eff3ff;
}
table.list#details2 tr:nth-child(odd) td {
  background: #ccffcc
}

table.list td {
  padding: 0 0.5em;
  vertical-align: top;
  line-height: 1.4em;
  padding-top: 0.35em;
}
table.list tr td:nth-last-child(1),
table.list tr th:nth-last-child(1) {
  padding-right: 1em;
}
table.list:not([class*='filtered']) .tab .name {
  padding-left: 1.5em;
}

table.list .name {
}

table.list .name div {
  height: 1.6em;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}

table.list .number {
  width: 7em;
  text-align: right;
}

table.list tr:not([class*='firstRow']) > *:nth-child(1),
table.list tr:not([class*='firstRow']) > *:nth-child(4),
table.list tr.firstRow th:nth-child(1),
table.list tr.firstRow th:nth-child(2) {
  border-right: 1px solid #b5c6de;
}
table.list#details .name {
  padding-left: 25px;
  background-position: 5px center;
  background-repeat: no-repeat;
}
</style>
</head>
<body>
  <div id='header'>
    <h1>About Sync</h1>
    <p> Sync engine diagnostic data</p>
  </div>
  <div id='content'>
    <table width="100%">
      <tr>
        <td width="20%">
          <span class="desc"><h2> Summary </h2></span>
          <strong jscontent="summary"></strong>
        </td>
        <td>
          <div class="desc" jsdisplay="unrecoverable_error_detected">
            <span class="err">Unrecoverable Error Detected!</span>
            <div jscontent="unrecoverable_error_message"></div>
            <div jscontent="unrecoverable_error_location"></div>
          </div>
        </td>
      </tr>
    </table>
    <br /><br /><br />
    <h2>  </h2>
    <table>
      <tr>
        <td>
        <div class="desc"><h2> Details </h2></div>
        <table class='list' id='details'>
          <tr>
            <td class='name'> Authenticated </td>
            <td class='number'>
              <div jscontent="authenticated"> </div>
              <div jsdisplay="!authenticated"
                   style="color:red"
                   jscontent="auth_problem"></div>
            </td>
          </tr>
          </tr>
          <tr>
            <td class='name'>Last Synced</td>
            <td class='number' jscontent="time_since_sync"> </td>
          </tr>
          <tr jsselect="details">
            <td class='name'>
              <div jscontent="stat_name"></div>
            </td>
            <td class='number'>
              <div jscontent="stat_value"></div>
            </td>
          </tr>
        </table>
      </td>
      <td valign="top">
        <div class="desc"><h2> Routing Info </h2></div>
        <table class='list' id='details2'>
          <tr jsselect="routing_info">
            <td class ='name'>
              <div jscontent="model_type"></div>
            </td>
            <td class='number'>
              <div jscontent="group"></div>
            </td>
          </tr>
        </table>
      </td>
    </table>
  </div>
</body>
</html>
<!DOCTYPE HTML>

<!--
about:version template page
-->

<html id="t">
  <head>
    <title i18n-content="title"></title>
    <style>
      body {
        font-family:Helvetica,Arial,sans-serif;
        background-color:white;
        color: black;
        margin: 0px;
      }
      #outer {
        text-align: left;
        margin-top: 10px;
        margin-left: auto;
        margin-right: auto;
        width: 800px;
      }
      #inner {
        padding-top: 10px;
        width: 550px;
      }
      .label {
        font-weight: bold;
        text-align: right;
        white-space: nowrap;
        padding-right: 5px;
        font-size: 0.9em;
        border-right: 0px solid black;
      }
      .label:after {
        content: ":";
      }
      #logo {
        text-align: right;
        float: right;
        width: 180px;
        margin-left: 40px;
      }
      #company {
        text-align: right;
        font-size: 0.7em;
      }
      #copyright {
        text-align: right;
        font-size: 0.7em;
      }
      #name {
      }
      #useragent {
        font-family: monospace;
      }
      .version {
        font-family: monospace;
        padding-left: 5px;
        max-width: 430px;
      }
    </style>
  </head>

  <body>
    <div id="outer">
      <div id="logo">
        <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAH8AAAAiCAYAAAB2rQY6AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkRFRDBDMDg2QjZFQTExREY5QjZEQzVFQ0YzREY3RDU0IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkRFRDBDMDg3QjZFQTExREY5QjZEQzVFQ0YzREY3RDU0Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6REVEMEMwODRCNkVBMTFERjlCNkRDNUVDRjNERjdENTQiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6REVEMEMwODVCNkVBMTFERjlCNkRDNUVDRjNERjdENTQiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7Y0u6mAAAO0klEQVR42uxbC3RU5Z3/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" />
        <div id="company" i18n-content="company"></div>
        <div id="copyright" i18n-content="copyright"></div>
      </div>
      <table id="inner" cellpadding="0" cellspacing="0" border="0">
        <tr jsdisplay="is_chrome_os"><td class="label" valign="top" id="os_name" i18n-content="os_name"></td>
            <td class="version" id="os_version"><span i18n-content="os_version"></span></td>
        </tr>
        <tr><td class="label" valign="top" id="name" i18n-content="name"></td>
          <td class="version" id="version"><span i18n-content="version"></span> (<span i18n-content="official"></span> <span i18n-content="cl"></span>) <span i18n-content="version_modifier"></span></td>
        </tr>
        <tr><td class="label" valign="top">WebKit</td>
            <td class="version" id="webkit_version" i18n-content="webkit_version"></td>
        </tr>
        <tr><td class="label" valign="top" i18n-content="js_engine"></td>
            <td class="version" id="js_version" i18n-content="js_version"></td>
        </tr>
        <tr><td class="label" valign="top" i18n-content="user_agent_name"></td>
            <td class="version" id="useragent" i18n-content="useragent"></td>
        </tr>
        <tr><td class="label" valign="top" i18n-content="command_line_name"></td>
            <td class="version" id="Td1" i18n-content="command_line"></td>
        </tr>       
      </table>
    </div>
  </body>

</html>
{
  "key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQcByy+eN9jzazWF/DPn7NW47sW7lgmpk6eKc0BQM18q8hvEM3zNm2n7HkJv/R6fU+X5mtqkDuKvq5skF6qqUF4oEyaleWDFhd1xFwV7JV+/DU7bZ00w2+6gzqsabkerFpoP33ZRIw7OviJenP0c0uWqDWF8EGSyMhB3txqhOtiQIDAQAB",
  "name": "Bookmark Manager",
  "version": "0.1",
  "description": "Bookmark Manager",
  "icons": {
    // The favicon is loaded directly from resources.pak.
  },
  "permissions": [
    "bookmarks",
    "experimental",
    "tabs",
    "chrome://favicon/",
    "chrome://resources/"
  ],
  "chrome_url_overrides": {
    "bookmarks": "main.html"
  }
}
{
  "key": "XX3fMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCf1MLMJ1mzNVJOVqaFFX+fQ7gJLVeZN+Sq3tKnZM33oWP82xDDs345/TsFTqGV3Nj5KvmjIN5NwcW/AeBOpVeOGFujFDSTOCZv0JDKkTXLyCegSwF+ljBi0TbCrsgv2T+8Jt891+hSyw5LPjXoTX2bKz+bu016tQnGnhb6fXyCBQIDAQAB",
  "name": "Google Calendar",
  "version": "1.3",
  "permissions": [ "notifications" ],
  "icons": {
    "128": "128.png",
    "24": "24.png",
    "32": "32.png",
    "48": "48.png"
  },
  "app": {
    "urls": [
      "*://www.google.com/calendar/"
    ],
    "browse_urls": [
      "https://www.google.com/accounts/"
    ],
    "launch": {
      "container": "tab",
      "web_url": "https://www.google.com/calendar/"
    }
  }
}
<!-- Generated by licenses.py; do not edit. -->
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Credits</title>
<style>
body {
  font-family:Helvetica,Arial,sans-serif;
  background-color:white;
  font-size:84%;
  max-width:1020px;
}
.page-title {
  font-size:164%;
  font-weight:bold;
}
.product {
  background-color:#c3d9ff;
  overflow:auto;
  padding:2px;
  margin-top:16px;
  border-radius:5px;
}
.product .title {
  font-size:110%;
  font-weight:bold;
  float:left;
  margin:3px;
}
.product .homepage {
  text-align:right;
  float:right;
  margin:3px;
}
.product .homepage:after {
  content:" - ";
}
.product .show {
  text-align:right;
  float:right;
  margin:3px;
}
.licence {
  clear:both;
  background-color:#e8eef7;
  padding:16px;
  border-radius:3px;
  display:none;
}
.licence h3 {
  margin-top:0px;
}
</style>
<script>
function $(o) {return document.getElementById(o);}
function toggle(o) {
  var licence = o.nextSibling;

  while (licence.className != 'licence') {
    if (!licence) return false;
    licence = licence.nextSibling;
  }

  if (licence.style && licence.style.display == 'block') {
    licence.style.display = 'none';
    o.innerHTML = 'show license';
  } else {
    licence.style.display = 'block';
    o.innerHTML = 'hide license';
  }
  return false;
}
</script>
</head>
<body>
<span class="page-title" style="float:left;">Credits</span>
<a href="javascript:window.print();" style="float:right;">Print</a>
<div style="clear:both; overflow:auto;"><!-- Chromium <3s the following projects -->
<div class="product">
<span class="title">David M. Gay's floating point routines</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://www.netlib.org/fp/">homepage</a></span>
<div class="licence">
<pre>/****************************************************************
 *
 * The author of this software is David M. Gay.
 *
 * Copyright (c) 1991, 2000, 2001 by Lucent Technologies.
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose without fee is hereby granted, provided that this entire notice
 * is included in all copies of any software which is or includes a copy
 * or modification of this software and in all copies of the supporting
 * documentation for such software.
 *
 * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
 * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY
 * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
 * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
 *
 ***************************************************************/
</pre>
</div>
</div>


<div class="product">
<span class="title">ICU</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://site.icu-project.org/">homepage</a></span>
<div class="licence">
<pre>ICU License - ICU 1.8.1 and later

COPYRIGHT AND PERMISSION NOTICE

Copyright (c) 1995-2009 International Business Machines Corporation and others

All rights reserved.

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, and/or sell copies of the Software, and to permit persons
to whom the Software is furnished to do so, provided that the above
copyright notice(s) and this permission notice appear in all copies of
the Software and that both the above copyright notice(s) and this
permission notice appear in supporting documentation.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY
SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER
RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

Except as contained in this notice, the name of a copyright holder
shall not be used in advertising or otherwise to promote the sale, use
or other dealings in this Software without prior written authorization
of the copyright holder.
</pre>
</div>
</div>


<div class="product">
<span class="title">Netscape Portable Runtime (NSPR)</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://www.mozilla.org/projects/nspr/">homepage</a></span>
<div class="licence">
<pre>/* ***** BEGIN LICENSE BLOCK *****
 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
 *
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * The Original Code is the Netscape Portable Runtime (NSPR).
 *
 * The Initial Developer of the Original Code is
 * Netscape Communications Corporation.
 * Portions created by the Initial Developer are Copyright (C) 1998-2000
 * the Initial Developer. All Rights Reserved.
 *
 * Contributor(s):
 *
 * Alternatively, the contents of this file may be used under the terms of
 * either the GNU General Public License Version 2 or later (the "GPL"), or
 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 * in which case the provisions of the GPL or the LGPL are applicable instead
 * of those above. If you wish to allow use of your version of this file only
 * under the terms of either the GPL or the LGPL, and not to allow others to
 * use your version of this file under the terms of the MPL, indicate your
 * decision by deleting the provisions above and replace them with the notice
 * and other provisions required by the GPL or the LGPL. If you do not delete
 * the provisions above, a recipient may use your version of this file under
 * the terms of any one of the MPL, the GPL or the LGPL.
 *
 * ***** END LICENSE BLOCK ***** */
</pre>
</div>
</div>


<div class="product">
<span class="title">Network Security Services (NSS)</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://www.mozilla.org/projects/security/pki/nss/">homepage</a></span>
<div class="licence">
<pre>/* ***** BEGIN LICENSE BLOCK *****
 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
 *
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * The Original Code is the Netscape security libraries.
 *
 * The Initial Developer of the Original Code is
 * Netscape Communications Corporation.
 * Portions created by the Initial Developer are Copyright (C) 1994-2000
 * the Initial Developer. All Rights Reserved.
 *
 * Contributor(s):
 *
 * Alternatively, the contents of this file may be used under the terms of
 * either the GNU General Public License Version 2 or later (the "GPL"), or
 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 * in which case the provisions of the GPL or the LGPL are applicable instead
 * of those above. If you wish to allow use of your version of this file only
 * under the terms of either the GPL or the LGPL, and not to allow others to
 * use your version of this file under the terms of the MPL, indicate your
 * decision by deleting the provisions above and replace them with the notice
 * and other provisions required by the GPL or the LGPL. If you do not delete
 * the provisions above, a recipient may use your version of this file under
 * the terms of any one of the MPL, the GPL or the LGPL.
 *
 * ***** END LICENSE BLOCK ***** */
</pre>
</div>
</div>


<div class="product">
<span class="title">purify headers</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://www-01.ibm.com/software/awdtools/purify/">homepage</a></span>
<div class="licence">
<pre>(C) Copyright IBM Corporation. 2006, 2006. All Rights Reserved.
You may recompile and redistribute these definitions as required.
</pre>
</div>
</div>


<div class="product">
<span class="title">google-glog's symbolization library</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://code.google.com/p/google-glog/">homepage</a></span>
<div class="licence">
<pre>// Copyright (c) 2006, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//     * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
//     * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</pre>
</div>
</div>


<div class="product">
<span class="title">valgrind</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://valgrind.org">homepage</a></span>
<div class="licence">
<pre>   ----------------------------------------------------------------

   Notice that the following BSD-style license applies to this one
   file (valgrind.h) only.  The rest of Valgrind is licensed under the
   terms of the GNU General Public License, version 2, unless
   otherwise indicated.  See the COPYING file in the source
   distribution for details.

   ----------------------------------------------------------------

   This file is part of Valgrind, a dynamic binary instrumentation
   framework.

   Copyright (C) 2000-2008 Julian Seward.  All rights reserved.

   Redistribution and use in source and binary forms, with or without
   modification, are permitted provided that the following conditions
   are met:

   1. Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer.

   2. The origin of this software must not be misrepresented; you must 
      not claim that you wrote the original software.  If you use this 
      software in a product, an acknowledgment in the product 
      documentation would be appreciated but is not required.

   3. Altered source versions must be plainly marked as such, and must
      not be misrepresented as being the original software.

   4. The name of the author may not be used to endorse or promote 
      products derived from this software without specific prior written 
      permission.

   THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
   OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
   WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
   DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
   GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
   WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</pre>
</div>
</div>


<div class="product">
<span class="title">xdg-utils</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://portland.freedesktop.org/wiki/">homepage</a></span>
<div class="licence">
<pre>#   Permission is hereby granted, free of charge, to any person obtaining a
#   copy of this software and associated documentation files (the "Software"),
#   to deal in the Software without restriction, including without limitation
#   the rights to use, copy, modify, merge, publish, distribute, sublicense,
#   and/or sell copies of the Software, and to permit persons to whom the
#   Software is furnished to do so, subject to the following conditions:
#
#   The above copyright notice and this permission notice shall be included
#   in all copies or substantial portions of the Software.
#
#   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
#   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
#   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
#   THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
#   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
#   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
#   OTHER DEALINGS IN THE SOFTWARE.
</pre>
</div>
</div>


<div class="product">
<span class="title">xdg-user-dirs</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://www.freedesktop.org/wiki/Software/xdg-user-dirs">homepage</a></span>
<div class="licence">
<pre>  Copyright (c) 2007 Red Hat, inc

  Permission is hereby granted, free of charge, to any person
  obtaining a copy of this software and associated documentation files
  (the "Software"), to deal in the Software without restriction,
  including without limitation the rights to use, copy, modify, merge,
  publish, distribute, sublicense, and/or sell copies of the Software,
  and to permit persons to whom the Software is furnished to do so,
  subject to the following conditions: 

  The above copyright notice and this permission notice shall be
  included in all copies or substantial portions of the Software. 

  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  SOFTWARE.
</pre>
</div>
</div>


<div class="product">
<span class="title">google-jstemplate</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://code.google.com/p/google-jstemplate/">homepage</a></span>
<div class="licence">
<pre>
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
</pre>
</div>
</div>


<div class="product">
<span class="title">Mozilla Personal Security Manager</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://mxr.mozilla.org/mozilla-central/source/security/manager/">homepage</a></span>
<div class="licence">
<pre>/* ***** BEGIN LICENSE BLOCK *****
 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
 *
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * The Original Code is the Netscape security libraries.
 *
 * The Initial Developer of the Original Code is
 * Netscape Communications Corporation.
 * Portions created by the Initial Developer are Copyright (C) 2000
 * the Initial Developer. All Rights Reserved.
 *
 * Contributor(s):
 *
 * Alternatively, the contents of this file may be used under the terms of
 * either the GNU General Public License Version 2 or later (the "GPL"), or
 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 * in which case the provisions of the GPL or the LGPL are applicable instead
 * of those above. If you wish to allow use of your version of this file only
 * under the terms of either the GPL or the LGPL, and not to allow others to
 * use your version of this file under the terms of the MPL, indicate your
 * decision by deleting the provisions above and replace them with the notice
 * and other provisions required by the GPL or the LGPL. If you do not delete
 * the provisions above, a recipient may use your version of this file under
 * the terms of any one of the MPL, the GPL or the LGPL.
 *
 * ***** END LICENSE BLOCK ***** */
</pre>
</div>
</div>


<div class="product">
<span class="title">WebKit</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://webkit.org/">homepage</a></span>
<div class="licence">
<pre>(WebKit doesn't distribute an explicit license.  This LICENSE is derived from
license text in the source.)

Copyright (c) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
2006, 2007 Alexander Kellett, Alexey Proskuryakov, Alex Mathews, Allan
Sandfeld Jensen, Alp Toker, Anders Carlsson, Andrew Wellington, Antti
Koivisto, Apple Inc., Arthur Langereis, Baron Schwartz, Bjoern Graf,
Brent Fulgham, Cameron Zwarich, Charles Samuels, Christian Dywan,
Collabora Ltd., Cyrus Patel, Daniel Molkentin, Dave Maclachlan, David
Smith, Dawit Alemayehu, Dirk Mueller, Dirk Schulze, Don Gibson, Enrico
Ros, Eric Seidel, Frederik Holljen, Frerich Raabe, Friedmann Kleint,
George Staikos, Google Inc., Graham Dennis, Harri Porten, Henry Mason,
Hiroyuki Ikezoe, Holger Hans Peter Freyther, IBM, James G. Speth, Jan
Alonzo, Jean-Loup Gailly, John Reis, Jonas Witt, Jon Shier, Jonas
Witt, Julien Chaffraix, Justin Haygood, Kevin Ollivier, Kevin Watters,
Kimmo Kinnunen, Kouhei Sutou, Krzysztof Kowalczyk, Lars Knoll, Luca
Bruno, Maks Orlovich, Malte Starostik, Mark Adler, Martin Jones,
Marvin Decker, Matt Lilek, Michael Emmel, Mitz Pettel, mozilla.org,
Netscape Communications Corporation, Nicholas Shanks, Nikolas
Zimmermann, Nokia, Oliver Hunt, Opened Hand, Paul Johnston, Peter
Kelly, Pioneer Research Center USA, Rich Moore, Rob Buis, Robin Dunn,
Ronald Tschalär, Samuel Weinig, Simon Hausmann, Staikos Computing
Services Inc., Stefan Schimanski, Symantec Corporation, The Dojo
Foundation, The Karbon Developers, Thomas Boyer, Tim Copperfield,
Tobias Anton, Torben Weis, Trolltech, University of Cambridge, Vaclav
Slavik, Waldo Bastian, Xan Lopez, Zack Rusin

The terms and conditions vary from file to file, but are one of:

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

1. Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in the
   documentation and/or other materials provided with the
   distribution.

*OR*

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

1. Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in the
   documentation and/or other materials provided with the
   distribution.
3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
   its contributors may be used to endorse or promote products derived
   from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY

OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


                  GNU LIBRARY GENERAL PUBLIC LICENSE
                       Version 2, June 1991

 Copyright (C) 1991 Free Software Foundation, Inc.
 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

[This is the first released version of the library GPL.  It is
 numbered 2 because it goes with version 2 of the ordinary GPL.]

                            Preamble

  The licenses for most software are designed to take away your
freedom to share and change it.  By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.

  This license, the Library General Public License, applies to some
specially designated Free Software Foundation software, and to any
other libraries whose authors decide to use it.  You can use it for
your libraries, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.

  To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if
you distribute copies of the library, or if you modify it.

  For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you.  You must make sure that they, too, receive or can get the source
code.  If you link a program with the library, you must provide
complete object files to the recipients so that they can relink them
with the library, after making changes to the library and recompiling
it.  And you must show them these terms so they know their rights.

  Our method of protecting your rights has two steps: (1) copyright
the library, and (2) offer you this license which gives you legal
permission to copy, distribute and/or modify the library.

  Also, for each distributor's protection, we want to make certain
that everyone understands that there is no warranty for this free
library.  If the library is modified by someone else and passed on, we
want its recipients to know that what they have is not the original
version, so that any problems introduced by others will not reflect on
the original authors' reputations.

  Finally, any free program is threatened constantly by software
patents.  We wish to avoid the danger that companies distributing free
software will individually obtain patent licenses, thus in effect
transforming the program into proprietary software.  To prevent this,
we have made it clear that any patent must be licensed for everyone's
free use or not licensed at all.

  Most GNU software, including some libraries, is covered by the ordinary
GNU General Public License, which was designed for utility programs.  This
license, the GNU Library General Public License, applies to certain
designated libraries.  This license is quite different from the ordinary
one; be sure to read it in full, and don't assume that anything in it is
the same as in the ordinary license.

  The reason we have a separate public license for some libraries is that
they blur the distinction we usually make between modifying or adding to a
program and simply using it.  Linking a program with a library, without
changing the library, is in some sense simply using the library, and is
analogous to running a utility program or application program.  However, in
a textual and legal sense, the linked executable is a combined work, a
derivative of the original library, and the ordinary General Public License
treats it as such.

  Because of this blurred distinction, using the ordinary General
Public License for libraries did not effectively promote software
sharing, because most developers did not use the libraries.  We
concluded that weaker conditions might promote sharing better.

  However, unrestricted linking of non-free programs would deprive the
users of those programs of all benefit from the free status of the
libraries themselves.  This Library General Public License is intended to
permit developers of non-free programs to use free libraries, while
preserving your freedom as a user of such programs to change the free
libraries that are incorporated in them.  (We have not seen how to achieve
this as regards changes in header files, but we have achieved it as regards
changes in the actual functions of the Library.)  The hope is that this
will lead to faster development of free libraries.

  The precise terms and conditions for copying, distribution and
modification follow.  Pay close attention to the difference between a
"work based on the library" and a "work that uses the library".  The
former contains code derived from the library, while the latter only
works together with the library.

  Note that it is possible for a library to be covered by the ordinary
General Public License rather than by this special one.

                  GNU LIBRARY GENERAL PUBLIC LICENSE
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  0. This License Agreement applies to any software library which
contains a notice placed by the copyright holder or other authorized
party saying it may be distributed under the terms of this Library
General Public License (also called "this License").  Each licensee is
addressed as "you".

  A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.

  The "Library", below, refers to any such software library or work
which has been distributed under these terms.  A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language.  (Hereinafter, translation is
included without limitation in the term "modification".)

  "Source code" for a work means the preferred form of the work for
making modifications to it.  For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control compilation
and installation of the library.

  Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope.  The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it).  Whether that is true depends on what the Library does
and what the program that uses the Library does.
  
  1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.

  You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.

  2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:

    a) The modified work must itself be a software library.

    b) You must cause the files modified to carry prominent notices
    stating that you changed the files and the date of any change.

    c) You must cause the whole of the work to be licensed at no
    charge to all third parties under the terms of this License.

    d) If a facility in the modified Library refers to a function or a
    table of data to be supplied by an application program that uses
    the facility, other than as an argument passed when the facility
    is invoked, then you must make a good faith effort to ensure that,
    in the event an application does not supply such function or
    table, the facility still operates, and performs whatever part of
    its purpose remains meaningful.

    (For example, a function in a library to compute square roots has
    a purpose that is entirely well-defined independent of the
    application.  Therefore, Subsection 2d requires that any
    application-supplied function or table used by this function must
    be optional: if the application does not supply it, the square
    root function must still compute square roots.)

These requirements apply to the modified work as a whole.  If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works.  But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.

Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.

In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.

  3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library.  To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License.  (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.)  Do not make any other change in
these notices.

  Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.

  This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.

  4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.

  If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.

  5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library".  Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.

  However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library".  The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.

  When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library.  The
threshold for this to be true is not precisely defined by law.

  If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work.  (Executables containing this object code plus portions of the
Library will still fall under Section 6.)

  Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.

  6. As an exception to the Sections above, you may also compile or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.

  You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License.  You must supply a copy of this License.  If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License.  Also, you must do one
of these things:

    a) Accompany the work with the complete corresponding
    machine-readable source code for the Library including whatever
    changes were used in the work (which must be distributed under
    Sections 1 and 2 above); and, if the work is an executable linked
    with the Library, with the complete machine-readable "work that
    uses the Library", as object code and/or source code, so that the
    user can modify the Library and then relink to produce a modified
    executable containing the modified Library.  (It is understood
    that the user who changes the contents of definitions files in the
    Library will not necessarily be able to recompile the application
    to use the modified definitions.)

    b) Accompany the work with a written offer, valid for at
    least three years, to give the same user the materials
    specified in Subsection 6a, above, for a charge no more
    than the cost of performing this distribution.

    c) If distribution of the work is made by offering access to copy
    from a designated place, offer equivalent access to copy the above
    specified materials from the same place.

    d) Verify that the user has already received a copy of these
    materials or that you have already sent this user a copy.

  For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it.  However, as a special exception,
the source code distributed need not include anything that is normally
distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.

  It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system.  Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.

  7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:

    a) Accompany the combined library with a copy of the same work
    based on the Library, uncombined with any other library
    facilities.  This must be distributed under the terms of the
    Sections above.

    b) Give prominent notice with the combined library of the fact
    that part of it is a work based on the Library, and explaining
    where to find the accompanying uncombined form of the same work.

  8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License.  Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License.  However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.

  9. You are not required to accept this License, since you have not
signed it.  However, nothing else grants you permission to modify or
distribute the Library or its derivative works.  These actions are
prohibited by law if you do not accept this License.  Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.

  10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions.  You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.

  11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all.  For example, if a patent
license would not permit royalty-free redistribution of the Library by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.

If any portion of this section is held invalid or unenforceable under any
particular circumstance, the balance of the section is intended to apply,
and the section as a whole is intended to apply in other circumstances.

It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is
implemented by public license practices.  Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.

This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.

  12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License may add
an explicit geographical distribution limitation excluding those countries,
so that distribution is permitted only in or among countries not thus
excluded.  In such case, this License incorporates the limitation as if
written in the body of this License.

  13. The Free Software Foundation may publish revised and/or new
versions of the Library General Public License from time to time.
Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns.

Each version is given a distinguishing version number.  If the Library
specifies a version number of this License which applies to it and
"any later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation.  If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.

  14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission.  For software which is
copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this.  Our
decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.

                            NO WARRANTY

  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.

                     END OF TERMS AND CONDITIONS

                  GNU LESSER GENERAL PUBLIC LICENSE
                       Version 2.1, February 1999

 Copyright (C) 1991, 1999 Free Software Foundation, Inc.
 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

[This is the first released version of the Lesser GPL.  It also counts
 as the successor of the GNU Library Public License, version 2, hence
 the version number 2.1.]

                            Preamble

  The licenses for most software are designed to take away your
freedom to share and change it.  By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.

  This license, the Lesser General Public License, applies to some
specially designated software packages--typically libraries--of the
Free Software Foundation and other authors who decide to use it.  You
can use it too, but we suggest you first think carefully about whether
this license or the ordinary General Public License is the better
strategy to use in any particular case, based on the explanations below.

  When we speak of free software, we are referring to freedom of use,
not price.  Our General Public Licenses are designed to make sure that
you have the freedom to distribute copies of free software (and charge
for this service if you wish); that you receive source code or can get
it if you want it; that you can change the software and use pieces of
it in new free programs; and that you are informed that you can do
these things.

  To protect your rights, we need to make restrictions that forbid
distributors to deny you these rights or to ask you to surrender these
rights.  These restrictions translate to certain responsibilities for
you if you distribute copies of the library or if you modify it.

  For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you.  You must make sure that they, too, receive or can get the source
code.  If you link other code with the library, you must provide
complete object files to the recipients, so that they can relink them
with the library after making changes to the library and recompiling
it.  And you must show them these terms so they know their rights.

  We protect your rights with a two-step method: (1) we copyright the
library, and (2) we offer you this license, which gives you legal
permission to copy, distribute and/or modify the library.

  To protect each distributor, we want to make it very clear that
there is no warranty for the free library.  Also, if the library is
modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be
introduced by others.

  Finally, software patents pose a constant threat to the existence of
any free program.  We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a
restrictive license from a patent holder.  Therefore, we insist that
any patent license obtained for a version of the library must be
consistent with the full freedom of use specified in this license.

  Most GNU software, including some libraries, is covered by the
ordinary GNU General Public License.  This license, the GNU Lesser
General Public License, applies to certain designated libraries, and
is quite different from the ordinary General Public License.  We use
this license for certain libraries in order to permit linking those
libraries into non-free programs.

  When a program is linked with a library, whether statically or using
a shared library, the combination of the two is legally speaking a
combined work, a derivative of the original library.  The ordinary
General Public License therefore permits such linking only if the
entire combination fits its criteria of freedom.  The Lesser General
Public License permits more lax criteria for linking other code with
the library.

  We call this license the "Lesser" General Public License because it
does Less to protect the user's freedom than the ordinary General
Public License.  It also provides other free software developers Less
of an advantage over competing non-free programs.  These disadvantages
are the reason we use the ordinary General Public License for many
libraries.  However, the Lesser license provides advantages in certain
special circumstances.

  For example, on rare occasions, there may be a special need to
encourage the widest possible use of a certain library, so that it becomes
a de-facto standard.  To achieve this, non-free programs must be
allowed to use the library.  A more frequent case is that a free
library does the same job as widely used non-free libraries.  In this
case, there is little to gain by limiting the free library to free
software only, so we use the Lesser General Public License.

  In other cases, permission to use a particular library in non-free
programs enables a greater number of people to use a large body of
free software.  For example, permission to use the GNU C Library in
non-free programs enables many more people to use the whole GNU
operating system, as well as its variant, the GNU/Linux operating
system.

  Although the Lesser General Public License is Less protective of the
users' freedom, it does ensure that the user of a program that is
linked with the Library has the freedom and the wherewithal to run
that program using a modified version of the Library.

  The precise terms and conditions for copying, distribution and
modification follow.  Pay close attention to the difference between a
"work based on the library" and a "work that uses the library".  The
former contains code derived from the library, whereas the latter must
be combined with the library in order to run.

                  GNU LESSER GENERAL PUBLIC LICENSE
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  0. This License Agreement applies to any software library or other
program which contains a notice placed by the copyright holder or
other authorized party saying it may be distributed under the terms of
this Lesser General Public License (also called "this License").
Each licensee is addressed as "you".

  A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.

  The "Library", below, refers to any such software library or work
which has been distributed under these terms.  A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language.  (Hereinafter, translation is
included without limitation in the term "modification".)

  "Source code" for a work means the preferred form of the work for
making modifications to it.  For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control compilation
and installation of the library.

  Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope.  The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it).  Whether that is true depends on what the Library does
and what the program that uses the Library does.

  1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.

  You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.

  2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:

    a) The modified work must itself be a software library.

    b) You must cause the files modified to carry prominent notices
    stating that you changed the files and the date of any change.

    c) You must cause the whole of the work to be licensed at no
    charge to all third parties under the terms of this License.

    d) If a facility in the modified Library refers to a function or a
    table of data to be supplied by an application program that uses
    the facility, other than as an argument passed when the facility
    is invoked, then you must make a good faith effort to ensure that,
    in the event an application does not supply such function or
    table, the facility still operates, and performs whatever part of
    its purpose remains meaningful.

    (For example, a function in a library to compute square roots has
    a purpose that is entirely well-defined independent of the
    application.  Therefore, Subsection 2d requires that any
    application-supplied function or table used by this function must
    be optional: if the application does not supply it, the square
    root function must still compute square roots.)

These requirements apply to the modified work as a whole.  If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works.  But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.

Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.

In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.

  3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library.  To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License.  (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.)  Do not make any other change in
these notices.

  Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.

  This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.

  4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.

  If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.

  5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library".  Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.

  However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library".  The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.

  When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library.  The
threshold for this to be true is not precisely defined by law.

  If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work.  (Executables containing this object code plus portions of the
Library will still fall under Section 6.)

  Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.

  6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.

  You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License.  You must supply a copy of this License.  If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License.  Also, you must do one
of these things:

    a) Accompany the work with the complete corresponding
    machine-readable source code for the Library including whatever
    changes were used in the work (which must be distributed under
    Sections 1 and 2 above); and, if the work is an executable linked
    with the Library, with the complete machine-readable "work that
    uses the Library", as object code and/or source code, so that the
    user can modify the Library and then relink to produce a modified
    executable containing the modified Library.  (It is understood
    that the user who changes the contents of definitions files in the
    Library will not necessarily be able to recompile the application
    to use the modified definitions.)

    b) Use a suitable shared library mechanism for linking with the
    Library.  A suitable mechanism is one that (1) uses at run time a
    copy of the library already present on the user's computer system,
    rather than copying library functions into the executable, and (2)
    will operate properly with a modified version of the library, if
    the user installs one, as long as the modified version is
    interface-compatible with the version that the work was made with.

    c) Accompany the work with a written offer, valid for at
    least three years, to give the same user the materials
    specified in Subsection 6a, above, for a charge no more
    than the cost of performing this distribution.

    d) If distribution of the work is made by offering access to copy
    from a designated place, offer equivalent access to copy the above
    specified materials from the same place.

    e) Verify that the user has already received a copy of these
    materials or that you have already sent this user a copy.

  For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it.  However, as a special exception,
the materials to be distributed need not include anything that is
normally distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.

  It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system.  Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.

  7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:

    a) Accompany the combined library with a copy of the same work
    based on the Library, uncombined with any other library
    facilities.  This must be distributed under the terms of the
    Sections above.

    b) Give prominent notice with the combined library of the fact
    that part of it is a work based on the Library, and explaining
    where to find the accompanying uncombined form of the same work.

  8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License.  Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License.  However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.

  9. You are not required to accept this License, since you have not
signed it.  However, nothing else grants you permission to modify or
distribute the Library or its derivative works.  These actions are
prohibited by law if you do not accept this License.  Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.

  10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions.  You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties with
this License.

  11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all.  For example, if a patent
license would not permit royalty-free redistribution of the Library by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.

If any portion of this section is held invalid or unenforceable under any
particular circumstance, the balance of the section is intended to apply,
and the section as a whole is intended to apply in other circumstances.

It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is
implemented by public license practices.  Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.

This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.

  12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License may add
an explicit geographical distribution limitation excluding those countries,
so that distribution is permitted only in or among countries not thus
excluded.  In such case, this License incorporates the limitation as if
written in the body of this License.

  13. The Free Software Foundation may publish revised and/or new
versions of the Lesser General Public License from time to time.
Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns.

Each version is given a distinguishing version number.  If the Library
specifies a version number of this License which applies to it and
"any later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation.  If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.

  14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission.  For software which is
copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this.  Our
decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.

                            NO WARRANTY

  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.

                     END OF TERMS AND CONDITIONS
</pre>
</div>
</div>


<div class="product">
<span class="title">Apple sample code</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://developer.apple.com/">homepage</a></span>
<div class="licence">
<pre>Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms.  If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.

In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
"Apple Software"), to use, reproduce, modify and redistribute the Apple
Software, with or without modifications, in source and/or binary forms;
provided that if you redistribute the Apple Software in its entirety and
without modifications, you must retain this notice and the following
text and disclaimers in all such redistributions of the Apple Software.
Neither the name, trademarks, service marks or logos of Apple Inc. may
be used to endorse or promote products derived from the Apple Software
without specific prior written permission from Apple.  Except as
expressly stated in this notice, no other rights or licenses, express or
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.

The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.

IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION,
MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.

Copyright (C) 2009 Apple Inc. All Rights Reserved.</pre>
</div>
</div>


<div class="product">
<span class="title">bsdiff</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://lxr.mozilla.org/mozilla/source/other-licenses/bsdiff/bsdiff.c">homepage</a></span>
<div class="licence">
<pre>BSD Protection License
February 2002

Preamble
--------

The Berkeley Software Distribution ("BSD") license has proven very effective
over the years at allowing for a wide spread of work throughout both
commercial and non-commercial products.  For programmers whose primary
intention is to improve the general quality of available software, it is
arguable that there is no better license than the BSD license, as it
permits improvements to be used wherever they will help, without idealogical
or metallic constraint.

This is of particular value to those who produce reference implementations
of proposed standards: The case of TCP/IP clearly illustrates that freely
and universally available implementations leads the rapid acceptance of
standards -- often even being used instead of a de jure standard (eg, OSI
network models).

With the rapid proliferation of software licensed under the GNU General
Public License, however, the continued success of this role is called into
question.  Given that the inclusion of a few lines of "GPL-tainted" work
into a larger body of work will result in restricted distribution -- and
given that further work will likely build upon the "tainted" portions,
making them difficult to remove at a future date -- there are inevitable
circumstances where authors would, in order to protect their goal of
providing for the widespread usage of their work, wish to guard against
such "GPL-taint".

In addition, one can imagine that companies which operate by producing and
selling (possibly closed-source) code would wish to protect themselves
against the rise of a GPL-licensed competitor.  While under existing
licenses this would mean not releasing their code under any form of open
license, if a license existed under which they could incorporate any
improvements back into their own (commercial) products then they might be
far more willing to provide for non-closed distribution.

For the above reasons, we put forth this "BSD Protection License": A
license designed to retain the freedom granted by the BSD license to use
licensed works in a wide variety of settings, both non-commercial and
commercial, while protecting the work from having future contributors
restrict that freedom.

The precise terms and conditions for copying, distribution, and
modification follow.

BSD PROTECTION LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION, AND MODIFICATION
----------------------------------------------------------------

0. Definitions.
   a) "Program", below, refers to any program or work distributed under
      the terms of this license.
   b) A "work based on the Program", below, refers to either the Program
      or any derivative work under copyright law.
   c) "Modification", below, refers to the act of creating derivative works.
   d) "You", below, refers to each licensee.

1. Scope.
   This license governs the copying, distribution, and modification of the
   Program.  Other activities are outside the scope of this license; The
   act of running the Program is not restricted, and the output from the
   Program is covered only if its contents constitute a work based on the
   Program.

2. Verbatim copies.
   You may copy and distribute verbatim copies of the Program as you
   receive it, in any medium, provided that you conspicuously and
   appropriately publish on each copy an appropriate copyright notice; keep
   intact all the notices that refer to this License and to the absence of
   any warranty; and give any other recipients of the Program a copy of this
   License along with the Program.

3. Modification and redistribution under closed license.
   You may modify your copy or copies of the Program, and distribute
   the resulting derivative works, provided that you meet the
   following conditions:
   a) The copyright notice and disclaimer on the Program must be reproduced
      and included in the source code, documentation, and/or other materials
      provided in a manner in which such notices are normally distributed.
   b) The derivative work must be clearly identified as such, in order that
      it may not be confused with the original work.
   c) The license under which the derivative work is distributed must
      expressly prohibit the distribution of further derivative works.

4. Modification and redistribution under open license.
   You may modify your copy or copies of the Program, and distribute
   the resulting derivative works, provided that you meet the
   following conditions:
   a) The copyright notice and disclaimer on the Program must be reproduced
      and included in the source code, documentation, and/or other materials
      provided in a manner in which such notices are normally distributed.
   b) You must clearly indicate the nature and date of any changes made
      to the Program.  The full details need not necessarily be included in
      the individual modified files, provided that each modified file is
      clearly marked as such and instructions are included on where the
      full details of the modifications may be found.
   c) You must cause any work that you distribute or publish, that in whole
      or in part contains or is derived from the Program or any part
      thereof, to be licensed as a whole at no charge to all third
      parties under the terms of this License.

5. Implied acceptance.
   You may not copy or distribute the Program or any derivative works except
   as expressly provided under this license.  Consequently, any such action
   will be taken as implied acceptance of the terms of this license.

6. NO WARRANTY.
   THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
   AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
   THE COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
   REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE FOR ANY DIRECT,
   INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
   ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING, BUT
   NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
   TORT, EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
   POSSIBILITY OF SUCH DAMAGES.
</pre>
</div>
</div>


<div class="product">
<span class="title">bspatch</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://lxr.mozilla.org/mozilla/source/toolkit/mozapps/update/src/updater/">homepage</a></span>
<div class="licence">
<pre>BSD Protection License
February 2002

Preamble
--------

The Berkeley Software Distribution ("BSD") license has proven very effective
over the years at allowing for a wide spread of work throughout both
commercial and non-commercial products.  For programmers whose primary
intention is to improve the general quality of available software, it is
arguable that there is no better license than the BSD license, as it
permits improvements to be used wherever they will help, without idealogical
or metallic constraint.

This is of particular value to those who produce reference implementations
of proposed standards: The case of TCP/IP clearly illustrates that freely
and universally available implementations leads the rapid acceptance of
standards -- often even being used instead of a de jure standard (eg, OSI
network models).

With the rapid proliferation of software licensed under the GNU General
Public License, however, the continued success of this role is called into
question.  Given that the inclusion of a few lines of "GPL-tainted" work
into a larger body of work will result in restricted distribution -- and
given that further work will likely build upon the "tainted" portions,
making them difficult to remove at a future date -- there are inevitable
circumstances where authors would, in order to protect their goal of
providing for the widespread usage of their work, wish to guard against
such "GPL-taint".

In addition, one can imagine that companies which operate by producing and
selling (possibly closed-source) code would wish to protect themselves
against the rise of a GPL-licensed competitor.  While under existing
licenses this would mean not releasing their code under any form of open
license, if a license existed under which they could incorporate any
improvements back into their own (commercial) products then they might be
far more willing to provide for non-closed distribution.

For the above reasons, we put forth this "BSD Protection License": A
license designed to retain the freedom granted by the BSD license to use
licensed works in a wide variety of settings, both non-commercial and
commercial, while protecting the work from having future contributors
restrict that freedom.

The precise terms and conditions for copying, distribution, and
modification follow.

BSD PROTECTION LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION, AND MODIFICATION
----------------------------------------------------------------

0. Definitions.
   a) "Program", below, refers to any program or work distributed under
      the terms of this license.
   b) A "work based on the Program", below, refers to either the Program
      or any derivative work under copyright law.
   c) "Modification", below, refers to the act of creating derivative works.
   d) "You", below, refers to each licensee.

1. Scope.
   This license governs the copying, distribution, and modification of the
   Program.  Other activities are outside the scope of this license; The
   act of running the Program is not restricted, and the output from the
   Program is covered only if its contents constitute a work based on the
   Program.

2. Verbatim copies.
   You may copy and distribute verbatim copies of the Program as you
   receive it, in any medium, provided that you conspicuously and
   appropriately publish on each copy an appropriate copyright notice; keep
   intact all the notices that refer to this License and to the absence of
   any warranty; and give any other recipients of the Program a copy of this
   License along with the Program.

3. Modification and redistribution under closed license.
   You may modify your copy or copies of the Program, and distribute
   the resulting derivative works, provided that you meet the
   following conditions:
   a) The copyright notice and disclaimer on the Program must be reproduced
      and included in the source code, documentation, and/or other materials
      provided in a manner in which such notices are normally distributed.
   b) The derivative work must be clearly identified as such, in order that
      it may not be confused with the original work.
   c) The license under which the derivative work is distributed must
      expressly prohibit the distribution of further derivative works.

4. Modification and redistribution under open license.
   You may modify your copy or copies of the Program, and distribute
   the resulting derivative works, provided that you meet the
   following conditions:
   a) The copyright notice and disclaimer on the Program must be reproduced
      and included in the source code, documentation, and/or other materials
      provided in a manner in which such notices are normally distributed.
   b) You must clearly indicate the nature and date of any changes made
      to the Program.  The full details need not necessarily be included in
      the individual modified files, provided that each modified file is
      clearly marked as such and instructions are included on where the
      full details of the modifications may be found.
   c) You must cause any work that you distribute or publish, that in whole
      or in part contains or is derived from the Program or any part
      thereof, to be licensed as a whole at no charge to all third
      parties under the terms of this License.

5. Implied acceptance.
   You may not copy or distribute the Program or any derivative works except
   as expressly provided under this license.  Consequently, any such action
   will be taken as implied acceptance of the terms of this license.

6. NO WARRANTY.
   THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
   AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
   THE COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
   REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE FOR ANY DIRECT,
   INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
   ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING, BUT
   NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
   TORT, EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
   POSSIBILITY OF SUCH DAMAGES.
</pre>
</div>
</div>


<div class="product">
<span class="title">bzip2</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://www.bzip.org/downloads.html">homepage</a></span>
<div class="licence">
<pre>
--------------------------------------------------------------------------

This program, "bzip2", the associated library "libbzip2", and all
documentation, are copyright (C) 1996-2007 Julian R Seward.  All
rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:

1. Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.

2. The origin of this software must not be misrepresented; you must 
   not claim that you wrote the original software.  If you use this 
   software in a product, an acknowledgment in the product 
   documentation would be appreciated but is not required.

3. Altered source versions must be plainly marked as such, and must
   not be misrepresented as being the original software.

4. The name of the author may not be used to endorse or promote 
   products derived from this software without specific prior written 
   permission.

THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Julian Seward, jseward@bzip.org
bzip2/libbzip2 version 1.0.5 of 10 December 2007

--------------------------------------------------------------------------
</pre>
</div>
</div>


<div class="product">
<span class="title">Compact Language Detection</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://src.chromium.org/viewvc/chrome/trunk/src/third_party/cld/">homepage</a></span>
<div class="licence">
<pre>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//    * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//    * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
//    * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</pre>
</div>
</div>


<div class="product">
<span class="title">codesighs</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://hg.mozilla.org/mozilla-central/tools/codesighs">homepage</a></span>
<div class="licence">
<pre>                          MOZILLA PUBLIC LICENSE
                                Version 1.1

                              ---------------

1. Definitions.

     1.0.1. "Commercial Use" means distribution or otherwise making the
     Covered Code available to a third party.

     1.1. "Contributor" means each entity that creates or contributes to
     the creation of Modifications.

     1.2. "Contributor Version" means the combination of the Original
     Code, prior Modifications used by a Contributor, and the Modifications
     made by that particular Contributor.

     1.3. "Covered Code" means the Original Code or Modifications or the
     combination of the Original Code and Modifications, in each case
     including portions thereof.

     1.4. "Electronic Distribution Mechanism" means a mechanism generally
     accepted in the software development community for the electronic
     transfer of data.

     1.5. "Executable" means Covered Code in any form other than Source
     Code.

     1.6. "Initial Developer" means the individual or entity identified
     as the Initial Developer in the Source Code notice required by Exhibit
     A.

     1.7. "Larger Work" means a work which combines Covered Code or
     portions thereof with code not governed by the terms of this License.

     1.8. "License" means this document.

     1.8.1. "Licensable" means having the right to grant, to the maximum
     extent possible, whether at the time of the initial grant or
     subsequently acquired, any and all of the rights conveyed herein.

     1.9. "Modifications" means any addition to or deletion from the
     substance or structure of either the Original Code or any previous
     Modifications. When Covered Code is released as a series of files, a
     Modification is:
          A. Any addition to or deletion from the contents of a file
          containing Original Code or previous Modifications.

          B. Any new file that contains any part of the Original Code or
          previous Modifications.

     1.10. "Original Code" means Source Code of computer software code
     which is described in the Source Code notice required by Exhibit A as
     Original Code, and which, at the time of its release under this
     License is not already Covered Code governed by this License.

     1.10.1. "Patent Claims" means any patent claim(s), now owned or
     hereafter acquired, including without limitation, method, process,
     and apparatus claims, in any patent Licensable by grantor.

     1.11. "Source Code" means the preferred form of the Covered Code for
     making modifications to it, including all modules it contains, plus
     any associated interface definition files, scripts used to control
     compilation and installation of an Executable, or source code
     differential comparisons against either the Original Code or another
     well known, available Covered Code of the Contributor's choice. The
     Source Code can be in a compressed or archival form, provided the
     appropriate decompression or de-archiving software is widely available
     for no charge.

     1.12. "You" (or "Your") means an individual or a legal entity
     exercising rights under, and complying with all of the terms of, this
     License or a future version of this License issued under Section 6.1.
     For legal entities, "You" includes any entity which controls, is
     controlled by, or is under common control with You. For purposes of
     this definition, "control" means (a) the power, direct or indirect,
     to cause the direction or management of such entity, whether by
     contract or otherwise, or (b) ownership of more than fifty percent
     (50%) of the outstanding shares or beneficial ownership of such
     entity.

2. Source Code License.

     2.1. The Initial Developer Grant.
     The Initial Developer hereby grants You a world-wide, royalty-free,
     non-exclusive license, subject to third party intellectual property
     claims:
          (a) under intellectual property rights (other than patent or
          trademark) Licensable by Initial Developer to use, reproduce,
          modify, display, perform, sublicense and distribute the Original
          Code (or portions thereof) with or without Modifications, and/or
          as part of a Larger Work; and

          (b) under Patents Claims infringed by the making, using or
          selling of Original Code, to make, have made, use, practice,
          sell, and offer for sale, and/or otherwise dispose of the
          Original Code (or portions thereof).

          (c) the licenses granted in this Section 2.1(a) and (b) are
          effective on the date Initial Developer first distributes
          Original Code under the terms of this License.

          (d) Notwithstanding Section 2.1(b) above, no patent license is
          granted: 1) for code that You delete from the Original Code; 2)
          separate from the Original Code; or 3) for infringements caused
          by: i) the modification of the Original Code or ii) the
          combination of the Original Code with other software or devices.

     2.2. Contributor Grant.
     Subject to third party intellectual property claims, each Contributor
     hereby grants You a world-wide, royalty-free, non-exclusive license

          (a) under intellectual property rights (other than patent or
          trademark) Licensable by Contributor, to use, reproduce, modify,
          display, perform, sublicense and distribute the Modifications
          created by such Contributor (or portions thereof) either on an
          unmodified basis, with other Modifications, as Covered Code
          and/or as part of a Larger Work; and

          (b) under Patent Claims infringed by the making, using, or
          selling of Modifications made by that Contributor either alone
          and/or in combination with its Contributor Version (or portions
          of such combination), to make, use, sell, offer for sale, have
          made, and/or otherwise dispose of: 1) Modifications made by that
          Contributor (or portions thereof); and 2) the combination of
          Modifications made by that Contributor with its Contributor
          Version (or portions of such combination).

          (c) the licenses granted in Sections 2.2(a) and 2.2(b) are
          effective on the date Contributor first makes Commercial Use of
          the Covered Code.

          (d) Notwithstanding Section 2.2(b) above, no patent license is
          granted: 1) for any code that Contributor has deleted from the
          Contributor Version; 2) separate from the Contributor Version;
          3) for infringements caused by: i) third party modifications of
          Contributor Version or ii) the combination of Modifications made
          by that Contributor with other software (except as part of the
          Contributor Version) or other devices; or 4) under Patent Claims
          infringed by Covered Code in the absence of Modifications made by
          that Contributor.

3. Distribution Obligations.

     3.1. Application of License.
     The Modifications which You create or to which You contribute are
     governed by the terms of this License, including without limitation
     Section 2.2. The Source Code version of Covered Code may be
     distributed only under the terms of this License or a future version
     of this License released under Section 6.1, and You must include a
     copy of this License with every copy of the Source Code You
     distribute. You may not offer or impose any terms on any Source Code
     version that alters or restricts the applicable version of this
     License or the recipients' rights hereunder. However, You may include
     an additional document offering the additional rights described in
     Section 3.5.

     3.2. Availability of Source Code.
     Any Modification which You create or to which You contribute must be
     made available in Source Code form under the terms of this License
     either on the same media as an Executable version or via an accepted
     Electronic Distribution Mechanism to anyone to whom you made an
     Executable version available; and if made available via Electronic
     Distribution Mechanism, must remain available for at least twelve (12)
     months after the date it initially became available, or at least six
     (6) months after a subsequent version of that particular Modification
     has been made available to such recipients. You are responsible for
     ensuring that the Source Code version remains available even if the
     Electronic Distribution Mechanism is maintained by a third party.

     3.3. Description of Modifications.
     You must cause all Covered Code to which You contribute to contain a
     file documenting the changes You made to create that Covered Code and
     the date of any change. You must include a prominent statement that
     the Modification is derived, directly or indirectly, from Original
     Code provided by the Initial Developer and including the name of the
     Initial Developer in (a) the Source Code, and (b) in any notice in an
     Executable version or related documentation in which You describe the
     origin or ownership of the Covered Code.

     3.4. Intellectual Property Matters
          (a) Third Party Claims.
          If Contributor has knowledge that a license under a third party's
          intellectual property rights is required to exercise the rights
          granted by such Contributor under Sections 2.1 or 2.2,
          Contributor must include a text file with the Source Code
          distribution titled "LEGAL" which describes the claim and the
          party making the claim in sufficient detail that a recipient will
          know whom to contact. If Contributor obtains such knowledge after
          the Modification is made available as described in Section 3.2,
          Contributor shall promptly modify the LEGAL file in all copies
          Contributor makes available thereafter and shall take other steps
          (such as notifying appropriate mailing lists or newsgroups)
          reasonably calculated to inform those who received the Covered
          Code that new knowledge has been obtained.

          (b) Contributor APIs.
          If Contributor's Modifications include an application programming
          interface and Contributor has knowledge of patent licenses which
          are reasonably necessary to implement that API, Contributor must
          also include this information in the LEGAL file.

          (c) Representations.
          Contributor represents that, except as disclosed pursuant to
          Section 3.4(a) above, Contributor believes that Contributor's
          Modifications are Contributor's original creation(s) and/or
          Contributor has sufficient rights to grant the rights conveyed by
          this License.

     3.5. Required Notices.
     You must duplicate the notice in Exhibit A in each file of the Source
     Code. If it is not possible to put such notice in a particular Source
     Code file due to its structure, then You must include such notice in a
     location (such as a relevant directory) where a user would be likely
     to look for such a notice. If You created one or more Modification(s)
     You may add your name as a Contributor to the notice described in
     Exhibit A. You must also duplicate this License in any documentation
     for the Source Code where You describe recipients' rights or ownership
     rights relating to Covered Code. You may choose to offer, and to
     charge a fee for, warranty, support, indemnity or liability
     obligations to one or more recipients of Covered Code. However, You
     may do so only on Your own behalf, and not on behalf of the Initial
     Developer or any Contributor. You must make it absolutely clear than
     any such warranty, support, indemnity or liability obligation is
     offered by You alone, and You hereby agree to indemnify the Initial
     Developer and every Contributor for any liability incurred by the
     Initial Developer or such Contributor as a result of warranty,
     support, indemnity or liability terms You offer.

     3.6. Distribution of Executable Versions.
     You may distribute Covered Code in Executable form only if the
     requirements of Section 3.1-3.5 have been met for that Covered Code,
     and if You include a notice stating that the Source Code version of
     the Covered Code is available under the terms of this License,
     including a description of how and where You have fulfilled the
     obligations of Section 3.2. The notice must be conspicuously included
     in any notice in an Executable version, related documentation or
     collateral in which You describe recipients' rights relating to the
     Covered Code. You may distribute the Executable version of Covered
     Code or ownership rights under a license of Your choice, which may
     contain terms different from this License, provided that You are in
     compliance with the terms of this License and that the license for the
     Executable version does not attempt to limit or alter the recipient's
     rights in the Source Code version from the rights set forth in this
     License. If You distribute the Executable version under a different
     license You must make it absolutely clear that any terms which differ
     from this License are offered by You alone, not by the Initial
     Developer or any Contributor. You hereby agree to indemnify the
     Initial Developer and every Contributor for any liability incurred by
     the Initial Developer or such Contributor as a result of any such
     terms You offer.

     3.7. Larger Works.
     You may create a Larger Work by combining Covered Code with other code
     not governed by the terms of this License and distribute the Larger
     Work as a single product. In such a case, You must make sure the
     requirements of this License are fulfilled for the Covered Code.

4. Inability to Comply Due to Statute or Regulation.

     If it is impossible for You to comply with any of the terms of this
     License with respect to some or all of the Covered Code due to
     statute, judicial order, or regulation then You must: (a) comply with
     the terms of this License to the maximum extent possible; and (b)
     describe the limitations and the code they affect. Such description
     must be included in the LEGAL file described in Section 3.4 and must
     be included with all distributions of the Source Code. Except to the
     extent prohibited by statute or regulation, such description must be
     sufficiently detailed for a recipient of ordinary skill to be able to
     understand it.

5. Application of this License.

     This License applies to code to which the Initial Developer has
     attached the notice in Exhibit A and to related Covered Code.

6. Versions of the License.

     6.1. New Versions.
     Netscape Communications Corporation ("Netscape") may publish revised
     and/or new versions of the License from time to time. Each version
     will be given a distinguishing version number.

     6.2. Effect of New Versions.
     Once Covered Code has been published under a particular version of the
     License, You may always continue to use it under the terms of that
     version. You may also choose to use such Covered Code under the terms
     of any subsequent version of the License published by Netscape. No one
     other than Netscape has the right to modify the terms applicable to
     Covered Code created under this License.

     6.3. Derivative Works.
     If You create or use a modified version of this License (which you may
     only do in order to apply it to code which is not already Covered Code
     governed by this License), You must (a) rename Your license so that
     the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape",
     "MPL", "NPL" or any confusingly similar phrase do not appear in your
     license (except to note that your license differs from this License)
     and (b) otherwise make it clear that Your version of the license
     contains terms which differ from the Mozilla Public License and
     Netscape Public License. (Filling in the name of the Initial
     Developer, Original Code or Contributor in the notice described in
     Exhibit A shall not of themselves be deemed to be modifications of
     this License.)

7. DISCLAIMER OF WARRANTY.

     COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS,
     WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
     WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
     DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.
     THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE
     IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,
     YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE
     COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
     OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
     ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.

8. TERMINATION.

     8.1. This License and the rights granted hereunder will terminate
     automatically if You fail to comply with terms herein and fail to cure
     such breach within 30 days of becoming aware of the breach. All
     sublicenses to the Covered Code which are properly granted shall
     survive any termination of this License. Provisions which, by their
     nature, must remain in effect beyond the termination of this License
     shall survive.

     8.2. If You initiate litigation by asserting a patent infringement
     claim (excluding declatory judgment actions) against Initial Developer
     or a Contributor (the Initial Developer or Contributor against whom
     You file such action is referred to as "Participant") alleging that:

     (a) such Participant's Contributor Version directly or indirectly
     infringes any patent, then any and all rights granted by such
     Participant to You under Sections 2.1 and/or 2.2 of this License
     shall, upon 60 days notice from Participant terminate prospectively,
     unless if within 60 days after receipt of notice You either: (i)
     agree in writing to pay Participant a mutually agreeable reasonable
     royalty for Your past and future use of Modifications made by such
     Participant, or (ii) withdraw Your litigation claim with respect to
     the Contributor Version against such Participant. If within 60 days
     of notice, a reasonable royalty and payment arrangement are not
     mutually agreed upon in writing by the parties or the litigation claim
     is not withdrawn, the rights granted by Participant to You under
     Sections 2.1 and/or 2.2 automatically terminate at the expiration of
     the 60 day notice period specified above.

     (b) any software, hardware, or device, other than such Participant's
     Contributor Version, directly or indirectly infringes any patent, then
     any rights granted to You by such Participant under Sections 2.1(b)
     and 2.2(b) are revoked effective as of the date You first made, used,
     sold, distributed, or had made, Modifications made by that
     Participant.

     8.3. If You assert a patent infringement claim against Participant
     alleging that such Participant's Contributor Version directly or
     indirectly infringes any patent where such claim is resolved (such as
     by license or settlement) prior to the initiation of patent
     infringement litigation, then the reasonable value of the licenses
     granted by such Participant under Sections 2.1 or 2.2 shall be taken
     into account in determining the amount or value of any payment or
     license.

     8.4. In the event of termination under Sections 8.1 or 8.2 above,
     all end user license agreements (excluding distributors and resellers)
     which have been validly granted by You or any distributor hereunder
     prior to termination shall survive termination.

9. LIMITATION OF LIABILITY.

     UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
     (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL
     DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
     OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR
     ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY
     CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL,
     WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
     COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
     INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
     LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
     RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
     PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
     EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
     THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.

10. U.S. GOVERNMENT END USERS.

     The Covered Code is a "commercial item," as that term is defined in
     48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer
     software" and "commercial computer software documentation," as such
     terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48
     C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995),
     all U.S. Government End Users acquire Covered Code with only those
     rights set forth herein.

11. MISCELLANEOUS.

     This License represents the complete agreement concerning subject
     matter hereof. If any provision of this License is held to be
     unenforceable, such provision shall be reformed only to the extent
     necessary to make it enforceable. This License shall be governed by
     California law provisions (except to the extent applicable law, if
     any, provides otherwise), excluding its conflict-of-law provisions.
     With respect to disputes in which at least one party is a citizen of,
     or an entity chartered or registered to do business in the United
     States of America, any litigation relating to this License shall be
     subject to the jurisdiction of the Federal Courts of the Northern
     District of California, with venue lying in Santa Clara County,
     California, with the losing party responsible for costs, including
     without limitation, court costs and reasonable attorneys' fees and
     expenses. The application of the United Nations Convention on
     Contracts for the International Sale of Goods is expressly excluded.
     Any law or regulation which provides that the language of a contract
     shall be construed against the drafter shall not apply to this
     License.

12. RESPONSIBILITY FOR CLAIMS.

     As between Initial Developer and the Contributors, each party is
     responsible for claims and damages arising, directly or indirectly,
     out of its utilization of rights under this License and You agree to
     work with Initial Developer and Contributors to distribute such
     responsibility on an equitable basis. Nothing herein is intended or
     shall be deemed to constitute any admission of liability.

13. MULTIPLE-LICENSED CODE.

     Initial Developer may designate portions of the Covered Code as
     "Multiple-Licensed". "Multiple-Licensed" means that the Initial
     Developer permits you to utilize portions of the Covered Code under
     Your choice of the NPL or the alternative licenses, if any, specified
     by the Initial Developer in the file described in Exhibit A.

EXHIBIT A -Mozilla Public License.

     ``The contents of this file are subject to the Mozilla Public License
     Version 1.1 (the "License"); you may not use this file except in
     compliance with the License. You may obtain a copy of the License at
     http://www.mozilla.org/MPL/

     Software distributed under the License is distributed on an "AS IS"
     basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
     License for the specific language governing rights and limitations
     under the License.

     The Original Code is ______________________________________.

     The Initial Developer of the Original Code is ________________________.
     Portions created by ______________________ are Copyright (C) ______
     _______________________. All Rights Reserved.

     Contributor(s): ______________________________________.

     Alternatively, the contents of this file may be used under the terms
     of the _____ license (the "[___] License"), in which case the
     provisions of [______] License are applicable instead of those
     above. If you wish to allow use of your version of this file only
     under the terms of the [____] License and not to allow others to use
     your version of this file under the MPL, indicate your decision by
     deleting the provisions above and replace them with the notice and
     other provisions required by the [___] License. If you do not delete
     the provisions above, a recipient may use your version of this file
     under either the MPL or the [___] License."

     [NOTE: The text of this Exhibit A may differ slightly from the text of
     the notices in the Source Code files of the Original Code. You should
     use the text of this Exhibit A rather than the text found in the
     Original Code Source Code for Your Modifications.]

     ----------------------------------------------------------------------

     AMENDMENTS

     The Netscape Public License Version 1.1 ("NPL") consists of the
     Mozilla Public License Version 1.1 with the following Amendments,
     including Exhibit A-Netscape Public License. Files identified with
     "Exhibit A-Netscape Public License" are governed by the Netscape
     Public License Version 1.1.

     Additional Terms applicable to the Netscape Public License.
          I. Effect.
          These additional terms described in this Netscape Public
          License -- Amendments shall apply to the Mozilla Communicator
          client code and to all Covered Code under this License.

          II. "Netscape's Branded Code" means Covered Code that Netscape
          distributes and/or permits others to distribute under one or more
          trademark(s) which are controlled by Netscape but which are not
          licensed for use under this License.

          III. Netscape and logo.
          This License does not grant any rights to use the trademarks
          "Netscape", the "Netscape N and horizon" logo or the "Netscape
          lighthouse" logo, "Netcenter", "Gecko", "Java" or "JavaScript",
          "Smart Browsing" even if such marks are included in the Original
          Code or Modifications.

          IV. Inability to Comply Due to Contractual Obligation.
          Prior to licensing the Original Code under this License, Netscape
          has licensed third party code for use in Netscape's Branded Code.
          To the extent that Netscape is limited contractually from making
          such third party code available under this License, Netscape may
          choose to reintegrate such code into Covered Code without being
          required to distribute such code in Source Code form, even if
          such code would otherwise be considered "Modifications" under
          this License.

          V. Use of Modifications and Covered Code by Initial Developer.
               V.1. In General.
               The obligations of Section 3 apply to Netscape, except to
               the extent specified in this Amendment, Section V.2 and V.3.

               V.2. Other Products.
               Netscape may include Covered Code in products other than the
               Netscape's Branded Code which are released by Netscape
               during the two (2) years following the release date of the
               Original Code, without such additional products becoming
               subject to the terms of this License, and may license such
               additional products on different terms from those contained
               in this License.

               V.3. Alternative Licensing.
               Netscape may license the Source Code of Netscape's Branded
               Code, including Modifications incorporated therein, without
               such Netscape Branded Code becoming subject to the terms of
               this License, and may license such Netscape Branded Code on
               different terms from those contained in this License.

          VI. Litigation.
          Notwithstanding the limitations of Section 11 above, the
          provisions regarding litigation in Section 11(a), (b) and (c) of
          the License shall apply to all disputes relating to this License.

     EXHIBIT A-Netscape Public License.

          "The contents of this file are subject to the Netscape Public
          License Version 1.1 (the "License"); you may not use this file
          except in compliance with the License. You may obtain a copy of
          the License at http://www.mozilla.org/NPL/

          Software distributed under the License is distributed on an "AS
          IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
          implied. See the License for the specific language governing
          rights and limitations under the License.

          The Original Code is Mozilla Communicator client code, released
          March 31, 1998.

          The Initial Developer of the Original Code is Netscape
          Communications Corporation. Portions created by Netscape are
          Copyright (C) 1998-1999 Netscape Communications Corporation. All
          Rights Reserved.

          Contributor(s): ______________________________________.

          Alternatively, the contents of this file may be used under the
          terms of the _____ license (the "[___] License"), in which case
          the provisions of [______] License are applicable  instead of
          those above. If you wish to allow use of your version of this
          file only under the terms of the [____] License and not to allow
          others to use your version of this file under the NPL, indicate
          your decision by deleting the provisions above and replace  them
          with the notice and other provisions required by the [___]
          License. If you do not delete the provisions above, a recipient
          may use your version of this file under either the NPL or the
          [___] License."
</pre>
</div>
</div>


<div class="product">
<span class="title">expat</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://sourceforge.net/projects/expat/">homepage</a></span>
<div class="licence">
<pre>Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd
                               and Clark Cooper
Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Expat maintainers.

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
</pre>
</div>
</div>


<div class="product">
<span class="title">ffmpeg</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://ffmpeg.org/">homepage</a></span>
<div class="licence">
<pre>FFmpeg:
-------

Most files in FFmpeg are under the GNU Lesser General Public License version 2.1
or later (LGPL v2.1+). Read the file COPYING.LGPLv2.1 for details. Some other
files have MIT/X11/BSD-style licenses. In combination the LGPL v2.1+ applies to
FFmpeg.

Some optional parts of FFmpeg are licensed under the GNU General Public License
version 2 or later (GPL v2+). See the file COPYING.GPLv2 for details. None of
these parts are used by default, you have to explicitly pass --enable-gpl to
configure to activate them. In this case, FFmpeg's license changes to GPL v2+.

Specifically, the GPL parts of FFmpeg are

- libpostproc
- optional MMX optimizations for YUV to RGB colorspace conversion in
  libswscale/x86/yuv2rgb_template.c
- optional x86 optimizations in the files
  libavcodec/x86/h264_deblock_sse2.asm
  libavcodec/x86/h264_idct_sse2.asm
  libavcodec/x86/idct_mmx.c
- the X11 grabber in libavdevice/x11grab.c

There are a handful of files under other licensing terms, namely:

* The files libavcodec/jfdctfst.c, libavcodec/jfdctint.c, libavcodec/jrevdct.c
  are taken from libjpeg, see the top of the files for licensing details.

Should you, for whatever reason, prefer to use version 3 of the (L)GPL, then
the configure parameter --enable-version3 will activate this licensing option
for you. Read the file COPYING.LGPLv3 or, if you have enabled GPL parts,
COPYING.GPLv3 to learn the exact legal terms that apply in this case.


external libraries:
-------------------

Some external libraries, e.g. libx264, are under GPL and can be used in
conjunction with FFmpeg. They require --enable-gpl to be passed to configure
as well.

The OpenCORE external libraries are under the Apache License 2.0. That license
is incompatible with the LGPL v2.1 and the GPL v2, but not with version 3 of
those licenses. So to combine the OpenCORE libraries with FFmpeg, the license
version needs to be upgraded by passing --enable-version3 to configure.

The nonfree external library libfaac can be hooked up in FFmpeg. You need to
pass --enable-nonfree to configure to enable it. Employ this option with care
as FFmpeg then becomes nonfree and unredistributable.
</pre>
</div>
</div>


<div class="product">
<span class="title">OpenGL ES 2.0 Programming Guide</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://opengles-book.com/">homepage</a></span>
<div class="licence">
<pre>Book:      OpenGL(R) ES 2.0 Programming Guide
Authors:   Aaftab Munshi, Dan Ginsburg, Dave Shreiner
ISBN-10:   0321502795
ISBN-13:   9780321502797
Publisher: Addison-Wesley Professional
URLs:      http://safari.informit.com/9780321563835
           http://www.opengles-book.com</pre>
</div>
</div>


<div class="product">
<span class="title">OpenGL ES 2.0 Conformance Tests</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="https://www.khronos.org/opengles/adopters/login/conformance/">homepage</a></span>
<div class="licence">
<pre>/*
** Copyright (c) 2008 The Khronos Group Inc.
** 
** All Rights Reserved.  This code is protected by copyright laws and 
** contains material proprietary to the Khronos Group, Inc.  This is 
** UNPUBLISHED PROPRIETARY SOURCE CODE that may not be disclosed in whole 
** or in part to third parties, and may not be reproduced, republished, 
** distributed, transmitted, displayed, broadcast or otherwise exploited 
** in any manner without the express prior written permission of Khronos 
** Group.
** 
** The receipt or possession of this code does not convey any rights to 
** reproduce, disclose, or distribute its contents, or to manufacture, 
** use, or sell anything that it may describe, in whole or in part other 
** than under the terms of the Khronos Adopters Agreement or Khronos 
** Conformance Test Source License Agreement as executed between Khronos 
** and the recipient.
** 
** For the avoidance of doubt, this code when provided: a) under the 
** Khronos Conformance Test Source License Agreement is for the sole 
** purpose of creating conformance tests for delivery to Khronos and does 
** not provide for formally testing products or use of Khronos trademarks 
** on conformant products; b) under the Khronos Adopters Agreement is for 
** the sole purpose of formally administering tests to products pursuant 
** to the Khronos Conformance Process Document.
** 
** Khronos, OpenKODE, OpenVG, OpenWF, glFX, OpenMAX and OpenSL ES are 
** trademarks of the Khronos Group Inc.  COLLADA is a trademark of Sony 
** Computer Entertainment Inc. used by permission by Khronos.  OpenGL and 
** OpenML are registered trademarks and the OpenGL ES logo is a trademark 
** of Silicon Graphics Inc. used by permission by Khronos. 
** 
** Use, duplication or disclosure by the Government is subject to 
** restrictions as set forth in subdivision (c)(1)(ii) of the Rights in 
** Technical Data and Computer Software clause at DFARS 252.227-7013, and/
** or in similar or successor clauses in the FAR, DOD or NASA FAR 
** Supplement. Unpublished rights reserved under the Copyright Laws of 
** the United States and other countries.
*/
</pre>
</div>
</div>


<div class="product">
<span class="title">The OpenGL Extension Wrangler Library</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://glew.sourceforge.net">homepage</a></span>
<div class="licence">
<pre>The OpenGL Extension Wrangler Library
Copyright (C) 2002-2007, Milan Ikits &lt;milan ikits[]ieee org&gt;
Copyright (C) 2002-2007, Marcelo E. Magallon &lt;mmagallo[]debian org&gt;
Copyright (C) 2002, Lev Povalahev
All rights reserved.

Redistribution and use in source and binary forms, with or without 
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, 
  this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice, 
  this list of conditions and the following disclaimer in the documentation 
  and/or other materials provided with the distribution.
* The name of the author may be used to endorse or promote products 
  derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
THE POSSIBILITY OF SUCH DAMAGE.


Mesa 3-D graphics library
Version:  7.0

Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.

Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


Copyright (c) 2007 The Khronos Group Inc.

Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and/or associated documentation files (the
"Materials"), to deal in the Materials without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Materials, and to
permit persons to whom the Materials are furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Materials.

THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
</pre>
</div>
</div>


<div class="product">
<span class="title">Harfbuzz</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://freedesktop.org/wiki/Software/HarfBuzz">homepage</a></span>
<div class="licence">
<pre>HarfBuzz was previously licensed under different licenses.  This was
changed in January 2008.  If you need to relicense your old copies,
consult the announcement of the license change on the internet.
Other than that, each copy of HarfBuzz is licensed under the COPYING
file included with it.  The actual license follows:


Permission is hereby granted, without written agreement and without
license or royalty fees, to use, copy, modify, and distribute this
software and its documentation for any purpose, provided that the
above copyright notice and the following two paragraphs appear in
all copies of this software.

IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.

THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
</pre>
</div>
</div>


<div class="product">
<span class="title">hunspell</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://hunspell.sourceforge.net/">homepage</a></span>
<div class="licence">
<pre>GPL 2.0/LGPL 2.1/MPL 1.1 tri-license

The contents of this software may be used under the terms of
the GNU General Public License Version 2 or later (the "GPL"), or
the GNU Lesser General Public License Version 2.1 or later (the "LGPL",
see COPYING.LGPL) or (excepting the LGPLed GNU gettext library in the
intl/ directory) the Mozilla Public License Version 1.1 or later
(the "MPL", see COPYING.MPL).

Software distributed under these licenses is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the licences
for the specific language governing rights and limitations under the licenses.
</pre>
</div>
</div>


<div class="product">
<span class="title">ICU</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://site.icu-project.org/">homepage</a></span>
<div class="licence">
<pre>(This file was manually converted from license.html.)

--------------------------------------------------------------------------------

ICU License - ICU 1.8.1 and later

COPYRIGHT AND PERMISSION NOTICE

Copyright (c) 1995-2009 International Business Machines Corporation and others

All rights reserved.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, and/or sell
copies of the Software, and to permit persons
to whom the Software is furnished to do so, provided that the above
copyright notice(s) and this permission notice appear in all copies
of the Software and that both the above copyright notice(s) and this
permission notice appear in supporting documentation.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL
THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM,
OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER
RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
USE OR PERFORMANCE OF THIS SOFTWARE.

Except as contained in this notice, the name of a copyright holder shall not be
used in advertising or otherwise to promote the sale, use or other dealings in
this Software without prior written authorization of the copyright holder.

All trademarks and registered trademarks mentioned herein are the
property of their respective owners.

</pre>
</div>
</div>


<div class="product">
<span class="title">lcov</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://ltp.sourceforge.net/coverage/lcov.php">homepage</a></span>
<div class="licence">
<pre>License copied from bin/lcov:

#
#   Copyright (c) International Business Machines  Corp., 2002,2007
#
#   This program is free software;  you can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation; either version 2 of the License, or (at
#   your option) any later version.
#
#   This program is distributed in the hope that it will be useful, but
#   WITHOUT ANY WARRANTY;  without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   General Public License for more details.                 
#
#   You should have received a copy of the GNU General Public License
#   along with this program;  if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
</pre>
</div>
</div>


<div class="product">
<span class="title">libevent</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://www.monkey.org/~provos/libevent/">homepage</a></span>
<div class="licence">
<pre>Copyright 2000-2007 Niels Provos &lt;provos@citi.umich.edu&gt;
Copyright 2007-2009 Niels Provos and Nick Mathewson

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in the
   documentation and/or other materials provided with the distribution.
3. The name of the author may not be used to endorse or promote products
   derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</pre>
</div>
</div>


<div class="product">
<span class="title">libjingle</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://code.google.com/p/libjingle/">homepage</a></span>
<div class="licence">
<pre>Copyright (c) 2004--2005, Google Inc.
All rights reserved.

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright notice,
      this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright notice,
      this list of conditions and the following disclaimer in the documentation
      and/or other materials provided with the distribution.
    * The name of the author may not be used to endorse or promote products
      derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY 
WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
SUCH DAMAGE.</pre>
</div>
</div>


<div class="product">
<span class="title">libjpeg</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://www.ijg.org/">homepage</a></span>
<div class="licence">
<pre>(Copied from the README.)

--------------------------------------------------------------------------------

The authors make NO WARRANTY or representation, either express or implied,
with respect to this software, its quality, accuracy, merchantability, or
fitness for a particular purpose.  This software is provided "AS IS", and you,
its user, assume the entire risk as to its quality and accuracy.

This software is copyright (C) 1991-1998, Thomas G. Lane.
All Rights Reserved except as specified below.

Permission is hereby granted to use, copy, modify, and distribute this
software (or portions thereof) for any purpose, without fee, subject to these
conditions:
(1) If any part of the source code for this software is distributed, then this
README file must be included, with this copyright and no-warranty notice
unaltered; and any additions, deletions, or changes to the original files
must be clearly indicated in accompanying documentation.
(2) If only executable code is distributed, then the accompanying
documentation must state that "this software is based in part on the work of
the Independent JPEG Group".
(3) Permission for use of this software is granted only if the user accepts
full responsibility for any undesirable consequences; the authors accept
NO LIABILITY for damages of any kind.

These conditions apply to any software derived from or based on the IJG code,
not just to the unmodified library.  If you use our work, you ought to
acknowledge us.

Permission is NOT granted for the use of any IJG author's name or company name
in advertising or publicity relating to this software or products derived from
it.  This software may be referred to only as "the Independent JPEG Group's
software".

We specifically permit and encourage the use of this software as the basis of
commercial products, provided that all warranty or liability claims are
assumed by the product vendor.


ansi2knr.c is included in this distribution by permission of L. Peter Deutsch,
sole proprietor of its copyright holder, Aladdin Enterprises of Menlo Park, CA.
ansi2knr.c is NOT covered by the above copyright and conditions, but instead
by the usual distribution terms of the Free Software Foundation; principally,
that you must include source code if you redistribute it.  (See the file
ansi2knr.c for full details.)  However, since ansi2knr.c is not needed as part
of any program generated from the IJG code, this does not limit you more than
the foregoing paragraphs do.

The Unix configuration script "configure" was produced with GNU Autoconf.
It is copyright by the Free Software Foundation but is freely distributable.
The same holds for its supporting scripts (config.guess, config.sub,
ltconfig, ltmain.sh).  Another support script, install-sh, is copyright
by M.I.T. but is also freely distributable.

It appears that the arithmetic coding option of the JPEG spec is covered by
patents owned by IBM, AT&amp;T, and Mitsubishi.  Hence arithmetic coding cannot
legally be used without obtaining one or more licenses.  For this reason,
support for arithmetic coding has been removed from the free JPEG software.
(Since arithmetic coding provides only a marginal gain over the unpatented
Huffman mode, it is unlikely that very many implementations will support it.)
So far as we are aware, there are no patent restrictions on the remaining
code.

The IJG distribution formerly included code to read and write GIF files.
To avoid entanglement with the Unisys LZW patent, GIF reading support has
been removed altogether, and the GIF writer has been simplified to produce
"uncompressed GIFs".  This technique does not use the LZW algorithm; the
resulting GIF files are larger than usual, but are readable by all standard
GIF decoders.

We are required to state that
    "The Graphics Interchange Format(c) is the Copyright property of
    CompuServe Incorporated.  GIF(sm) is a Service Mark property of
    CompuServe Incorporated."
</pre>
</div>
</div>


<div class="product">
<span class="title">libpng</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://libpng.org/">homepage</a></span>
<div class="licence">
<pre>
This copy of the libpng notices is provided for your convenience.  In case of
any discrepancy between this copy and the notices in the file png.h that is
included in the libpng distribution, the latter shall prevail.

COPYRIGHT NOTICE, DISCLAIMER, and LICENSE:

If you modify libpng you may insert additional notices immediately following
this sentence.

This code is released under the libpng license.

libpng versions 1.2.6, August 15, 2004, through 1.2.43, February 25, 2010, are
Copyright (c) 2004, 2006-2009 Glenn Randers-Pehrson, and are
distributed according to the same disclaimer and license as libpng-1.2.5
with the following individual added to the list of Contributing Authors

   Cosmin Truta

libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are
Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are
distributed according to the same disclaimer and license as libpng-1.0.6
with the following individuals added to the list of Contributing Authors

   Simon-Pierre Cadieux
   Eric S. Raymond
   Gilles Vollant

and with the following additions to the disclaimer:

   There is no warranty against interference with your enjoyment of the
   library or against infringement.  There is no warranty that our
   efforts or the library will fulfill any of your particular purposes
   or needs.  This library is provided with all faults, and the entire
   risk of satisfactory quality, performance, accuracy, and effort is with
   the user.

libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
Copyright (c) 1998, 1999 Glenn Randers-Pehrson, and are
distributed according to the same disclaimer and license as libpng-0.96,
with the following individuals added to the list of Contributing Authors:

   Tom Lane
   Glenn Randers-Pehrson
   Willem van Schaik

libpng versions 0.89, June 1996, through 0.96, May 1997, are
Copyright (c) 1996, 1997 Andreas Dilger
Distributed according to the same disclaimer and license as libpng-0.88,
with the following individuals added to the list of Contributing Authors:

   John Bowler
   Kevin Bracey
   Sam Bushell
   Magnus Holmgren
   Greg Roelofs
   Tom Tanner

libpng versions 0.5, May 1995, through 0.88, January 1996, are
Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.

For the purposes of this copyright and license, "Contributing Authors"
is defined as the following set of individuals:

   Andreas Dilger
   Dave Martindale
   Guy Eric Schalnat
   Paul Schmidt
   Tim Wegner

The PNG Reference Library is supplied "AS IS".  The Contributing Authors
and Group 42, Inc. disclaim all warranties, expressed or implied,
including, without limitation, the warranties of merchantability and of
fitness for any purpose.  The Contributing Authors and Group 42, Inc.
assume no liability for direct, indirect, incidental, special, exemplary,
or consequential damages, which may result from the use of the PNG
Reference Library, even if advised of the possibility of such damage.

Permission is hereby granted to use, copy, modify, and distribute this
source code, or portions hereof, for any purpose, without fee, subject
to the following restrictions:

1. The origin of this source code must not be misrepresented.

2. Altered versions must be plainly marked as such and must not
   be misrepresented as being the original source.

3. This Copyright notice may not be removed or altered from any
   source or altered source distribution.

The Contributing Authors and Group 42, Inc. specifically permit, without
fee, and encourage the use of this source code as a component to
supporting the PNG file format in commercial products.  If you use this
source code in a product, acknowledgment is not required but would be
appreciated.


A "png_get_copyright" function is available, for convenient use in "about"
boxes and the like:

   printf("%s",png_get_copyright(NULL));

Also, the PNG logo (in PNG format, of course) is supplied in the
files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).

Libpng is OSI Certified Open Source Software.  OSI Certified Open Source is a
certification mark of the Open Source Initiative.

Glenn Randers-Pehrson
glennrp at users.sourceforge.net
February 25, 2010
</pre>
</div>
</div>


<div class="product">
<span class="title">libxml</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://xmlsoft.org">homepage</a></span>
<div class="licence">
<pre>Except where otherwise noted in the source code (e.g. the files hash.c,
list.c and the trio files, which are covered by a similar licence but
with different Copyright notices) all the files are:

 Copyright (C) 1998-2003 Daniel Veillard.  All Rights Reserved.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is fur-
nished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT-
NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
DANIEL VEILLARD BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CON-
NECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Except as contained in this notice, the name of Daniel Veillard shall not
be used in advertising or otherwise to promote the sale, use or other deal-
ings in this Software without prior written authorization from him.

</pre>
</div>
</div>


<div class="product">
<span class="title">libxslt</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://xmlsoft.org/XSLT">homepage</a></span>
<div class="licence">
<pre>Licence for libxslt except libexslt
----------------------------------------------------------------------
 Copyright (C) 2001-2002 Daniel Veillard.  All Rights Reserved.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is fur-
nished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT-
NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
DANIEL VEILLARD BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CON-
NECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Except as contained in this notice, the name of Daniel Veillard shall not
be used in advertising or otherwise to promote the sale, use or other deal-
ings in this Software without prior written authorization from him.

----------------------------------------------------------------------

Licence for libexslt
----------------------------------------------------------------------
 Copyright (C) 2001-2002 Thomas Broyer, Charlie Bozeman and Daniel Veillard.
 All Rights Reserved.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is fur-
nished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT-
NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CON-
NECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Except as contained in this notice, the name of the authors shall not
be used in advertising or otherwise to promote the sale, use or other deal-
ings in this Software without prior written authorization from him.
----------------------------------------------------------------------
</pre>
</div>
</div>


<div class="product">
<span class="title">LZMA SDK</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://www.7-zip.org/sdk.html">homepage</a></span>
<div class="licence">
<pre>LZMA SDK is placed in the public domain.
</pre>
</div>
</div>


<div class="product">
<span class="title">modp base64 decoder</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://modp.com/release/base64/">homepage</a></span>
<div class="licence">
<pre> * MODP_B64 - High performance base64 encoder/decoder
 * Version 1.3 -- 17-Mar-2006
 * http://modp.com/release/base64
 *
 * Copyright (c) 2005, 2006  Nick Galbreath -- nickg [at] modp [dot] com
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 *   Redistributions of source code must retain the above copyright
 *   notice, this list of conditions and the following disclaimer.
 *
 *   Redistributions in binary form must reproduce the above copyright
 *   notice, this list of conditions and the following disclaimer in the
 *   documentation and/or other materials provided with the distribution.
 *
 *   Neither the name of the modp.com nor the names of its
 *   contributors may be used to endorse or promote products derived from
 *   this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</pre>
</div>
</div>


<div class="product">
<span class="title">Cocoa extension code from Camino</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://caminobrowser.org/">homepage</a></span>
<div class="licence">
<pre>/* ***** BEGIN LICENSE BLOCK *****
 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
 *
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * The Original Code is mozilla.org code.
 *
 * The Initial Developer of the Original Code is
 * Netscape Communications Corporation.
 * Portions created by the Initial Developer are Copyright (C) 2002
 * the Initial Developer. All Rights Reserved.
 *
 * Contributor(s):
 *
 * Alternatively, the contents of this file may be used under the terms of
 * either the GNU General Public License Version 2 or later (the "GPL"), or
 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 * in which case the provisions of the GPL or the LGPL are applicable instead
 * of those above. If you wish to allow use of your version of this file only
 * under the terms of either the GPL or the LGPL, and not to allow others to
 * use your version of this file under the terms of the MPL, indicate your
 * decision by deleting the provisions above and replace them with the notice
 * and other provisions required by the GPL or the LGPL. If you do not delete
 * the provisions above, a recipient may use your version of this file under
 * the terms of any one of the MPL, the GPL or the LGPL.
 *
 * ***** END LICENSE BLOCK ***** */
</pre>
</div>
</div>


<div class="product">
<span class="title">OCMock</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://www.mulle-kybernetik.com/software/OCMock/">homepage</a></span>
<div class="licence">
<pre>  
  Copyright (c) 2004-2009 by Mulle Kybernetik. All rights reserved.

  Permission to use, copy, modify and distribute this software and its documentation
  is hereby granted, provided that both the copyright notice and this permission
  notice appear in all copies of the software, derivative works or modified versions,
  and any portions thereof, and that both notices appear in supporting documentation,
  and that credit is given to Mulle Kybernetik in all documents and publicity
  pertaining to direct or indirect use of this code or its derivatives.

  THIS IS EXPERIMENTAL SOFTWARE AND IT IS KNOWN TO HAVE BUGS, SOME OF WHICH MAY HAVE
  SERIOUS CONSEQUENCES. THE COPYRIGHT HOLDER ALLOWS FREE USE OF THIS SOFTWARE IN ITS
  "AS IS" CONDITION. THE COPYRIGHT HOLDER DISCLAIMS ANY LIABILITY OF ANY KIND FOR ANY
  DAMAGES WHATSOEVER RESULTING DIRECTLY OR INDIRECTLY FROM THE USE OF THIS SOFTWARE
  OR OF ANY DERIVATIVE WORK.</pre>
</div>
</div>


<div class="product">
<span class="title">OpenMAX IL</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://www.khronos.org/openmax/">homepage</a></span>
<div class="licence">
<pre>Copyright (c) 2008 The Khronos Group Inc.

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject
to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
</pre>
</div>
</div>


<div class="product">
<span class="title">OTS (OpenType Sanitizer)</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://code.google.com/p/ots/">homepage</a></span>
<div class="licence">
<pre>// Copyright (c) 2009 The Chromium Authors. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//    * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//    * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
//    * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</pre>
</div>
</div>


<div class="product">
<span class="title">Protocol Buffers</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://code.google.com/p/protobuf/">homepage</a></span>
<div class="licence">
<pre>Copyright 2008, Google Inc.
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

    * Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
    * Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Code generated by the Protocol Buffer compiler is owned by the owner
of the input file used when generating it.  This code is not
standalone and requires a support library to be linked with it.  This
support library is itself covered by the above license.
</pre>
</div>
</div>


<div class="product">
<span class="title">pyftpdlib</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://code.google.com/p/pyftpdlib/">homepage</a></span>
<div class="licence">
<pre>======================================================================
Copyright (C) 2007  Giampaolo Rodola' &lt;g.rodola@gmail.com&gt;

                         All Rights Reserved

Permission to use, copy, modify, and distribute this software and
its documentation for any purpose and without fee is hereby
granted, provided that the above copyright notice appear in all
copies and that both that copyright notice and this permission
notice appear in supporting documentation, and that the name of
Giampaolo Rodola' not be used in advertising or publicity pertaining to
distribution of the software without specific, written prior
permission.

Giampaolo Rodola' DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
NO EVENT Giampaolo Rodola' BE LIABLE FOR ANY SPECIAL, INDIRECT OR
CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
======================================================================</pre>
</div>
</div>


<div class="product">
<span class="title">pywebsocket</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://code.google.com/p/pywebsocket/">homepage</a></span>
<div class="licence">
<pre>Copyright 2009, Google Inc.
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

    * Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
    * Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</pre>
</div>
</div>


<div class="product">
<span class="title">SCons</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://www.scons.org">homepage</a></span>
<div class="licence">
<pre>        Copyright and license for SCons - a software construction tool

        This copyright and license do not apply to any other software
        with which this software may have been included.

Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
</pre>
</div>
</div>


<div class="product">
<span class="title">simplejson</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://undefined.org/python/#simplejson">homepage</a></span>
<div class="licence">
<pre>Copyright (c) 2006 Bob Ippolito

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
</pre>
</div>
</div>


<div class="product">
<span class="title">skia</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://code.google.com/p/skia/">homepage</a></span>
<div class="licence">
<pre>Copyright 2006, The Android Open Source Project

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
</pre>
</div>
</div>


<div class="product">
<span class="title">SQLite</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://sqlite.org/">homepage</a></span>
<div class="licence">
<pre>The author disclaims copyright to this source code.  In place of
a legal notice, here is a blessing:

   May you do good and not evil.
   May you find forgiveness for yourself and forgive others.
   May you share freely, never taking more than you give.
</pre>
</div>
</div>


<div class="product">
<span class="title">swig</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://www.swig.org/download.html">homepage</a></span>
<div class="licence">
<pre>SWIG is distributed under the following terms:

I.  

Copyright (c) 1995-1998
The University of Utah and the Regents of the University of California
All Rights Reserved

Permission is hereby granted, without written agreement and without
license or royalty fees, to use, copy, modify, and distribute this
software and its documentation for any purpose, provided that 
(1) The above copyright notice and the following two paragraphs
appear in all copies of the source code and (2) redistributions
including binaries reproduces these notices in the supporting
documentation.   Substantial modifications to this software may be
copyrighted by their authors and need not follow the licensing terms
described here, provided that the new terms are clearly indicated in
all files where they apply.

IN NO EVENT SHALL THE AUTHOR, THE UNIVERSITY OF CALIFORNIA, THE 
UNIVERSITY OF UTAH OR DISTRIBUTORS OF THIS SOFTWARE BE LIABLE TO ANY
PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION,
EVEN IF THE AUTHORS OR ANY OF THE ABOVE PARTIES HAVE BEEN ADVISED OF
THE POSSIBILITY OF SUCH DAMAGE.

THE AUTHOR, THE UNIVERSITY OF CALIFORNIA, AND THE UNIVERSITY OF UTAH
SPECIFICALLY DISCLAIM ANY WARRANTIES,INCLUDING, BUT NOT LIMITED TO, 
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND 
THE AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.


II. 

This software includes contributions that are Copyright (c) 1998-2005
University of Chicago.
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.  Redistributions
in binary form must reproduce the above copyright notice, this list of
conditions and the following disclaimer in the documentation and/or
other materials provided with the distribution.  Neither the name of
the University of Chicago nor the names of its contributors may be
used to endorse or promote products derived from this software without
specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY OF CHICAGO AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OF
CHICAGO OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


III.  

This software includes contributions that are Copyright (c) 2005-2006
Arizona Board of Regents (University of Arizona).
All Rights Reserved

Permission is hereby granted, without written agreement and without
license or royalty fees, to use, copy, modify, and distribute this
software and its documentation for any purpose, provided that 
(1) The above copyright notice and the following two paragraphs
appear in all copies of the source code and (2) redistributions
including binaries reproduces these notices in the supporting
documentation.   Substantial modifications to this software may be
copyrighted by their authors and need not follow the licensing terms
described here, provided that the new terms are clearly indicated in
all files where they apply.

THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY OF ARIZONA AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OF
ARIZONA OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

</pre>
</div>
</div>


<div class="product">
<span class="title">tcmalloc</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://google-perftools.googlecode.com/">homepage</a></span>
<div class="licence">
<pre>// Copyright (c) 2005, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//     * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
//     * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</pre>
</div>
</div>


<div class="product">
<span class="title">tlslite</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://trevp.net/tlslite/">homepage</a></span>
<div class="licence">
<pre>All code here is public domain.
</pre>
</div>
</div>


<div class="product">
<span class="title">WTL 8.0</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=e5ba5ba4-6e6b-462a-b24c-61115e846f0c">homepage</a></span>
<div class="licence">
<pre>Microsoft Permissive License (Ms-PL)
Published: October 12, 2006


This license governs use of the accompanying software. If you use the software,
you accept this license. If you do not accept the license, do not use the
software.


1. Definitions

The terms "reproduce," "reproduction," "derivative works," and "distribution"
have the same meaning here as under U.S. copyright law.

A "contribution" is the original software, or any additions or changes to the
software.

A "contributor" is any person that distributes its contribution under this
license.

"Licensed patents" are a contributors patent claims that read directly on its
contribution.


2. Grant of Rights

(A) Copyright Grant- Subject to the terms of this license, including the
license conditions and limitations in section 3, each contributor grants you a
non-exclusive, worldwide, royalty-free copyright license to reproduce its
contribution, prepare derivative works of its contribution, and distribute its
contribution or any derivative works that you create.

(B) Patent Grant- Subject to the terms of this license, including the license
conditions and limitations in section 3, each contributor grants you a
non-exclusive, worldwide, royalty-free license under its licensed patents to
make, have made, use, sell, offer for sale, import, and/or otherwise dispose of
its contribution in the software or derivative works of the contribution in the
software.


3. Conditions and Limitations

(A) No Trademark License- This license does not grant you rights to use any
contributors name, logo, or trademarks.

(B) If you bring a patent claim against any contributor over patents that you
claim are infringed by the software, your patent license from such contributor
to the software ends automatically.

(C) If you distribute any portion of the software, you must retain all
copyright, patent, trademark, and attribution notices that are present in the
software.

(D) If you distribute any portion of the software in source code form, you may
do so only under this license by including a complete copy of this license with
your distribution. If you distribute any portion of the software in compiled or
object code form, you may only do so under a license that complies with this
license.

(E) The software is licensed "as-is." You bear the risk of using it. The
contributors give no express warranties, guarantees or conditions. You may have
additional consumer rights under your local laws which this license cannot
change. To the extent permitted under your local laws, the contributors exclude
the implied warranties of merchantability, fitness for a particular purpose and
non-infringement.
</pre>
</div>
</div>


<div class="product">
<span class="title">xdg-utils</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://portland.freedesktop.org/wiki/">homepage</a></span>
<div class="licence">
<pre>#
#   Permission is hereby granted, free of charge, to any person obtaining a
#   copy of this software and associated documentation files (the "Software"),
#   to deal in the Software without restriction, including without limitation
#   the rights to use, copy, modify, merge, publish, distribute, sublicense,
#   and/or sell copies of the Software, and to permit persons to whom the
#   Software is furnished to do so, subject to the following conditions:
#
#   The above copyright notice and this permission notice shall be included
#   in all copies or substantial portions of the Software.
#
#   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
#   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
#   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
#   THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
#   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
#   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
#   OTHER DEALINGS IN THE SOFTWARE.
</pre>
</div>
</div>


<div class="product">
<span class="title">yasm</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://www.tortall.net/projects/yasm/">homepage</a></span>
<div class="licence">
<pre>Yasm is Copyright (c) 2001-2009 Peter Johnson and other Yasm developers.

Yasm developers and/or contributors include:
  Peter Johnson
  Michael Urman
  Brian Gladman (VC8 build files, other fixes)
  Stanislav Karchebny (options parser)
  Mathieu Monnier (SSE4 instruction patches)
  Anonymous "NASM64" developer (NASM preprocessor fixes)
  Stephen Polkowski (x86 instruction patches)
  Henryk Richter (Mach-O object format)
  Ben Skeggs (patches, bug reports)
  Samuel Thibault (TASM parser and frontend)

-----------------------------------
Yasm licensing overview and summary
-----------------------------------

Note: This document does not provide legal advice nor is it the actual
license of any part of Yasm.  See the individual licenses for complete
details.  Consult a lawyer for legal advice.

The primary license of Yasm is the 2-clause BSD license.  Please use this
license if you plan on submitting code to the project.

Yasm has absolutely no warranty; not even for merchantibility or fitness
for a particular purpose.

-------
Libyasm
-------
Libyasm is 2-clause or 3-clause BSD licensed, with the exception of
bitvect, which is triple-licensed under the Artistic license, GPL, and
LGPL.  Libyasm is thus GPL and LGPL compatible.  In addition, this also
means that libyasm is free for binary-only distribution as long as the
terms of the 3-clause BSD license and Artistic license (as it applies to
bitvect) are fulfilled.

-------
Modules
-------
The modules are 2-clause or 3-clause BSD licensed, with the exception of:
 preprocs/nasm - LGPL licensed

---------
Frontends
---------
The frontends are 2-clause BSD licensed.

-------------
License Texts
-------------
The full text of all licenses are provided in separate files in the source
distribution.  Each source file may include the entire license (in the case
of the BSD and Artistic licenses), or may reference the GPL or LGPL license
file.

BSD.txt - 2-clause and 3-clause BSD licenses
Artistic.txt - Artistic license
GNU_GPL-2.0 - GNU General Public License
GNU_LGPL-2.0 - GNU Library General Public License
</pre>
</div>
</div>


<div class="product">
<span class="title">zlib</span>
<a class="show" href="#" onclick="return toggle(this);">show license</a>
<span class="homepage"><a href="http://zlib.net/">homepage</a></span>
<div class="licence">
<pre>/* zlib.h -- interface of the 'zlib' general purpose compression library
  version 1.2.4, March 14th, 2010

  Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler

  This software is provided 'as-is', without any express or implied
  warranty.  In no event will the authors be held liable for any damages
  arising from the use of this software.

  Permission is granted to anyone to use this software for any purpose,
  including commercial applications, and to alter it and redistribute it
  freely, subject to the following restrictions:

  1. The origin of this software must not be misrepresented; you must not
     claim that you wrote the original software. If you use this software
     in a product, an acknowledgment in the product documentation would be
     appreciated but is not required.
  2. Altered source versions must be plainly marked as such, and must not be
     misrepresented as being the original software.
  3. This notice may not be removed or altered from any source distribution.

  Jean-loup Gailly
  Mark Adler

*/
</pre>
</div>
</div>


</div>

</body>
</html>

{
  "key": "XX1fMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCfjDZDDE/CHFEYjpPSDjdI3zphzGo7fSxO3+/pQs++FwvA+OpKKhmBga2Sa+f53ujDlPR8Q6mCvy1lXM4M4zD4Hg3lH2LC1wT/YXxJ28afRYW1yEo6/pbpHazij3+FneGMT2xcTyGvgoacJHXOTUqWyCN7qMOCiFDwQ6Uk1zJOPQIDAQAB",
  "name": "Google Docs",
  "version": "1",
  "icons": {
    "128": "128.png",
    "24": "24.png",
    "32": "32.png",
    "48": "48.png"
  },
  "app": {
    "urls": [
      "*://www.google.com/docs/",
      "*://docs.google.com/",
      "*://docs0.google.com/",
      "*://docs1.google.com/",
      "*://docs2.google.com/",
      "*://docs3.google.com/",
      "*://docs4.google.com/",
      "*://docs5.google.com/",
      "*://docs6.google.com/",
      "*://docs7.google.com/",
      "*://docs8.google.com/",
      "*://docs9.google.com/",
      "*://spreadsheets.google.com/",
      "*://spreadsheets0.google.com/",
      "*://spreadsheets1.google.com/",
      "*://spreadsheets2.google.com/",
      "*://spreadsheets3.google.com/",
      "*://spreadsheets4.google.com/",
      "*://spreadsheets5.google.com/",
      "*://spreadsheets6.google.com/",
      "*://spreadsheets7.google.com/",
      "*://spreadsheets8.google.com/",
      "*://spreadsheets9.google.com/"
    ],
    "browse_urls": [
      "https://www.google.com/accounts/"
    ],
    "launch": {
      "web_url": "https://docs.google.com/"
    }
  }
}
<!DOCTYPE HTML>
<html i18n-values="dir:textdirection;">
<head>
<meta charset="utf-8">
<title i18n-content="title"></title>
<link rel="icon" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACiklEQVQ4y0WSzYtVRxDFf/357n3PmQxRM8ZAEDdCiCuzlok7xT8gkBAM7hWX2bhIcOHGL+JOURxmEwNK/FYMJkIgKhLEbRaKGmcwGAdH39zbVeXivudAN1UHuqpOnzpu/edfbe8Npn5MKW/xIeIdGGBm0B3AVrAZKnKvbZa+f3z/9G+xN/jwVN3vT1d1TcoJ5wI2LsBADR03MjBTROSLdrk/a2YbYkxpuurX9AerSCmDM0wVEUGldBMNwOO9x5xDVfEhrgM2xhA8KWViysScMRP2fLOVHTObUTNUjXPX/uLIyevga7yPOB+JyQAm/OiTONdFKYXtM5sRVUSUIsKOL7ewtDhPM3xNKe1YGAAXx4KZdtOkFEQUUe3wKB++fkmIfVyscD6ipgBEUMwMUcXahmb5DUUEEUNV3zNp3i6S6ylcqjECItI1MAU1Y/VUn7nDu1E1SlkplBGL29fnUFV27TvK4pshpo6maZw3A1Nj4cX//HL5Di/+e0URoRShiI5ih2/dvsvzZ//SNkNECwDeTDEDEeP47A3uP/yHtujojouVi1dusv/AcYpot52RkL4zjXbuI/DD4Z85f+n3FRZFOTN3loOHThDygJBqnE84c+ScrdNADXB43yNWE/x05gaPnizw3dc7OXTsJBeu/kFetYbcX02sJvEhI8W6NaopZh2tEDwu1KTK+PXmA279+YD5+QWqyWlib5LUm8DHHjiP0QIMook+FdVPRBVEcc4TYkWsHIvNkN7kOpwL+NDDhYzhMTGqKr4C1vqPP/pgj1N52Q6XaZuGZrmhLQUxwGV8qMFXqHlEhLZtyZmlvd9uuwJEZ2abgM+AT4EacGOfisj7PIQwNnAcvVkA/n4HBTCjwpUJ2VAAAAAASUVORK5CYII=">
<style>
body {
  background-color: white;
  color: black;
  margin: 10px;
}

.header {
  overflow: auto;
  clear: both;
}

.header .logo {
  float: left;
}

.header .form {
  float: left;
  margin-top: 22px;
  margin-left: 12px;
}

html[dir=rtl] .logo {
  float: right;
}

html[dir=rtl] .form {
  float: right;
  margin-right: 12px;
}

#downloads-summary {
  margin-top: 12px;
  border-top: 1px solid #9cc2ef;
  background-color: #ebeff9;
  padding: 3px;
  margin-bottom: 6px;
}

#downloads-summary-text {
  font-weight: bold;
}

#downloads-summary > a {
  float: right;
}

html[dir=rtl] #downloads-summary > a {
  float: left;
}

#downloads-display {
  max-width: 740px;
}

.download {
  position: relative;
  margin-top: 6px;
  margin-left: 114px;
  padding-left: 56px;
  margin-bottom: 15px;
}

html[dir=rtl] .download {
  padding-left: 0px;
  margin-left: 0px;
  margin-right: 114px;
  padding-right: 56px;
}

.date-container {
  position: absolute;
  left: -110px;
  width: 110px;
}

html[dir=rtl] .date-container {
  left: auto;
  right: -110px;
}

.date-container .since {
  color: black;
}

.date-container .date {
  color: #666;
}

.download .icon {
  position: absolute;
  top: 2px;
  left: 9px;
  width: 32px;
  height: 32px;
}

html[dir=rtl] .icon {
  left: auto;
  right: 9px;
}

.download.otr > .safe,
.download.otr > .show-dangerous {
  background: url("data:image/png;base64,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") no-repeat 100% 100%;
  opacity: .66;
  -webkit-transition: opacity .15s;
}

html[dir=rtl] .download.otr > .safe,
html[dir=rtl] .download.otr > .show-dangerous {
  background-position: 0% 100%;
}

.download.otr > .safe:hover,
.download.otr > .show-dangerous:hover {
  opacity: 1;
}

.progress {
  position: absolute;
  top: -6px;
  left: 0px;
  width: 48px;
  height: 48px;
}

html[dir=rtl] .progress {
  left: auto;
  right: 0px;
}

.progress.background {
  background: url("data:image/png;base64,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");
}

.progress.foreground {
  background: url("data:image/png;base64,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");
}

.name {
  display: none;
  padding-right: 16px;
  max-width: 450px;
  word-break: break-all;
}

html[dir=rtl] .name {
  padding-right: 0px;
  padding-left: 16px;
}

.download .status {
  display: inline;
  color: #999;
  white-space: nowrap;
}

.download .url {
  color: #080;
  max-width: 500px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.controls a {
  color: #777;
  margin-right: 16px;
}

#downloads-pagination {
  padding-top: 24px;
  margin-left: 18px;
}

.page-navigation {
  padding: 8px;
  background-color: #ebeff9;
  margin-right: 4px;
}

.footer {
  height: 24px;
}

</style>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// TODO(arv): Namespace

/**
 * The local strings get injected into the page usig a variable named
 * {@code templateData}. This class provides a simpler interface to access those
 * strings.
 * @constructor
 */
function LocalStrings() {
}

// Start of anonymous namespace.
(function() {

/**
 * Returns a formatted string where $1 to $9 are replaced by the second to the
 * tenth argument.
 * @param {string} s The format string.
 * @param {...string} The extra values to include in the formatted output.
 * @return {string} The string after format substitution.
 */
function replaceArgs(s, args) {
  return s.replace(/\$[$1-9]/g, function(m) {
    return (m == '$$') ? '$' : args[m[1]];
  });
}

/**
 * Returns a string after removing Windows-style accelerators.
 * @param {string} s The input string that may contain accelerators.
 * @return {string} The resulting string with accelerators removed.
 */
function trimAccelerators(s) {
  return s.replace(/&{1,2}/g, function(m) {
    return (m == '&&') ? '&' : '';
  });
}

LocalStrings.prototype = {
  /**
   * The template data object.
   * @type {Object}
   */
  templateData: null,

  /**
   * Gets a localized string by its id.
   * @param {string} s The ID of the string we want.
   * @return {string} The localized string.
   */
  getString: function(id) {
    // TODO(arv): We should not rely on a global variable here.
    return (this.templateData || window.templateData)[id] || '';
  },

  /**
   * Returns a formatted localized string where $1 to $9 are replaced by the
   * second to the tenth argument.
   * @param {string} id The ID of the string we want.
   * @param {...string} The extra values to include in the formatted output.
   * @return {string} The formatted string.
   */
  getStringF: function(id, var_args) {
    return replaceArgs(this.getString(id), arguments);
  },

  /**
   * Gets a localized string (stripped of Windows-style accelerators) by its id.
   * @param {string} s The ID of the string we want.
   * @return {string} The localized string.
   */
  getStringWithoutAccelerator: function(id) {
    return trimAccelerators(this.getString(id));
  },

  /**
   * Returns a formatted localized string (stripped of Windows-style
   * accelerators) where $1 to $9 are replaced by the second to the tenth
   * argument.
   * @param {string} id The ID of the string we want.
   * @param {...string} The extra values to include in the formatted output.
   * @return {string} The formatted string.
   */
  getStringWithoutAcceleratorF: function(id, var_args) {
    return replaceArgs(this.getStringWithoutAccelerator(id), arguments);
  }
};

// End of anonymous namespace.
})();
</script>
<script>

///////////////////////////////////////////////////////////////////////////////
// Helper functions
function $(o) {return document.getElementById(o);}

function bind(fn, selfObj, var_args) {
  var boundArgs = Array.prototype.slice.call(arguments, 2);
  return function() {
    var args = Array.prototype.slice.call(arguments);
    args.unshift.apply(args, boundArgs);
    return fn.apply(selfObj, args);
  }
}

/**
 * Sets the display style of a node.
 */
function showInline(node, isShow) {
  node.style.display = isShow ? 'inline' : 'none';
}

function showInlineBlock(node, isShow) {
  node.style.display = isShow ? 'inline-block' : 'none';
}

/**
 * Creates an element of a specified type with a specified class name.
 * @param {String} type The node type.
 * @param {String} className The class name to use.
 */
function createElementWithClassName(type, className) {
  var elm = document.createElement(type);
  elm.className = className;
  return elm;
}

/**
 * Creates a link with a specified onclick handler and content
 * @param {String} onclick The onclick handler
 * @param {String} value The link text
 */
function createLink(onclick, value) {
  var link = document.createElement("a");
  link.onclick = onclick;
  link.href = '#';
  link.innerHTML = value;
  return link;
}

/**
 * Creates a button with a specified onclick handler and content
 * @param {String} onclick The onclick handler
 * @param {String} value The button text
 */
function createButton(onclick, value) {
  var button = document.createElement("input");
  button.type = 'button';
  button.value = value;
  button.onclick = onclick;
  return button;
}

///////////////////////////////////////////////////////////////////////////////
// Downloads
/**
 * Class to hold all the information about the visible downloads.
 */
function Downloads() {
  this.downloads_ = {};
  this.node_ = $('downloads-display');
  this.summary_ = $('downloads-summary-text');
  this.searchText_ = "";

  // Keep track of the dates of the newest and oldest downloads so that we
  // know where to insert them.
  this.newestTime_ = -1;
}

/**
 * Called when a download has been updated or added.
 * @param {Object} download A backend download object (see downloads_ui.cc)
 */
Downloads.prototype.updated = function(download) {
  var id = download.id;
  if (!!this.downloads_[id]) {
    this.downloads_[id].update(download);
  } else {
    this.downloads_[id] = new Download(download);
    // We get downloads in display order, so we don't have to worry about
    // maintaining correct order - we can assume that any downloads not in
    // display order are new ones and so we can add them to the top of the
    // list.
    if (download.started > this.newestTime_) {
      this.node_.insertBefore(this.downloads_[id].node, this.node_.firstChild);
      this.newestTime_ = download.started;
    } else {
      this.node_.appendChild(this.downloads_[id].node);
    }
    this.updateDateDisplay_();
  }
}

/**
 * Set our display search text.
 * @param {String} searchText The string we're searching for.
 */
Downloads.prototype.setSearchText = function(searchText) {
  this.searchText_ = searchText;
}

/**
 * Update the summary block above the results
 */
Downloads.prototype.updateSummary = function() {
  if (this.searchText_) {
    this.summary_.textContent = localStrings.getStringF('searchresultsfor',
                                                        this.searchText_);
  } else {
    this.summary_.innerHTML = localStrings.getString('downloads');
  }

  var hasDownloads = false;
  for (var i in this.downloads_) {
    hasDownloads = true;
    break;
  }

  if (!hasDownloads) {
    this.node_.innerHTML = localStrings.getString('noresults');
  }
}

/**
 * Update the date visibility in our nodes so that no date is
 * repeated.
 */
Downloads.prototype.updateDateDisplay_ = function() {
  var dateContainers = document.getElementsByClassName('date-container');
  var displayed = {};
  for (var i = 0, container; container = dateContainers[i]; i++) {
    var dateString = container.getElementsByClassName('date')[0].innerHTML;
    if (!!displayed[dateString]) {
      container.style.display = 'none';
    } else {
      displayed[dateString] = true;
      container.style.display = 'block';
    }
  }
}

/**
 * Remove a download.
 * @param {Number} id The id of the download to remove.
 */
Downloads.prototype.remove = function(id) {
  this.node_.removeChild(this.downloads_[id].node);
  delete this.downloads_[id];
  this.updateDateDisplay_();
}

/**
 * Clear all downloads and reset us back to a null state.
 */
Downloads.prototype.clear = function() {
  for (var id in this.downloads_) {
    this.downloads_[id].clear();
    this.remove(id);
  }
}

///////////////////////////////////////////////////////////////////////////////
// Download
/**
 * A download and the DOM representation for that download.
 * @param {Object} download A backend download object (see downloads_ui.cc)
 */
function Download(download) {
  // Create DOM
  this.node = createElementWithClassName('div','download' +
                                         (download.otr ? ' otr' : ''));

  // Dates
  this.dateContainer_ = createElementWithClassName('div', 'date-container');
  this.node.appendChild(this.dateContainer_);

  this.nodeSince_ = createElementWithClassName('div', 'since');
  this.nodeDate_ = createElementWithClassName('div', 'date');
  this.dateContainer_.appendChild(this.nodeSince_);
  this.dateContainer_.appendChild(this.nodeDate_);

  // Container for all 'safe download' UI.
  this.safe_ = createElementWithClassName('div', 'safe');
  this.safe_.ondragstart = bind(this.drag_, this);
  this.node.appendChild(this.safe_);

  if (download.state != Download.States.COMPLETE) {
    this.nodeProgressBackground_ =
        createElementWithClassName('div', 'progress background');
    this.safe_.appendChild(this.nodeProgressBackground_);

    this.canvasProgress_ =
        document.getCSSCanvasContext('2d', 'canvas_' + download.id,
            Download.Progress.width,
            Download.Progress.height);

    this.nodeProgressForeground_ =
        createElementWithClassName('div', 'progress foreground');
    this.nodeProgressForeground_.style.webkitMask =
        '-webkit-canvas(canvas_'+download.id+')';
    this.safe_.appendChild(this.nodeProgressForeground_);
  }

  this.nodeImg_ = createElementWithClassName('img', 'icon');
  this.safe_.appendChild(this.nodeImg_);

  // FileLink is used for completed downloads, otherwise we show FileName.
  this.nodeTitleArea_ = createElementWithClassName('div', 'title-area');
  this.safe_.appendChild(this.nodeTitleArea_);

  this.nodeFileLink_ = createLink(bind(this.openFile_, this), '');
  this.nodeFileLink_.className = 'name';
  this.nodeFileLink_.style.display = 'none';
  this.nodeTitleArea_.appendChild(this.nodeFileLink_);

  this.nodeFileName_ = createElementWithClassName('span', 'name');
  this.nodeFileName_.style.display = 'none';
  this.nodeTitleArea_.appendChild(this.nodeFileName_);

  this.nodeStatus_ = createElementWithClassName('span', 'status');
  this.nodeTitleArea_.appendChild(this.nodeStatus_);

  this.nodeURL_ = createElementWithClassName('div', 'url');
  this.safe_.appendChild(this.nodeURL_);

  // Controls.
  this.nodeControls_ = createElementWithClassName('div', 'controls');
  this.safe_.appendChild(this.nodeControls_);

  // We don't need "show in folder" in chromium os. See download_ui.cc and
  // http://code.google.com/p/chromium-os/issues/detail?id=916.
  var showinfolder = localStrings.getString('control_showinfolder');
  if (showinfolder) {
    this.controlShow_ = createLink(bind(this.show_, this), showinfolder);
    this.nodeControls_.appendChild(this.controlShow_);
  } else {
    this.controlShow_ = null;
  }

  // Pause/Resume are a toggle.
  this.controlPause_ = createLink(bind(this.togglePause_, this),
      localStrings.getString('control_pause'));
  this.nodeControls_.appendChild(this.controlPause_);

  this.controlResume_ = createLink(bind(this.togglePause_, this),
      localStrings.getString('control_resume'));
  this.nodeControls_.appendChild(this.controlResume_);

  this.controlRemove_ = createLink(bind(this.remove_, this),
      localStrings.getString('control_removefromlist'));
  this.nodeControls_.appendChild(this.controlRemove_);

  this.controlCancel_ = createLink(bind(this.cancel_, this),
      localStrings.getString('control_cancel'));
  this.nodeControls_.appendChild(this.controlCancel_);

  // Container for 'unsafe download' UI.
  this.danger_ = createElementWithClassName('div', 'show-dangerous');
  this.node.appendChild(this.danger_);

  this.dangerDesc_ = document.createElement("div");
  this.danger_.appendChild(this.dangerDesc_);

  this.dangerSave_ = createButton(bind(this.saveDangerous_, this),
      localStrings.getString("danger_save"));
  this.danger_.appendChild(this.dangerSave_);

  this.dangerDiscard_ = createButton(bind(this.discardDangerous_, this),
      localStrings.getString("danger_discard"));
  this.danger_.appendChild(this.dangerDiscard_);

  // Update member vars.
  this.update(download);
}

/**
 * The states a download can be in. These correspond to states defined in
 * DownloadsDOMHandler::CreateDownloadItemValue
 */
Download.States = {
  IN_PROGRESS : "IN_PROGRESS",
  CANCELLED : "CANCELLED",
  COMPLETE : "COMPLETE",
  PAUSED : "PAUSED",
  DANGEROUS : "DANGEROUS",
}

/**
 * Constants for the progress meter.
 */
Download.Progress = {
  width : 48,
  height : 48,
  radius : 24,
  centerX : 24,
  centerY : 24,
  base : -0.5 * Math.PI,
  dir : false,
}

/**
 * Updates the download to reflect new data.
 * @param {Object} download A backend download object (see downloads_ui.cc)
 */
Download.prototype.update = function(download) {
  this.id_ = download.id;
  this.filePath_ = download.file_path;
  this.fileName_ = download.file_name;
  this.url_ = download.url;
  this.state_ = download.state;

  this.since_ = download.since_string;
  this.date_ = download.date_string;

  // See DownloadItem::PercentComplete
  this.percent_ = Math.max(download.percent, 0);
  this.progressStatusText_ = download.progress_status_text;
  this.received_ = download.received;

  if (this.state_ == Download.States.DANGEROUS) {
    this.dangerDesc_.innerHTML = localStrings.getStringF('danger_desc',
                                                         this.fileName_);
    this.danger_.style.display = 'block';
    this.safe_.style.display = 'none';
  } else {
    this.nodeImg_.src = 'chrome://fileicon/' + this.filePath_;

    if (this.state_ == Download.States.COMPLETE) {
      this.nodeFileLink_.innerHTML = this.fileName_;
      this.nodeFileLink_.href = this.filePath_;
    } else {
      this.nodeFileName_.innerHTML = this.fileName_;
    }

    showInline(this.nodeFileLink_, this.state_ == Download.States.COMPLETE);
    // nodeFileName_ has to be inline-block to avoid the 'interaction' with
    // nodeStatus_. If both are inline, it appears that their text contents
    // are merged before the bidi algorithm is applied leading to an
    // undesirable reordering. http://crbug.com/13216
    showInlineBlock(this.nodeFileName_, this.state_ != Download.States.COMPLETE);

    if (this.state_ == Download.States.IN_PROGRESS) {
      this.nodeProgressForeground_.style.display = 'block';
      this.nodeProgressBackground_.style.display = 'block';

      // Draw a pie-slice for the progress.
      this.canvasProgress_.clearRect(0, 0,
                                     Download.Progress.width,
                                     Download.Progress.height);
      this.canvasProgress_.beginPath();
      this.canvasProgress_.moveTo(Download.Progress.centerX,
                                  Download.Progress.centerY);

      // Draw an arc CW for both RTL and LTR. http://crbug.com/13215
      this.canvasProgress_.arc(Download.Progress.centerX,
                               Download.Progress.centerY,
                               Download.Progress.radius,
                               Download.Progress.base,
                               Download.Progress.base + Math.PI * 0.02 *
                               Number(this.percent_),
                               false);

      this.canvasProgress_.lineTo(Download.Progress.centerX,
                                  Download.Progress.centerY);
      this.canvasProgress_.fill();
      this.canvasProgress_.closePath();
    } else if (this.nodeProgressBackground_) {
      this.nodeProgressForeground_.style.display = 'none';
      this.nodeProgressBackground_.style.display = 'none';
    }

    if (this.controlShow_) {
      showInline(this.controlShow_, this.state_ == Download.States.COMPLETE);
    }
    showInline(this.controlPause_, this.state_ == Download.States.IN_PROGRESS);
    showInline(this.controlResume_, this.state_ == Download.States.PAUSED);
    var showCancel = this.state_ == Download.States.IN_PROGRESS ||
                     this.state_ == Download.States.PAUSED;
    showInline(this.controlCancel_, showCancel);
    showInline(this.controlRemove_, !showCancel);

    this.nodeSince_.innerHTML = this.since_;
    this.nodeDate_.innerHTML = this.date_;
    // Don't unnecessarily update the url, as doing so will remove any
    // text selection the user has started (http://crbug.com/44982).
    if (this.nodeURL_.textContent != this.url_)
      this.nodeURL_.textContent = this.url_;
    this.nodeStatus_.innerHTML = this.getStatusText_();

    this.danger_.style.display = 'none';
    this.safe_.style.display = 'block';
  }
}

/**
 * Removes applicable bits from the DOM in preparation for deletion.
 */
Download.prototype.clear = function() {
  this.safe_.ondragstart = null;
  this.nodeFileLink_.onclick = null;
  if (this.controlShow_) {
    this.controlShow_.onclick = null;
  }
  this.controlCancel_.onclick = null;
  this.controlPause_.onclick = null;
  this.controlResume_.onclick = null;
  this.dangerDiscard_.onclick = null;

  this.node.innerHTML = '';
}

/**
 * @return {String} User-visible status update text.
 */
Download.prototype.getStatusText_ = function() {
  switch (this.state_) {
    case Download.States.IN_PROGRESS:
      return this.progressStatusText_;
    case Download.States.CANCELLED:
      return localStrings.getString('status_cancelled');
    case Download.States.PAUSED:
      return localStrings.getString('status_paused');
    case Download.States.DANGEROUS:
      return localStrings.getString('danger_desc');
    case Download.States.COMPLETE:
      return "";
  }
}

/**
 * Tells the backend to initiate a drag, allowing users to drag
 * files from the download page and have them appear as native file
 * drags.
 */
Download.prototype.drag_ = function() {
  chrome.send("drag", [this.id_.toString()]);
  return false;
}

/**
 * Tells the backend to open this file.
 */
Download.prototype.openFile_ = function() {
  chrome.send("openFile", [this.id_.toString()]);
  return false;
}

/**
 * Tells the backend that the user chose to save a dangerous file.
 */
Download.prototype.saveDangerous_ = function() {
  chrome.send("saveDangerous", [this.id_.toString()]);
  return false;
}

/**
 * Tells the backend that the user chose to discard a dangerous file.
 */
Download.prototype.discardDangerous_ = function() {
  chrome.send("discardDangerous", [this.id_.toString()]);
  downloads.remove(this.id_);
  return false;
}

/**
 * Tells the backend to show the file in explorer.
 */
Download.prototype.show_ = function() {
  chrome.send("show", [this.id_.toString()]);
  return false;
}

/**
 * Tells the backend to pause this download.
 */
Download.prototype.togglePause_ = function() {
  chrome.send("togglepause", [this.id_.toString()]);
  return false;
}

/**
 * Tells the backend to remove this download from history and download shelf.
 */
 Download.prototype.remove_ = function() {
  chrome.send("remove", [this.id_.toString()]);
  return false;
}

/**
 * Tells the backend to cancel this download.
 */
Download.prototype.cancel_ = function() {
  chrome.send("cancel", [this.id_.toString()]);
  return false;
}

///////////////////////////////////////////////////////////////////////////////
// Page:
var downloads, localStrings, resultsTimeout;

function load() {
  localStrings = new LocalStrings();
  downloads = new Downloads();
  $('term').focus();
  setSearch("");
}

function setSearch(searchText) {
  downloads.clear();
  downloads.setSearchText(searchText);
  chrome.send("getDownloads", [searchText.toString()]);
}

function clearAll() {
  downloads.clear();
  downloads.setSearchText('');
  chrome.send('clearAll', []);
  return false;
}

///////////////////////////////////////////////////////////////////////////////
// Chrome callbacks:
/**
 * Our history system calls this function with results from searches or when
 * downloads are added or removed.
 */
function downloadsList(results) {
  if (resultsTimeout)
    clearTimeout(resultsTimeout);
  window.console.log('results');
  downloads.clear();
  downloadUpdated(results);
  downloads.updateSummary();
}

/**
 * When a download is updated (progress, state change), this is called.
 */
function downloadUpdated(results) {
  // Sometimes this can get called too early.
  if (!downloads)
    return;

  var start = Date.now();
  for (var i = 0; i < results.length; i++) {
    downloads.updated(results[i]);
    // Do as much as we can in 50ms.
    if (Date.now() - start > 50) {
      clearTimeout(resultsTimeout);
      resultsTimeout = setTimeout(downloadUpdated, 5, results.slice(i + 1));
      break;
    }
  }
}

</script>
</head>
<body onload="load();" i18n-values=".style.fontFamily:fontfamily;.style.fontSize:fontsize">
<div class="header">
  <a href="" onclick="setSearch(''); return false;">
    <img src="data:image/png;base64,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"
         width="67" height="67" class="logo" border="0" /></a>
  <form method="post" action=""
      onsubmit="setSearch(this.term.value); return false;"
      class="form">
    <input type="text" name="term" id="term" />
    <input type="submit" name="submit" i18n-values="value:searchbutton" />
  </form>
</div>
<div class="main">
  <div id="downloads-summary">
    <span id="downloads-summary-text" i18n-content="downloads">Downloads</span>
    <a id="clear-all" href="" onclick="clearAll();" i18n-content="clear_all">Clear All</a>
  </div>
  <div id="downloads-display"></div>
</div>
<div class="footer">
</div>
</body>
</html>
/**
 * The following style rules affect Extension Infobars.
 */

body {
  background: -webkit-gradient(linear, left top, left bottom,
              from(#DAE7F9), to(#B5CBE8));
  font-family: Segoe UI, Tahoma;
  font-size: 11px;
  height: 36px; /* Infobars are limited to 36-72px */
  margin: 0px;
  overflow: hidden;
}
<!DOCTYPE HTML>
<html i18n-values="dir:textdirection;">
<head>
<meta charset="utf-8">
<title i18n-content="title"></title>
<style>
body {
  margin: 10px;
  min-width: 47em;
}

a {
  color: blue;
  font-size: 103%;
}

div#header {
  margin-bottom: 1.05em;
  /* 67px is the height of the header's background image. */
  min-height: 67px;
  overflow: hidden;
  padding-bottom: 20px;
  padding-left: 0;
  padding-top: 20px;
  position: relative;
  -webkit-box-sizing: border-box;
}

html[dir=rtl] #header {
  padding-right: 0;
}

#header h1 {
  background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEMAAABDCAYAAADHyrhzAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9kKHBANFBrIHoEAABhCSURBVHgBBcF90O75Xdj11+d3XffTedg9u2c3m91kNwlJgEAaCKUJLaJUoJVCBaoyI8U/GO04Op1x+kftaDuO9S+HcXQcZ9B26BQrtVJGkYLWoWBbKB2kUJ5LIQGSbJJ9fjxnzzn3ua/r+/b1GsBgTs5u7M+uPfb4dnLx+Gy785mZAQAAAECAAQQYgIAAQAAyZggDAEEAIACAAgBAGAAAmFoPR28dr+6/ePeNz1/C7uSa49U9g2F2jz7xvmvv+sDXfsUjT3zo+7aT82/dtv2zu22zbRsAAACAAAMIAKBAAQQgEBABQEBSsGQAgUIhjMBSgAgA07radts/u7r7yl9/580v/L1P/8qPv4lgsD36xPtvfOCr/s0/vbt49H/Y73aPnZ6eOj05bTvZZts222wAAGCwhjEGpAAIAkAAJAAQFBGIgIIkooCEwaK0aLJKoZhBCmStuVrLOiy78UP33vzcX/qNn/0bL8OcnF0/+cAf+tY//Mi7P/L/nJycPHp+ceb8/Nxuf9K22882Y4YxgmFmTIRBAwhhwwKaWECDIoKBJBpEFCTAlIwKQCUIkhRKUlSUIqupqc06LlfHK8fDsq7uf/8jJ/f+qztf/M139ufXbz9288kPfd9ut3v0/OLM+cW1zs7OZrffzbbbbLOZGTAwMABmKGBmJBYGUAIUBKAFSaAIWyyQgjCCSAatwEIypWjRRLSyipqKaL/sDrsO29W8evedb/uT/+on//752df/o/12cvHYnJx/2+npqfPzc2dnZ3NyemK329m2zbZtDAOoMcMMDBAGgIVZmCTWMCQkiAoDSEUoM2OkYMBay8yokKIYqUysaEMhazItQbTChpmGbb/7shuPXP+m7/62T/yT/ez257tt/57Tk9NO9iez3+/tdnvbttmGEQaDMcNMwCDaxkAJM2kD2LQtwCgUMIOICUZbagxam5FQ2DatkBAMQiMhgYgxQCQkzG6zn30z+73ZPvzk4zcf3cY2u22znWxmtze7zbaNGWaDjQbMxGDGzIYBg5Ax0BhjjME0GIYZzMZsxmAwmhE0DGImiQnZYiZjMAwZGYYGM0wYZiTLaAgNiaaZmdnYZs52u+3afmjbNtu2zcy0zcy2AdkwZpgBZpgZjCkzm7VlWzSYzawkwGjGZjkcc3V15XA4WGvZZuxPTpyc7AGjok2DtbQNMVusmE0FGCwTYYxEg0FszJEaUClmTKEBM7PbB9hmzJgZ2ICYLYwZGEEYDGJiZohprMkYkEwcDkePXN/7ki992ul+1HL58ODzL77p8y/fcXp2Ybfbmxk1xtKMCRBNSAMRDDJDATMkQgSAAaMSGgLsATSAAWaMjMGAJhqMmRRhbJJBwzQWJsjxePCed13zZ775Yz764afduH5uZrxz74FPf/ZFP/HTv+Kf//YXrdPrTk7PGKbRZFCIZgxAKBomGaQAAAYBaEYlEQXABgACDMBgGEBjZhgYY8wMMNhG0oyRJnD7kVN/7t/6On/04x907eLcceXqcHR2duqrPvIB//G/9y0+9qHb7r/zpnU8GAkTFdJEQ2PKzDCYgAJjACEMRhNQABRRwDaAwBjAAECBmUEGNRgmTTbAAAyMtY6++ZMf9KVf8rSrq6O1llaKtXJ5eeXxWzf94Y++z9l25eHVQ4zAyMhYxkgIFSDBEBoCI6NCRMFQGKEWhWwQwACMYDDDDAZhhBmaaDCWQTQGGXA4PPSJr3q/43EhoSiKEE73Yz9H6+ohZYyGMcbYjCZNQqUQAECKACQAqYQARYANCAggwAhgogEMMkYzpgEZTZpMQMej6xenVimShBAyOB6PjocrtSQgFACNMWBgABAgBhMKA4IAUIIBYAMAAACNEagBgxlCmGgQlZlRwwS2bfOpz7zoZL+TiKJYJQM+87kXvPTq2/YnZxgNYEYClcrMCBYBagjIIBAEhEoFFAuATQgAyBBmyZjGwATEhGioGMaoMVIDbCf+5//9n3j51ded7HcSIDNj5H/5kZ/wo//3z7l45Am7/SloQVbUOBYzKhUzZgYUDUmYUoNRS8hYCMWCgVRgA4AkY8SgUVmzJDUWGswYo5YZiqSWgiF2+53Pv/rAX/3vf9TDqwNGUpyfnvixn/xp/83/+L/Zzm575NYTZttbRcuKWliKSoYoVslQrNQQRaiMAR0XZTAzRIuFBPYQgEEENBmbiYaxHA6pbNtmt43ZNgyT1pihgGaMnf3ZNa/fueve/QeuXVxjZYa37tz16T/4guNceOTxd9ufXTPDioEwI9mGDMeDQxyPR9uM2QYkgjSpAUUrg4wlWSAoY8A+CCEEI5lGw2BwdVi+/P23WZdeeOk1z7/whsvDst/2bGO/2zODAet4dDwePHr91Pd+5yfdvHHd1dURy2o8evOG9z/3jG24e/eui7VZxjoeHY9Hx7Ucj1es5XhcjoeDZ556xK3r565dO/PiK++4/5Dd/hSDFDUUSIIZrWVWGBWlANgTAiTJotEwLcsY4/Ly0ld/2bt9+zd+1NXhaK0cj8u9Bw8w3r5z37GMFDevnzvZ712/dqbhcHUQtCF37z3wnd/2Tf7oJ77G5774mgcPl/Ozvf1u5/q1U7tt3Lh+boxr52f2J5saJuuYv/BX/7o37u9cu7k3dhZgYpVQKCGE1sIooAXsAcCkshozTGk2g0rrYL+xbZttyzbZ7zanpzcUj968UIhQmW0UUxaKWmYoKk/evuXJ27fUkkEKAQlDNAubNUe/9Ru/7snnPmoWJkIkDAWgMqUZUCGVBPYhSTJgLDXMRjEwakmgwhBZoDZTloXBWMfMUFTCRFLUIMmgABONBCq1MEgrr772ultPHz24OmKpVCqtVKBSGdRSCSOrCNjPIAIoldk2ZGYERdltAzKUAQiyhFERDQWBkCgAScEgAoiGiVKQ5I233rbtTjDWypQmlbXQslC0llZIpVKx8vDyynEdiD0EoWSwqYWhYVhruXZ+4vz0BGjJKCBRakAAK5BBFKihJIGsEKQoOGqNUGGE1rJtO2ZHNGOFIAIsBEkqtRRaVhGwD0CWVKylbYxkmRnHtdy8OHXt2olKQaBSNIMUwiQULCIkEJQgEhGUBY0mFhksNQozyODYMisLay3BQosilMpaIxkQgD1ARUnWjCnLMMxKi+PxaB2XABXRDJaJoECLBsWQiECggCYtSAAlKFBMNKkkrawSmqEIAkuSighmmagUIewVpSjEtJgxqJhR2e82u91OUYEGLQWERMNEBBGAiAQKBQoIAjIUEgS0IAqDVIioCAFBKQSQCuxJgKIoaszQMDgej27fesStRy4c11EFgghKEIlSFIRRCVAUAJUCQlBCoTCSCoRQQLGghFAUIQhRBIA9I1EmIMOkgLDbbV567S2vvXHHB559SgFJAWFkBQQRoCKSApQARQEVSKAwVCZOTk4crq6ISuXq6uB4PFjraGaz3+3MbCpZoABSFAD7QVFJIEyEQVFcPjx6eLUwoDg52dvtdgxXVweHq4MwojAqA6gYBksAKiGQoCQMomiQa9cuPHrzwuHqyu5s2Ta+4oO3nWy0ju7df+izL7zh7r2j09MzhlasJK0kSgH7QAqiVMIMNWpZ5c237rtz94FBcv36ud/99Ge9+NKrVnniicd98H3vdby6khGECEmwYhCVoASRFBCUQqNZajTje7/7T/nBH/mnnnrP3jd84kt935/5Ojevn5nZvPb6237q537Nj//0r3rn3pXzi2tCKBZmUQjYgyDFwlZgNepoHbNw7/Lg/uWV3W5z49q5f/zzv+SHf/Tv+/3nXzW7E1/y/vf4uo9/qX/3u/6E+5cPKZAkGhXSGmQFEUkBFWGoFEFUJv7t7/gWd+4fPfmup3zDH/kytx694erhlSy3bz/qu7/9611dXvo/f+bXHa72dvsTSQUSAbAXGSSIylqsUgswTk7P/eKv/YE7b71BBz/yYz/lhdcfevT2M07Orvntz97zq//iH7r16C3f9A0fdzhGCQUpIAElgAAiGpRAwiwaply/du4v/yff43B1cPf+pcvLK1B5+PDK6emJP/GNH/ebv/NZv/bp111/5LaCaIgkwB5IoVQOx6zjErahGYOz0zO/+jsv+qe/9Jsu791xen7TU88+4eT8ut3uxMXK1Y1bfuCHf8Yf+9qPODk9FRQTDZJoJAQKUgOS1oBEjDSINXE8eu2NtxUMAkFcXl55z9Pvcuvm3v133nLtxi3ZtDAxCU1gIyRZ5epwdDwcrSIqVmox4/T8upuPP+OJZz7s1hPPOr24aWavxsw4Pbvm/jrzMz//G8ZIihaVoqgURVFZiywriixJpViNtShaBIBKpUJC5fTs1HR0uLxnrQUMrRQVARuItZbj1cFxHa1SwCpJUZjN/uTc/uy67eQMO0klCRfXbviVf/FZs9FKUlQqRaWyUBFJC6JUWoRKohRKKzObFUmxoqiEVtY6Wh1VhAIEBGzheFwOhxyKAGVZBANI5epwdDweFWSgRSng1s0bWimSSlAqoaKEBKASNBQRFEMl3Lx5w4MH9z326E0n+72gKABv37nr8uHRbn8KKq2EQgHYr5Xj8crqTCWpjNFiNlYLm8PV0cXpeO+7Lrz06hvuvHN0en5hZseMieTeOw98x5/8WsfjQmo0iwhEBCWISoAKw1DRCAqstfzl//L7/cZvf8Z7n32vf/97v8NHP/Ih9+4/UBS3bt30//3ir/q9z7zg/OIRbJI1WBkJAHstayVhFC0aRlZM49jRtTP+7J/+Gp/8qver/Hc/+BP++b980dm1W/b7ExmXl1c+/Nxjnn7XYw7HRUkKUhRQABShAiJLARWDWOXzX3zBT/7UL7jx+HPe+v07/trf/gf+4n94w4c++Kyrq6Ntt/mXv/MpP/S//rjnX3rHzdvPMqM1xMiKgsAeiiQpZsjCEOH+g0uf/Mr3+8THnvPozWsqf+k/+k7/xff/Lb/8O593evGI4r3vuuGv/PnvdDikQSMpGAoRkEBBRAAww1oM1mhQHjy44uS6R24/Y3d2w/Mv3/Of/dd/2+2b491P3vDCi6/4zOdfcf9w6tqtp+xOzg2yDJooJMA+hFkIkTAWLLaN43E52Y/dtjkcj9ZaTk9O/JW/8D1+/3MveXB5dHq2975nbrt+7VwrSmEgBQmB1CCkgAoAS2jBYhGuX78wNmZv2/Y6ve7Ow/HGC3f97vNftI5HtttOb96w258zO0UDsQChwB5EUoEVm2WMZK2NsjqqpSgO6+j87MyXf/C9KowZKs1QDGtBCsa2se12Doej1REUpAAl1DBJNCom+/2Jw/FAR2sxs9mfXrfbn1vHgzWZxsymCEkrtTDEkgB7YCmUVWYta4ZZNAy73eaFl9/y8mtve/+zF5KCmDFIaoRaMrQUjG0b9x888Lnnv+jFl17xgfc/691PPWm32zkcjjK0kAyRxSJoMdTm1iM3Ha8urbKzZJjRtjMztjVsy1qpgDCMUalMCNhDqAQxA4gwYFwdjg6HI2hhIkIySEgNloJx/8F9P/x3fszf/Dv/lxu3nrI7PVc53Y7+gz/7bb7r2/+4B/cvNUODhWgYrCTTpkKurh5a66AwKFOKLBMiEKE0KSAB2IMolKRFYphBy27bvPbGO954656ZkVgEAauIBY4sbOPhw4d+8If+rh/+P/6hp5/7mNOLR2y7E0uuHj7wAz/8/zq2+a4/9Q0eXl6pNNQYaSXDGmuOGBlf/dEv9dqDh04uUmOiSKAIREmCBSEtEtiEIAtFolRaS2Xbb155447X37xrZhSrtLKkUiywtEZYx+X3/+Bz/qe/9ePe84GPuvboU06vP2p3dt3J6XUX1x93euMpv/m7L3n+Cy+b3WYZhbJiGWulYa0ByZO3H3U4HKy1DJJKUUmECKKyRBQgYDMAmRUlkEooxHFxeVjWWiohUQpipajUOK586g+e966nP2B/ccvsT7VGZZVwcnbhzXcO3rl3aaCjSkallhnWyshaGePpp267unqotSRFEwFKUhAglQUIAFuRiGKVSiVMVCo1rg5Hx+MCChSkaGilIQt5+ZXXnZxe2La9iVqUijgclusX587OTrSWQGoBRmVkAcJHvvxDHj68jxQVi0plRSVpUSmEUqkAbIpYSLR0XFZRjmWVosbhsByPR8WKtVJZi1YqQamIr/7YVzgcLh2vHlqllbWWFofDwW6O/tCXPePdT95yOC4aBVmLIlQGC4P3PfuMw9WV1mItWpIFhShKsaAotQAE2IAoRY2wDFGpkFWujjmWikKWVNbQStFCzDY+8uEP+Pqv/bDL+2+5unpoIePYstuW7/n2r/Ed3/JxZnMsS4oVM4tShNaihOvXr9PRWkulRqFlNYqkohAAjUJRYDOEVkISlIoiCrN5596ly8srg0oLJVFMoEllxenJ3n/657/XlzxzzTt33lQLefDgoU987Fnf+q991HFlrUURRNQIFcVsxti2zW63OdmxjgchgFAqApJKpahkSQA2oSirRUtraaXSSmWt7HY7v/eZF719574bN645Ozt1enZqv9/b73Z22w6DMGbb7LfNycmp05O9Dz33pHt33tTxqJXp6N23b7r92E3H4xHMDJjZ7PY7+9MT52enrl+cOzs/1zq6f/+e115/3SuvvOb05MRqWS2VSiUpKhWoJBWYBQDsQ9HEylqZyQwLY1TIfrfz2Rfe9FM/+ys+/NwTzs72TvY7N25cc3JyovLYrVugcjwevfnWHa+/8YZP//7n/eKv/I7zi3O11Cb53Bde8fkvvurmjWvWWo4ryt179zx48MBbb9311p277tx9x50797319tvuvPPAnTv3vfbWPbuzm2Z2RGtJRNCSFAqjwlIDKgD7KVAISIKFSQbMjLv3Dv7G3/05+/WOJx+/7ux058nbt1xcnFvHo+fe+zQIDx8+9MUXX/HZ51/wu7/3RTcee7ebj93GqOx2e7/0G5919eAdX/Ls4x4+vHQ4HK3Gm2+97c6dd7zw8mteevl1L736urv3Dk5PL5ycnjs5O3d6ds3Z9cdsu71WEoUoxWpoYSmsZGSZEAL2sKRSSSqCAQkwdienbj/5tMPhobeurqzLgy+88ba13tQ6+tlffl5lyczY7/b2J+fe9dxX2p2c2ba9DGW3bR5e7fzjX/oD/+Dnft3xcKlidrbd3rbb2+1O7E+e8PgzT3tit8Nmm02zYWQEUoAQgQBDS0hCAIB9hqJoWSszScYoGAYw2Pb2J3v7EyoNihIsEmjQAMYSLcXEttu7/sjjrt24pbWEmdEMDQARMgxTSGtkGdGoJKJCghKSimIGAOwBRKWVNYGGZAwxRoAwCILBABNGEGQtWIAUBcnGDLudCQKQiEQoa1CCUklIUQuI0FpIqCiQEBrYk0qSgIWNCpAAAaBoAsUYq0xZmKGFSTFDRUDFUFECIxFABEAWwSAJoyAAEwsVUgQBAIDB7DFKjWjVmMwiMZtkEIIAw1oAZLFYA6wFsYBWSEYCQhRBISsGkIiGjClKKFhAJGKJFlEEQgBKMTBjv5+Zy+qq1r6a1bLFMkBHjGBSMEihQQyVwVpjUAGRgEiSIARLRmVkYhkzEUumoYRiILIUAJWCiKBUYGaAmt1us9vvrmbmYn/5zltv4hfWOn7DOi7bbmk2JCOMCAMjC4QBy1oDSAtDBcRqmRkFCVCpgBIMookiAlECFEoQCSgVhpJlAqA0Y64OBzcuTu89fuvaG9u2Xds++MEPvPLqi1/8gXv3Lx3X0Vqr1iIQSZosWVKpTKxSKMpxxWStkEoSVkmgUgGAAJUlSlGxUikqlcpCJRGiYJBEMMwwY7Zmtnrt9Ts+/tHnnv/GT37Zp3bbrN2rLz+/fvKnfuFzq+2p19+8+/Hdtptt29m2CSNEIRRFEURRKgNlJFFWGSFKhSQKqZAKURSFEIUQQpTBWEwIjAwM24wZZlTNw4dXXn7lzfnKDz/9xl/8c//Gz3zdxz/0i7vd9nuz1tqV0//2r/29937qMy//5//s1z/7x9+8+/CZy4frxGwMQDIqlQEEAQ1QKAQqYYwkmVgBBCySYBCJACICBAUEASAAAOuY09MTjz968eDjX/ncK9/37/wrP/+v/7Gv+EcX5ye/XP3WrLUGZ9XNT33mpad+4Zc/9a0vv/b2H7n34Or97PYzMQQBAAIKYoBCAEAgAFAABCICAAABAQFAABDCAACodudn+8t3P/noa9/89V/52+977xO/vt/vfqv6XXprjscjzMyc4ZG1eiw9KY+bucAGAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAADNmjIfbzGv4HL6A+9u2+f8BQZBxVXgcMMUAAAAASUVORK5CYII=") 0px 20px no-repeat;
  display: inline;
  margin: 0;
  padding-bottom: 43px;
  padding-left: 75px;
  padding-top: 40px;
}

html[dir=rtl] #header h1 {
  background: url("data:image/png;base64,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DJJKUUmECKKyRBQgYDMAmRUlkEooxHFxeVjWWiohUQpipajUOK586g+e966nP2B/ccvsT7VGZZVwcnbhzXcO3rl3aaCjSkallhnWyshaGePpp267unqotSRFEwFKUhAglQUIAFuRiGKVSiVMVCo1rg5Hx+MCChSkaGilIQt5+ZXXnZxe2La9iVqUijgclusX587OTrSWQGoBRmVkAcJHvvxDHj68jxQVi0plRSVpUSmEUqkAbIpYSLR0XFZRjmWVosbhsByPR8WKtVJZi1YqQamIr/7YVzgcLh2vHlqllbWWFofDwW6O/tCXPePdT95yOC4aBVmLIlQGC4P3PfuMw9WV1mItWpIFhShKsaAotQAE2IAoRY2wDFGpkFWujjmWikKWVNbQStFCzDY+8uEP+Pqv/bDL+2+5unpoIePYstuW7/n2r/Ed3/JxZnMsS4oVM4tShNaihOvXr9PRWkulRqFlNYqkohAAjUJRYDOEVkISlIoiCrN5596ly8srg0oLJVFMoEllxenJ3n/657/XlzxzzTt33lQLefDgoU987Fnf+q991HFlrUURRNQIFcVsxti2zW63OdmxjgchgFAqApJKpahkSQA2oSirRUtraaXSSmWt7HY7v/eZF719574bN645Ozt1enZqv9/b73Z22w6DMGbb7LfNycmp05O9Dz33pHt33tTxqJXp6N23b7r92E3H4xHMDJjZ7PY7+9MT52enrl+cOzs/1zq6f/+e115/3SuvvOb05MRqWS2VSiUpKhWoJBWYBQDsQ9HEylqZyQwLY1TIfrfz2Rfe9FM/+ys+/NwTzs72TvY7N25cc3JyovLYrVugcjwevfnWHa+/8YZP//7n/eKv/I7zi3O11Cb53Bde8fkvvurmjWvWWo4ryt179zx48MBbb9311p277tx9x50797319tvuvPPAnTv3vfbWPbuzm2Z2RGtJRNCSFAqjwlIDKgD7KVAISIKFSQbMjLv3Dv7G3/05+/WOJx+/7ux058nbt1xcnFvHo+fe+zQIDx8+9MUXX/HZ51/wu7/3RTcee7ebj93GqOx2e7/0G5919eAdX/Ls4x4+vHQ4HK3Gm2+97c6dd7zw8mteevl1L736urv3Dk5PL5ycnjs5O3d6ds3Z9cdsu71WEoUoxWpoYSmsZGSZEAL2sKRSSSqCAQkwdienbj/5tMPhobeurqzLgy+88ba13tQ6+tlffl5lyczY7/b2J+fe9dxX2p2c2ba9DGW3bR5e7fzjX/oD/+Dnft3xcKlidrbd3rbb2+1O7E+e8PgzT3tit8Nmm02zYWQEUoAQgQBDS0hCAIB9hqJoWSszScYoGAYw2Pb2J3v7EyoNihIsEmjQAMYSLcXEttu7/sjjrt24pbWEmdEMDQARMgxTSGtkGdGoJKJCghKSimIGAOwBRKWVNYGGZAwxRoAwCILBABNGEGQtWIAUBcnGDLudCQKQiEQoa1CCUklIUQuI0FpIqCiQEBrYk0qSgIWNCpAAAaBoAsUYq0xZmKGFSTFDRUDFUFECIxFABEAWwSAJoyAAEwsVUgQBAIDB7DFKjWjVmMwiMZtkEIIAw1oAZLFYA6wFsYBWSEYCQhRBISsGkIiGjClKKFhAJGKJFlEEQgBKMTBjv5+Zy+qq1r6a1bLFMkBHjGBSMEihQQyVwVpjUAGRgEiSIARLRmVkYhkzEUumoYRiILIUAJWCiKBUYGaAmt1us9vvrmbmYn/5zltv4hfWOn7DOi7bbmk2JCOMCAMjC4QBy1oDSAtDBcRqmRkFCVCpgBIMookiAlECFEoQCSgVhpJlAqA0Y64OBzcuTu89fuvaG9u2Xds++MEPvPLqi1/8gXv3Lx3X0Vqr1iIQSZosWVKpTKxSKMpxxWStkEoSVkmgUgGAAJUlSlGxUikqlcpCJRGiYJBEMMwwY7Zmtnrt9Ts+/tHnnv/GT37Zp3bbrN2rLz+/fvKnfuFzq+2p19+8+/Hdtptt29m2CSNEIRRFEURRKgNlJFFWGSFKhSQKqZAKURSFEIUQQpTBWEwIjAwM24wZZlTNw4dXXn7lzfnKDz/9xl/8c//Gz3zdxz/0i7vd9nuz1tqV0//2r/29937qMy//5//s1z/7x9+8+/CZy4frxGwMQDIqlQEEAQ1QKAQqYYwkmVgBBCySYBCJACICBAUEASAAAOuY09MTjz968eDjX/ncK9/37/wrP/+v/7Gv+EcX5ye/XP3WrLUGZ9XNT33mpad+4Zc/9a0vv/b2H7n34Or97PYzMQQBAAIKYoBCAEAgAFAABCICAAABAQFAABDCAACodudn+8t3P/noa9/89V/52+977xO/vt/vfqv6XXprjscjzMyc4ZG1eiw9KY+bucAGAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAADNmjIfbzGv4HL6A+9u2+f8BQZBxVXgcMMUAAAAASUVORK5CYII=") right no-repeat;
  padding-right: 95px;
  padding-left: 0;
}

h1 {
  font-size: 156%;
  font-weight: bold;
  padding: 0;
  margin: 0;
}

div.content {
  font-size: 88%;
  margin-top: 5px;
}

.section-header {
  background: #ebeff9;
  border-top: 1px solid #b5c7de;
  font-size: 99%;
  padding-bottom: 2px;
  padding-left: 5px;
  padding-top: 3px;
  width: 100%;
}

html[dir=rtl] .section-header {
  padding-right: 5px;
  padding-left: 0;
}

.section-header-title {
  font-weight: bold;
}

.vbox-container {
  display: -webkit-box;
  -webkit-box-orient: vertical;
}

.wbox {
  display: -webkit-box;
  -webkit-box-align: stretch;
  -webkit-box-flex: 1;
}

.showInDevMode {
  overflow: hidden;
}

body.hideDevModeInitial .showInDevMode {
  height: 0 !important;
  opacity: 0;
}

body.hideDevMode .showInDevMode {
  height: 0 !important;
  opacity: 0;
  -webkit-transition: all .1s ease-out;
}

body.showDevModeInitial .showInDevMode {
  opacity: 1;
}

body.showDevMode .showInDevMode {
  opacity: 1;
  -webkit-transition: all .1s ease-in;
}

.wbox-dev-mode {
  -webkit-box-align: stretch;
  -webkit-box-flex: 1;
}

.developer-mode-image {
  margin-top: 2px;
}

.developer-mode-link {
  margin-right: 3px;
  white-space: nowrap;
}

.developer-mode-link a {
  font-size: 97%;
}

.developer-mode {
  background: #f4f6fc;
  border-bottom: 1px solid #edeff5;
  font-size: 89%;
  padding-bottom: 0.8em;
  padding-left: 10px;
  padding-top: 0.8em;
  width: 100%;
}
html[dir=rtl] .developer-mode {
  padding-right: 10px;
  padding-left: 0;
}

.extension_disabled td {
  background-color: #f0f0f0;
  color: #a0a0a0;
  padding-bottom: 4px;
  padding-top: 5px;
}

.extension_enabled td {
  padding-bottom: 4px;
  padding-top: 5px;
}

.extension {
  border-bottom: 1px solid #cdcdcd;
}

.extension-name {
  font-weight: bold;
}

.no-extensions {
  margin: 6em 0 0;
  text-align: center;
  font-size: 1.2em;
}

#try-gallery {
  margin-top: 1em;
  font-weight: normal;
}

#get-moar-extensions {
  margin-top: 1em;
  text-align: right;
  font-weight: bold;
}

html[dir=rtl] #get-moar-extensions {
   text-align: left;
}

.extension-description {
  margin-top: 0.4em;
}

.extension-details {
  margin-top: 0.5em;
}

.extension-actions {
}

.extension-actions-div {
  margin-top: 0.4em;
}

.extension-actions input {
  margin: 0 3px 0 10px;
  vertical-align: text-bottom;
}

.extension-views {
  margin: 0 0 0;
  margin-left: 2ex;
  padding: 0;
  list-style-type: none;
}

html[dir=rtl] .extension-views {
  margin: 0 2ex 0 0;
}

button {
  font-size: 104%;
}

#dialogBackground, #dialogBackground div {
  display: -webkit-box;
  -webkit-box-align: center;
}

#dialog input[type=button] {
  font-size: 12px;
  height: 25px;
  width: 100px;
}

#dialog input[type=text] {
  font-size: 12px;
  font-family: Helvetica, Arial, sans-serif;
  width: 220px;
}

#dialogBackground {
  background-color: rgba(0, 0, 0, .2);
  display: none;
  height: 100%;
  left: 0;
  position: fixed;
  top: 0;
  width: 100%;
  z-index: 1;
  -webkit-box-orient: vertical;
  -webkit-user-select: none;
}

html[dir=rtl] #dialogBackground {
  right: 0;
  left: auto;
}

#dialogHBackground {
  height: 100%;
  -webkit-box-orient: horizontal;
}


#dialog {
  background-color: #5296DE;
  border: 1px solid #3A75BD;
  border-radius: 6px 6px;
  font-size: 12px;
  width: 500px;
  -webkit-box-orient: vertical;
}

html[dir=rtl] #dialog {
  font-size: 13px;
}

#dialogHeader {
  background-color: rgba(0,0,0,0);
  color: white;
  margin: 4px;
  width: 100%;
}

html[dir=rtl] #dialogHeader {
  margin-left: -20px;
}

#dialogBody {
  background-color: rgb(240, 240, 240);
  border: 1px solid #3A75BD;
  border-bottom-left-radius: 4px 4px;
  border-bottom-right-radius: 4px 4px;
  margin: 0px 2px 2px 2px;
  -webkit-box-orient: vertical;
}

#dialogContentHeader {
  margin: 16px;
}

.dialogBrowseRow {
  margin-left: -24px;
  width: 100%;
  -webkit-box-orient: horizontal;
  -webkit-box-pack: end;
}

html[dir=rtl] .dialogBrowseRow {
  margin-right: -24px;
  /* margin-left: 0px; */
}

.dialogBrowseRow>* {
  margin: 2px
}

#dialogContentFooter {
  margin-bottom: 6px;
  margin-left: -12px;
  margin-top: 20px;
}

html[dir=rtl] #dialogContentFooter {
  margin-right: -12px;
  margin-left: 0px;
}

.inspectPopupNote {
  color: grey;
}

.incognitoWarning {
  margin: 0.75em 0;
  display: none;
  opacity: 0;
  -webkit-transition: opacity .2s ease-out;
}

.incognitoWarning .yellow {
  background:#fff299;
  padding:2px 5px;
  border-radius:3px;
}
</style>
<script>
/**
 * This variable structure is here to document the structure that the template
 * expects to correctly populate the page.
 */
var extensionDataFormat = {
  'developerMode': false,
  'extensions': [
    {
      'id': '0000000000000000000000000000000000000000',
      'name': 'Google Chrome',
      'description': 'Extension long format description',
      'version': '1.0.231',
      'enabled': 'true',
      'enabledIncognito': 'false',
      'wantsFileAccess': 'false',
      'allowFileAccess': 'false',
      'allow_reload': true,
      'is_hosted_app': false,
      'order': 1,
      'options_url': 'options.html',
      'icon': 'relative-path-to-icon.png',
      'content_scripts': [
        {
          'js': ['script1_file1.js', 'script1_file2.js'],
          'css': ['script1_file1.css', 'script1_file2.css'],
          'matches': ['http://*/*', 'http://other.com/*']
        },
        {
          'js': ['script2_file1.js', 'script2_file2.js'],
          'css': ['script2_file1.css', 'script2_file2.css'],
          'matches': ['http://*/*', 'http://other.com/*']
        }
      ],
      // TODO(aa): It would be nice to also render what type of view each one
      // is, like 'toolstrip', 'background', etc. Eventually, if we can also
      // debug and inspect content scripts, maybe we don't need to list the
      // components, just the views.
      'views': [
        {
          'path': 'toolstrip.html',
          'renderViewId': 1,
          'renderProcessId': 1,
          'incognito': false
        },
        {
          'path': 'background.html',
          'renderViewId': 2,
          'renderProcessId': 1,
          'incognito': false
        }
      ]
    },
    {
      'id': '0000000000000000000000000000000000000001',
      'name': 'RSS Subscriber',
      'description': 'Extension long format description',
      'version': '1.0.231',
      'enabled': 'true',
      'enabledIncognito': 'false',
      'wantsFileAccess': 'false',
      'allowFileAccess': 'false',
      'allow_reload': false,
      'is_hosted_app': false,
      'order': 2,
      'icon': '',
      'content_scripts': [
        {
          'js': ['script1_file1.js', 'script1_file2.js'],
          'css': ['script1_file1.css', 'script1_file2.css'],
          'matches': ['http://*/*', 'http://other.com/*']
        },
        {
          'js': ['script2_file1.js', 'script2_file2.js'],
          'css': ['script2_file1.css', 'script2_file2.css'],
          'matches': ['http://*/*', 'http://other.com/*']
        }
      ],
      'views': [
        {
          'path': 'foo/bar/toolstrip.html',
          'renderViewId': 3,
          'renderProcessId': 1,
          'incognito': false
        }
      ],
      "hasPopupAction": false
    }
  ]
};

// Keeps track of whether the developer mode subsection has been made visible
// (expanded) or not.
var devModeExpanded = false;

/**
 * Toggles the devModeExpanded, and notifies the c++ dom_ui to toggle the
 * extensions.ui.developer_mode which saved in the preferences.
 */
function toggleDevModeExpanded() {
  devModeExpanded = !devModeExpanded;
  chrome.send('toggleDeveloperMode', []);
}

/**
 * Takes the |extensionsData| input argument which represents data about the
 * currently installed/running extensions and populates the html jstemplate with
 * that data. It expects an object structure like the above.
 * @param {Object} extensionsData Detailed info about installed extensions
 */
function renderTemplate(extensionsData) {
  // Sort by order specified in the data or (if equal) then sort by
  // extension name (case-insensitive).
  extensionsData.extensions.sort(function(a, b) {
    if (a.order == b.order) {
      a = a.name.toLowerCase();
      b = b.name.toLowerCase();
      return a < b ? -1 : (a > b ? 1 : 0);
    } else {
      return a.order < b.order ? -1 : 1;
    }
  });

  // This is the javascript code that processes the template:
  var input = new JsEvalContext(extensionsData);
  var output = document.getElementById('extensionTemplate');
  jstProcess(input, output);
}

/**
 * Asks the C++ ExtensionDOMHandler to get details about the installed
 * extensions and return detailed data about the configuration. The
 * ExtensionDOMHandler should reply to returnExtensionsData() (below).
 */
function requestExtensionsData() {
  chrome.send('requestExtensionsData', []);
}

// Used for observing function of the backend datasource for this page by
// tests.
var domui_responded_ = false;

// Used to only do some work the first time we render.
var rendered_once_ = false;

/**
 * Called by the dom_ui_ to re-populate the page with data representing
 * the current state of installed extensions.
 */
function returnExtensionsData(extensionsData){
  domui_responded_ = true;
  devModeExpanded = extensionsData.developerMode;

  var bodyContainer = document.getElementById('body-container');
  var body = document.body;

  // Set all page content to be visible so we can measure heights.
  bodyContainer.style.visibility = 'hidden';
  body.className = '';
  var slidables = document.getElementsByClassName('showInDevMode');
  for (var i = 0; i < slidables.length; i++)
    slidables[i].style.height = 'auto';

  renderTemplate(extensionsData);

  // Explicitly set the height for each element that wants to be 'slid' in and
  // out when the devModeExpanded is toggled.
  var slidables = document.getElementsByClassName('showInDevMode');
  for (var i = 0; i < slidables.length; i++)
    slidables[i].style.height = slidables[i].offsetHeight + 'px';

  // Hide all the incognito warnings that are attached to the wrong extension
  // ID, which can happen when an extension is added or removed.
  var warnings = document.getElementsByClassName('incognitoWarning');
  for (var i = 0; i < warnings.length; i++) {
    var extension = warnings[i];
    while (extension.className != "extension")
      extension = extension.parentNode;

    if (extension.extensionId != warnings[i].attachedExtensionId) {
      warnings[i].style.display = "none";
      warnings[i].style.opacity = "0";
    }
  }

  // Reset visibility of page based on the current dev mode.
  document.getElementById('collapse').style.display =
     devModeExpanded ? 'inline' : 'none';
  document.getElementById('expand').style.display =
     devModeExpanded ? 'none' : 'inline';
  bodyContainer.style.visibility = 'visible';
  body.className = devModeExpanded ?
     'showDevModeInitial' : 'hideDevModeInitial';

  if (rendered_once_)
    return;

  // Blech, JSTemplate always inserts the strings as text, which is usually a
  // feature, but in this case it contains HTML that we want to be rendered.
  var elm = document.getElementById('try-gallery');
  if (elm)
    elm.innerHTML = elm.textContent;

  elm = document.getElementById('get-moar-extensions');
  if (elm)
    elm.innerHTML = elm.textContent;

  rendered_once_ = true;
}

/**
 * Tell the C++ ExtensionDOMHandler to inspect the page detailed in |viewData|.
 */
function sendInspectMessage(viewData) {
  // TODO(aa): This is ghetto, but DOMUIBindings doesn't support sending
  // anything other than arrays of strings, and this is all going to get
  // replaced with V8 extensions soon anyway.
  chrome.send('inspect', [
    String(viewData.renderProcessId), String(viewData.renderViewId)
  ]);
}

/**
 * Handles a 'reload' button getting clicked.
 */
function handleReloadExtension(node) {
  // Tell the C++ ExtensionDOMHandler to reload the extension.
  chrome.send('reload', [node.extensionId]);
}

/**
 * Handles a 'enable' or 'disable' button getting clicked.
 */
function handleEnableExtension(node, enable) {
  // Tell the C++ ExtensionDOMHandler to reload the extension.
  chrome.send('enable', [node.extensionId, String(enable)]);
  requestExtensionsData();
}

/**
 * Handles the 'enableIncognito' checkbox getting changed.
 */
function handleToggleExtensionIncognito(node) {
  var warning = node;

  while (warning.className != "extension")
    warning = warning.parentNode;

  warning = warning.getElementsByClassName("incognitoWarning")[0];
  if (!node.checked) {
    warning.style.display = "none";
    warning.style.opacity = "0";
  } else {
    warning.attachedExtensionId = node.extensionId;
    warning.style.display = "block";

    // Must set the opacity later. Otherwise, the fact that the display is
    // changing causes the animation to not happen.
    window.setTimeout(function() {
      warning.style.opacity = "1";
    }, 0);
  }

  chrome.send('enableIncognito', [node.extensionId, String(node.checked)]);
}

/**
 * Handles the 'allowFileAccess' checkbox getting changed.
 */
function handleToggleAllowFileAccess(node) {
  chrome.send('allowFileAccess', [node.extensionId, String(node.checked)]);
}

/**
 * Handles an 'uninstall' button getting clicked.
 */
function handleUninstallExtension(node) {
  chrome.send('uninstall', [node.extensionId]);
}

/**
 * Handles an 'options' button getting clicked.
 */
function handleOptions(node) {
  chrome.send('options', [node.extensionId]);
}

/**
* Utility function which asks the C++ to show a platform-specific file select
* dialog, and fire |callback| with the |filePath| that resulted. |selectType|
* can be either 'file' or 'folder'. |operation| can be 'load', 'packRoot',
* or 'pem' which are signals to the C++ to do some operation-specific
* configuration.
*/
function showFileDialog(selectType, operation, callback) {
  handleFilePathSelected = function(filePath) {
    callback(filePath);
    handleFilePathSelected = function() {};
  };

  chrome.send('selectFilePath', [selectType, operation]);
}

/**
 * Handles the "Load extension..." button being pressed.
 */
function loadExtension() {
  showFileDialog('folder', 'load', function(filePath) {
    chrome.send('load', [String(filePath)]);
  });
}

/**
 * Handles the "Pack extension..." button being pressed.
 */
function packExtension() {
  var extensionPath = document.getElementById('extensionPathText').value;
  var privateKeyPath = document.getElementById('privateKeyPath').value;
  chrome.send('pack', [extensionPath, privateKeyPath]);
}

/**
 * Shows to modal HTML pack dialog.
 */
function showPackDialog() {
  document.getElementById('dialogBackground').style.display = '-webkit-box';
}

/**
 * Hides the pack dialog.
 */
function hidePackDialog() {
  document.getElementById('dialogBackground').style.display = 'none'
}

/*
 * Toggles visibility of the developer mode.
 */
function toggleDeveloperMode() {
  toggleDevModeExpanded();

  document.getElementById('collapse').style.display =
      devModeExpanded ? 'inline' : 'none';
  document.getElementById('expand').style.display =
      devModeExpanded ? 'none' : 'inline';

  document.body.className =
      devModeExpanded ? 'showDevMode' : 'hideDevMode';
}

/**
 * Pop up a select dialog to capture the extension path.
 */
function selectExtensionPath() {
  showFileDialog('folder', 'packRoot', function(filePath) {
    document.getElementById('extensionPathText').value = filePath;
  });
}

/**
 * Pop up a select dialog to capture the private key path.
 */
function selectPrivateKeyPath() {
  showFileDialog('file', 'pem', function(filePath) {
    document.getElementById('privateKeyPath').value = filePath;
  });
}

/**
 * Handles the "Update extensions now" button being pressed.
 */
function autoUpdate() {
  chrome.send('autoupdate', []);
}

document.addEventListener('DOMContentLoaded', requestExtensionsData);

</script>
</head>
<body i18n-values=".style.fontFamily:fontfamily;.style.fontSize:fontsize">
  <div id="dialogBackground">
    <div id="dialogHBackground">
      <div id="dialog">
        <div id="dialogHeader" i18n-content="packDialogTitle">
          PACK EXTENSION
        </div>
        <div id="dialogBody">
          <div id="dialogContentHeader" i18n-content="packDialogHeading">
            HEADING
          </div>
          <div class="dialogBrowseRow">
            <div i18n-content="rootDirectoryLabel">
              ROOT_DIR
            </div>
            <div>
              <input type="text" id="extensionPathText">
            </div>
            <div>
              <input type="button" value="BROWSE"
                     i18n-values="value:packDialogBrowse"
                     onclick="selectExtensionPath();">
            </div>
          </div>
          <div class="dialogBrowseRow">
            <div i18n-content="privateKeyLabel">
              PRIVATE_KEY
            </div>
            <div>
              <input type="text" id="privateKeyPath">
            </div>
            <div>
              <input type="button" value="BROWSE"
                     i18n-values="value:packDialogBrowse"
                     onclick="selectPrivateKeyPath();">
            </div>
          </div>
          <div class="dialogBrowseRow" id="dialogContentFooter">
            <div>
              <input type="button" value="OK"
                  i18n-values="value:okButton" onclick="packExtension();">
            </div>
            <div>
              <input type="button" value="CANCEL"
                  i18n-values="value:cancelButton" onclick="hidePackDialog();">
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>

  <div id="body-container" style="visibility:hidden">

    <div id="header"><h1 i18n-content="title">TITLE</h1></div>

    <div id="extensionTemplate">

      <div id="container" class="vbox-container">
      <div id="top" class="wbox" style="padding-right: 5px">

        <div class="section-header">
          <table cellpadding="0" cellspacing="0" width="100%">
          <tr valign="center">
            <td>
              <span class="section-header-title" i18n-content="title"
                >TITLE</span>
              <span class="section-header-title"
                    jsdisplay="extensions.length > 0">(<span
                    jscontent="extensions.length"></span>)</span>
            </td>
            <td width="18" padding="">
              <img id="collapse" class="developer-mode-image"
                   style="display:none" onclick="toggleDeveloperMode();"
                   src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9kKEBUKJtFDpJUAAADSSURBVBjTjZExTgJhEIXfjFtA4QGMHY1RD0FnYWVI8AhLwQ28gTfAUNuQYKwstuMEJiYSY8EFKBYKCH/2n3kUC4Ri2fC18715mYzM8/D5Nc0mM1Tx0G49Pd4lpTF661RKz72P3/85uumYtXTTsaIWdweQ1BhmFmPcSZtQNBs/ld5ieQNAAUSzU8vKUQKgKCxf3qqqu6vqocvMYrGvCyEcpwVC0N3NzJ07abXeWIwkRYQkAJIESaooABm+f2eT2Uv/PpqVBx+4UH0d/F1fXco5b9kCrJSRhFACKVsAAAAASUVORK5CYII=">
              <img id="expand" class="developer-mode-image"
                   onclick="toggleDeveloperMode();" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9kKEBUKMVKQIVIAAADiSURBVBjTjZGxagJREEXvm2yRFJI62KUJ0Y+ws0gVBP0ELfyD/EH+IMHaRjBYWdjZGwKCQSz8AQt3I1l87LtvLN4qWxjJrS5zD3MZxmy2djT+nkzXOKd67f75qRIFYvDeOAu1Oh+L1QbN9lALAmbArDhptoeCi/LeA4guECSdczm0t9nN9bwYG/MZTJw8ABAAjvxrWYgiAFnGbfIoIgBuSwsAya5KkqTLjnXW2rwFJpg0Tb33JL3XHPpN93ROVU8tcfyjUFUVIwBMr/81ma5fulVHhoNPuhJ5fVuW70rmP285AJVgi6pOot+gAAAAAElFTkSuQmCC">
            </td>
            <td width="50" align="right">
              <div class="developer-mode-link">
                <a onclick="toggleDeveloperMode();" style="cursor: default"
                   i18n-content="devModeLink">DEVMODE</a>
              </div>
            </td>
          </tr>
          </table>
        </div>

      </div>
      <div id="developer_tools" class="wbox-dev-mode showInDevMode">
        <div class="developer-mode">
          <span i18n-content="devModePrefix">DEVELOPER_MODE:</span>
          <button onclick="loadExtension()"
                  i18n-content="loadUnpackedButton">LOAD</button>
          <button onclick="showPackDialog()"
                  i18n-content="packButton">PACK</button>
          <button onclick="autoUpdate()"
                  i18n-content="updateButton">UPDATE</button>
        </div>
      </div>
      </div>

      <div class="content">
        <div class="extension-name no-extensions" jsdisplay="extensions.length === 0">
          <div i18n-content="noExtensions">NO_EXTENSIONS_ARE_INSTALLED</div>
          <div i18n-content="suggestGallery" id="try-gallery">TRY_GALLERY</div>
        </div>

        <div jsdisplay="extensions.length > 0">
        <div class="extension" jsselect="extensions" jsvalues=".extensionId:id">
          <table width="100%" cellpadding="2" cellspacing="0">
          <tr jsvalues=".className:enabled ? 'extension_enabled' : 'extension_disabled'">
          <td width="62" height="50" align="center" valign="top">
            <span jsdisplay="icon"><img jsvalues=".src:icon" width="48"
                height="48">
          </td>
          <td valign="top">
            <div>
              <a jsdisplay="galleryUrl.length > 0"
                 jsvalues=".href:galleryUrl">
              <span class="extension-name"
                    jscontent="name">EXTENSION NAME</span></a>
              <span class="extension-name"
                    jsdisplay="galleryUrl.length == 0"
                    jscontent="name">EXTENSION NAME</span>
              - <span i18n-content="extensionVersion">VERSION</span>
              <span jscontent="version">x.x.x.x</span>
              <span jsdisplay="!enabled"
                    i18n-content="extensionDisabled">(DISABLED)</span>
              <span jsdisplay="order == 1"
                    i18n-content="inDevelopment">(IN DEVELOPMENT)</span>
            </div>

            <div class="extension-description" jscontent="description"></div>
            <div class="showInDevMode">
              <div class="extension-details">
                <span i18n-content="extensionId">ID_LABEL: </span>
                <span jscontent="id"></span>
              </div>
              <div class="extension-details">
                <span jsdisplay="views.length > 0 || hasPopupAction" i18n-content="inspectViews">
                  INSPECT ACTIVE VIEWS:
                </span>
                <ul class="extension-views">
                  <li jsselect="views">
                    <span jsvalues=".extensionView:$this">
                      <a jsvalues=".extensionView:$this" href="#"
                         onclick="sendInspectMessage(this.extensionView); return false;">
                        <span jscontent="path"></span></a>
                      <span jsdisplay="incognito"
                            i18n-content="viewIncognito">(INCOGNITO)</span>
                    </span>
                  </li>
                  <li i18n-content="inspectPopupsInstructions"
                      class="inspectPopupNote" jsdisplay="hasPopupAction">
                    INSPECT POPUP INSRUCTIONS
                  </li>
                </ul>
              </div>
            </div>
            <div class="extension-actions-div">
              <span class="extension-actions">
                <a
                  jsvalues=".extensionId:id"
                  jsdisplay="enabled && allow_reload"
                  onclick="handleReloadExtension(this)"
                  href="javascript:void 0;"
                  i18n-content="reload"
                  >RELOAD</a>
                <span jsdisplay="enabled && allow_reload">-</span>
                <a
                  jsvalues=".extensionId:id"
                  jsdisplay="enabled"
                  onclick="handleEnableExtension(this, false)"
                  href="javascript:void 0;"
                  i18n-content="disable"
                  >DISABLE</a>
                <a
                  jsvalues=".extensionId:id"
                  jsdisplay="!enabled"
                  onclick="handleEnableExtension(this, true)"
                  href="javascript:void 0;"
                  i18n-content="enable"
                  >ENABLE</a> -
                <a
                  jsvalues=".extensionId:id"
                  onclick="handleUninstallExtension(this)"
                  href="javascript:void 0;"
                  i18n-content="uninstall"
                  >UNINSTALL</a>
                <span jsdisplay="options_url && enabled">-</span>
                <a
                  jsdisplay="options_url && enabled"
                  jsvalues=".extensionId:id"
                  onclick="handleOptions(this)"
                  href="javascript:void 0;"
                  i18n-content="options"
                  >OPTIONS</a>
                <label jsdisplay="enabled && !is_hosted_app">
                <input type="checkbox"
                  jsvalues=".extensionId:id;.enabled:enabled"
                  jsdisplay="enabled"
                  jseval="this.checked = enabledIncognito"
                  onchange="handleToggleExtensionIncognito(this)">
                <span i18n-content="enableIncognito">ALLOW THIS EXTENSION TO RUN IN INCOGNITO</span></label>
                <label
                  jsdisplay="enabled && wantsFileAccess">
                <input type="checkbox"
                  jsvalues=".extensionId:id;.enabled:enabled;.wantsFileAccess:wantsFileAccess"
                  jsdisplay="enabled && wantsFileAccess"
                  jseval="this.checked = allowFileAccess"
                  onchange="handleToggleAllowFileAccess(this)">
                <span i18n-content="allowFileAccess">ALLOW THIS EXTENSION ACCESS TO FILE URLS</span></label>
              </span>
            </div>
            <div class="incognitoWarning">
              <span class="yellow" i18n-values=".innerHTML:incognitoWarning">WARNING - CHROME CANNOT PREVENT THIS EXTENSION FROM RECORDING YOUR BROWSING HISTORY</span>
            </div>
          </td>
          </tr>
          </table>
        </div>
        </div>

        <div id="get-moar-extensions" jsdisplay="extensions.length > 0"
            i18n-content="getMoreExtensions"></div>
      </div>
    </div>
  </div>
  </body>
</html>
<html i18n-values="dir:textdirection;">
<head>
<style type="text/css">
  body,td,div,p,a,font,span {font-family: arial,sans-serif;}
  body {
    background-color:#ffffff;
    -webkit-user-select: none;
  }
  A:link {color:#0000cc; }
  A:visited { color:#551a8b; }
  A:active { color:#ff0000; }
  .form-noindent {background-color: #ffffff; border: #C3D9FF 1px solid}
  .body { margin-left: 3em;
    margin-right: 5em;
    font-family: arial,sans-serif; }
  .endaligned {
    text-align: right;
  }
  html[dir='rtl'] .endaligned {
    text-align: left;
  }
  #gaia_account_text { font-weight: bold; }
  #email_readonly { font-size: 10pt;
                    font-weight: bold;
                    display: none; }
  div.errorbox-good {}
  div.errorbox-bad {}
  div.errormsg { color: red; font-size: smaller;
    font-family: arial,sans-serif;
    display: none;}
  font.errormsg { color: red; font-size: smaller;
    font-family: arial,sans-serif;}
  div.errormsgspacer { min-height: 1em;}
  font.errormsgspacer { font-size: smaller;
    font-family: arial,sans-serif;}

  hr {
    border: 0;
    background-color:#DDDDDD;
    height: 1px;
    width: 100%;
    text-align: left;
    margin: 5px;
  }
  #gaia_loginform {
    margin-bottom: 0;
  }

  #captcha_wrapper {
    background-size: 200px 70px;
    background: no-repeat;
    background-position: center;
    background-color: #e8eefa;
    display: block;
  }
  .captcha_image {
    display: block;
    width: 200px;
    height: 70px;
  }
  #throb {
    background-image: url("data:image/png;base64,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");
    width: 16px;
    height: 16px;
    background-position: 0px;
    margin: 0px 10px 0px 10px;
  }
  .toppageverticalspace {
    height: 15px;
  }
  .bottompaddedcell {
    padding-bottom: 3px;
  }
  .noverticalpadding {
    padding-top: 0;
    padding-bottom: 0;
  }
  .cancelspacenocaptcha {
    height: 22px;
  }
  .cancelspaceforcaptcha {
    height: 5px;
  }
  #top_blurb {
    font-size: 11pt;
    line-height: 1.5em;
  }
  input[type='button'],
  input[type='submit'] {
    min-width: 87px;
    min-height: 26px;
  }
  #top_blurb_error {
    display: block;
    margin-bottom: 10px;
    margin-right: auto;
    margin-left: auto;
    width: 70%;
    text-align: center;
    padding: 4px 10px;
    background-color: #eeb939;
    -webkit-border-radius: 4px;
    font-weight: bold;
    font-size: 11pt;
  }
  #content_table {
   padding: 2px;
  }
</style>
</head>
<body bgcolor="#ffffff" vlink="#666666"
      i18n-values=".style.fontFamily:fontfamily;.style.fontSize:fontsize"
      style="margin-bottom: 6px; margin-top: 6px;" onload="initGaiaLoginForm();">
  <table width="100%" height="100%" align="center" cellpadding="1" cellspacing="1">
  <tr>
  <td valign="top"> <!-- LOGIN BOX -->
  <script>
    // Variable to track if a captcha challenge was issued. If this gets set to
    // true, it stays that way until we are told about successful login from
    // the browser.  This means subsequent errors (like invalid password) are
    // rendered in the captcha state, which is basically identical except we
    // don't show the top error blurb "Error Signing in" or the "Create
    // account" link.
    var g_is_captcha_challenge_active = false;

    // Taken from new_new_tab.js.
    // TODO(tim): Can this be unified?
    function url(s) {
      // http://www.w3.org/TR/css3-values/#uris
      // Parentheses, commas, whitespace characters, single quotes (') and
      // double quotes (") appearing in a URI must be escaped with a backslash
      var s2 = s.replace(/(\(|\)|\,|\s|\'|\"|\\)/g, '\\$1');
      // WebKit has a bug when it comes to URLs that end with \
      // https://bugs.webkit.org/show_bug.cgi?id=28885
      if (/\\\\$/.test(s2)) {
        // Add a space to work around the WebKit bug.
        s2 += ' ';
      }
      return 'url("' + s2 + '")';
    }

    function gaia_setFocus() {
      var f = null;
      if (document.getElementById) {
        f = document.getElementById("gaia_loginform");
      } else if (window.gaia_loginform) {
        f = window.gaia_loginform;
      }
      if (f) {
        if (f.Email && (f.Email.value == null || f.Email.value == "")) {
          f.Email.focus();
        } else if (f.Passwd) {
          f.Passwd.focus();
        }
      }
    }

    function advanceThrobber() {
      var throbber = document.getElementById('throb');
      throbber.style.backgroundPositionX =
          ((parseInt(getComputedStyle(throbber).backgroundPositionX) - 16) %
          576) + 'px';
    }

    function showGaiaLogin(args) {
      var throbber = document.getElementById('throbber_container');
      throbber.style.display = "none";
      var f = document.getElementById("gaia_loginform");
      if (f) {
        f.Email.value = args.user;
        if (!args.editable_user) {
          f.Email.style.display = 'none';
          var span = document.getElementById('email_readonly');
          span.appendChild(document.createTextNode(f.Email.value));
          span.style.display = 'inline';
          setElementDisplay("createaccountdiv", "none");
        }
      }
      if (1 == args.error) {
        setElementDisplay("errormsg_1_Password", 'table-row');
        setBlurbError();
      }
      if (3 == args.error) {
        setElementDisplay("errormsg_0_Connection", 'table-row');
        setBlurbError();
      }
      if (4 == args.error) {
        showCaptcha(args);
      }
      document.getElementById("signIn").disabled = false;
      document.getElementById("signIn").value = templateData['signin'];
      gaia_setFocus();
    }

    function showCaptcha(args) {
      g_is_captcha_challenge_active = true;

      // The captcha takes up lots of space, so make room.
      setElementDisplay("top_blurb", "none");
      setElementDisplay("createaccountdiv", "none");
      var gaiaTable = document.getElementById('gaia_table');
      gaiaTable.cellPadding = 0;
      gaiaTable.cellSpacing = 1;
      document.getElementById('cancelspacer').className =
          "cancelspaceforcaptcha";
      document.getElementById('createaccountcell').height = 0;

      // It's showtime for the captcha now.
      setElementDisplay("captchadiv", "block");
      document.getElementById('Email').disabled = true;
      document.getElementById('Passwd').disabled = false;
      document.getElementById('CaptchaValue').disabled = false;
      document.getElementById('captcha_wrapper').style.backgroundImage =
          url(args.captchaUrl);
    }

    function CloseDialog() {
      chrome.send("DialogClose", [""]);
    }

    function showGaiaSuccessAndClose() {
      document.getElementById("signIn").value = templateData['success'];
      setTimeout(CloseDialog, 1600);
    }

    function showGaiaSuccessAndSettingUp() {
      document.getElementById("signIn").value = templateData['settingup'];
    }

    // Called once, when this html/js is loaded.
    function initGaiaLoginForm() {
      var acct_text = document.getElementById("gaia_account_text");
      var translated_text = acct_text.textContent;
      var posGoogle = translated_text.indexOf('Google');
      if (posGoogle != -1) {
        var ltr = templateData['textdirection'] == 'ltr';
        var googleIsAtEndOfSentence = posGoogle != 0;
        if (googleIsAtEndOfSentence == ltr) {
          // We're in ltr and in the translation the word 'Google' is AFTER the
          // word 'Account' OR we're in rtl and 'Google' is BEFORE 'Account'.
          var logo_td = document.getElementById('gaia_logo');
          logo_td.parentNode.appendChild(logo_td);
        }
        acct_text.textContent = translated_text.replace('Google','');
      }
      setInterval(advanceThrobber, 30);
      var args = JSON.parse(chrome.dialogArguments);
      showGaiaLogin(args);
    }

    function sendCredentialsAndClose() {

      if (!setErrorVisibility())
        return false;

      document.getElementById('Email').disabled = true;
      document.getElementById('Passwd').disabled = true;
      document.getElementById('CaptchaValue').disabled = true;

      var throbber = document.getElementById('throbber_container');
      throbber.style.display = "inline";
      var f = document.getElementById("gaia_loginform");
      var result = JSON.stringify({"user" : f.Email.value,
                                   "pass" : f.Passwd.value,
                                   "captcha" : f.CaptchaValue.value});
      document.getElementById("signIn").disabled = true;
      chrome.send("SubmitAuth", [result]);
    }

    function setElementDisplay(id, display) {
      var d = document.getElementById(id);
      if (d)
        d.style.display = display;
    }

    function setBlurbError() {
      if (g_is_captcha_challenge_active)
        return;  // No blurb in captcha challenge mode.
      document.getElementById("top_blurb_error").style.visibility = "visible";
      document.getElementById('Email').disabled = false;
      document.getElementById('Passwd').disabled = false;
    }

    function resetErrorVisibility() {
      setElementDisplay("errormsg_0_Email", 'none');
      setElementDisplay("errormsg_0_Password", 'none');
      setElementDisplay("errormsg_1_Password", 'none');
      setElementDisplay("errormsg_0_Connection", 'none');
    }

    function setErrorVisibility() {
      resetErrorVisibility();
      var f = document.getElementById("gaia_loginform");
      if (null == f.Email.value || "" == f.Email.value) {
        setElementDisplay("errormsg_0_Email", 'table-row');
        setBlurbError();
        return false;
      }
      if (null == f.Passwd.value || "" == f.Passwd.value) {
        setElementDisplay("errormsg_0_Password", 'table-row');
        setBlurbError();
        return false;
      }
      return true;
    }
  </script>
  <style type="text/css">
    div.errormsg { color: red; font-size: smaller; font-family:arial,sans-serif; }
    font.errormsg { color: red; font-size: smaller; font-family:arial,sans-serif;}
  </style>
  <style type="text/css">
    .gaia.le.lbl { font-family: Arial, Helvetica, sans-serif; font-size: smaller; }
    .gaia.le.fpwd { font-family: Arial, Helvetica, sans-serif; font-size: 70%; }
    .gaia.le.chusr { font-family: Arial, Helvetica, sans-serif; font-size: 70%; }
    .gaia.le.val { font-family: Arial, Helvetica, sans-serif; font-size: smaller; }
    .gaia.le.button { font-family: Arial, Helvetica, sans-serif; }
    .gaia.le.rem { font-family: Arial, Helvetica, sans-serif; font-size: smaller; }
    .gaia.captchahtml.desc { font-family: arial, sans-serif; font-size: smaller; }
    .gaia.captchahtml.cmt { font-family: arial, sans-serif; font-size: smaller;
                            font-style: italic; }
  </style>
  <div id="top_blurb">
    <span i18n-content="introduction"></span>
  </div>
  <div id="top_blurb_error" style="visibility:hidden">
      <span i18n-content="errorsigningin"></span>
  </div>
<form id="gaia_loginform" onsubmit="sendCredentialsAndClose(); return false;">
<div id="gaia_loginbox">
<table id="content_table" class="form-noindent" cellspacing="0" cellpadding="5"
       width="75%" border="0" align="center">
  <tr>
    <td valign="top" style="text-align:center" nowrap="nowrap"
        bgcolor="#e8eefa">
      <div>
        <table id="gaia_table" align="center" border="0" cellpadding="1"
               cellspacing="0">
          <tr>
            <td colspan="2" align="center">
              <table>
                <tr>
                  <td valign="top" id="gaia_logo">
                    <img src="data:image/png;base64,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" alt="Google">
                  </td>
                  <td valign="middle">
                    <font size="+0">
                      <span id="gaia_account_text" i18n-content="signinsuffix"></span>
                    </font>
                  </td>
                </tr>
              </table>
            </td>
          </tr>
          <script type="text/javascript">
            function onPreCreateAccount() {
              return true;
            }
            function onPreLogin() {
              if (window["onlogin"] != null) {
                return onlogin();
              } else {
                return true;
              }
            }
          </script>
          <tr>
            <td colspan="2" align="center"> </td>
          </tr>
          <tr>
            <td nowrap="nowrap">
              <div class="endaligned">
                <span class="gaia le lbl" i18n-content="emaillabel">
                </span>
              </div>
            </td>
            <td>
              <input type="text" name="Email"  id="Email" size="18"
                     value="" class='gaia le val' />
              <span id="email_readonly"></span>
            </td>
          </tr>
          <tr>
            <td></td>
            <td>
              <div class="errormsg" id="errormsg_0_Email"
                   i18n-content="cannotbeblank">
              </div>
            </td>
          </tr>
          <tr>
            <td></td>
            <td></td>
          </tr>
          <tr>
            <td class="endaligned">
              <span class="gaia le lbl" i18n-content="passwordlabel">
              </span>
            </td>
            <td>
              <input type="password" name="Passwd" id="Passwd" size="18"
                     class="gaia le val"/>
            </td>
          </tr>
          <tr>
            <td>
            </td>
            <td>
              <div class="errormsgspacer">
                <div class="errormsg" id="errormsg_0_Password"
                     i18n-content="cannotbeblank">
                </div>
                <div class="errormsg" id="errormsg_1_Password">
                  <span i18n-content="invalidcredentials"></span>[<a i18n-values="href:invalidpasswordhelpurl" target="_blank">?</a>]
                </div>
              </div>
            </td>
          </tr>
          <tr>
            <td colspan="2">
              <div id="captchadiv" style="display:none">
                <table cellpadding="1" cellspacing="0" border="0">
                  <tbody>
                    <tr>
                      <td colspan="2" align="center" class="bottompaddedcell">
                        <font size="-1">
                          <span i18n-content="captchainstructions"></span>
                        </font>
                      </td>
                    </tr>
                    <tr>
                      <td colspan="2" align="center" class="bottompaddedcell">
                        <span id="captcha_wrapper">
                          <span class="captcha_image"></span>
                        </span>
                      </td>
                    </tr>
                    <tr>
                      <td colspan="2" align="center">
                        <input type="text" name="CaptchaValue"
                               id="CaptchaValue" size="18"
                               value="" class="gaia le val" />
                      </td>
                    </tr>
                  </tbody>
                </table>
              </div>
            </td>
          </tr>
          <tr>
            <td colspan="2" align="center">
              <div class="errormsg" id="errormsg_0_Connection"
                   i18n-content="couldnotconnect">
              </div>
            </td>
          </tr>
          <tr>
            <td>
            </td>
            <td>
            </td>
          </tr>
          <tr>
            <td colspan="2">
              <table align="center" cellpadding="0" cellspacing="0">
                <tr>
                  <td>
                    <div id="throbber_container" style="display:none;">
                      <div id="throb">
                      </div>
                    </div>
                  </td>
                  <td class="noverticalpadding">
                    <input id="signIn" type="submit" class="gaia le button"
                           name="signIn" i18n-values="value:signin"/>
                    <input type="button" name="cancel" i18n-values="value:cancel"
                           onclick="CloseDialog();" >

                  </td>
                </tr>
              </table>
            </td>
          </tr>
          <tr id="ga-fprow">
            <td colspan="2" height="16.0" class="gaia le fpwd"
                align="center" valign="bottom">
              <a i18n-values="href:cannotaccessaccounturl"
                 target="_blank" i18n-content="cannotaccessaccount">
              </a>
            </td>
          </tr>
          <tr>
            <td id="createaccountcell" colspan="2" height="16.0"
                class="gaia le fpwd" align="center" valign="bottom">
              <div id="createaccountdiv">
                <a i18n-values="href:createnewaccounturl"
                   i18n-content="createaccount" target="_blank">
                </a>
              </div>
           </td>
          </tr>
        </table>
      </div>
    </td>
  </tr>
</table>
</div>
</form>
</td>
</tr>
<tr>
  <td class="cancelspacenocaptcha" id="cancelspacer" colspan="2">
  </td>
</tr>
</table>
</body>
</html>
{
  "key": "XX2fMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCfjDZDDE/CHFEYjpPSDjdI3zphzGo7fSxO3+/pQs++FwvA+OpKKhmBga2Sa+f53ujDlPR8Q6mCvy1lXM4M4zD4Hg3lH2LC1wT/YXxJ28afRYW1yEo6/pbpHazij3+FneGMT2xcTyGvgoacJHXOTUqWyCN7qMOCiFDwQ6Uk1zJOPQIDAQAB",
  "name": "Google Mail",
  "version": "1",
  "icons": {
    "128": "128.png",
    "24": "24.png",
    "32": "32.png",
    "48": "48.png"
  },
  "permissions": [ "notifications" ],
  "app": {
    "urls": [
      "*://mail.google.com/mail/",
      "*://gmail.com/",
      "*://www.gmail.com/"
    ],
    "browse_urls": [
      "https://www.google.com/accounts/"
    ],
    "launch": {
      "web_url": "https://mail.google.com/mail/"
    }
  }
}
<!DOCTYPE HTML>
<html i18n-values="dir:textdirection;">
<head>
<meta charset="utf-8">
<title i18n-content="title"></title>
<link rel="icon" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACxUlEQVQ4y2WSTWgdVRSAvzn3zryZecbaaJpaoYlPRWil+IvaCiJKwY1YQVDBqgsRQfxZKLgS1IWCFFoX4g8xYhX/QHeCYHXnpq0lirZUXUgbtWh4yWuSyZs557h4L9FQuJfLvfB955x7TrLlqvvubLUveClNs+skRCQBB9wdBgvw/+7umOrhur/4/O9Hpw/FVnv03aIsx/OiIM0iIJgpZg1uCmY4CZ4IkgScBDO7vl4p33f3yRjTdDwvC8p2mxAiu66dYO+enVw2uRkzw8w5MvMrUx8fYubELBJbkAgSwmagIyEIaZoiIfLcY7t58Zl76EyMo2q8euAgas6ObZPse+ERbrupQ1MvAU4IkX6/f76s1rXrmgl237IdMx9u4823p1A1VI1GjWcfv5ctF6bU1VnMGuq6FnHATHlwz82YGWoDQG3wffr/NzXuuuMGVpa6NPUy3W43CBimDZ2t46j5OgBYi642OHfeeDUrSwvU/Yq5ubkobudGWYUAfjrx2zpJWRY0/WW0run1ekHcwfVcWFU5OLWfBx5+gp+HElXj1Ok/MWswa6iqSsTdgITDM7+spbkqubwzyfRb+3jo0afXBEe+/wGG85DnuYkPZ236k2/W1boKdC6d4NuvPkPNmF84y/QHnyOxQCRlZGRExQ0cYeb4LK8c+GjYgaHIBt1QNeYXerz+xjR/z1fErE0iOaOjoxrNDQeSkPL1dyc5fvI17r/7VnZsv4KiLJn94y+OHvuR9z78gn+6FVm5kdAaIZHI2NhYK7raaXO/xJOApAWnzizx8v5P6S/3aJpl3JQkCUjMaZ23iZiNILEgL7L5LMsuihdv2vBkr9J3mn6zUWLApUVobSCVFqHpgzuOkEhEYgsPGXmRLT619/YvgZi4+5XANmCrqpbunlRVJYuLi6GqKmmaJknT1PM8t7IsNc9ziTECnAGO/QuYgs28GHSMDAAAAABJRU5ErkJggg==">
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// TODO(arv): Namespace

/**
 * The local strings get injected into the page usig a variable named
 * {@code templateData}. This class provides a simpler interface to access those
 * strings.
 * @constructor
 */
function LocalStrings() {
}

// Start of anonymous namespace.
(function() {

/**
 * Returns a formatted string where $1 to $9 are replaced by the second to the
 * tenth argument.
 * @param {string} s The format string.
 * @param {...string} The extra values to include in the formatted output.
 * @return {string} The string after format substitution.
 */
function replaceArgs(s, args) {
  return s.replace(/\$[$1-9]/g, function(m) {
    return (m == '$$') ? '$' : args[m[1]];
  });
}

/**
 * Returns a string after removing Windows-style accelerators.
 * @param {string} s The input string that may contain accelerators.
 * @return {string} The resulting string with accelerators removed.
 */
function trimAccelerators(s) {
  return s.replace(/&{1,2}/g, function(m) {
    return (m == '&&') ? '&' : '';
  });
}

LocalStrings.prototype = {
  /**
   * The template data object.
   * @type {Object}
   */
  templateData: null,

  /**
   * Gets a localized string by its id.
   * @param {string} s The ID of the string we want.
   * @return {string} The localized string.
   */
  getString: function(id) {
    // TODO(arv): We should not rely on a global variable here.
    return (this.templateData || window.templateData)[id] || '';
  },

  /**
   * Returns a formatted localized string where $1 to $9 are replaced by the
   * second to the tenth argument.
   * @param {string} id The ID of the string we want.
   * @param {...string} The extra values to include in the formatted output.
   * @return {string} The formatted string.
   */
  getStringF: function(id, var_args) {
    return replaceArgs(this.getString(id), arguments);
  },

  /**
   * Gets a localized string (stripped of Windows-style accelerators) by its id.
   * @param {string} s The ID of the string we want.
   * @return {string} The localized string.
   */
  getStringWithoutAccelerator: function(id) {
    return trimAccelerators(this.getString(id));
  },

  /**
   * Returns a formatted localized string (stripped of Windows-style
   * accelerators) where $1 to $9 are replaced by the second to the tenth
   * argument.
   * @param {string} id The ID of the string we want.
   * @param {...string} The extra values to include in the formatted output.
   * @return {string} The formatted string.
   */
  getStringWithoutAcceleratorF: function(id, var_args) {
    return replaceArgs(this.getStringWithoutAccelerator(id), arguments);
  }
};

// End of anonymous namespace.
})();
</script>
<script>
///////////////////////////////////////////////////////////////////////////////
// Globals:
var RESULTS_PER_PAGE = 150;
var MAX_SEARCH_DEPTH_MONTHS = 18;

// Amount of time between pageviews that we consider a 'break' in browsing,
// measured in milliseconds.
var BROWSING_GAP_TIME = 15 * 60 * 1000;

function $(o) {return document.getElementById(o);}

function createElementWithClassName(type, className) {
  var elm = document.createElement(type);
  elm.className = className;
  return elm;
}

// Escapes a URI as appropriate for CSS.
function encodeURIForCSS(uri) {
  // CSS uris need to have '(' and ')' escaped.
  return uri.replace(/\(/g, "\\(").replace(/\)/g, "\\)");
}

// TODO(glen): Get rid of these global references, replace with a controller
//     or just make the classes own more of the page.
var historyModel;
var historyView;
var localStrings;
var pageState;
var deleteQueue = [];
var deleteInFlight = false;
var selectionAnchor = -1;
var id2checkbox = [];


///////////////////////////////////////////////////////////////////////////////
// Page:
/**
 * Class to hold all the information about an entry in our model.
 * @param {Object} result An object containing the page's data.
 * @param {boolean} continued Whether this page is on the same day as the
 *     page before it
 */
function Page(result, continued, model, id) {
  this.model_ = model;
  this.title_ = result.title;
  this.url_ = result.url;
  this.starred_ = result.starred;
  this.snippet_ = result.snippet || "";
  this.id_ = id;

  this.changed = false;

  this.isRendered = false;

  // All the date information is public so that owners can compare properties of
  // two items easily.

  // We get the time in seconds, but we want it in milliseconds.
  this.time = new Date(result.time * 1000);

  // See comment in BrowsingHistoryHandler::QueryComplete - we won't always
  // get all of these.
  this.dateRelativeDay = result.dateRelativeDay || "";
  this.dateTimeOfDay = result.dateTimeOfDay || "";
  this.dateShort = result.dateShort || "";

  // Whether this is the continuation of a previous day.
  this.continued = continued;
}

// Page, Public: --------------------------------------------------------------
/**
 * @return {DOMObject} Gets the DOM representation of the page
 *     for use in browse results.
 */
Page.prototype.getBrowseResultDOM = function() {
  var node = createElementWithClassName('div', 'entry');
  var time = createElementWithClassName('div', 'time');
  if (this.model_.getEditMode()) {
    var checkbox = document.createElement('input');
    checkbox.type = "checkbox";
    checkbox.name = this.id_;
    checkbox.time = this.time.toString();
    checkbox.addEventListener("click", checkboxClicked, false);
    id2checkbox[this.id_] = checkbox;
    time.appendChild(checkbox);
  }
  time.appendChild(document.createTextNode(this.dateTimeOfDay));
  node.appendChild(time);
  node.appendChild(this.getTitleDOM_());
  return node;
};

/**
 * @return {DOMObject} Gets the DOM representation of the page for
 *     use in search results.
 */
Page.prototype.getSearchResultDOM = function() {
  var row = createElementWithClassName('tr', 'entry');
  var datecell = createElementWithClassName('td', 'time');
  datecell.appendChild(document.createTextNode(this.dateShort));
  row.appendChild(datecell);

  var titleCell = document.createElement('td');
  titleCell.valign = 'top';
  titleCell.appendChild(this.getTitleDOM_());
  var snippet = createElementWithClassName('div', 'snippet');
  this.addHighlightedText_(snippet,
                           this.snippet_,
                           this.model_.getSearchText());
  titleCell.appendChild(snippet);
  row.appendChild(titleCell);

  return row;
};

// Page, private: -------------------------------------------------------------
/**
 * Add child text nodes to a node such that occurrences of the spcified text is
 * highligted.
 * @param {Node} node The node under which new text nodes will be made as
 *     children.
 * @param {string} content Text to be added beneath |node| as one or more
 *     text nodes.
 * @param {string} highlightText Occurences of this text inside |content| will
 *     be highlighted.
 */
Page.prototype.addHighlightedText_ = function(node, content, highlightText) {
  var i = 0;
  if (highlightText) {
    var re = new RegExp(Page.pregQuote_(highlightText), 'gim');
    var match;
    while (match = re.exec(content)) {
      if (match.index > i)
        node.appendChild(document.createTextNode(content.slice(i,
                                                               match.index)));
      i = re.lastIndex;
      // Mark the highlighted text in bold.
      var b = document.createElement('b');
      b.textContent = content.substring(match.index, i);
      node.appendChild(b);
    }
  }
  if (i < content.length)
    node.appendChild(document.createTextNode(content.slice(i)));
};

/**
 * @return {DOMObject} DOM representation for the title block.
 */
Page.prototype.getTitleDOM_ = function() {
  var node = document.createElement('div');
  node.className = 'title';
  var link = document.createElement('a');
  link.href = this.url_;
  link.style.backgroundImage =
      'url(chrome://favicon/' + encodeURIForCSS(this.url_) + ')';
  link.id = "id-" + this.id_;
  this.addHighlightedText_(link, this.title_, this.model_.getSearchText());

  node.appendChild(link);

  if (this.starred_) {
    node.className += ' starred';
    node.appendChild(createElementWithClassName('div', 'starred'));
  }

  return node;
};

// Page, private, static: -----------------------------------------------------

/**
 * Quote a string so it can be used in a regular expression.
 * @param {string} str The source string
 * @return {string} The escaped string
 */
Page.pregQuote_ = function(str) {
  return str.replace(/([\\\.\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:])/g, "\\$1");
};

///////////////////////////////////////////////////////////////////////////////
// HistoryModel:
/**
 * Global container for history data. Future optimizations might include
 * allowing the creation of a HistoryModel for each search string, allowing
 * quick flips back and forth between results.
 *
 * The history model is based around pages, and only fetching the data to
 * fill the currently requested page. This is somewhat dependent on the view,
 * and so future work may wish to change history model to operate on
 * timeframe (day or week) based containers.
 */
function HistoryModel() {
  this.clearModel_();
  this.setEditMode(false);
  this.view_;
}

// HistoryModel, Public: ------------------------------------------------------
/**
 * Sets our current view that is called when the history model changes.
 * @param {HistoryView} view The view to set our current view to.
 */
HistoryModel.prototype.setView = function(view) {
  this.view_ = view;
};

/**
 * Start a new search - this will clear out our model.
 * @param {String} searchText The text to search for
 * @param {Number} opt_page The page to view - this is mostly used when setting
 *     up an initial view, use #requestPage otherwise.
 */
HistoryModel.prototype.setSearchText = function(searchText, opt_page) {
  this.clearModel_();
  this.searchText_ = searchText;
  this.requestedPage_ = opt_page ? opt_page : 0;
  this.getSearchResults_();
};

/**
 * Reload our model with the current parameters.
 */
HistoryModel.prototype.reload = function() {
  var search = this.searchText_;
  var page = this.requestedPage_;
  this.clearModel_();
  this.searchText_ = search;
  this.requestedPage_ = page;
  this.getSearchResults_();
};

/**
 * @return {String} The current search text.
 */
HistoryModel.prototype.getSearchText = function() {
  return this.searchText_;
};

/**
 * Tell the model that the view will want to see the current page. When
 * the data becomes available, the model will call the view back.
 * @page {Number} page The page we want to view.
 */
HistoryModel.prototype.requestPage = function(page) {
  this.requestedPage_ = page;
  this.changed = true;
  this.updateSearch_(false);
};

/**
 * Receiver for history query.
 * @param {String} term The search term that the results are for.
 * @param {Array} results A list of results
 */
HistoryModel.prototype.addResults = function(info, results) {
  this.inFlight_ = false;
  if (info.term != this.searchText_) {
    // If our results aren't for our current search term, they're rubbish.
    return;
  }

  // Currently we assume we're getting things in date order. This needs to
  // be updated if that ever changes.
  if (results) {
    var lastURL, lastDay;
    var oldLength = this.pages_.length;
    if (oldLength) {
      var oldPage = this.pages_[oldLength - 1];
      lastURL = oldPage.url;
      lastDay = oldPage.dateRelativeDay;
    }

    for (var i = 0, thisResult; thisResult = results[i]; i++) {
      var thisURL = thisResult.url;
      var thisDay = thisResult.dateRelativeDay;

      // Remove adjacent duplicates.
      if (!lastURL || lastURL != thisURL) {
        // Figure out if this page is in the same day as the previous page,
        // this is used to determine how day headers should be drawn.
        this.pages_.push(new Page(thisResult, thisDay == lastDay, this,
            this.last_id_++));
        lastDay = thisDay;
        lastURL = thisURL;
      }
    }
    if (results.length)
      this.changed = true;
  }

  this.updateSearch_(info.finished);
};

/**
 * @return {Number} The number of pages in the model.
 */
HistoryModel.prototype.getSize = function() {
  return this.pages_.length;
};

/**
 * @return {boolean} Whether our history query has covered all of
 *     the user's history
 */
HistoryModel.prototype.isComplete = function() {
  return this.complete_;
};

/**
 * Get a list of pages between specified index positions.
 * @param {Number} start The start index
 * @param {Number} end The end index
 * @return {Array} A list of pages
 */
HistoryModel.prototype.getNumberedRange = function(start, end) {
  if (start >= this.getSize())
    return [];

  var end = end > this.getSize() ? this.getSize() : end;
  return this.pages_.slice(start, end);
};

/**
 * @return {boolean} Whether we are in edit mode where history items can be
 *    deleted
 */
HistoryModel.prototype.getEditMode = function() {
  return this.editMode_;
};

/**
 * @param {boolean} edit_mode Control whether we are in edit mode.
 */
HistoryModel.prototype.setEditMode = function(edit_mode) {
  this.editMode_ = edit_mode;
};

// HistoryModel, Private: -----------------------------------------------------
HistoryModel.prototype.clearModel_ = function() {
  this.inFlight_ = false; // Whether a query is inflight.
  this.searchText_ = '';
  this.searchDepth_ = 0;
  this.pages_ = []; // Date-sorted list of pages.
  this.last_id_ = 0;
  selectionAnchor = -1;
  id2checkbox = [];

  // The page that the view wants to see - we only fetch slightly past this
  // point. If the view requests a page that we don't have data for, we try
  // to fetch it and call back when we're done.
  this.requestedPage_ = 0;

  this.complete_ = false;

  if (this.view_) {
    this.view_.clear_();
  }
};

/**
 * Figure out if we need to do more searches to fill the currently requested
 * page. If we think we can fill the page, call the view and let it know
 * we're ready to show something.
 */
HistoryModel.prototype.updateSearch_ = function(finished) {
  if ((this.searchText_ && this.searchDepth_ >= MAX_SEARCH_DEPTH_MONTHS) ||
      finished) {
    // We have maxed out. There will be no more data.
    this.complete_ = true;
    this.view_.onModelReady();
    this.changed = false;
  } else {
    // If we can't fill the requested page, ask for more data unless a request
    // is still in-flight.
    if (!this.canFillPage_(this.requestedPage_) && !this.inFlight_) {
      this.getSearchResults_(this.searchDepth_ + 1);
    }

    // If we have any data for the requested page, show it.
    if (this.changed && this.haveDataForPage_(this.requestedPage_)) {
      this.view_.onModelReady();
      this.changed = false;
    }
  }
};

/**
 * Get search results for a selected depth. Our history system is optimized
 * for queries that don't cross month boundaries, but an entire month's
 * worth of data is huge. When we're in browse mode (searchText is empty)
 * we request the data a day at a time. When we're searching, a month is
 * used.
 *
 * TODO: Fix this for when the user's clock goes across month boundaries.
 * @param {number} opt_day How many days back to do the search.
 */
HistoryModel.prototype.getSearchResults_ = function(depth) {
  this.searchDepth_ = depth || 0;

  if (this.searchText_ == "") {
    chrome.send('getHistory',
        [String(this.searchDepth_)]);
  } else {
    chrome.send('searchHistory',
        [this.searchText_, String(this.searchDepth_)]);
  }

  this.inFlight_ = true;
};

/**
 * Check to see if we have data for a given page.
 * @param {number} page The page number
 * @return {boolean} Whether we have any data for the given page.
 */
HistoryModel.prototype.haveDataForPage_ = function(page) {
  return (page * RESULTS_PER_PAGE < this.getSize());
};

/**
 * Check to see if we have data to fill a page.
 * @param {number} page The page number.
 * @return {boolean} Whether we have data to fill the page.
 */
HistoryModel.prototype.canFillPage_ = function(page) {
  return ((page + 1) * RESULTS_PER_PAGE <= this.getSize());
};

///////////////////////////////////////////////////////////////////////////////
// HistoryView:
/**
 * Functions and state for populating the page with HTML. This should one-day
 * contain the view and use event handlers, rather than pushing HTML out and
 * getting called externally.
 * @param {HistoryModel} model The model backing this view.
 */
function HistoryView(model) {
  this.summaryTd_ = $('results-summary');
  this.summaryTd_.textContent = localStrings.getString('loading');
  this.editButtonTd_ = $('edit-button');
  this.editingControlsDiv_ = $('editing-controls');
  this.resultDiv_ = $('results-display');
  this.pageDiv_ = $('results-pagination');
  this.model_ = model
  this.pageIndex_ = 0;
  this.lastDisplayed_ = [];

  this.model_.setView(this);

  this.currentPages_ = [];

  var self = this;
  window.onresize = function() {
    self.updateEntryAnchorWidth_();
  };
  self.updateEditControls_();

  this.boundUpdateRemoveButton_ = function(e) {
    return self.updateRemoveButton_(e);
  };
}

// HistoryView, public: -------------------------------------------------------
/**
 * Do a search and optionally view a certain page.
 * @param {string} term The string to search for.
 * @param {number} opt_page The page we wish to view, only use this for
 *     setting up initial views, as this triggers a search.
 */
HistoryView.prototype.setSearch = function(term, opt_page) {
  this.pageIndex_ = parseInt(opt_page || 0, 10);
  window.scrollTo(0, 0);
  this.model_.setSearchText(term, this.pageIndex_);
  if (term) {
    this.setEditMode(false);
  }
  this.updateEditControls_();
  pageState.setUIState(this.model_.getEditMode(), term, this.pageIndex_);
};

/**
 * Controls edit mode where history can be deleted.
 * @param {boolean} edit_mode Whether to enable edit mode.
 */
HistoryView.prototype.setEditMode = function(edit_mode) {
  this.model_.setEditMode(edit_mode);
  pageState.setUIState(this.model_.getEditMode(), this.model_.getSearchText(),
                       this.pageIndex_);
};

/**
 * Toggles the edit mode and triggers UI update.
 */
HistoryView.prototype.toggleEditMode = function() {
  var editMode = !this.model_.getEditMode();
  this.setEditMode(editMode);
  this.updateEditControls_();
};

/**
 * Reload the current view.
 */
HistoryView.prototype.reload = function() {
  this.model_.reload();
};

/**
 * Switch to a specified page.
 * @param {number} page The page we wish to view.
 */
HistoryView.prototype.setPage = function(page) {
  this.clear_();
  this.pageIndex_ = parseInt(page, 10);
  window.scrollTo(0, 0);
  this.model_.requestPage(page);
  pageState.setUIState(this.model_.getEditMode(), this.model_.getSearchText(),
      this.pageIndex_);
};

/**
 * @return {number} The page number being viewed.
 */
HistoryView.prototype.getPage = function() {
  return this.pageIndex_;
};

/**
 * Callback for the history model to let it know that it has data ready for us
 * to view.
 */
HistoryView.prototype.onModelReady = function() {
  this.displayResults_();
};

// HistoryView, private: ------------------------------------------------------
/**
 * Clear the results in the view.  Since we add results piecemeal, we need
 * to clear them out when we switch to a new page or reload.
 */
HistoryView.prototype.clear_ = function() {
  this.resultDiv_.textContent = '';

  var pages = this.currentPages_;
  for (var i = 0; i < pages.length; i++) {
    pages[i].isRendered = false;
  }
  this.currentPages_ = [];
};

HistoryView.prototype.setPageRendered_ = function(page) {
  page.isRendered = true;
  this.currentPages_.push(page);
};

/**
 * Update the page with results.
 */
HistoryView.prototype.displayResults_ = function() {
  var results = this.model_.getNumberedRange(
      this.pageIndex_ * RESULTS_PER_PAGE,
      this.pageIndex_ * RESULTS_PER_PAGE + RESULTS_PER_PAGE);

  if (this.model_.getSearchText()) {
    var resultTable = createElementWithClassName('table', 'results');
    resultTable.cellSpacing = 0;
    resultTable.cellPadding = 0;
    resultTable.border = 0;

    for (var i = 0, page; page = results[i]; i++) {
      if (!page.isRendered) {
        resultTable.appendChild(page.getSearchResultDOM());
        this.setPageRendered_(page);
      }
    }
    this.resultDiv_.appendChild(resultTable);
  } else {
    var lastTime = Math.infinity;
    for (var i = 0, page; page = results[i]; i++) {
      if (page.isRendered) {
        continue;
      }
      // Break across day boundaries and insert gaps for browsing pauses.
      var thisTime = page.time.getTime();

      if ((i == 0 && page.continued) || !page.continued) {
        var day = createElementWithClassName('div', 'day');
        day.appendChild(document.createTextNode(page.dateRelativeDay));

        if (i == 0 && page.continued) {
          day.appendChild(document.createTextNode(' ' +
              localStrings.getString('cont')));
        }

        this.resultDiv_.appendChild(day);
      } else if (lastTime - thisTime > BROWSING_GAP_TIME) {
        this.resultDiv_.appendChild(createElementWithClassName('div', 'gap'));
      }
      lastTime = thisTime;

      // Add entry.
      this.resultDiv_.appendChild(page.getBrowseResultDOM());
      this.setPageRendered_(page);
    }
  }

  this.displaySummaryBar_();
  this.displayNavBar_();
  this.updateEntryAnchorWidth_();
};

/**
 * Update the summary bar with descriptive text.
 */
HistoryView.prototype.displaySummaryBar_ = function() {
  var searchText = this.model_.getSearchText();
  if (searchText != '') {
    this.summaryTd_.textContent = localStrings.getStringF('searchresultsfor',
        searchText);
  } else {
    this.summaryTd_.textContent = localStrings.getString('history');
  }
};

/**
 * Update the widgets related to edit mode.
 */
HistoryView.prototype.updateEditControls_ = function() {
  // Display a button (looking like a link) to enable/disable edit mode.
  var oldButton = this.editButtonTd_.firstChild;
  if (this.model_.getSearchText()) {
    this.editButtonTd_.replaceChild(document.createElement('p'), oldButton);
    this.editingControlsDiv_.textContent = '';
    return;
  }

  var editMode = this.model_.getEditMode();
  var button = createElementWithClassName('button', 'edit-button');
  button.onclick = toggleEditMode;
  button.textContent = localStrings.getString(editMode ?
                                              'doneediting' : 'edithistory');
  this.editButtonTd_.replaceChild(button, oldButton);

  this.editingControlsDiv_.textContent = '';

  if (editMode) {
    // Button to delete the selected items.
    button = document.createElement('button');
    button.onclick = removeItems;
    button.textContent = localStrings.getString('removeselected');
    button.disabled = true;
    this.editingControlsDiv_.appendChild(button);
    this.removeButton_ = button;

    // Button that opens up the clear browsing data dialog.
    button = document.createElement('button');
    button.onclick = openClearBrowsingData;
    button.textContent = localStrings.getString('clearallhistory');
    this.editingControlsDiv_.appendChild(button);

    // Listen for clicks in the page to sync the disabled state.
    document.addEventListener('click', this.boundUpdateRemoveButton_);
  } else {
    this.removeButton_ = null;
    document.removeEventListener('click', this.boundUpdateRemoveButton_);
  }
};

/**
 * Updates the disabled state of the remove button when in editing mode.
 * @param {!Event} e The click event object.
 * @private
 */
HistoryView.prototype.updateRemoveButton_ = function(e) {
  if (e.target.tagName != 'INPUT')
    return;

  var anyChecked = document.querySelector('.entry input:checked') != null;
  if (this.removeButton_)
    this.removeButton_.disabled = !anyChecked;
};

/**
 * Update the pagination tools.
 */
HistoryView.prototype.displayNavBar_ = function() {
  this.pageDiv_.textContent = '';

  if (this.pageIndex_ > 0) {
    this.pageDiv_.appendChild(
        this.createPageNav_(0, localStrings.getString('newest')));
    this.pageDiv_.appendChild(
        this.createPageNav_(this.pageIndex_ - 1,
                            localStrings.getString('newer')));
  }

  // TODO(feldstein): this causes the navbar to not show up when your first
  // page has the exact amount of results as RESULTS_PER_PAGE.
  if (this.model_.getSize() > (this.pageIndex_ + 1) * RESULTS_PER_PAGE) {
    this.pageDiv_.appendChild(
        this.createPageNav_(this.pageIndex_ + 1,
                            localStrings.getString('older')));
  }
};

/**
 * Make a DOM object representation of a page navigation link.
 * @param {number} page The page index the navigation element should link to
 * @param {string} name The text content of the link
 * @return {HTMLAnchorElement} the pagination link
 */
HistoryView.prototype.createPageNav_ = function(page, name) {
  anchor = document.createElement('a');
  anchor.className = 'page-navigation';
  anchor.textContent = name;
  var hashString = PageState.getHashString(this.model_.getEditMode(),
                                           this.model_.getSearchText(), page);
  var link = 'chrome://history/' + (hashString ? '#' + hashString : '');
  anchor.href = link;
  anchor.onclick = function() {
    setPage(page);
    return false;
  };
  return anchor;
};

/**
 * Updates the CSS rule for the entry anchor.
 * @private
 */
HistoryView.prototype.updateEntryAnchorWidth_ = function() {
  // We need to have at least on .title div to be able to calculate the
  // desired width of the anchor.
  var titleElement = document.querySelector('.entry .title');
  if (!titleElement)
    return;

  // Create new CSS rules and add them last to the last stylesheet.
  if (!this.entryAnchorRule_) {
     var styleSheets = document.styleSheets;
     var styleSheet = styleSheets[styleSheets.length - 1];
     var rules = styleSheet.cssRules;
     var createRule = function(selector) {
       styleSheet.insertRule(selector + '{}', rules.length);
       return rules[rules.length - 1];
     };
     this.entryAnchorRule_ = createRule('.entry .title > a');
     // The following rule needs to be more specific to have higher priority.
     this.entryAnchorStarredRule_ = createRule('.entry .title.starred > a');
   }

   var anchorMaxWith = titleElement.offsetWidth;
   this.entryAnchorRule_.style.maxWidth = anchorMaxWith + 'px';
   // Adjust by the width of star plus its margin.
   this.entryAnchorStarredRule_.style.maxWidth = anchorMaxWith - 23 + 'px';
};

///////////////////////////////////////////////////////////////////////////////
// State object:
/**
 * An 'AJAX-history' implementation.
 * @param {HistoryModel} model The model we're representing
 * @param {HistoryView} view The view we're representing
 */
function PageState(model, view) {
  // Enforce a singleton.
  if (PageState.instance) {
    return PageState.instance;
  }

  this.model = model;
  this.view = view;

  if (typeof this.checker_ != 'undefined' && this.checker_) {
    clearInterval(this.checker_);
  }

  // TODO(glen): Replace this with a bound method so we don't need
  //     public model and view.
  this.checker_ = setInterval((function(state_obj) {
    var hashData = state_obj.getHashData();

    if (hashData.q != state_obj.model.getSearchText(term)) {
      state_obj.view.setSearch(hashData.q, parseInt(hashData.p, 10));
    } else if (parseInt(hashData.p, 10) != state_obj.view.getPage()) {
      state_obj.view.setPage(hashData.p);
    }
  }), 50, this);
}

PageState.instance = null;

/**
 * @return {Object} An object containing parameters from our window hash.
 */
PageState.prototype.getHashData = function() {
  var result = {
    e : 0,
    q : '',
    p : 0
  };

  if (!window.location.hash) {
    return result;
  }

  var hashSplit = window.location.hash.substr(1).split('&');
  for (var i = 0; i < hashSplit.length; i++) {
    var pair = hashSplit[i].split('=');
    if (pair.length > 1) {
      result[pair[0]] = decodeURIComponent(pair[1].replace(/\+/g, ' '));
    }
  }

  return result;
};

/**
 * Set the hash to a specified state, this will create an entry in the
 * session history so the back button cycles through hash states, which
 * are then picked up by our listener.
 * @param {string} term The current search string.
 * @param {string} page The page currently being viewed.
 */
PageState.prototype.setUIState = function(editMode, term, page) {
  // Make sure the form looks pretty.
  document.forms[0].term.value = term;
  var currentHash = this.getHashData();
  if (Boolean(currentHash.e) != editMode || currentHash.q != term ||
      currentHash.p != page) {
    window.location.hash = PageState.getHashString(editMode, term, page);
  }
};

/**
 * Static method to get the hash string for a specified state
 * @param {string} term The current search string.
 * @param {string} page The page currently being viewed.
 * @return {string} The string to be used in a hash.
 */
PageState.getHashString = function(editMode, term, page) {
  var newHash = [];
  if (editMode) {
    newHash.push('e=1');
  }
  if (term) {
    newHash.push('q=' + encodeURIComponent(term));
  }
  if (page != undefined) {
    newHash.push('p=' + page);
  }

  return newHash.join('&');
};

///////////////////////////////////////////////////////////////////////////////
// Document Functions:
/**
 * Window onload handler, sets up the page.
 */
function load() {
  $('term').focus();

  localStrings = new LocalStrings();
  historyModel = new HistoryModel();
  historyView = new HistoryView(historyModel);
  pageState = new PageState(historyModel, historyView);

  // Create default view.
  var hashData = pageState.getHashData();
  if (Boolean(hashData.e)) {
    historyView.toggleEditMode();
  }
  historyView.setSearch(hashData.q, hashData.p);
}

/**
 * TODO(glen): Get rid of this function.
 * Set the history view to a specified page.
 * @param {String} term The string to search for
 */
function setSearch(term) {
  if (historyView) {
    historyView.setSearch(term);
  }
}

/**
 * TODO(glen): Get rid of this function.
 * Set the history view to a specified page.
 * @param {number} page The page to set the view to.
 */
function setPage(page) {
  if (historyView) {
    historyView.setPage(page);
  }
}

/**
 * TODO(glen): Get rid of this function.
 * Toggles edit mode.
 */
function toggleEditMode() {
  if (historyView) {
    historyView.toggleEditMode();
    historyView.reload();
  }
}

/**
 * Delete the next item in our deletion queue.
 */
function deleteNextInQueue() {
  if (!deleteInFlight && deleteQueue.length) {
    deleteInFlight = true;
    chrome.send('removeURLsOnOneDay',
                [String(deleteQueue[0])].concat(deleteQueue[1]));
  }
}

/**
 * Open the clear browsing data dialog.
 */
function openClearBrowsingData() {
  chrome.send('clearBrowsingData', []);
  return false;
}

/**
 * Collect IDs from checked checkboxes and send to Chrome for deletion.
 */
function removeItems() {
  var checkboxes = document.getElementsByTagName('input');
  var ids = [];
  var disabledItems = [];
  var queue = [];
  var date = new Date();
  for (var i = 0; i < checkboxes.length; i++) {
    if (checkboxes[i].type == 'checkbox' && checkboxes[i].checked &&
        !checkboxes[i].disabled) {
      var cbDate = new Date(checkboxes[i].time);
      if (date.getFullYear() != cbDate.getFullYear() ||
          date.getMonth() != cbDate.getMonth() ||
          date.getDate() != cbDate.getDate()) {
        if (ids.length > 0) {
          queue.push(date.valueOf() / 1000);
          queue.push(ids);
        }
        ids = [];
        date = cbDate;
      }
      var link = $('id-' + checkboxes[i].name);
      checkboxes[i].disabled = true;
      link.style.textDecoration = 'line-through';
      disabledItems.push(checkboxes[i]);
      ids.push(link.href);
    }
  }
  if (ids.length > 0) {
    queue.push(date.valueOf() / 1000);
    queue.push(ids);
  }
  if (queue.length > 0) {
    if (confirm(localStrings.getString('deletewarning'))) {
      deleteQueue = deleteQueue.concat(queue);
      deleteNextInQueue();
    } else {
      // If the remove is cancelled, return the checkboxes to their
      // enabled, non-line-through state.
      for (var i = 0; i < disabledItems.length; i++) {
        var link = $('id-' + disabledItems[i].name);
        disabledItems[i].disabled = false;
        link.style.textDecoration = '';
      }
    }
  }
  return false;
}

/**
 * Toggle state of checkbox and handle Shift modifier.
 */
function checkboxClicked(event) {
  if (event.shiftKey && (selectionAnchor != -1)) {
    var checked = this.checked;
    // Set all checkboxes from the anchor up to the clicked checkbox to the
    // state of the clicked one.
    var begin = Math.min(this.name, selectionAnchor);
    var end = Math.max(this.name, selectionAnchor);
    for (var i = begin; i <= end; i++) {
      id2checkbox[i].checked = checked;
    }
  }
  selectionAnchor = this.name;
  this.focus();
}

///////////////////////////////////////////////////////////////////////////////
// Chrome callbacks:
/**
 * Our history system calls this function with results from searches.
 */
function historyResult(info, results) {
  historyModel.addResults(info, results);
}

/**
 * Our history system calls this function when a deletion has finished.
 */
function deleteComplete() {
  window.console.log('Delete complete');
  deleteInFlight = false;
  if (deleteQueue.length > 1) {
    deleteQueue = deleteQueue.slice(2);
    deleteNextInQueue();
  } else {
    deleteQueue = [];
  }
}

/**
 * Our history system calls this function if a delete is not ready (e.g.
 * another delete is in-progress).
 */
function deleteFailed() {
  window.console.log('Delete failed');
  // The deletion failed - try again later.
  deleteInFlight = false;
  setTimeout(deleteNextInQueue, 500);
}

/**
 * We're called when something is deleted (either by us or by someone
 * else).
 */
function historyDeleted() {
  window.console.log('History deleted');
  historyView.reload();
}
</script>
<style>body {
  background-color:white;
  color:black;
  margin:10px;
}
.header {
  overflow:auto;
  clear:both;
}
.header .logo {
  float:left;
}
.header .form {
  float:left;
  margin-top:22px;
  margin-left:12px;
}
html[dir='rtl'] .logo {
  float:right;
}
html[dir='rtl'] .form {
  float:right;
  margin-right:12px;
}
.page-navigation {
  padding:8px;
  background-color:#ebeff9;
  margin-right:4px;
}
.footer {
  height:24px;
}</style>
<style>
#results-separator {
  margin-top:12px;
  border-top:1px solid #9cc2ef;
  background-color:#ebeff9;
  font-weight:bold;
  padding:3px;
  margin-bottom:-8px;
}
#results-separator table {
  width: 100%;
}
#results-summary {
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
  width: 50%;
}
#edit-button {
  text-align: right;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
  width: 50%;
}
#editing-controls button {
  margin-top: 18px;
  margin-bottom: -8px;
}
#results-display {
  max-width:740px;
}
.day {
  margin-top:18px;
  padding:0px 3px;
  display:inline-block;
}
.edit-button {
  display: inline;
  -webkit-appearance: none;
  background: none;
  border: 0;
  color: blue; /* -webkit-link makes it purple :'( */
  cursor: pointer;
  text-decoration: underline;
  padding:0px 9px;
  display:inline-block;
  font:inherit;
}
.gap {
  margin-left:18px;
  width:15px;
  border-right:1px solid #ddd;
  height:14px;
}
.entry {
  margin-left:18px;
  margin-top:6px;
  overflow:auto;
}
table.results {
  margin-left:4px;
}
.entry .time {
  color:#888;
  float:left;
  min-width:56px;
  margin-right:5px;
  padding-top:1px;
  white-space:nowrap;
}
html[dir='rtl'] .time {
  margin-right:0px;
  margin-left:5px;
  float:right;
}
.entry .title {
  max-width:600px;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}
.results .time, .results .title {
  margin-top:18px;
}
.title > .starred {
  background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAALCAYAAACprHcmAAAB80lEQVQYGQXBXUhTYQAG4Pf7znfO/qJpHklBcw4SdTS3tF8wN2q2BiVMZxgkJMHqIugiCEy8sBkE3XUxiJRJUXQzSsWUEEsjdZBJFtWG28IuVq4azra5nbPT87DzPWHYTurx66cExhEkk8V783M/rtbU7vWLIndDrSFoNKkwN5sCAwBFAXQ6iooKoSG6nnB4+x5pJ2c6HYbaAw28IH1RFAUAwCgFBJ6W53mCb2HSJpbGzR7PONY+G8yxuKXNZEJSpSKgFJsslyO3wuGCT8rLiERkdJxZREl5AsbqEILTnX6dlvdLEsF2mgywT2ubvtYjARw8vA4puxsW6yqUPMPF3mU0mvshaIuYDEr4sHLFx5yuqo35t7pqU/0y2s9+B/IaFAsCysQkHPZnmJrW4GukD05X5QZrP73LtrR0+eYlb5N7jN4WTzk/ghYBQMbIqBEDQ9eTXT3dwdYT7C5Tq0m05RDnXV2ps/7dqhEVOYTU7yz0pQSUctgjHo/V7SfezD8ZLLejQKsVBsWyLeux5vcIPKzE+Es7zrne4GhLFPuqQlaOGQdTqZ0hNvE8DUClz2xPsQcjBDOvh1GQ7cHA05B7YXEYKv4dm3jh0gM5sCaLGjxPs2OjzZl0xoYLvfX3Z1/96e/qdt558thwLR5LwO3hspKkwX/RB7soMZzqHQAAAABJRU5ErkJggg==");
  background-repeat:no-repeat;
  display:inline-block;
  margin-left:12px;
  margin-right:0;
  width:11px;
  height:11px;
}
html[dir='rtl'] .title > .starred {
  margin-left:0;
  margin-right:12px;
}
.entry .title > a {
  -webkit-box-sizing: border-box;
  background-repeat:no-repeat;
  background-size:16px;
  background-position:0px 1px;
  padding:1px 0px 4px 22px;
  display:inline-block;
  overflow:hidden;
  text-overflow:ellipsis;
}
html[dir='rtl'] .entry .title > a {
  background-position-x:right;
  padding-left:0px;
  padding-right:22px;
}
#results-pagination {
  padding-top:24px;
  margin-left:18px;
}

</style>
</head>
<body onload="load();" i18n-values=".style.fontFamily:fontfamily;.style.fontSize:fontsize">
<div class="header">
  <a href="" onclick="setSearch(''); return false;">
    <img src="data:image/png;base64,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"
         width="67" height="67" class="logo" border="0"></a>
  <form method="post" action=""
      onsubmit="setSearch(this.term.value); return false;"
      class="form">
    <input type="text" name="term" id="term">
    <input type="submit" name="submit" i18n-values="value:searchbutton">
  </form>
</div>
<div class="main">
  <div id="results-separator">
    <table border="0" cellPadding="0" cellSpacing="0">
      <tr><td id="results-summary"></td><td id="edit-button"><p></p></td></tr>
    </table>
  </div>
  <div id="editing-controls"></div>
  <div id="results-display"></div>
  <div id="results-pagination"></div>
</div>
<div class="footer">
</div>
</body>
</html>
<!DOCTYPE HTML>
<html i18n-values="dir:textdirection;">
<head>
<meta charset="utf-8">
<title i18n-content="title"></title>
<link rel="icon" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACxUlEQVQ4y2WSTWgdVRSAvzn3zryZecbaaJpaoYlPRWil+IvaCiJKwY1YQVDBqgsRQfxZKLgS1IWCFFoX4g8xYhX/QHeCYHXnpq0lirZUXUgbtWh4yWuSyZs557h4L9FQuJfLvfB955x7TrLlqvvubLUveClNs+skRCQBB9wdBgvw/+7umOrhur/4/O9Hpw/FVnv03aIsx/OiIM0iIJgpZg1uCmY4CZ4IkgScBDO7vl4p33f3yRjTdDwvC8p2mxAiu66dYO+enVw2uRkzw8w5MvMrUx8fYubELBJbkAgSwmagIyEIaZoiIfLcY7t58Zl76EyMo2q8euAgas6ObZPse+ERbrupQ1MvAU4IkX6/f76s1rXrmgl237IdMx9u4823p1A1VI1GjWcfv5ctF6bU1VnMGuq6FnHATHlwz82YGWoDQG3wffr/NzXuuuMGVpa6NPUy3W43CBimDZ2t46j5OgBYi642OHfeeDUrSwvU/Yq5ubkobudGWYUAfjrx2zpJWRY0/WW0run1ekHcwfVcWFU5OLWfBx5+gp+HElXj1Ok/MWswa6iqSsTdgITDM7+spbkqubwzyfRb+3jo0afXBEe+/wGG85DnuYkPZ236k2/W1boKdC6d4NuvPkPNmF84y/QHnyOxQCRlZGRExQ0cYeb4LK8c+GjYgaHIBt1QNeYXerz+xjR/z1fErE0iOaOjoxrNDQeSkPL1dyc5fvI17r/7VnZsv4KiLJn94y+OHvuR9z78gn+6FVm5kdAaIZHI2NhYK7raaXO/xJOApAWnzizx8v5P6S/3aJpl3JQkCUjMaZ23iZiNILEgL7L5LMsuihdv2vBkr9J3mn6zUWLApUVobSCVFqHpgzuOkEhEYgsPGXmRLT619/YvgZi4+5XANmCrqpbunlRVJYuLi6GqKmmaJknT1PM8t7IsNc9ziTECnAGO/QuYgs28GHSMDAAAAABJRU5ErkJggg==">
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// TODO(arv): Namespace

/**
 * The local strings get injected into the page usig a variable named
 * {@code templateData}. This class provides a simpler interface to access those
 * strings.
 * @constructor
 */
function LocalStrings() {
}

// Start of anonymous namespace.
(function() {

/**
 * Returns a formatted string where $1 to $9 are replaced by the second to the
 * tenth argument.
 * @param {string} s The format string.
 * @param {...string} The extra values to include in the formatted output.
 * @return {string} The string after format substitution.
 */
function replaceArgs(s, args) {
  return s.replace(/\$[$1-9]/g, function(m) {
    return (m == '$$') ? '$' : args[m[1]];
  });
}

/**
 * Returns a string after removing Windows-style accelerators.
 * @param {string} s The input string that may contain accelerators.
 * @return {string} The resulting string with accelerators removed.
 */
function trimAccelerators(s) {
  return s.replace(/&{1,2}/g, function(m) {
    return (m == '&&') ? '&' : '';
  });
}

LocalStrings.prototype = {
  /**
   * The template data object.
   * @type {Object}
   */
  templateData: null,

  /**
   * Gets a localized string by its id.
   * @param {string} s The ID of the string we want.
   * @return {string} The localized string.
   */
  getString: function(id) {
    // TODO(arv): We should not rely on a global variable here.
    return (this.templateData || window.templateData)[id] || '';
  },

  /**
   * Returns a formatted localized string where $1 to $9 are replaced by the
   * second to the tenth argument.
   * @param {string} id The ID of the string we want.
   * @param {...string} The extra values to include in the formatted output.
   * @return {string} The formatted string.
   */
  getStringF: function(id, var_args) {
    return replaceArgs(this.getString(id), arguments);
  },

  /**
   * Gets a localized string (stripped of Windows-style accelerators) by its id.
   * @param {string} s The ID of the string we want.
   * @return {string} The localized string.
   */
  getStringWithoutAccelerator: function(id) {
    return trimAccelerators(this.getString(id));
  },

  /**
   * Returns a formatted localized string (stripped of Windows-style
   * accelerators) where $1 to $9 are replaced by the second to the tenth
   * argument.
   * @param {string} id The ID of the string we want.
   * @param {...string} The extra values to include in the formatted output.
   * @return {string} The formatted string.
   */
  getStringWithoutAcceleratorF: function(id, var_args) {
    return replaceArgs(this.getStringWithoutAccelerator(id), arguments);
  }
};

// End of anonymous namespace.
})();
</script>
<script>
///////////////////////////////////////////////////////////////////////////////
// Globals:
var RESULTS_PER_PAGE = 150;
var MAX_SEARCH_DEPTH_MONTHS = 18;

// Amount of time between pageviews that we consider a 'break' in browsing,
// measured in milliseconds.
var BROWSING_GAP_TIME = 15 * 60 * 1000;

function $(o) {return document.getElementById(o);}

function createElementWithClassName(type, className) {
  var elm = document.createElement(type);
  elm.className = className;
  return elm;
}

// Escapes a URI as appropriate for CSS.
function encodeURIForCSS(uri) {
  // CSS uris need to have '(' and ')' escaped.
  return uri.replace(/\(/g, "\\(").replace(/\)/g, "\\)");
}

// TODO(glen): Get rid of these global references, replace with a controller
//     or just make the classes own more of the page.
var historyModel;
var historyView;
var localStrings;
var pageState;
var deleteQueue = [];
var deleteInFlight = false;
var selectionAnchor = -1;
var id2checkbox = [];


///////////////////////////////////////////////////////////////////////////////
// Page:
/**
 * Class to hold all the information about an entry in our model.
 * @param {Object} result An object containing the page's data.
 * @param {boolean} continued Whether this page is on the same day as the
 *     page before it
 */
function Page(result, continued, model, id) {
  this.model_ = model;
  this.title_ = result.title;
  this.url_ = result.url;
  this.starred_ = result.starred;
  this.snippet_ = result.snippet || "";
  this.id_ = id;

  this.changed = false;

  this.isRendered = false;

  // All the date information is public so that owners can compare properties of
  // two items easily.

  // We get the time in seconds, but we want it in milliseconds.
  this.time = new Date(result.time * 1000);

  // See comment in BrowsingHistoryHandler::QueryComplete - we won't always
  // get all of these.
  this.dateRelativeDay = result.dateRelativeDay || "";
  this.dateTimeOfDay = result.dateTimeOfDay || "";
  this.dateShort = result.dateShort || "";

  // Whether this is the continuation of a previous day.
  this.continued = continued;
}

// Page, Public: --------------------------------------------------------------
/**
 * @return {DOMObject} Gets the DOM representation of the page
 *     for use in browse results.
 */
Page.prototype.getBrowseResultDOM = function() {
  var node = createElementWithClassName('div', 'entry');
  var time = createElementWithClassName('div', 'time');
  if (this.model_.getEditMode()) {
    var checkbox = document.createElement('input');
    checkbox.type = "checkbox";
    checkbox.name = this.id_;
    checkbox.time = this.time.toString();
    checkbox.addEventListener("click", checkboxClicked, false);
    id2checkbox[this.id_] = checkbox;
    time.appendChild(checkbox);
  }
  time.appendChild(document.createTextNode(this.dateTimeOfDay));
  node.appendChild(time);
  node.appendChild(this.getTitleDOM_());
  return node;
};

/**
 * @return {DOMObject} Gets the DOM representation of the page for
 *     use in search results.
 */
Page.prototype.getSearchResultDOM = function() {
  var row = createElementWithClassName('tr', 'entry');
  var datecell = createElementWithClassName('td', 'time');
  datecell.appendChild(document.createTextNode(this.dateShort));
  row.appendChild(datecell);

  var titleCell = document.createElement('td');
  titleCell.valign = 'top';
  titleCell.appendChild(this.getTitleDOM_());
  var snippet = createElementWithClassName('div', 'snippet');
  this.addHighlightedText_(snippet,
                           this.snippet_,
                           this.model_.getSearchText());
  titleCell.appendChild(snippet);
  row.appendChild(titleCell);

  return row;
};

// Page, private: -------------------------------------------------------------
/**
 * Add child text nodes to a node such that occurrences of the spcified text is
 * highligted.
 * @param {Node} node The node under which new text nodes will be made as
 *     children.
 * @param {string} content Text to be added beneath |node| as one or more
 *     text nodes.
 * @param {string} highlightText Occurences of this text inside |content| will
 *     be highlighted.
 */
Page.prototype.addHighlightedText_ = function(node, content, highlightText) {
  var i = 0;
  if (highlightText) {
    var re = new RegExp(Page.pregQuote_(highlightText), 'gim');
    var match;
    while (match = re.exec(content)) {
      if (match.index > i)
        node.appendChild(document.createTextNode(content.slice(i,
                                                               match.index)));
      i = re.lastIndex;
      // Mark the highlighted text in bold.
      var b = document.createElement('b');
      b.textContent = content.substring(match.index, i);
      node.appendChild(b);
    }
  }
  if (i < content.length)
    node.appendChild(document.createTextNode(content.slice(i)));
};

/**
 * @return {DOMObject} DOM representation for the title block.
 */
Page.prototype.getTitleDOM_ = function() {
  var node = document.createElement('div');
  node.className = 'title';
  var link = document.createElement('a');
  link.href = this.url_;
  link.style.backgroundImage =
      'url(chrome://favicon/' + encodeURIForCSS(this.url_) + ')';
  link.id = "id-" + this.id_;
  this.addHighlightedText_(link, this.title_, this.model_.getSearchText());

  node.appendChild(link);

  if (this.starred_) {
    node.className += ' starred';
    node.appendChild(createElementWithClassName('div', 'starred'));
  }

  return node;
};

// Page, private, static: -----------------------------------------------------

/**
 * Quote a string so it can be used in a regular expression.
 * @param {string} str The source string
 * @return {string} The escaped string
 */
Page.pregQuote_ = function(str) {
  return str.replace(/([\\\.\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:])/g, "\\$1");
};

///////////////////////////////////////////////////////////////////////////////
// HistoryModel:
/**
 * Global container for history data. Future optimizations might include
 * allowing the creation of a HistoryModel for each search string, allowing
 * quick flips back and forth between results.
 *
 * The history model is based around pages, and only fetching the data to
 * fill the currently requested page. This is somewhat dependent on the view,
 * and so future work may wish to change history model to operate on
 * timeframe (day or week) based containers.
 */
function HistoryModel() {
  this.clearModel_();
  this.setEditMode(false);
  this.view_;
}

// HistoryModel, Public: ------------------------------------------------------
/**
 * Sets our current view that is called when the history model changes.
 * @param {HistoryView} view The view to set our current view to.
 */
HistoryModel.prototype.setView = function(view) {
  this.view_ = view;
};

/**
 * Start a new search - this will clear out our model.
 * @param {String} searchText The text to search for
 * @param {Number} opt_page The page to view - this is mostly used when setting
 *     up an initial view, use #requestPage otherwise.
 */
HistoryModel.prototype.setSearchText = function(searchText, opt_page) {
  this.clearModel_();
  this.searchText_ = searchText;
  this.requestedPage_ = opt_page ? opt_page : 0;
  this.getSearchResults_();
};

/**
 * Reload our model with the current parameters.
 */
HistoryModel.prototype.reload = function() {
  var search = this.searchText_;
  var page = this.requestedPage_;
  this.clearModel_();
  this.searchText_ = search;
  this.requestedPage_ = page;
  this.getSearchResults_();
};

/**
 * @return {String} The current search text.
 */
HistoryModel.prototype.getSearchText = function() {
  return this.searchText_;
};

/**
 * Tell the model that the view will want to see the current page. When
 * the data becomes available, the model will call the view back.
 * @page {Number} page The page we want to view.
 */
HistoryModel.prototype.requestPage = function(page) {
  this.requestedPage_ = page;
  this.changed = true;
  this.updateSearch_(false);
};

/**
 * Receiver for history query.
 * @param {String} term The search term that the results are for.
 * @param {Array} results A list of results
 */
HistoryModel.prototype.addResults = function(info, results) {
  this.inFlight_ = false;
  if (info.term != this.searchText_) {
    // If our results aren't for our current search term, they're rubbish.
    return;
  }

  // Currently we assume we're getting things in date order. This needs to
  // be updated if that ever changes.
  if (results) {
    var lastURL, lastDay;
    var oldLength = this.pages_.length;
    if (oldLength) {
      var oldPage = this.pages_[oldLength - 1];
      lastURL = oldPage.url;
      lastDay = oldPage.dateRelativeDay;
    }

    for (var i = 0, thisResult; thisResult = results[i]; i++) {
      var thisURL = thisResult.url;
      var thisDay = thisResult.dateRelativeDay;

      // Remove adjacent duplicates.
      if (!lastURL || lastURL != thisURL) {
        // Figure out if this page is in the same day as the previous page,
        // this is used to determine how day headers should be drawn.
        this.pages_.push(new Page(thisResult, thisDay == lastDay, this,
            this.last_id_++));
        lastDay = thisDay;
        lastURL = thisURL;
      }
    }
    if (results.length)
      this.changed = true;
  }

  this.updateSearch_(info.finished);
};

/**
 * @return {Number} The number of pages in the model.
 */
HistoryModel.prototype.getSize = function() {
  return this.pages_.length;
};

/**
 * @return {boolean} Whether our history query has covered all of
 *     the user's history
 */
HistoryModel.prototype.isComplete = function() {
  return this.complete_;
};

/**
 * Get a list of pages between specified index positions.
 * @param {Number} start The start index
 * @param {Number} end The end index
 * @return {Array} A list of pages
 */
HistoryModel.prototype.getNumberedRange = function(start, end) {
  if (start >= this.getSize())
    return [];

  var end = end > this.getSize() ? this.getSize() : end;
  return this.pages_.slice(start, end);
};

/**
 * @return {boolean} Whether we are in edit mode where history items can be
 *    deleted
 */
HistoryModel.prototype.getEditMode = function() {
  return this.editMode_;
};

/**
 * @param {boolean} edit_mode Control whether we are in edit mode.
 */
HistoryModel.prototype.setEditMode = function(edit_mode) {
  this.editMode_ = edit_mode;
};

// HistoryModel, Private: -----------------------------------------------------
HistoryModel.prototype.clearModel_ = function() {
  this.inFlight_ = false; // Whether a query is inflight.
  this.searchText_ = '';
  this.searchDepth_ = 0;
  this.pages_ = []; // Date-sorted list of pages.
  this.last_id_ = 0;
  selectionAnchor = -1;
  id2checkbox = [];

  // The page that the view wants to see - we only fetch slightly past this
  // point. If the view requests a page that we don't have data for, we try
  // to fetch it and call back when we're done.
  this.requestedPage_ = 0;

  this.complete_ = false;

  if (this.view_) {
    this.view_.clear_();
  }
};

/**
 * Figure out if we need to do more searches to fill the currently requested
 * page. If we think we can fill the page, call the view and let it know
 * we're ready to show something.
 */
HistoryModel.prototype.updateSearch_ = function(finished) {
  if ((this.searchText_ && this.searchDepth_ >= MAX_SEARCH_DEPTH_MONTHS) ||
      finished) {
    // We have maxed out. There will be no more data.
    this.complete_ = true;
    this.view_.onModelReady();
    this.changed = false;
  } else {
    // If we can't fill the requested page, ask for more data unless a request
    // is still in-flight.
    if (!this.canFillPage_(this.requestedPage_) && !this.inFlight_) {
      this.getSearchResults_(this.searchDepth_ + 1);
    }

    // If we have any data for the requested page, show it.
    if (this.changed && this.haveDataForPage_(this.requestedPage_)) {
      this.view_.onModelReady();
      this.changed = false;
    }
  }
};

/**
 * Get search results for a selected depth. Our history system is optimized
 * for queries that don't cross month boundaries, but an entire month's
 * worth of data is huge. When we're in browse mode (searchText is empty)
 * we request the data a day at a time. When we're searching, a month is
 * used.
 *
 * TODO: Fix this for when the user's clock goes across month boundaries.
 * @param {number} opt_day How many days back to do the search.
 */
HistoryModel.prototype.getSearchResults_ = function(depth) {
  this.searchDepth_ = depth || 0;

  if (this.searchText_ == "") {
    chrome.send('getHistory',
        [String(this.searchDepth_)]);
  } else {
    chrome.send('searchHistory',
        [this.searchText_, String(this.searchDepth_)]);
  }

  this.inFlight_ = true;
};

/**
 * Check to see if we have data for a given page.
 * @param {number} page The page number
 * @return {boolean} Whether we have any data for the given page.
 */
HistoryModel.prototype.haveDataForPage_ = function(page) {
  return (page * RESULTS_PER_PAGE < this.getSize());
};

/**
 * Check to see if we have data to fill a page.
 * @param {number} page The page number.
 * @return {boolean} Whether we have data to fill the page.
 */
HistoryModel.prototype.canFillPage_ = function(page) {
  return ((page + 1) * RESULTS_PER_PAGE <= this.getSize());
};

///////////////////////////////////////////////////////////////////////////////
// HistoryView:
/**
 * Functions and state for populating the page with HTML. This should one-day
 * contain the view and use event handlers, rather than pushing HTML out and
 * getting called externally.
 * @param {HistoryModel} model The model backing this view.
 */
function HistoryView(model) {
  this.summaryTd_ = $('results-summary');
  this.summaryTd_.textContent = localStrings.getString('loading');
  this.editButtonTd_ = $('edit-button');
  this.editingControlsDiv_ = $('editing-controls');
  this.resultDiv_ = $('results-display');
  this.pageDiv_ = $('results-pagination');
  this.model_ = model
  this.pageIndex_ = 0;
  this.lastDisplayed_ = [];

  this.model_.setView(this);

  this.currentPages_ = [];

  var self = this;
  window.onresize = function() {
    self.updateEntryAnchorWidth_();
  };
  self.updateEditControls_();

  this.boundUpdateRemoveButton_ = function(e) {
    return self.updateRemoveButton_(e);
  };
}

// HistoryView, public: -------------------------------------------------------
/**
 * Do a search and optionally view a certain page.
 * @param {string} term The string to search for.
 * @param {number} opt_page The page we wish to view, only use this for
 *     setting up initial views, as this triggers a search.
 */
HistoryView.prototype.setSearch = function(term, opt_page) {
  this.pageIndex_ = parseInt(opt_page || 0, 10);
  window.scrollTo(0, 0);
  this.model_.setSearchText(term, this.pageIndex_);
  if (term) {
    this.setEditMode(false);
  }
  this.updateEditControls_();
  pageState.setUIState(this.model_.getEditMode(), term, this.pageIndex_);
};

/**
 * Controls edit mode where history can be deleted.
 * @param {boolean} edit_mode Whether to enable edit mode.
 */
HistoryView.prototype.setEditMode = function(edit_mode) {
  this.model_.setEditMode(edit_mode);
  pageState.setUIState(this.model_.getEditMode(), this.model_.getSearchText(),
                       this.pageIndex_);
};

/**
 * Toggles the edit mode and triggers UI update.
 */
HistoryView.prototype.toggleEditMode = function() {
  var editMode = !this.model_.getEditMode();
  this.setEditMode(editMode);
  this.updateEditControls_();
};

/**
 * Reload the current view.
 */
HistoryView.prototype.reload = function() {
  this.model_.reload();
};

/**
 * Switch to a specified page.
 * @param {number} page The page we wish to view.
 */
HistoryView.prototype.setPage = function(page) {
  this.clear_();
  this.pageIndex_ = parseInt(page, 10);
  window.scrollTo(0, 0);
  this.model_.requestPage(page);
  pageState.setUIState(this.model_.getEditMode(), this.model_.getSearchText(),
      this.pageIndex_);
};

/**
 * @return {number} The page number being viewed.
 */
HistoryView.prototype.getPage = function() {
  return this.pageIndex_;
};

/**
 * Callback for the history model to let it know that it has data ready for us
 * to view.
 */
HistoryView.prototype.onModelReady = function() {
  this.displayResults_();
};

// HistoryView, private: ------------------------------------------------------
/**
 * Clear the results in the view.  Since we add results piecemeal, we need
 * to clear them out when we switch to a new page or reload.
 */
HistoryView.prototype.clear_ = function() {
  this.resultDiv_.textContent = '';

  var pages = this.currentPages_;
  for (var i = 0; i < pages.length; i++) {
    pages[i].isRendered = false;
  }
  this.currentPages_ = [];
};

HistoryView.prototype.setPageRendered_ = function(page) {
  page.isRendered = true;
  this.currentPages_.push(page);
};

/**
 * Update the page with results.
 */
HistoryView.prototype.displayResults_ = function() {
  var results = this.model_.getNumberedRange(
      this.pageIndex_ * RESULTS_PER_PAGE,
      this.pageIndex_ * RESULTS_PER_PAGE + RESULTS_PER_PAGE);

  if (this.model_.getSearchText()) {
    var resultTable = createElementWithClassName('table', 'results');
    resultTable.cellSpacing = 0;
    resultTable.cellPadding = 0;
    resultTable.border = 0;

    for (var i = 0, page; page = results[i]; i++) {
      if (!page.isRendered) {
        resultTable.appendChild(page.getSearchResultDOM());
        this.setPageRendered_(page);
      }
    }
    this.resultDiv_.appendChild(resultTable);
  } else {
    var lastTime = Math.infinity;
    for (var i = 0, page; page = results[i]; i++) {
      if (page.isRendered) {
        continue;
      }
      // Break across day boundaries and insert gaps for browsing pauses.
      var thisTime = page.time.getTime();

      if ((i == 0 && page.continued) || !page.continued) {
        var day = createElementWithClassName('div', 'day');
        day.appendChild(document.createTextNode(page.dateRelativeDay));

        if (i == 0 && page.continued) {
          day.appendChild(document.createTextNode(' ' +
              localStrings.getString('cont')));
        }

        this.resultDiv_.appendChild(day);
      } else if (lastTime - thisTime > BROWSING_GAP_TIME) {
        this.resultDiv_.appendChild(createElementWithClassName('div', 'gap'));
      }
      lastTime = thisTime;

      // Add entry.
      this.resultDiv_.appendChild(page.getBrowseResultDOM());
      this.setPageRendered_(page);
    }
  }

  this.displaySummaryBar_();
  this.displayNavBar_();
  this.updateEntryAnchorWidth_();
};

/**
 * Update the summary bar with descriptive text.
 */
HistoryView.prototype.displaySummaryBar_ = function() {
  var searchText = this.model_.getSearchText();
  if (searchText != '') {
    this.summaryTd_.textContent = localStrings.getStringF('searchresultsfor',
        searchText);
  } else {
    this.summaryTd_.textContent = localStrings.getString('history');
  }
};

/**
 * Update the widgets related to edit mode.
 */
HistoryView.prototype.updateEditControls_ = function() {
  // Display a button (looking like a link) to enable/disable edit mode.
  var oldButton = this.editButtonTd_.firstChild;
  if (this.model_.getSearchText()) {
    this.editButtonTd_.replaceChild(document.createElement('p'), oldButton);
    this.editingControlsDiv_.textContent = '';
    return;
  }

  var editMode = this.model_.getEditMode();
  var button = createElementWithClassName('button', 'edit-button');
  button.onclick = toggleEditMode;
  button.textContent = localStrings.getString(editMode ?
                                              'doneediting' : 'edithistory');
  this.editButtonTd_.replaceChild(button, oldButton);

  this.editingControlsDiv_.textContent = '';

  if (editMode) {
    // Button to delete the selected items.
    button = document.createElement('button');
    button.onclick = removeItems;
    button.textContent = localStrings.getString('removeselected');
    button.disabled = true;
    this.editingControlsDiv_.appendChild(button);
    this.removeButton_ = button;

    // Button that opens up the clear browsing data dialog.
    button = document.createElement('button');
    button.onclick = openClearBrowsingData;
    button.textContent = localStrings.getString('clearallhistory');
    this.editingControlsDiv_.appendChild(button);

    // Listen for clicks in the page to sync the disabled state.
    document.addEventListener('click', this.boundUpdateRemoveButton_);
  } else {
    this.removeButton_ = null;
    document.removeEventListener('click', this.boundUpdateRemoveButton_);
  }
};

/**
 * Updates the disabled state of the remove button when in editing mode.
 * @param {!Event} e The click event object.
 * @private
 */
HistoryView.prototype.updateRemoveButton_ = function(e) {
  if (e.target.tagName != 'INPUT')
    return;

  var anyChecked = document.querySelector('.entry input:checked') != null;
  if (this.removeButton_)
    this.removeButton_.disabled = !anyChecked;
};

/**
 * Update the pagination tools.
 */
HistoryView.prototype.displayNavBar_ = function() {
  this.pageDiv_.textContent = '';

  if (this.pageIndex_ > 0) {
    this.pageDiv_.appendChild(
        this.createPageNav_(0, localStrings.getString('newest')));
    this.pageDiv_.appendChild(
        this.createPageNav_(this.pageIndex_ - 1,
                            localStrings.getString('newer')));
  }

  // TODO(feldstein): this causes the navbar to not show up when your first
  // page has the exact amount of results as RESULTS_PER_PAGE.
  if (this.model_.getSize() > (this.pageIndex_ + 1) * RESULTS_PER_PAGE) {
    this.pageDiv_.appendChild(
        this.createPageNav_(this.pageIndex_ + 1,
                            localStrings.getString('older')));
  }
};

/**
 * Make a DOM object representation of a page navigation link.
 * @param {number} page The page index the navigation element should link to
 * @param {string} name The text content of the link
 * @return {HTMLAnchorElement} the pagination link
 */
HistoryView.prototype.createPageNav_ = function(page, name) {
  anchor = document.createElement('a');
  anchor.className = 'page-navigation';
  anchor.textContent = name;
  var hashString = PageState.getHashString(this.model_.getEditMode(),
                                           this.model_.getSearchText(), page);
  var link = 'chrome://history2/' + (hashString ? '#' + hashString : '');
  anchor.href = link;
  anchor.onclick = function() {
    setPage(page);
    return false;
  };
  return anchor;
};

/**
 * Updates the CSS rule for the entry anchor.
 * @private
 */
HistoryView.prototype.updateEntryAnchorWidth_ = function() {
  // We need to have at least on .title div to be able to calculate the
  // desired width of the anchor.
  var titleElement = document.querySelector('.entry .title');
  if (!titleElement)
    return;

  // Create new CSS rules and add them last to the last stylesheet.
  // TODO(jochen): The following code does not work due to WebKit bug #32309
  // if (!this.entryAnchorRule_) {
  //   var styleSheets = document.styleSheets;
  //   var styleSheet = styleSheets[styleSheets.length - 1];
  //   var rules = styleSheet.cssRules;
  //   var createRule = function(selector) {
  //     styleSheet.insertRule(selector + '{}', rules.length);
  //     return rules[rules.length - 1];
  //   };
  //   this.entryAnchorRule_ = createRule('.entry .title > a');
  //   // The following rule needs to be more specific to have higher priority.
  //   this.entryAnchorStarredRule_ = createRule('.entry .title.starred > a');
  // }
  //
  // var anchorMaxWith = titleElement.offsetWidth;
  // this.entryAnchorRule_.style.maxWidth = anchorMaxWith + 'px';
  // // Adjust by the width of star plus its margin.
  // this.entryAnchorStarredRule_.style.maxWidth = anchorMaxWith - 23 + 'px';
};

///////////////////////////////////////////////////////////////////////////////
// State object:
/**
 * An 'AJAX-history' implementation.
 * @param {HistoryModel} model The model we're representing
 * @param {HistoryView} view The view we're representing
 */
function PageState(model, view) {
  // Enforce a singleton.
  if (PageState.instance) {
    return PageState.instance;
  }

  this.model = model;
  this.view = view;

  if (typeof this.checker_ != 'undefined' && this.checker_) {
    clearInterval(this.checker_);
  }

  // TODO(glen): Replace this with a bound method so we don't need
  //     public model and view.
  this.checker_ = setInterval((function(state_obj) {
    var hashData = state_obj.getHashData();

    if (hashData.q != state_obj.model.getSearchText(term)) {
      state_obj.view.setSearch(hashData.q, parseInt(hashData.p, 10));
    } else if (parseInt(hashData.p, 10) != state_obj.view.getPage()) {
      state_obj.view.setPage(hashData.p);
    }
  }), 50, this);
}

PageState.instance = null;

/**
 * @return {Object} An object containing parameters from our window hash.
 */
PageState.prototype.getHashData = function() {
  var result = {
    e : 0,
    q : '',
    p : 0
  };

  if (!window.location.hash) {
    return result;
  }

  var hashSplit = window.location.hash.substr(1).split('&');
  for (var i = 0; i < hashSplit.length; i++) {
    var pair = hashSplit[i].split('=');
    if (pair.length > 1) {
      result[pair[0]] = decodeURIComponent(pair[1].replace(/\+/g, ' '));
    }
  }

  return result;
};

/**
 * Set the hash to a specified state, this will create an entry in the
 * session history so the back button cycles through hash states, which
 * are then picked up by our listener.
 * @param {string} term The current search string.
 * @param {string} page The page currently being viewed.
 */
PageState.prototype.setUIState = function(editMode, term, page) {
  // Make sure the form looks pretty.
  document.forms[0].term.value = term;
  var currentHash = this.getHashData();
  if (Boolean(currentHash.e) != editMode || currentHash.q != term ||
      currentHash.p != page) {
    window.location.hash = PageState.getHashString(editMode, term, page);
  }
};

/**
 * Static method to get the hash string for a specified state
 * @param {string} term The current search string.
 * @param {string} page The page currently being viewed.
 * @return {string} The string to be used in a hash.
 */
PageState.getHashString = function(editMode, term, page) {
  var newHash = [];
  if (editMode) {
    newHash.push('e=1');
  }
  if (term) {
    newHash.push('q=' + encodeURIComponent(term));
  }
  if (page != undefined) {
    newHash.push('p=' + page);
  }

  return newHash.join('&');
};

///////////////////////////////////////////////////////////////////////////////
// Document Functions:
/**
 * Window onload handler, sets up the page.
 */
function load() {
  $('term').focus();

  localStrings = new LocalStrings();
  historyModel = new HistoryModel();
  historyView = new HistoryView(historyModel);
  pageState = new PageState(historyModel, historyView);

  // Create default view.
  var hashData = pageState.getHashData();
  if (Boolean(hashData.e)) {
    historyView.toggleEditMode();
  }
  historyView.setSearch(hashData.q, hashData.p);
}

/**
 * TODO(glen): Get rid of this function.
 * Set the history view to a specified page.
 * @param {String} term The string to search for
 */
function setSearch(term) {
  if (historyView) {
    historyView.setSearch(term);
  }
}

/**
 * TODO(glen): Get rid of this function.
 * Set the history view to a specified page.
 * @param {number} page The page to set the view to.
 */
function setPage(page) {
  if (historyView) {
    historyView.setPage(page);
  }
}

/**
 * TODO(glen): Get rid of this function.
 * Toggles edit mode.
 */
function toggleEditMode() {
  if (historyView) {
    historyView.toggleEditMode();
    historyView.reload();
  }
}

/**
 * Delete the next item in our deletion queue.
 */
function deleteNextInQueue() {
  if (!deleteInFlight && deleteQueue.length) {
    deleteInFlight = true;
    chrome.send('removeURLsOnOneDay',
                [String(deleteQueue[0])].concat(deleteQueue[1]));
  }
}

/**
 * Open the clear browsing data dialog.
 */
function openClearBrowsingData() {
  chrome.send('clearBrowsingData', []);
  return false;
}

/**
 * Collect IDs from checked checkboxes and send to Chrome for deletion.
 */
function removeItems() {
  var checkboxes = document.getElementsByTagName('input');
  var ids = [];
  var disabledItems = [];
  var queue = [];
  var date = new Date();
  for (var i = 0; i < checkboxes.length; i++) {
    if (checkboxes[i].type == 'checkbox' && checkboxes[i].checked &&
        !checkboxes[i].disabled) {
      var cbDate = new Date(checkboxes[i].time);
      if (date.getFullYear() != cbDate.getFullYear() ||
          date.getMonth() != cbDate.getMonth() ||
          date.getDate() != cbDate.getDate()) {
        if (ids.length > 0) {
          queue.push(date.valueOf() / 1000);
          queue.push(ids);
        }
        ids = [];
        date = cbDate;
      }
      var link = $('id-' + checkboxes[i].name);
      checkboxes[i].disabled = true;
      link.style.textDecoration = 'line-through';
      disabledItems.push(checkboxes[i]);
      ids.push(link.href);
    }
  }
  if (ids.length > 0) {
    queue.push(date.valueOf() / 1000);
    queue.push(ids);
  }
  if (queue.length > 0) {
    if (confirm(localStrings.getString('deletewarning'))) {
      deleteQueue = deleteQueue.concat(queue);
      deleteNextInQueue();
    } else {
      // If the remove is cancelled, return the checkboxes to their
      // enabled, non-line-through state.
      for (var i = 0; i < disabledItems.length; i++) {
        var link = $('id-' + disabledItems[i].name);
        disabledItems[i].disabled = false;
        link.style.textDecoration = '';
      }
    }
  }
  return false;
}

/**
 * Toggle state of checkbox and handle Shift modifier.
 */
function checkboxClicked(event) {
  if (event.shiftKey && (selectionAnchor != -1)) {
    var checked = this.checked;
    // Set all checkboxes from the anchor up to the clicked checkbox to the
    // state of the clicked one.
    var begin = Math.min(this.name, selectionAnchor);
    var end = Math.max(this.name, selectionAnchor);
    for (var i = begin; i <= end; i++) {
      id2checkbox[i].checked = checked;
    }
  }
  selectionAnchor = this.name;
  this.focus();
}

///////////////////////////////////////////////////////////////////////////////
// Chrome callbacks:
/**
 * Our history system calls this function with results from searches.
 */
function historyResult(info, results) {
  historyModel.addResults(info, results);
}

/**
 * Our history system calls this function when a deletion has finished.
 */
function deleteComplete() {
  window.console.log('Delete complete');
  deleteInFlight = false;
  if (deleteQueue.length > 1) {
    deleteQueue = deleteQueue.slice(2);
    deleteNextInQueue();
  } else {
    deleteQueue = [];
  }
}

/**
 * Our history system calls this function if a delete is not ready (e.g.
 * another delete is in-progress).
 */
function deleteFailed() {
  window.console.log('Delete failed');
  // The deletion failed - try again later.
  deleteInFlight = false;
  setTimeout(deleteNextInQueue, 500);
}

/**
 * We're called when something is deleted (either by us or by someone
 * else).
 */
function historyDeleted() {
  window.console.log('History deleted');
  historyView.reload();
}
</script>
<style>body {
  background-color:white;
  color:black;
  margin:10px;
}
.header {
  overflow:auto;
  clear:both;
}
.header .logo {
  float:left;
}
.header .form {
  float:left;
  margin-top:22px;
  margin-left:12px;
}
html[dir='rtl'] .logo {
  float:right;
}
html[dir='rtl'] .form {
  float:right;
  margin-right:12px;
}
.page-navigation {
  padding:8px;
  background-color:#ebeff9;
  margin-right:4px;
}
.footer {
  height:24px;
}</style>
<style>
#results-separator {
  margin-top:12px;
  border-top:1px solid #9cc2ef;
  background-color:#ebeff9;
  font-weight:bold;
  padding:3px;
  margin-bottom:-8px;
}
#results-separator table {
  width: 100%;
}
#results-summary {
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
  width: 50%;
}
#edit-button {
  text-align: right;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
  width: 50%;
}
#editing-controls button {
  margin-top: 18px;
  margin-bottom: -8px;
}
#results-display {
  max-width:740px;
}
.day {
  margin-top:18px;
  padding:0px 3px;
  display:inline-block;
}
.edit-button {
  display: inline;
  -webkit-appearance: none;
  background: none;
  border: 0;
  color: blue; /* -webkit-link makes it purple :'( */
  cursor: pointer;
  text-decoration: underline;
  padding:0px 9px;
  display:inline-block;
  font:inherit;
}
.gap {
  margin-left:18px;
  width:15px;
  border-right:1px solid #ddd;
  height:14px;
}
.entry {
  margin-left:18px;
  margin-top:6px;
  overflow:auto;
}
table.results {
  margin-left:4px;
}
.entry .time {
  color:#888;
  float:left;
  min-width:56px;
  margin-right:5px;
  padding-top:1px;
  white-space:nowrap;
}
html[dir='rtl'] .time {
  margin-right:0px;
  margin-left:5px;
  float:right;
}
.entry .title {
  max-width:600px;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}
.results .time, .results .title {
  margin-top:18px;
}
.title > .starred {
  background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAALCAYAAACprHcmAAAB80lEQVQYGQXBXUhTYQAG4Pf7znfO/qJpHklBcw4SdTS3tF8wN2q2BiVMZxgkJMHqIugiCEy8sBkE3XUxiJRJUXQzSsWUEEsjdZBJFtWG28IuVq4azra5nbPT87DzPWHYTurx66cExhEkk8V783M/rtbU7vWLIndDrSFoNKkwN5sCAwBFAXQ6iooKoSG6nnB4+x5pJ2c6HYbaAw28IH1RFAUAwCgFBJ6W53mCb2HSJpbGzR7PONY+G8yxuKXNZEJSpSKgFJsslyO3wuGCT8rLiERkdJxZREl5AsbqEILTnX6dlvdLEsF2mgywT2ubvtYjARw8vA4puxsW6yqUPMPF3mU0mvshaIuYDEr4sHLFx5yuqo35t7pqU/0y2s9+B/IaFAsCysQkHPZnmJrW4GukD05X5QZrP73LtrR0+eYlb5N7jN4WTzk/ghYBQMbIqBEDQ9eTXT3dwdYT7C5Tq0m05RDnXV2ps/7dqhEVOYTU7yz0pQSUctgjHo/V7SfezD8ZLLejQKsVBsWyLeux5vcIPKzE+Es7zrne4GhLFPuqQlaOGQdTqZ0hNvE8DUClz2xPsQcjBDOvh1GQ7cHA05B7YXEYKv4dm3jh0gM5sCaLGjxPs2OjzZl0xoYLvfX3Z1/96e/qdt558thwLR5LwO3hspKkwX/RB7soMZzqHQAAAABJRU5ErkJggg==");
  background-repeat:no-repeat;
  display:inline-block;
  margin-left:12px;
  margin-right:0;
  width:11px;
  height:11px;
}
html[dir='rtl'] .title > .starred {
  margin-left:0;
  margin-right:12px;
}
.entry .title > a {
  -webkit-box-sizing: border-box;
  background-repeat:no-repeat;
  background-size:16px;
  background-position:0px 1px;
  padding:1px 0px 4px 22px;
  display:inline-block;
  overflow:hidden;
  text-overflow:ellipsis;
}
html[dir='rtl'] .entry .title > a {
  background-position-x:right;
  padding-left:0px;
  padding-right:22px;
}
#results-pagination {
  padding-top:24px;
  margin-left:18px;
}

</style>
</head>
<body onload="load();" i18n-values=".style.fontFamily:fontfamily;.style.fontSize:fontsize">
<div class="header">
  <a href="" onclick="setSearch(''); return false;">
    <img src="data:image/png;base64,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"
         width="67" height="67" class="logo" border="0"></a>
  Debug: this is History 2
  <form method="post" action=""
      onsubmit="setSearch(this.term.value); return false;"
      class="form">
    <input type="text" name="term" id="term">
    <input type="submit" name="submit" i18n-values="value:searchbutton">
  </form>
</div>
<div class="main">
  <div id="results-separator">
    <table border="0" cellPadding="0" cellSpacing="0">
      <tr><td id="results-summary"></td><td id="edit-button"><p></p></td></tr>
    </table>
  </div>
  <div id="editing-controls"></div>
  <div id="results-display"></div>
  <div id="results-pagination"></div>
</div>
<div class="footer">
</div>
</body>
</html>
<!DOCTYPE html>
<html i18n-values="dir:textdirection;bookmarkbarattached:bookmarkbarattached">
<head>
<title i18n-content="title"></title>
<style>
body {
  margin:10px 8px 10px 8px;
}
html[dir="ltr"] .icon {
  float:right;
  margin:0 6px 0 3px;
  -webkit-transform: scale(-1, 1);
}
html[dir="rtl"] .icon {
  float:left;
  margin:0 3px 0 6px;
}
.content {
  border-radius: 5px 5px;
  background-color:#eee;
  color:black;
  padding:10px 10px 10px 10px;
  max-width:600px;
  margin-left:auto;
  margin-right:auto;
  margin-top:66px;
}
.extensionsmessage {
  color:black;
  padding:10px 10px 10px 10px;
  max-width:600px;
  margin-left:auto;
  margin-right:auto;
  margin-top:5px;
}
.extensionicon {
  float:left;
  margin:10px 5px 0 0px;
  width:30px;
}
</style>
<script>
// Until themes can clear the cache, force-reload the theme stylesheet.
document.write('<link id="incognitothemecss" rel="stylesheet" ' +
               'href="chrome://theme/css/newincognitotab.css?' +
               Date.now() + '">');
</script>
</head>
<body>
<div class="content" i18n-values=".style.fontFamily:fontfamily;.style.fontSize:fontsize">
  <img src="data:image/png;base64,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" class="icon" />
  <span i18n-values=".innerHTML:content"></span>
</div>
<div class="extensionsmessage" i18n-values=".style.fontFamily:fontfamily;.style.fontSize:fontsize">
  <img src="data:image/png;base64,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DJJKUUmECKKyRBQgYDMAmRUlkEooxHFxeVjWWiohUQpipajUOK586g+e966nP2B/ccvsT7VGZZVwcnbhzXcO3rl3aaCjSkallhnWyshaGePpp267unqotSRFEwFKUhAglQUIAFuRiGKVSiVMVCo1rg5Hx+MCChSkaGilIQt5+ZXXnZxe2La9iVqUijgclusX587OTrSWQGoBRmVkAcJHvvxDHj68jxQVi0plRSVpUSmEUqkAbIpYSLR0XFZRjmWVosbhsByPR8WKtVJZi1YqQamIr/7YVzgcLh2vHlqllbWWFofDwW6O/tCXPePdT95yOC4aBVmLIlQGC4P3PfuMw9WV1mItWpIFhShKsaAotQAE2IAoRY2wDFGpkFWujjmWikKWVNbQStFCzDY+8uEP+Pqv/bDL+2+5unpoIePYstuW7/n2r/Ed3/JxZnMsS4oVM4tShNaihOvXr9PRWkulRqFlNYqkohAAjUJRYDOEVkISlIoiCrN5596ly8srg0oLJVFMoEllxenJ3n/657/XlzxzzTt33lQLefDgoU987Fnf+q991HFlrUURRNQIFcVsxti2zW63OdmxjgchgFAqApJKpahkSQA2oSirRUtraaXSSmWt7HY7v/eZF719574bN645Ozt1enZqv9/b73Z22w6DMGbb7LfNycmp05O9Dz33pHt33tTxqJXp6N23b7r92E3H4xHMDJjZ7PY7+9MT52enrl+cOzs/1zq6f/+e115/3SuvvOb05MRqWS2VSiUpKhWoJBWYBQDsQ9HEylqZyQwLY1TIfrfz2Rfe9FM/+ys+/NwTzs72TvY7N25cc3JyovLYrVugcjwevfnWHa+/8YZP//7n/eKv/I7zi3O11Cb53Bde8fkvvurmjWvWWo4ryt179zx48MBbb9311p277tx9x50797319tvuvPPAnTv3vfbWPbuzm2Z2RGtJRNCSFAqjwlIDKgD7KVAISIKFSQbMjLv3Dv7G3/05+/WOJx+/7ux058nbt1xcnFvHo+fe+zQIDx8+9MUXX/HZ51/wu7/3RTcee7ebj93GqOx2e7/0G5919eAdX/Ls4x4+vHQ4HK3Gm2+97c6dd7zw8mteevl1L736urv3Dk5PL5ycnjs5O3d6ds3Z9cdsu71WEoUoxWpoYSmsZGSZEAL2sKRSSSqCAQkwdienbj/5tMPhobeurqzLgy+88ba13tQ6+tlffl5lyczY7/b2J+fe9dxX2p2c2ba9DGW3bR5e7fzjX/oD/+Dnft3xcKlidrbd3rbb2+1O7E+e8PgzT3tit8Nmm02zYWQEUoAQgQBDS0hCAIB9hqJoWSszScYoGAYw2Pb2J3v7EyoNihIsEmjQAMYSLcXEttu7/sjjrt24pbWEmdEMDQARMgxTSGtkGdGoJKJCghKSimIGAOwBRKWVNYGGZAwxRoAwCILBABNGEGQtWIAUBcnGDLudCQKQiEQoa1CCUklIUQuI0FpIqCiQEBrYk0qSgIWNCpAAAaBoAsUYq0xZmKGFSTFDRUDFUFECIxFABEAWwSAJoyAAEwsVUgQBAIDB7DFKjWjVmMwiMZtkEIIAw1oAZLFYA6wFsYBWSEYCQhRBISsGkIiGjClKKFhAJGKJFlEEQgBKMTBjv5+Zy+qq1r6a1bLFMkBHjGBSMEihQQyVwVpjUAGRgEiSIARLRmVkYhkzEUumoYRiILIUAJWCiKBUYGaAmt1us9vvrmbmYn/5zltv4hfWOn7DOi7bbmk2JCOMCAMjC4QBy1oDSAtDBcRqmRkFCVCpgBIMookiAlECFEoQCSgVhpJlAqA0Y64OBzcuTu89fuvaG9u2Xds++MEPvPLqi1/8gXv3Lx3X0Vqr1iIQSZosWVKpTKxSKMpxxWStkEoSVkmgUgGAAJUlSlGxUikqlcpCJRGiYJBEMMwwY7Zmtnrt9Ts+/tHnnv/GT37Zp3bbrN2rLz+/fvKnfuFzq+2p19+8+/Hdtptt29m2CSNEIRRFEURRKgNlJFFWGSFKhSQKqZAKURSFEIUQQpTBWEwIjAwM24wZZlTNw4dXXn7lzfnKDz/9xl/8c//Gz3zdxz/0i7vd9nuz1tqV0//2r/29937qMy//5//s1z/7x9+8+/CZy4frxGwMQDIqlQEEAQ1QKAQqYYwkmVgBBCySYBCJACICBAUEASAAAOuY09MTjz968eDjX/ncK9/37/wrP/+v/7Gv+EcX5ye/XP3WrLUGZ9XNT33mpad+4Zc/9a0vv/b2H7n34Or97PYzMQQBAAIKYoBCAEAgAFAABCICAAABAQFAABDCAACodudn+8t3P/noa9/89V/52+977xO/vt/vfqv6XXprjscjzMyc4ZG1eiw9KY+bucAGAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAADNmjIfbzGv4HL6A+9u2+f8BQZBxVXgcMMUAAAAASUVORK5CYII=" class="extensionicon" />
  <span i18n-values=".innerHTML:extensionsmessage"></span>
</div>
</body>
<script>
function themeChanged() {
  document.getElementById('incognitothemecss').href =
      'chrome://theme/css/newincognitotab.css?' + Date.now();
}

function bookmarkBarAttached() {
  document.documentElement.setAttribute("bookmarkbarattached", "true");
}

function bookmarkBarDetached() {
  document.documentElement.setAttribute("bookmarkbarattached", "false");
}
</script>
</html>
<!DOCTYPE HTML>
<html i18n-values="dir:textdirection;">
<head>
<meta charset="utf-8">
<title i18n-content="labsTitle"></title>
<style>
body {
  margin: 10px;
  min-width: 47em;
}

a {
  color: blue;
  font-size: 103%;
}

div#header {
  margin-bottom: 1.05em;
  /* 67px is the height of the header's background image. */
  min-height: 67px;
  overflow: hidden;
  padding-bottom: 20px;
  padding-left: 0;
  padding-top: 20px;
  position: relative;
  -webkit-box-sizing: border-box;
}

html[dir=rtl] #header {
  padding-right: 0;
}

#header h1 {
  background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEMAAABDCAYAAADHyrhzAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RjlEODlCODhBQzlFMTFERjg4QUNCRDM0RjRDQjhBNkUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RjlEODlCODlBQzlFMTFERjg4QUNCRDM0RjRDQjhBNkUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBQTZGMjhCNUFDNzQxMURGODhBQ0JEMzRGNENCOEE2RSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBQTZGMjhCNkFDNzQxMURGODhBQ0JEMzRGNENCOEE2RSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjzXBq0AABE7SURBVHja3Fzrrx1V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") 0px 20px no-repeat;
  display: inline;
  margin: 0;
  padding-bottom: 43px;
  padding-left: 75px;
  padding-top: 40px;
}

html[dir=rtl] #header h1 {
  background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEMAAABDCAYAAADHyrhzAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RjlEODlCODhBQzlFMTFERjg4QUNCRDM0RjRDQjhBNkUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RjlEODlCODlBQzlFMTFERjg4QUNCRDM0RjRDQjhBNkUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBQTZGMjhCNUFDNzQxMURGODhBQ0JEMzRGNENCOEE2RSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBQTZGMjhCNkFDNzQxMURGODhBQ0JEMzRGNENCOEE2RSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjzXBq0AABE7SURBVHja3Fzrrx1VFV975pxzz31AW8AiaamtQLm2PPqQtqEFLBIIVsUKpIqPEBApJCb6CeMfYDRGY+IHQjQxMUGiftHPaPgCUayQqBEEiaLhEUVefd17z5nZy7Xfaz/m9LSpX7h0uHNm5uzZe+3f+q3HXvsKMD+CjoqOnj0qeO/+tPZo6JB0IDAhqKOmo3/hhivn1y3efJ+o+7fRsaOqqr4QlX7gVD9oGwLeur+JyfX0DN2/vFH3hD3HpF1k7bsv+Y+YvANgLLB9lo5fvvWvpx/+5wtPnbCCQWCCGHxoz2c2za7e+Iu6P9gyGAxg0O9D3auBBAJClMWhLiM1IUodicdSlBKmQkF2BcNIMGkbI+GiOaQ7Q5AYCwidsFX7UkIjW8Bx8xw0Rz/5zOM/+IdrRI1jQIg4d92WA0/2B8PLZ+eGMBwOoUfCqOoeCcOARwlEtS8sloR9n5NTNHCRzAqfVcwwAREsMAjJoSG0FRCEGL9Af7bfRSs4PXj/fSUIc61tWhg3Y2jHzV9x+bUdRx5/ZJmuo+KHWqkGIUILYnZuDmaUMHokiLqCitTEDd7/TwRgCRFmTAssxXs02wwNmKMBJ6AhBoz9jnSDd19yQrBPSPVP/VbXpQUQ0tgkVE0NI7GyCNVFD9J7v6u639MjqvsHlWooRChBqPNIRfQ/YdQChUUDOj1hOoMT0YAJGmLdTrgBc8R59UAMz9gBOqHaMWsBQEVKbH9LrEyXlWCE1Oqt2pEVHKKnf0LHkrYaVd3fpjiiT4dChBFErQWhxlhpgVh1qZwwhBWQfsAwsX1OONtUufvms78P4FVPWDnas9C2e5/neIh1FIT7IrMDGat5NRYOzvrRSqO+JhogjGyjK+fTMae6icpqKAGI2qiGtiDuXZorQqed3VBCcW9Sd9F3ngkKAqrCIMAKpDRAiM7d+5Qqei11lO24ygnXvYe9A21f0QrC/0bThhpDTWOni/N0zFTme5VWicrOZFW5PlpBVPGM8Rk2QrGOiUgGqj5iIqQwVZGQ0M60G7aGsR0sJoOMvALMkREeFYzPrShRsMf9d7RvxcYg2ES5FylBMDSI8FLheUL48wgNDlpVLiQxEQ2JuoCInhFWQJFABXrMRNJIrLngPo23POHhXqpjTghG99EM1qIB3XsFc68E12mHBsNfQPa8JUZTth0DzZ/Sb8DUxKoho+Ugkq5XDY066eFvVEqAlIYbFJmCgJiMhblhrJ4w5FsUhuMXgR5GboYRYkEIr71W3oL5AKqLkux420A7GkHTjun9jelkZHq5QOLfsWgUQmvSb/J9egNN7ljV5i6zYka94oaUmkbmHNFbEjc5kTC8wyYCRVV+kKpBDLC3IjDXhRGCe6l9Vtl0Sah49NtfyE0rlj1OzMwrN6Xm3qfu/x70hwtk9Ybawgml5dJMjEzjAi+E4LKjCGjyWMIuZDDWdm0GNISr6C0IeiGg8BI1Xt54xOCZOlM8rkg9ztjT5M+dPPYmzGqmqzVSFPFjpOISuNMqrLvhJtihAbkXy5BRFSIaFsaJQFY8FBPOUDEewWDONDLaNkYDH5xzkAqut3erMRfYeOUkudIjrX7O8xSCO3gi8VaRectoUOstVh4f9ZLRx2SMFgcRZ/CBm2sogj5yS4FJNBq729OhIYpHOAowuY6OMSO9Z+TsJgotwWeNptYksLphbyNJLwSRdMYiwwVsWmXQOYc1HDz8fTjx7htw8vjbsHT8HTjym0ej4AuLJBoEsWXnjZojZubOgeHcKhjOr1HesvaJyEP0ehCo1lkKR6YyuOks3PfxjMBuzsDUVmOwFFol3ECZyjg08JhC0S8FfjAYzuuXKwvQoyMmxMSkFtCgBDF3znkwXFhDwlgNg1kiz5kFEsjAt2MmzobtKbr4exAizjP3RUFNvDTi2NsJwVsKa5uR6ZEXkhOE5plKh//94ZwhOzpXZDcNGpDd6w+GhIZVMKuEMb+aPs9T3NQn8uzpd0QRsROEAJ/bgMhiuMHLEFAmIXEvjTI92TlL4Tw9+yLh0eA0JQnh7T1BAXGvJlHN1FpkrfI1pkADF5ZG1GBWo6E/Mw+9/qxNEwjlf5H5hih6jVWB8RgIk9+zIS06Ei9zRpwV0trH0OB8EDd4h4bI34n00mlRbaPDvoZ26jeU0MCfMfFSX6NBcYVCWDSrnjPj1AGmYT5gEv7nqYIygSIwNKB3ff3LrS1FhIm80W0hJqOBC9VnqxAiH8E9m7XLEOLNM2snJtNcVXocDRl8XfImQoPRPZgW8hEkwyChAw3pdeXCt61K0ykr0bAEjkrjoTWRbJBorqPLcKlJktKm/Yy0pJWaaldiwc/AZFAxNwgGRZfxStDgY8IyGsJs5ve7hNm2Une4bRB66lxgAQ3IvpMKnQkHpf8spSHRZkxCHo9LBIpRh1xEytHghFBCA4hup4l7m9OgIeHykOCd4JhhMTXIE8bgna7I3yhxRuwl2sFzNHjeKKPBWx7WSWlnZayy0TQL0axN8jS5p4oxd+TfidEScQtLEAMXfoLYnEAxni3PDYJ5SX59oIAGhwCl4zZ/0bZONylWsTBN0TCRXM0qSPAqi5wzGW0cDXzpAFnAlnAG02mvLgk3WE/Po4ShwRGZtIKIZ9pmenA6NEQDQbfWAVqYVaJCwC1NZH0wbzNRD46sJGrNZwsRMolySesx0owbEmq1KhhEcB23FoHOtlx6UbyuwQYSTCFG17ddcTmdtAZVMu8DTkBDakYDoUJ2xASKcQYqdqhiNChPrFWNKpbHMMMCRJHgFFpQ2gFNg4bofqtXv6RstHlUbaVJmSIx4yQ0dK3RWmRwJHB/Pp0JxQHjcaMPdZ4/A1GEiDbrpczjNVdumgoNwJCzb88O+u5I50acQLDTEmEZyQkaefvJkixXk0S/AuVTZ4xFaJQQJMb6nrF3PGA9kKaB3dsuTQQFnbB316+7loQxXtGHbBvtH6BDWPauEhljh9XhdjvlDIzjEtdBxYVNI40QWhkt5k5CQyBAqQex+MH3wdrzz80EVZwtJuD3X7gWrlj8AL1/mfqxotHhkspFNGDSrwIy8okoqEkU/TE0KJ2NGbyMBsheLC3BrsCdt+7MTCJOCesvHjoA45UT0KwsW4S0ycC7LFSSDI6QzFOFmOdAfUdV/QKhQfGCZDp6Sm6IZsuwv8pXXrdzE2zdvGEqNJTa237VItx47VUwHpFARsskjJHtFxZUpTQpHA3sN3RxhuMG5S22CRoQTwMN5twEV2MY1BLuvn1fNxoSnYeScOj8gXtuh0HVwEgJxPKHT/elaMAuNHSH8xkymtagoZ0aDZCgwb3ArJk04xEc/uw+mJudKevuBFWB5H3z83Pw1fs+DaOTR43KEH+0Wl1kTqKTuKHwTLZUYKJD6TPG06EBCzA3PKF0e9/2DbDr6ksZnEvWphsN6fne3dvgI7sXYbR8jPhjiSZtZB0xeQZoQBavJJzRNGMTVGXmblo0oCddpR7r1y6QeuyNZ+tUxFl4HyT377/7ILU9D2MSSDsidKh+e8+0jIZu3yJP+xk1kck6Rhca0iCHk57liZkeknpc59VjWjR0Iy70R6vLl++AlaV3jUBIXVAtKMkyGqCj0idSwxQZpbwAwDRoYGZUrbhT5w7edCVsvHjtWUMDJqH5JRsvhnsO3UTqYvhDTYCxLjJuqwsNcYzd4WcgXwZklXMFLy/uOHWiNWZ0++JFcGD/tg404BmhoaSmBw/shx1bN8B4SfHHSfJwR9YZk511X0XVgaIHisXgB0poSDquZkXNzuqFPjz4uf0T0ABnjIZMmPTf1w4fgjXnVDCy1kW2lj+60JBFs0klYrTwXJopOJXPb71M6swDjCf+H2hIzeMC8cdX7j1I3PEuoeOERoeKjsGqS46GtNwyX2uNo9bU55cYL+Oz31KbUdSduGXvZth62fop0IATcySnQkO6hHD1FZvhYzfuIHSQuoyWqC/jWF0iNJTThrk7HlmGkF0qpsvsb6mz12Q9+kixxzUTfQWYEEqfDhogCwQB7rrjFhiIsSFTzR2NrwVNuQET1CSJrjhqhULavTxIU6elZuLzt+0y6tGRcDnbaEhrORbm5uDeu24lVTlOXu9JbWpNkazMuYGjAeOCbaYmPKkjWSCDse6hyXUiGFScd24f9u/ZMtFz7EysTOk6l9CASQXxzfv3UF8G5Igtae9X+x7pckAUdefvyJM77kEpPV/4jkvJcp+tfuHOrRs60QCT8qfZAE8PDVHa0D67a/tmbWYbFdU2jU01cjXE4ETygC6zJoWOSwYlmaTxtDkl3bxh9+VnBQ1wumjI1l8AbrphN6mJItFlwxsllU/KqIJwsmo/KwRdd47ZPglkVTtS80UDG9evzYgVT7FaBiUhTKjXyIvq0xV38/mSTRu0B6zilbpvMmKikvGSQFKqkGIjlCRIjKrzo94JERWyoHa0mnI9xCShdC1Ml/KwaankhF0KHsGqBkQnj1sQKmfpCmSYpeQxTJog78X6jpYvpK/kC2UHku0nSRo/W2goFctOQEO8tcX2HVu/Si/4YjS4Wo5QBMdrO2I/g7/UheQ+MSw9IrieHT+xPGUar4MbMC0qKa2BYOJBlgVx7PgJUyQLlV8G1St9ETdgWAPOGwmmNXWVpUcJBuJ0ESqar/7op7/utBSYLveVLAUjyJKlwDSijorg491HD//wMRD1kI46lHDzWo40vOeFX6WSBF7DALZYTSLaCkNbsSNDaeMTT78Ar77+Onz8ox+Gq7deBvPzszmcuzLYE2pAsx1IXWg4dgKe/O0RePyJ38FfXnwFBrOrtUCgMnVkIDEuwbbxFMryDsxe5HnaZK7bVoGh1pEtNLvV+Rrq3gCe//ub8MfnfqE9wFZlr+U4VM4gFDfl4aRtnvn2y+x7yMp3VZ1X3RuSINZAPVigc/KGRc/Wrga1cBJINwGWSxIg6JXmBlvpq/ZzCV625BZhdUnjEPozoOu4e/05m1dovRcL3Hyle02TfaqRmesotud2Hm11oVA7Ueu+nhhRq870/b66wGcycrzS0i0n2x5AIVuNbL+oq530+6BCmZMuZqeZqNVMKHjqFa82T66k21snVNxxtxmgsJsx2i8Kuh5UqawWitpgWBnOMFwhEw+0tL8FwO7t1bsX1dMjkt0ArLeptyBIVvpoKynDaryVur6v9rWpDX49W0Nh6y25DZ9QAAuTqoWhtOuRl0gLW5FoNuEJtyMxJHYTSyazTcdVVS3R2dAJoyUBPIut3KNmtdK7eIwDJlBYTKDdoSFtrbitkpUQyo91Zyqrp710J40tTnWFP6yILtnd7HepMTQItmVCC6p259y7dB5EskRQcLt5cfiaVXOv0MmCUxNyJsc/p1hjj1o7qerW6CJBLjJvnpUtShC8Cgm2Ywjt7ttJ7nWmLkVnCsv7U9IdCllteFokJwub7EOctXfnJX9Su77VPnkKQ1AuH33t4Xbc/FmtgrUUc6hUHraS2WZbpoTS+hnIygNs1kuaa4ZA0a+5hqwTf94+y/wZV52j20EZZdmA73GT6J0/c44+cePbw+AqlP7agMvHXLB6/j/ffOjO39PFd5QPSSqHal9ndfihRzY9+YeXfoXQ21wPZvQGWLddE9nc+0oddNsvc5M5kRsg3xV9RmjIt0MXnytuHSdhrD1v4b8//s49j225bN0zdPEpOl5WwlBehfKWVr3277fXfeNbP/vSy6+8ef0b75xcFG5PhyhtqsvJj+8U7LYGpW1ZpT8bgYkrkLcVWx7o+oMV0Z1N689/9fpdm1/6+oOfeHpudvA3unSEjhfV9m9hB1JbgVxAx8V0rLfnc++hPyzi/jyGGvBRhQQ6nqdDEeiy2VaDkePRt8y6ho5z1Zbo99hfWZF24EoYbymesH9hRf/8T4ABAH5Gxi+yg/9YAAAAAElFTkSuQmCC") right no-repeat;
  padding-right: 95px;
  padding-left: 0;
}

h1 {
  font-size: 156%;
  font-weight: bold;
  padding: 0;
  margin: 0;
}

div.blurb {
  padding-bottom: 1.5em;
}

div.content {
  font-size: 88%;
  margin-top: 5px;
}

.section-header {
  background: #ebeff9;
  border-top: 1px solid #b5c7de;
  font-size: 99%;
  padding-bottom: 2px;
  padding-left: 5px;
  padding-top: 3px;
  width: 100%;
}

html[dir=rtl] .section-header {
  padding-right: 5px;
  padding-left: 0;
}

.section-header > table tr td:first-child {
  width: 100%;
}

.section-header > table {
  width: 100%;
}

.section-header-title {
  font-weight: bold;
}

.vbox-container {
  display: -webkit-box;
  -webkit-box-orient: vertical;
}

.wbox {
  display: -webkit-box;
  -webkit-box-align: stretch;
  -webkit-box-flex: 1;
}

#top {
  padding-right: 5px;
}

html[dir=rtl] #top {
  padding-left: 5px;
  padding-right: 0;
}

.experiment-enabled > td {
  padding-bottom: 4px;
  padding-top: 5px;
}

.experiment {
  border-bottom: 1px solid #cdcdcd;
}

/* Indent the text related to each experiment. */
.experiment-text {
  padding-left: 5px;
}

html[dir=rtl] .experiment-text {
  padding-right: 5px;
  padding-left: 0;
}

.experiment-name {
  font-weight: bold;
}

.no-experiments {
  margin: 6em 0 0;
  text-align: center;
  font-size: 1.2em;
}

/* Match the indentation of .experiment-text. */
.experiment-actions {
  padding-left: 5px;
  margin-top: 0.2em;
  margin-bottom: 0.2em;
}

html[dir=rtl] .experiment-actions {
  padding-right: 5px;
  padding-left: 0;
}

div.needs-restart {
  padding-top: 10px;
  padding-left: 5px;
}

button {
  font-size: 104%;
}

</style>
<script>

/**
 * This variable structure is here to document the structure that the template
 * expects to correctly populate the page.
 */
var labsExperimentsDataFormat = {
  'labsExperiments': [
    {
      'internal_name': 'Experiment ID string',
      'name': 'Experiment Name',
      'description': 'description',
      'enabled': true
    }
  ],
  'needsRestart': false
};

/**
 * Takes the |labsExperimentsData| input argument which represents data about
 * the currently available experiments and populates the html jstemplate
 * with that data. It expects an object structure like the above.
 * @param {Object} labsExperimentsData Detailed info about available experiments
 */
function renderTemplate(labsExperimentsData) {
  // This is the javascript code that processes the template:
  var input = new JsEvalContext(labsExperimentsData);
  var output = document.getElementById('labsExperimentTemplate');
  jstProcess(input, output);
}

/**
 * Asks the C++ LabsDOMHandler to get details about the available experiments
 * and return detailed data about the configuration. The LabsDOMHandler
 * should reply to returnLabsExperiments() (below).
 */
function requestLabsExperimentsData() {
  chrome.send('requestLabsExperiments', []);
}

/**
 * Asks the C++ LabsDOMHandler to restart the browser (restoring tabs).
 */
function restartBrowser() {
  chrome.send('restartBrowser', []);
}

/**
 * Called by the dom_ui to re-populate the page with data representing the
 * current state of installed experiments.
 */
function returnLabsExperiments(labsExperimentsData){
  var bodyContainer = document.getElementById('body-container');
  renderTemplate(labsExperimentsData);
  bodyContainer.style.visibility = 'visible';
}

/**
 * Handles a 'enable' or 'disable' button getting clicked.
 */
function handleEnableExperiment(node, enable) {
  // Tell the C++ LabsDOMHandler to enable/disable the experiment.
  chrome.send('enableLabsExperiment', [String(node.internal_name),
                                       String(enable)]);
  requestLabsExperimentsData();
}

// Get data and have it displayed upon loading.
document.addEventListener('DOMContentLoaded', requestLabsExperimentsData);

</script>
</head>
<body i18n-values=".style.fontFamily:fontfamily;.style.fontSize:fontsize">
<div id="body-container" style="visibility:hidden">

  <div id="header"><h1 i18n-content="labsLongTitle">TITLE</h1></div>

  <div class="blurb" i18n-content="labsBlurb">BLURB</div>

  <div id="labsExperimentTemplate">

    <div id="container" class="vbox-container">
    <div id="top" class="wbox">

      <div class="section-header">
        <table cellpadding="0" cellspacing="0"><tr valign="center">
          <td>
            <span class="section-header-title" i18n-content="labsTableTitle"
              >TITLE</span>
          </td>
        </tr></table>
      </div>

    </div>
    </div>

    <div class="content">
      <div class="experiment-name no-experiments"
           jsdisplay="labsExperiments.length === 0">
        <div i18n-content="labsNoExperimentsAvailable"
          >NO_EXPERIMENTS_ARE_AVAILABLE</div>
      </div>

      <div jsdisplay="labsExperiments.length > 0">
      <div class="experiment" jsselect="labsExperiments">
        <table width="100%" cellpadding="2" cellspacing="0">
        <tr class="experiment-enabled">
        <td valign="top">
          <div class="experiment-text">
            <div>
              <span class="experiment-name" dir="ltr"
                    jscontent="name">NAME</span>
              <div>
                <span dir="ltr" jsvalues=".innerHTML:description">
              </div>
            </div>
          </div>
          <div class="experiment-actions">
            <span>
              <a
                jsvalues=".internal_name:internal_name"
                jsdisplay="enabled"
                onclick="handleEnableExperiment(this, false)"
                href="javascript:void(0);"
                i18n-content="disable"
                >DISABLE</a>
              <a
                jsvalues=".internal_name:internal_name"
                jsdisplay="!enabled"
                onclick="handleEnableExperiment(this, true)"
                href="javascript:void(0);"
                i18n-content="enable"
                >ENABLE</a>
            </span>
          </div>
        </td>
        </tr>
        </table>
      </div>
      </div>

      <div class="needs-restart" jsdisplay="needsRestart">
        <div i18n-content="labsRestartNotice">NEEDS_RESTART</div>
        <button type="button"
                onclick="restartBrowser();"
                i18n-content="labsRestartButton">RESTART</button>
      </div>
    </div>
  </div>
</div>
</body>
</html>
html {
  background-image: url(chrome://theme/IDR_THEME_NTP_BACKGROUND?$1);
  background-color: $2;
  background-position: $3;
  background-repeat: $5;
  height: 100%;
  overflow: auto;
  background-attachment: fixed;
}

html[bookmarkbarattached='true'] {
  background-position: $4;
}
<!DOCTYPE html>
<html i18n-values="
  dir:textdirection;
  bookmarkbarattached:bookmarkbarattached;
  hasattribution:hasattribution;
  anim:anim;
  syncispresent:syncispresent;
  customlogo:customlogo"
  install-animation-enabled="true">
<head>
<meta charset="utf-8">
<title i18n-content="title"></title>
<script>
// Logging info for benchmarking purposes.
var log = [];
function logEvent(name, shouldLogTime) {
  if (shouldLogTime) {
    chrome.send('logEventTime', [name]);
  }
  log.push([name, Date.now()]);
}
logEvent('Tab.NewTabScriptStart', true);

var global = this;

/**
 * Registers a callback function so that if the backend calls it too early it
 * will get delayed until DOMContentLoaded is fired.
 * @param {string} name The name of the global function that the backend calls.
 */
function registerCallback(name) {
  var f = function(var_args) {
    var args = Array.prototype.slice.call(arguments);
    // If we still have the temporary function we delay until the dom is ready.
    if (global[name] == f) {
      logEvent(name + ' is not yet ready. Waiting for DOMContentLoaded');
      document.addEventListener('DOMContentLoaded', function() {
        logEvent('Calling the new ' + name);
        global[name].apply(null, args);
      });
    }
  };
  global[name] = f;
}

chrome.send('getMostVisited');
chrome.send('getRecentlyClosedTabs');
chrome.send('getApps');

registerCallback('mostVisitedPages');
registerCallback('recentlyClosedTabs');
registerCallback('syncMessageChanged');
registerCallback('getAppsCallback');
registerCallback('setShownSections');

</script>
<!-- template data placeholder -->
<style>html {
  /* This is needed because of chrome://theme/css/new_tab.css */
  height: 100%;
}

body {
  margin: 0;
  height: 100%;
  overflow: auto;
  -webkit-user-select: none;
  cursor: default;
}

html[mode=app-launcher] {
  height: auto;
}

#main {
  -webkit-box-sizing: border-box;
  -webkit-transition: width .15s;
  margin: 0 auto;
  min-height: 100%;
}

body.loading #main {
  /* We start out hidden to prevent glitchiness as the app and most visited
  data flows in. */
  visibility: hidden;
}

#main,
.section,
.maxiview {
  width: 920px;
}

html[dir=rtl] #main {
  background-position-x: 100%;
}

html[mode=app-launcher] #main {
  min-height: 50px;
}

html[anim=false] *,
.no-anim, .no-anim *,
.loading * {
  -webkit-transition: none !important;
  -webkit-animation: none !important;
}

:link,
:visited,
.link {
  cursor: pointer;
  text-decoration: underline;
  color: hsla(213, 90%, 24%, 0.33333);
  -webkit-appearance: none;
  border: 0;
  background: none;
}

.link-color {
  color: hsl(213, 90%, 24%);
  text-decoration: none;
}

.hide {
  opacity: 0 !important;
  visibility: hidden !important;
  pointer-events: none;
}

/* Notification */

#notification {
  position: relative;
  background-color: hsl(52, 100%, 80%);
  border: 1px solid rgb(211, 211, 211);
  border-radius: 6px;
  padding: 7px 15px;
  white-space: nowrap;
  display: table;
  /* Set the height and margin so that the element does not use any vertical
    space */
  height: 16px;
  margin: -44px auto 12px auto;
  font-weight: bold;
  opacity: 0;
  pointer-events: none;
  -webkit-transition: opacity .15s;
  z-index: 1;
  color: black;
}

#notification.first-run {
  padding: 5px 13px; /* subtract the border witdh */
  border: 2px solid hsl(213, 55%, 75%);
  background-color: hsl(213, 63%, 93%);
  -webkit-box-shadow: 2px 2px 3px hsla(0, 0%, 0%, .3);
  font-weight: normal;
}

#notification > * {
  display: table-cell;
  max-width: 500px;
  overflow: hidden;
  text-overflow: ellipsis;
}

#notification.show {
  opacity: 1;
  pointer-events: all;
  -webkit-transition: opacity 1s;
}

#notification .link {
  color: rgba(0, 102, 204, 0.3);
  -webkit-padding-start: 20px;
}

#notification .link-color {
  color: rgb(0, 102, 204);
}

#notification > span > .blacklist-title {
  display: inline-block;
  max-width: 30ex;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.item {
  background: no-repeat 0% 50%;
  padding: 2px;
  padding-left: 18px;
  background-size: 16px 16px;
  background-color: hsla(213, 63%, 93%, 0);
  display: block;
  line-height: 20px;
  -webkit-box-sizing: border-box;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  font-size: 100%;
}

.item:visited,
.item:link {
  color: hsl(213, 90%, 24%);
}

html[dir=rtl] .item {
  background-position-x: 100%;
  padding-right: 18px;
  padding-left: 2px;
  text-align: right;
}

.window {
  overflow: visible; /* We use visible so that the menu can be a child and shown
                        on :hover. To get this to work we have to set visibility
                        to visible which unfortunately breaks the ellipsis for t
                        he window items */
  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA10lEQVQ4y82OSwsBURiGv78of0Ehk2vGwsKlTLllFlMzyJgmaqKJ0fgBVrZWFjb2io2N3WvOiAhNHRuLp7fO6Xn6CAAZ7gLGcoEhw2Xr+Gt4y/78N9fxMRjLG8ylgWMjrJ24GMxtkDax0F2dsd7sHnRmW4TUYyDa1AIpY9OX9ofLCywSdIEyMkGy3nuT7zxf9QlZ74OaqvI1EETDc0mS29wBSW6BynWJO1Cp10DFaok7wNw/CBSKBe6A6LmUEzPcgVw+C0qlBe5A0nMpIUS5A8yleCyCX7gCQoVZHBMa2iYAAAAASUVORK5CYII=");
}

.window-menu {
  position: absolute;
  display: none;
  border: 1px solid #999;
  -webkit-box-shadow: 2px 2px 3px hsla(0, 0%, 0%, .3);
  color: black;
  background-color: white;
  left: 0;
  white-space: nowrap;
  z-index: 2;
  padding: 2px;
  cursor: default;
  border-radius: 4px;
}

/* Made to look like a tooltip using vista/win7 look and feel.
   TODO(arv): Replace with -webkit-appearance once issue 17371 is fixed
 */
#window-tooltip {
  color: #555;
  pointer-events: none;
  border: 1px solid rgb(118, 118, 118);
  border-radius: 3px;
  padding: 0 3px;
  background: -webkit-gradient(linear, left top, left bottom,
                               from(white),
                               to(rgb(228, 229, 240)));
  width: auto;
  max-width: 300px;
}

.hbox {
  display: -webkit-box;
  -webkit-box-orient: horizontal;
}

#sync-status > div {
  border-radius: 6px;
  padding: 5px 0;
  margin: 10px 0 20px;
  white-space: nowrap;
  overflow-x: hidden;
}

#sync-status > div > * {
  display: inline-block;
  max-width: none;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  font-size: 100%;
  margin: 0 10px;
}

.notification.hidden {
  opacity: 0;
  pointer-events: none;
}

/**
 * Unfortunately, there seems to be a bug in WebKit where this div doesn't
 * immediately get layout. It still doesn't have it in 'load', but gains it
 * sometime after.
 *
 * We detect this in the JS by looking for offsetWidth > 0, and when it occurs,
 * remove the 'nolayout' class.
 */
#attribution.nolayout {
  position: static;
  visibility: hidden;
}

#attribution {
  position: fixed;
  right: 5px;
  bottom: 5px;
  text-align: end;
}

html[dir=rtl] #attribution {
  left: 5px;
  right: auto;
}

#attribution.obscured {
  visibility: hidden;
}

html[hasattribution=false] #attribution > div {
  display: none;
}

.sync-button {
  font-size: inherit;
  padding: 0;
  margin: 0;
  -webkit-appearance: none;
  border: 0;
  background: none;
  cursor: pointer;
  text-decoration: underline;
  font-family: inherit;
}

.section {
  position: fixed;
  font-size: 92%;
}

html[anim=true][enable-section-animations=true] .section {
  -webkit-transition: top .15s;
}

.section.disabled,
#closed-sections-bar .disabled {
  display: none !important;
}

.section > h2 {
  font-family: Helvetica, Arial, sans-serif;
  font-size: 133%;
  font-weight: normal;
  margin: 0;
  position: relative;
}

.section:not([noexpand]) > h2 {
  cursor: pointer;
}

.section > h2 > .disclosure {
  position: absolute;
  left: -15px;
  margin-top: 50%;
  top: -5px;
}

html[dir=rtl] .section > h2 > .disclosure {
  left: auto;
  right: -15px;
  -webkit-transform: rotate(180deg);
}

html[anim=true] .section > h2 > .disclosure {
  -webkit-transition: -webkit-transform .15s;
}

.section:not(.hidden) > h2 > .disclosure {
  -webkit-transform: rotate(90deg);
}

.section > h2 .back {
  position: absolute;
  left: 0;
  top: 0.56em;
  width: 100%;
  height: 1.5em;
  z-index: 1;
}

.section > h2 span {
  -webkit-padding-end: 0.30em;
  position: relative;
  z-index: 2;
}

.section-close-button {
  -webkit-appearance: none;
  -webkit-transition: opacity .15s;
  background-color: transparent;
  background-image: url(chrome://theme/IDR_CLOSE_BAR);
  background-position: center center;
  background-repeat no-repeat;
  border: 0;
  height: 21px;
  margin-top: -10px;
  position: absolute;
  right: -21px;
  top: 50%;
  width: 21px;
  opacity: 0;
  z-index: 3;
}

html[dir=rtl] .section-close-button {
  left: -21px;
  right: auto;
}

.section > h2:hover .section-close-button,
.section-close-button:hover {
 opacity: 1;
}

.section-close-button:hover {
  background-image: url(chrome://theme/IDR_CLOSE_BAR_H);
}

#closed-sections-bar {
  position: fixed;
  bottom: 5px;
}

#closed-sections-bar > button {
  -webkit-appearance: none;
  background: none;
  border: 0;
  cursor: pointer;
  font: inherit;
  margin: 0;
  margin-right: 1.5em;
  padding: 0;

  /* Note: The font here should end up the same as .section > h2. A different
  percentage is needed because the parent element here has a different size. */
  font-family: Helvetica, Arial, sans-serif;
  font-size: 122%;
  font-weight: normal;
}

#closed-sections-bar > button > img {
  -webkit-transform: rotate(90deg);
  position: relative;
  top: -2px;
  margin-left: 1px;
}

.maxiview {
  padding: 5px 0 30px;
  position: absolute;
  -webkit-mask-attachment: fixed;
  opacity: 1;
}

.maxiview.hiding {
  opacity: 0;
}

.maxiview.hidden {
  display: none;
}

html[anim=true] .maxiview {
  -webkit-transition: opacity .15s;
}

.section > .miniview {
  display: none;
  margin: 10px 0 30px;
  white-space: nowrap;
  overflow-x: hidden;
}

.section.hidden > * {
  display: none;
}

.section.hidden > h2,
.section.hidden > .miniview {
  display: block;
}

.section.hidden > h2 {
  margin-right: 0;
}

.miniview > span  {
  display: inline-block;
  max-width: 114px; /* Selected so that we can fit 5 items in EN-US */
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  font-size: 100%;
  margin: 0 10px;
}

.miniview > span:first-child {
  margin-left: 0;
}

.miniview > span:last-child {
  margin-right: 0;
}

/* small */

@media (max-width: 940px) {

  #main,
  .section,
  .maxiview {
    width: 692px;
  }

  #notification > * {
    max-width: 300px;
  }

  #notification > span > .blacklist-title {
    max-width: 15ex;
  }
}

/* Ensure we have at least 10px horizontal marging. */
@media (max-width: 712px) {
  #main {
    margin-left: 10px;
    margin-right: 10px;
  }
}
</style>
<style>/* Most Visited */

#most-visited-maxiview {
  position: relative;
  height: 366px;
  -webkit-user-select: none;
}

.thumbnail-container {
  position: absolute;
  color: hsl(213, 90%, 24%);
  text-decoration: none;
  -webkit-transition: left .15s, right .15s, top .15s;
  text-decoration: none;
}

.thumbnail-container:focus {
  outline: none;
}

.thumbnail,
.thumbnail-container > .title {
  width: 207px; /* natural size is 196 */
  height: 129px; /* 136 */
  -webkit-transition: width .15s, height .15s;
}

.thumbnail-container > .title {
  line-height: 16px;
  height: 16px;
  margin: 0;
  margin-top: 4px;
  font-size: 100%;
  font-weight: normal;
  padding: 0 3px;
  opacity: 1;
  -webkit-transition: opacity .15s, width .15s;
  color: black;
}

.thumbnail-wrapper {
  display: block;
  background-size: 212px 132px;
  background: no-repeat 4px 4px;
  background-color: white;
  border-radius: 5px;
  -webkit-transition: background-size .15s;
  position: relative;
}

.filler * {
  visibility: hidden;
}

.filler {
  pointer-events: none;
}

.filler .thumbnail-wrapper {
  visibility: visible;
  border: 3px solid hsl(213, 60%, 92%);
}

.filler .thumbnail {
  visibility: inherit;
  border: 1px solid white;
  padding: 0;
  background-color: hsl(213, 60%, 92%);
}

.edit-bar {
  display: -webkit-box;
  -webkit-box-orient: horizontal;
  -webkit-box-align: stretch;
  padding: 3px;
  padding-bottom: 0;
  height: 17px; /* 23 - 2 * 3 */
  cursor: move;
  font-size: 100%;
  line-height: 17px;
  background: hsl(213, 54%, 95%);
  border-top-left-radius: 4px;
  border-top-right-radius: 4px;
  position: relative;
  margin-top: 21px;
  margin-bottom: -21px;
  -webkit-transition: margin .15s, background .15s;
}

.edit-bar > * {
  display: block;
  position: relative;
}

.thumbnail-container:focus .edit-bar,
.thumbnail-container:hover .edit-bar {
  margin-top: 0;
  margin-bottom: 0;
  -webkit-transition-delay: .5s, 0s;

  /* We need background-color as well to get the fade out animation correct */
  background-color: hsl(213, 66%, 57%);
  background-image: -webkit-gradient(linear, left top, left bottom,
                                     from(hsl(213, 87%, 67%)),
                                     to(hsl(213, 66%, 57%)));
}

.edit-bar > .spacer {
  -webkit-box-flex: 1;
}

.edit-bar > .pin,
.edit-bar > .remove {
  width: 16px;
  height: 16px;
  cursor: pointer;
  background-image: no-repeat 50% 50%;
}

.edit-bar > .pin {
  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAi0lEQVQ4y6WTbQqAIAyGR4eRPs5h/to1umYX2J1swhuYlG0lPCLi+zDFERENyqhEhY1EZEqWJmx6ByNLqUw5ZxcY6TS1B4IiBgHfCUp4hyB4BXVYepIngTwQvFeQDq+CniRYBXeSzXqFGsGjbljzF8FZNtcSq6CFUdFF8Psr/2mmmdCSi7I62nlFhg6BYt2lXCEqGgAAAABJRU5ErkJggg==");
}

.edit-bar > .pin:hover {
  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAkUlEQVQ4y52TwQnAIAxF/6EDuUkppXdH8Sq6gFN2hNTQVGxRqwa+iPAeiRAAWGLWGBsTOmOFYRYbPxIRRiIiZuH5mBAkNhQEiu76E4SSgOFTBGpUkMPUktQEtVKjI7TqV9CSqF5BSWJ6R8hD8qlG7npG8LStc0mv4BstHb0EHvPl0zJNwMzskJU8YtzAOjthcAHXovXMr/dmSgAAAABJRU5ErkJggg==");
}

.edit-bar > .pin:active {
  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAtElEQVQ4y6WTQQrCMBBFZ+GhcgsRcZltj+AFXEl7gdl5gdKFELyYi6zifJlCWtM40YFHQ8p/mYSEiGgn7IVReBi5agZZOggsdI2wZmn6Idw5587yHUhbWvz03l+SlEHAHwKEY4xPCDBuEuThubYkRUHaqJKkuoVUqa+CmiTvpCooSUIId9MWchDEoSKMMTPfmgVz2wjnEpNgDcLoaC0Y/r3K78eEiRZ09SPpkzwJvU5a6DVDL0iIFWtK1DHEAAAAAElFTkSuQmCC");
}

.pinned .edit-bar > .pin {
  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAoUlEQVQ4y6WTQQrEIAxFs5j7lTLM0u1cZFbiXCC7uUPBm3XhyuZDhLaTWm0DH0R4zyiGiOghGSRewo3xyoClUTffnWFl6XsBLgH7f7pz7pOlGrvYCgCnlGYIsO4SrOFSJ5KtIB9URWJfIVfqVFCTGJ3YAksSY5yarrAOQDwqYKyZ+dctKG0DNiR1wT6A0dFecPsr3xmmJ+lIviShY5yDMrQA7LABeK+JNKgAAAAASUVORK5CYII=");
}

.pinned .edit-bar > .pin:hover {
  background-image: url(ntp_pin_on_h.png');
}

.pinned .edit-bar > .pin:active {
  background-image: url(ntp_pin_on_p.png');
}

.edit-bar > .remove {
  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAeUlEQVQ4y7WTywmAQAxEH1bjpw53QdiGtkZ7Gi8RRBc1BgO5JMyDfAagA3pgBsrLnE3TAQxW9EYxLRlAkist8k76CigtwCKpNkTVeo+AKmk9QS61O8BZ0AI+Ao6QtTXS74DQCOElhs/ofqTwK0fMNGKWnIDksHMyDRvjd9VHQSi/pgAAAABJRU5ErkJggg==");
}

.edit-bar > .remove:hover {
  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAdklEQVQ4y72TUQrAIAiG/4fdb4yxty4UdYFO6xRklE+msOB7kfyyUgA4mJOpzHBSNUdycWlwdw3NRUd8dQRPn6tYBURUmMHAILHiEchGMpIv5hFYySL0CmbJUs1vgtQV0o+Y+8ZII6VbOTNMN3QkH6ZtjHPTHLxiHvw7LRQlVgAAAABJRU5ErkJggg==");
}

.edit-bar > .remove:active {
  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAi0lEQVQ4y2NgYGBgAWJ/IF4LxDuIxJ1QPSC9DIFAPBOI00jEM6F6GdaToTnNwsKiDEj3MECdRK4BMzEM+P//fwwQY3gJJAaSI8YAkML/yIZgE8NpALoGbJoJGoBmyH9sXqKtARR5geJApDgayUlIPZQmZXBmAgmQgqG2BzNAs2QoEHdDBYnB3VA9DACUmgUVtMbe9gAAAABJRU5ErkJggg==");
}

.thumbnail-container > .title > div {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  background: no-repeat 0 50%;
  background-size: 16px;
  padding-left: 20px; /* we cannot use padding start here because even if we set
                         the direction we always want the icon on the same side
                      */
  padding-right: 0;
}

html[dir=rtl] .thumbnail-container > .title > div {
  background-position-x: 100%;
  padding-left: 0;
  padding-right: 20px;
  text-align: right;
}

.thumbnail {
  border: 3px solid hsl(213, 63%, 93%);
  padding: 1px;
  border-radius: 5px;
  display: block;
  -webkit-box-shadow: 0px 2px 2px hsla(0, 0%, 0%, 0);
  -webkit-transition: width .15s, height .15s, border-color .15s,
      border-top-left-radius .15s, border-top-right-radius .15s,
      -webkit-box-shadow .15s;
}

.edit-mode-border {
  border-radius: 4px;

  /* when dragged over we move this */
  position: relative;
  -webkit-transition: top .15s, left .15s;
}

.thumbnail-container:focus .thumbnail,
.thumbnail-container:hover .thumbnail {
  border-color: hsl(213, 66%, 57%);
  -webkit-box-shadow: 0px 2px 2px hsla(0, 0%, 0%, 0);
  -webkit-border-top-left-radius: 0;
  -webkit-border-top-right-radius: 0;

  background-image: -webkit-gradient(linear, left top, left bottom,
    from(hsla(0, 0%, 0%, 0)),
    color-stop(0.85, hsla(0, 0%, 47%, 0)),
    to(hsla(0, 0%, 47%, 0.2))
    );

  /* delay border radius transition as much as the edit bar slide delay */
  -webkit-transition-delay: 0, 0, 0, .5s, .5s, 0;
}

.thumbnail-container:focus > .edit-mode-border,
.thumbnail-container:hover > .edit-mode-border {
  background-color: hsl(213, 66%, 57%);
  -webkit-box-shadow: 0px 2px 2px hsla(0, 0%, 0%, .5);
}

.dragging,
.dragging * {
  -webkit-transition: none !important;
}

.dragging > .title {
  opacity: 0;
}

@-webkit-keyframes 'fade-in' {
  0% {
    opacity: 0;
  }

  100% {
    opacity: 1;
  }
}

.fade-in {
  -webkit-animation: 'fade-in' .15s;
}

@media (max-width: 940px) {
  #most-visited-maxiview {
    height: 294px;
  }

  .thumbnail,
  .thumbnail-container > .title {
    width: 150px;
    height: 93px;
  }

  .thumbnail-container > .title {
    height: auto;
  }

  .thumbnail-wrapper {
    background-size: 150px 93px;
  }
}

#most-visited-settings {
  position: absolute;
  top: 1px;
  right: 0;
  border: 0;
  cursor: pointer;
  font-size: 70%;
  margin: 0;
  padding: 0;
  text-decoration: underline;
  visibility: hidden;
  -webkit-padding-start: 3px;
  z-index: 3;
}

html[dir=rtl] #most-visited-settings {
  left: 0;
  right: auto;
}

#most-visited:not(.hidden) #most-visited-settings.has-blacklist {
  visibility: visible;
}
</style>
<style>/* Apps */

.app,
.app[new=installed] {
  -webkit-box-sizing: border-box;
  -webkit-perspective: 400;
  border-radius: 10px;
  color: black;
  display: inline-block;
  margin: 5px 3px;
  position: relative;
  height: 136px;
  width: 124px; /* 920 / 7 - margin * 2 */
}

.app a {
  border-radius: 10px;
  bottom: 0;
  left: 0;
  position: absolute;
  right: 0;
  top: 0;
}

.app a {
  -webkit-transition: background-color .5s;
  background: rgba(255, 255, 255, 0) /* transparent white */
              no-repeat center 10px;
  background-size: 96px 96px;
  font-family: Helvetica, Arial;
  font-size: 107%;
  overflow: hidden;
  padding: 111px 10px 10px;  /* 10 + 96 + 5 */
  text-align: center;
  text-decoration: none;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.app .app-settings {
  background-color: transparent;
  background-position: center center;
  border: 0;
  height: 14px;
  padding: 0;
  position: absolute;
  right: 5px;
  top: 5px;
  width: 14px;
}

.app > .app-settings {
  -webkit-transition: opacity .3s;
  -webkit-transition-delay: 0;
  background-image: url(chrome://theme/IDR_BALLOON_WRENCH);
  opacity: 0;
}

.app > .app-settings:hover {
  -webkit-transition: none;
  background-image: url(chrome://theme/IDR_BALLOON_WRENCH_H);
}

.app:hover > .app-settings,
.app > .app-settings:focus {
  -webkit-transition-delay: .5s;
  opacity: .9;
}

@-webkit-keyframes bounce {
  0% {
    -webkit-transform: scale(0, 0);
  }

  60% {
    -webkit-transform: scale(1.2, 1.2);
  }

  100% {
    -webkit-transform: scale(1, 1);
  }
}

html[install-animation-enabled=true] .app[new=new] {
  opacity: 0;
}

html[install-animation-enabled=true] .app[new=installed] {
  -webkit-animation: bounce .5s ease-in-out;
  -webkit-transition: opacity .5s;
}

a[app-id=web-store-entry] {
  background-image: url("data:image/png;base64,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");
}

menu > button.default {
  font-weight: bold;
}
</style>
<style>menu {
  display: none;
  position: fixed;
  border: 1px solid rgba(0, 0, 0, .50);
  -webkit-box-shadow: 0px 2px 4px rgba(0, 0, 0, .50);
  color: black;
  background: -webkit-gradient(linear, 0 0, 0 100%, from(#fff), to(#eee));
  left: 0;
  white-space: nowrap;
  padding: 8px 0;
  margin: 0;
  cursor: default;
  border-radius: 3px;
  z-index: 3;
}

menu > * {
  -webkit-box-sizing: border-box;
  display: block;
  margin: 0;
  width: 100%;
  text-align: start;
}

menu > :not(hr) {
  -webkit-appearance: none;
  background: transparent;
  font: inherit;
  border: 0;
  line-height: 18px;
  padding: 0 19px;
  overflow: hidden;
  text-overflow: ellipsis;
}

menu > hr {
  background: -webkit-gradient(linear, 0 0, 96% 0, from(rgba(0, 0, 0, .10)),
                               to(rgba(0, 0, 0, .02)));
  border: 0;
  height: 1px;
  margin: 8px 0;
}

menu > [disabled] {
  color: rgba(0, 0, 0, .3);
}

menu > [hidden] {
  display: none;
}

menu > :not(hr)[selected] {
  background-color: #dce5fa;
}

menu > :not(hr)[selected]:active {
  background-color: #426dc9;
  color: #fff;
}
</style>
<script>

/**
 * Bitmask for the different UI sections.
 * This matches the Section enum in ../dom_ui/shown_sections_handler.h
 * @enum {number}
 */
var Section = {
  THUMB: 1 << 0,
  APPS: 1 << 6
};

// These are used to hide sections and are part of the |shownSections| bitmask,
// but are not sections themselves.
var MINIMIZED_THUMB = 1 << (0 + 16);
var MINIMIZED_RECENT = 1 << (2 + 16);
var MINIMIZED_APPS = 1 << (6 + 16);

var shownSections = templateData['shown_sections'];

// Until themes can clear the cache, force-reload the theme stylesheet.
document.write('<link id="themecss" rel="stylesheet" ' +
               'href="chrome://theme/css/newtab.css?' +
               Date.now() + '">');

function useSmallGrid() {
  return window.innerWidth <= 940;
}

function isRtl() {
  return templateData['textdirection'] == 'rtl';
}

// Parse any name value pairs passed through the URL hash.
var hashParams = (function() {
  var result = {};
  if (location.hash.length) {
    location.hash.substr(1).split('&').forEach(function(pair) {
      pair = pair.split('=');
      if (pair.length != 2) {
        throw new Error('Unexpected hash value: ' + location.hash);
      }

      result[pair[0]] = pair[1];
    });
  }
  return result;
})();

// Reflect the mode param as an attribute so we can use CSS attribute selectors
// on it.
if ('mode' in hashParams) {
  document.documentElement.setAttribute('mode', hashParams['mode']);
}

</script>
</head>
<body class="loading"
      i18n-values=".style.fontFamily:fontfamily;.style.fontSize:fontsize">

<div id="attribution" class="attribution nolayout">
  <div i18n-content="attributionintro"></div>
  <img id="attribution-img">
</div>

<div id="main">

  <div id="notification">
    <span>&nbsp;</span>
    <span class="link"><span class="link-color"></span></span>
  </div>

  <div class="maxiview" id="apps-maxiview"></div>
  <div class="maxiview" id="most-visited-maxiview"></div>

  <div class="sections">
    <!-- Start disabled. We only enable if we have at least one app. -->
    <div id="apps" class="section disabled" section="APPS">
      <h2>
        <img class="disclosure" img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9oIGRQbOY8MjgMAAABVSURBVBjTfc6xDcAwCETRM0rt5nbA+49j70DDAqSLsGXyJQqkVxxwNOeMiEA+waW1VuT/inrvG7wikht8UETy2ygVMjO4O8YYTf6AqrZyUwYlygAAXo+QLmeF4c4uAAAAAElFTkSuQmCC">
        <div class="back"></div>
        <span i18n-content="apps"></span>
        <button class="section-close-button"></button>
      </h2>
      <div class="miniview"></div>
    </div>

    <div id="most-visited" class="section" section="THUMB">
      <h2>
        <img class="disclosure" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9oIGRQbOY8MjgMAAABVSURBVBjTfc6xDcAwCETRM0rt5nbA+49j70DDAqSLsGXyJQqkVxxwNOeMiEA+waW1VuT/inrvG7wikht8UETy2ygVMjO4O8YYTf6AqrZyUwYlygAAXo+QLmeF4c4uAAAAAElFTkSuQmCC">
        <div class="back"></div>
        <span i18n-content="mostvisited"></span>
        <button id="most-visited-settings" i18n-content="restorethumbnails">
        </button>
        <button class="section-close-button"></button>
      </h2>
      <div class="miniview"></div>
    </div>

    <!-- Start this section disabled because it might not have data, and looks
         silly without any. -->
    <div id="recently-closed" class="section hidden disabled" section="RECENT"
        noexpand="true">
      <h2>
        <div class="back"></div>
        <span i18n-content="recentlyclosed"></span>
        <button class="section-close-button"></button>
      </h2>
      <div class="miniview"></div>
    </div>

    <div id="sync-status" class="section disabled">
      <div>
        <h3></h3>
        <span></span>
      </div>
    </div>
  </div>

  <div id="closed-sections-bar">
    <!-- The default visibility of these buttons needs to be the opposite of the
         default visibility of the corresponding sections. -->
    <button id="apps-button"
            menu="#apps-menu">
      <span i18n-content="apps"></span>
      <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9oIGRQbOY8MjgMAAABVSURBVBjTfc6xDcAwCETRM0rt5nbA+49j70DDAqSLsGXyJQqkVxxwNOeMiEA+waW1VuT/inrvG7wikht8UETy2ygVMjO4O8YYTf6AqrZyUwYlygAAXo+QLmeF4c4uAAAAAElFTkSuQmCC">
    </button>
    <button id="most-visited-button"
            class="disabled"
            menu="#most-visited-menu">
      <span i18n-content="mostvisited"></span>
      <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9oIGRQbOY8MjgMAAABVSURBVBjTfc6xDcAwCETRM0rt5nbA+49j70DDAqSLsGXyJQqkVxxwNOeMiEA+waW1VuT/inrvG7wikht8UETy2ygVMjO4O8YYTf6AqrZyUwYlygAAXo+QLmeF4c4uAAAAAElFTkSuQmCC">
    </button>
    <button id="recently-closed-button"
            menu="#recently-closed-menu">
      <span i18n-content="recentlyclosed"></span>
      <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9oIGRQbOY8MjgMAAABVSURBVBjTfc6xDcAwCETRM0rt5nbA+49j70DDAqSLsGXyJQqkVxxwNOeMiEA+waW1VuT/inrvG7wikht8UETy2ygVMjO4O8YYTf6AqrZyUwYlygAAXo+QLmeF4c4uAAAAAElFTkSuQmCC">
    </button>
  </div>
</div>  <!-- main -->

<div class="window-menu" id="window-tooltip"></div>

<command id="clear-all-blacklisted" i18n-values=".label:restorethumbnails">
<command id="apps-launch-command">
<command id="apps-options-command" i18n-values=".label:appoptions">
<command id="apps-uninstall-command" i18n-values=".label:appuninstall">

<menu id="app-context-menu">
  <button class="default" command="#apps-launch-command"></button>
  <hr>
  <button command="#apps-options-command"></button>
  <button command="#apps-uninstall-command"></button>
</menu>

<!-- These are populated dynamically -->
<menu id="apps-menu"></menu>
<menu id="most-visited-menu"></menu>
<menu id="recently-closed-menu"></menu>

</body>

<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

/**
 * @fileoverview This is a simple template engine inspired by JsTemplates
 * optimized for i18n.
 *
 * It currently supports two handlers:
 *
 *   * i18n-content which sets the textContent of the element
 *
 *     <span i18n-content="myContent"></span>
 *     i18nTemplate.process(element, {'myContent': 'Content'});
 *
 *   * i18n-values is a list of attribute-value or property-value pairs.
 *     Properties are prefixed with a '.' and can contain nested properties.
 *
 *     <span i18n-values="title:myTitle;.style.fontSize:fontSize"></span>
 *     i18nTemplate.process(element, {
 *       'myTitle': 'Title',
 *       'fontSize': '13px'
 *     });
 */

var i18nTemplate = (function() {
  /**
   * This provides the handlers for the templating engine. The key is used as
   * the attribute name and the value is the function that gets called for every
   * single node that has this attribute.
   * @type {Object}
   */
  var handlers = {
    /**
     * This handler sets the textContent of the element.
     */
    'i18n-content': function(element, attributeValue, obj) {
      element.textContent = obj[attributeValue];
    },

    /**
     * This is used to set HTML attributes and DOM properties,. The syntax is:
     *   attributename:key;
     *   .domProperty:key;
     *   .nested.dom.property:key
     */
    'i18n-values': function(element, attributeValue, obj) {
      var parts = attributeValue.replace(/\s/g, '').split(/;/);
      for (var j = 0; j < parts.length; j++) {
        var a = parts[j].match(/^([^:]+):(.+)$/);
        if (a) {
          var propName = a[1];
          var propExpr = a[2];

          // Ignore missing properties
          if (propExpr in obj) {
            var value = obj[propExpr];
            if (propName.charAt(0) == '.') {
              var path = propName.slice(1).split('.');
              var object = element;
              while (object && path.length > 1) {
                object = object[path.shift()];
              }
              if (object) {
                object[path] = value;
                // In case we set innerHTML (ignoring others) we need to
                // recursively check the content
                if (path == 'innerHTML') {
                  process(element, obj);
                }
              }
            } else {
              element.setAttribute(propName, value);
            }
          } else {
            console.warn('i18n-values: Missing value for "' + propExpr + '"');
          }
        }
      }
    }
  };

  var attributeNames = [];
  for (var key in handlers) {
    attributeNames.push(key);
  }
  var selector = '[' + attributeNames.join('],[') + ']';

  /**
   * Processes a DOM tree with the {@code obj} map.
   */
  function process(node, obj) {
    var elements = node.querySelectorAll(selector);
    for (var element, i = 0; element = elements[i]; i++) {
      for (var j = 0; j < attributeNames.length; j++) {
        var name = attributeNames[j];
        var att = element.getAttribute(name);
        if (att != null) {
          handlers[name](element, att, obj);
        }
      }
    }
  }

  return {
    process: process
  };
})();
</script>
<script>
i18nTemplate.process(document, templateData);
</script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// TODO(arv): Namespace

/**
 * The local strings get injected into the page usig a variable named
 * {@code templateData}. This class provides a simpler interface to access those
 * strings.
 * @constructor
 */
function LocalStrings() {
}

// Start of anonymous namespace.
(function() {

/**
 * Returns a formatted string where $1 to $9 are replaced by the second to the
 * tenth argument.
 * @param {string} s The format string.
 * @param {...string} The extra values to include in the formatted output.
 * @return {string} The string after format substitution.
 */
function replaceArgs(s, args) {
  return s.replace(/\$[$1-9]/g, function(m) {
    return (m == '$$') ? '$' : args[m[1]];
  });
}

/**
 * Returns a string after removing Windows-style accelerators.
 * @param {string} s The input string that may contain accelerators.
 * @return {string} The resulting string with accelerators removed.
 */
function trimAccelerators(s) {
  return s.replace(/&{1,2}/g, function(m) {
    return (m == '&&') ? '&' : '';
  });
}

LocalStrings.prototype = {
  /**
   * The template data object.
   * @type {Object}
   */
  templateData: null,

  /**
   * Gets a localized string by its id.
   * @param {string} s The ID of the string we want.
   * @return {string} The localized string.
   */
  getString: function(id) {
    // TODO(arv): We should not rely on a global variable here.
    return (this.templateData || window.templateData)[id] || '';
  },

  /**
   * Returns a formatted localized string where $1 to $9 are replaced by the
   * second to the tenth argument.
   * @param {string} id The ID of the string we want.
   * @param {...string} The extra values to include in the formatted output.
   * @return {string} The formatted string.
   */
  getStringF: function(id, var_args) {
    return replaceArgs(this.getString(id), arguments);
  },

  /**
   * Gets a localized string (stripped of Windows-style accelerators) by its id.
   * @param {string} s The ID of the string we want.
   * @return {string} The localized string.
   */
  getStringWithoutAccelerator: function(id) {
    return trimAccelerators(this.getString(id));
  },

  /**
   * Returns a formatted localized string (stripped of Windows-style
   * accelerators) where $1 to $9 are replaced by the second to the tenth
   * argument.
   * @param {string} id The ID of the string we want.
   * @param {...string} The extra values to include in the formatted output.
   * @return {string} The formatted string.
   */
  getStringWithoutAcceleratorF: function(id, var_args) {
    return replaceArgs(this.getStringWithoutAccelerator(id), arguments);
  }
};

// End of anonymous namespace.
})();
</script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

/**
 * @fileoverview This implements the HTML5 HTMLElement classList property.
 */

// TODO(arv): Remove this when classList is available in WebKit.
// https://bugs.webkit.org/show_bug.cgi?id=20709

if (typeof document.createElement('div').classList == 'undefined') {

function DOMTokenList(el) {
  this.el_ = el;
}

(function() {

  var re = /\s+/;

  function split(el) {
    var cn = el.className.replace(/^\s+|\s$/g, '');
    if (cn == '')
      return [];
    return cn.split(re);
  }

  function DOMException_(code) {
    this.code = code;
  }
  DOMException_.prototype = DOMException.prototype;

  function assertValidToken(s) {
    if (s == '')
      throw new DOMException_(DOMException.SYNTAX_ERR);
    if (re.test(s))
      throw new DOMException_(DOMException.INVALID_CHARACTER_ERR);
  }

  DOMTokenList.prototype = {
    contains: function(token) {
      assertValidToken(token);
      return split(this.el_).indexOf(token) >= 0;
    },
    add: function(token) {
      assertValidToken(token);
      if (this.contains(token))
        return;
      var cn = this.el_.className;
      this.el_.className += (cn == '' || re.test(cn.slice(-1)) ? '' : ' ') +
          token;
    },
    remove: function(token) {
      assertValidToken(token);
      var names = split(this.el_);
      var s = [];
      for (var i = 0; i < names.length; i++) {
        if (names[i] != token)
          s.push(names[i])
      }
      this.el_.className = s.join(' ');
    },
    toggle: function(token) {
      assertValidToken(token);
      if (this.contains(token)) {
        this.remove(token);
        return false;
      } else {
        this.add(token);
        return true;
      }
    },
    get length() {
      return split(this.el_).length;
    },
    item: function(index) {
      return split(this.el_)[index];
    }
  };

})();

HTMLElement.prototype.__defineGetter__('classList', function() {
  var tl = new DOMTokenList(this);
  // Override so that we reuse the same DOMTokenList and so that
  // el.classList == el.classList
  this.__defineGetter__('classList', function() {
    return tl;
  });
  return tl;
});

} // if
</script>
<script>/**
 * Whitelist of tag names allowed in parseHtmlSubset.
 * @type {[string]}
 */
var allowedTags = ['A', 'B', 'STRONG'];

/**
 * Parse a very small subset of HTML.
 * @param {string} s The string to parse.
 * @throws {Error} In case of non supported markup.
 * @return {DocumentFragment} A document fragment containing the DOM tree.
 */
var allowedAttributes = {
  'href': function(node, value) {
    // Only allow a[href] starting with http:// and https://
    return node.tagName == 'A' && (value.indexOf('http://') == 0 ||
        value.indexOf('https://') == 0);
  },
  'target': function(node, value) {
    // Allow a[target] but reset the value to "".
    if (node.tagName != 'A')
      return false;
    node.setAttribute('target', '');
    return true;
  }
}

/**
 * Parse a very small subset of HTML.  This ensures that insecure HTML /
 * javascript cannot be injected into the new tab page.
 * @param {string} s The string to parse.
 * @throws {Error} In case of non supported markup.
 * @return {DocumentFragment} A document fragment containing the DOM tree.
 */
function parseHtmlSubset(s) {
  function walk(n, f) {
    f(n);
    for (var i = 0; i < n.childNodes.length; i++) {
      walk(n.childNodes[i], f);
    }
  }

  function assertElement(node) {
    if (allowedTags.indexOf(node.tagName) == -1)
      throw Error(node.tagName + ' is not supported');
  }

  function assertAttribute(attrNode, node) {
    var n = attrNode.nodeName;
    var v = attrNode.nodeValue;
    if (!allowedAttributes.hasOwnProperty(n) || !allowedAttributes[n](node, v))
      throw Error(node.tagName + '[' + n + '="' + v + '"] is not supported');
  }

  var r = document.createRange();
  r.selectNode(document.body);
  // This does not execute any scripts.
  var df = r.createContextualFragment(s);
  walk(df, function(node) {
    switch (node.nodeType) {
      case Node.ELEMENT_NODE:
        assertElement(node);
        var attrs = node.attributes;
        for (var i = 0; i < attrs.length; i++) {
          assertAttribute(attrs[i], node);
        }
        break;

      case Node.COMMENT_NODE:
      case Node.DOCUMENT_FRAGMENT_NODE:
      case Node.TEXT_NODE:
        break;

      default:
        throw Error('Node type ' + node.nodeType + ' is not supported');
    }
  });
  return df;
}
</script>

<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

const cr = (function() {

  /**
   * Whether we are using a Mac or not.
   * @type {boolean}
   */
  const isMac = /Mac/.test(navigator.platform);

  /**
   * Whether this is on the Windows platform or not.
   * @type {boolean}
   */
  const isWindows = /Win/.test(navigator.platform);

  /**
   * Whether this is on chromeOS or not.
   * @type {boolean}
   */
  const isChromeOS = /CrOS/.test(navigator.userAgent);

  /**
   * Builds an object structure for the provided namespace path,
   * ensuring that names that already exist are not overwritten. For
   * example:
   * "a.b.c" -> a = {};a.b={};a.b.c={};
   * @param {string} name Name of the object that this file defines.
   * @param {*=} opt_object The object to expose at the end of the path.
   * @param {Object=} opt_objectToExportTo The object to add the path to;
   *     default is {@code window}.
   * @private
   */
  function exportPath(name, opt_object, opt_objectToExportTo) {
    var parts = name.split('.');
    var cur = opt_objectToExportTo || window /* global */;

    for (var part; parts.length && (part = parts.shift());) {
      if (!parts.length && opt_object !== undefined) {
        // last part and we have an object; use it
        cur[part] = opt_object;
      } else if (part in cur) {
        cur = cur[part];
      } else {
        cur = cur[part] = {};
      }
    }
    return cur;
  };

  // cr.Event is called CrEvent in here to prevent naming conflicts. We also
  // store the original Event in case someone does a global alias of cr.Event.
  const DomEvent = Event;

  /**
   * Creates a new event to be used with cr.EventTarget or DOM EventTarget
   * objects.
   * @param {string} type The name of the event.
   * @param {boolean=} opt_bubbles Whether the event bubbles. Default is false.
   * @param {boolean=} opt_preventable Whether the default action of the event
   *     can be prevented.
   * @constructor
   * @extends {DomEvent}
   */
  function CrEvent(type, opt_bubbles, opt_preventable) {
    var e = cr.doc.createEvent('Event');
    e.initEvent(type, !!opt_bubbles, !!opt_preventable);
    e.__proto__ = CrEvent.prototype;
    return e;
  }

  CrEvent.prototype = {
    __proto__: DomEvent.prototype
  };

  /**
   * Fires a property change event on the target.
   * @param {EventTarget} target The target to dispatch the event on.
   * @param {string} propertyName The name of the property that changed.
   * @param {*} newValue The new value for the property.
   * @param {*} oldValue The old value for the property.
   */
  function dispatchPropertyChange(target, propertyName, newValue, oldValue) {
    var e = new CrEvent(propertyName + 'Change');
    e.propertyName = propertyName;
    e.newValue = newValue;
    e.oldValue = oldValue;
    target.dispatchEvent(e);
  }

  /**
   * The kind of property to define in {@code defineProperty}.
   * @enum {number}
   */
  const PropertyKind = {
    /**
     * Plain old JS property where the backing data is stored as a "private"
     * field on the object.
     */
    JS: 'js',

    /**
     * The property backing data is stored as an attribute on an element.
     */
    ATTR: 'attr',

    /**
     * The property backing data is stored as an attribute on an element. If the
     * element has the attribute then the value is true.
     */
    BOOL_ATTR: 'boolAttr'
  };

  /**
   * Helper function for defineProperty that returns the getter to use for the
   * property.
   * @param {string} name
   * @param {cr.PropertyKind} kind
   * @param {*} defaultValue The default value. This is only used for the ATTR
   *    kind.
   * @return {function():*} The getter for the property.
   */
  function getGetter(name, kind, defaultValue) {
    switch (kind) {
      case PropertyKind.JS:
        var privateName = name + '_';
        return function() {
          return this[privateName];
        };
      case PropertyKind.ATTR:
        // For attr with default value we return the default value if the
        // element is missing the attribute.
        if (defaultValue == undefined) {
          return function() {
            return this.getAttribute(name);
          };
        } else {
          return function() {
            // WebKit uses null for non existant attributes.
            var value = this.getAttribute(name);
            return value !== null ? value : defaultValue;
          };
        }
      case PropertyKind.BOOL_ATTR:
        // Boolean attributes don't support default values.
        return function() {
          return this.hasAttribute(name);
        };
    }
  }

  /**
   * Helper function for defineProperty that returns the setter of the right
   * kind.
   * @param {string} name The name of the property we are defining the setter
   *     for.
   * @param {cr.PropertyKind} kind The kind of property we are getting the
   *     setter for.
   * @return {function(*):void} The function to use as a setter.
   */
  function getSetter(name, kind) {
    switch (kind) {
      case PropertyKind.JS:
        var privateName = name + '_';
        return function(value) {
          var oldValue = this[privateName];
          if (value !== oldValue) {
            this[privateName] = value;
            dispatchPropertyChange(this, name, value, oldValue);
          }
        };

      case PropertyKind.ATTR:
        return function(value) {
          var oldValue = this[name];
          if (value !== oldValue) {
            this.setAttribute(name, value);
            dispatchPropertyChange(this, name, value, oldValue);
          }
        };

      case PropertyKind.BOOL_ATTR:
        return function(value) {
          var oldValue = this[name];
          if (value !== oldValue) {
            if (value)
              this.setAttribute(name, name);
            else
              this.removeAttribute(name);
            dispatchPropertyChange(this, name, value, oldValue);
          }
        };
    }
  }

  /**
   * Defines a property on an object. When the setter changes the value a
   * property change event with the type {@code name + 'Change'} is fired.
   * @param {!Object} The object to define the property for.
   * @param {string} The name of the property.
   * @param {cr.PropertyKind=} opt_kind What kind of underlying storage to use.
   * @param {*} opt_defaultValue The default value.
   */
  function defineProperty(obj, name, opt_kind, opt_default) {
    if (typeof obj == 'function')
      obj = obj.prototype;

    var kind = opt_kind || PropertyKind.JS;

    if (!obj.__lookupGetter__(name)) {
      // For js properties we set the default value on the prototype.
      if (kind == PropertyKind.JS && arguments.length > 3)  {
        var privateName = name + '_';
        obj[privateName] = opt_default;
      }
      obj.__defineGetter__(name, getGetter(name, kind, opt_default));
    }

    if (!obj.__lookupSetter__(name)) {
      obj.__defineSetter__(name, getSetter(name, kind));
    }
  }

  /**
   * Counter for use with createUid
   */
  var uidCounter = 1;

  /**
   * @return {number} A new unique ID.
   */
  function createUid() {
    return uidCounter++;
  }

  /**
   * Returns a unique ID for the item. This mutates the item so it needs to be
   * an object
   * @param {!Object} item The item to get the unique ID for.
   * @return {number} The unique ID for the item.
   */
  function getUid(item) {
    if (item.hasOwnProperty('uid'))
      return item.uid;
    return item.uid = createUid();
  }

  /**
   * Partially applies this function to a particular 'this object' and zero or
   * more arguments. The result is a new function with some arguments of the
   * first function pre-filled and the value of |this| 'pre-specified'.
   *
   * Remaining arguments specified at call-time are appended to the pre-
   * specified ones.
   *
   * Usage:
   * <pre>var barMethBound = bind(myFunction, myObj, 'arg1', 'arg2');
   * barMethBound('arg3', 'arg4');</pre>
   *
   * @param {Function} fn A function to partially apply.
   * @param {Object|undefined} selfObj Specifies the object which |this| should
   *     point to when the function is run. If the value is null or undefined,
   *     it will default to the global object.
   * @param {...*} var_args Additional arguments that are partially
   *     applied to the function.
   *
   * @return {!Function} A partially-applied form of the function bind() was
   *     invoked as a method of.
   */
  function bind(fn, selfObj, var_args) {
    var boundArgs = Array.prototype.slice.call(arguments, 2);
    return function() {
      var args = Array.prototype.slice.call(arguments);
      args.unshift.apply(args, boundArgs);
      return fn.apply(selfObj, args);
    }
  }

  /**
   * Dispatches a simple event on an event target.
   * @param {!EventTarget} target The event target to dispatch the event on.
   * @param {string} type The type of the event.
   * @param {boolean=} opt_bubbles Whether the event bubbles or not.
   * @param {boolean=} opt_cancelable Whether the default action of the event
   *     can be prevented.
   * @return {boolean} If any of the listeners called {@code preventDefault}
   *     during the dispatch this will return false.
   */
  function dispatchSimpleEvent(target, type, opt_bubbles, opt_cancelable) {
    var e = new cr.Event(type, opt_bubbles, opt_cancelable);
    return target.dispatchEvent(e);
  }

  /**
   * @param {string} name
   * @param {!Function} fun
   */
  function define(name, fun) {
    var obj = exportPath(name);
    var exports = fun();
    for (var propertyName in exports) {
      // Maybe we should check the prototype chain here? The current usage
      // pattern is always using an object literal so we only care about own
      // properties.
      var propertyDescriptor = Object.getOwnPropertyDescriptor(exports,
                                                               propertyName);
      if (propertyDescriptor)
        Object.defineProperty(obj, propertyName, propertyDescriptor);
    }
  }

  /**
   * Document used for various document related operations.
   * @type {!Document}
   */
  var doc = document;


  /**
   * Allows you to run func in the context of a different document.
   * @param {!Document} document The document to use.
   * @param {function():*} func The function to call.
   */
  function withDoc(document, func) {
    var oldDoc = doc;
    doc = document;
    try {
      func();
    } finally {
      doc = oldDoc;
    }
  }

  /**
   * Adds a {@code getInstance} static method that always return the same
   * instance object.
   * @param {!Function} ctor The constructor for the class to add the static
   *     method to.
   */
  function addSingletonGetter(ctor) {
    ctor.getInstance = function() {
      return ctor.instance_ || (ctor.instance_ = new ctor());
    };
  }

  return {
    addSingletonGetter: addSingletonGetter,
    isChromeOS: isChromeOS,
    isMac: isMac,
    isWindows: isWindows,
    define: define,
    defineProperty: defineProperty,
    PropertyKind: PropertyKind,
    createUid: createUid,
    getUid: getUid,
    bind: bind,
    dispatchSimpleEvent: dispatchSimpleEvent,
    dispatchPropertyChange: dispatchPropertyChange,

    /**
     * The document that we are currently using.
     * @type {!Document}
     */
    get doc() {
      return doc;
    },
    withDoc: withDoc,
    Event: CrEvent
  };
})();
</script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

cr.define('cr.ui', function() {

  /**
   * Decorates elements as an instance of a class.
   * @param {string|!Element} source The way to find the element(s) to decorate.
   *     If this is a string then {@code querySeletorAll} is used to find the
   *     elements to decorate.
   * @param {!Function} constr The constructor to decorate with. The constr
   *     needs to have a {@code decorate} function.
   */
  function decorate(source, constr) {
    var elements;
    if (typeof source == 'string')
      elements = cr.doc.querySelectorAll(source);
    else
      elements = [source];

    for (var i = 0, el; el = elements[i]; i++) {
      if (!(el instanceof constr))
        constr.decorate(el);
    }
  }

  /**
   * Helper function for creating new element for define.
   */
  function createElementHelper(tagName, opt_bag) {
    // Allow passing in ownerDocument to create in a different document.
    var doc;
    if (opt_bag && opt_bag.ownerDocument)
      doc = opt_bag.ownerDocument;
    else
      doc = cr.doc;
    return doc.createElement(tagName);
  }

  /**
   * Creates the constructor for a UI element class.
   *
   * Usage:
   * <pre>
   * var List = cr.ui.define('list');
   * List.prototype = {
   *   __proto__: HTMLUListElement.prototype,
   *   decorate: function() {
   *     ...
   *   },
   *   ...
   * };
   * </pre>
   *
   * @param {string|Function} tagNameOrFunction The tagName or
   *     function to use for newly created elements. If this is a function it
   *     needs to return a new element when called.
   * @return {function(Object=):Element} The constructor function which takes
   *     an optional property bag. The function also has a static
   *     {@code decorate} method added to it.
   */
  function define(tagNameOrFunction) {
    var createFunction, tagName;
    if (typeof tagNameOrFunction == 'function') {
      createFunction = tagNameOrFunction;
      tagName = '';
    } else {
      createFunction = createElementHelper;
      tagName = tagNameOrFunction;
    }

    /**
     * Creates a new UI element constructor.
     * @param {Object=} opt_propertyBag Optional bag of properties to set on the
     *     object after created. The property {@code ownerDocument} is special
     *     cased and it allows you to create the element in a different
     *     document than the default.
     * @constructor
     */
    function f(opt_propertyBag) {
      var el = createFunction(tagName, opt_propertyBag);
      f.decorate(el);
      for (var propertyName in opt_propertyBag) {
        el[propertyName] = opt_propertyBag[propertyName];
      }
      return el;
    }

    /**
     * Decorates an element as a UI element class.
     * @param {!Element} el The element to decorate.
     */
    f.decorate = function(el) {
      el.__proto__ = f.prototype;
      el.decorate();
    };

    return f;
  }

  /**
   * Input elements do not grow and shrink with their content. This is a simple
   * (and not very efficient) way of handling shrinking to content with support
   * for min width and limited by the width of the parent element.
   * @param {HTMLElement} el The element to limit the width for.
   * @param {number} parentEl The parent element that should limit the size.
   * @param {number} min The minimum width.
   */
  function limitInputWidth(el, parentEl, min) {
    // Needs a size larger than borders
    el.style.width = '10px';
    var doc = el.ownerDocument;
    var win = doc.defaultView;
    var computedStyle = win.getComputedStyle(el);
    var parentComputedStyle = win.getComputedStyle(parentEl);
    var rtl = computedStyle.direction == 'rtl';

    // To get the max width we get the width of the treeItem minus the position
    // of the input.
    var inputRect = el.getBoundingClientRect();  // box-sizing
    var parentRect = parentEl.getBoundingClientRect();
    var startPos = rtl ? parentRect.right - inputRect.right :
        inputRect.left - parentRect.left;

    // Add up border and padding of the input.
    var inner = parseInt(computedStyle.borderLeftWidth, 10) +
        parseInt(computedStyle.paddingLeft, 10) +
        parseInt(computedStyle.paddingRight, 10) +
        parseInt(computedStyle.borderRightWidth, 10);

    // We also need to subtract the padding of parent to prevent it to overflow.
    var parentPadding = rtl ? parseInt(parentComputedStyle.paddingLeft, 10) :
        parseInt(parentComputedStyle.paddingRight, 10);

    // The magic number 14 comes from trial and error :'( It consists of:
    // border + padding + treeItem.paddingEnd + treeItem.borderEnd +
    // tree.paddingEnd
    var max = parentEl.clientWidth - startPos - inner - parentPadding;

    var pcs = getComputedStyle(parentEl);
    console.log('pcs', 'borderLeft', pcs.borderLeftWidth,
                'paddingLeft', pcs.paddingLeft,
                'paddingRight', pcs.paddingRight,
                'borderRight', pcs.borderRightWidth,
                'width', pcs.width,
                'clientWidth', parentEl.clientWidth,
                'offsetWidth', parentEl.offsetWidth);

    function limit() {
      if (el.scrollWidth > max) {
        el.style.width = max + 'px';
      } else {
        el.style.width = 0;
        var sw = el.scrollWidth;
        if (sw < min) {
          el.style.width = min + 'px';
        } else {
          el.style.width = sw + 'px';
        }
      }
    }

    el.addEventListener('input', limit);
    limit();
  }

  return {
    decorate: decorate,
    define: define,
    limitInputWidth: limitInputWidth
  };
});
</script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

/**
 * @fileoverview A command is an abstraction of an action a user can do in the
 * UI.
 *
 * When the focus changes in the document for each command a canExecute event
 * is dispatched on the active element. By listening to this event you can
 * enable and disable the command by setting the event.canExecute property.
 *
 * When a command is executed a command event is dispatched on the active
 * element. Note that you should stop the propagation after you have handled the
 * command if there might be other command listeners higher up in the DOM tree.
 */

cr.define('cr.ui', function() {

  /**
   * This is used to identify keyboard shortcuts.
   * @param {string} shortcut The text used to describe the keys for this
   *     keyboard shortcut.
   * @constructor
   */
  function KeyboardShortcut(shortcut) {
    var mods = {};
    var ident = '';
    shortcut.split('-').forEach(function(part) {
      var partLc = part.toLowerCase();
      switch (partLc) {
        case 'alt':
        case 'ctrl':
        case 'meta':
        case 'shift':
          mods[partLc + 'Key'] = true;
          break;
        default:
          if (ident)
            throw Error('Invalid shortcut');
          ident = part;
      }
    });

    this.ident_ = ident;
    this.mods_ = mods;
  }

  KeyboardShortcut.prototype = {
    /**
     * Wether the keyboard shortcut object mathes a keyboard event.
     * @param {!Event} e The keyboard event object.
     * @return {boolean} Whether we found a match or not.
     */
    matchesEvent: function(e) {
      if (e.keyIdentifier == this.ident_) {
        // All keyboard modifiers needs to match.
        var mods = this.mods_;
        return ['altKey', 'ctrlKey', 'metaKey', 'shiftKey'].every(function(k) {
          return e[k] == !!mods[k];
        });
      }
      return false;
    }
  };

  /**
   * Creates a new command element.
   * @constructor
   * @extends {HTMLElement}
   */
  var Command = cr.ui.define('command');

  Command.prototype = {
    __proto__: HTMLElement.prototype,

    /**
     * Initializes the command.
     */
    decorate: function() {
      CommandManager.init(this.ownerDocument);
    },

    /**
     * Executes the command. This dispatches a command event on the active
     * element. If the command is {@code disabled} this does nothing.
     */
    execute: function() {
      if (this.disabled)
        return;
      var doc = this.ownerDocument;
      if (doc.activeElement) {
        var e = new cr.Event('command', true, false);
        e.command = this;
        doc.activeElement.dispatchEvent(e);
      }
    },

    /**
     * Call this when there have been changes that might change whether the
     * command can be executed or not.
     */
    canExecuteChange: function() {
      dispatchCanExecuteEvent(this, this.ownerDocument.activeElement);
    },

    /**
     * The keyboard shortcut that triggers the command. This is a string
     * consisting of a keyIdentifier (as reported by WebKit in keydown) as
     * well as optional key modifiers joinded with a '-'.
     *
     * Multiple keyboard shortcuts can be provided by separating them by
     * whitespace.
     *
     * For example:
     *   "F1"
     *   "U+0008-Meta" for Apple command backspace.
     *   "U+0041-Ctrl" for Control A
     *   "U+007F U+0008-Meta" for Delete and Command Backspace
     *
     * @type {string}
     */
    shortcut_: '',
    get shortcut() {
      return this.shortcut_;
    },
    set shortcut(shortcut) {
      var oldShortcut = this.shortcut_;
      if (shortcut !== oldShortcut) {
        this.keyboardShortcuts_ = shortcut.split(/\s+/).map(function(shortcut) {
          return new KeyboardShortcut(shortcut);
        });

        // Set this after the keyboardShortcuts_ since that might throw.
        this.shortcut_ = shortcut;
        cr.dispatchPropertyChange(this, 'shortcut', this.shortcut_,
                                  oldShortcut);
      }
    },

    /**
     * Whether the event object matches the shortcut for this command.
     * @param {!Event} e The key event object.
     * @return {boolean} Whether it matched or not.
     */
    matchesEvent: function(e) {
      if (!this.keyboardShortcuts_)
        return false;

      return this.keyboardShortcuts_.some(function(keyboardShortcut) {
        return keyboardShortcut.matchesEvent(e);
        });
      }
  };

  /**
   * The label of the command.
   * @type {string}
   */
  cr.defineProperty(Command, 'label', cr.PropertyKind.ATTR);

  /**
   * Whether the command is disabled or not.
   * @type {boolean}
   */
  cr.defineProperty(Command, 'disabled', cr.PropertyKind.BOOL_ATTR);

  /**
   * Whether the command is hidden or not.
   * @type {boolean}
   */
  cr.defineProperty(Command, 'hidden', cr.PropertyKind.BOOL_ATTR);

  /**
   * Dispatches a canExecute event on the target.
   * @param {cr.ui.Command} command The command that we are testing for.
   * @param {Element} target The target element to dispatch the event on.
   */
  function dispatchCanExecuteEvent(command, target) {
    var e = new CanExecuteEvent(command, true)
    target.dispatchEvent(e);
    command.disabled = !e.canExecute;
  }

  /**
   * The command managers for different documents.
   */
  var commandManagers = {};

  /**
   * Keeps track of the focused element and updates the commands when the focus
   * changes.
   * @param {!Document} doc The document that we are managing the commands for.
   * @constructor
   */
  function CommandManager(doc) {
    doc.addEventListener('focus', cr.bind(this.handleFocus_, this), true);
    // Make sure we add the listener to the bubbling phase so that elements can
    // prevent the command.
    doc.addEventListener('keydown', cr.bind(this.handleKeyDown_, this), false);
  }

  /**
   * Initializes a command manager for the document as needed.
   * @param {!Document} doc The document to manage the commands for.
   */
  CommandManager.init = function(doc) {
    var uid = cr.getUid(doc);
    if (!(uid in commandManagers)) {
      commandManagers[uid] = new CommandManager(doc);
    }
  },

  CommandManager.prototype = {

    /**
     * Handles focus changes on the document.
     * @param {Event} e The focus event object.
     * @private
     */
    handleFocus_: function(e) {
      var target = e.target;
      var commands = Array.prototype.slice.call(
          target.ownerDocument.querySelectorAll('command'));

      commands.forEach(function(command) {
        dispatchCanExecuteEvent(command, target);
      });
    },

    /**
     * Handles the keydown event and routes it to the right command.
     * @param {!Event} e The keydown event.
     */
    handleKeyDown_: function(e) {
      var target = e.target;
      var commands = Array.prototype.slice.call(
          target.ownerDocument.querySelectorAll('command'));

      for (var i = 0, command; command = commands[i]; i++) {
        if (!command.disabled && command.matchesEvent(e)) {
          e.preventDefault();
          // We do not want any other element to handle this.
          e.stopPropagation();

          command.execute();
          return;
        }
      }
    }
  };

  /**
   * The event type used for canExecute events.
   * @param {!cr.ui.Command} command The command that we are evaluating.
   * @extends {Event}
   */
  function CanExecuteEvent(command) {
    var e = command.ownerDocument.createEvent('Event');
    e.initEvent('canExecute', true, false);
    e.__proto__ = CanExecuteEvent.prototype;
    e.command = command;
    return e;
  }

  CanExecuteEvent.prototype = {
    __proto__: Event.prototype,

    /**
     * The current command
     * @type {cr.ui.Command}
     */
    command: null,

    /**
     * Whether the target can execute the command. Setting this also stops the
     * propagation.
     * @type {boolean}
     */
    canExecute_: false,
    get canExecute() {
      return this.canExecute_;
    },
    set canExecute(canExecute) {
      this.canExecute_ = !!canExecute;
      this.stopPropagation();
    }
  };

  // Export
  return {
    Command: Command,
    CanExecuteEvent: CanExecuteEvent
  };
});
</script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

cr.define('cr.ui', function() {
  const Command = cr.ui.Command;

  /**
   * Creates a new menu item element.
   * @param {Object=} opt_propertyBag Optional properties.
   * @constructor
   * @extends {HTMLDivElement}
   */
  var MenuItem = cr.ui.define('div');

  /**
   * Creates a new menu separator element.
   * @return {cr.ui.MenuItem}
   */
  MenuItem.createSeparator = function() {
    var el = cr.doc.createElement('hr');
    MenuItem.decorate(el);
    return el;
  };

  MenuItem.prototype = {
    __proto__: HTMLButtonElement.prototype,

    /**
     * Initializes the menu item.
     */
    decorate: function() {
      var commandId;
      if ((commandId = this.getAttribute('command')))
        this.command = commandId;

      this.addEventListener('mouseup', this.handleMouseUp_);
    },

    /**
     * The command associated with this menu item. If this is set to a string
     * of the form "#element-id" then the element is looked up in the document
     * of the command.
     * @type {cr.ui.Command}
     */
    command_: null,
    get command() {
      return this.command_;
    },
    set command(command) {
      if (this.command_) {
        this.command_.removeEventListener('labelChange', this);
        this.command_.removeEventListener('disabledChange', this);
        this.command_.removeEventListener('hiddenChange', this);
      }

      if (typeof command == 'string' && command[0] == '#') {
        command = this.ownerDocument.getElementById(command.slice(1));
        cr.ui.decorate(command, Command);
      }

      this.command_ = command;
      if (command) {
        if (command.id)
          this.setAttribute('command', '#' + command.id);

        this.label = command.label;
        this.disabled = command.disabled;
        this.hidden = command.hidden;

        this.command_.addEventListener('labelChange', this);
        this.command_.addEventListener('disabledChange', this);
        this.command_.addEventListener('hiddenChange', this);
      }
    },

    /**
     * The text label.
     * @type {string}
     */
    get label() {
      return this.textContent;
    },
    set label(label) {
      this.textContent = label;
    },

    /**
     * @return {boolean} Whether the menu item is a separator.
     */
    isSeparator: function() {
      return this.tagName == 'HR';
    },

    /**
     * Handles mouseup events. This dispatches an active event and if there
     * is an assiciated command then that is executed.
     * @param {Event} The mouseup event object.
     * @private
     */
    handleMouseUp_: function(e) {
      if (!this.disabled && !this.isSeparator()) {
        // Dispatch command event followed by executing the command object.
        if (cr.dispatchSimpleEvent(this, 'activate', true, true)) {
          var command = this.command;
          if (command)
            command.execute();
        }
      }
    },

    /**
     * Handles changes to the associated command.
     * @param {Event} e The event object.
     */
    handleEvent: function(e) {
      switch (e.type) {
        case 'disabledChange':
          this.disabled = this.command.disabled;
          break;
        case 'hiddenChange':
          this.hidden = this.command.hidden;
          break;
        case 'labelChange':
          this.label = this.command.label;
          break;
      }
    }
  };

  /**
   * Whether the menu item is disabled or not.
   * @type {boolean}
   */
  cr.defineProperty(MenuItem, 'disabled', cr.PropertyKind.BOOL_ATTR);

  /**
   * Whether the menu item is hidden or not.
   * @type {boolean}
   */
  cr.defineProperty(MenuItem, 'hidden', cr.PropertyKind.BOOL_ATTR);

  /**
   * Whether the menu item is selected or not.
   * @type {boolean}
   */
  cr.defineProperty(MenuItem, 'selected', cr.PropertyKind.BOOL_ATTR);

  // Export
  return {
    MenuItem: MenuItem
  };
});
</script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

cr.define('cr.ui', function() {

  const MenuItem = cr.ui.MenuItem;

  /**
   * Creates a new menu element.
   * @param {Object=} opt_propertyBag Optional properties.
   * @constructor
   * @extends {HTMLMenuElement}
   */
  var Menu = cr.ui.define('menu');

  Menu.prototype = {
    __proto__: HTMLMenuElement.prototype,

    /**
     * Initializes the menu element.
     */
    decorate: function() {
      this.addEventListener('mouseover', this.handleMouseOver_);
      this.addEventListener('mouseout', this.handleMouseOut_);

      // Decorate the children as menu items.
      var children = this.children;
      for (var i = 0, child; child = children[i]; i++) {
        cr.ui.decorate(child, MenuItem);
      }
    },

    /**
     * Walks up the ancestors until a menu item belonging to this menu is found.
     * @param {Element} el
     * @return {cr.ui.MenuItem} The found menu item or null.
     * @private
     */
    findMenuItem_: function(el) {
      while (el && el.parentNode != this) {
        el = el.parentNode;
      }
      return el;
    },

    /**
     * Handles mouseover events and selects the hovered item.
     * @param {Event} e The mouseover event.
     * @private
     */
    handleMouseOver_: function(e) {
      var overItem = this.findMenuItem_(e.target);
      this.selectedItem = overItem;
    },

    /**
     * Handles mouseout events and deselects any selected item.
     * @param {Event} e The mouseout event.
     * @private
     */
    handleMouseOut_: function(e) {
      this.selectedItem = null;
    },

    /**
     * The index of the selected item.
     * @type {boolean}
     */
    // getter and default value is defined using cr.defineProperty.
    set selectedIndex(selectedIndex) {
      if (this.selectedIndex_ != selectedIndex) {
        var oldSelectedItem = this.selectedItem;
        this.selectedIndex_ = selectedIndex;
        if (oldSelectedItem)
          oldSelectedItem.selected = false;
        var item = this.selectedItem;
        if (item)
          item.selected = true;

        cr.dispatchSimpleEvent(this, 'change');
      }
    },

    /**
     * The selected menu item or null if none.
     * @type {cr.ui.MenuItem}
     */
    get selectedItem() {
      return this.children[this.selectedIndex];
    },
    set selectedItem(item) {
      var index = Array.prototype.indexOf.call(this.children, item);
      this.selectedIndex = index;
    },

    /**
     * This is the function that handles keyboard navigation. This is usually
     * called by the element responsible for managing the menu.
     * @param {Event} e The keydown event object.
     * @return {boolean} Whether the event was handled be the menu.
     */
    handleKeyDown: function(e) {
      var item = this.selectedItem;

      var self = this;
      function selectNextVisible(m) {
        var children = self.children;
        var len = children.length;
        var i = self.selectedIndex;
        if (i == -1 && m == -1) {
          // Edge case when we need to go the last item fisrt.
          i = 0;
        }
        while (true) {
          i = (i + m + len) % len;
          item = children[i];
          if (item && !item.isSeparator() && !item.hidden)
            break;
        }
        if (item)
          self.selectedIndex = i;
      }

      switch (e.keyIdentifier) {
        case 'Down':
          selectNextVisible(1);
          return true;
        case 'Up':
          selectNextVisible(-1);
          return true;
        case 'Enter':
        case 'U+0020': // Space
          if (item) {
            if (cr.dispatchSimpleEvent(item, 'activate', true, true)) {
              if (item.command)
                item.command.execute();
            }
          }
          return true;
      }

      return false;
    }
  };

  /**
   * The selected menu item.
   * @type {number}
   */
  cr.defineProperty(Menu, 'selectedIndex', cr.PropertyKind.JS, -1);

  // Export
  return {
    Menu: Menu
  };
});
</script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

/**
 * @fileoverview This file provides utility functions for position popups.
 */

cr.define('cr.ui', function() {

  /**
   * Type def for rects as returned by getBoundingClientRect.
   * @typedef { {left: number, top: number, width: number, height: number,
   *             right: number, bottom: number}}
   */
  var Rect;

  /**
   * Enum for defining how to anchor a popup to an anchor element.
   * @enum {number}
   */
  const AnchorType = {
    /**
     * The popup's right edge is aligned with the left edge of the anchor.
     * The popup's top edge is aligned with the top edge of the anchor's top
     * edge.
     */
    BEFORE: 1,  // p: right, a: left, p: top, a: top

    /**
     * The popop's left edge is aligned with the right edge of the anchor.
     * The popup's top edge is aligned with the top edge of the anchor's top
     * edge.
     */
    AFTER: 2,  // p: left a: right, p: top, a: top

    /**
     * The popop's bottom edge is aligned with the top edge of the anchor.
     * The popup's left edge is aligned with the left edge of the anchor's top
     * edge.
     */
    ABOVE: 3,  // p: bottom, a: top, p: left, a: left

    /**
     * The popop's top edge is aligned with the bottom edge of the anchor.
     * The popup's left edge is aligned with the left edge of the anchor's top
     * edge.
     */
    BELOW: 4  // p: top, a: bottom, p: left, a: left
  };

  /**
   * Helper function for positionPopupAroundElement and positionPopupAroundRect.
   * @param {!Rect} anchorRect The rect for the anchor.
   * @param {!HTMLElement} popupElement The element used for the popup.
   * @param {AnchorType} type The type of anchoring to do.
   */
  function positionPopupAroundRect(anchorRect, popupElement, type) {
    var popupRect = popupElement.getBoundingClientRect();
    var popupContainer;
    var cs = popupElement.ownerDocument.defaultView.
        getComputedStyle(popupElement);
    if (cs.position == 'fixed')
      popupContainer = popupElement.ownerDocument.body;
    else
      popupContainer = popupElement.offsetParent;
    var availRect = popupContainer.getBoundingClientRect();
    var rtl = cs.direction == 'rtl';

    // Flip BEFORE, AFTER based on RTL.
    if (rtl) {
      if (type == AnchorType.BEFORE)
        type = AnchorType.AFTER;
      else if (type == AnchorType.AFTER)
        type = AnchorType.BEFORE;
    }

    // Flip type based on available size
    switch (type) {
      case AnchorType.BELOW:
        if (anchorRect.bottom + popupRect.height > availRect.height &&
            popupRect.height <= anchorRect.top) {
          type = AnchorType.ABOVE;
        }
        break;
      case AnchorType.ABOVE:
        if (popupRect.height > anchorRect.top &&
            anchorRect.bottom + popupRect.height <= availRect.height) {
          type = AnchorType.BELOW;
        }
        break;
      case AnchorType.AFTER:
        if (anchorRect.right + popupRect.width > availRect.width &&
            popupRect.width <= anchorRect.left) {
          type = AnchorType.BEFORE;
        }
        break;
      case AnchorType.BEFORE:
        if (popupRect.width > anchorRect.left &&
            anchorRect.right + popupRect.width <= availRect.width) {
          type = AnchorType.AFTER;
        }
        break;
    }
    // flipping done

    var style = popupElement.style;
    // Reset all directions.
    style.left = style.right = style.top = style.bottom = 'auto'

    // Primary direction
    switch (type) {
      case AnchorType.BELOW:
        if (anchorRect.bottom + popupRect.height <= availRect.height)
          style.top = anchorRect.bottom + 'px';
        else
          style.bottom = '0';
        break;
      case AnchorType.ABOVE:
        if (availRect.height - anchorRect.top >= 0)
          style.bottom = availRect.height - anchorRect.top + 'px';
        else
          style.top = '0';
        break;
      case AnchorType.AFTER:
        if (anchorRect.right + popupRect.width <= availRect.width)
          style.left = anchorRect.right + 'px';
        else
          style.right = '0';
        break;
      case AnchorType.BEFORE:
        if (availRect.width - anchorRect.left >= 0)
          style.right = availRect.width - anchorRect.left + 'px';
        else
          style.left = '0';
        break;
    }

    // Secondary direction
    switch (type) {
      case AnchorType.BELOW:
      case AnchorType.ABOVE:
        if (rtl) {
          // align right edges
          if (anchorRect.right - popupRect.width >= 0) {
            style.right = availRect.width - anchorRect.right + 'px';

          // align left edges
          } else if (anchorRect.left + popupRect.width <= availRect.width) {
            style.left = anchorRect.left + 'px';

          // not enough room on either side
          } else {
            style.right = '0';
          }
        } else {
          // align left edges
          if (anchorRect.left + popupRect.width <= availRect.width) {
            style.left = anchorRect.left + 'px';

          // align right edges
          } else if (anchorRect.right - popupRect.width >= 0) {
            style.right = availRect.width - anchorRect.right + 'px';

          // not enough room on either side
          } else {
            style.left = '0';
          }
        }
        break;

      case AnchorType.AFTER:
      case AnchorType.BEFORE:
        // align top edges
        if (anchorRect.top + popupRect.height <= availRect.height) {
          style.top = anchorRect.top + 'px';

        // align bottom edges
        } else if (anchorRect.bottom - popupRect.height >= 0) {
          style.bottom = availRect.height - anchorRect.bottom + 'px';

          // not enough room on either side
        } else {
          style.top = '0';
        }
        break;
    }
  }

  /**
   * Positions a popup element relative to an anchor element. The popup element
   * should have position set to absolute and it should be a child of the body
   * element.
   * @param {!HTMLElement} anchorElement The element that the popup is anchored
   *     to.
   * @param {!HTMLElement} popupElement The popup element we are positioning.
   * @param {AnchorType} type The type of anchoring we want.
   */
  function positionPopupAroundElement(anchorElement, popupElement, type) {
    var anchorRect = anchorElement.getBoundingClientRect();
    positionPopupAroundRect(anchorRect, popupElement, type);
  }

  /**
   * Positions a popup around a point.
   * @param {number} x The client x position.
   * @param {number} y The client y position.
   * @param {!HTMLElement} popupElement The popup element we are positioning.
   */
  function positionPopupAtPoint(x, y, popupElement) {
    var rect = {
      left: x,
      top: y,
      width: 0,
      height: 0,
      right: x,
      bottom: y
    };
    positionPopupAroundRect(rect, popupElement, AnchorType.BELOW);
  }

  // Export
  return {
    AnchorType: AnchorType,
    positionPopupAroundElement: positionPopupAroundElement,
    positionPopupAtPoint: positionPopupAtPoint
  };
});
</script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

cr.define('cr.ui', function() {
  const Menu = cr.ui.Menu;
  const positionPopupAroundElement = cr.ui.positionPopupAroundElement;

  /**
   * Creates a new menu button element.
   * @param {Object=} opt_propertyBag Optional properties.
   * @constructor
   * @extends {HTMLButtonElement}
   */
  var MenuButton = cr.ui.define('button');

  MenuButton.prototype = {
    __proto__: HTMLButtonElement.prototype,

    /**
     * Initializes the menu button.
     */
    decorate: function() {
      this.addEventListener('mousedown', this);
      this.addEventListener('keydown', this);

      var menu;
      if ((menu = this.getAttribute('menu')))
        this.menu = menu;
    },

    /**
     * The menu associated with the menu button.
     * @type {cr.ui.Menu}
     */
    get menu() {
      return this.menu_;
    },
    set menu(menu) {
      if (typeof menu == 'string' && menu[0] == '#') {
        menu = this.ownerDocument.getElementById(menu.slice(1));
        cr.ui.decorate(menu, Menu);
      }

      this.menu_ = menu;
      if (menu) {
        if (menu.id)
          this.setAttribute('menu', '#' + menu.id);
      }
    },

    /**
     * Handles event callbacks.
     * @param {Event} e The event object.
     */
    handleEvent: function(e) {
      if (!this.menu)
        return;

      switch (e.type) {
        case 'mousedown':
          if (e.currentTarget == this.ownerDocument) {
            if (!this.contains(e.target) && !this.menu.contains(e.target))
              this.hideMenu();
            else
              e.preventDefault();
          } else {
            if (this.isMenuShown()) {
              this.hideMenu();
            } else if (e.button == 0) {  // Only show the menu when using left
                                         // mouse button.
              this.showMenu();
              // Prevent the button from stealing focus on mousedown.
              e.preventDefault();
            }
          }
          break;
        case 'keydown':
          this.handleKeyDown(e);
          // If the menu is visible we let it handle all the keyboard events.
          if (this.isMenuShown() && e.currentTarget == this.ownerDocument) {
            this.menu.handleKeyDown(e);
            e.preventDefault();
            e.stopPropagation();
          }
          break;

        case 'activate':
        case 'blur':
        case 'resize':
          this.hideMenu();
          break;
      }
    },

    /**
     * Shows the menu.
     */
    showMenu: function() {
      this.menu.style.display = 'block';
      this.setAttribute('menu-shown', '');

      // when the menu is shown we steal all keyboard events.
      var doc = this.ownerDocument;
      var win = doc.defaultView;
      doc.addEventListener('keydown', this, true);
      doc.addEventListener('mousedown', this, true);
      doc.addEventListener('blur', this, true);
      win.addEventListener('resize', this);
      this.menu.addEventListener('activate', this);
      this.positionMenu_();
    },

    /**
     * Hides the menu.
     */
    hideMenu: function() {
      this.removeAttribute('menu-shown');
      this.menu.style.display = 'none';
      var doc = this.ownerDocument;
      var win = doc.defaultView;
      doc.removeEventListener('keydown', this, true);
      doc.removeEventListener('mousedown', this, true);
      doc.removeEventListener('blur', this, true);
      win.removeEventListener('resize', this);
      this.menu.removeEventListener('activate', this);
      this.menu.selectedIndex = -1;
    },

    /**
     * Whether the menu is shown.
     */
    isMenuShown: function() {
      return window.getComputedStyle(this.menu).display != 'none';
    },

    /**
     * Positions the menu below the menu button. At this point we do not use any
     * advanced positioning logic to ensure the menu fits in the viewport.
     * @private
     */
    positionMenu_: function() {
      positionPopupAroundElement(this, this.menu, cr.ui.AnchorType.BELOW);
    },

    /**
     * Handles the keydown event for the menu button.
     */
    handleKeyDown: function(e) {
      switch (e.keyIdentifier) {
        case 'Down':
        case 'Up':
        case 'Enter':
        case 'U+0020': // Space
          if (!this.isMenuShown())
            this.showMenu();
          e.preventDefault();
          break;
        case 'Esc':
        case 'U+001B': // Maybe this is remote desktop playing a prank?
          this.hideMenu();
          break;
      }
    }
  };

  // Export
  return {
    MenuButton: MenuButton
  };
});
</script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

/**
 * @fileoverview This implements a special button that is useful for showing a
 * context menu.
 */

cr.define('cr.ui', function() {
  const MenuButton = cr.ui.MenuButton;

  /**
   * Helper function for ContextMenuButton to find the first ancestor of the
   * button that has a context menu.
   * @param {!MenuButton} el The button to start the search from.
   * @return {HTMLElement} The found element or null if not found.
   */
  function getContextMenuTarget(el) {
    do {
      el = el.parentNode;
    } while (el && !('contextMenu' in el));
    return el;
  }

  /**
   * Creates a new menu button which is used to show the context menu for an
   * ancestor that has a {@code contextMenu} property.
   * @param {Object=} opt_propertyBag Optional properties.
   * @constructor
   * @extends {MenuButton}
   */
  var ContextMenuButton = cr.ui.define('button');

  ContextMenuButton.prototype = {
    __proto__: MenuButton.prototype,

    /**
     * Override to return the contextMenu for the ancestor.
     * @override
     * @type {cr.ui.Menu}
     */
    get menu() {
      var target = getContextMenuTarget(this);
      return target && target.contextMenu;
    },

    /** @inheritDoc */
    decorate: function() {
      this.tabIndex = -1;
      this.addEventListener('mouseup', this);
      MenuButton.prototype.decorate.call(this);
    },

    /** @inheritDoc */
    handleEvent: function(e) {
      switch (e.type) {
        case 'mousedown':
          // Menu buttons prevent focus changes.
          var target = getContextMenuTarget(this);
          if (target)
            target.focus();
          break;
        case 'mouseup':
          // Stop mouseup to prevent selection changes.
          e.stopPropagation();
          break;
      }
      MenuButton.prototype.handleEvent.call(this, e);
    }
  };

  // Export
  return {
    ContextMenuButton: ContextMenuButton
  };
});
</script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

cr.define('cr.ui', function() {

  const positionPopupAtPoint = cr.ui.positionPopupAtPoint;
  const Menu = cr.ui.Menu;

  /**
   * Handles context menus.
   * @constructor
   */
  function ContextMenuHandler() {}

  ContextMenuHandler.prototype = {

    /**
     * The menu that we are currently showing.
     * @type {cr.ui.Menu}
     */
    menu_: null,
    get menu() {
      return this.menu_;
    },

    /**
     * Shows a menu as a context menu.
     * @param {!Event} e The event triggering the show (usally a contextmenu
     *     event).
     * @param {!cr.ui.Menu} menu The menu to show.
     */
    showMenu: function(e, menu) {
      this.menu_ = menu;

      menu.style.display = 'block';
      // when the menu is shown we steal all keyboard events.
      var doc = menu.ownerDocument;
      doc.addEventListener('keydown', this, true);
      doc.addEventListener('mousedown', this, true);
      doc.addEventListener('blur', this, true);
      doc.defaultView.addEventListener('resize', this);
      menu.addEventListener('contextmenu', this);
      menu.addEventListener('activate', this);
      this.positionMenu_(e, menu);
    },

    /**
     * Hide the currently shown menu.
     */
    hideMenu: function() {
      var menu = this.menu;
      if (!menu)
        return;

      menu.style.display = 'none';
      var doc = menu.ownerDocument;
      doc.removeEventListener('keydown', this, true);
      doc.removeEventListener('mousedown', this, true);
      doc.removeEventListener('blur', this, true);
      doc.defaultView.removeEventListener('resize', this);
      menu.removeEventListener('contextmenu', this);
      menu.removeEventListener('activate', this);
      menu.selectedIndex = -1;
      this.menu_ = null;

      // On windows we might hide the menu in a right mouse button up and if
      // that is the case we wait some short period before we allow the menu
      // to be shown again.
      this.hideTimestamp_ = cr.isWindows ? Date.now() : 0;
    },

    /**
     * Positions the menu
     * @param {!Event} e The event object triggering the showing.
     * @param {!cr.ui.Menu} menu The menu to position.
     * @private
     */
    positionMenu_: function(e, menu) {
      // TODO(arv): Handle scrolled documents when needed.

      var element = e.currentTarget;
      var x, y;
      // When the user presses the context menu key (on the keyboard) we need
      // to detect this.
      if (this.keyIsDown_) {
        var rect = element.getRectForContextMenu ?
                       element.getRectForContextMenu() :
                       element.getBoundingClientRect();
        var offset = Math.min(rect.width, rect.height) / 2;
        x = rect.left + offset;
        y = rect.top + offset;
      } else {
        x = e.clientX;
        y = e.clientY;
      }

      positionPopupAtPoint(x, y, menu);
    },

    /**
     * Handles event callbacks.
     * @param {!Event} e The event object.
     */
    handleEvent: function(e) {
      // Keep track of keydown state so that we can use that to determine the
      // reason for the contextmenu event.
      switch (e.type) {
        case 'keydown':
          this.keyIsDown_ = !e.ctrlKey && !e.altKey &&
              // context menu key or Shift-F10
              (e.keyCode == 93 && !e.shiftKey ||
               e.keyIdentifier == 'F10' && e.shiftKey);
          break;

        case 'keyup':
          this.keyIsDown_ = false;
          break;
      }

      // Context menu is handled even when we have no menu.
      if (e.type != 'contextmenu' && !this.menu)
        return;

      switch (e.type) {
        case 'mousedown':
          if (!this.menu.contains(e.target))
            this.hideMenu();
          else
            e.preventDefault();
          break;
        case 'keydown':
          // keyIdentifier does not report 'Esc' correctly
          if (e.keyCode == 27 /* Esc */) {
            this.hideMenu();

          // If the menu is visible we let it handle all the keyboard events.
          } else if (this.menu) {
            this.menu.handleKeyDown(e);
            e.preventDefault();
            e.stopPropagation();
          }
          break;

        case 'activate':
        case 'blur':
        case 'resize':
          this.hideMenu();
          break;

        case 'contextmenu':
          if ((!this.menu || !this.menu.contains(e.target)) &&
              (!this.hideTimestamp_ || Date.now() - this.hideTimestamp_ > 50))
            this.showMenu(e, e.currentTarget.contextMenu);
          e.preventDefault();
          // Don't allow elements further up in the DOM to show their menus.
          e.stopPropagation();
          break;
      }
    },

    /**
     * Adds a contextMenu property to an element or element class.
     * @param {!Element|!Function} element The element or class to add the
     *     contextMenu property to.
     */
    addContextMenuProperty: function(element) {
      if (typeof element == 'function')
        element = element.prototype;

      element.__defineGetter__('contextMenu', function() {
        return this.contextMenu_;
      });
      element.__defineSetter__('contextMenu', function(menu) {
        var oldContextMenu = this.contextMenu;

        if (typeof menu == 'string' && menu[0] == '#') {
          menu = this.ownerDocument.getElementById(menu.slice(1));
          cr.ui.decorate(menu, Menu);
        }

        if (menu === oldContextMenu)
          return;

        if (oldContextMenu && !menu) {
          this.removeEventListener('contextmenu', contextMenuHandler);
          this.removeEventListener('keydown', contextMenuHandler);
          this.removeEventListener('keyup', contextMenuHandler);
        }
        if (menu && !oldContextMenu) {
          this.addEventListener('contextmenu', contextMenuHandler);
          this.addEventListener('keydown', contextMenuHandler);
          this.addEventListener('keyup', contextMenuHandler);
        }

        this.contextMenu_ = menu;

        if (menu && menu.id)
          this.setAttribute('contextmenu', '#' + menu.id);

        cr.dispatchPropertyChange(this, 'contextMenu', menu, oldContextMenu);
      });

      if (!element.getRectForContextMenu) {
        /**
         * @return {!ClientRect} The rect to use for positioning the context
         *     menu when the context menu is not opened using a mouse position.
         */
        element.getRectForContextMenu = function() {
          return this.getBoundingClientRect();
        };
      }
    }
  };

  /**
   * The singleton context menu handler.
   * @type {!ContextMenuHandler}
   */
  var contextMenuHandler = new ContextMenuHandler;

  // Export
  return {
    contextMenuHandler: contextMenuHandler
  };
});
</script>

<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// TODO(arv): Move to shared/js once namespaced and tested.

var global = this;
const IS_MAC = /^Mac/.test(navigator.platform);

function $(id) {
  return document.getElementById(id);
}

function bind(fn, selfObj, var_args) {
  var boundArgs = Array.prototype.slice.call(arguments, 2);
  return function() {
    var args = Array.prototype.slice.call(arguments);
    args.unshift.apply(args, boundArgs);
    return fn.apply(selfObj, args);
  }
}

function url(s) {
  // http://www.w3.org/TR/css3-values/#uris
  // Parentheses, commas, whitespace characters, single quotes (') and double
  // quotes (") appearing in a URI must be escaped with a backslash
  var s2 = s.replace(/(\(|\)|\,|\s|\'|\"|\\)/g, '\\$1');
  // WebKit has a bug when it comes to URLs that end with \
  // https://bugs.webkit.org/show_bug.cgi?id=28885
  if (/\\\\$/.test(s2)) {
    // Add a space to work around the WebKit bug.
    s2 += ' ';
  }
  return 'url("' + s2 + '")';
}

function findAncestorByClass(el, className) {
  return findAncestor(el, function(el) {
    if (el.classList)
      return el.classList.contains(className);
    return null;
  });
}

/**
 * Return the first ancestor for which the {@code predicate} returns true.
 * @param {Node} node The node to check.
 * @param {function(Node) : boolean} predicate The function that tests the
 *     nodes.
 * @return {Node} The found ancestor or null if not found.
 */
function findAncestor(node, predicate) {
  var last = false;
  while (node != null && !(last = predicate(node))) {
    node = node.parentNode;
  }
  return last ? node : null;
}

function swapDomNodes(a, b) {
  var afterA = a.nextSibling;
  if (afterA == b) {
    swapDomNodes(b, a);
    return;
  }
  var aParent = a.parentNode;
  b.parentNode.replaceChild(a, b);
  aParent.insertBefore(b, afterA);
}

/**
 * Calls chrome.send with a callback and restores the original afterwards.
 */
function chromeSend(name, params, callbackName, callback) {
  var old = global[callbackName];
  global[callbackName] = function() {
    // restore
    global[callbackName] = old;

    var args = Array.prototype.slice.call(arguments);
    return callback.apply(global, args);
  };
  chrome.send(name, params);
}


</script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Dependencies that we should remove/formalize:
// ../shared/js/class_list.js
// util.js
//
// afterTransition
// chrome.send
// hideNotification
// isRtl
// localStrings
// logEvent
// showNotification


var MostVisited = (function() {

  function addPinnedUrl(item, index) {
    chrome.send('addPinnedURL', [item.url, item.title, item.faviconUrl || '',
                                 item.thumbnailUrl || '', String(index)]);
  }

  function getItem(el) {
    return findAncestorByClass(el, 'thumbnail-container');
  }

  function updatePinnedDom(el, pinned) {
    el.querySelector('.pin').title = localStrings.getString(pinned ?
        'unpinthumbnailtooltip' : 'pinthumbnailtooltip');
    if (pinned) {
      el.classList.add('pinned');
    } else {
      el.classList.remove('pinned');
    }
  }

  function getThumbnailIndex(el) {
    var nodes = el.parentNode.querySelectorAll('.thumbnail-container');
    return Array.prototype.indexOf.call(nodes, el);
  }

  function MostVisited(el, miniview, menu, useSmallGrid, visible) {
    this.element = el;
    this.miniview = miniview;
    this.menu = menu;
    this.useSmallGrid_ = useSmallGrid;
    this.visible_ = visible;

    this.createThumbnails_();
    this.applyMostVisitedRects_();

    el.addEventListener('click', bind(this.handleClick_, this));
    el.addEventListener('keydown', bind(this.handleKeyDown_, this));

    document.addEventListener('DOMContentLoaded',
                              bind(this.ensureSmallGridCorrect, this));

    // Commands
    document.addEventListener('command', bind(this.handleCommand_, this));
    document.addEventListener('canExecute', bind(this.handleCanExecute_, this));

    // DND
    el.addEventListener('dragstart', bind(this.handleDragStart_, this));
    el.addEventListener('dragenter', bind(this.handleDragEnter_, this));
    el.addEventListener('dragover', bind(this.handleDragOver_, this));
    el.addEventListener('dragleave', bind(this.handleDragLeave_, this));
    el.addEventListener('drop', bind(this.handleDrop_, this));
    el.addEventListener('dragend', bind(this.handleDragEnd_, this));
    el.addEventListener('drag', bind(this.handleDrag_, this));
    el.addEventListener('mousedown', bind(this.handleMouseDown_, this));
  }

  MostVisited.prototype = {
    togglePinned_: function(el) {
      var index = getThumbnailIndex(el);
      var item = this.data[index];
      item.pinned = !item.pinned;
      if (item.pinned) {
        addPinnedUrl(item, index);
      } else {
        chrome.send('removePinnedURL', [item.url]);
      }
      updatePinnedDom(el, item.pinned);
    },

    swapPosition_: function(source, destination) {
      var nodes = source.parentNode.querySelectorAll('.thumbnail-container');
      var sourceIndex = getThumbnailIndex(source);
      var destinationIndex = getThumbnailIndex(destination);
      swapDomNodes(source, destination);

      var sourceData = this.data[sourceIndex];
      addPinnedUrl(sourceData, destinationIndex);
      sourceData.pinned = true;
      updatePinnedDom(source, true);

      var destinationData = this.data[destinationIndex];
      // Only update the destination if it was pinned before.
      if (destinationData.pinned) {
        addPinnedUrl(destinationData, sourceIndex);
      }
      this.data[destinationIndex] = sourceData;
      this.data[sourceIndex] = destinationData;
    },

    updateSettingsLink: function(hasBlacklistedUrls) {
      if (hasBlacklistedUrls)
        $('most-visited-settings').classList.add('has-blacklist');
      else
        $('most-visited-settings').classList.remove('has-blacklist');
    },

    blacklist: function(el) {
      var self = this;
      var url = el.href;
      chrome.send('blacklistURLFromMostVisited', [url]);

      el.classList.add('hide');

      // Find the old item.
      var oldUrls = {};
      var oldIndex = -1;
      var oldItem;
      var data = this.data;
      for (var i = 0; i < data.length; i++) {
        if (data[i].url == url) {
          oldItem = data[i];
          oldIndex = i;
        }
        oldUrls[data[i].url] = true;
      }

      // Send 'getMostVisitedPages' with a callback since we want to find the
      // new page and add that in the place of the removed page.
      chromeSend('getMostVisited', [], 'mostVisitedPages',
                 function(data, firstRun, hasBlacklistedUrls) {
        // Update settings link.
        self.updateSettingsLink(hasBlacklistedUrls);

        // Find new item.
        var newItem;
        for (var i = 0; i < data.length; i++) {
          if (!(data[i].url in oldUrls)) {
            newItem = data[i];
            break;
          }
        }

        if (!newItem) {
          // If no other page is available to replace the blacklisted item,
          // we need to reorder items s.t. all filler items are in the rightmost
          // indices.
          self.data = data;

        // Replace old item with new item in the most visited data array.
        } else if (oldIndex != -1) {
          var oldData = self.data.concat();
          oldData.splice(oldIndex, 1, newItem);
          self.data = oldData;
          el.classList.add('fade-in');
        }

        // We wrap the title in a <span class=blacklisted-title>. We pass an
        // empty string to the notifier function and use DOM to insert the real
        // string.
        var actionText = localStrings.getString('undothumbnailremove');

        // Show notification and add undo callback function.
        var wasPinned = oldItem.pinned;
        showNotification('', actionText, function() {
          self.removeFromBlackList(url);
          if (wasPinned) {
            addPinnedUrl(oldItem, oldIndex);
          }
          chrome.send('getMostVisited');
        });

        // Now change the DOM.
        var removeText = localStrings.getString('thumbnailremovednotification');
        var notifySpan = document.querySelector('#notification > span');
        notifySpan.textContent = removeText;

        // Focus the undo link.
        var undoLink = document.querySelector(
            '#notification > .link > [tabindex]');
        undoLink.focus();
      });
    },

    removeFromBlackList: function(url) {
      chrome.send('removeURLsFromMostVisitedBlacklist', [url]);
    },

    clearAllBlacklisted: function() {
      chrome.send('clearMostVisitedURLsBlacklist', []);
      hideNotification();
    },

    dirty_: false,
    invalidate_: function() {
      this.dirty_ = true;
    },

    visible_: true,
    get visible() {
      return this.visible_;
    },
    set visible(visible) {
      if (this.visible_ != visible) {
        this.visible_ = visible;
        this.invalidate_();
      }
    },

    useSmallGrid_: false,
    get useSmallGrid() {
      return this.useSmallGrid_;
    },
    set useSmallGrid(b) {
      if (this.useSmallGrid_ != b) {
        this.useSmallGrid_ = b;
        this.invalidate_();
      }
    },

    layout: function() {
      if (!this.dirty_)
        return;
      var d0 = Date.now();
      this.applyMostVisitedRects_();
      this.dirty_ = false;
      logEvent('mostVisited.layout: ' + (Date.now() - d0));
    },

    createThumbnails_: function() {
      var singleHtml =
          '<a class="thumbnail-container filler" tabindex="1">' +
            '<div class="edit-mode-border">' +
              '<div class="edit-bar">' +
                '<div class="pin"></div>' +
                '<div class="spacer"></div>' +
                '<div class="remove"></div>' +
              '</div>' +
              '<span class="thumbnail-wrapper">' +
                '<span class="thumbnail"></span>' +
              '</span>' +
            '</div>' +
            '<div class="title">' +
              '<div></div>' +
            '</div>' +
          '</a>';
      this.element.innerHTML = Array(8 + 1).join(singleHtml);
      var children = this.element.children;
      for (var i = 0; i < 8; i++) {
        children[i].id = 't' + i;
      }
    },

    getMostVisitedLayoutRects_: function() {
      var small = this.useSmallGrid;

      var cols = 4;
      var rows = 2;
      var marginWidth = 10;
      var marginHeight = 7;
      var borderWidth = 4;
      var thumbWidth = small ? 150 : 207;
      var thumbHeight = small ? 93 : 129;
      var w = thumbWidth + 2 * borderWidth + 2 * marginWidth;
      var h = thumbHeight + 40 + 2 * marginHeight;
      var sumWidth = cols * w  - 2 * marginWidth;
      var topSpacing = 10;

      var rtl = isRtl();
      var rects = [];

      if (this.visible) {
        for (var i = 0; i < rows * cols; i++) {
          var row = Math.floor(i / cols);
          var col = i % cols;
          var left = rtl ? sumWidth - col * w - thumbWidth - 2 * borderWidth :
              col * w;

          var top = row * h + topSpacing;

          rects[i] = {left: left, top: top};
        }
      }
      return rects;
    },

    applyMostVisitedRects_: function() {
      if (this.visible) {
        var rects = this.getMostVisitedLayoutRects_();
        var children = this.element.children;
        for (var i = 0; i < 8; i++) {
          var t = children[i];
          t.style.left = rects[i].left + 'px';
          t.style.top = rects[i].top + 'px';
          t.style.right = '';
          var innerStyle = t.firstElementChild.style;
          innerStyle.left = innerStyle.top = '';
        }
      }
    },

    // Work around for http://crbug.com/25329
    ensureSmallGridCorrect: function(expected) {
      if (expected != this.useSmallGrid)
        this.applyMostVisitedRects_();
    },

    getRectByIndex_: function(index) {
      return this.getMostVisitedLayoutRects_()[index];
    },

    // Commands

    handleCommand_: function(e) {
      var commandId = e.command.id;
      switch (commandId) {
        case 'clear-all-blacklisted':
          this.clearAllBlacklisted();
          chrome.send('getMostVisited');
          break;
      }
    },

    handleCanExecute_: function(e) {
      if (e.command.id == 'clear-all-blacklisted')
        e.canExecute = true;
    },

    // DND

    currentOverItem_: null,
    get currentOverItem() {
      return this.currentOverItem_;
    },
    set currentOverItem(item) {
      var style;
      if (item != this.currentOverItem_) {
        if (this.currentOverItem_) {
          style = this.currentOverItem_.firstElementChild.style;
          style.left = style.top = '';
        }
        this.currentOverItem_ = item;

        if (item) {
          // Make the drag over item move 15px towards the source. The movement
          // is done by only moving the edit-mode-border (as in the mocks) and
          // it is done with relative positioning so that the movement does not
          // change the drop target.
          var dragIndex = getThumbnailIndex(this.dragItem_);
          var overIndex = getThumbnailIndex(item);
          if (dragIndex == -1 || overIndex == -1) {
            return;
          }

          var dragRect = this.getRectByIndex_(dragIndex);
          var overRect = this.getRectByIndex_(overIndex);

          var x = dragRect.left - overRect.left;
          var y = dragRect.top - overRect.top;
          var z = Math.sqrt(x * x + y * y);
          var z2 = 15;
          var x2 = x * z2 / z;
          var y2 = y * z2 / z;

          style = this.currentOverItem_.firstElementChild.style;
          style.left = x2 + 'px';
          style.top = y2 + 'px';
        }
      }
    },
    dragItem_: null,
    startX_: 0,
    startY_: 0,
    startScreenX_: 0,
    startScreenY_: 0,
    dragEndTimer_: null,

    isDragging: function() {
      return !!this.dragItem_;
    },

    handleDragStart_: function(e) {
      var thumbnail = getItem(e.target);
      if (thumbnail) {
        // Don't set data since HTML5 does not allow setting the name for
        // url-list. Instead, we just rely on the dragging of link behavior.
        this.dragItem_ = thumbnail;
        this.dragItem_.classList.add('dragging');
        this.dragItem_.style.zIndex = 2;
        e.dataTransfer.effectAllowed = 'copyLinkMove';
      }
    },

    handleDragEnter_: function(e) {
      if (this.canDropOnElement_(this.currentOverItem)) {
        e.preventDefault();
      }
    },

    handleDragOver_: function(e) {
      var item = getItem(e.target);
      this.currentOverItem = item;
      if (this.canDropOnElement_(item)) {
        e.preventDefault();
        e.dataTransfer.dropEffect = 'move';
      }
    },

    handleDragLeave_: function(e) {
      var item = getItem(e.target);
      if (item) {
        e.preventDefault();
      }

      this.currentOverItem = null;
    },

    handleDrop_: function(e) {
      var dropTarget = getItem(e.target);
      if (this.canDropOnElement_(dropTarget)) {
        dropTarget.style.zIndex = 1;
        this.swapPosition_(this.dragItem_, dropTarget);
        // The timeout below is to allow WebKit to see that we turned off
        // pointer-event before moving the thumbnails so that we can get out of
        // hover mode.
        window.setTimeout(bind(function() {
          this.invalidate_();
          this.layout();
        }, this), 10);
        e.preventDefault();
        if (this.dragEndTimer_) {
          window.clearTimeout(this.dragEndTimer_);
          this.dragEndTimer_ = null;
        }
        afterTransition(function() {
          dropTarget.style.zIndex = '';
        });
      }
    },

    handleDragEnd_: function(e) {
      var dragItem = this.dragItem_;
      if (dragItem) {
        dragItem.style.pointerEvents = '';
        dragItem.classList.remove('dragging');

        afterTransition(function() {
          // Delay resetting zIndex to let the animation finish.
          dragItem.style.zIndex = '';
          // Same for overflow.
          dragItem.parentNode.style.overflow = '';
        });

        this.invalidate_();
        this.layout();
        this.dragItem_ = null;
      }
    },

    handleDrag_: function(e) {
      // Moves the drag item making sure that it is not displayed outside the
      // browser viewport.
      var item = getItem(e.target);
      var rect = this.element.getBoundingClientRect();
      item.style.pointerEvents = 'none';

      var x = this.startX_ + e.screenX - this.startScreenX_;
      var y = this.startY_ + e.screenY - this.startScreenY_;

      // The position of the item is relative to #most-visited so we need to
      // subtract that when calculating the allowed position.
      x = Math.max(x, -rect.left);
      x = Math.min(x, document.body.clientWidth - rect.left - item.offsetWidth -
                   2);
      // The shadow is 2px
      y = Math.max(-rect.top, y);
      y = Math.min(y, document.body.clientHeight - rect.top -
                   item.offsetHeight - 2);

      // Override right in case of RTL.
      item.style.right = 'auto';
      item.style.left = x + 'px';
      item.style.top = y + 'px';
      item.style.zIndex = 2;
    },

    // We listen to mousedown to get the relative position of the cursor for
    // dnd.
    handleMouseDown_: function(e) {
      var item = getItem(e.target);
      if (item) {
        this.startX_ = item.offsetLeft;
        this.startY_ = item.offsetTop;
        this.startScreenX_ = e.screenX;
        this.startScreenY_ = e.screenY;

        // We don't want to focus the item on mousedown. However, to prevent
        // focus one has to call preventDefault but this also prevents the drag
        // and drop (sigh) so we only prevent it when the user is not doing a
        // left mouse button drag.
        if (e.button != 0) // LEFT
          e.preventDefault();
      }
    },

    canDropOnElement_: function(el) {
      return this.dragItem_ && el &&
          el.classList.contains('thumbnail-container') &&
          !el.classList.contains('filler');
    },


    /// data

    data_: null,
    get data() {
      return this.data_;
    },
    set data(data) {
      // We append the class name with the "filler" so that we can style fillers
      // differently.
      var maxItems = 8;
      data.length = Math.min(maxItems, data.length);
      var len = data.length;
      for (var i = len; i < maxItems; i++) {
        data[i] = {filler: true};
      }

      // On setting we need to update the items
      this.data_ = data;
      this.updateMostVisited_();
      this.updateMiniview_();
      this.updateMenu_();
    },

    updateMostVisited_: function() {

      function getThumbnailClassName(item) {
        return 'thumbnail-container' +
            (item.pinned ? ' pinned' : '') +
            (item.filler ? ' filler' : '');
      }

      var data = this.data;
      var children = this.element.children;
      for (var i = 0; i < data.length; i++) {
        var d = data[i];
        var t = children[i];

        // If we have a filler continue
        var oldClassName = t.className;
        var newClassName = getThumbnailClassName(d);
        if (oldClassName != newClassName) {
          t.className = newClassName;
        }

        // No need to continue if this is a filler.
        if (newClassName == 'thumbnail-container filler') {
          // Make sure the user cannot tab to the filler.
          t.tabIndex = -1;
          t.querySelector('.thumbnail-wrapper').style.backgroundImage = '';
          continue;
        }
        // Allow focus.
        t.tabIndex = 1;

        t.href = d.url;
        t.querySelector('.pin').title = localStrings.getString(d.pinned ?
            'unpinthumbnailtooltip' : 'pinthumbnailtooltip');
        t.querySelector('.remove').title =
            localStrings.getString('removethumbnailtooltip');

        // There was some concern that a malformed malicious URL could cause an
        // XSS attack but setting style.backgroundImage = 'url(javascript:...)'
        // does not execute the JavaScript in WebKit.

        var thumbnailUrl = d.thumbnailUrl || 'chrome://thumb/' + d.url;
        t.querySelector('.thumbnail-wrapper').style.backgroundImage =
            url(thumbnailUrl);
        var titleDiv = t.querySelector('.title > div');
        titleDiv.xtitle = titleDiv.textContent = d.title;
        var faviconUrl = d.faviconUrl || 'chrome://favicon/' + d.url;
        titleDiv.style.backgroundImage = url(faviconUrl);
        titleDiv.dir = d.direction;
      }
    },

    updateMiniview_: function() {
      this.miniview.textContent = '';
      var data = this.data.slice(0, MAX_MINIVIEW_ITEMS);
      for (var i = 0, item; item = data[i]; i++) {
        if (item.filler) {
          continue;
        }

        var span = document.createElement('span');
        var a = span.appendChild(document.createElement('a'));
        a.href = item.url;
        a.textContent = item.title;
        a.style.backgroundImage = url('chrome://favicon/' + item.url);
        a.className = 'item';
        this.miniview.appendChild(span);
      }
      updateMiniviewClipping(this.miniview);
    },

    updateMenu_: function() {
      clearClosedMenu(this.menu);
      var data = this.data.slice(0, MAX_MINIVIEW_ITEMS);
      for (var i = 0, item; item = data[i]; i++) {
        if (!item.filler) {
          addClosedMenuEntry(
              this.menu, item.url, item.title, 'chrome://favicon/' + item.url);
        }
      }
      addClosedMenuFooter(
          this.menu, 'most-visited', MINIMIZED_THUMB, Section.THUMB);
    },

    handleClick_: function(e) {
      var target = e.target;
      if (target.classList.contains('pin')) {
        this.togglePinned_(getItem(target));
        e.preventDefault();
      } else if (target.classList.contains('remove')) {
        this.blacklist(getItem(target));
        e.preventDefault();
      } else {
        var item = getItem(target);
        if (item) {
          var index = Array.prototype.indexOf.call(item.parentNode.children,
                                                   item);
          if (index != -1)
            chrome.send('metrics', ['NTP_MostVisited' + index]);
        }
      }
    },

    /**
     * Allow blacklisting most visited site using the keyboard.
     */
    handleKeyDown_: function(e) {
      if (!IS_MAC && e.keyCode == 46 || // Del
          IS_MAC && e.metaKey && e.keyCode == 8) { // Cmd + Backspace
        this.blacklist(e.target);
      }
    }
  };

  return MostVisited;
})();
</script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// To avoid creating tons of unnecessary nodes. We assume we cannot fit more
// than this many items in the miniview.
var MAX_MINIVIEW_ITEMS = 15;

// Extra spacing at the top of the layout.
var LAYOUT_SPACING_TOP = 25;

function getSectionCloseButton(sectionId) {
  return document.querySelector('#' + sectionId + ' .section-close-button');
}

function getSectionMenuButton(sectionId) {
  return $(sectionId + '-button');
}

function getSectionMenuButtonTextId(sectionId) {
  return sectionId.replace(/-/g, '');
}

function setSectionVisible(sectionId, section, visible, hideMask) {
  if (visible && !(shownSections & hideMask) ||
      !visible && (shownSections & hideMask))
    return;

  if (visible) {
    // Because sections are collapsed when they are minimized, it is not
    // necessary to restore the maxiview here. It will happen if the section
    // header is clicked.
    var el = $(sectionId);
    el.classList.remove('disabled');
    el = getSectionMenuButton(sectionId);
    el.classList.add('disabled');
    shownSections &= ~hideMask;
  } else {
    if (section) {
      hideSection(section);  // To hide the maxiview.
    }
    var el = $(sectionId);
    el.classList.add('disabled');
    el = getSectionMenuButton(sectionId);
    el.classList.remove('disabled');
    shownSections |= hideMask;
  }
  layoutSections();
}

function clearClosedMenu(menu) {
  menu.innerHTML = '';
}

function addClosedMenuEntryWithLink(menu, a) {
  var span = document.createElement('span');
  a.className += ' item menuitem';
  span.appendChild(a);
  menu.appendChild(span);
}

function addClosedMenuEntry(menu, url, title, imageUrl) {
  var a = document.createElement('a');
  a.href = url;
  a.textContent = title;
  a.style.backgroundImage = 'url(' + imageUrl + ')';
  addClosedMenuEntryWithLink(menu, a);
}

function addClosedMenuFooter(menu, sectionId, mask, opt_section) {
  menu.appendChild(document.createElement('hr'));

  var span = document.createElement('span');
  var a = span.appendChild(document.createElement('a'));
  a.href = '';
  a.textContent =
      localStrings.getString(getSectionMenuButtonTextId(sectionId));
  a.className = 'item';
  a.addEventListener(
      'click',
      function(e) {
        getSectionMenuButton(sectionId).hideMenu();
        e.preventDefault();
        setSectionVisible(sectionId, opt_section, true, mask);
        shownSections &= ~mask;
        saveShownSections();
      });
  menu.appendChild(span);
}

function initializeSection(sectionId, mask, opt_section) {
  var button = getSectionCloseButton(sectionId);
  button.addEventListener(
    'click',
    function() {
      setSectionVisible(sectionId, opt_section, false, mask);
      saveShownSections();
    });
}

function updateSimpleSection(id, section) {
  var elm = $(id);
  var maxiview = getSectionMaxiview(elm);
  if (shownSections & section) {
    $(id).classList.remove('hidden');
    if (maxiview)
      maxiview.classList.remove('hidden');
  } else {
    $(id).classList.add('hidden');
    if (maxiview)
      maxiview.classList.add('hidden');
  }
}

function recentlyClosedTabs(data) {
  logEvent('received recently closed tabs');
  // We need to store the recent items so we can update the layout on a resize.
  recentItems = data;
  renderRecentlyClosed();
  layoutSections();
}

var recentItems = [];

function renderRecentlyClosed() {
  // Remove all existing items and create new items.
  var recentElement = $('recently-closed');
  var parentEl = recentElement.lastElementChild;
  parentEl.textContent = '';
  var recentMenu = $('recently-closed-menu');
  clearClosedMenu(recentMenu);

  recentItems.forEach(function(item) {
    parentEl.appendChild(createRecentItem(item));
    addRecentMenuItem(recentMenu, item);
  });
  addClosedMenuFooter(recentMenu, 'recently-closed', MINIMIZED_RECENT);

  layoutRecentlyClosed();
}

function createRecentItem(data) {
  var isWindow = data.type == 'window';
  var el;
  if (isWindow) {
    el = document.createElement('span');
    el.className = 'item link window';
    el.tabItems = data.tabs;
    el.tabIndex = 0;
    el.textContent = formatTabsText(data.tabs.length);
  } else {
    el = document.createElement('a');
    el.className = 'item';
    el.href = data.url;
    el.style.backgroundImage = url('chrome://favicon/' + data.url);
    el.dir = data.direction;
    el.textContent = data.title;
  }
  el.sessionId = data.sessionId;
  el.xtitle = data.title;
  var wrapperEl = document.createElement('span');
  wrapperEl.appendChild(el);
  return wrapperEl;
}

function addRecentMenuItem(menu, data) {
  var isWindow = data.type == 'window';
  var a = document.createElement('a');
  if (isWindow) {
    a.textContent = formatTabsText(data.tabs.length);
    a.className = 'window';  // To get the icon from the CSS .window rule.
    a.href = '';  // To make underline show up.
  } else {
    a.href = data.url;
    a.style.backgroundImage = 'url(chrome://favicon/' + data.url + ')';
    a.textContent = data.title;
  }
  function clickHandler(e) {
    chrome.send('reopenTab', [String(data.sessionId)]);
    e.preventDefault();
  }
  a.addEventListener('click', clickHandler);
  addClosedMenuEntryWithLink(menu, a);
}

function saveShownSections() {
  chrome.send('setShownSections', [String(shownSections)]);
}

var LayoutMode = {
  SMALL: 1,
  NORMAL: 2
};

var layoutMode = useSmallGrid() ? LayoutMode.SMALL : LayoutMode.NORMAL;

function handleWindowResize() {
  if (window.innerWidth < 10) {
    // We're probably a background tab, so don't do anything.
    return;
  }

  var oldLayoutMode = layoutMode;
  var b = useSmallGrid();
  layoutMode = b ? LayoutMode.SMALL : LayoutMode.NORMAL

  if (layoutMode != oldLayoutMode){
    mostVisited.useSmallGrid = b;
    mostVisited.layout();
    renderRecentlyClosed();
    updateAllMiniviewClippings();
  }

  layoutSections();
}

// Stores some information about each section necessary to layout. A new
// instance is constructed for each section on each layout.
function SectionLayoutInfo(section) {
  this.section = section;
  this.header = section.getElementsByTagName('h2')[0];
  this.miniview = section.getElementsByClassName('miniview')[0];
  this.maxiview = getSectionMaxiview(section);
  this.expanded = this.maxiview && !section.classList.contains('hidden');
  this.fixedHeight = this.section.offsetHeight;
  this.scrollingHeight = 0;

  if (this.expanded)
    this.scrollingHeight = this.maxiview.offsetHeight;
}

// Get all sections to be layed out.
SectionLayoutInfo.getAll = function() {
  var sections = document.querySelectorAll('.section:not(.disabled)');
  var result = [];
  for (var i = 0, section; section = sections[i]; i++) {
    result.push(new SectionLayoutInfo(section));
  }
  return result;
};

// Ensure the miniview sections don't have any clipped items.
function updateMiniviewClipping(miniview) {
  var clipped = false;
  for (var j = 0, item; item = miniview.children[j]; j++) {
    item.style.display = '';
    if (clipped ||
        (item.offsetLeft + item.offsetWidth) > miniview.offsetWidth) {
      item.style.display = 'none';
      clipped = true;
    } else {
      item.style.display = '';
    }
  }
}

// Ensure none of the miniviews have any clipped items.
function updateAllMiniviewClippings() {
  var miniviews = document.querySelectorAll('.section.hidden .miniview');
  for (var i = 0, miniview; miniview = miniviews[i]; i++) {
    updateMiniviewClipping(miniview);
  }
}

// Layout the sections in a modified accordian. The header and miniview, if
// visible are fixed within the viewport. If there is an expanded section, its
// it scrolls.
//
// =============================
// | collapsed section         |  <- Any collapsed sections are fixed position.
// | and miniview              |
// |---------------------------|
// | expanded section          |
// |                           |  <- There can be one expanded section and it
// | and maxiview              |     is absolutely positioned so that it can
// |                           |     scroll "underneath" the fixed elements.
// |                           |
// |---------------------------|
// | another collapsed section |
// |---------------------------|
//
// We want the main frame scrollbar to be the one that scrolls the expanded
// region. To get this effect, we make the fixed elements position:fixed and the
// scrollable element position:absolute. We also artificially increase the
// height of the document so that it is possible to scroll down enough to
// display the end of the document, even with any fixed elements at the bottom
// of the viewport.
//
// There is a final twist: If the intrinsic height of the expanded section is
// less than the available height (because the window is tall), any collapsed
// sections sinch up and sit below the expanded section. This is so that we
// don't have a bunch of dead whitespace in the case of expanded sections that
// aren't very tall.
function layoutSections() {
  var sections = SectionLayoutInfo.getAll();
  var expandedSection = null;
  var headerHeight = LAYOUT_SPACING_TOP;
  var footerHeight = 0;

  // Calculate the height of the fixed elements above the expanded section. Also
  // take note of the expanded section, if there is one.
  var i;
  var section;
  for (i = 0; section = sections[i]; i++) {
    headerHeight += section.fixedHeight;
    if (section.expanded) {
      expandedSection = section;
      i++;
      break;
    }
  }

  // Calculate the height of the fixed elements below the expanded section, if
  // any.
  for (; section = sections[i]; i++) {
    footerHeight += section.fixedHeight;
  }
  // Leave room for bottom bar if it's visible.
  footerHeight += $('closed-sections-bar').offsetHeight;


  // Determine the height to use for the expanded section. If there isn't enough
  // space to show the expanded section completely, this will be the available
  // height. Otherwise, we use the intrinsic height of the expanded section.
  var expandedSectionHeight;
  if (expandedSection) {
    var flexHeight = window.innerHeight - headerHeight - footerHeight;
    if (flexHeight < expandedSection.scrollingHeight) {
      expandedSectionHeight = flexHeight;

      // Also, artificially expand the height of the document so that we can see
      // the entire expanded section.
      //
      // TODO(aa): Where does this come from? It is the difference between what
      // we set document.body.style.height to and what
      // document.body.scrollHeight measures afterward. I expect them to be the
      // same if document.body has no margins.
      var fudge = 44;
      document.body.style.height =
          headerHeight +
          expandedSection.scrollingHeight +
          footerHeight +
          fudge +
          'px';
    } else {
      expandedSectionHeight = expandedSection.scrollingHeight;
      document.body.style.height = '';
    }
  }

  // Now position all the elements.
  var y = LAYOUT_SPACING_TOP;
  for (i = 0, section; section = sections[i]; i++) {
    section.section.style.top = y + 'px';
    y += section.fixedHeight;

    if (section.maxiview && section == expandedSection) {
      section.maxiview.style.top = y + 'px';
      updateMask(section.maxiview, expandedSectionHeight);
    }

    if (section == expandedSection)
      y += expandedSectionHeight;
  }

  updateAttributionDisplay(y);
}

function updateMask(maxiview, visibleHeightPx) {
  // We want to end up with 10px gradients at the top and bottom of
  // visibleHeight, but webkit-mask only supports expression in terms of
  // percentages.

  // We might not have enough room to do 10px gradients on each side. To get the
  // right effect, we don't want to make the gradients smaller, but make them
  // appear to mush into each other.
  var gradientHeightPx = Math.min(10, Math.floor(visibleHeightPx / 2));
  var gradientDestination = 'rgba(0,0,0,' + (gradientHeightPx / 10) + ')';

  var bottomSpacing = 15;
  var first = parseFloat(maxiview.style.top) / window.innerHeight;
  var second = first + gradientHeightPx / window.innerHeight;
  var fourth = first + (visibleHeightPx - bottomSpacing) / window.innerHeight;
  var third = fourth - gradientHeightPx / window.innerHeight;

  var gradientArguments = [
    'linear',
    '0 0',
    '0 100%',
    'from(transparent)',
    getColorStopString(first, 'transparent'),
    getColorStopString(second, gradientDestination),
    getColorStopString(third, gradientDestination),
    getColorStopString(fourth, 'transparent'),
    'to(transparent)'
  ];

  var gradient = '-webkit-gradient(' + gradientArguments.join(', ') + ')';
  maxiview.style.WebkitMaskImage = gradient;
}

function getColorStopString(height, color) {
  return 'color-stop(' + height + ', ' + color + ')';
}

window.addEventListener('resize', handleWindowResize);

var sectionToElementMap;
function getSectionElement(section) {
  if (!sectionToElementMap) {
    sectionToElementMap = {};
    for (var key in Section) {
      sectionToElementMap[Section[key]] =
          document.querySelector('.section[section=' + key + ']');
    }
  }
  return sectionToElementMap[section];
}

function getSectionMaxiview(section) {
  return $(section.id + '-maxiview');
}

// You usually want to call |showOnlySection()| instead of this.
function showSection(section) {
  if (!(section & shownSections)) {
    shownSections |= section;
    var el = getSectionElement(section);
    if (el) {
      el.classList.remove('hidden');

      var maxiview = getSectionMaxiview(el);
      if (maxiview) {
        maxiview.classList.remove('hiding');
        maxiview.classList.remove('hidden');
      }
    }

    switch (section) {
      case Section.THUMB:
        mostVisited.visible = true;
        mostVisited.layout();
        break;
    }
  }
}

// Show this section and hide all other sections - at most one section can
// be open at one time.
function showOnlySection(section) {
  for (var p in Section) {
    if (p == section)
      showSection(Section[p]);
    else
      hideSection(Section[p]);
  }
}

function hideSection(section) {
  if (section & shownSections) {
    shownSections &= ~section;

    switch (section) {
      case Section.THUMB:
        mostVisited.visible = false;
        mostVisited.layout();
        break;
    }

    var el = getSectionElement(section);
    if (el) {
      el.classList.add('hidden');

      var maxiview = getSectionMaxiview(el);
      if (maxiview)
        maxiview.classList.add('hiding');

      var miniview = el.getElementsByClassName('miniview')[0];
      if (miniview)
        updateMiniviewClipping(miniview);
    }
  }
}

window.addEventListener('webkitTransitionEnd', function(e) {
  if (e.target.classList.contains('hiding')) {
    e.target.classList.add('hidden');
    e.target.classList.remove('hiding');
  }

  document.documentElement.setAttribute('enable-section-animations', 'false');
});

/**
 * Callback when the shown sections changes in another NTP.
 * @param {number} newShownSections Bitmask of the shown sections.
 */
function setShownSections(newShownSections) {
  for (var key in Section) {
    if (newShownSections & Section[key])
      showSection(Section[key]);
    else
      hideSection(Section[key]);
  }
  setSectionVisible(
      'apps', Section.APPS,
      !(newShownSections & MINIMIZED_APPS), MINIMIZED_APPS);
  setSectionVisible(
      'most-visited', Section.THUMB,
      !(newShownSections & MINIMIZED_THUMB), MINIMIZED_THUMB);
  setSectionVisible(
      'recently-closed', undefined,
      !(newShownSections & MINIMIZED_RECENT), MINIMIZED_RECENT);
  layoutSections();
}

// Recently closed

function layoutRecentlyClosed() {
  var recentElement = $('recently-closed');
  var miniview = recentElement.getElementsByClassName('miniview')[0];

  updateMiniviewClipping(miniview);

  if (miniview.hasChildNodes()) {
    if (!(shownSections & MINIMIZED_RECENT)) {
      recentElement.classList.remove('disabled');
    }
  } else {
    recentElement.classList.add('disabled');
  }
}

/**
 * This function is called by the backend whenever the sync status section
 * needs to be updated to reflect recent sync state changes. The backend passes
 * the new status information in the newMessage parameter. The state includes
 * the following:
 *
 * syncsectionisvisible: true if the sync section needs to show up on the new
 *                       tab page and false otherwise.
 * title: the header for the sync status section.
 * msg: the actual message (e.g. "Synced to foo@gmail.com").
 * linkisvisible: true if the link element should be visible within the sync
 *                section and false otherwise.
 * linktext: the text to display as the link in the sync status (only used if
 *           linkisvisible is true).
 * linkurlisset: true if an URL should be set as the href for the link and false
 *               otherwise. If this field is false, then clicking on the link
 *               will result in sending a message to the backend (see
 *               'SyncLinkClicked').
 * linkurl: the URL to use as the element's href (only used if linkurlisset is
 *          true).
 */
function syncMessageChanged(newMessage) {
  var syncStatusElement = $('sync-status');

  // Hide the section if the message is emtpy.
  if (!newMessage['syncsectionisvisible']) {
    syncStatusElement.classList.add('disabled');
    return;
  }

  syncStatusElement.classList.remove('disabled');

  var content = syncStatusElement.children[0];

  // Set the sync section background color based on the state.
  if (newMessage.msgtype == 'error') {
    content.style.backgroundColor = 'tomato';
  } else {
    content.style.backgroundColor = '';
  }

  // Set the text for the header and sync message.
  var titleElement = content.firstElementChild;
  titleElement.textContent = newMessage.title;
  var messageElement = titleElement.nextElementSibling;
  messageElement.textContent = newMessage.msg;

  // Remove what comes after the message
  while (messageElement.nextSibling) {
    content.removeChild(messageElement.nextSibling);
  }

  if (newMessage.linkisvisible) {
    var el;
    if (newMessage.linkurlisset) {
      // Use a link
      el = document.createElement('a');
      el.href = newMessage.linkurl;
    } else {
      el = document.createElement('button');
      el.className = 'link';
      el.addEventListener('click', syncSectionLinkClicked);
    }
    el.textContent = newMessage.linktext;
    content.appendChild(el);
    fixLinkUnderline(el);
  }

  layoutSections();
}

/**
 * Invoked when the link in the sync status section is clicked.
 */
function syncSectionLinkClicked(e) {
  chrome.send('SyncLinkClicked');
  e.preventDefault();
}

/**
 * Invoked when link to start sync in the promo message is clicked, and Chrome
 * has already been synced to an account.
 */
function syncAlreadyEnabled(message) {
  showNotification(message.syncEnabledMessage,
                   localStrings.getString('close'));
}

/**
 * Returns the text used for a recently closed window.
 * @param {number} numTabs Number of tabs in the window.
 * @return {string} The text to use.
 */
function formatTabsText(numTabs) {
  if (numTabs == 1)
    return localStrings.getString('closedwindowsingle');
  return localStrings.getStringF('closedwindowmultiple', numTabs);
}

// Theme related

function themeChanged(hasAttribution) {
  document.documentElement.setAttribute('hasattribution', hasAttribution);
  $('themecss').href = 'chrome://theme/css/newtab.css?' + Date.now();
  updateAttribution();
}

function updateAttribution() {
  // Default value for standard NTP with no theme attribution or custom logo.
  logEvent('updateAttribution called');
  var imageId = 'IDR_PRODUCT_LOGO';
  // Theme attribution always overrides custom logos.
  if (document.documentElement.getAttribute('hasattribution') == 'true') {
    logEvent('updateAttribution called with THEME ATTR');
    imageId = 'IDR_THEME_NTP_ATTRIBUTION';
  } else if (document.documentElement.getAttribute('customlogo') == 'true') {
    logEvent('updateAttribution with CUSTOMLOGO');
    imageId = 'IDR_CUSTOM_PRODUCT_LOGO';
  }

  $('attribution-img').src = 'chrome://theme/' + imageId + '?' + Date.now();
}

// If the content overlaps with the attribution, we bump its opacity down.
function updateAttributionDisplay(contentBottom) {
  var attribution = $('attribution');
  var main = $('main');
  var rtl = document.documentElement.dir == 'rtl';
  var contentRect = main.getBoundingClientRect();
  var attributionRect = attribution.getBoundingClientRect();

  // Hack. See comments for '.haslayout' in new_new_tab.css.
  if (attributionRect.width == 0)
    return;
  else
    attribution.classList.remove('nolayout');

  if (contentBottom > attribution.offsetTop) {
    if ((!rtl && contentRect.right > attributionRect.left) ||
        (rtl && attributionRect.right > contentRect.left)) {
      attribution.classList.add('obscured');
      return;
    }
  }

  attribution.classList.remove('obscured');
}

function bookmarkBarAttached() {
  document.documentElement.setAttribute('bookmarkbarattached', 'true');
}

function bookmarkBarDetached() {
  document.documentElement.setAttribute('bookmarkbarattached', 'false');
}

function viewLog() {
  var lines = [];
  var start = log[0][1];

  for (var i = 0; i < log.length; i++) {
    lines.push((log[i][1] - start) + ': ' + log[i][0]);
  }

  console.log(lines.join('\n'));
}

// We apply the size class here so that we don't trigger layout animations
// onload.

handleWindowResize();

var localStrings = new LocalStrings();

///////////////////////////////////////////////////////////////////////////////
// Things we know are not needed at startup go below here

function afterTransition(f) {
  if (!isDoneLoading()) {
    // Make sure we do not use a timer during load since it slows down the UI.
    f();
  } else {
    // The duration of all transitions are .15s
    window.setTimeout(f, 150);
  }
}

// Notification


var notificationTimeout;

function showNotification(text, actionText, opt_f, opt_delay) {
  var notificationElement = $('notification');
  var f = opt_f || function() {};
  var delay = opt_delay || 10000;

  function show() {
    window.clearTimeout(notificationTimeout);
    notificationElement.classList.add('show');
    document.body.classList.add('notification-shown');
  }

  function delayedHide() {
    notificationTimeout = window.setTimeout(hideNotification, delay);
  }

  function doAction() {
    f();
    hideNotification();
  }

  // Remove any possible first-run trails.
  notification.classList.remove('first-run');

  var actionLink = notificationElement.querySelector('.link-color');
  notificationElement.firstElementChild.textContent = text;
  actionLink.textContent = actionText;

  actionLink.onclick = doAction;
  actionLink.onkeydown = handleIfEnterKey(doAction);
  notificationElement.onmouseover = show;
  notificationElement.onmouseout = delayedHide;
  actionLink.onfocus = show;
  actionLink.onblur = delayedHide;
  // Enable tabbing to the link now that it is shown.
  actionLink.tabIndex = 0;

  show();
  delayedHide();
}

/**
 * Hides the notifier.
 */
function hideNotification() {
  var notificationElement = $('notification');
  notificationElement.classList.remove('show');
  document.body.classList.remove('notification-shown');
  var actionLink = notificationElement.querySelector('.link-color');
  // Prevent tabbing to the hidden link.
  actionLink.tabIndex = -1;
  // Setting tabIndex to -1 only prevents future tabbing to it. If, however, the
  // user switches window or a tab and then moves back to this tab the element
  // may gain focus. We therefore make sure that we blur the element so that the
  // element focus is not restored when coming back to this window.
  actionLink.blur();
}

function showFirstRunNotification() {
  showNotification(localStrings.getString('firstrunnotification'),
                   localStrings.getString('closefirstrunnotification'),
                   null, 30000);
  var notificationElement = $('notification');
  notification.classList.add('first-run');
}

$('main').addEventListener('click', function(e) {
  var p = e.target;
  while (p && p.tagName != 'H2') {
    // In case the user clicks on a button we do not want to expand/collapse a
    // section.
    if (p.tagName == 'BUTTON')
      return;
    p = p.parentNode;
  }

  if (!p)
    return;

  p = p.parentNode;
  if (!getSectionMaxiview(p))
    return;

  toggleSectionVisibilityAndAnimate(p.getAttribute('section'));
});

$('most-visited-settings').addEventListener('click', function() {
  $('clear-all-blacklisted').execute();
});

function toggleSectionVisibilityAndAnimate(section) {
  if (!section)
    return;

  // It looks better to return the scroll to the top when toggling sections.
  document.body.scrollTop = 0;

  // We set it back in webkitTransitionEnd.
  document.documentElement.setAttribute('enable-section-animations', 'true');
  if (shownSections & Section[section]) {
    hideSection(Section[section]);
  } else {
    showOnlySection(section);
  }
  layoutSections();
  saveShownSections();
}

function handleIfEnterKey(f) {
  return function(e) {
    if (e.keyIdentifier == 'Enter')
      f(e);
  };
}

function maybeReopenTab(e) {
  var el = findAncestor(e.target, function(el) {
    return el.sessionId !== undefined;
  });
  if (el) {
    chrome.send('reopenTab', [String(el.sessionId)]);
    e.preventDefault();

    // HACK(arv): After the window onblur event happens we get a mouseover event
    // on the next item and we want to make sure that we do not show a tooltip
    // for that.
    window.setTimeout(function() {
      windowTooltip.hide();
    }, 2 * WindowTooltip.DELAY);
  }
}

function maybeShowWindowTooltip(e) {
  var f = function(el) {
    return el.tabItems !== undefined;
  };
  var el = findAncestor(e.target, f);
  var relatedEl = findAncestor(e.relatedTarget, f);
  if (el && el != relatedEl) {
    windowTooltip.handleMouseOver(e, el, el.tabItems);
  }
}


var recentlyClosedElement = $('recently-closed');

recentlyClosedElement.addEventListener('click', maybeReopenTab);
recentlyClosedElement.addEventListener('keydown',
                                       handleIfEnterKey(maybeReopenTab));

recentlyClosedElement.addEventListener('mouseover', maybeShowWindowTooltip);
recentlyClosedElement.addEventListener('focus', maybeShowWindowTooltip, true);

/**
 * This object represents a tooltip representing a closed window. It is
 * shown when hovering over a closed window item or when the item is focused. It
 * gets hidden when blurred or when mousing out of the menu or the item.
 * @param {Element} tooltipEl The element to use as the tooltip.
 * @constructor
 */
function WindowTooltip(tooltipEl) {
  this.tooltipEl = tooltipEl;
  this.boundHide_ = bind(this.hide, this);
  this.boundHandleMouseOut_ = bind(this.handleMouseOut, this);
}

WindowTooltip.trackMouseMove_ = function(e) {
  WindowTooltip.clientX = e.clientX;
  WindowTooltip.clientY = e.clientY;
};

/**
 * Time in ms to delay before the tooltip is shown.
 * @type {number}
 */
WindowTooltip.DELAY = 300;

WindowTooltip.prototype = {
  timer: 0,
  handleMouseOver: function(e, linkEl, tabs) {
    this.linkEl_ = linkEl;
    if (e.type == 'mouseover') {
      this.linkEl_.addEventListener('mousemove', WindowTooltip.trackMouseMove_);
      this.linkEl_.addEventListener('mouseout', this.boundHandleMouseOut_);
    } else { // focus
      this.linkEl_.addEventListener('blur', this.boundHide_);
    }
    this.timer = window.setTimeout(bind(this.show, this, e.type, linkEl, tabs),
                                   WindowTooltip.DELAY);
  },
  show: function(type, linkEl, tabs) {
    window.addEventListener('blur', this.boundHide_);
    this.linkEl_.removeEventListener('mousemove',
                                     WindowTooltip.trackMouseMove_);
    window.clearTimeout(this.timer);

    this.renderItems(tabs);
    var rect = linkEl.getBoundingClientRect();
    var bodyRect = document.body.getBoundingClientRect();
    var rtl = document.documentElement.dir == 'rtl';

    this.tooltipEl.style.display = 'block';
    var tooltipRect = this.tooltipEl.getBoundingClientRect();
    var x, y;

    // When focused show below, like a drop down menu.
    if (type == 'focus') {
      x = rtl ?
          rect.left + bodyRect.left + rect.width - this.tooltipEl.offsetWidth :
          rect.left + bodyRect.left;
      y = rect.top + bodyRect.top + rect.height;
    } else {
      x = bodyRect.left + (rtl ?
          WindowTooltip.clientX - this.tooltipEl.offsetWidth :
          WindowTooltip.clientX);
      // Offset like a tooltip
      y = 20 + WindowTooltip.clientY + bodyRect.top;
    }

    // We need to ensure that the tooltip is inside the window viewport.
    x = Math.min(x, bodyRect.width - tooltipRect.width);
    x = Math.max(x, 0);
    y = Math.min(y, bodyRect.height - tooltipRect.height);
    y = Math.max(y, 0);

    this.tooltipEl.style.left = x + 'px';
    this.tooltipEl.style.top = y + 'px';
  },
  handleMouseOut: function(e) {
    // Don't hide when move to another item in the link.
    var f = function(el) {
      return el.tabItems !== undefined;
    };
    var el = findAncestor(e.target, f);
    var relatedEl = findAncestor(e.relatedTarget, f);
    if (el && el != relatedEl) {
      this.hide();
    }
  },
  hide: function() {
    window.clearTimeout(this.timer);
    window.removeEventListener('blur', this.boundHide_);
    this.linkEl_.removeEventListener('mousemove',
                                     WindowTooltip.trackMouseMove_);
    this.linkEl_.removeEventListener('mouseout', this.boundHandleMouseOut_);
    this.linkEl_.removeEventListener('blur', this.boundHide_);
    this.linkEl_ = null;

    this.tooltipEl.style.display  = 'none';
  },
  renderItems: function(tabs) {
    var tooltip = this.tooltipEl;
    tooltip.textContent = '';

    tabs.forEach(function(tab) {
      var span = document.createElement('span');
      span.className = 'item';
      span.style.backgroundImage = url('chrome://favicon/' + tab.url);
      span.dir = tab.direction;
      span.textContent = tab.title;
      tooltip.appendChild(span);
    });
  }
};

var windowTooltip = new WindowTooltip($('window-tooltip'));

window.addEventListener('load', bind(logEvent, global, 'Tab.NewTabOnload',
                                     true));

window.addEventListener('resize', handleWindowResize);
document.addEventListener('DOMContentLoaded',
    bind(logEvent, global, 'Tab.NewTabDOMContentLoaded', true));

// Whether or not we should send the initial 'GetSyncMessage' to the backend
// depends on the value of the attribue 'syncispresent' which the backend sets
// to indicate if there is code in the backend which is capable of processing
// this message. This attribute is loaded by the JSTemplate and therefore we
// must make sure we check the attribute after the DOM is loaded.
document.addEventListener('DOMContentLoaded',
                          callGetSyncMessageIfSyncIsPresent);

/**
 * The sync code is not yet built by default on all platforms so we have to
 * make sure we don't send the initial sync message to the backend unless the
 * backend told us that the sync code is present.
 */
function callGetSyncMessageIfSyncIsPresent() {
  if (document.documentElement.getAttribute('syncispresent') == 'true') {
    chrome.send('GetSyncMessage');
  }
}

// Tooltip for elements that have text that overflows.
document.addEventListener('mouseover', function(e) {
  // We don't want to do this while we are dragging because it makes things very
  // janky
  if (mostVisited.isDragging()) {
    return;
  }

  var el = findAncestor(e.target, function(el) {
    return el.xtitle;
  });
  if (el && el.xtitle != el.title) {
    if (el.scrollWidth > el.clientWidth) {
      el.title = el.xtitle;
    } else {
      el.title = '';
    }
  }
});

/**
 * Makes links and buttons support a different underline color.
 * @param {Node} node The node to search for links and buttons in.
 */
function fixLinkUnderlines(node) {
  var elements = node.querySelectorAll('a,button');
  Array.prototype.forEach.call(elements, fixLinkUnderline);
}

/**
 * Wraps the content of an element in a a link-color span.
 * @param {Element} el The element to wrap.
 */
function fixLinkUnderline(el) {
  var span = document.createElement('span');
  span.className = 'link-color';
  while (el.hasChildNodes()) {
    span.appendChild(el.firstChild);
  }
  el.appendChild(span);
}

updateAttribution();

var mostVisited = new MostVisited(
    $('most-visited-maxiview'),
    document.querySelector('#most-visited .miniview'),
    $('most-visited-menu'),
    useSmallGrid(),
    shownSections & Section.THUMB);

function mostVisitedPages(data, firstRun, hasBlacklistedUrls) {
  logEvent('received most visited pages');

  mostVisited.updateSettingsLink(hasBlacklistedUrls);
  mostVisited.data = data;
  mostVisited.layout();
  layoutSections();

  // Remove class name in a timeout so that changes done in this JS thread are
  // not animated.
  window.setTimeout(function() {
    mostVisited.ensureSmallGridCorrect();
    maybeDoneLoading();
  }, 1);

  // Only show the first run notification if first run.
  if (firstRun) {
    showFirstRunNotification();
  }
}

function maybeDoneLoading() {
  if (mostVisited.data && apps.loaded)
    document.body.classList.remove('loading');
}

function isDoneLoading() {
  return !document.body.classList.contains('loading');
}
</script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

function getAppsCallback(data) {
  logEvent('received apps');
  var appsSection = $('apps');
  var appsSectionContent = $('apps-maxiview');
  var appsMiniview = appsSection.getElementsByClassName('miniview')[0];
  appsSectionContent.textContent = '';
  appsMiniview.textContent = '';

  clearClosedMenu(apps.menu);
  if (data.apps.length == 0) {
    appsSection.classList.add('disabled');
    layoutSections();
  } else {
    data.apps.forEach(function(app) {
        appsSectionContent.appendChild(apps.createElement(app));
    });

    appsSectionContent.appendChild(apps.createWebStoreElement());

    data.apps.slice(0, MAX_MINIVIEW_ITEMS).forEach(function(app) {
      appsMiniview.appendChild(apps.createMiniviewElement(app));
      addClosedMenuEntryWithLink(apps.menu, apps.createClosedMenuElement(app));
    });

    if (!(shownSections & MINIMIZED_APPS)) {
      appsSection.classList.remove('disabled');
    }
  }
  addClosedMenuFooter(apps.menu, 'apps', MINIMIZED_APPS, Section.APPS);

  apps.loaded = true;
  maybeDoneLoading();

  if (data.apps.length > 0 && isDoneLoading()) {
    updateMiniviewClipping(appsMiniview);
    layoutSections();
  }
}

var apps = (function() {

  function createElement(app) {
    var div = document.createElement('div');
    div.className = 'app';

    var a = div.appendChild(document.createElement('a'));
    a.setAttribute('app-id', app['id']);
    a.xtitle = a.textContent = app['name'];
    a.href = app['launch_url'];

    return div;
  }

  function createContextMenu(app) {
    var menu = new cr.ui.Menu;
    var button = document.createElement(button);
  }

  function launchApp(appId) {
    var appsSection = $('apps');
    var expanded = !appsSection.classList.contains('hidden');
    var element = document.querySelector(
        (expanded ? '.maxiview' : '.miniview') + ' a[app-id=' + appId + ']');

    // TODO(arv): Handle zoom?
    var rect = element.getBoundingClientRect();
    var cs = getComputedStyle(element);
    var size = cs.backgroundSize.split(/\s+/);  // background-size has the
                                                // format '123px 456px'.

    var width = parseInt(size[0], 10);
    var height = parseInt(size[1], 10);

    var top, left;
    if (expanded) {
      // We are using background-position-x 50%.
      top = rect.top + parseInt(cs.backgroundPositionY, 10);
      left = rect.left + ((rect.width - width) >> 1);  // Integer divide by 2.

    } else {
      // We are using background-position-y 50%.
      top = rect.top + ((rect.height - width) >> 1);  // Integer divide by 2.
      if (getComputedStyle(element).direction == 'rtl')
        left = rect.left + rect.width - width;
      else
        left = rect.left;
    }

    chrome.send('launchApp', [appId,
                              String(left), String(top),
                              String(width), String(height)]);
  }

  /**
   * @this {!HTMLAnchorElement}
   */
  function handleClick(e) {
    var appId = e.currentTarget.getAttribute('app-id');
    launchApp(appId);
    return false;
  }

  var currentApp;

  function addContextMenu(el, app) {
    el.addEventListener('contextmenu', cr.ui.contextMenuHandler);
    el.addEventListener('keydown', cr.ui.contextMenuHandler);
    el.addEventListener('keyup', cr.ui.contextMenuHandler);

    Object.defineProperty(el, 'contextMenu', {
      get: function() {
        currentApp = app;

        $('apps-launch-command').label = app['name'];
        $('apps-options-command').canExecuteChange();

        return $('app-context-menu');
      }
    });
  }

  document.addEventListener('command', function(e) {
    if (!currentApp)
      return;

    switch (e.command.id) {
      case 'apps-options-command':
        window.location = currentApp['options_url'];
        break;
      case 'apps-launch-command':
        launchApp(currentApp['id']);
        break;
      case 'apps-uninstall-command':
        chrome.send('uninstallApp', [currentApp['id']]);
        break;
    }
  });

  document.addEventListener('canExecute', function(e) {
    switch (e.command.id) {
      case 'apps-options-command':
        e.canExecute = currentApp && currentApp['options_url'];
        break;
      case 'apps-launch-command':
      case 'apps-uninstall-command':
        e.canExecute = true;
        break;
    }
  });

  return {
    loaded: false,

    menu: $('apps-menu'),

    createElement: function(app) {
      var div = createElement(app);
      var a = div.firstChild;

      a.onclick = handleClick;
      a.style.backgroundImage = url(app['icon_big']);
      if (hashParams['app-id'] == app['id']) {
        div.setAttribute('new', 'new');
        // Delay changing the attribute a bit to let the page settle down a bit.
        setTimeout(function() {
          // This will trigger the 'bounce' animation defined in apps.css.
          div.setAttribute('new', 'installed');
        }, 500);
        div.addEventListener('webkitAnimationEnd', function(e) {
          div.removeAttribute('new');

          // If we get new data (eg because something installs in another tab,
          // or because we uninstall something here), don't run the install
          // animation again.
          document.documentElement.setAttribute("install-animation-enabled",
                                                "false");
        });

        // Make sure apps is de-minimized...
        setSectionVisible('apps', Section.APPS, true, MINIMIZED_APPS);

        // ...and expanded.
        if ($('apps').classList.contains('hidden'))
          toggleSectionVisibilityAndAnimate('APPS');
      }

      var settingsButton = div.appendChild(new cr.ui.ContextMenuButton);
      settingsButton.className = 'app-settings';
      settingsButton.title = localStrings.getString('appsettings');

      addContextMenu(div, app);

      return div;
    },

    createMiniviewElement: function(app) {
      var span = document.createElement('span');
      var a = span.appendChild(document.createElement('a'));

      a.setAttribute('app-id', app['id']);
      a.textContent = app['name'];
      a.href = app['launch_url'];
      a.onclick = handleClick;
      a.style.backgroundImage = url(app['icon_small']);
      a.className = 'item';
      span.appendChild(a);

      addContextMenu(span, app);

      return span;
    },

    createClosedMenuElement: function(app) {
      var a = document.createElement('a');
      a.setAttribute('app-id', app['id']);
      a.textContent = app['name'];
      a.href = app['launch_url'];
      a.onclick = handleClick;
      a.style.backgroundImage = url(app['icon_small']);
      a.className = 'item';
      return a;
    },

    createWebStoreElement: function() {
      return createElement({
        'id': 'web-store-entry',
        'name': localStrings.getString('web_store_title'),
        'launch_url': localStrings.getString('web_store_url')
      });
    }
  };
})();
</script>

<script>
cr.ui.decorate('menu', cr.ui.Menu);
cr.ui.decorate('command', cr.ui.Command);
cr.ui.decorate('button[menu]', cr.ui.MenuButton);
</script>

<script>
  initializeSection('apps', MINIMIZED_APPS, Section.APPS);
  initializeSection('most-visited', MINIMIZED_THUMB, Section.THUMB);
  initializeSection('recently-closed', MINIMIZED_RECENT);

  updateSimpleSection('apps', Section.APPS);
  updateSimpleSection('most-visited', Section.THUMB);
  var appsInitiallyVisible = !(shownSections & MINIMIZED_APPS);
  var mostVisitedInitiallyVisible = !(shownSections & MINIMIZED_THUMB);
  var recentlyClosedInitiallyVisible = !(shownSections & MINIMIZED_RECENT);
  // Apps and recently closed start as hidden in the HTML, most visited is
  // initially visible. Adapt to the change received from the prefs by forcing
  // all three sections to update.
  shownSections &= ~MINIMIZED_THUMB;
  shownSections |= MINIMIZED_APPS | MINIMIZED_RECENT;
  setSectionVisible('apps', Section.APPS, appsInitiallyVisible, MINIMIZED_APPS);
  setSectionVisible(
      'most-visited', Section.THUMB,
      mostVisitedInitiallyVisible, MINIMIZED_THUMB);
  setSectionVisible(
      'recently-closed', undefined,
      recentlyClosedInitiallyVisible, MINIMIZED_RECENT);
  layoutSections();
</script>
</html>
html,
.section > h2 span,
#most-visited-settings {
  background-attachment: fixed;
  background-color: $2; /* COLOR_NTP_BACKGROUND */
  background-image: url(chrome://theme/IDR_THEME_NTP_BACKGROUND?$1);
  background-position: $3;
  background-repeat: $5;
}

html[bookmarkbarattached='true'],
html[bookmarkbarattached='true'] .section > h2 span,
html[bookmarkbarattached='true'] #most-visited-settings {
  background-position: $4;
}

body {
  color: $8; /* COLOR_NTP_TEXT */
  height: 100%;
  overflow: auto;
}

/* TODO(aa): Is this still in use? The styling may be incorrect with M7 NTP
   rework. */
#notification.first-run {
  background-color: $$1; /* COLOR_NTP_SECTION */
  border-color: $$2; /* COLOR_NTP_SECTION_BORDER */
}

#notification.first-run .link {
   color: $$5; /* COLOR_NTP_LINK_UNDERLINE */
}

#notification.first-run .link-color {
  color: $9; /* COLOR_NTP_LINK */
}

.thumbnail {
  border-color: $$1; /* COLOR_NTP_SECTION */
}

.thumbnail-container,
.thumbnail-container > .title {
  color: $8; /* COLOR_NTP_TEXT */
}

.thumbnail-container:focus .thumbnail,
.thumbnail-container:hover .thumbnail {
  border-color: $6; /* COLOR_NTP_HEADER */
}

.thumbnail-container:focus .edit-bar,
.thumbnail-container:hover .edit-bar {
  background-color: $6; /* COLOR_NTP_HEADER */
  background-image: -webkit-gradient(linear, left top, left bottom,
                                     from($7), /* color_header_gradient_light */
                                     to($6)); /* COLOR_NTP_HEADER */
}
.thumbnail-container:hover > .edit-mode-border {
  background-color: $6; /* COLOR_NTP_HEADER */
}

.filler .thumbnail-wrapper {
  border: 3px solid $$1; /* COLOR_NTP_SECTION */
  background-color: $2; /* COLOR_NTP_BACKGROUND */
}

.filler .thumbnail {
  border: 1px solid $2; /* COLOR_NTP_BACKGROUND */
  background-color: $$1; /* COLOR_NTP_SECTION */
}

.miniview {
  color: $8; /* COLOR_NTP_TEXT */
}

.miniview > span {
  color: $$5; /* COLOR_NTP_LINK_UNDERLINE */
  text-decoration: underline;
}

.miniview > span > .item {
  color: $9; /* COLOR_NTP_LINK */
  text-decoration: none;
}

#attribution {
  color: $9; /* COLOR_NTP_LINK */
}

#tip-line {
  color: $8; /* COLOR_NTP_TEXT */
}

.link-color {
  color: $9; /* COLOR_NTP_LINK */
}

:link,
:visited,
.link {
  color: $$5; /* COLOR_NTP_LINK_UNDERLINE */
}

.section > h2,
#closed-sections-bar > button {
  color: $$7; /* COLOR_NTP_SECTION_HEADER_TEXT */
}

.section:not(.hidden) > h2 {
  color: $$8; /* COLOR_NTP_SECTION_HEADER_TEXT_HOVER */
}

.section.hidden:not([noexpand]) > h2:hover,
#closed-sections-bar > button:hover {
  color: $$8; /* COLOR_NTP_SECTION_HEADER_TEXT_HOVER */
}

.section > h2 .back {
  border-top: 1px solid $$1; /* COLOR_NTP_SECTION  */
}

.section.hidden > h2 .back {
  background: none;
  border-color-top: $$$1; /* COLOR_NTP_SECTION_HEADER_RULE_LIGHT */
}

.section.hidden:hover > h2 .back {
  border-color-top: $$9; /* COLOR_NTP_SECTION_HEADER_RULE */
}

.app a {
  color: $8; /* COLOR_NTP_TEXT */
}

.app:hover > a {
  color: $$3; /* COLOR_NTP_SECTION_TEXT */
  background-color: $$1; /* COLOR_NTP_SECTION */;
}
<!DOCTYPE html>
<html>
<head>
  <title>$2</title>
  <style>
  body {
    font-family: helvetica, arial, sans-serif;
    font-size: 13px;
  }
  </style>
</head>
<body dir="$3"><div id="$1">$2</div></body>
</html>
<!DOCTYPE html>
<html>
<head>
  <title>$1</title>
  <style type="text/css">
  #title {
    font-weight: bold;
    font-size: 13px;
    font-family: helvetica, arial, sans-serif;
  }
  #description {
    font-family: helvetica, arial, sans-serif;
    font-size: 13px;
  }
  </style>
</head>
<body dir="$3">
  <div id="title">$1</div>
  <div id="description">$2</div>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
  <title>$2</title>
  <style>
  body {
    direction: $5;
  }
  #icon {
    height: 48px;
    width: 48px;
    float: $4;
  }
  #title {
    margin-$4: 54px;
    font-weight: bold;
    font-size: 13px;
    font-family: helvetica, arial, sans-serif;
  }
  #description {
    margin-$4: 54px;
    font-family: helvetica, arial, sans-serif;
    font-size: 13px;
  }
  </style>
</head>
<body>
  <div id="icon"><img src="$1" width="48" height="48" /></div>
  <div id="title">$2</div>
  <div id="description">$3</div>
</body>
</html>
<!DOCTYPE HTML>
<html i18n-values="dir:textdirection;" id="t">
<head>
<meta charset="utf-8">
<title i18n-content="title"></title>

<!-- TODO(zelidrag) need a better icon here -->
<link rel="icon" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACxUlEQVQ4y2WSTWgdVRSAvzn3zryZecbaaJpaoYlPRWil+IvaCiJKwY1YQVDBqgsRQfxZKLgS1IWCFFoX4g8xYhX/QHeCYHXnpq0lirZUXUgbtWh4yWuSyZs557h4L9FQuJfLvfB955x7TrLlqvvubLUveClNs+skRCQBB9wdBgvw/+7umOrhur/4/O9Hpw/FVnv03aIsx/OiIM0iIJgpZg1uCmY4CZ4IkgScBDO7vl4p33f3yRjTdDwvC8p2mxAiu66dYO+enVw2uRkzw8w5MvMrUx8fYubELBJbkAgSwmagIyEIaZoiIfLcY7t58Zl76EyMo2q8euAgas6ObZPse+ERbrupQ1MvAU4IkX6/f76s1rXrmgl237IdMx9u4823p1A1VI1GjWcfv5ctF6bU1VnMGuq6FnHATHlwz82YGWoDQG3wffr/NzXuuuMGVpa6NPUy3W43CBimDZ2t46j5OgBYi642OHfeeDUrSwvU/Yq5ubkobudGWYUAfjrx2zpJWRY0/WW0run1ekHcwfVcWFU5OLWfBx5+gp+HElXj1Ok/MWswa6iqSsTdgITDM7+spbkqubwzyfRb+3jo0afXBEe+/wGG85DnuYkPZ236k2/W1boKdC6d4NuvPkPNmF84y/QHnyOxQCRlZGRExQ0cYeb4LK8c+GjYgaHIBt1QNeYXerz+xjR/z1fErE0iOaOjoxrNDQeSkPL1dyc5fvI17r/7VnZsv4KiLJn94y+OHvuR9z78gn+6FVm5kdAaIZHI2NhYK7raaXO/xJOApAWnzizx8v5P6S/3aJpl3JQkCUjMaZ23iZiNILEgL7L5LMsuihdv2vBkr9J3mn6zUWLApUVobSCVFqHpgzuOkEhEYgsPGXmRLT619/YvgZi4+5XANmCrqpbunlRVJYuLi6GqKmmaJknT1PM8t7IsNc9ziTECnAGO/QuYgs28GHSMDAAAAABJRU5ErkJggg==">
<link rel="stylesheet" href="chrome://resources/css/list.css">
<link rel="stylesheet" href="chrome://resources/css/tree.css">
<style>body {
  background-color:white;
  color:black;
  margin:10px;
}
.header {
  overflow:auto;
  clear:both;
}
.header .logo {
  float:left;
}
.header .form {
  float:left;
  margin-top:22px;
  margin-left:12px;
}
html[dir='rtl'] .logo {
  float:right;
}
html[dir='rtl'] .form {
  float:right;
  margin-right:12px;
}
.page-navigation {
  padding:8px;
  background-color:#ebeff9;
  margin-right:4px;
}
.footer {
  height:24px;
}</style>
<style>body {
  font-size: 100%;
  -webkit-user-select: none;
}

#settings-title {
  -webkit-padding-end: 24px;
  padding-top: 1em;
  padding-bottom: 1em;
  text-align: end;
  font-size: 125%;
  font-weight: normal;
  color: #53627d;
  margin: 0;
}

#main-content {
  display: -webkit-box;
  position: absolute;
  left: 0;
  right: 0;
  top: 0;
  bottom: 0;
}

.overlay {
  position: fixed;
  left: 0;
  right: 0;
  background: rgba(0, 0, 0, .2);
  top: 0;
  bottom: 0;
  z-index: 10;
  padding: 20px;
  display: -webkit-box;
  -webkit-box-align: center;
  -webkit-box-pack: center;
}

#close-overlay {
  position: relative;
  top: -20px;
  width: 20px;
  height: 20px;
}

html[dir='ltr'] #close-overlay {
  float: right;
  right: -20px;
}

html[dir='rtl'] #close-overlay {
  float: left;
  left: -20px;
}

.overlay .button-strip {
  text-align: end;
}

.overlay > div {
  background: white;
  border-radius: 5px;
  padding: 15px;
  border: 1px solid #666;
  -webkit-box-shadow: 3px 3px 3px #666;
}

#navbar {
  margin: 0;
}

#navbar-container {
  background: -webkit-gradient(linear,
                               left top,
                               left bottom,
                               from(rgba(234, 238, 243, 0)),
                               to(#eaeef3)),
              -webkit-gradient(linear,
                               left top,
                               right top,
                               from(#eaeef3),
                               color-stop(0.97, #eaeef3),
                               to(#d3d7db));
  -webkit-border-end: 1px solid #c6c9ce;
  cursor: pointer;
  position: relative;
  width: 250px;
  z-index: 2;
}

html[dir='rtl'] #navbar-container {
  background: -webkit-gradient(linear,
                               left top,
                               left bottom,
                               from(rgba(255, 255, 255, 0)),
                               color-stop(0.7, rgba(255, 255, 255, 0)),
                               to(white)),
              -webkit-gradient(linear,
                               right top,
                               left top,
                               from(white),
                               color-stop(0.8, white),
                               to(#f3f3f3));
}

#navbar-container > hr {
  -webkit-margin-start: 35%;
  background-color: #dbdbdb;
  border: 0;
  height: 1px;
  width: 65%;
}

.navbar-item, .navbar-item2 {
  padding: 0.5em 0;
  -webkit-padding-end: 24px;
  text-align: end;
  display: block;
  color: #426dc9;
  outline:none;
}

.navbar-item-selected {
  background: -webkit-gradient(linear,
                               left top,
                               right top,
                               from(#eaeef3),
                               color-stop(0.97, #b4c8ea),
                               to(#a2b5b4));
  font-weight: bold;
  color: black;
}

html[dir='rtl'] .navbar-item-selected {
  background: -webkit-gradient(linear,
                               right top,
                               left top,
                               from(white),
                               to(#d6def3));
}

.navbar-item-normal {
  background-color: #dfdfdf;
}

#mainview {
  -webkit-box-align: stretch;
  -webkit-padding-start: 251px;
  margin: 0;
  position: absolute;
  left: 0;
  right: 0;
  top: 0;
  bottom: 0;
  z-index: 1;
}

#mainview-content {
  width: 550px;
  padding: 0 24px;
}

#managed-prefs-banner {
  background: -webkit-gradient(linear,
                               left top,
                               left bottom,
                               from(#fff2b7),
                               color-stop(0.97, #fae691),
                               to(#878787));
  height: 31px;
  width: 100%;
}

#managed-prefs-banner, span {
  margin: 0;
  padding: 0;
  vertical-align: middle;
}

#managed-prefs-icon {
  background-image: url("chrome://theme/IDR_WARNING");
  background-repeat: no-repeat;
  background-position:center;
  padding: 5px;
  width: 24px;
  height: 21px;
  display: inline-block;
}

.page > h1 {
  -webkit-padding-end: 24px;
  padding-top: 1em;
  padding-bottom: 1em;
  border-bottom: 1px solid #eeeeee;
  -webkit-padding-start: 0;
  font-size: 125%;
  color: #54637f;
  margin: 0;
}

section {
  display: -webkit-box;
  -webkit-box-orient: horizontal;
  border-bottom: 1px solid #eeeeee;
  margin-top: 1em;
  margin-bottom: 1em;
  padding-bottom: 0.5em;
}

section > h3 {
  width: 100px;
  font-weight: normal;
  -webkit-padding-start: 0;
  vertical-align: middle;
  margin: 0;
  font-size: 100%;
  padding-top: 2px;
}

section > div:only-of-type {
  -webkit-box-flex: 1;
}

.option {
  margin-top: 0;
}

.option-control-table, section > div:only-of-type {
  -webkit-padding-start: 10px;
  border-spacing: 0 0;
}

.suboption {
  -webkit-margin-start: 18px;
}

/* TODO(stuartmorgan): make this less specific once all pages
 * are converted to the non-table style.
 */
section > div:only-of-type label {
  display: block;
  margin-bottom: 3px;
}

.hidden {
  display: none;
}

.touch-slider {
  -webkit-appearance: slider-horizontal;
}

input[type="checkbox"] {
  margin-top: 0;
  vertical-align: middle;
}

input[type="radio"] {
  vertical-align: top;
  padding-top: 2px;
}

select {
  margin: 0px;
}

.link-button {
  background-color: transparent;
  border: none;
  color: blue;
  cursor: pointer;
  text-decoration: underline;
}

.text-button {
  background-color: transparent;
  border-color: transparent;
}

#contentSettingsPage :invalid {
  background-color: pink;
}

#languageChewingPage :invalid {
  background-color: pink;
}

#languageMozcPage :invalid {
  background-color: pink;
}

list > .heading {
  color: #666666;
}

list > .heading:hover {
  background-color: transparent;
  border-color: transparent;
}

.left-side-table {
  display: -webkit-box;
}

.left-side-table > div:first-child {
  -webkit-box-flex: 1;
}

.left-side-table > :last-child {
  -webkit-padding-start: 20px;
}

.left-side-table > :last-child button {
  width: 100%;
}

.favicon-cell {
  background-position: left;
  background-repeat: no-repeat;
  -webkit-padding-start: 20px;
}
html[dir=rtl] .favicon-cell {
  background-position: right;
}
</style>
<style>#addStartupPageOverlay {
  width: 500px;
}

#addURLBlock {
  display: -webkit-box;
  margin: 1ex 0 2ex 0;
}

#addURLBlock > * {
  display: block;
}

#addURLBlock > span {
  padding-top: 4px;
}

#addStartupPageURL {
  -webkit-box-flex: 1;
}

#addStartupRecentPageList .url {
  display: none;
  color: hsl(0, 0%, 70%);
  -webkit-padding-start: 3ex;
}

#addStartupRecentPageList > :hover > .url,
#addStartupRecentPageList > [selected] > .url {
  display: inline;
}

#addStartupPageOverlay .button-strip {
  margin-top: 2ex;
}
</style>
<style>#alertOverlayMessage {
  width: 400px;
}
</style>
<style>#autoFillEditAddressOverlay {
  width: 500px;
}
</style>
<style>#autoFillEditCreditCardOverlay {
  width: 500px;
}
</style>
<style>div.autofill-section {
  display: block;
  padding: 1em 0 0;
}

#profileSelectContainer {
  display: -webkit-box;
}

#profileSelectLeftColumn {
  -webkit-box-flex: 1;
}
#profileSelectLeftColumn select {
  width: 100%;
}
</style>
<style>#startupPages {
  border: solid 1px #999999;
  height: 100px;
}

#homepageURL {
  width: 100%;
}

#defaultSearchEngineGroup {
  display: -webkit-box;
}

#defaultSearchEngine {
  display: block;
  -webkit-box-flex: 1;
}

#defaultSearchManageEnginesButton {
  margin-top: 0px;
  -webkit-margin-start: 10px;
}

#defaultBrowserState {
  color: #880000;
}

#defaultBrowserState.current {
  color: #008800;
}
</style>
<style>#cbdThrobber {
  background-image: url("data:image/png;base64,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");
  width: 16px;
  height: 16px;
  margin: -3px 10px;
  display: inline-block;
  visibility: hidden;
}

#checkboxListData > label {
  display: block;
}
</style>
<style>/*
Copyright (c) 2010 The Chromium Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
*/

.contentSettingsHeader {
   /* TODO(dhg): something nice. */
}

.exceptionsLink {
  font-weight: bold;
  cursor: pointer;
}
</style>
<style>/*
Copyright (c) 2010 The Chromium Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
*/

.exceptionInput {
  /* TODO(estade): need something here to make it fill the remaining space. */
}

.exceptionSetting {
  float: right;
}
</style>
<style>/*
Copyright (c) 2010 The Chromium Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
*/

.cookies-info-table {
  width: 100%;
}

.cookies-details-pane {
  background-color: lightgrey;
  border: 1px solid grey;
  margin: 5px 0;
}

.cookie-details-label {
  white-space: pre;
  vertical-align: top;
}

html[dir=ltr] .cookie-details-label {
  text-align: right;
}

#cookiesSearchBox {
  border: 1px solid lightgrey;
  display: box;
  width: 366px;
}

#cookiesTree {
  border: 1px solid lightgrey;
  height: 200px;
  margin: 0;
  padding: 5px;
}

#cookieContent {
  display: block;
  width: 520px;
  word-wrap: break-word;
}
</style>
<style>#editSearchEngineOverlay {
  width: 500px;
}

#editSearchEngineOverlay table label {
  text-align: end;
}

#editSearchEngineOverlay table,
#editSearchEngineOverlay table td:nth-child(2) {
  width: 100%;
}

#editSearchEngineOverlay table input {
  width: 100%;
  -webkit-box-sizing: border-box;
}

#editSearchEngineOverlay .button-strip {
  margin-top: 2ex;
}

.valid-badge, .alert-badge {
  width: 22px;
  height: 21px;
  background-position: 50% 1px;
  background-repeat: no-repeat;
}

.valid-badge {
  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAVCAYAAABCIB6VAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA7RJREFUOI2Nlc9rXFUUxz/3vh8zmUxmhulMrUUXUms1SBFKY1t0IYiibooB/Qu0IBRrSndFXSjiooXQjSK6qCuLKESpBbvRKmKKUrHVVhe2xURbbX5MfkzevHvPcfHeZJKJix448N7l3s89v973GVXllWPN2Aa8ERXMy3FsYiwYQBUUBQVQVBXN11FF0GyPaEdEx9NEj46PzXcAQgAb8FapbMdqjYDBqiEIAe2BVcmg2v+cwVFil+qRxXkJgMOADQHigjlYbQRsutNSGLAY2wN0L5BuBqqoGtqLwnJLKJYN8QB4D2HMQeA4sGwBwohosGooDBiMUVTWRKSKqGRroogoc/84muETjI58QpzsoDXrUVWiIhGwFahYAGMgsIDpghQRQXJQ5tn7wi1Po7CH0X0fcld9hMcefI3WrGclEdQoQJEclzcki8g7ZWHWkbRlTcSZL7UcgdvK6L6TeN9BxHFl6gytlmel7RERupaDs4POKbPTA+y84zCldISZv1O8yyJdWRKS+TKje08SB4N4l3Lt5rec/eEdklSwFkS0D5zXdLHl2LXtBfbef4TnH/mU5sAeZm46khXPUsvxzO4TNKvDOJfQ7szx2flDLLWFetMSRfo/EWt2m7Uwt3ANVQcq7H/4A2rxMK0Zz6P3vcn2rU/h0jaqwufnD3Hlj2uUa4ahGmCzrNeBBUFUKZQMv0x/xNUb3yDiKERDPL1rnIfuPsDI9hfxLkFFuDL1Bd/9fBpCpd4wBEGvyRtKISqICsUhw9mfjqIqiAibKw/w+M7XcW4F71PanTkmJsdIUqG5xRAXs8aLZCO5PmJldUYLJWUmucjk7++i6vE+xaUZVFWYmBzj+vQMlbqhNNQ3orqhxrJubksVy7lLx2h35lCVVf/+t/c4d+E0JoRaHcJg47z3RayIgqjgRbCBIFGLLy+8ugqdW7zOV5eOk6rQ2GKIitk57fOuhVmNyW/MN4syWIOLU6eIgjKFsMLlqTP8+dcs9aahVM4AsubT735k68CikkG74FxsypsM56++z9KCsNwWyjVDtWaw+Wj1hEp7EgvxqrqJ11RUox44c2NgqA7xIFTFEAQQhGtT78kqqmCsAE1gyuYpnXCp4JxuEB6MEBegUMyh9Kagv77bmk/+CFQBb4HopWcn3i7qPR8nbfVeZJ3w9B/ul1RVMFjZsWX/r8/tPvU18C8wb1S1CDSAe4FhYDMQkf2dbsds3qtl4DIwCVwPgQS4BXhgBqh0m3qbpoADFoAbwCzQ+Q8yG/7Miqu1XwAAAABJRU5ErkJggg==");
}

.alert-badge {
  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAVCAYAAABCIB6VAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAu9JREFUeNqMVD1oFEEU/mbvdrO55S6JmosKFsGIYKGt2NkIEbGQgJWthRBERWxsBEFsBLWyF02RTkxpYWlhqcFSFFHzd+b+9u5mnm9mZ3dn9xLIcN/d3Mx733vz/gQR4fWdRlDx8Dj0cTsMROABEALQd+CPXpR+FUAwIoSBVPQ8HuDh0ov2QItW9ReTPpmqibtz0x4ORQLVimWxBOSQkUMIZY0DwXBE97d2SWveY3iGeDLA8tyUhxOHPUQTbEhoZZGRjBGSSPYqlSNIKVCrYJlPnjG6hniiKvyZCIiChJScp3b6hFZHodMjvhdoTArtSGJM5YY9/op8+HxynPFHh5PjSfArllQLKzLQ+1ZbYfbyCs4++IfZKyvYbEmMhvoul9F7kgk5rzCJria2TyWbCUqfzgqdLqGxsGgS2Di1iP6A0OMXpIQpefZrlyFOE2GSkQlZA4pQWHzf75e8dfbpqqa1RCqPWTFRttz40kDpRPF/6SRVFWULxGMllJaXUVJQSvJe5kRqHx2XmMpxolxQ/5dyaEll8jJhn+0Yz3TcGGeeOTEzXkgyJdhaf2/Id9bXEHPiROplOb5qD48zy8ppBt7XuWF+rd4AtyvivoLHZ0G15KWjUySm1LIoJsJ641mZKBS6CcDzZCzRWcMUQpE+RTqxtvsW1/HRpbc49+gvmtdeoRfTnvWbdeF4jIsxS2tZt3I4fwG97jaihYvoj7hB+mXy/RrEvSglpMZP3/myZoTb3z4g5hcMY6c7TTgKdRxk000pGnJ8/byE8rKrTxA2Vm/ixxAY9JLkVStivCmMqtBas4yfniV+OeTBIkdu2VmPqwLNuodmDeb3GI/WMCjNaJV47Z+89JlPphhSE/vnb7172g3nV9sxpJIYm1wVkVTETJ1Ha2jntcrDAFFRwemrX6evv/nIpxuMluALPeaOMBYYZxhNbUwPPRxsebZsu4x1xifGd30QMza1+4wtPR2zGXKwpQPCQcQu4zdjmzH4L8AAVWGTYHdtqzMAAAAASUVORK5CYII=");
}
</style>
<style>/*
Copyright (c) 2010 The Chromium Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
*/

.passwordsUsername {
  float: right;
}
</style>
<style>#import-throbber {
  background-image: url("data:image/png;base64,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");
  width: 16px;
  height: 16px;
  margin: -3px 10px;
  display: inline-block;
  visibility: hidden;
}
</style>
<style>#searchEngineList > div, #searchEngineHeading {
  display: -webkit-box;
}

#searchEngineManagerPage .name {
  -webkit-box-sizing: border-box;
  width: 50%;
}

#searchEngineManagerPage .keyword {
  -webkit-box-flex: 1;
}

#searchEngineList .keyword {
  color: #666666;
}

#searchEngineList .default {
  font-weight: bold;
}

#searchEngineList .name, #searchEngineList .keyword {
  overflow: hidden;
  text-overflow: ellipsis;
}

#searchEngineHeading {
  font-weight: bold;
  padding: 4px;
  border-bottom: solid 1px black;
  border-top: 1px solid black;
}
</style>
<style>/*
Copyright (c) 2010 The Chromium Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
*/

.subpages-nav-tabs .inactive-tab {
  background: -webkit-gradient(linear,
                               left top,
                               left bottom,
                               from(white),
                               to(#f3f3f3));
  border-bottom: 1px solid #a0a0a0;
  padding: 4px 8px;
}

.subpages-nav-tabs .active-tab {
  background: white;
  border: 1px solid #a0a0a0;
  border-bottom: 0;
  -webkit-border-top-left-radius: 3px;
  -webkit-border-top-right-radius: 3px;
  font-weight: bold;
}

.subpages-nav-tabs {
  margin-bottom: 15px;
}

.subpages-tab-contents {
  display: none;
   -webkit-padding-start: 10px;
}

.active-tab-contents {
  display: block;
}
</style>


<script src="chrome://resources/css/tree.css.js"></script>

<script src="chrome://resources/js/class_list.js"></script>
<script src="chrome://resources/js/cr.js"></script>
<script src="chrome://resources/js/cr/event_target.js"></script>
<script src="chrome://resources/js/cr/ui.js"></script>
<script src="chrome://resources/js/cr/ui/array_data_model.js"></script>
<script src="chrome://resources/js/cr/ui/list_selection_model.js"></script>
<script src="chrome://resources/js/cr/ui/list_selection_controller.js"></script>
<script src="chrome://resources/js/cr/ui/list_single_selection_model.js"></script>
<script src="chrome://resources/js/cr/ui/list_item.js"></script>
<script src="chrome://resources/js/cr/ui/list.js"></script>
<script src="chrome://resources/js/cr/ui/tree.js"></script>
<script src="chrome://resources/js/local_strings.js"></script>
<script src="chrome://resources/js/util.js"></script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

cr.define('options', function() {

  /////////////////////////////////////////////////////////////////////////////
  // Preferences class:

  /**
   * Preferences class manages access to Chrome profile preferences.
   * @constructor
   */
  function Preferences() {
  }

  cr.addSingletonGetter(Preferences);

  /**
   * Extracts preference value.
   * @param {Object} dict Map of preference values passed to fetchPrefs
   *     callback.
   * @param {string} name Preference name.
   * @return preference value.
   */
  Preferences.getPref = function (dict, name) {
    var parts = name.split('.');
    var cur = dict;
    for (var part; part = parts.shift(); ) {
      if (cur[part]) {
        cur = cur[part];
      } else {
        return null;
      }
    }
    return cur;
  };

  /**
   * Sets value of a boolean preference.
   * and signals its changed value.
   * @param {string} name Preference name.
   * @param {boolean} value New preference value.
   * @param {string} metric User metrics identifier.
   */
  Preferences.setBooleanPref = function (name, value, metric) {
    var arguments = [name, value ? 'true' : 'false'];
    if (metric != undefined) arguments.push(metric);
    chrome.send('setBooleanPref', arguments);
  };

  /**
   * Sets value of an integer preference.
   * and signals its changed value.
   * @param {string} name Preference name.
   * @param {number} value New preference value.
   * @param {string} metric User metrics identifier.
   */
  Preferences.setIntegerPref = function(name, value, metric) {
    var arguments = [name, String(value)];
    if (metric != undefined) arguments.push(metric);
    chrome.send('setIntegerPref', arguments);
  };

  /**
   * Sets value of a string preference.
   * and signals its changed value.
   * @param {string} name Preference name.
   * @param {string} value New preference value.
   * @param {string} metric User metrics identifier.
   */
  Preferences.setStringPref = function(name, value, metric) {
    var arguments = [name, value];
    if (metric != undefined) arguments.push(metric);
    chrome.send('setStringPref', arguments);
  };

  /**
   * Sets value of a JSON preference.
   * and signals its changed value.
   * @param {string} name Preference name.
   * @param {string} value New preference value.
   * @param {string} metric User metrics identifier.
   */
  Preferences.setObjectPref = function(name, value, metric) {
    var arguments = [name, JSON.stringify(value)];
    if (metric != undefined) arguments.push(metric);
    chrome.send('setObjectPref', arguments);
  };

  Preferences.prototype = {
    __proto__: cr.EventTarget.prototype,

    // Map of registered preferences.
    registeredPreferences_: {},

    /**
     * Adds an event listener to the target.
     * @param {string} type The name of the event.
     * @param {!Function|{handleEvent:Function}} handler The handler for the
     *     event. This is called when the event is dispatched.
     */
    addEventListener: function(type, handler) {
      cr.EventTarget.prototype.addEventListener.call(this, type, handler);
      this.registeredPreferences_[type] = true;
    },

    /**
     * Initializes preference reading and change notifications.
     */
    initialize: function() {
      var params1 = ['Preferences.prefsFetchedCallback'];
      var params2 = ['Preferences.prefsChangedCallback'];
      for (var prefName in this.registeredPreferences_) {
        params1.push(prefName);
        params2.push(prefName);
      }
      chrome.send('fetchPrefs', params1);
      chrome.send('observePrefs', params2);
    },

    /**
     * Helper function for flattening of dictionary passed via fetchPrefs
     * callback.
     * @param {string} prefix Preference name prefix.
     * @param {object} dict Map with preference values.
     */
    flattenMapAndDispatchEvent_: function(prefix, dict) {
      for (var prefName in dict) {
        if (typeof dict[prefName] == 'object' &&
            !this.registeredPreferences_[prefix + prefName]) {
          this.flattenMapAndDispatchEvent_(prefix + prefName + '.',
              dict[prefName]);
        } else {
          var event = new cr.Event(prefix + prefName);
          event.value = dict[prefName];
          this.dispatchEvent(event);
        }
      }
    }
  };

  /**
   * Callback for fetchPrefs method.
   * @param {object} dict Map of fetched property values.
   */
  Preferences.prefsFetchedCallback = function(dict) {
    Preferences.getInstance().flattenMapAndDispatchEvent_('', dict);
  };

  /**
   * Callback for observePrefs method.
   * @param {array} notification An array defining changed preference values.
   * notification[0] contains name of the change preference while its new value
   * is stored in notification[1].
   */
  Preferences.prefsChangedCallback = function(notification) {
    var event = new cr.Event(notification[0]);
    event.value = notification[1];
    Preferences.getInstance().dispatchEvent(event);
  };

  // Export
  return {
    Preferences: Preferences
  };

});

</script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

cr.define('options', function() {

  var Preferences = options.Preferences;
  /////////////////////////////////////////////////////////////////////////////
  // PrefCheckbox class:

  // Define a constructor that uses an input element as its underlying element.
  var PrefCheckbox = cr.ui.define('input');

  PrefCheckbox.prototype = {
    // Set up the prototype chain
    __proto__: HTMLInputElement.prototype,

    /**
     * Initialization function for the cr.ui framework.
     */
    decorate: function() {
      this.type = 'checkbox';
      var self = this;

      // Listen to pref changes.
      Preferences.getInstance().addEventListener(this.pref,
          function(event) {
            self.checked = (event.value && event.value['value'] != undefined) ?
                event.value['value'] : event.value;
            self.managed = (event.value && event.value['managed'] != undefined) ?
                event.value['managed'] : false;
            self.disabled = self.managed;
          });

      // Listen to user events.
      this.addEventListener('click',
          function(e) {
            Preferences.setBooleanPref(self.pref, self.checked, self.metric);
          });
    }
  };

  /**
   * The preference name.
   * @type {string}
   */
  cr.defineProperty(PrefCheckbox, 'pref', cr.PropertyKind.ATTR);

  /**
   * The user metric string.
   * @type {string}
   */
  cr.defineProperty(PrefCheckbox, 'metric', cr.PropertyKind.ATTR);

  /////////////////////////////////////////////////////////////////////////////
  // PrefRadio class:

  //Define a constructor that uses an input element as its underlying element.
  var PrefRadio = cr.ui.define('input');

  PrefRadio.prototype = {
    // Set up the prototype chain
    __proto__: HTMLInputElement.prototype,

    /**
     * Initialization function for the cr.ui framework.
     */
    decorate: function() {
      this.type = 'radio';
      var self = this;

      // Listen to pref changes.
      Preferences.getInstance().addEventListener(this.pref,
          function(event) {
            var value = (event.value && event.value['value'] != undefined) ?
                event.value['value'] : event.value;
            self.managed = (event.value && event.value['managed'] != undefined) ?
                event.value['managed'] : false;
            self.checked = String(value) == self.value;
            self.disabled = self.managed;
          });

      // Listen to user events.
      this.addEventListener('change',
          function(e) {
            if(self.value == 'true' || self.value == 'false') {
              Preferences.setBooleanPref(self.pref,
                  self.value == 'true', self.metric);
            } else {
              Preferences.setIntegerPref(self.pref,
                  parseInt(self.value, 10), self.metric);
            }
          });
    },

    /**
     * Getter for preference name attribute.
     */
    get pref() {
      return this.getAttribute('pref');
    },

    /**
     * Setter for preference name attribute.
     */
    set pref(name) {
      this.setAttribute('pref', name);
    }
  };

  /**
   * The user metric string.
   * @type {string}
   */
  cr.defineProperty(PrefRadio, 'metric', cr.PropertyKind.ATTR);

  /////////////////////////////////////////////////////////////////////////////
  // PrefNumeric class:

  // Define a constructor that uses an input element as its underlying element.
  var PrefNumeric = function() {};
  PrefNumeric.prototype = {
    // Set up the prototype chain
    __proto__: HTMLInputElement.prototype,

    /**
     * Initialization function for the cr.ui framework.
     */
    decorate: function() {
      var self = this;

      // Listen to pref changes.
      Preferences.getInstance().addEventListener(this.pref,
          function(event) {
            self.value = (event.value && event.value['value'] != undefined) ?
                event.value['value'] : event.value;
            self.managed = (event.value && event.value['managed'] != undefined) ?
                event.value['managed'] : false;
            self.disabled = self.managed;
          });

      // Listen to user events.
      this.addEventListener('change',
          function(e) {
            if (this.validity.valid) {
              Preferences.setIntegerPref(self.pref, self.value, self.metric);
            }
          });
    }
  };

  /**
   * The preference name.
   * @type {string}
   */
  cr.defineProperty(PrefNumeric, 'pref', cr.PropertyKind.ATTR);

  /**
   * The user metric string.
   * @type {string}
   */
  cr.defineProperty(PrefNumeric, 'metric', cr.PropertyKind.ATTR);

  /////////////////////////////////////////////////////////////////////////////
  // PrefNumber class:

  // Define a constructor that uses an input element as its underlying element.
  var PrefNumber = cr.ui.define('input');

  PrefNumber.prototype = {
    // Set up the prototype chain
    __proto__: PrefNumeric.prototype,

    /**
     * Initialization function for the cr.ui framework.
     */
    decorate: function() {
      this.type = 'number';
      PrefNumeric.prototype.decorate.call(this);

      // Listen to user events.
      this.addEventListener('input',
          function(e) {
            if (this.validity.valid) {
              Preferences.setIntegerPref(self.pref, self.value, self.metric);
            }
          });
    }
  };

  /////////////////////////////////////////////////////////////////////////////
  // PrefRange class:

  // Define a constructor that uses an input element as its underlying element.
  var PrefRange = cr.ui.define('input');

  PrefRange.prototype = {
    // Set up the prototype chain
    __proto__: PrefNumeric.prototype,

    /**
     * Initialization function for the cr.ui framework.
     */
    decorate: function() {
      this.type = 'range';
      PrefNumeric.prototype.decorate.call(this);
    }
  };

  /////////////////////////////////////////////////////////////////////////////
  // PrefSelect class:

  // Define a constructor that uses an select element as its underlying element.
  var PrefSelect = cr.ui.define('select');

  PrefSelect.prototype = {
    // Set up the prototype chain
    __proto__: HTMLSelectElement.prototype,

    /**
    * Initialization function for the cr.ui framework.
    */
    decorate: function() {
      var self = this;
      // Listen to pref changes.
      Preferences.getInstance().addEventListener(this.pref,
          function(event) {
            var value = (event.value && event.value['value'] != undefined) ?
                event.value['value'] : event.value;
            self.managed = (event.value && event.value['managed'] != undefined) ?
                event.value['managed'] : false;
            self.disabled = self.managed;
            for (var i = 0; i < self.options.length; i++) {
              if (self.options[i].value == value) {
                self.selectedIndex = i;
                return;
              }
            }
            // Item not found, select first item.
            self.selectedIndex = 0;
          });

      // Listen to user events.
      this.addEventListener('change',
          function(e) {
            switch(self.dataType) {
              case 'number':
                Preferences.setIntegerPref(self.pref,
                    self.options[self.selectedIndex].value, self.metric);
                break;
              case 'boolean':
                Preferences.setBooleanValue(self.pref,
                    self.options[self.selectedIndex].value, self.metric);
                break;
              case 'string':
                Preferences.setStringPref(self.pref,
                    self.options[self.selectedIndex].value, self.metric);
                break;
            }
          });

      // Initialize options.
      this.ownerDocument.addEventListener('DOMContentLoaded',
          function() {
            var values = self.getAttribute('data-values');
            if (values) {
              self.initializeValues(templateData[values]);
            }
          });
    },

    /**
     * Sets up options in select element.
     * @param {Array} options List of option and their display text.
     * Each element in the array is an array of length 2 which contains options
     * value in the first element and display text in the second element.
     *
     * TODO(zelidrag): move this to that i18n template classes.
     */
    initializeValues: function(options) {
      options.forEach(function (values) {
        if (this.dataType == undefined)
          this.dataType = typeof values[0];
        this.appendChild(new Option(values[1], values[0]));
      }, this);
    }
  };

  /**
   * The preference name.
   * @type {string}
   */
  cr.defineProperty(PrefSelect, 'pref', cr.PropertyKind.ATTR);

  /**
   * The user metric string.
   * @type {string}
   */
  cr.defineProperty(PrefSelect, 'metric', cr.PropertyKind.ATTR);

  /////////////////////////////////////////////////////////////////////////////
  // PrefTextField class:

  // Define a constructor that uses an input element as its underlying element.
  var PrefTextField = cr.ui.define('input');

  PrefTextField.prototype = {
    // Set up the prototype chain
    __proto__: HTMLInputElement.prototype,

    /**
     * Initialization function for the cr.ui framework.
     */
    decorate: function() {
      var self = this;

      // Listen to pref changes.
      Preferences.getInstance().addEventListener(this.pref,
          function(event) {
            self.value = (event.value && event.value['value'] != undefined) ?
                event.value['value'] : event.value;
            self.managed = (event.value && event.value['managed'] != undefined) ?
                event.value['managed'] : false;
            self.disabled = self.managed;
          });

      // Listen to user events.
      this.addEventListener('change',
          function(e) {
            Preferences.setStringPref(self.pref, self.value, self.metric);
          });

      window.addEventListener('unload',
          function() {
            if (document.activeElement == self)
              self.blur();
          });
    }
  };

  /**
   * The preference name.
   * @type {string}
   */
  cr.defineProperty(PrefTextField, 'pref', cr.PropertyKind.ATTR);

  /**
   * The user metric string.
   * @type {string}
   */
  cr.defineProperty(PrefTextField, 'metric', cr.PropertyKind.ATTR);

  // Export
  return {
    PrefCheckbox: PrefCheckbox,
    PrefNumber: PrefNumber,
    PrefNumeric: PrefNumeric,
    PrefRadio: PrefRadio,
    PrefRange: PrefRange,
    PrefSelect: PrefSelect,
    PrefTextField: PrefTextField
  };

});
</script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

cr.define('options', function() {
  const ListSelectionController = cr.ui.ListSelectionController;

  /**
   * Creates a selection controller with a delegate that controls whether or
   * not individual items are selectable. This is used for lists containing
   * subgroups with headings that are in the list, since the headers themselves
   * should not be selectable.
   *
   * @param {cr.ui.ListSelectionModel} selectionModel The selection model to
   *     interact with.
   * @param {*} selectabilityDelegate A delegate responding to
   *     canSelectIndex(index).
   *
   * @constructor
   * @extends {!cr.ui.ListSelectionController}
   */
  function ListInlineHeaderSelectionController(selectionModel,
                                               selectabilityDelegate) {
    ListSelectionController.call(this, selectionModel);
    this.selectabilityDelegate_ = selectabilityDelegate;
  }

  ListInlineHeaderSelectionController.prototype = {
    __proto__: ListSelectionController.prototype,

    /** @inheritDoc */
    getIndexBelow: function(index) {
      var next = ListSelectionController.prototype.getIndexBelow.call(this,
                                                                      index);
      if (next == -1 || this.canSelect(next))
        return next;
      return this.getIndexBelow(next);
    },

    /** @inheritDoc */
    getNextIndex: function(index) {
      return this.getIndexBelow(index);
    },

    /** @inheritDoc */
    getIndexAbove: function(index) {
      var previous = ListSelectionController.prototype.getIndexAbove.call(
          this, index);
      if (previous == -1 || this.canSelect(previous))
        return previous;
      return this.getIndexAbove(previous);
    },

    /** @inheritDoc */
    getPreviousIndex: function(index) {
      return this.getIndexAbove(index);
    },

    /** @inheritDoc */
    getFirstIndex: function(index) {
      var first = ListSelectionController.prototype.getFirstIndex.call(this);
      if (this.canSelect(first))
        return first;
      return this.getNextIndex(first);
    },

    /** @inheritDoc */
    getLastIndex: function(index) {
      var last = ListSelectionController.prototype.getLastIndex.call(this);
      if (this.canSelect(last))
        return last;
      return this.getPreviousIndex(last);
    },

    /** @inheritDoc */
    handleMouseDownUp: function(e, index) {
      if (this.canSelect(index)) {
        ListSelectionController.prototype.handleMouseDownUp.call(
            this, e, index);
      }
    },

    /**
     * Returns true if the given index is selectable.
     * @private
     * @param {number} index The index to check.
     */
    canSelect: function(index) {
      return this.selectabilityDelegate_.canSelectIndex(index);
    }
  };

  return {
    ListInlineHeaderSelectionController: ListInlineHeaderSelectionController
  };
});
</script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

cr.define('options', function() {
  /////////////////////////////////////////////////////////////////////////////
  // OptionsPage class:

  /**
   * Base class for options page.
   * @constructor
   * @param {string} name Options page name, also defines id of the div element
   *     containing the options view and the name of options page navigation bar
   *     item as name+'PageNav'.
   * @param {string} title Options page title, used for navigation bar
   * @extends {EventTarget}
   */
  function OptionsPage(name, title, pageDivName) {
    this.name = name;
    this.title = title;
    this.pageDivName = pageDivName;
    this.pageDiv = $(this.pageDivName);
    this.tab = null;
    this.managed = false;
  }

  OptionsPage.registeredPages_ = {};

  /**
   * Pages which are meant to have an entry in the nav, but
   * not have a permanent entry.
   */
  OptionsPage.registeredSubPages_ = {};

  /**
   * Pages which are meant to behave like model dialogs.
   */
  OptionsPage.registeredOverlayPages_ = {};

  /**
   * Shows a registered page.
   * @param {string} pageName Page name.
   */
  OptionsPage.showPageByName = function(pageName) {
    for (var name in OptionsPage.registeredPages_) {
      var page = OptionsPage.registeredPages_[name];
      page.visible = name == pageName;
    }
  };

  /**
   * Shows a registered Overlay page.
   * @param {string} overlayName Page name.
   */
  OptionsPage.showOverlay = function(overlayName) {
    if (OptionsPage.registeredOverlayPages_[overlayName]) {
      OptionsPage.registeredOverlayPages_[overlayName].visible = true;
    }
  };

  OptionsPage.clearOverlays = function() {
     for (var name in OptionsPage.registeredOverlayPages_) {
       var page = OptionsPage.registeredOverlayPages_[name];
       page.visible = false;
     }
  };

  /**
  * Shows the tab contents for the given navigation tab.
  * @param {!Element} tab The tab that the user clicked.
  */
  OptionsPage.showTab = function(tab) {
    if (!tab.classList.contains('inactive-tab'))
      return;

    if (this.activeNavTab != null) {
      this.activeNavTab.classList.remove('active-tab');
      $(this.activeNavTab.getAttribute('tab-contents')).classList.
          remove('active-tab-contents');
    }

    tab.classList.add('active-tab');
    $(tab.getAttribute('tab-contents')).classList.add('active-tab-contents');
    this.activeNavTab = tab;
  }

  /**
   * Registers new options page.
   * @param {OptionsPage} page Page to register.
   */
  OptionsPage.register = function(page) {
    OptionsPage.registeredPages_[page.name] = page;
    // Create and add new page <li> element to navbar.
    var pageNav = document.createElement('li');
    pageNav.id = page.name + 'PageNav';
    pageNav.className = 'navbar-item';
    pageNav.setAttribute('pageName', page.name);
    pageNav.textContent = page.title;
    pageNav.tabIndex = 0;
    pageNav.onclick = function(event) {
      OptionsPage.showPageByName(this.getAttribute('pageName'));
    };
    pageNav.onkeypress = function(event) {
      // Enter or space
      if (event.keyCode == 13 || event.keyCode == 32) {
        OptionsPage.showPageByName(this.getAttribute('pageName'));
      }
    };
    var navbar = $('navbar');
    navbar.appendChild(pageNav);
    page.tab = pageNav;
    page.initializePage();
  };

  /**
   * Registers a new Sub tab page.
   * @param {OptionsPage} page Page to register.
   */
  OptionsPage.registerSubPage = function(page) {
    OptionsPage.registeredPages_[page.name] = page;
    var pageNav = document.createElement('li');
    pageNav.id = page.name + 'PageNav';
    pageNav.className = 'navbar-item hidden';
    pageNav.setAttribute('pageName', page.name);
    pageNav.textContent = page.title;
    var subpagesnav = $('subpagesnav');
    subpagesnav.appendChild(pageNav);
    page.tab = pageNav;
    page.initializePage();
  };

  /**
   * Registers a new Overlay page.
   * @param {OptionsPage} page Page to register, must be a class derviced from
   * OptionsPage.
   */
  OptionsPage.registerOverlay = function(page) {
    OptionsPage.registeredOverlayPages_[page.name] = page;
    page.tab = undefined;
    page.isOverlay = true;
    page.initializePage();
  };

  /**
   * Callback for window.onpopstate.
   * @param {Object} data State data pushed into history.
   */
  OptionsPage.setState = function(data) {
    if (data && data.pageName) {
      OptionsPage.showPageByName(data.pageName);
    }
  };

  /**
   * Initializes the complete options page.  This will cause
   * all C++ handlers to be invoked to do final setup.
   */
  OptionsPage.initialize = function() {
    chrome.send('coreOptionsInitialize');
  };

  OptionsPage.prototype = {
    __proto__: cr.EventTarget.prototype,

    /**
     * Initializes page content.
     */
    initializePage: function() {},

    /**
     * Sets managed banner visibility state.
     */
    setManagedBannerVisibility: function(visible) {
      this.managed = visible;
      if (this.visible) {
        $('managed-prefs-banner').style.display = visible ? 'block' : 'none';
      }
    },

    /**
     * Gets page visibility state.
     */
    get visible() {
      var page = $(this.pageDivName);
      return page && page.ownerDocument.defaultView.getComputedStyle(
          page).display == 'block';
    },

    /**
     * Sets page visibility.
     */
    set visible(visible) {
      if ((this.visible && visible) || (!this.visible && !visible))
        return;

      if (visible) {
        this.pageDiv.style.display = 'block';
        if (this.isOverlay) {
          var overlay = $('overlay');
          overlay.classList.remove('hidden');
        } else {
          var banner = $('managed-prefs-banner');
          banner.style.display = this.managed ? 'block' : 'none';

          // Recent webkit change no longer allows url change from "chrome://".
          window.history.pushState({pageName: this.name},
                                   this.title);
        }
        if (this.tab) {
          this.tab.classList.add('navbar-item-selected');
          if (this.tab.parentNode && this.tab.parentNode.id == 'subpagesnav')
            this.tab.classList.remove('hidden');
        }
      } else {
        if (this.isOverlay) {
          var overlay = $('overlay');
          overlay.classList.add('hidden');
        }
        this.pageDiv.style.display = 'none';
        if (this.tab) {
          this.tab.classList.remove('navbar-item-selected');
          if (this.tab.parentNode && this.tab.parentNode.id == 'subpagesnav')
            this.tab.classList.add('hidden');
        }
      }

      cr.dispatchPropertyChange(this, 'visible', visible, !visible);
    }
  };

  // Export
  return {
    OptionsPage: OptionsPage
  };

});
</script>

<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

cr.define('options', function() {
  const OptionsPage = options.OptionsPage;
  const ArrayDataModel = cr.ui.ArrayDataModel;
  const ListSingleSelectionModel = cr.ui.ListSingleSelectionModel;

  /**
   * AddStartupPageOverlay class
   * Encapsulated handling of the 'Add Page' overlay page.
   * @class
   */
  function AddStartupPageOverlay() {
    OptionsPage.call(this, 'addStartupPageOverlay',
                     templateData.addStartupPageTitle,
                     'addStartupPageOverlay');
  }

  cr.addSingletonGetter(AddStartupPageOverlay);

  AddStartupPageOverlay.prototype = {
    __proto__: OptionsPage.prototype,

    /**
     * Initializes the page.
     */
    initializePage: function() {
      OptionsPage.prototype.initializePage.call(this);

      var self = this;
      var addForm = $('addStartupPageForm');
      addForm.onreset = cr.bind(this.dismissOverlay_, this);
      addForm.onsubmit =  function(e) {
        var urlField = $('addStartupPageURL');
        BrowserOptions.addStartupPage(urlField.value);

        self.dismissOverlay_();
        return false;
      };
      $('addStartupPageURL').oninput =
          cr.bind(this.updateAddButtonState_, this);
      $('addStartupPageURL').onkeydown = function(e) {
        if (e.keyCode == 27)  // Esc
          $('addStartupPageForm').reset();
      };

      var list = $('addStartupRecentPageList');
      options.add_startup_page.RecentPageList.decorate(list);
      var selectionModel = new ListSingleSelectionModel;
      list.selectionModel = selectionModel;

      selectionModel.addEventListener('change',
                                      cr.bind(this.selectionChanged_, this));

      this.addEventListener('visibleChange', function(event) {
          $('addStartupPageURL').focus();
          $('addStartupRecentPageList').redraw();
      });
    },

    /**
     * Clears any uncommited input, and dismisses the overlay.
     * @private
     */
    dismissOverlay_: function() {
      $('addStartupPageURL').value = '';
      this.updateAddButtonState_();
      OptionsPage.clearOverlays();
    },

    /**
     * Sets the enabled state of the startup page Add button based on
     * the current value of the text field.
     * @private
     */
    updateAddButtonState_: function() {
      $('addStartupPageAddButton').disabled =
          $('addStartupPageURL').value == '';
    },

    /**
      * Updates the recent pages list list with the given entries.
      * @private
      * @param {Array} pages List of recent pages.
      */
    updateRecentPageList_: function(pages) {
      $('addStartupRecentPageList').dataModel = new ArrayDataModel(pages);
    },

    /**
     * Handles selection changes in the list so that we can populate the input
     * field.
     * @private
     * @param {!cr.Event} e Event with change info.
     */
    selectionChanged_: function(e) {
      var selectedIndex =
          $('addStartupRecentPageList').selectionModel.selectedIndex;
      if (selectedIndex != -1)
        chrome.send('updateAddStartupFieldWithPage', [String(selectedIndex)]);
    },

    /**
      * Sets the value of the input field to the given string.
      * @private
      * @param {string} url String value to set the input field to.
      */
    setInputFieldValue_: function(url) {
      $('addStartupPageURL').value = url;
      this.updateAddButtonState_();
    },
  };

  AddStartupPageOverlay.updateRecentPageList = function(pages) {
    AddStartupPageOverlay.getInstance().updateRecentPageList_(pages);
  };

  AddStartupPageOverlay.setInputFieldValue = function(url) {
    AddStartupPageOverlay.getInstance().setInputFieldValue_(url);
  };

  // Export
  return {
    AddStartupPageOverlay: AddStartupPageOverlay
  };

});
</script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

cr.define('options.add_startup_page', function() {
  const List = cr.ui.List;
  const ListItem = cr.ui.ListItem;

  /**
   * Creates a new recent page list item.
   * @param {Object} pageInfo The page this item represents.
   * @constructor
   * @extends {cr.ui.ListItem}
   */
  function RecentPageListItem(pageInfo) {
    var el = cr.doc.createElement('div');
    el.pageInfo = pageInfo;
    RecentPageListItem.decorate(el);
    return el;
  }

  /**
   * Decorates an element as a recent page list item.
   * @param {!HTMLElement} el The element to decorate.
   */
  RecentPageListItem.decorate = function(el) {
    el.__proto__ = RecentPageListItem.prototype;
    el.decorate();
  };

  RecentPageListItem.prototype = {
    __proto__: ListItem.prototype,

    /** @inheritDoc */
    decorate: function() {
      ListItem.prototype.decorate.call(this);

      var titleEl = this.ownerDocument.createElement('span');
      titleEl.className = 'title';
      titleEl.classList.add('favicon-cell');
      titleEl.textContent = this.pageInfo['title'];
      titleEl.style.backgroundImage = url('chrome://favicon/' +
                                         this.pageInfo['url']);

      var urlEL = this.ownerDocument.createElement('span');
      urlEL.className = 'url';
      urlEL.textContent = this.pageInfo['displayURL'];

      this.appendChild(titleEl);
      this.appendChild(urlEL);
    },
  };

  var RecentPageList = cr.ui.define('list');

  RecentPageList.prototype = {
    __proto__: List.prototype,

    /** @inheritDoc */
    createItem: function(pageInfo) {
      return new RecentPageListItem(pageInfo);
    },
  };

  return {
    RecentPageList: RecentPageList
  };
});
</script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

cr.define('options', function() {

var OptionsPage = options.OptionsPage;

  //
  // AdvancedOptions class
  // Encapsulated handling of advanced options page.
  //
  function AdvancedOptions() {
    OptionsPage.call(this, 'advanced', templateData.advancedPage,
                     'advancedPage');
  }

  cr.addSingletonGetter(AdvancedOptions);

  AdvancedOptions.prototype = {
    // Inherit AdvancedOptions from OptionsPage.
    __proto__: options.OptionsPage.prototype,

    // Initialize AdvancedOptions page.
    initializePage: function() {
      // Call base class implementation to starts preference initialization.
      OptionsPage.prototype.initializePage.call(this);

      // Setup click handlers for buttons.
      $('privacyContentSettingsButton').onclick = function(event) {
        OptionsPage.showPageByName('content');
        OptionsPage.showTab($('cookies-nav-tab'));
        chrome.send('coreOptionsUserMetricsAction',
            ['Options_ContentSettings']);
      };
      $('privacyClearDataButton').onclick = function(event) {
        OptionsPage.showOverlay('clearBrowserDataOverlay');
        chrome.send('coreOptionsUserMetricsAction', ['Options_ClearData']);
      };
      $('autoOpenFileTypesResetToDefault').onclick = function(event) {
        chrome.send('autoOpenFileTypesAction');
      };
      $('fontSettingsConfigureFontsOnlyButton').onclick = function(event) {
        OptionsPage.showOverlay('fontSettingsOverlay');
        chrome.send('coreOptionsUserMetricsAction', ['Options_FontSettings']);
      };
      if (!cr.isChromeOS) {
        $('optionsReset').onclick = function(event) {
          AlertOverlay.show(localStrings.getString('optionsResetMessage'),
              localStrings.getString('optionsResetOkLabel'),
              localStrings.getString('optionsResetCancelLabel'),
              function() { chrome.send('resetToDefaults'); });
        }
        $('proxiesConfigureButton').onclick = function(event) {
          chrome.send('showNetworkProxySettings');
        };
        $('certificatesManageButton').onclick = function(event) {
          chrome.send('showManageSSLCertificates');
        };
        $('downloadLocationBrowseButton').onclick = function(event) {
          chrome.send('selectDownloadLocation');
        };

        // Remove Windows-style accelerators from the Browse button label.
        // TODO(csilv): Remove this after the accelerator has been removed from
        // the localized strings file, pending removal of old options window.
        $('downloadLocationBrowseButton').textContent =
            localStrings.getStringWithoutAccelerator(
                'downloadLocationBrowseButton');
      } else {
        $('proxiesConfigureButton').onclick = function(event) {
          OptionsPage.showPageByName('proxy');
          chrome.send('coreOptionsUserMetricsAction',
              ['Options_ShowProxySettings']);
        };
      }

      if (cr.isWindows) {
        $('sslCheckRevocation').onclick = function(event) {
          chrome.send('checkRevocationCheckboxAction',
              [String($('sslCheckRevocation').checked)]);
        };
        $('sslUseSSL2').onclick = function(event) {
          chrome.send('useSSL2CheckboxAction',
              [String($('sslUseSSL2').checked)]);
        };
        $('gearSettingsConfigureGearsButton').onclick = function(event) {
          chrome.send('showGearsSettings');
        };
      }
    }
  };

  //
  // Chrome callbacks
  //

  // Set the download path.
  AdvancedOptions.SetDownloadLocationPath = function(path) {
    if (!cr.isChromeOS)
      $('downloadLocationPath').value = path;
  };

  // Set the enabled state for the autoOpenFileTypesResetToDefault button.
  AdvancedOptions.SetAutoOpenFileTypesDisabledAttribute = function(disabled) {
    $('autoOpenFileTypesResetToDefault').disabled = disabled;
  };

  // Set the enabled state for the proxy settings button.
  AdvancedOptions.SetupProxySettingsSection = function(disabled, label) {
    $('proxiesConfigureButton').disabled = disabled;
    $('proxiesLabel').textContent = label;
  };

  // Set the checked state for the sslCheckRevocation checkbox.
  AdvancedOptions.SetCheckRevocationCheckboxState = function(checked) {
    $('sslCheckRevocation').checked = checked;
  };

  // Set the checked state for the sslUseSSL2 checkbox.
  AdvancedOptions.SetUseSSL2CheckboxState = function(checked) {
    $('sslUseSSL2').checked = checked;
  };

  // Export
  return {
    AdvancedOptions: AdvancedOptions
  };

});
</script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

cr.define('options', function() {

  var OptionsPage = options.OptionsPage;

  /**
   * AlertOverlay class
   * Encapsulated handling of a generic alert.
   * @class
   */
  function AlertOverlay() {
    OptionsPage.call(this, 'alertOverlay', '', 'alertOverlay');
  }

  cr.addSingletonGetter(AlertOverlay);

  AlertOverlay.prototype = {
    // Inherit AlertOverlay from OptionsPage.
    __proto__: OptionsPage.prototype,

    /**
     * Initialize the page.
     */
    initializePage: function() {
      // Call base class implementation to start preference initialization.
      OptionsPage.prototype.initializePage.call(this);

      var self = this;
      $('alertOverlayOk').onclick = function(event) {
        self.handleOK_();
      };

      $('alertOverlayCancel').onclick = function(event) {
        self.handleCancel_();
      };
    },

    /**
     * Handle the 'ok' button.  Clear the overlay and call the ok callback if
     * available.
     * @private
     */
    handleOK_: function() {
      OptionsPage.clearOverlays();
      if (this.okCallback != undefined) {
        this.okCallback.call();
      }
    },

    /**
     * Handle the 'cancel' button.  Clear the overlay and call the cancel
     * callback if available.
     * @private
     */
    handleCancel_: function() {
      OptionsPage.clearOverlays();
      if (this.cancelCallback != undefined) {
        this.cancelCallback.call();
      }
    }
  };

  /**
   * Show an alert overlay with the given message, button titles, and
   * callbacks.
   * @param {string} message The message to dispaly to the user.
   * @param {string} okTitle The title of the OK button.  Can be undefined.
   * @param {string} cancelTitle The title of the cancel button.  Can be
   *     undefined.
   * @param {function} okCallback A function to be called when the user presses
   *     the ok button.  The alert window will be closed automatically.  Can be
   *     undefined.
   * @param {function} cancelCallback A function to be called when the user
   *     presses the cancel button.  The alert window will be closed
   *     automatically.  Can be undefined.
   */
  AlertOverlay.show = function(message, okTitle, cancelTitle, okCallback,
                               cancelCallback) {
    $('alertOverlayMessage').textContent = message;
    $('alertOverlayOk').textContent =
        (okTitle != undefined ? okTitle
                              : LocalStrings.getString('ok'));
    $('alertOverlayCancel').textContent =
        (cancelTitle != undefined ? cancelTitle
                                  : LocalStrings.getString('cancel'));

    AlertOverlay.getInstance().okCallback = okCallback;
    AlertOverlay.getInstance().cancelCallback = cancelCallback;

    OptionsPage.showOverlay('alertOverlay');
  }

  // Export
  return {
    AlertOverlay: AlertOverlay
  };

});
</script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

cr.define('options', function() {
  const OptionsPage = options.OptionsPage;

  // The unique ID of the loaded address.
  var uniqueID;

  /**
   * AutoFillEditAddressOverlay class
   * Encapsulated handling of the 'Add Page' overlay page.
   * @class
   */
  function AutoFillEditAddressOverlay() {
    OptionsPage.call(this, 'autoFillEditAddressOverlay',
                     templateData.autoFillEditAddressTitle,
                     'autoFillEditAddressOverlay');
  }

  cr.addSingletonGetter(AutoFillEditAddressOverlay);

  AutoFillEditAddressOverlay.prototype = {
    __proto__: OptionsPage.prototype,

    /**
     * Initializes the page.
     */
    initializePage: function() {
      OptionsPage.prototype.initializePage.call(this);

      var self = this;
      $('autoFillEditAddressCancelButton').onclick = function(event) {
        self.dismissOverlay_();
      }
      $('autoFillEditAddressApplyButton').onclick = function(event) {
        self.saveAddress_();
        self.dismissOverlay_();
      }

      self.clearInputFields_();
      self.connectInputEvents_();
    },

    /**
     * Clears any uncommited input, resets the stored unique ID and dismisses
     * the overlay.
     * @private
     */
    dismissOverlay_: function() {
      this.clearInputFields_();
      this.uniqueID = 0;
      OptionsPage.clearOverlays();
    },

    /**
     * Aggregates the values in the input fields into an associate array and
     * sends the array to the AutoFill handler.
     * @private
     */
    saveAddress_: function() {
      var address = new Array();
      address[0] = String(this.uniqueID);
      address[1] = $('fullName').value;
      address[2] = $('companyName').value;
      address[3] = $('addrLine1').value;
      address[4] = $('addrLine2').value;
      address[5] = $('city').value;
      address[6] = $('state').value;
      address[7] = $('zipCode').value;
      address[8] = $('country').value;
      address[9] = $('phone').value;
      address[10] = $('fax').value;
      address[11] = $('email').value;

      chrome.send('updateAddress', address);
    },

    /**
     * Connects each input field to the inputFieldChanged_() method that enables
     * or disables the 'Ok' button based on whether all the fields are empty or
     * not.
     * @private
     */
    connectInputEvents_: function() {
      var self = this;
      $('fullName').oninput = $('companyName').oninput =
      $('addrLine1').oninput = $('addrLine2').oninput = $('city').oninput =
      $('state').oninput = $('country').oninput = $('zipCode').oninput =
      $('phone').oninput = $('fax').oninput =
      $('email').oninput = function(event) {
        self.inputFieldChanged_();
      }
    },

    /**
     * Checks the values of each of the input fields and disables the 'Ok'
     * button if all of the fields are empty.
     * @private
     */
    inputFieldChanged_: function() {
      var disabled =
          !$('fullName').value && !$('companyName').value &&
          !$('addrLine1').value && !$('addrLine2').value && !$('city').value &&
          !$('state').value && !$('zipCode').value && !('country').value &&
          !$('phone').value && !$('fax').value && !$('email').value;
      $('autoFillEditAddressApplyButton').disabled = disabled;
    },

    /**
     * Clears the value of each input field.
     * @private
     */
    clearInputFields_: function() {
      $('fullName').value = '';
      $('companyName').value = '';
      $('addrLine1').value = '';
      $('addrLine2').value = '';
      $('city').value = '';
      $('state').value = '';
      $('zipCode').value = '';
      $('country').value = '';
      $('phone').value = '';
      $('fax').value = '';
      $('email').value = '';
    },

    /**
     * Loads the address data from |address|, sets the input fields based on
     * this data and stores the unique ID of the address.
     * @private
     */
    loadAddress_: function(address) {
      this.setInputFields_(address);
      this.uniqueID = address['uniqueID'];
    },

    /**
     * Sets the value of each input field according to |address|
     * @private
     */
    setInputFields_: function(address) {
      $('fullName').value = address['fullName'];
      $('companyName').value = address['companyName'];
      $('addrLine1').value = address['addrLine1'];
      $('addrLine2').value = address['addrLine2'];
      $('city').value = address['city'];
      $('state').value = address['state'];
      $('zipCode').value = address['zipCode'];
      $('country').value = address['country'];
      $('phone').value = address['phone'];
      $('fax').value = address['fax'];
      $('email').value = address['email'];
    },
  };

  AutoFillEditAddressOverlay.clearInputFields = function() {
    AutoFillEditAddressOverlay.getInstance().clearInputFields_();
  };

  AutoFillEditAddressOverlay.loadAddress = function(address) {
    AutoFillEditAddressOverlay.getInstance().loadAddress_(address);
  };

  AutoFillEditAddressOverlay.setTitle = function(title) {
    $('autoFillAddressTitle').textContent = title;
  };

  // Export
  return {
    AutoFillEditAddressOverlay: AutoFillEditAddressOverlay
  };

});
</script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

cr.define('options', function() {
  const OptionsPage = options.OptionsPage;

  /**
   * AutoFillEditCreditCardOverlay class
   * Encapsulated handling of the 'Add Page' overlay page.
   * @class
   */
  function AutoFillEditCreditCardOverlay() {
    OptionsPage.call(this, 'autoFillEditCreditCardOverlay',
                     templateData.autoFillEditCreditCardTitle,
                     'autoFillEditCreditCardOverlay');
  }

  cr.addSingletonGetter(AutoFillEditCreditCardOverlay);

  AutoFillEditCreditCardOverlay.prototype = {
    __proto__: OptionsPage.prototype,

    /**
     * Initializes the page.
     */
    initializePage: function() {
      OptionsPage.prototype.initializePage.call(this);

      var self = this;
      $('autoFillEditCreditCardCancelButton').onclick = function(event) {
        self.dismissOverlay_();
      }

      self.clearInputFields_();
      self.connectInputEvents_();
      self.setDefaultSelectOptions_();
    },

    /**
     * Clears any uncommited input, and dismisses the overlay.
     * @private
     */
    dismissOverlay_: function() {
      this.clearInputFields_();
      OptionsPage.clearOverlays();
    },

    /**
     * Connects each input field to the inputFieldChanged_() method that enables
     * or disables the 'Ok' button based on whether all the fields are empty or
     * not.
     * @private
     */
    connectInputEvents_: function() {
      var self = this;
      $('nameOnCard').oninput = $('billingAddress').oninput =
      $('creditCardNumber').oninput = $('expirationMonth').oninput =
      $('expirationYear').oninput = function(event) {
        self.inputFieldChanged_();
      }
    },

    /**
     * Checks the values of each of the input fields and disables the 'Ok'
     * button if all of the fields are empty.
     * @private
     */
    inputFieldChanged_: function() {
      var disabled =
          !$('nameOnCard').value && !$('billingAddress').value &&
          !$('creditCardNumber').value && !$('expirationMonth').value &&
          !$('expirationYear').value;
      $('autoFillEditCreditCardApplyButton').disabled = disabled;
    },

    /**
     * Sets the default values of the options in the 'Billing address' and
     * 'Expiration date' select controls.
     * @private
     */
    setDefaultSelectOptions_: function() {
      // Set the 'Billing address' default option.
      var existingAddress = document.createElement('option');
      existingAddress.text = localStrings.getString('chooseExistingAddress');
      existingAddress.value = 'existingAddress';

      var billingAddress = $('billingAddress');
      billingAddress.add(existingAddress, null);

      // Set the 'Expiration month' default options.
      var expirationMonth = $('expirationMonth');
      for (var i = 1; i <= 12; ++i) {
        var text;
        if (i < 10)
          text = '0' + i;
        else
          text = i;

        var option = document.createElement('option');
        option.text = text;
        option.value = text;
        expirationMonth.add(option, null);
      }

      // Set the 'Expiration year' default options.
      var expirationYear = $('expirationYear');
      var date = new Date();
      var year = date.getFullYear();
      for (var i = 0; i < 10; ++i) {
        var text = parseInt(year) + i;
        var option = document.createElement('option');
        option.text = text;
        option.value = text;
        expirationYear.add(option, null);
      }
    },

    /**
     * Clears the value of each input field.
     * @private
     */
    clearInputFields_: function() {
      $('nameOnCard').value = '';
      $('billingAddress').value = '';
      $('creditCardNumber').value = '';
      $('expirationMonth').value = '';
      $('expirationYear').value = '';
    },
  };

  AutoFillEditCreditCardOverlay.clearInputFields = function(title) {
    AutoFillEditCreditCardOverlay.getInstance().clearInputFields_();
  };

  AutoFillEditCreditCardOverlay.setTitle = function(title) {
    $('autoFillCreditCardTitle').textContent = title;
  };

  // Export
  return {
    AutoFillEditCreditCardOverlay: AutoFillEditCreditCardOverlay
  };

});
</script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

cr.define('options', function() {
  var OptionsPage = options.OptionsPage;

  // The offset of the first profile in either the address list or the credit
  // card list. Consists of the header and the horizontal rule.
  const addressOffset = 2;
  const creditCardOffset = 3;

  /////////////////////////////////////////////////////////////////////////////
  // AutoFillOptions class:
  //
  // TODO(jhawkins): Replace <select> with a DOMUI List.

  /**
   * Encapsulated handling of AutoFill options page.
   * @constructor
   */
  function AutoFillOptions() {
    this.numAddresses = 0;
    this.numCreditCards = 0;
    this.activeNavTab = null;
    this.addressIDs = null;
    this.creditCardIDs = null;
    OptionsPage.call(this, 'autoFillOptions',
                     templateData.autoFillOptionsTitle,
                     'autoFillOptionsPage');
  }

  cr.addSingletonGetter(AutoFillOptions);

  AutoFillOptions.prototype = {
    __proto__: OptionsPage.prototype,

    initializePage: function() {
      OptionsPage.prototype.initializePage.call(this);

      var self = this;
      $('profileList').onchange = function(event) {
        self.updateButtonState_();
      };
      $('addAddressButton').onclick = function(event) {
        self.showAddAddressOverlay_();
      };
      $('addCreditCardButton').onclick = function(event) {
        self.showAddCreditCardOverlay_();
      };
      $('autoFillEditButton').onclick = function(event) {
        self.editProfile_();
      };
      $('autoFillRemoveButton').onclick = function(event) {
        self.removeProfile_();
      };

      Preferences.getInstance().addEventListener('autofill.enabled',
          cr.bind(self.updateEnabledState_, self));
    },

    /**
     * Sets the enabled state of the button controls based on the current state
     * of the |autoFillEnabled| checkbox.
     * @private
     */
    updateEnabledState_: function() {
      var disabled = !$('autoFillEnabled').checked;
      $('addAddressButton').disabled = disabled;
      $('addCreditCardButton').disabled = disabled;
      $('autoFillEditButton').disabled = disabled;
      $('autoFillRemoveButton').disabled = disabled;
    },

    /**
     * Shows the 'Add address' overlay, specifically by loading the
     * 'Edit address' overlay, emptying the input fields and modifying the
     * overlay title.
     * @private
     */
    showAddAddressOverlay_: function() {
      var title = localStrings.getString('addAddressTitle');
      AutoFillEditAddressOverlay.setTitle(title);
      AutoFillEditAddressOverlay.clearInputFields();
      OptionsPage.showOverlay('autoFillEditAddressOverlay');
    },

    /**
     * Shows the 'Edit address' overlay, using the data in |address| to fill the
     * input fields. |address| is a list with one item, an associative array
     * that contains the address data.
     * @private
     */
    showEditAddressOverlay_: function(address) {
      AutoFillEditAddressOverlay.loadAddress(address[0]);
      OptionsPage.showOverlay('autoFillEditAddressOverlay');
    },

    /**
     * Shows the 'Add credit card' overlay, specifically by loading the
     * 'Edit credit card' overlay, emptying the input fields and modifying the
     * overlay title.
     * @private
     */
    showAddCreditCardOverlay_: function() {
      var title = localStrings.getString('addCreditCardTitle');
      AutoFillEditCreditCardOverlay.setTitle(title);
      AutoFillEditCreditCardOverlay.clearInputFields();
      OptionsPage.showOverlay('autoFillEditCreditCardOverlay');
    },

    /**
     * Resets the address list. This method leaves the header and horizontal
     * rule unchanged.
     * @private
     */
    resetAddresses_: function() {
      var profiles = $('profileList');
      for (var i = 0; i <  this.numAddresses; ++i)
        profiles.remove(addressOffset);
      this.numAddresses = 0;
    },

    /**
     * Resets the credit card list. This method leaves the header and horizontal
     * rule unchanged.
     * @private
     */
    resetCreditCards_: function() {
      var profiles = $('profileList');
      var offset = this.numAddresses + addressOffset + creditCardOffset;
      for (var i = 0; i <  this.numCreditCards; ++i)
        profiles.remove(offset);
      this.numCreditCards = 0;
    },

    /**
     * Updates the address list with the given entries.
     * @private
     * @param {Array} address List of addresses.
     */
    updateAddresses_: function(addresses) {
      this.resetAddresses_();
      var profileList = $('profileList');
      var blankAddress = profileList.options[addressOffset];
      this.numAddresses = addresses.length;
      this.addressIDs = new Array(this.numAddresses);
      for (var i = 0; i < this.numAddresses; i++) {
        var address = addresses[i];
        var option = new Option(address['label']);
        this.addressIDs[i] = address['unique_id'];
        profileList.add(option, blankAddress);
      }

      this.updateButtonState_();
    },

    /**
     * Updates the credit card list with the given entries.
     * @private
     * @param {Array} creditCards List of credit cards.
     */
    updateCreditCards_: function(creditCards) {
      this.resetCreditCards_();
      var profileList = $('profileList');
      this.numCreditCards = creditCards.length;
      this.creditCardIDs = new Array(this.numCreditCards);
      for (var i = 0; i < this.numCreditCards; i++) {
        var creditCard = creditCards[i];
        var option = new Option(creditCard['label']);
        this.creditCardIDs[i] = creditCard['unique_id'];
        profileList.add(option, null);
      }

      this.updateButtonState_();
    },

    /**
     * Sets the enabled state of the AutoFill Edit and Remove buttons based on
     * the current selection in the profile list.
     * @private
     */
    updateButtonState_: function() {
      $('autoFillRemoveButton').disabled = $('autoFillEditButton').disabled =
          ($('profileList').selectedIndex == -1);
    },

    /**
     * Calls into the browser to load either an address or a credit card,
     * depending on the selected index.  The browser calls back into either
     * editAddress() or editCreditCard() which show their respective editors.
     * @private
     */
    editProfile_: function() {
      var idx = $('profileList').selectedIndex;
      if ((profileIndex = this.getAddressIndex_(idx)) != -1) {
        chrome.send('editAddress', [String(this.addressIDs[profileIndex])]);
      } else if ((profileIndex = this.getCreditCardIndex_(idx)) != -1) {
        // TODO(jhawkins): Implement editCreditCard command.
      }
    },

    /**
     * Removes the currently selected profile, whether it's an address or a
     * credit card.
     * @private
     */
    removeProfile_: function() {
      var idx = $('profileList').selectedIndex;
      if ((profileIndex = this.getAddressIndex_(idx)) != -1)
        chrome.send('removeAddress', [String(this.addressIDs[profileIndex])]);
      else if ((profileIndex = this.getCreditCardIndex_(idx)) != -1)
        chrome.send('removeCreditCard',
                    [String(this.creditCardIDs[profileIndex])]);
    },

    /**
     * Returns the index into the address list based on |index|, the index into
     * the select control. Returns -1 if this is not an address index.
     * @private
     */
    getAddressIndex_: function(index) {
      index -= addressOffset;
      if (index >= 0 && index < this.numAddresses)
        return index;

      return -1;
    },

    /**
     * Returns the index into the credit card list based on |index|, the index
     * into the select control. Returns -1 if this is not a credit card index.
     * @private
     */
    getCreditCardIndex_: function(index) {
      index -= addressOffset + this.numAddresses + creditCardOffset;
      if (index >= 0 && index < this.numCreditCards)
        return index;

      return -1;
    },

    /**
     * Returns true if |index| points to a credit card profile.
     * @private
     */
    profileIndexIsCreditCard_: function(index) {
      index -= addressOffset + this.numAddresses + creditCardOffset;
      return (index >= 0 && index < this.numCreditCards);
    }
  };

  AutoFillOptions.updateAddresses = function(addresses) {
    AutoFillOptions.getInstance().updateAddresses_(addresses);
  };

  AutoFillOptions.updateCreditCards = function(creditCards) {
    AutoFillOptions.getInstance().updateCreditCards_(creditCards);
  };

  AutoFillOptions.editAddress = function(address) {
    AutoFillOptions.getInstance().showEditAddressOverlay_(address);
  };

  // Export
  return {
    AutoFillOptions: AutoFillOptions
  };

});

</script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

cr.define('options', function() {
  const OptionsPage = options.OptionsPage;
  const ArrayDataModel = cr.ui.ArrayDataModel;
  const ListSelectionModel = cr.ui.ListSelectionModel;

  //
  // BrowserOptions class
  // Encapsulated handling of browser options page.
  //
  function BrowserOptions() {
    OptionsPage.call(this, 'browser', templateData.browserPage, 'browserPage');
  }

  cr.addSingletonGetter(BrowserOptions);

  BrowserOptions.prototype = {
    // Inherit BrowserOptions from OptionsPage.
    __proto__: options.OptionsPage.prototype,

    /**
     * Initialize BrowserOptions page.
     */
    initializePage: function() {
      // Call base class implementation to start preference initialization.
      OptionsPage.prototype.initializePage.call(this);

      // Wire up controls.
      $('startupAddButton').onclick = function(event) {
        OptionsPage.showOverlay('addStartupPageOverlay');
      };
      $('startupRemoveButton').onclick = cr.bind(
          this.removeSelectedStartupPages_, this);
      $('startupUseCurrentButton').onclick = function(event) {
        chrome.send('setStartupPagesToCurrentPages');
      };
      $('defaultSearchManageEnginesButton').onclick = function(event) {
        OptionsPage.showPageByName('searchEngines');
        chrome.send('coreOptionsUserMetricsAction',
            ['Options_ManageSearchEngines']);
      };
      if (!cr.isChromeOS) {
        $('defaultBrowserUseAsDefaultButton').onclick = function(event) {
          chrome.send('becomeDefaultBrowser');
        };
      }

      var list = $('startupPages');
      options.browser_options.StartupPageList.decorate(list);
      list.selectionModel = new ListSelectionModel;

      list.selectionModel.addEventListener(
          'change', cr.bind(this.updateRemoveButtonState_, this));

      this.addEventListener('visibleChange', function(event) {
        $('startupPages').redraw();
      });

      // Initialize control enabled states.
      Preferences.getInstance().addEventListener('session.restore_on_startup',
          cr.bind(this.updateCustomStartupPageControlStates_, this));
      Preferences.getInstance().addEventListener('homepage_is_newtabpage',
          cr.bind(this.updateHomepageFieldState_, this));
      this.updateCustomStartupPageControlStates_();
      this.updateHomepageFieldState_();

      // Remove Windows-style accelerators from button labels.
      // TODO(stuartmorgan): Remove this once the strings are updated.
      $('startupAddButton').textContent =
          localStrings.getStringWithoutAccelerator('startupAddButton');
      $('startupRemoveButton').textContent =
          localStrings.getStringWithoutAccelerator('startupRemoveButton');
    },

    /**
     * Update the Default Browsers section based on the current state.
     * @private
     * @param {string} statusString Description of the current default state.
     * @param {boolean} isDefault Whether or not the browser is currently
     *     default.
     */
    updateDefaultBrowserState_: function(statusString, isDefault) {
      var label = $('defaultBrowserState');
      label.textContent = statusString;
      if (isDefault) {
        label.classList.add('current');
      } else {
        label.classList.remove('current');
      }

      $('defaultBrowserUseAsDefaultButton').disabled = isDefault;
    },

    /**
     * Clears the search engine popup.
     * @private
     */
    clearSearchEngines_: function() {
      $('defaultSearchEngine').textContent = '';
    },

    /**
     * Updates the search engine popup with the given entries.
     * @param {Array} engines List of available search engines.
     * @param {Integer} defaultValue The value of the current default engine.
     */
    updateSearchEngines_: function(engines, defaultValue) {
      this.clearSearchEngines_();
      engineSelect = $('defaultSearchEngine');
      engineCount = engines.length;
      var defaultIndex = -1;
      for (var i = 0; i < engineCount; i++) {
        var engine = engines[i];
        var option = new Option(engine['name'], engine['index']);
        if (defaultValue == option.value)
          defaultIndex = i;
        engineSelect.appendChild(option);
      }
      if (defaultIndex >= 0)
        engineSelect.selectedIndex = defaultIndex;
    },

    /**
     * Returns true if the custom startup page control block should
     * be enabled.
     * @private
     * @returns {boolean} Whether the startup page controls should be
     *     enabled.
     */
    shouldEnableCustomStartupPageControls_: function(pages) {
      return $('startupShowPagesButton').checked;
    },

    /**
     * Updates the startup pages list with the given entries.
     * @private
     * @param {Array} pages List of startup pages.
     */
    updateStartupPages_: function(pages) {
      $('startupPages').dataModel = new ArrayDataModel(pages);
      this.updateRemoveButtonState_();
    },

    /**
     * Sets the enabled state of the custom startup page list controls
     * based on the current startup radio button selection.
     * @private
     */
    updateCustomStartupPageControlStates_: function() {
      var disable = !this.shouldEnableCustomStartupPageControls_();
      $('startupAddButton').disabled = disable;
      $('startupUseCurrentButton').disabled = disable;
      this.updateRemoveButtonState_();
    },

    /**
     * Sets the enabled state of the startup page Remove button based on
     * the current selection in the startup pages list.
     * @private
     */
    updateRemoveButtonState_: function() {
      var groupEnabled = this.shouldEnableCustomStartupPageControls_();
      $('startupRemoveButton').disabled = !groupEnabled ||
          ($('startupPages').selectionModel.selectedIndex == -1);
    },

    /**
     * Removes the selected startup pages.
     * @private
     */
    removeSelectedStartupPages_: function() {
      var selections =
          $('startupPages').selectionModel.selectedIndexes.map(String);
      chrome.send('removeStartupPages', selections);
    },

    /**
     * Adds the given startup page at the current selection point.
     * @private
     */
    addStartupPage_: function(url) {
      var firstSelection = $('startupPages').selectionModel.selectedIndex;
      chrome.send('addStartupPage', [url, String(firstSelection)]);
    },

    /**
     * Sets the enabled state of the homepage field based on the current
     * homepage radio button selection.
     * @private
     */
    updateHomepageFieldState_: function() {
      $('homepageURL').disabled = !$('homepageUseURLButton').checked;
    },

    /**
     * Set the default search engine based on the popup selection.
     */
    setDefaultSearchEngine: function() {
      var engineSelect = $('defaultSearchEngine');
      var selectedIndex = engineSelect.selectedIndex;
      if (selectedIndex >= 0) {
        var selection = engineSelect.options[selectedIndex];
        chrome.send('setDefaultSearchEngine', [String(selection.value)]);
      }
    },
  };

  BrowserOptions.updateDefaultBrowserState = function(statusString, isDefault) {
    if (!cr.isChromeOS) {
      BrowserOptions.getInstance().updateDefaultBrowserState_(statusString,
                                                              isDefault);
    }
  };

  BrowserOptions.updateSearchEngines = function(engines, defaultValue) {
    BrowserOptions.getInstance().updateSearchEngines_(engines, defaultValue);
  };

  BrowserOptions.updateStartupPages = function(pages) {
    BrowserOptions.getInstance().updateStartupPages_(pages);
  };

  BrowserOptions.addStartupPage = function(url) {
    BrowserOptions.getInstance().addStartupPage_(url);
  };

  // Export
  return {
    BrowserOptions: BrowserOptions
  };

});

</script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

cr.define('options.browser_options', function() {
  const List = cr.ui.List;
  const ListItem = cr.ui.ListItem;

  /**
   * Creates a new startup page list item.
   * @param {Object} pageInfo The page this item represents.
   * @constructor
   * @extends {cr.ui.ListItem}
   */
  function StartupPageListItem(pageInfo) {
    var el = cr.doc.createElement('div');
    el.pageInfo_ = pageInfo;
    StartupPageListItem.decorate(el);
    return el;
  }

  /**
   * Decorates an element as a startup page list item.
   * @param {!HTMLElement} el The element to decorate.
   */
  StartupPageListItem.decorate = function(el) {
    el.__proto__ = StartupPageListItem.prototype;
    el.decorate();
  };

  StartupPageListItem.prototype = {
    __proto__: ListItem.prototype,

    /** @inheritDoc */
    decorate: function() {
      ListItem.prototype.decorate.call(this);

      var titleEl = this.ownerDocument.createElement('span');
      titleEl.className = 'title';
      titleEl.classList.add('favicon-cell');
      titleEl.textContent = this.pageInfo_['title'];
      titleEl.style.backgroundImage = url('chrome://favicon/' +
                                          this.pageInfo_['url']);
      titleEl.title = this.pageInfo_['tooltip'];

      this.appendChild(titleEl);
    },
  };

  var StartupPageList = cr.ui.define('list');

  StartupPageList.prototype = {
    __proto__: List.prototype,

    /** @inheritDoc */
    createItem: function(pageInfo) {
      return new StartupPageListItem(pageInfo);
    },
  };

  return {
    StartupPageList: StartupPageList
  };
});
</script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

cr.define('options', function() {

  var OptionsPage = options.OptionsPage;

  /**
   * ClearBrowserData class
   * Encapsulated handling of the 'Clear Browser Data' overlay page.
   * @class
   */
  function ClearBrowserDataOverlay() {
    OptionsPage.call(this, 'clearBrowserDataOverlay',
                     templateData.clearBrowserDataTitle,
                     'clearBrowserDataOverlay');
  }

  ClearBrowserDataOverlay.throbIntervalId = 0;

  cr.addSingletonGetter(ClearBrowserDataOverlay);

  ClearBrowserDataOverlay.prototype = {
    // Inherit ClearBrowserDataOverlay from OptionsPage.
    __proto__: OptionsPage.prototype,

    /**
     * Initialize the page.
     */
    initializePage: function() {
      // Call base class implementation to starts preference initialization.
      OptionsPage.prototype.initializePage.call(this);

      // Setup option values for the time period select control.
      $('clearBrowsingDataTimePeriod').initializeValues(
          templateData.clearBrowsingDataTimeList);

      var f = cr.bind(this.updateButtonState_, this);
      var types = ['browser.clear_data.browsing_history',
                   'browser.clear_data.download_history',
                   'browser.clear_data.cache',
                   'browser.clear_data.cookies',
                   'browser.clear_data.passwords',
                   'browser.clear_data.form_data'];
      types.forEach(function(type) {
          Preferences.getInstance().addEventListener(type, f);
      });

      var checkboxes = document.querySelectorAll(
          '#checkboxListData input[type=checkbox]');
      for (var i = 0; i < checkboxes.length; i++) {
        checkboxes[i].onclick = f;
      }
      this.updateButtonState_();

      // Setup click handler for the clear(Ok) button.
      $('clearBrowsingDataCommit').onclick = function(event) {
        chrome.send('performClearBrowserData');
      };
    },

    updateButtonState_: function() {
      var checkboxes = document.querySelectorAll(
          '#checkboxListData input[type=checkbox]');
      var isChecked = false;
      for (var i = 0; i < checkboxes.length; i++) {
        if (checkboxes[i].checked) {
          isChecked = true;
          break;
        }
      }
      $('clearBrowsingDataCommit').disabled = !isChecked;
    },
  };

  //
  // Chrome callbacks
  //
  ClearBrowserDataOverlay.setClearingState = function(state) {
    $('deleteBrowsingHistoryCheckbox').disabled = state;
    $('deleteDownloadHistoryCheckbox').disabled = state;
    $('deleteCacheCheckbox').disabled = state;
    $('deleteCookiesCheckbox').disabled = state;
    $('deletePasswordsCheckbox').disabled = state;
    $('deleteFormDataCheckbox').disabled = state;
    $('clearBrowsingDataTimePeriod').disabled = state;
    $('clearBrowsingDataCommit').disabled = state;
    $('clearBrowsingDataDismiss').disabled = state;
    $('cbdThrobber').style.visibility = state ? 'visible' : 'hidden';

    function advanceThrobber() {
      var throbber = $('cbdThrobber');
      // TODO(csilv): make this smoother using time-based animation?
      throbber.style.backgroundPositionX =
          ((parseInt(getComputedStyle(throbber).backgroundPositionX, 10) - 16) %
          576) + 'px';
    }
    if (state) {
      ClearBrowserDataOverlay.throbIntervalId =
          setInterval(advanceThrobber, 30);
    } else {
      clearInterval(ClearBrowserDataOverlay.throbIntervalId);
    }
  }

  ClearBrowserDataOverlay.dismiss = function() {
    OptionsPage.clearOverlays();
    this.setClearingState(false);
  }

  // Export
  return {
    ClearBrowserDataOverlay: ClearBrowserDataOverlay
  };

});

</script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

cr.define('options', function() {

  var OptionsPage = options.OptionsPage;

  //////////////////////////////////////////////////////////////////////////////
  // ContentSettings class:

  /**
   * Encapsulated handling of content settings page.
   * @constructor
   */
  function ContentSettings() {
    this.activeNavTab = null;
    OptionsPage.call(this, 'content', templateData.contentSettingsPage,
                     'contentSettingsPage');
  }

  cr.addSingletonGetter(ContentSettings);

  ContentSettings.prototype = {
    __proto__: OptionsPage.prototype,

    initializePage: function() {
      OptionsPage.prototype.initializePage.call(this);

      chrome.send('getContentFilterSettings');

      // Exceptions lists. -----------------------------------------------------
      function handleExceptionsLinkClickEvent(event) {
        var exceptionsArea = event.target.parentNode.
            querySelector('div[contentType]');
        exceptionsArea.classList.toggle('hidden');
        exceptionsArea.querySelector('list').redraw();
        return false;
      }
      var exceptionsLinks =
          this.pageDiv.querySelectorAll('.exceptionsLink');
      for (var i = 0; i < exceptionsLinks.length; i++) {
        exceptionsLinks[i].onclick = handleExceptionsLinkClickEvent;
      }

      var exceptionsAreas = this.pageDiv.querySelectorAll('div[contentType]');
      for (var i = 0; i < exceptionsAreas.length; i++) {
        options.contentSettings.ExceptionsArea.decorate(exceptionsAreas[i]);
      }

      // Cookies filter page ---------------------------------------------------
      $('block-third-party-cookies').onclick = function(event) {
        chrome.send('setAllowThirdPartyCookies',
                    [String($('block-third-party-cookies').checked)]);
      };

      $('show-cookies-button').onclick = function(event) {
        chrome.send('coreOptionsUserMetricsAction', ['Options_ShowCookies']);
        OptionsPage.showPageByName('cookiesView');
      };
    },
  };

  /**
   * Sets the initial values for all the content settings radios.
   * @param {Object} dict A mapping from radio groups to the checked value for
   *     that group.
   */
  ContentSettings.setInitialContentFilterSettingsValue = function(dict) {
    for (var group in dict) {
      document.querySelector('input[type=radio][name=' + group +
                             '][value=' + dict[group] + ']').checked = true;
    }
  };

  /**
   * Called to set whether we show certain UI related to the cookies prompt.
   * @param {boolean} enabled The value --enable-cookies-prompt.
   *     that group.
   */
  ContentSettings.setCookiesPromptEnabled = function(enabled) {
    cookiesExceptionsList.enableAskOption = enabled;

    if (!enabled)
      $('cookiesAskRadio').classList.add('hidden');
  }

  /**
   * Initializes an exceptions list.
   * @param {string} type The content type that we are setting exceptions for.
   * @param {Array} list An array of pairs, where the first element of each pair
   *     is the filter string, and the second is the setting (allow/block).
   */
  ContentSettings.setExceptions = function(type, list) {
    var exceptionsList =
        document.querySelector('div[contentType=' + type + '] list');
    exceptionsList.clear();
    for (var i = 0; i < list.length; i++) {
      exceptionsList.addException(list[i]);
    }
  };

  /**
   * Sets the initial value for the Third Party Cookies checkbox.
   * @param {boolean=} block True if we are blocking third party cookies.
   */
  ContentSettings.setBlockThirdPartyCookies = function(block) {
    $('block-third-party-cookies').checked = block;
  };

  /**
   * The browser's response to a request to check the validity of a given URL
   * pattern.
   * @param {string} pattern The pattern.
   * @param {bool} valid Whether said pattern is valid in the context of
   *     a content exception setting.
   */
  ContentSettings.patternValidityCheckComplete =
      function(type, pattern, valid) {
    var exceptionsList =
        document.querySelector('div[contentType=' + type + '] list');
    exceptionsList.patternValidityCheckComplete(pattern, valid);
  };

  // Export
  return {
    ContentSettings: ContentSettings
  };

});

</script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

cr.define('options.contentSettings', function() {
  const List = cr.ui.List;
  const ListItem = cr.ui.ListItem;
  const ArrayDataModel = cr.ui.ArrayDataModel;

  /**
   * Creates a new exceptions list item.
   * @param {string} contentType The type of the list.
   * @param {boolean} enableAskOption Whether to show an 'ask every time'
   *     option in the select.
   * @param {Array} exception A pair of the form [filter, setting].
   * @constructor
   * @extends {cr.ui.ListItem}
   */
  function ExceptionsListItem(contentType, enableAskOption, exception) {
    var el = cr.doc.createElement('li');
    el.contentType = contentType;
    el.enableAskOption = enableAskOption;
    el.dataItem = exception;
    el.__proto__ = ExceptionsListItem.prototype;
    el.decorate();

    return el;
  }

  ExceptionsListItem.prototype = {
    __proto__: ListItem.prototype,

    /**
     * Called when an element is decorated as a list item.
     */
    decorate: function() {
      ListItem.prototype.decorate.call(this);

      // Labels for display mode.
      var patternLabel = cr.doc.createElement('span');
      patternLabel.textContent = this.pattern;
      this.appendChild(patternLabel);

      var settingLabel = cr.doc.createElement('span');
      settingLabel.textContent = this.settingForDisplay();
      settingLabel.className = 'exceptionSetting';
      this.appendChild(settingLabel);

      // Elements for edit mode.
      var input = cr.doc.createElement('input');
      input.type = 'text';
      this.appendChild(input);
      input.className = 'exceptionInput hidden';

      var select = cr.doc.createElement('select');
      var optionAllow = cr.doc.createElement('option');
      optionAllow.textContent = templateData.allowException;
      select.appendChild(optionAllow);

      if (this.enableAskOption) {
        var optionAsk = cr.doc.createElement('option');
        optionAsk.textContent = templateData.askException;
        select.appendChild(optionAsk);
        this.optionAsk = optionAsk;
      }

      if (this.contentType == 'cookies') {
        var optionSession = cr.doc.createElement('option');
        optionSession.textContent = templateData.sessionException;
        select.appendChild(optionSession);
        this.optionSession = optionSession;
      }

      var optionBlock = cr.doc.createElement('option');
      optionBlock.textContent = templateData.blockException;
      select.appendChild(optionBlock);

      this.appendChild(select);
      select.className = 'exceptionSetting hidden';

      // Used to track whether the URL pattern in the input is valid.
      // This will be true if the browser process has informed us that the
      // current text in the input is valid. Changing the text resets this to
      // false, and getting a response from the browser sets it back to true.
      // It starts off as false for empty string (new exceptions) or true for
      // already-existing exceptions (which we assume are valid).
      this.inputValidityKnown = this.pattern;
      // This one tracks the actual validity of the pattern in the input. This
      // starts off as true so as not to annoy the user when he adds a new and
      // empty input.
      this.inputIsValid = true;

      this.patternLabel = patternLabel;
      this.settingLabel = settingLabel;
      this.input = input;
      this.select = select;
      this.optionAllow = optionAllow;
      this.optionBlock = optionBlock;

      this.updateEditables();

      var listItem = this;
      this.ondblclick = function(event) {
        listItem.editing = true;
      };

      // Handle events on the editable nodes.
      input.oninput = function(event) {
        listItem.inputValidityKnown = false;
        chrome.send('checkExceptionPatternValidity',
                    [listItem.contentType, input.value]);
      };

      // Handles enter and escape which trigger reset and commit respectively.
      function handleKeydown(e) {
        // Make sure that the tree does not handle the key.
        e.stopPropagation();

        // Calling list.focus blurs the input which will stop editing the list
        // item.
        switch (e.keyIdentifier) {
          case 'U+001B':  // Esc
            // Reset the inputs.
            listItem.updateEditables();
            if (listItem.pattern)
              listItem.maybeSetPatternValidity(listItem.pattern, true);
          case 'Enter':
            if (listItem.parentNode)
              listItem.parentNode.focus();
        }
      }

      function handleBlur(e) {
        // When the blur event happens we do not know who is getting focus so we
        // delay this a bit since we want to know if the other input got focus
        // before deciding if we should exit edit mode.
        var doc = e.target.ownerDocument;
        window.setTimeout(function() {
          var activeElement = doc.activeElement;
          if (!listItem.contains(activeElement)) {
            listItem.editing = false;
          }
        }, 50);
      }

      input.addEventListener('keydown', handleKeydown);
      input.addEventListener('blur', handleBlur);

      select.addEventListener('keydown', handleKeydown);
      select.addEventListener('blur', handleBlur);
    },

    /**
     * The pattern (e.g., a URL) for the exception.
     * @type {string}
     */
    get pattern() {
      return this.dataItem[0];
    },
    set pattern(pattern) {
      this.dataItem[0] = pattern;
    },

    /**
     * The setting (allow/block) for the exception.
     * @type {string}
     */
    get setting() {
      return this.dataItem[1];
    },
    set setting(setting) {
      this.dataItem[1] = setting;
    },

    /**
     * Gets a human-readable setting string.
     * @type {string}
     */
    settingForDisplay: function() {
      var setting = this.setting;
      if (setting == 'allow')
        return templateData.allowException;
      else if (setting == 'block')
        return templateData.blockException;
      else if (setting == 'ask')
        return templateData.askException;
      else if (setting == 'session')
        return templateData.sessionException;
    },

    /**
     * Update this list item to reflect whether the input is a valid pattern
     * if |pattern| matches the text currently in the input.
     * @param {string} pattern The pattern.
     * @param {boolean} valid Whether said pattern is valid in the context of
     *     a content exception setting.
     */
    maybeSetPatternValid: function(pattern, valid) {
      // Don't do anything for messages where we are not the intended recipient,
      // or if the response is stale (i.e. the input value has changed since we
      // sent the request to analyze it).
      if (pattern != this.input.value)
        return;

      if (valid)
        this.input.setCustomValidity('');
      else
        this.input.setCustomValidity(' ');
      this.inputIsValid = valid;
      this.inputValidityKnown = true;
    },

    /**
     * Copy the data model values to the editable nodes.
     */
    updateEditables: function() {
      if (!(this.pattern && this.setting))
        return;

      this.input.value = this.pattern;

      if (this.setting == 'allow')
        this.optionAllow.selected = true;
      else if (this.setting == 'block')
        this.optionBlock.selected = true;
      else if (this.setting == 'session' && this.optionSession)
        this.optionSession.selected = true;
      else if (this.setting == 'ask' && this.optionAsk)
        this.optionAsk.selected = true;
    },

    /**
     * Whether the user is currently able to edit the list item.
     * @type {boolean}
     */
    get editing() {
      return this.hasAttribute('editing');
    },
    set editing(editing) {
      var oldEditing = this.editing;
      if (oldEditing == editing)
        return;

      var listItem = this;
      var pattern = this.pattern;
      var setting = this.setting;
      var patternLabel = this.patternLabel;
      var settingLabel = this.settingLabel;
      var input = this.input;
      var select = this.select;
      var optionAllow = this.optionAllow;
      var optionBlock = this.optionBlock;
      var optionSession = this.optionSession;
      var optionAsk = this.optionAsk;

      // Check that we have a valid pattern and if not we do not change the
      // editing mode.
      if (!editing && (!this.inputValidityKnown || !this.inputIsValid)) {
        if (this.pattern) {
          input.focus();
          input.select();
        } else {
          // Just delete this row if it was added via the Add button.
          var model = listItem.parentNode.dataModel;
          model.splice(model.indexOf(listItem.dataItem), 1);
        }

        return;
      }

      patternLabel.classList.toggle('hidden');
      settingLabel.classList.toggle('hidden');
      input.classList.toggle('hidden');
      select.classList.toggle('hidden');

      var doc = this.ownerDocument;
      if (editing) {
        this.setAttribute('editing', '');
        cr.ui.limitInputWidth(input, this, 20);
        input.focus();
        input.select();
      } else {
        this.removeAttribute('editing');

        var newPattern = input.value;

        var newSetting;
        if (optionAllow.selected)
          newSetting = 'allow';
        else if (optionBlock.selected)
          newSetting = 'block';
        else if (optionSession && optionSession.selected)
          newSetting = 'session';
        else if (optionAsk && optionAsk.selected)
          newSetting = 'ask';

        // Empty edit - do nothing.
        if (pattern == newPattern && newSetting == this.setting)
          return;

        this.pattern = patternLabel.textContent = newPattern;
        this.setting = newSetting;
        settingLabel.textContent = this.settingForDisplay();

        var contentType = this.contentType;

        if (pattern != this.pattern)
          chrome.send('removeExceptions', [contentType, pattern]);

        chrome.send('setException', [contentType, this.pattern, this.setting]);
      }
    }
  };

  /**
   * Creates a new exceptions list.
   * @constructor
   * @extends {cr.ui.List}
   */
  var ExceptionsList = cr.ui.define('list');

  ExceptionsList.prototype = {
    __proto__: List.prototype,

    /**
     * Called when an element is decorated as a list.
     */
    decorate: function() {
      List.prototype.decorate.call(this);

      this.dataModel = new ArrayDataModel([]);

      // Whether the exceptions in this list allow an 'Ask every time' option.
      this.enableAskOption = false;
    },

    /**
     * Creates an item to go in the list.
     * @param {Object} entry The element from the data model for this row.
     */
    createItem: function(entry) {
      return new ExceptionsListItem(this.contentType,
                                    this.enableAskOption,
                                    entry);
    },

    /**
     * Adds an exception to the js model.
     * @param {Array} entry A pair of the form [filter, setting].
     */
    addException: function(entry) {
      this.dataModel.push(entry);

      // When an empty row is added, put it into editing mode.
      if (!entry[0] && !entry[1]) {
        var index = this.dataModel.length - 1;
        var sm = this.selectionModel;
        sm.anchorIndex = sm.leadIndex = sm.selectedIndex = index;
        this.scrollIndexIntoView(index);
        var li = this.getListItemByIndex(index);
        li.editing = true;
      }
    },

    /**
     * The browser has finished checking a pattern for validity. Update the
     * list item to reflect this.
     * @param {string} pattern The pattern.
     * @param {bool} valid Whether said pattern is valid in the context of
     *     a content exception setting.
     */
    patternValidityCheckComplete: function(pattern, valid) {
      for (var i = 0; i < this.dataModel.length; i++) {
        var listItem = this.getListItemByIndex(i);
        if (listItem)
          listItem.maybeSetPatternValid(pattern, valid);
      }
    },

    /**
     * Removes all exceptions from the js model.
     */
    clear: function() {
      this.dataModel = new ArrayDataModel([]);
    },

    /**
     * Removes all selected rows from browser's model.
     */
    removeSelectedRows: function() {
      // The first member is the content type; the rest of the values are
      // the patterns we are removing.
      var args = [this.contentType];
      var selectedItems = this.selectedItems;
      for (var i = 0; i < selectedItems.length; i++) {
        args.push(selectedItems[i][0]);
      }

      chrome.send('removeExceptions', args);
    },

    /**
     * Puts the selected row in editing mode.
     */
    editSelectedRow: function() {
      var li = this.getListItem(this.selectedItem);
      if (li)
        li.editing = true;
    }
  };

  var ExceptionsArea = cr.ui.define('div');

  ExceptionsArea.prototype = {
    __proto__: HTMLDivElement.prototype,

    decorate: function() {
      // TODO(estade): need some sort of visual indication when the list is
      // empty.
      this.exceptionsList = this.querySelector('list');
      this.exceptionsList.contentType = this.contentType;

      ExceptionsList.decorate(this.exceptionsList);
      this.exceptionsList.selectionModel.addEventListener(
          'change', cr.bind(this.handleOnSelectionChange_, this));

      var addRow = cr.doc.createElement('button');
      addRow.textContent = templateData.addExceptionRow;
      this.appendChild(addRow);

      var editRow = cr.doc.createElement('button');
      editRow.textContent = templateData.editExceptionRow;
      this.appendChild(editRow);
      this.editRow = editRow;

      var removeRow = cr.doc.createElement('button');
      removeRow.textContent = templateData.removeExceptionRow;
      this.appendChild(removeRow);
      this.removeRow = removeRow;

      var self = this;
      addRow.onclick = function(event) {
        self.exceptionsList.addException(['', '']);
      };

      editRow.onclick = function(event) {
        self.exceptionsList.editSelectedRow();
      };

      removeRow.onclick = function(event) {
        self.exceptionsList.removeSelectedRows();
      };

      this.updateButtonSensitivity();

      this.classList.add('hidden');
    },

    /**
     * The content type for this exceptions area, such as 'images'.
     * @type {string}
     */
    get contentType() {
      return this.getAttribute('contentType');
    },
    set contentType(type) {
      return this.setAttribute('contentType', type);
    },

    /**
     * Update the enabled/disabled state of the editing buttons based on which
     * rows are selected.
     */
    updateButtonSensitivity: function() {
      var selectionSize = this.exceptionsList.selectedItems.length;
      this.editRow.disabled = selectionSize != 1;
      this.removeRow.disabled = selectionSize == 0;
    },

    /**
     * Callback from the selection model.
     * @param {!cr.Event} ce Event with change info.
     * @private
     */
    handleOnSelectionChange_: function(ce) {
      this.updateButtonSensitivity();
   },
  };

  return {
    ExceptionsListItem: ExceptionsListItem,
    ExceptionsList: ExceptionsList,
    ExceptionsArea: ExceptionsArea
  };
});
</script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

cr.define('options', function() {

  //////////////////////////////////////////////////////////////////////////////
  // ContentSettingsRadio class:

  // Define a constructor that uses an input element as its underlying element.
  var ContentSettingsRadio = cr.ui.define('input');

  ContentSettingsRadio.prototype = {
    __proto__: HTMLInputElement.prototype,

    /**
     * Initialization function for the cr.ui framework.
     */
    decorate: function() {
      this.type = 'radio';
      var self = this;

      this.addEventListener('change',
          function(e) {
            chrome.send('setContentFilter', [this.name, this.value]);
          });
    },
  };

  // Export
  return {
    ContentSettingsRadio: ContentSettingsRadio
  };

});

</script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

cr.define('options', function() {
  const Tree = cr.ui.Tree;
  const TreeItem = cr.ui.TreeItem;

  var treeLookup = {};

  /**
   * Creates a new tree item for sites data.
   * @param {Object=} data Data used to create a cookie tree item.
   * @constructor
   * @extends {TreeItem}
   */
  function CookieTreeItem(data) {
    var treeItem = new TreeItem({
      label: data.title,
      data: data
    });
    treeItem.__proto__ = CookieTreeItem.prototype;

    if (data.icon) {
      treeItem.icon = data.icon;
    }

    return treeItem;
  }

  CookieTreeItem.prototype = {
    __proto__: TreeItem.prototype,

    /** @inheritDoc */
    addAt: function(child, index) {
      TreeItem.prototype.addAt.call(this, child, index);
      if (child.data && child.data.id)
        treeLookup[child.data.id] = child;
    },

    /** @inheritDoc */
    remove: function(child) {
      TreeItem.prototype.remove.call(this, child);
      if (child.data && child.data.id)
        delete treeLookup[child.data.id];
    },

    /**
     * The tree path id/.
     * @type {string}
     */
    get pathId() {
      var parent = this.parentItem;
      if (parent && parent instanceof CookieTreeItem) {
        return parent.pathId + ',' + this.data.id;
      } else {
        return this.data.id;
      }
    }
  };

  /**
   * Creates a new cookies tree.
   * @param {Object=} opt_propertyBag Optional properties.
   * @constructor
   * @extends {Tree}
   */
  var CookiesTree = cr.ui.define('tree');

  CookiesTree.prototype = {
    __proto__: Tree.prototype,

    /** @inheritDoc */
    addAt: function(child, index) {
      Tree.prototype.addAt.call(this, child, index);
      if (child.data && child.data.id)
        treeLookup[child.data.id] = child;
    },

    /** @inheritDoc */
    remove: function(child) {
      Tree.prototype.remove.call(this, child);
      if (child.data && child.data.id)
        delete treeLookup[child.data.id];
    },

    /**
     * Clears the tree.
     */
    clear: function() {
      // Remove all fields without recreating the object since other code
      // references it.
      for (var id in treeLookup){
        delete treeLookup[id];
      }
      this.textContent = '';
    },

    /**
     * Add tree nodes by parent id.
     * @param {string} parentId Id of the parent node.
     * @param {int} start Start index of where to insert nodes.
     * @param {Array} nodesData Nodes data array.
     */
    addByParentId: function(parentId, start, nodesData) {
      var parent = parentId ? treeLookup[parentId] : this;
      if (!parent) {
        return;
      }

      for (var i = 0; i < nodesData.length; ++i) {
        parent.addAt(new CookieTreeItem(nodesData[i]), start + i);
      }

      cr.dispatchSimpleEvent(this, 'change');
    },

    /**
     * Removes tree nodes by parent id.
     * @param {string} parentId Id of the parent node.
     * @param {int} start Start index of nodes to remove.
     * @param {int} count Number of nodes to remove.
     */
    removeByParentId: function(parentId, start, count) {
      var parent = parentId ? treeLookup[parentId] : this;
      if (!parent) {
        return;
      }

      for (; count > 0 && parent.items.length; --count) {
        parent.remove(parent.items[start]);
      }

      cr.dispatchSimpleEvent(this, 'change');
    }
  };

  return {
    CookiesTree: CookiesTree
  };
});
</script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

cr.define('options', function() {

  var OptionsPage = options.OptionsPage;

  /////////////////////////////////////////////////////////////////////////////
  // CookiesView class:

  /**
   * Encapsulated handling of ChromeOS accounts options page.
   * @constructor
   */
  function CookiesView(model) {
    OptionsPage.call(this, 'cookiesView',
                     localStrings.getString('cookiesViewPage'),
                     'cookiesViewPage');
  }

  cr.addSingletonGetter(CookiesView);

  CookiesView.prototype = {
    __proto__: OptionsPage.prototype,

    initializePage: function() {
      OptionsPage.prototype.initializePage.call(this);

      var cookiesTree = $('cookiesTree');

      options.CookiesTree.decorate(cookiesTree);
      cookiesTree.addEventListener('change',
          cr.bind(this.handleCookieTreeChange_, this));

      $('cookiesSearchBox').addEventListener('keydown',
          cr.bind(this.handleQueryEditKeyDown_, this));

      var self = this;
      $('clearCookieSearchButton').onclick = function(e) {
        $('cookiesSearchBox').value = '';
        self.searchCookie();
      }

      $('remove-cookie').onclick = function(e) {
        var selected = cookiesTree.selectedItem;
        chrome.send('removeCookie', [selected.pathId]);
      }

      $('remove-all-cookie').onclick = function(e) {
        chrome.send('removeAllCookies', []);
      }

      this.addEventListener('visibleChange', this.handleVisibleChange_);

      this.clearCookieInfo();
    },

    /**
     * Set visible detailed info.
     * @param {string} name Name of the details info pane to made visible.
     */
    updateVisibleDetailedInfo: function(name) {
      const infoPaneNames = [
          'cookiesInfo', 'appCacheInfo', 'webDbInfo', 'localStorageInfo'];

      for (var i = 0 ; i < infoPaneNames.length; ++i) {
        var paneName = infoPaneNames[i];
        var pane = $(paneName);
        if (name == paneName) {
          pane.classList.remove('hidden');
        } else {
          pane.classList.add('hidden');
        }
      }
    },

    /**
     * Update remove button state.
     */
    updateRemoveButtonState: function() {
      var cookiesTree = $('cookiesTree');
      $('remove-cookie').disabled = !cookiesTree.children.length ||
          !cookiesTree.selectedItem;
      $('remove-all-cookie').disabled = !cookiesTree.children.length;
    },

    /**
     * Clears cookie info.
     */
    clearCookieInfo: function() {
      $('cookieName').textContent = localStrings.getString('no_cookie');
      $('cookieContent').textContent = localStrings.getString('no_cookie');
      $('cookieDomain').textContent = localStrings.getString('no_cookie');
      $('cookiePath').textContent = localStrings.getString('no_cookie');
      $('cookieSendFor').textContent = localStrings.getString('no_cookie');
      $('cookieCreated').textContent = localStrings.getString('no_cookie');
      $('cookieExpires').textContent = localStrings.getString('no_cookie');
    },

    /**
     * Sets cookie info to display.
     */
    setCookieInfo: function(cookie) {
      $('cookieName').textContent = cookie.name;
      $('cookieContent').textContent = cookie.content;
      $('cookieDomain').textContent = cookie.domain;
      $('cookiePath').textContent = cookie.path;
      $('cookieSendFor').textContent = cookie.sendfor;
      $('cookieCreated').textContent = cookie.created;
      $('cookieExpires').textContent = cookie.expires;
    },

    /**
     * Sets app cache info to display.
     */
    setAppCacheInfo: function(appCache) {
      $('appCacheManifest').textContent = appCache.manefest;
      $('appCacheSize').textContent = appCache.size;
      $('appCacheCreated').textContent = appCache.created;
      $('appCacheLastAccessed').textContent = appCache.accessed;
    },

    /**
     * Sets web db info to display.
     */
    setWebDbInfo: function(webDb) {
      $('webdbName').textContent = webDb.name;
      $('webdbDesc').textContent = webDb.desc;
      $('webdbSize').textContent = webDb.size;
      $('webdbLastModified').textContent = webDb.modified;
    },

    /**
     * Sets local storage info to display.
     */
    setLocalStorageInfo: function(localStorage) {
      $('localStorageOrigin').textContent = localStorage.origin;
      $('localStorageSize').textContent = localStorage.size;
      $('localStorageLastModified').textContent = localStorage.modified;
    },

    lastQuery_ : null,

    /**
     * Search cookie using text in cookiesSearchBox.
     */
    searchCookie: function() {
      this.queryDelayTimerId_ = 0;
      var filter = $('cookiesSearchBox').value;
      if (this.lastQuery_ != filter) {
        chrome.send('updateCookieSearchResults', [filter]);
        this.lastQuery_ = filter;
      }
    },

    /**
     * Handles cookie tree selection change.
     * @private
     * @param {!Event} e The change event object.
     */
    handleCookieTreeChange_: function(e) {
      this.updateRemoveButtonState();

      var cookiesTree = $('cookiesTree');
      var data = null;
      if (cookiesTree.selectedItem) {
        data = cookiesTree.selectedItem.data;
      }

      if (data && data.type == 'cookie') {
        this.setCookieInfo(data);
        this.updateVisibleDetailedInfo('cookiesInfo');
      } else if (data && data.type == 'database') {
        this.setWebDbInfo(data);
        this.updateVisibleDetailedInfo('webDbInfo');
      } else if (data && data.type == 'local_storage') {
        this.setLocalStorageInfo(data);
        this.updateVisibleDetailedInfo('localStorageInfo');
      } else if (data && data.type == 'app_cache') {
        this.setAppCacheInfo(data);
        this.updateVisibleDetailedInfo('appCacheInfo');
      } else {
        this.clearCookieInfo();
        this.updateVisibleDetailedInfo('cookiesInfo');
      }
    },

    queryDelayTimerId_: 0,

    /**
     * Handles query edit key down.
     * @private
     * @param {!Event} e The event object.
     */
    handleQueryEditKeyDown_: function(e) {
      if (this.queryDelayTimerId_) {
        window.clearTimeout(this.queryDelayTimerId_);
      }

      this.queryDelayTimerId_ = window.setTimeout(
          cr.bind(this.searchCookie, this), 500);
    },

    initalized_: false,

    /**
     * Handler for OptionsPage's visible property change event.
     * @private
     * @param {Event} e Property change event.
     */
    handleVisibleChange_: function(e) {
      if (!this.initalized_ && this.visible) {
        this.initalized_ = true;
        this.searchCookie();
      }
    }
  };

  // CookiesViewHandler callbacks.
  CookiesView.onTreeItemAdded = function(args) {
    $('cookiesTree').addByParentId(args[0], args[1], args[2]);
  };

  CookiesView.onTreeItemRemoved = function(args) {
    $('cookiesTree').removeByParentId(args[0], args[1], args[2]);
  };

  // Export
  return {
    CookiesView: CookiesView
  };

});
</script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

cr.define('options', function() {
  const OptionsPage = options.OptionsPage;

  /**
   * EditSearchEngineOverlay class
   * Encapsulated handling of the 'Edit Search Engine' overlay page.
   * @class
   * @constructor
   */
  function EditSearchEngineOverlay() {
    OptionsPage.call(this, 'editSearchEngineOverlay',
                     templateData.editSearchEngineTitle,
                     'editSearchEngineOverlay');
  }

  cr.addSingletonGetter(EditSearchEngineOverlay);

  EditSearchEngineOverlay.prototype = {
    __proto__: OptionsPage.prototype,

    /**
     * Initializes the page.
     */
    initializePage: function() {
      OptionsPage.prototype.initializePage.call(this);

      var self = this;
      var editForm = $('editSearchEngineForm');
      editForm.onreset = function(e) {
        chrome.send('searchEngineEditCancelled');
        self.dismissOverlay_();
      };
      editForm.onsubmit = function(e) {
        chrome.send('searchEngineEditCompleted', self.getInputFieldValues_());
        self.dismissOverlay_();
        return false;
      };
      var fieldIDs = ['editSearchEngineName',
                      'editSearchEngineKeyword',
                      'editSearchEngineURL'];
      for (var i = 0; i < fieldIDs.length; i++) {
        var field = $(fieldIDs[i]);
        field.oninput = cr.bind(this.validateFields_, this);
        field.onkeydown = function(e) {
          if (e.keyCode == 27)  // Esc
            editForm.reset();
        };
      }
    },

    /**
     * Clears any uncommited input, and dismisses the overlay.
     * @private
     */
    dismissOverlay_: function() {
      this.setEditDetails_();
      OptionsPage.clearOverlays();
    },

    /**
     * Fills the text fields from the given search engine.
     * @private
     */
    setEditDetails_: function(engineDetails) {
      if (engineDetails) {
        $('editSearchEngineName').value = engineDetails['name'];
        $('editSearchEngineKeyword').value = engineDetails['keyword'];
        $('editSearchEngineURL').value = engineDetails['url'];
        this.validateFields_();
      } else {
        $('editSearchEngineName').value = '';
        $('editSearchEngineKeyword').value = '';
        $('editSearchEngineURL').value = '';
        var invalid = { name: false, keyword: false, url: false };
        this.updateValidityWithResults_(invalid);
      }
    },

    /**
     * Starts the process of asynchronously validating the user input. Results
     * will be reported to updateValidityWithResults_.
     * @private
     */
    validateFields_: function() {
      chrome.send('checkSearchEngineInfoValidity', this.getInputFieldValues_());
    },

    /**
     * Sets the validation images and the enabled state of the Add button based
     * on the current values of the text fields.
     * @private
     * @param {Object} The dictionary of validity states.
     */
    updateValidityWithResults_: function(validity) {
      this.setBadgeValidity_($('editSearchEngineNameValidity'),
                             validity['name'],
                             'editSearchEngineInvalidTitleToolTip');
      this.setBadgeValidity_($('editSearchEngineKeywordValidity'),
                             validity['keyword'],
                             'editSearchEngineInvalidKeywordToolTip');
      this.setBadgeValidity_($('editSearchEngineURLValidity'),
                             validity['url'],
                             'editSearchEngineInvalidURLToolTip');
      $('editSearchEngineOkayButton').disabled =
          !(validity['name'] && validity['keyword'] && validity['url']);
    },

    /**
     * Updates the state of the given validity indicator badge.
     * @private
     * @param {HTMLElement} The badge element to adjust.
     * @param {boolean} Whether or not the badge should be set to the valid
     *     state.
     * @param {string} The tooltip string id for the invalid state.
     */
    setBadgeValidity_: function(element, isValid, tooltip_id) {
      if (isValid) {
        element.className = 'valid-badge';
        element.title = '';
      } else {
        element.className = 'alert-badge';
        element.title = localStrings.getString(tooltip_id);
      }
    },

    /**
     * Returns the input field values as an array suitable for passing to
     * chrome.send. The order of the array is important.
     * @private
     * @return {array} The current input field values.
     */
    getInputFieldValues_: function() {
      return [ $('editSearchEngineName').value,
               $('editSearchEngineKeyword').value,
               $('editSearchEngineURL').value ];
    }
  };

  EditSearchEngineOverlay.setEditDetails = function(engineDetails) {
    EditSearchEngineOverlay.getInstance().setEditDetails_(engineDetails);
  };

  EditSearchEngineOverlay.validityCheckCallback = function(validity) {
    EditSearchEngineOverlay.getInstance().updateValidityWithResults_(validity);
  };

  // Export
  return {
    EditSearchEngineOverlay: EditSearchEngineOverlay
  };

});
</script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

cr.define('options', function() {

  var OptionsPage = options.OptionsPage;

  /**
   * FontSettingsOverlay class
   * Encapsulated handling of the 'Font Settings' overlay page.
   * @class
   */
  function FontSettingsOverlay() {
    OptionsPage.call(this, 'fontSettingsOverlay',
                     templateData.fontSettingsOverlayTitle,
                     'fontSettingsOverlay');
  }

  cr.addSingletonGetter(FontSettingsOverlay);

  FontSettingsOverlay.prototype = {
    // Inherit FontSettingsOverlay from OptionsPage.
    __proto__: OptionsPage.prototype,

    /**
     * Initialize the page.
     */
    initializePage: function() {
      // Call base class implementation to starts preference initialization.
      OptionsPage.prototype.initializePage.call(this);

      // Initialize values for selector controls.
      $('fontSettingsSerifSelector').initializeValues(
          templateData.fontSettingsFontList)
      $('fontSettingsSerifSizeSelector').initializeValues(
          templateData.fontSettingsFontSizeList)
      $('fontSettingsSansSerifSelector').initializeValues(
          templateData.fontSettingsFontList)
      $('fontSettingsSansSerifSizeSelector').initializeValues(
          templateData.fontSettingsFontSizeList)
      $('fontSettingsFixedWidthSelector').initializeValues(
          templateData.fontSettingsFontList)
      $('fontSettingsFixedWidthSizeSelector').initializeValues(
          templateData.fontSettingsFontSizeList)
      $('fontSettingsEncodingSelector').initializeValues(
          templateData.fontSettingsEncodingList)
    }
  };

  FontSettingsOverlay.setupFontPreview = function(id, font, size) {
    $(id).textContent = font + " " + size;
    $(id).style.fontFamily = font;
    $(id).style.fontSize = size + "pt";
  }

  // Chrome callbacks
  FontSettingsOverlay.setupSerifFontPreview = function(text, size) {
    this.setupFontPreview('fontSettingsSerifPreview', text, size);
  }

  FontSettingsOverlay.setupSansSerifFontPreview = function(text, size) {
    this.setupFontPreview('fontSettingsSansSerifPreview', text, size);
  }

  FontSettingsOverlay.setupFixedFontPreview = function(text, size) {
    this.setupFontPreview('fontSettingsFixedWidthPreview', text, size);
  }

  // Export
  return {
    FontSettingsOverlay: FontSettingsOverlay
  };

});

</script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

cr.define('options', function() {

  var OptionsPage = options.OptionsPage;

  /**
   * ImportDataOverlay class
   * Encapsulated handling of the 'Import Data' overlay page.
   * @class
   */
  function ImportDataOverlay() {
    OptionsPage.call(this, 'importDataOverlay',
                     templateData.import_data_title,
                     'importDataOverlay');
  }

  ImportDataOverlay.throbIntervalId = 0
  ImportDataOverlay.checkboxMask = '';

  cr.addSingletonGetter(ImportDataOverlay);

  ImportDataOverlay.prototype = {
    // Inherit ImportDataOverlay from OptionsPage.
    __proto__: OptionsPage.prototype,

    /**
     * Initialize the page.
     */
    initializePage: function() {
      // Call base class implementation to starts preference initialization.
      OptionsPage.prototype.initializePage.call(this);

      var self = this;
      var checkboxList =
          document.querySelectorAll('#checkboxList input[type=checkbox]');
      for (var i = 0; i < checkboxList.length; i++) {
        if(checkboxList[i].type == 'checkbox')
          checkboxList[i].onchange = function(e) {
            self.countCheckboxes_();
          };
      }

      $('import-data-commit').onclick = function(e) {
        /** The first digit in paramList indicates browser selected
         *  The rest indicate the checkboxes (1 is checked, 0 is not)
         */
        var selectedBrowser = $('supported-browsers').selectedIndex;
        var paramList =
            String(selectedBrowser) + ImportDataOverlay.checkboxMask;

        chrome.send('importData', [paramList]);
      }
    },

    countCheckboxes_: function() {
      ImportDataOverlay.checkboxMask = "";
      var checkboxList =
          document.querySelectorAll('#checkboxList input[type=checkbox]');
      for (var i = 0; i < checkboxList.length; i++) {
        if (checkboxList[i].type == 'checkbox') {
          if(checkboxList[i].checked)
            ImportDataOverlay.checkboxMask += "1";
          else
            ImportDataOverlay.checkboxMask += "0";
        }
      }
      if (ImportDataOverlay.checkboxMask.indexOf("1") == -1)
        $('import-data-commit').disabled = true;
      else
        $('import-data-commit').disabled = false;
    },

    /**
     * Clear the supported browsers popup
     * @private
     */
    clearSupportedBrowsers_: function() {
      $('supported-browsers').textContent = '';
    },

    /**
     * Update the supported browsers popup with given entries.
     * @param {Array} list of supported browsers name.
     */
    updateSupportedBrowsers_: function(browsers) {
      this.clearSupportedBrowsers_();
      browserSelect = $('supported-browsers');
      browserCount = browsers.length;

      if(browserCount == 0) {
        var option = new Option(templateData.no_profile_found, 0);
        browserSelect.appendChild(option);

        ImportDataOverlay.setDisable(true);
      }
      else {
        for (var i = 0; i < browserCount; i++) {
          var browser = browsers[i]
          var option = new Option(browser['name'], browser['index']);
          browserSelect.appendChild(option);

        ImportDataOverlay.setDisable(false);
        this.countCheckboxes_();
        }
      }
    },
  };

  ImportDataOverlay.loadImporter = function() {
    chrome.send('loadImporter');
  };

  ImportDataOverlay.updateSupportedBrowsers = function(browsers) {
    ImportDataOverlay.getInstance().updateSupportedBrowsers_(browsers);
  };

  ImportDataOverlay.setDisable = function(state) {
    $('supported-browsers').disabled = state;
    $('import-favorites').disabled = state;
    $('import-search').disabled = state;
    $('import-passwords').disabled = state;
    $('import-history').disabled = state;
    $('import-data-commit').disabled = state;
  };

  ImportDataOverlay.setImportingState = function(state) {
    ImportDataOverlay.setDisable(state);
    $('import-throbber').style.visibility = state ? "visible" : "hidden";

    function advanceThrobber() {
      var throbber = $('import-throbber');
      throbber.style.backgroundPositionX =
          ((parseInt(getComputedStyle(throbber).backgroundPositionX, 10) - 16)
          % 576) + 'px';
    }
    if (state) {
      ImportDataOverlay.throbIntervalId =
          setInterval(advanceThrobber, 30);
    } else {
      clearInterval(ImportDataOverlay.throbIntervalId);
    }
  };

  ImportDataOverlay.dismiss = function() {
    ImportDataOverlay.setImportingState(false);
    OptionsPage.clearOverlays();
  }

  // Export
  return {
    ImportDataOverlay: ImportDataOverlay
  };

});
</script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

cr.define('options', function() {

  var OptionsPage = options.OptionsPage;

  /////////////////////////////////////////////////////////////////////////////
  // PasswordsExceptions class:

  /**
   * Encapsulated handling of password and exceptions page.
   * @constructor
   */
  function PasswordsExceptions() {
    this.activeNavTab = null;
    OptionsPage.call(this, 'passwordsExceptions',
                     templateData.savedPasswordsExceptionsTitle,
                     'passwordsExceptionsPage');
  }

  cr.addSingletonGetter(PasswordsExceptions);

  PasswordsExceptions.prototype = {
    __proto__: OptionsPage.prototype,

    initializePage: function() {
      OptionsPage.prototype.initializePage.call(this);

      options.passwordsExceptions.PasswordsListArea.decorate($('passwordsArea'));
      options.passwordsExceptions.PasswordExceptionsListArea.decorate(
          $('passwordExceptionsArea'));

      $('password-exceptions-nav-tab').onclick = function() {
        OptionsPage.showTab($('password-exceptions-nav-tab'));
        passwordExceptionsList.redraw();
      }
    },

    setSavedPasswordsList_: function(entries) {
      savedPasswordsList.clear();
      for (var i = 0; i < entries.length; i++) {
        savedPasswordsList.addEntry(entries[i]);
      }
    },

    setPasswordExceptionsList_: function(entries) {
      passwordExceptionsList.clear();
      for (var i = 0; i < entries.length; i++) {
        passwordExceptionsList.addEntry(entries[i]);
      }
    },

  };

  PasswordsExceptions.load = function() {
    chrome.send('loadLists');
  };

  /**
   * Call to remove a saved password.
   * @param rowIndex indicating the row to remove.
   */
  PasswordsExceptions.removeSavedPassword = function(rowIndex) {
      chrome.send('removeSavedPassword', [String(rowIndex)]);
  };

  /**
   * Call to remove a password exception.
   * @param rowIndex indicating the row to remove.
   */
  PasswordsExceptions.removePasswordException = function(rowIndex) {
      chrome.send('removePasswordException', [String(rowIndex)]);
  };


  /**
   * Call to remove all saved passwords.
   * @param tab contentType of the tab currently on.
   */
  PasswordsExceptions.removeAllPasswords = function() {
    chrome.send('removeAllSavedPasswords');
  };

  /**
   * Call to remove all saved passwords.
   * @param tab contentType of the tab currently on.
   */
  PasswordsExceptions.removeAllPasswordExceptions = function() {
    chrome.send('removeAllPasswordExceptions');
  };

  PasswordsExceptions.showSelectedPassword = function(index) {
    chrome.send('showSelectedPassword', [String(index)]);
  };

  PasswordsExceptions.setSavedPasswordsList = function(entries) {
    PasswordsExceptions.getInstance().setSavedPasswordsList_(entries);
  };

  PasswordsExceptions.setPasswordExceptionsList = function(entries) {
    PasswordsExceptions.getInstance().setPasswordExceptionsList_(entries);
  };

  PasswordsExceptions.selectedPasswordCallback = function(password) {
    passwordsArea.displayReturnedPassword(password);
  };

  // Export
  return {
    PasswordsExceptions: PasswordsExceptions
  };

});

</script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

cr.define('options.passwordsExceptions', function() {

  const List = cr.ui.List;
  const ListItem = cr.ui.ListItem;
  const ArrayDataModel = cr.ui.ArrayDataModel;

  /**
   * Creates a new passwords list item.
   * @param {Array} entry A pair of the form [url, username].
   * @constructor
   * @extends {cr.ui.ListItem}
   */
  function PasswordsListItem(entry) {
    var el = cr.doc.createElement('li');
    el.dataItem = entry;
    el.__proto__ = PasswordsListItem.prototype;
    el.decorate();

    return el;
  }

  PasswordsListItem.prototype = {
    __proto__: ListItem.prototype,

    /**
     * Call when an element is decorated as a list item.
     */
    decorate: function() {
      ListItem.prototype.decorate.call(this);

      // Labels for display
      var urlLabel = cr.doc.createElement('span');
      urlLabel.textContent = this.url;
      this.appendChild(urlLabel);
      this.urlLabel = urlLabel;

      var usernameLabel = cr.doc.createElement('span');
      usernameLabel.textContent = this.username;
      usernameLabel.className = 'passwordsUsername';
      this.appendChild(usernameLabel);
      this.usernameLabel = usernameLabel;
    },

    /**
     * Get the url for the entry.
     * @type {string}
     */
    get url() {
      return this.dataItem[0];
    },
    set url(url) {
      this.dataItem[0] = url;
    },

    /**
     * Get the username for the entry.
     * @type {string}
     */
    get username() {
      return this.dataItem[1];
     },
     set username(username) {
      this.dataItem[1] = username;
     },
  };

  /**
   * Creates a new PasswordExceptions list item.
   * @param {Array} entry A pair of the form [url, username].
   * @constructor
   * @extends {cr.ui.ListItem}
   */
  function PasswordExceptionsListItem(entry) {
    var el = cr.doc.createElement('li');
    el.dataItem = entry;
    el.__proto__ = PasswordExceptionsListItem.prototype;
    el.decorate();

    return el;
  }

  PasswordExceptionsListItem.prototype = {
    __proto__: ListItem.prototype,

    /**
     * Call when an element is decorated as a list item.
     */
    decorate: function() {
      ListItem.prototype.decorate.call(this);

      // Labels for display
      var urlLabel = cr.doc.createElement('span');
      urlLabel.textContent = this.url;
      this.appendChild(urlLabel);
      this.urlLabel = urlLabel;
    },

    /**
     * Get the url for the entry.
     * @type {string}
     */
    get url() {
      return this.dataItem;
    },
    set url(url) {
      this.dataItem = url;
    },
  };


  /**
   * Create a new passwords list.
   * @constructor
   * @extends {cr.ui.List}
   */
  var PasswordsList = cr.ui.define('list');

  PasswordsList.prototype = {
    __proto__: List.prototype,
    /**
     * Called when an element is decorated as a list.
     */
    decorate: function() {
      List.prototype.decorate.call(this);

      this.dataModel = new ArrayDataModel([]);
    },

    /**
     * Creates an item to go in the list.
     * @param {Object} entry The element from the data model for this row.
     */
    createItem: function(entry) {
      return new PasswordsListItem(entry);
    },

    /**
     * Adds an entry to the js model.
     * @param {Array} entry A pair of the form [url, username].
     */
    addEntry: function(entry) {
      this.dataModel.push(entry);
      this.listArea.updateButtonSensitivity();
    },

    /**
     * Remove all entries from the js model.
     */
    clear: function() {
      this.dataModel = new ArrayDataModel([]);
      this.listArea.updateButtonSensitivity();
    },

    /**
     * Remove selected row from browser's model.
     */
    removeSelectedRow: function() {
      var selectedIndex = this.selectionModel.selectedIndex;
      PasswordsExceptions.removeSavedPassword(selectedIndex);
    },

    showSelectedPassword: function() {
      var selectedIndex = this.selectionModel.selectedIndex;
      PasswordsExceptions.showSelectedPassword(selectedIndex);
    },

    /**
     * The length of the list.
     */
    get length() {
      return this.dataModel.length;
    },
  };

  /**
   * Create a new passwords list.
   * @constructor
   * @extends {cr.ui.List}
   */
  var PasswordExceptionsList = cr.ui.define('list');

  PasswordExceptionsList.prototype = {
    __proto__: List.prototype,
    /**
     * Called when an element is decorated as a list.
     */
    decorate: function() {
      List.prototype.decorate.call(this);

      this.dataModel = new ArrayDataModel([]);
    },

    /**
     * Creates an item to go in the list.
     * @param {Object} entry The element from the data model for this row.
     */
    createItem: function(entry) {
      return new PasswordExceptionsListItem(entry);
    },

    /**
     * Adds an entry to the js model.
     * @param {Array} entry A pair of the form [url, username].
     */
    addEntry: function(entry) {
      this.dataModel.push(entry);
      this.listArea.updateButtonSensitivity();
    },

    /**
     * Remove all entries from the js model.
     */
    clear: function() {
      this.dataModel = new ArrayDataModel([]);
      this.listArea.updateButtonSensitivity();
    },

    /**
     * Remove selected row from browser's model.
     */
    removeSelectedRow: function() {
      var selectedIndex = this.selectionModel.selectedIndex;
      PasswordsExceptions.removePasswordException(selectedIndex);
    },

    /**
     * The length of the list.
     */
    get length() {
      return this.dataModel.length;
    },
  };

  /**
   * Create a new passwords list area.
   * @constructor
   * @extends {cr.ui.div}
   */
  var PasswordsListArea = cr.ui.define('div');

  PasswordsListArea.prototype = {
    __proto__: HTMLDivElement.prototype,

    decorate: function() {
      this.passwordsList = this.querySelector('list');
      this.passwordsList.listArea = this;

      PasswordsList.decorate(this.passwordsList);
      this.passwordsList.selectionModel.addEventListener(
          'change', cr.bind(this.handleOnSelectionChange_, this));

      var removeRow = cr.doc.createElement('button');
      removeRow.textContent = templateData.passwordsRemoveButton;
      this.appendChild(removeRow);
      this.removeRow = removeRow;

      var removeAll = cr.doc.createElement('button');
      removeAll.textContent = templateData.passwordsRemoveAllButton;
      this.appendChild(removeAll);
      this.removeAll = removeAll;

      var showHidePassword = cr.doc.createElement('button');
      showHidePassword.textContent = templateData.passwordsShowButton;
      this.appendChild(showHidePassword);
      this.showHidePassword = showHidePassword;
      this.showingPassword = false

      var passwordLabel = cr.doc.createElement('span');
      this.appendChild(passwordLabel);
      this.passwordLabel = passwordLabel;

      var self = this;
      removeRow.onclick = function(event) {
        self.passwordsList.removeSelectedRow();
      };

      removeAll.onclick = function(event) {
        OptionsPage.showOverlay('passwordsRemoveAllOverlay');
      };

      showHidePassword.onclick = function(event) {
        if(self.showingPassword) {
          self.passwordLabel.textContent = "";
          this.textContent = templateData.passwordsShowButton;
        } else {
          self.passwordsList.showSelectedPassword();
          this.textContent = templateData.passwordsHideButton;
        }
        self.showingPassword = !self.showingPassword;
      };

      this.updateButtonSensitivity();
    },

    displayReturnedPassword: function(password) {
      this.passwordLabel.textContent = password;
    },

    /**
     * Update the button's states
     */
    updateButtonSensitivity: function() {
      var selectionSize = this.passwordsList.selectedItems.length;
      this.removeRow.disabled = selectionSize == 0;
      this.showHidePassword.disabled = selectionSize == 0;
      this.removeAll.disabled = this.passwordsList.length == 0;
    },

    /**
     * Callback from selection model
     * @param {!cr.Event} ce Event with change info.
     * @private
     */
    handleOnSelectionChange_: function(ce) {
      this.passwordLabel.textContent = "";
      this.showHidePassword.textContent = templateData.passwordsShowButton;
      this.showingPassword = false;
      this.updateButtonSensitivity();
    },
  };

  /**
   * Create a new passwords list area.
   * @constructor
   * @extends {cr.ui.div}
   */
  var PasswordExceptionsListArea = cr.ui.define('div');

  PasswordExceptionsListArea.prototype = {
    __proto__: HTMLDivElement.prototype,

    decorate: function() {
      this.passwordExceptionsList = this.querySelector('list');
      this.passwordExceptionsList.listArea = this;

      PasswordExceptionsList.decorate(this.passwordExceptionsList);
      this.passwordExceptionsList.selectionModel.addEventListener(
          'change', cr.bind(this.handleOnSelectionChange_, this));

      var removeRow = cr.doc.createElement('button');
      removeRow.textContent = templateData.passwordsRemoveButton;
      this.appendChild(removeRow);
      this.removeRow = removeRow;

      var removeAll = cr.doc.createElement('button');
      removeAll.textContent = templateData.passwordsRemoveAllButton;
      this.appendChild(removeAll);
      this.removeAll = removeAll;

      var self = this;
      removeRow.onclick = function(event) {
        self.passwordExceptionsList.removeSelectedRow();
      };

      removeAll.onclick = function(event) {
        PasswordsExceptions.removeAllPasswordExceptions();
      };

      this.updateButtonSensitivity();
    },

    /**
     * Update the button's states
     */
    updateButtonSensitivity: function() {
      var selectionSize = this.passwordExceptionsList.selectedItems.length;
      this.removeRow.disabled = selectionSize == 0;
      this.removeAll.disabled = this.passwordExceptionsList.length == 0;
    },

    /**
     * Callback from selection model
     * @param {!cr.Event} ce Event with change info.
     * @private
     */
    handleOnSelectionChange_: function(ce) {
      this.updateButtonSensitivity();
    },
  };


  return {
    PasswordsListItem: PasswordsListItem,
    PasswordExceptionsListItem: PasswordExceptionsListItem,
    PasswordsList: PasswordsList,
    PasswordExceptionsList: PasswordExceptionsList,
    PasswordsListArea: PasswordsListArea,
    PasswordExceptionsListArea: PasswordExceptionsListArea
  };
});
</script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

cr.define('options', function() {

  var OptionsPage = options.OptionsPage;

  /**
   * PasswordsRemoveAllOverlay class
   * Encapsulated handling of the 'Remove All' overlay page.
   * @class
   */
  function PasswordsRemoveAllOverlay() {
    OptionsPage.call(this, 'passwordsRemoveAllOverlay',
                     templateData.remove_all_title,
                     'passwordsRemoveAllOverlay');
  }

  cr.addSingletonGetter(PasswordsRemoveAllOverlay);

  PasswordsRemoveAllOverlay.prototype = {
    // Inherit StopSyncingOverlay from OptionsPage.
    __proto__: OptionsPage.prototype,

    /**
     * Initialize the page.
     */
    initializePage: function() {
      // Call base class implementation to starts preference initialization.
      OptionsPage.prototype.initializePage.call(this);

      $('remove-all-cancel').onclick = function(e) {
        OptionsPage.clearOverlays();
      }

      $('remove-all-confirm').onclick = function(e) {
        PasswordsExceptions.removeAllPasswords();
        OptionsPage.clearOverlays();
      }
    }
  };

  // Export
  return {
    PasswordsRemoveAllOverlay: PasswordsRemoveAllOverlay
  };

});

</script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

cr.define('options', function() {

  var OptionsPage = options.OptionsPage;

  //
  // PersonalOptions class
  // Encapsulated handling of personal options page.
  //
  function PersonalOptions() {
    OptionsPage.call(this, 'personal', templateData.personalPage,
                     'personalPage');
  }

  cr.addSingletonGetter(PersonalOptions);

  PersonalOptions.prototype = {
    // Inherit PersonalOptions from OptionsPage.
    __proto__: options.OptionsPage.prototype,

    // Initialize PersonalOptions page.
    initializePage: function() {
      // Call base class implementation to starts preference initialization.
      OptionsPage.prototype.initializePage.call(this);

      $('sync-customize').onclick = function(event) {
        OptionsPage.showPageByName('sync');
      };
      $('start-sync').onclick = function(event) {
        //TODO(sargrass): Show start-sync subpage, after dhg done.
      };

      // Listen to pref changes.
      Preferences.getInstance().addEventListener('sync.has_setup_completed',
          function(event) {
            if(event.value) {
              chrome.send('getSyncStatus');
              $('synced-controls').classList.remove('hidden');
              $('not-synced-controls').classList.add('hidden');
            } else {
              $('synced-controls').classList.add('hidden');
              $('not-synced-controls').classList.remove('hidden');
            }
          });

      $('showpasswords').onclick = function(event) {
        PasswordsExceptions.load();
        OptionsPage.showPageByName('passwordsExceptions');
        OptionsPage.showTab($('passwords-nav-tab'));
        chrome.send('coreOptionsUserMetricsAction',
            ['Options_ShowPasswordsExceptions']);
      };

      $('autofill_options').onclick = function(event) {
        OptionsPage.showPageByName('autoFillOptions');
        chrome.send('coreOptionsUserMetricsAction',
            ['Options_ShowAutoFillSettings']);
      };

      if (!cr.isChromeOS) {
        $('stop-sync').onclick = function(event) {
          OptionsPage.showOverlay('stopSyncingOverlay');
        };
        $('import_data').onclick = function(event) {
          ImportDataOverlay.loadImporter();
          OptionsPage.showOverlay('importDataOverlay');
          chrome.send('coreOptionsUserMetricsAction', ['Import_ShowDlg']);
        };
      }

      if(!cr.isChromeOS && navigator.platform.match(/linux|BSD/i)) {
        $('themes_GTK_button').onclick = function(event) {
          chrome.send('themesSetGTK');
        };

        $('themes_set_classic').onclick = function(event) {
          chrome.send('themesReset');
        };
        $('themes-gallery').onclick = function(event) {
          chrome.send('themesGallery');
        }
      }

      if(cr.isMac || cr.isWindows || cr.isChromeOS) {
        $('themes_reset').onclick = function(event) {
          chrome.send('themesReset');
        };
        $('themes-gallery').onclick = function(event) {
          chrome.send('themesGallery');
        }
      }
    },

    syncStatusCallback_: function(statusString) {
      $('synced_to_user_with_time').textContent = statusString;
    },
  };

  PersonalOptions.syncStatusCallback = function(statusString) {
    PersonalOptions.getInstance().syncStatusCallback_(statusString);
  };

  // Export
  return {
    PersonalOptions: PersonalOptions
  };

});

</script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

cr.define('options', function() {
  const OptionsPage = options.OptionsPage;
  const ArrayDataModel = cr.ui.ArrayDataModel;
  const ListSingleSelectionModel = cr.ui.ListSingleSelectionModel;

  /**
   * Encapsulated handling of search engine management page.
   * @constructor
   */
  function SearchEngineManager() {
    this.activeNavTab = null;
    OptionsPage.call(this, 'searchEngines',
                     templateData.searchEngineManagerPage,
                     'searchEngineManagerPage');
  }

  cr.addSingletonGetter(SearchEngineManager);

  SearchEngineManager.prototype = {
    __proto__: OptionsPage.prototype,
    list_: null,

    initializePage: function() {
      OptionsPage.prototype.initializePage.call(this);

      this.list_ = $('searchEngineList')
      options.search_engines.SearchEngineList.decorate(this.list_);
      var selectionModel = new ListSingleSelectionModel
      this.list_.selectionModel = selectionModel;

      selectionModel.addEventListener('change',
          cr.bind(this.selectionChanged_, this));

      var self = this;
      $('addSearchEngineButton').onclick = function(event) {
        chrome.send('editSearchEngine', ["-1"]);
        OptionsPage.showOverlay('editSearchEngineOverlay');
      };
      $('removeSearchEngineButton').onclick = function(event) {
        chrome.send('removeSearchEngine', [self.selectedModelIndex_]);
      };
      $('editSearchEngineButton').onclick = function(event) {
        chrome.send('editSearchEngine', [self.selectedModelIndex_]);
        OptionsPage.showOverlay('editSearchEngineOverlay');
      };
      $('makeDefaultSearchEngineButton').onclick = function(event) {
        chrome.send('managerSetDefaultSearchEngine',
                    [self.selectedModelIndex_]);
      };

      // Remove Windows-style accelerators from button labels.
      // TODO(stuartmorgan): Remove this once the strings are updated.
      $('addSearchEngineButton').textContent =
          localStrings.getStringWithoutAccelerator('addSearchEngineButton');
      $('removeSearchEngineButton').textContent =
          localStrings.getStringWithoutAccelerator('removeSearchEngineButton');

      this.addEventListener('visibleChange', function(event) {
          $('searchEngineList').redraw();
      });
    },

    /**
     * Updates the search engine list with the given entries.
     * @private
     * @param {Array} engineList List of available search engines.
     */
    updateSearchEngineList_: function(engineList) {
      this.list_.dataModel = new ArrayDataModel(engineList);
    },

    /**
     * Returns the currently selected list item's underlying model index.
     * @private
     */
    get selectedModelIndex_() {
      var listIndex = this.list_.selectionModel.selectedIndex;
      return this.list_.dataModel.item(listIndex)['modelIndex'];
    },

    /**
     * Callback from the selection model when the selection changes.
     * @private
     * @param {!cr.Event} e Event with change info.
     */
    selectionChanged_: function(e) {
      var selectedIndex = this.list_.selectionModel.selectedIndex;
      var engine = selectedIndex != -1 ?
          this.list_.dataModel.item(selectedIndex) : null;

      $('removeSearchEngineButton').disabled =
          !(engine && engine['canBeRemoved']);
      $('editSearchEngineButton').disabled = engine == null;
      $('makeDefaultSearchEngineButton').disabled =
          !(engine && engine['canBeDefault']);
    },
  };

  SearchEngineManager.updateSearchEngineList = function(engineList) {
    SearchEngineManager.getInstance().updateSearchEngineList_(engineList);
  };

  // Export
  return {
    SearchEngineManager: SearchEngineManager
  };

});

</script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

cr.define('options.search_engines', function() {
  const List = cr.ui.List;
  const ListInlineHeaderSelectionController =
      options.ListInlineHeaderSelectionController;
  const ListItem = cr.ui.ListItem;

  /**
   * Creates a new search engine list item.
   * @param {Object} searchEnigne The search engine this represents.
   * @constructor
   * @extends {cr.ui.ListItem}
   */
  function SearchEngineListItem(searchEngine) {
    var el = cr.doc.createElement('div');
    el.searchEngine_ = searchEngine;
    SearchEngineListItem.decorate(el);
    return el;
  }

  /**
   * Decorates an element as a search engine list item.
   * @param {!HTMLElement} el The element to decorate.
   */
  SearchEngineListItem.decorate = function(el) {
    el.__proto__ = SearchEngineListItem.prototype;
    el.decorate();
  };

  SearchEngineListItem.prototype = {
    __proto__: ListItem.prototype,

    /** @inheritDoc */
    decorate: function() {
      ListItem.prototype.decorate.call(this);

      var engine = this.searchEngine_;
      if (engine['heading']) {
        var titleEl = this.ownerDocument.createElement('div');
        titleEl.textContent = engine['heading'];
        this.classList.add('heading');
        this.appendChild(titleEl);
      } else {
        var nameEl = this.ownerDocument.createElement('div');
        nameEl.className = 'name';
        nameEl.classList.add('favicon-cell');
        nameEl.textContent = engine['name'];
        nameEl.style.backgroundImage = url('chrome://favicon/iconurl/' +
                                           engine['iconURL']);

        var keywordEl = this.ownerDocument.createElement('div');
        keywordEl.className = 'keyword';
        keywordEl.textContent = engine['keyword'];

        this.appendChild(nameEl);
        this.appendChild(keywordEl);

        if (engine['default'])
          this.classList.add('default');
      }
    },
  };

  var SearchEngineList = cr.ui.define('list');

  SearchEngineList.prototype = {
    __proto__: List.prototype,

    /** @inheritDoc */
    createItem: function(searchEngine) {
      return new SearchEngineListItem(searchEngine);
    },

    /** @inheritDoc */
    createSelectionController: function(sm) {
      return new ListInlineHeaderSelectionController(sm, this);
    },

    /**
     * Returns true if the given item is selectable.
     * @param {number} index The index to check.
     */
    canSelectIndex: function(index) {
      return !this.dataModel.item(index).hasOwnProperty('heading');
    }
  };

  // Export
  return {
    SearchEngineList: SearchEngineList
  };

});

</script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

cr.define('options', function() {

  var OptionsPage = options.OptionsPage;

  /**
   * StopSyncingOverlay class
   * Encapsulated handling of the 'Stop Syncing This Account' overlay page.
   * @class
   */
  function StopSyncingOverlay() {
    OptionsPage.call(this, 'stopSyncingOverlay',
                     templateData.stop_syncing_title,
                     'stopSyncingOverlay');
  }

  cr.addSingletonGetter(StopSyncingOverlay);

  StopSyncingOverlay.prototype = {
    // Inherit StopSyncingOverlay from OptionsPage.
    __proto__: OptionsPage.prototype,

    /**
     * Initialize the page.
     */
    initializePage: function() {
      // Call base class implementation to starts preference initialization.
      OptionsPage.prototype.initializePage.call(this);

      $('stop-syncing-cancel').onclick = function(e) {
        OptionsPage.clearOverlays();
      }

      $('stop-syncing-confirm').onclick = function(e) {
        chrome.send('stopSyncing');
        OptionsPage.clearOverlays();
      }
    }
  };

  // Export
  return {
    StopSyncingOverlay: StopSyncingOverlay
  };

});

</script>
<script>

var AddStartupPageOverlay = options.AddStartupPageOverlay;
var AdvancedOptions = options.AdvancedOptions;
var AlertOverlay = options.AlertOverlay;
var AutoFillEditAddressOverlay = options.AutoFillEditAddressOverlay;
var AutoFillEditCreditCardOverlay = options.AutoFillEditCreditCardOverlay;
var AutoFillOptions = options.AutoFillOptions;
var BrowserOptions = options.BrowserOptions;
var ClearBrowserDataOverlay = options.ClearBrowserDataOverlay;
var ContentSettings = options.ContentSettings;
var CookiesView = options.CookiesView;
var EditSearchEngineOverlay = options.EditSearchEngineOverlay;
var FontSettingsOverlay = options.FontSettingsOverlay;
var ImportDataOverlay = options.ImportDataOverlay;
var OptionsPage = options.OptionsPage;
var PasswordsExceptions = options.PasswordsExceptions;
var PersonalOptions = options.PersonalOptions;
var Preferences = options.Preferences;
var SearchEngineManager = options.SearchEngineManager;
var StopSyncingOverlay = options.StopSyncingOverlay;
var ProxyOptions = options.ProxyOptions;
var PasswordsRemoveAllOverlay = options.PasswordsRemoveAllOverlay;

/**
 * Window onload handler, sets up the page.
 */
function load() {
  var start = new Date();

  localStrings = new LocalStrings();

  if (cr.isChromeOS) {
    OptionsPage.registerSubPage(AboutPage.getInstance());
    OptionsPage.register(SystemOptions.getInstance());
    OptionsPage.register(InternetOptions.getInstance());
  }

  OptionsPage.register(BrowserOptions.getInstance());
  OptionsPage.register(PersonalOptions.getInstance());
  OptionsPage.register(AdvancedOptions.getInstance());
  OptionsPage.registerSubPage(AutoFillOptions.getInstance());
  OptionsPage.registerSubPage(ContentSettings.getInstance());
  OptionsPage.registerSubPage(CookiesView.getInstance());
  OptionsPage.registerSubPage(PasswordsExceptions.getInstance());
  OptionsPage.registerSubPage(SearchEngineManager.getInstance());
  OptionsPage.registerOverlay(AddStartupPageOverlay.getInstance());
  OptionsPage.registerOverlay(AlertOverlay.getInstance());
  OptionsPage.registerOverlay(AutoFillEditAddressOverlay.getInstance());
  OptionsPage.registerOverlay(AutoFillEditCreditCardOverlay.getInstance());
  OptionsPage.registerOverlay(ClearBrowserDataOverlay.getInstance());
  OptionsPage.registerOverlay(EditSearchEngineOverlay.getInstance());
  OptionsPage.registerOverlay(FontSettingsOverlay.getInstance());
  OptionsPage.registerOverlay(ImportDataOverlay.getInstance());
  OptionsPage.registerOverlay(StopSyncingOverlay.getInstance());
  OptionsPage.registerOverlay(PasswordsRemoveAllOverlay.getInstance());

  if (cr.isChromeOS) {
    OptionsPage.register(AccountsOptions.getInstance());
    var labsOptions = new OptionsPage('labs',
                                      localStrings.getString('labsPage'),
                                      'labsPage');
    OptionsPage.register(labsOptions);
    OptionsPage.registerSubPage(LanguageOptions.getInstance());
    OptionsPage.registerSubPage(new OptionsPage(
        'languageChewing',
        localStrings.getString('languageChewingPage'),
        'languageChewingPage'));
    OptionsPage.registerSubPage(new OptionsPage(
        'languageHangul',
        localStrings.getString('languageHangulPage'),
        'languageHangulPage'));
    OptionsPage.registerSubPage(new OptionsPage(
        'languageMozc',
        localStrings.getString('languageMozcPage'),
        'languageMozcPage'));
    OptionsPage.registerSubPage(new OptionsPage(
        'languagePinyin',
        localStrings.getString('languagePinyinPage'),
        'languagePinyinPage'));
    OptionsPage.registerSubPage(ProxyOptions.getInstance());
  }

  var syncSettings = new OptionsPage('sync',
                                     localStrings.getString('syncPage'),
                                     'syncPage');
  OptionsPage.registerSubPage(syncSettings);
  var languageModifierKeysOverlay = new OptionsPage(
      'languageCustomizeModifierKeysOverlay',
      localStrings.getString('languageCustomizeModifierKeysOverlay'),
      'languageCustomizeModifierKeysOverlay')
  OptionsPage.registerOverlay(languageModifierKeysOverlay);

  Preferences.getInstance().initialize();
  OptionsPage.initialize();

  var path = document.location.pathname;

  if (path.length > 1) {
    OptionsPage.showPageByName(path.slice(1));
  } else {
    // TODO(csilv): Save/restore last selected page.
    if (cr.isChromeOS) {
      OptionsPage.showPageByName(SystemOptions.getInstance().name);
    } else {
      OptionsPage.showPageByName(BrowserOptions.getInstance().name);
    }
  }

  var subpagesNavTabs = document.querySelectorAll('.subpages-nav-tabs');
  for(var i = 0; i < subpagesNavTabs.length; i++) {
    subpagesNavTabs[i].onclick = function(event) {
      OptionsPage.showTab(event.srcElement);
    }
  }
  var end = new Date();
  var total = end - start;
  console.log('time took to run load():'+ total);
}

document.addEventListener('DOMContentLoaded', load);

window.onpopstate = function(e) {
  options.OptionsPage.setState(e.state);
};
</script>

</head>
<body i18n-values=".style.fontFamily:fontfamily;.style.fontSize:fontsize">
<div class="header">
</div>
<div id="overlay" class="overlay hidden">
  <div class="page hidden" id="addStartupPageOverlay">
  <h1 i18n-content="addStartupPageTitle"></h1>

  <form id="addStartupPageForm">
    <label id="addURLBlock"><span
        i18n-content="addStartupPageURLLabel"></span>
      <input type="url" id="addStartupPageURL"></label>

    <list id="addStartupRecentPageList"></list>

    <div class="button-strip">
      
      <button type="reset"
          i18n-content="addStartupPageCancelButton"></button>
      <button type="submit" id="addStartupPageAddButton" disabled
            i18n-content="addStartupPageAddButton"></button>
    </div>
  </form>
</div>

  <div class="page hidden" id="alertOverlay">
  <div id="alertOverlayMessage"></div>
  <div class="button-strip">
    <button type="submit" id="alertOverlayOk"></button>
    <button type="reset" id="alertOverlayCancel"></button>
    
  </div>
</div>

  <div class="page hidden" id="autoFillEditAddressOverlay">
  <h1 id="autoFillAddressTitle"></h1>

  <div><label id="fullNameLabel"><span i18n-content="fullNameLabel"></span><br>
      <input type="text" id="fullName"></label></div>
  <div><label id="companyNameLabel"><span i18n-content="companyNameLabel">
      </span><br><input type="text" id="companyName"></label></div>
  <div><label id="addrLine1Label"><span i18n-content="addrLine1Label"></span>
      <br><input type="text" id="addrLine1"></label></div>
  <div><label id="addrLine2Label"><span i18n-content="addrLine2Label"></span>
      <br><input type="text" id="addrLine2"></label></div>

  <div>
    <table>
      <tr>
        <td><label id="cityLabel" for="city"><span i18n-content="cityLabel">
            </span></label></td>
        <td><label id="stateLabel" for="state">
            <span i18n-content="stateLabel"></span></label></td>
        <td><label id="zipCodeLabel" for="zipCode">
            <span i18n-content="zipCodeLabel"></span></label></td>
      </tr>
      <tr>
        <td><input type="text" id="city"></td>
        <td><input type="text" id="state"></td>
        <td><input type="text" id="zipCode"></td>
      </tr>
    </table>
  </div>

  <div><label id="countryLabel"><span i18n-content="countryLabel"></span><br>
      <input type="text" id="country"></label></div>

  <div>
    <table>
      <tr>
        <td><label id="phoneLabel" for="phone">
            <span i18n-content="phoneLabel"></span></label></td>
        <td><label id="faxLabel" for="fax">
            <span i18n-content="faxLabel"></span></label></td>
      </tr>
      <tr>
        <td><input type="text" id="phone"></td>
        <td><input type="text" id="fax"></td>
      </tr>
    </table>
  </div>

  <div><label id="emailLabel"><span i18n-content="emailLabel"></span><br>
      <input type="text" id="email"></label></div>

  <div class="button-strip">
    <button type="submit" id="autoFillEditAddressApplyButton" disabled
        i18n-content="ok"></button>
    <button type="reset" id="autoFillEditAddressCancelButton"
        i18n-content="cancel"></button>
  </div>
</div>

  <div class="page hidden" id="autoFillEditCreditCardOverlay">
  <h1 id="autoFillCreditCardTitle"></h1>

  <div>
    <label id="nameOnCardLabel">
      <span i18n-content="nameOnCardLabel"></span><br>
      <input type="text" id="nameOnCard">
    </label>
  </div>

  <div>
    <label id="billingAddressLabel">
      <span i18n-content="billingAddressLabel"></span><br>
      <select id="billingAddress"></select>
    </label>
  </div>

  <div>
    <label id="creditCardNumberLabel">
      <span i18n-content="creditCardNumberLabel"></span><br>
      <input type="text" id="creditCardNumber">
    </label>
  </div>

  <div>
    <label id="creditCardExpirationDateLabel">
      <span i18n-content="creditCardExpirationDateLabel"></span><br>
      <select id="expirationMonth"></select>
      <select id="expirationYear"></select>
    </label>
  </div>

  <div class="button-strip">
    <button type="submit" id="autoFillEditCreditCardApplyButton" disabled
        i18n-content="ok"></button>
    <button type="reset" id="autoFillEditCreditCardCancelButton"
        i18n-content="cancel"></button>
  </div>
</div>

  <div class="page hidden" id="clearBrowserDataOverlay">
  <h1 i18n-content="clearBrowsingDataTitle"></h1>
  <h3 i18n-content="clearBrowsingDataLabel"></h3>
  <div id="checkboxListData">
    <label>
      <input id="deleteBrowsingHistoryCheckbox"
             pref="browser.clear_data.browsing_history" type="checkbox">
      <span i18n-content="deleteBrowsingHistoryCheckbox"></span>
    </label>
    <label>
      <input id="deleteDownloadHistoryCheckbox"
             pref="browser.clear_data.download_history" type="checkbox">
      <span i18n-content="deleteDownloadHistoryCheckbox"></span>
    </label>
    <label>
      <input id="deleteCacheCheckbox"
             pref="browser.clear_data.cache" type="checkbox">
      <span i18n-content="deleteCacheCheckbox"></span>
    </label>
    <label>
      <input id="deleteCookiesCheckbox"
             pref="browser.clear_data.cookies" type="checkbox">
      <span i18n-content="deleteCookiesCheckbox"></span>
    </label>
    <label>
      <input id="deletePasswordsCheckbox"
             pref="browser.clear_data.passwords" type="checkbox">
      <span i18n-content="deletePasswordsCheckbox"></span>
    </label>
    <label>
      <input id="deleteFormDataCheckbox"
             pref="browser.clear_data.form_data" type="checkbox">
      <span i18n-content="deleteFormDataCheckbox"></span>
    </label>
  </div>
  <div>
    <div>
      <label>
        <span i18n-content="clearBrowsingDataTimeLabel"></span>
        <select id="clearBrowsingDataTimePeriod"
                pref="browser.clear_data.time_period"></select>
      </label>
    </div>
    <span id="cbdThrobber"></span>
    
    <button id="clearBrowsingDataDismiss" i18n-content="cancel"
            onclick="ClearBrowserDataOverlay.dismiss();">
    </button>
    <button id="clearBrowsingDataCommit"
              i18n-content="clearBrowsingDataCommit"></button>
  </div>
  <hr>
  <a target="_blank" i18n-content="flash_storage_settings"
      i18n-values="href:flash_storage_url"></a>
</div>

  <div class="page hidden" id="editSearchEngineOverlay">
  <h1 i18n-content="editSearchEngineTitle"></h1>

  <form id="editSearchEngineForm">
    <table>
      <tr>
        <td><label for="editSearchEngineName"><span
            i18n-content="editSearchEngineNameLabel"></span></label></td>
        <td><input type="text" id="editSearchEngineName"></td>
        <td><div id="editSearchEngineNameValidity"
            class="alert-badge">&nbsp;</div></td>
      </tr>
      <tr>
        <td><label for="editSearchEngineKeyword"><span
            i18n-content="editSearchEngineKeywordLabel"></span></label></td>
        <td><input type="text" id="editSearchEngineKeyword"></td>
        <td><div id="editSearchEngineKeywordValidity"
            class="alert-badge">&nbsp;</div></td>
      </tr>
      <tr>
        <td><label for="editSearchEngineURL"><span
            i18n-content="editSearchEngineURLLabel"></span></label></td>
        <td><input type="url" id="editSearchEngineURL"></td>
        <td><div id="editSearchEngineURLValidity"
            class="alert-badge">&nbsp;</div></td>
      </tr>
      <tr>
        <td></td>
        <td><span i18n-content="editSearchEngineURLExplanation"><span></td>
        <td></td>
    </table>

    <div class="button-strip">
      
      <button type="reset"
          i18n-content="editSearchEngineCancelButton"></button>
      <button type="submit" id="editSearchEngineOkayButton" disabled
            i18n-content="editSearchEngineOkayButton"></button>
    </div>
  </form>
</div>

  <div class="page hidden" id="fontSettingsOverlay">
  <h1 i18n-content="fontSettingsTitle"></h1>
  <section>
    <h3 i18n-content="fontSettingsFontTitle"></h3>
    <div>
      <div>
        <label style="display:inline;">
          <span i18n-content="fontSettingsSerifLabel"></span>
          <select id="fontSettingsSerifSelector"
              pref="webkit.webprefs.serif_font_family"
              metric="Options_ChangeSerifFont"></select>
        </label>
        <label style="display:inline;">
          <span i18n-content="fontSettingsSizeLabel"></span>
          <select id="fontSettingsSerifSizeSelector"
              pref="webkit.webprefs.default_font_size"
              metric="Options_ChangeSerifFontSize"></select>
        </label>
        <div id="fontSettingsSerifPreview"></div>
      </div>
      <div>
        <label style="display:inline;">
          <span i18n-content="fontSettingsSansSerifLabel"></span>
          <select id="fontSettingsSansSerifSelector"
              pref="webkit.webprefs.sansserif_font_family"
              metric="Options_ChangeSansSerifFont"></select>
        </label>
        <label style="display:inline;">
          <span i18n-content="fontSettingsSizeLabel"></span>
          <select id="fontSettingsSansSerifSizeSelector"
              pref="webkit.webprefs.default_font_size"
              metric="Options_ChangeSansSerifFontSize"></select>
        </label>
        <div id="fontSettingsSansSerifPreview"></div>
      </div>
      <div>
        <label style="display:inline;">
          <span i18n-content="fontSettingsFixedWidthLabel"></span>
          <select id="fontSettingsFixedWidthSelector"
              pref="webkit.webprefs.fixed_font_family"
              metric="Options_ChangeFixedFont"></select>
        </label>
        <label style="display:inline;">
          <span i18n-content="fontSettingsSizeLabel"></span>
          <select id="fontSettingsFixedWidthSizeSelector"
              pref="webkit.webprefs.default_fixed_font_size"
              metric="Options_ChangeFixedFontSize"></select>
        </label>
        <div id="fontSettingsFixedWidthPreview"></div>
      </div>
    </div>
  </section>
  <section>
    <h3 i18n-content="fontSettingsEncodingTitle"></h3>
    <div>
      <label style="display:inline;">
        <span i18n-content="fontSettingsEncodingLabel"></span>
        <select id="fontSettingsEncodingSelector"
            pref="intl.charset_default" metric="Options_ChangeFontEncoding">
        </select>
      </label>
    </div>
  </section>
  <div>
    <button id="fontSettingsDismissButton" i18n-content="close"
        onclick="OptionsPage.clearOverlays();"></button>
  </div>
</div>

  <div class="page hidden" id="importDataOverlay">
  <h1 i18n-content="import_data_title"></h1>
  <div>
    <span i18n-content="import_from_label"></span>
    <select id="supported-browsers"></select>
  </div>
  <div id="checkboxList">
    <div i18n-content="import_description"></div>
    <label>
      <input id="import-favorites" type="checkbox">
      <span i18n-content="import_favorites">
    </label><br>
    <label>
      <input id="import-search" type="checkbox">
      <span i18n-content="import_search">
    </label><br>
    <label>
      <input id="import-passwords" type="checkbox">
      <span i18n-content="import_passwords">
    </label><br>
    <label>
      <input id="import-history" type="checkbox">
      <span i18n-content="import_history">
    </label><br>
  </div>
  
    <button id="import-data-cancel" i18n-content="cancel"
            onclick="ImportDataOverlay.dismiss();"></button>
  <button id="import-data-commit" i18n-content="import_commit"></button>
  <span id="import-throbber"></span>
</div>

  <div class="page hidden" id="stopSyncingOverlay">
  <h1 i18n-content="stop_syncing_title"></h1>

  <div i18n-content="stop_syncing_explanation"></div>
  <button id="stop-syncing-cancel" i18n-content="cancel"></button>
  <button id="stop-syncing-confirm"
      i18n-content="stop_syncing_confirm"></button>
</div>

  <div class="page hidden" id="passwordsRemoveAllOverlay">
  <h1 i18n-content="remove_all_title"></h1>

  <div i18n-content="remove_all_explanation"></div>
  <button id="remove-all-cancel" i18n-content="remove_all_no"></button>
  <button id="remove-all-confirm" i18n-content="remove_all_yes"></button>
</div>

  
</div>
<div id="main-content">
  <div id="navbar-container">
     <h1 id="settings-title" i18n-content="title"></h1>
     <ul id="navbar">
     </ul>
     <hr/>
     <ul id="subpagesnav">
     </ul>
  </div>
  <div id="mainview">
     <div class="hidden" id="managed-prefs-banner">
       <span id="managed-prefs-icon"></span>
       <span i18n-content="managedPrefsBannerText"></span>
     </div>
     <div id="mainview-content">
       
       <div class="page hidden" id="advancedPage">
  <h1 i18n-content="advancedPage"></h1>
  <section>
    <h3 i18n-content="advancedSectionTitlePrivacy"></h3>
    <div>
      <div>
        <button id="privacyContentSettingsButton"
            i18n-content="privacyContentSettingsButton"></button>
        <button id="privacyClearDataButton"
            i18n-content="privacyClearDataButton"></button>
      </div>
      <div i18n-content="disableServices"></div>
      <div><a target="_blank" i18n-content="privacyLearnMoreLabel"
          i18n-values="href:privacyLearnMoreURL"></a></div>
      <label><input id="alternateErrorPagesEnabled"
          pref="alternate_error_pages.enabled"
          metric="Options_LinkDoctorCheckbox" type="checkbox"><span
          i18n-content="linkDoctorPref"></span></label>
      <label><input id="searchSuggestEnabled"
          pref="search.suggest_enabled" metric="Options_UseSuggestCheckbox"
          type="checkbox"><span i18n-content="suggestPref"></span></label>
      <label><input id="dnsPrefetchingEnabled"
          pref="dns_prefetching.enabled" metric="Options_DnsPrefetchCheckbox"
          type="checkbox"><span
          i18n-content="networkDNSPrefetchEnabledDescription"></span></label>
      <label><input id="safeBrowsingEnabled"
          pref="safebrowsing.enabled" metric="Options_SafeBrowsingCheckbox"
          type="checkbox"><span i18n-content="safeBrowsingEnableProtection">
          </span></label>
<label><input id="metricsReportingEnabled"
          pref="user_experience_metrics.reporting_enabled"
          metric="Options_MetricsReportingCheckbox" type="checkbox">
          <span i18n-content="enableLogging"></span></label>
    </div>
  </section>
  <section>
    <h3 i18n-content="advancedSectionTitleNetwork"></h3>
    <div>
      <div id="proxiesLabel"></div>
      <button id="proxiesConfigureButton"
          i18n-content="proxiesConfigureButton"></button>
    </div>
  </section>
  <section>
    <h3 i18n-content="advancedSectionTitleTranslate"></h3>
    <div>
      <label><input id="enableTranslate"
          pref="translate.enabled" metric="Options_Translate" type="checkbox">
          <span i18n-content="translateEnableTranslate"></span></label>
    </div>
  </section>
  <section>
    <h3 i18n-content="downloadLocationGroupName"></h3>
    <div>
<div i18n-content="downloadLocationBrowseTitle"></div>
      <div>
        <input id="downloadLocationPath" type="text" size="60" disabled>
        <button id="downloadLocationBrowseButton"
            i18n-content="downloadLocationBrowseButton"></button>
      </div>
      <label><input id="promptForDownload"
          pref="download.prompt_for_download"
          metric="Options_AskForSaveLocation" type="checkbox"><span
          i18n-content="downloadLocationAskForSaveLocation"></span></label>
      <div i18n-content="autoOpenFileTypesInfo"></div>
      <div><button id="autoOpenFileTypesResetToDefault"
          i18n-content="autoOpenFileTypesResetToDefault"></button></div>
    </div>
  </section>
  <section>
    <h3 i18n-content="advancedSectionTitleContent"></h3>
    <div>

      <div><button id="fontSettingsConfigureFontsOnlyButton"
          i18n-content="fontSettingsConfigureFontsOnlyButton"></button></div>

    </div>
  </section>
<section>
    <h3 i18n-content="advancedSectionTitleSecurity"></h3>
    <div>
      <div i18n-content="certificatesLabel"></div>
      <div><button id="certificatesManageButton"
          i18n-content="certificatesManageButton"></button></div>

<!-- Configure these options for Linux/BSD as preference keys -->
      <label><input id="sslCheckRevocation"
          pref="ssl.rev_checking.enabled" metric="Options_CheckCertRevocation"
          type="checkbox"><span i18n-content="sslCheckRevocation"></span>
          </label>
      <label><input id="sslUseSSL2"
          pref="ssl.ssl2.enabled" metric="Options_SSL2" type="checkbox"><span
          i18n-content="sslUseSSL2"></span></label>
      <label><input id="sslUseSSL3"
          pref="ssl.ssl3.enabled" metric="Options_SSL3" type="checkbox"><span
          i18n-content="sslUseSSL3"></span></label>
      <label><input id="sslUseTLS1"
          pref="ssl.tls1.enabled" metric="Options_TLS1" type="checkbox"><span
          i18n-content="sslUseTLS1"></span></label>
</div>
  </section>
  <div class="button-strip">
    <button id="optionsReset" i18n-content="optionsReset"></button>
  </div>
</div>

       <div class="page hidden" id="autoFillOptionsPage">
  <h1>
    <span i18n-content="personalPage"></span>
    &gt;
    <span i18n-content="autoFillOptionsTitle"></span>
  </h1>

  <div class="autofill-section">
    <label><input id="autoFillEnabled" pref="autofill.enabled"
        metric="Options_FormAutofill" type="checkbox">
        <span i18n-content="autoFillEnabled"></span></label>
  </div>

  <div class="autofill-section" id="profileSelectContainer">
    <div id="profileSelectLeftColumn">
      <select id="profileList" size="10">
        <option value="addressesHeader" disabled
            i18n-content="addressesHeader"></option>
        <option value="addressesHorizontalRule" disabled></option>
        <option value="addressesBlankOption" disabled></option>
        <option value="creditCardsHeader" disabled
            i18n-content="creditCardsHeader"></option>
        <option value="creditCardsHorizontalRule" disabled></option>
      </select>
    </div>
    <div id="profileSelectRightColumn">
      <div><button id="addAddressButton" i18n-content="addAddressButton">
          </button></div>
      <div><button id="addCreditCardButton" i18n-content="addCreditCardButton">
          </button></div>
      <div><button id="autoFillEditButton" i18n-content="editButton">
          </button></div>
      <div><button id="autoFillRemoveButton" i18n-content="deleteButton">
          </button></div>
    </div>
  </div>

  <div class="autofill-section">
    <a href="http://www.google.com/support/chrome/bin/answer.py?answer=142893"
        target=”_blank” i18n-content="helpButton"></a>
  </div>
</div>

       <div class="page hidden" id="browserPage">
  <h1 i18n-content="browserPage"></h1>
  <section>
    <h3 i18n-content="startupGroupName"></h3>
    <div>
      <label><input type="radio" name="startup"
          pref="session.restore_on_startup" value="0"
          metric="Options_Startup_Homepage">
          <span i18n-content="startupShowDefaultAndNewTab"></span></label>
      <label><input type="radio" name="startup"
          pref="session.restore_on_startup" value="1"
          metric="Options_Startup_LastSession">
          <span i18n-content="startupShowLastSession"></span></label>
      <label><input type="radio" name="startup" id="startupShowPagesButton"
          pref="session.restore_on_startup" value="4"
          metric="Options_Startup_Custom">
          <span i18n-content="startupShowPages"></span></label>
      <div class="suboption">
        <div class="left-side-table">
          <div>
            <list id="startupPages"></list>
          </div>
          <div>
            <div><button id="startupAddButton"
                i18n-content="startupAddButton"></button></div>
            <div><button id="startupRemoveButton"
                i18n-content="startupRemoveButton"></button></div>
            <div><button id="startupUseCurrentButton"
                i18n-content="startupUseCurrent"></button></div>
          </div>
        </div>
      </div>
    </div>
  </section>
  <section>
    <h3 i18n-content="homepageGroupName"></h3>
    <div>
      <label><input type="radio" name="homepage"
          pref="homepage_is_newtabpage" value="true"
          metric="Options_Homepage_IsNewTabPage">
          <span i18n-content="homepageUseNewTab"></span></label>
      <label><input type="radio" name="homepage" id="homepageUseURLButton"
          pref="homepage_is_newtabpage" value="false"
          metric="Options_Homepage_IsNewTabPage">
          <span i18n-content="homepageUseURL"></span></label>
      <div class="suboption">
        <input id="homepageURL" type="url" pref="homepage">
      </div>
      <div class="option">
        <label><input id="homepageShowButton"
            pref="browser.show_home_button"
            metric="Options_Homepage_HomeButton" type="checkbox">
            <span i18n-content="homepageShowButton"></span></label>
      </div>
    </div>
  </section>
  <section>
    <h3 i18n-content="defaultSearchGroupName"></h3>
    <div id="defaultSearchEngineGroup">
      <select id="defaultSearchEngine"
          onchange="BrowserOptions.getInstance().setDefaultSearchEngine()">
      </select>
      <button id="defaultSearchManageEnginesButton"
          i18n-content="defaultSearchManageEnginesLink"></button>
    </div>
  </section>
<section>
    <h3 i18n-content="defaultBrowserGroupName"></h3>
    <div>
      <div id="defaultBrowserState"
          i18n-content="defaultBrowserUnknown"></div>
      <button id="defaultBrowserUseAsDefaultButton"
          i18n-content="defaultBrowserUseAsDefault"></button>
    </div>
  </section>
</div>

       <div class="page hidden" id="contentSettingsPage">
  <h1>
    <span i18n-content="advancedPage"></span>
    &gt;
    <span i18n-content="contentSettingsPage"></span>
  </h1>

  <!-- Navigation tabs -->
  <div class="subpages-nav-tabs">
    <span i18n-content="cookies_tab_label" id="cookies-nav-tab"
          class="inactive-tab" tab-contents="cookiesFilterTab"></span><span
          i18n-content="images_tab_label" id="images-nav-tab"
          class="inactive-tab" tab-contents="imagesFilterTab"></span><span
          i18n-content="javascript_tab_label" id="javascript-nav-tab"
          class="inactive-tab" tab-contents="javascriptFilterTab"></span><span
          i18n-content="plugins_tab_label" id="plugins-nav-tab"
          class="inactive-tab" tab-contents="pluginsFilterTab"></span><span
          i18n-content="popups_tab_label" id="popups-nav-tab"
          class="inactive-tab" tab-contents="popupsFilterTab"></span><span
          i18n-content="location_tab_label" id="location-nav-tab"
          class="inactive-tab" tab-contents="locationFilterTab"></span><span 
          i18n-content="notifications_tab_label" id="notifications-nav-tab"
          class="inactive-tab" tab-contents="notificationsFilterTab"></span>
  </div>
  <br>

  <!-- Cookie filter tab contents -->
  <div id="cookiesFilterTab" class="subpages-tab-contents">
    <h4 i18n-content="cookies_modify" class="contentSettingsHeader"></h4>
    <table class="option-control-table">
    <tr>
      <td class="option-name"><label>
        <input type="radio" name="cookies" value="allow">
          <span i18n-content="cookies_allow"></span>
      </label></td>
    </tr>
    <tr>
      <td class="option-name" id='cookiesAskRadio'><label>
        <input type="radio" name="cookies" value="ask">
          <span i18n-content="cookies_ask"></span>
      </label></td>
    </tr>
    <tr>
      <td class="option-name"><label>
        <input type="radio" name="cookies" value="block">
         <span i18n-content="cookies_block"></span>
      </label></td>
    </tr>
    </table>

    <div class="exceptionsLink" i18n-content="content_exceptions"></div>
    <div id="cookiesExceptionsArea" contentType="cookies">
      <list id="cookiesExceptionsList"></list>
    </div>

    <table class="option-control-table">
    <tr>
       <td class="option-name"><label>
         <input id="block-third-party-cookies" type="checkbox">
           <span i18n-content="cookies_block_3rd_party"></span>
       </label></td>
    </tr>
    <tr>
      <td class="option-name"><label>
         <input id="clear-cookies-on-exit"
                pref="profile.clear_site_data_on_exit" type="checkbox">
           <span i18n-content="cookies_clear_on_exit"></span>
       </label></td>
    </tr>
    <tr>
      <td class="option-name"><button id="show-cookies-button"
          i18n-content="cookies_show_cookies"></button>
      </td>
    </tr>
    <tr>
      <td><a i18n-values="href:flash_storage_url"
             i18n-content="flash_storage_settings"></a>
      </td>
    </tr>
    </table>
  </div>

  <!-- Image filter tab contents -->
  <div id="imagesFilterTab" class="subpages-tab-contents">
    <h4 i18n-content="images_setting" class="contentSettingsHeader"></h4>
    <table class="option-control-table">
    <tr>
      <td class="option-name"><label>
        <input type="radio" name="images" value="allow">
          <span i18n-content="images_allow"></span>
      </label></td>
    </tr>
    </table>

    <div class="exceptionsLink" i18n-content="content_exceptions"></div>
    <div id="imagesExceptionsArea" contentType="images">
      <list id="imagesExceptionsList"></list>
    </div>
  </div>

  <!-- JavaScript filter tab contents -->
  <div id="javascriptFilterTab" class="subpages-tab-contents">
    <span i18n-content="javascript_setting"></span>
    <table class="option-control-table">
    <tr>
       <td class="option-name"><label>
         <input type="radio" name="javascript" value="allow">
           <span i18n-content="javascript_allow"></span>
       </label></td>
    </tr>
    </table>

    <div class="exceptionsLink" i18n-content="content_exceptions"></div>
    <div id="javascriptExceptionsArea" contentType="javascript">
      <list id="javascriptExceptionsList"></list>
    </div>
  </div>

  <!-- Plug-ins filter tab contents -->
  <div id="pluginsFilterTab" class="subpages-tab-contents">
    <h4 i18n-content="plugins_setting" class="contentSettingsHeader"></h4>
    <table class="option-control-table">
    <tr>
       <td class="option-name"><label>
         <input type="radio" name="plugins" value="allow">
           <span i18n-content="plugins_allow"></span>
       </label></td>
    </tr>
    <tr>
       <td class="option-name"><label>
         <input type="radio" name="plugins" value="block">
           <span i18n-content="plugins_block"></span>
       </label></td>
    </tr>
    </table>

    <div class="exceptionsLink" i18n-content="content_exceptions"></div>
    <div id="pluginsExceptionsArea" contentType="plugins">
      <list id="pluginsExceptionsList"></list>
    </div>
    <a i18n-values="href:chrome_plugin_url"
       i18n-content="disable_individual_plugins"></a>
  </div>

  <!-- Pop-ups filter tab contents -->
  <div id="popupsFilterTab" class="subpages-tab-contents">
    <h4 i18n-content="popups_setting" class="contentSettingsHeader"></h4>
    <table class="option-control-table">
    <tr>
       <td class="option-name"><label>
         <input type="radio" name="popups" value="allow">
           <span i18n-content="popups_allow"></span>
       </label></td>
    </tr>
    <tr>
       <td class="option-name"><label>
         <input type="radio" name="popups" value="block">
           <span i18n-content="popups_block"></span>
       </label></td>
    </tr>
    <tr>
       <td class="option-name"><button id="popups-exceptions-button"
           i18n-content="content_exceptions"></button>
       </td>
    </tr>
    </table>

    <div class="exceptionsLink" i18n-content="content_exceptions"></div>
    <div id="popupsExceptionsArea" contentType="popups">
      <list id="popupsExceptionsList"></list>
    </div>
  </div>

  <!-- Location filter tab contents -->
  <div id="locationFilterTab" class="subpages-tab-contents">
    <h4 i18n-content="location_setting" class="contentSettingsHeader"></h4>
    <table class="option-control-table">
    <tr>
       <td class="option-name"><label>
         <input type="radio" name="location" value="allow">
           <span i18n-content="location_allow"></span>
       </label></td>
    </tr>
    <tr>
       <td class="option-name"><label>
         <input type="radio" name="location" value="ask">
           <span i18n-content="location_ask"></span>
       </label></td>
    </tr>
    <tr>
       <td class="option-name"><label>
         <input type="radio" name="location" value="block">
           <span i18n-content="location_block"></span>
       </label></td>
    </tr>
    <tr>
       <td class="option-name"><button id="location-exceptions-button"
           i18n-content="content_exceptions"></button>
       </td>
    </tr>
    </table>

    <div class="exceptionsLink" i18n-content="content_exceptions"></div>
    <div id="locationExceptionsArea" contentType="location">
      <list id="locationExceptionsList"></list>
    </div>
  </div>

  <!-- Notifications filter tab contents -->
  <div id="notificationsFilterTab" class="subpages-tab-contents">
    <h4 i18n-content="notifications_setting" class="contentSettingsHeader"></h4>
    <table class="option-control-table">
    <tr>
       <td class="option-name"><label>
         <input type="radio" name="noticiations" value="allow">
           <span i18n-content="notifications_allow"></span>
       </label></td>
    </tr>
    <tr>
       <td class="option-name"><label>
         <input type="radio" name="notifications" value="ask">
           <span i18n-content="notifications_ask"></span>
       </label></td>
    </tr>
    <tr>
       <td class="option-name"><label>
         <input type="radio" name="notifications" value="block">
           <span i18n-content="notifications_block"></span>
       </label></td>
    </tr>
    <tr>
       <td class="option-name"><button id="notifications-exceptions-button"
           i18n-content="content_exceptions"></button>
       </td>
    </tr>
    </table>

    <div class="exceptionsLink" i18n-content="content_exceptions"></div>
    <div id="notificationsExceptionsArea" contentType="notifications">
      <list id="notificationsExceptionsList"></list>
    </div>
  </div>
</div>

       <div class="page hidden" id="cookiesViewPage">
  <h1>
    <span i18n-content="cookiesViewPage"></span>
  </h1>

  <label><span i18n-content="label_cookie_search"></span>
  <input type=text id="cookiesSearchBox"></label>
  <button id="clearCookieSearchButton"
      i18n-content="label_cookie_clear_search"></button>

  <table class="cookies-info-table">
    <tr><td>
      <tree id="cookiesTree"></tree>
    </td></tr>
    <tr><td>
      <div class="cookies-details-pane" id="cookiesInfo">
        <table>
          <tr>
            <td class="cookie-details-label"
                i18n-content="label_cookie_name">
            </td>
            <td><span id="cookieName"></span></td>
          </tr>
          <tr>
            <td class="cookie-details-label"
                i18n-content="label_cookie_content">
            </td>
            <td><span id="cookieContent"></span></td>
          </tr>
          <tr>
            <td class="cookie-details-label"
                i18n-content="label_cookie_domain">
            </td>
            <td><span id="cookieDomain"></span></td>
          </tr>
          <tr>
            <td class="cookie-details-label"
                i18n-content="label_cookie_path">
            </td>
            <td><span id="cookiePath"></span></td>
          </tr>
          <tr>
            <td class="cookie-details-label"
                i18n-content="label_cookie_send_for">
            </td>
            <td><span id="cookieSendFor"></span></td>
          </tr>
          <tr>
            <td class="cookie-details-label"
                i18n-content="label_cookie_created">
            </td>
            <td><span id="cookieCreated"></span></td>
          </tr>
          <tr>
            <td class="cookie-details-label"
                i18n-content="label_cookie_expires">
            </td>
            <td><span id="cookieExpires"></span></td>
          </tr>
        </table>
      </div>

      <div class="cookies-details-pane hidden" id="appCacheInfo">
        <table>
          <tr>
            <td class="cookie-details-label"
                i18n-content="label_app_cache_manifest">
            </td>
            <td><span id="appCacheManifest"></span></td>
          </tr>
          <tr>
            <td class="cookie-details-label"
                i18n-content="label_local_storage_size">
            </td>
            <td><span id="appCacheSize"></span></td>
          </tr>
          <tr>
            <td class="cookie-details-label"
                i18n-content="label_cookie_created">
            </td>
            <td><span id="appCacheCreated"></span></td>
          </tr>
          <tr>
            <td class="cookie-details-label"
                i18n-content="label_cookie_last_accessed">
            </td>
            <td><span id="appCacheLastAccessed"></span></td>
          </tr>
        </table>
      </div>

      <div class="cookies-details-pane hidden" id="webDbInfo">
        <table>
          <tr>
            <td class="cookie-details-label"
                i18n-content="label_cookie_name">
            </td>
            <td><span id="webdbName"></span></td>
          </tr>
          <tr>
            <td class="cookie-details-label"
                i18n-content="label_webdb_desc">
            </td>
            <td><span id="webdbDesc"></span></td>
          </tr>
          <tr>
            <td class="cookie-details-label"
                i18n-content="label_local_storage_size">
            </td>
            <td><span id="webdbSize"></span></td>
          </tr>
          <tr>
            <td class="cookie-details-label"
                i18n-content="label_local_storage_last_modified">
            </td>
            <td><span id="webdbLastModified"></span></td>
          </tr>
        </table>
      </div>

      <div class="cookies-details-pane hidden" id="localStorageInfo">
        <table>
          <tr>
            <td class="cookie-details-label"
                i18n-content="label_local_storage_origin">
            </td>
            <td><span id="localStorageOrigin"></span></td>
          </tr>
          <tr>
            <td class="cookie-details-label"
                i18n-content="label_local_storage_size">
            </td>
            <td><span id="localStorageSize"></span></td>
          </tr>
          <tr>
            <td class="cookie-details-label"
                i18n-content="label_local_storage_last_modified">
            </td>
            <td><span id="localStorageLastModified"></span></td>
          </tr>
        </table>
      </div>
    </td></tr>
  </table>

  <button id="remove-cookie" i18n-content="remove_cookie"></button>
  <button id="remove-all-cookie" i18n-content="remove_all_cookie"></button>
</div>

       <div class="page hidden" id="passwordsExceptionsPage">
  <h1>
    <span i18n-content="personalPage"></span>
    &gt;
    <span i18n-content="savedPasswordsExceptionsTitle"></span>
  </h1>

  <!-- Navigation tabs -->
  <div class="subpages-nav-tabs">
    <span i18n-content="passwordsTabTitle" id="passwords-nav-tab"
        class="inactive-tab" tab-contents="passwordsTab"></span>
    <span i18n-content="passwordExceptionsTabTitle"
        id="password-exceptions-nav-tab"
        class="inactive-tab" tab-contents="passwordExceptionsTab"></span>
  </div>

  <!-- Passwords tab contents -->
  <div id="passwordsTab" class="subpages-tab-contents">
    <section>
      <div id="passwordsArea">
        <list id="savedPasswordsList"></list>
      </div>
    </section>
  </div>

  <!-- Exceptions tab contents -->
  <div id="passwordExceptionsTab" class="subpages-tab-contents">
    <section>
      <div id="passwordExceptionsArea">
        <list id="passwordExceptionsList"></list>
      </div>
    </section>
  </div>
</div>

       <div class="page hidden" id="personalPage">
  <h1 i18n-content="personalPage"></h1>

  <section>
    <h3 i18n-content="sync_section"></h3>
    <div>
      <div id="not-synced-controls" class="hidden">
        <div class="section-text" id="sync_not_setup_info"
            i18n-content="sync_not_setup_info"></div>
        <div>
          <button id="start-sync" i18n-content="start_sync"></button>
        </div>
      </div>
      <div id="synced-controls" class="hidden">
        <div class="section-text" id="synced_to_user_with_time"></div>
        <div>
<button id="stop-sync" i18n-content="stop_sync"></button>
          <button id="sync-customize" i18n-content="sync_customize"></button>
        </div>
      </div>
    </div>
  </section>
  <section>
    <h3 i18n-content="passwords"></h3>
    <div>
      <label>
        <input id="passwords_asktosave"
            name="passwords_radio"
            pref="profile.password_manager_enabled"
            type="radio" value="true" metric="Options_PasswordManager">
        <span i18n-content="passwords_asktosave"></span>
      </label>
      <label>
        <input id="passwords_neversave"
            name="passwords_radio"
            pref="profile.password_manager_enabled"
            type="radio" value="false" metric="Options_PasswordManager">
        <span i18n-content="passwords_neversave"></span>
      </label>
      <div><button id="showpasswords"
          i18n-content="showpasswords"></button></div>
    </div>
  </section>
  <section>
    <h3 i18n-content="autofill"></h3>
    <div>
      <button id="autofill_options" i18n-content="autofill_options"></button>
    </div>
  </section>
<section>
    <h3 i18n-content="browsing_data"></h3>
    <div>
      <button id="import_data" i18n-content="import_data"></button>
    </div>
  </section>
<section>
    <h3 i18n-content="appearance"></h3>
    <div>
      <div>
        <button id="themes_GTK_button"
            i18n-content="themes_GTK_button"></button>
        <button id="themes_set_classic"
            i18n-content="themes_set_classic"></button>
        <a i18n-content="themes_gallery" id="themes-gallery" href=""></a>
      </div>
      <label>
        <input name="decorations_radio"
            pref="browser.custom_chrome_frame"
            type="radio" value="false" metric="Options_CustomFrame">
        <span i18n-content="showWindow_decorations_radio"></span>
      </label>
      <label>
        <input name="decorations_radio"
            pref="browser.custom_chrome_frame"
            type="radio" value="true" metric="Options_CustomFrame">
        <span i18n-content="hideWindow_decorations_radio"></span>
      </label>
    </div>
  </section>


</div>

       <div class="page hidden" id="searchEngineManagerPage">
  <h1>
    <span i18n-content="browserPage"></span>
    &gt;
    <span i18n-content="searchEngineManagerPage"></span>
  </h1>
  <div class="left-side-table">
    <div>
      <div id="searchEngineHeading">
        <div class="name" i18n-content="searchEngineTableNameHeader"></div>
        <div class="keyword"
            i18n-content="searchEngineTableKeywordHeader"></div>
      </div>
      <list id="searchEngineList"></list>
    </div>
    <div>
      <div><button id="addSearchEngineButton"
          i18n-content="addSearchEngineButton"></div>
      <div><button id="removeSearchEngineButton" disabled
          i18n-content="removeSearchEngineButton"></div>
      <div><button id="editSearchEngineButton" disabled
          i18n-content="editSearchEngineButton"></div>
      <div><button id="makeDefaultSearchEngineButton" disabled
          i18n-content="makeDefaultSearchEngineButton"></div>
    </div>
  </div>
</div>

       <div class="page hidden" id="syncPage">
  <h1 i18n-content="syncPage"></h1>
  <section>
    <h3 i18n-content="sync_title"></h3>
    <table class="option-control-table">
      <tr>
        <td class="option-name"><label><input id="settings-check"
            pref="sync.preferences" type="checkbox"><span
            i18n-content="syncsettings"></span></label></td>
        <td class="option-name"><label><input id="bookmarks-check"
            pref="sync.bookmarks" type="checkbox"><span
            i18n-content="syncbookmarks"></span></label></td>
      </tr>
      <tr>
        <td class="option-name"><label><input id="typedurls-check"
            pref="sync.typed_urls" type="checkbox"><span
            i18n-content="synctypedurls"></span></label></td>
        <td class="option-name"><label><input id="passwords-check"
            pref="sync.passwords" type="checkbox"><span
            i18n-content="syncpasswords"></span></label></td>
      </tr>
      <tr>
        <td class="option-name"><label><input id="extensions-check"
            pref="sync.extensions" type="checkbox"><span
            i18n-content="syncextensions"></span></label></td>
        <td class="option-name"><label><input id="autofill-check"
            pref="sync.autofill" type="checkbox"><span
            i18n-content="syncautofill"></span></label></td>
      </tr>
      <tr>
        <td class="option-name"><label><input id="themes-check"
            pref="sync.themes" type="checkbox"><span
            i18n-content="syncthemes"></span></label></td>
      </tr>
    </table>
  </section>
</div>

     </div>
  </div>
</div>

<script>
// Decorate the existing elements in the document.
cr.ui.decorate('input[pref][type=checkbox]', options.PrefCheckbox);
cr.ui.decorate('input[pref][type=number]', options.PrefNumber);
cr.ui.decorate('input[pref][type=radio]', options.PrefRadio);
cr.ui.decorate('input[pref][type=range]', options.PrefRange);
cr.ui.decorate('select[pref]', options.PrefSelect);
cr.ui.decorate('input[pref][type=url]', options.PrefTextField);
cr.ui.decorate('#contentSettingsPage input[type=radio]',
    options.ContentSettingsRadio);
console.log('in bottom script');
</script>
</body>
</html>
<!DOCTYPE HTML>
<html i18n-values="dir:textdirection;">
<head>
<meta charset="utf-8">
<title i18n-content="pluginsTitle"></title>
<style>
body {
  margin: 10px;
  min-width: 47em;
}

a {
  color: blue;
  font-size: 103%;
}

div#header {
  margin-bottom: 1.05em;
  /* 67px is the height of the header's background image. */
  min-height: 67px;
  overflow: hidden;
  padding-bottom: 20px;
  padding-left: 0;
  padding-top: 20px;
  position: relative;
  -webkit-box-sizing: border-box;
}

html[dir=rtl] #header {
  padding-right: 0;
}

#header h1 {
  background: url("data:image/png;base64,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DJJKUUmECKKyRBQgYDMAmRUlkEooxHFxeVjWWiohUQpipajUOK586g+e966nP2B/ccvsT7VGZZVwcnbhzXcO3rl3aaCjSkallhnWyshaGePpp267unqotSRFEwFKUhAglQUIAFuRiGKVSiVMVCo1rg5Hx+MCChSkaGilIQt5+ZXXnZxe2La9iVqUijgclusX587OTrSWQGoBRmVkAcJHvvxDHj68jxQVi0plRSVpUSmEUqkAbIpYSLR0XFZRjmWVosbhsByPR8WKtVJZi1YqQamIr/7YVzgcLh2vHlqllbWWFofDwW6O/tCXPePdT95yOC4aBVmLIlQGC4P3PfuMw9WV1mItWpIFhShKsaAotQAE2IAoRY2wDFGpkFWujjmWikKWVNbQStFCzDY+8uEP+Pqv/bDL+2+5unpoIePYstuW7/n2r/Ed3/JxZnMsS4oVM4tShNaihOvXr9PRWkulRqFlNYqkohAAjUJRYDOEVkISlIoiCrN5596ly8srg0oLJVFMoEllxenJ3n/657/XlzxzzTt33lQLefDgoU987Fnf+q991HFlrUURRNQIFcVsxti2zW63OdmxjgchgFAqApJKpahkSQA2oSirRUtraaXSSmWt7HY7v/eZF719574bN645Ozt1enZqv9/b73Z22w6DMGbb7LfNycmp05O9Dz33pHt33tTxqJXp6N23b7r92E3H4xHMDJjZ7PY7+9MT52enrl+cOzs/1zq6f/+e115/3SuvvOb05MRqWS2VSiUpKhWoJBWYBQDsQ9HEylqZyQwLY1TIfrfz2Rfe9FM/+ys+/NwTzs72TvY7N25cc3JyovLYrVugcjwevfnWHa+/8YZP//7n/eKv/I7zi3O11Cb53Bde8fkvvurmjWvWWo4ryt179zx48MBbb9311p277tx9x50797319tvuvPPAnTv3vfbWPbuzm2Z2RGtJRNCSFAqjwlIDKgD7KVAISIKFSQbMjLv3Dv7G3/05+/WOJx+/7ux058nbt1xcnFvHo+fe+zQIDx8+9MUXX/HZ51/wu7/3RTcee7ebj93GqOx2e7/0G5919eAdX/Ls4x4+vHQ4HK3Gm2+97c6dd7zw8mteevl1L736urv3Dk5PL5ycnjs5O3d6ds3Z9cdsu71WEoUoxWpoYSmsZGSZEAL2sKRSSSqCAQkwdienbj/5tMPhobeurqzLgy+88ba13tQ6+tlffl5lyczY7/b2J+fe9dxX2p2c2ba9DGW3bR5e7fzjX/oD/+Dnft3xcKlidrbd3rbb2+1O7E+e8PgzT3tit8Nmm02zYWQEUoAQgQBDS0hCAIB9hqJoWSszScYoGAYw2Pb2J3v7EyoNihIsEmjQAMYSLcXEttu7/sjjrt24pbWEmdEMDQARMgxTSGtkGdGoJKJCghKSimIGAOwBRKWVNYGGZAwxRoAwCILBABNGEGQtWIAUBcnGDLudCQKQiEQoa1CCUklIUQuI0FpIqCiQEBrYk0qSgIWNCpAAAaBoAsUYq0xZmKGFSTFDRUDFUFECIxFABEAWwSAJoyAAEwsVUgQBAIDB7DFKjWjVmMwiMZtkEIIAw1oAZLFYA6wFsYBWSEYCQhRBISsGkIiGjClKKFhAJGKJFlEEQgBKMTBjv5+Zy+qq1r6a1bLFMkBHjGBSMEihQQyVwVpjUAGRgEiSIARLRmVkYhkzEUumoYRiILIUAJWCiKBUYGaAmt1us9vvrmbmYn/5zltv4hfWOn7DOi7bbmk2JCOMCAMjC4QBy1oDSAtDBcRqmRkFCVCpgBIMookiAlECFEoQCSgVhpJlAqA0Y64OBzcuTu89fuvaG9u2Xds++MEPvPLqi1/8gXv3Lx3X0Vqr1iIQSZosWVKpTKxSKMpxxWStkEoSVkmgUgGAAJUlSlGxUikqlcpCJRGiYJBEMMwwY7Zmtnrt9Ts+/tHnnv/GT37Zp3bbrN2rLz+/fvKnfuFzq+2p19+8+/Hdtptt29m2CSNEIRRFEURRKgNlJFFWGSFKhSQKqZAKURSFEIUQQpTBWEwIjAwM24wZZlTNw4dXXn7lzfnKDz/9xl/8c//Gz3zdxz/0i7vd9nuz1tqV0//2r/29937qMy//5//s1z/7x9+8+/CZy4frxGwMQDIqlQEEAQ1QKAQqYYwkmVgBBCySYBCJACICBAUEASAAAOuY09MTjz968eDjX/ncK9/37/wrP/+v/7Gv+EcX5ye/XP3WrLUGZ9XNT33mpad+4Zc/9a0vv/b2H7n34Or97PYzMQQBAAIKYoBCAEAgAFAABCICAAABAQFAABDCAACodudn+8t3P/noa9/89V/52+977xO/vt/vfqv6XXprjscjzMyc4ZG1eiw9KY+bucAGAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAADNmjIfbzGv4HL6A+9u2+f8BQZBxVXgcMMUAAAAASUVORK5CYII=") 0px 20px no-repeat;
  display: inline;
  margin: 0;
  padding-bottom: 43px;
  padding-left: 75px;
  padding-top: 40px;
}

html[dir=rtl] #header h1 {
  background: url("data:image/png;base64,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DJJKUUmECKKyRBQgYDMAmRUlkEooxHFxeVjWWiohUQpipajUOK586g+e966nP2B/ccvsT7VGZZVwcnbhzXcO3rl3aaCjSkallhnWyshaGePpp267unqotSRFEwFKUhAglQUIAFuRiGKVSiVMVCo1rg5Hx+MCChSkaGilIQt5+ZXXnZxe2La9iVqUijgclusX587OTrSWQGoBRmVkAcJHvvxDHj68jxQVi0plRSVpUSmEUqkAbIpYSLR0XFZRjmWVosbhsByPR8WKtVJZi1YqQamIr/7YVzgcLh2vHlqllbWWFofDwW6O/tCXPePdT95yOC4aBVmLIlQGC4P3PfuMw9WV1mItWpIFhShKsaAotQAE2IAoRY2wDFGpkFWujjmWikKWVNbQStFCzDY+8uEP+Pqv/bDL+2+5unpoIePYstuW7/n2r/Ed3/JxZnMsS4oVM4tShNaihOvXr9PRWkulRqFlNYqkohAAjUJRYDOEVkISlIoiCrN5596ly8srg0oLJVFMoEllxenJ3n/657/XlzxzzTt33lQLefDgoU987Fnf+q991HFlrUURRNQIFcVsxti2zW63OdmxjgchgFAqApJKpahkSQA2oSirRUtraaXSSmWt7HY7v/eZF719574bN645Ozt1enZqv9/b73Z22w6DMGbb7LfNycmp05O9Dz33pHt33tTxqJXp6N23b7r92E3H4xHMDJjZ7PY7+9MT52enrl+cOzs/1zq6f/+e115/3SuvvOb05MRqWS2VSiUpKhWoJBWYBQDsQ9HEylqZyQwLY1TIfrfz2Rfe9FM/+ys+/NwTzs72TvY7N25cc3JyovLYrVugcjwevfnWHa+/8YZP//7n/eKv/I7zi3O11Cb53Bde8fkvvurmjWvWWo4ryt179zx48MBbb9311p277tx9x50797319tvuvPPAnTv3vfbWPbuzm2Z2RGtJRNCSFAqjwlIDKgD7KVAISIKFSQbMjLv3Dv7G3/05+/WOJx+/7ux058nbt1xcnFvHo+fe+zQIDx8+9MUXX/HZ51/wu7/3RTcee7ebj93GqOx2e7/0G5919eAdX/Ls4x4+vHQ4HK3Gm2+97c6dd7zw8mteevl1L736urv3Dk5PL5ycnjs5O3d6ds3Z9cdsu71WEoUoxWpoYSmsZGSZEAL2sKRSSSqCAQkwdienbj/5tMPhobeurqzLgy+88ba13tQ6+tlffl5lyczY7/b2J+fe9dxX2p2c2ba9DGW3bR5e7fzjX/oD/+Dnft3xcKlidrbd3rbb2+1O7E+e8PgzT3tit8Nmm02zYWQEUoAQgQBDS0hCAIB9hqJoWSszScYoGAYw2Pb2J3v7EyoNihIsEmjQAMYSLcXEttu7/sjjrt24pbWEmdEMDQARMgxTSGtkGdGoJKJCghKSimIGAOwBRKWVNYGGZAwxRoAwCILBABNGEGQtWIAUBcnGDLudCQKQiEQoa1CCUklIUQuI0FpIqCiQEBrYk0qSgIWNCpAAAaBoAsUYq0xZmKGFSTFDRUDFUFECIxFABEAWwSAJoyAAEwsVUgQBAIDB7DFKjWjVmMwiMZtkEIIAw1oAZLFYA6wFsYBWSEYCQhRBISsGkIiGjClKKFhAJGKJFlEEQgBKMTBjv5+Zy+qq1r6a1bLFMkBHjGBSMEihQQyVwVpjUAGRgEiSIARLRmVkYhkzEUumoYRiILIUAJWCiKBUYGaAmt1us9vvrmbmYn/5zltv4hfWOn7DOi7bbmk2JCOMCAMjC4QBy1oDSAtDBcRqmRkFCVCpgBIMookiAlECFEoQCSgVhpJlAqA0Y64OBzcuTu89fuvaG9u2Xds++MEPvPLqi1/8gXv3Lx3X0Vqr1iIQSZosWVKpTKxSKMpxxWStkEoSVkmgUgGAAJUlSlGxUikqlcpCJRGiYJBEMMwwY7Zmtnrt9Ts+/tHnnv/GT37Zp3bbrN2rLz+/fvKnfuFzq+2p19+8+/Hdtptt29m2CSNEIRRFEURRKgNlJFFWGSFKhSQKqZAKURSFEIUQQpTBWEwIjAwM24wZZlTNw4dXXn7lzfnKDz/9xl/8c//Gz3zdxz/0i7vd9nuz1tqV0//2r/29937qMy//5//s1z/7x9+8+/CZy4frxGwMQDIqlQEEAQ1QKAQqYYwkmVgBBCySYBCJACICBAUEASAAAOuY09MTjz968eDjX/ncK9/37/wrP/+v/7Gv+EcX5ye/XP3WrLUGZ9XNT33mpad+4Zc/9a0vv/b2H7n34Or97PYzMQQBAAIKYoBCAEAgAFAABCICAAABAQFAABDCAACodudn+8t3P/noa9/89V/52+977xO/vt/vfqv6XXprjscjzMyc4ZG1eiw9KY+bucAGAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAADNmjIfbzGv4HL6A+9u2+f8BQZBxVXgcMMUAAAAASUVORK5CYII=") right no-repeat;
  padding-right: 95px;
  padding-left: 0;
}

h1 {
  font-size: 156%;
  font-weight: bold;
  padding: 0;
  margin: 0;
}

div.content {
  font-size: 88%;
  margin-top: 5px;
}

.section-header {
  background: #ebeff9;
  border-top: 1px solid #b5c7de;
  font-size: 99%;
  padding-bottom: 2px;
  padding-left: 5px;
  padding-top: 3px;
  width: 100%;
}

html[dir=rtl] .section-header {
  padding-right: 5px;
  padding-left: 0;
}

.section-header > table tr td:first-child {
  width: 100%;
}

.section-header > table {
  width: 100%;
}

.section-header-title {
  font-weight: bold;
}

.vbox-container {
  display: -webkit-box;
  -webkit-box-orient: vertical;
}

.wbox {
  display: -webkit-box;
  -webkit-box-align: stretch;
  -webkit-box-flex: 1;
}

#top {
  padding-right: 5px;
}

html[dir=rtl] #top {
  padding-left: 5px;
  padding-right: 0;
}

.showInTmiMode {
  overflow: hidden;
}

body.hideTmiModeInitial .showInTmiMode {
  height: 0 !important;
  opacity: 0;
}

body.hideTmiMode .showInTmiMode {
  height: 0 !important;
  opacity: 0;
  -webkit-transition: all .1s ease-out;
}

body.showTmiModeInitial .showInTmiMode {
  opacity: 1;
}

body.showTmiMode .showInTmiMode {
  opacity: 1;
  -webkit-transition: all .1s ease-in;
}

.wbox-tmi-mode {
  -webkit-box-align: stretch;
  -webkit-box-flex: 1;
}

.tmi-mode-image {
  margin-top: 2px;
  padding-left: 5px;
  padding-right: 5px;
}

.tmi-mode-link {
  margin-right: 3px;
  white-space: nowrap;
}

.tmi-mode-link a {
  font-size: 97%;
}

.tmi-mode {
  background: #f4f6fc;
  border-bottom: 1px solid #edeff5;
  font-size: 89%;
  padding-bottom: 0.8em;
  padding-left: 10px;
  padding-top: 0.8em;
  width: 100%;
}

html[dir=rtl] .tmi-mode {
  padding-right: 10px;
  padding-left: 0;
}

.plugin-disabled > td {
  background-color: #f0f0f0;
  color: #a0a0a0;
  padding-bottom: 4px;
  padding-top: 5px;
}

.plugin-enabled > td {
  padding-bottom: 4px;
  padding-top: 5px;
}

.plugin-file-disabled {
  background-color: #f0f0f0;
  color: #a0a0a0;
  padding-top: 5px;
  padding-bottom: 5px;
}

.plugin-file-enabled {
  padding-top: 5px;
  padding-bottom: 5px;
}

.plugin {
  border-bottom: 1px solid #cdcdcd;
}

.critical {
  color: red;
}

/* Indent the text related to each plug-in. */
.plugin-text {
  padding-left: 5px;
}

html[dir=rtl] .plugin-text {
  padding-right: 5px;
  padding-left: 0;
}

.plugin-name {
  font-weight: bold;
}

.no-plugins {
  margin: 6em 0 0;
  text-align: center;
  font-size: 1.2em;
}

/* Use tables for layout, so eliminate extra spacing. */
.plugin-details table {
  -webkit-border-horizontal-spacing: 0;
  -webkit-border-vertical-spacing: 0;
}

.plugin-details {
  -webkit-padding-start: 1em;
}

/* Separate the inital line, Description, Location, and MIME Types lines. */
.plugin-details > div {
  padding-top: 0.1em
}

/* Align rows of tables along the top. */
.plugin-details tr {
  vertical-align: top;
}

/* Separate columns by 1em for the most part. */
.plugin-details td+td {
  padding-left: 1em;
}

html[dir=rtl] .plugin-details td+td {
  padding-right: 1em;
  padding-left: 0;
}

/* Make the MIME Types tables smaller. */
.plugin-details .mime-types {
  font-size: 95%;
}

/* Separate the header from the contents in each MIME Types table. */
.plugin-details .mime-types .header td {
  padding-bottom: 0.1em;
  border-bottom: 1px solid;
}

/* Separate the columns for tables used for horizontal listings only a bit. */
.hlisting td+td {
  padding-left: 0.4em;
}

html[dir=rtl] .hlisting td+td {
  padding-right: 0.4em;
  padding-left: 0;
}

/* Match the indentation of .plugin-text. */
.plugin-actions {
  padding-left: 5px;
  margin-top: 0.2em;
  margin-bottom: 0.2em;
}

html[dir=rtl] .plugin-actions {
  padding-right: 5px;
  padding-left: 0;
}

button {
  font-size: 104%;
}

</style>
<script>

/**
 * This variable structure is here to document the structure that the template
 * expects to correctly populate the page.
 */
var pluginDataFormat = {
  'plugins': [
    {
      'name': 'Group Name',
      'description': 'description',
      'version': 'version',
      'update_url': 'http://update/',
      'critical': true,
      'enabled': true,
      'plugin_files': [
        {
          'path': '/blahblah/blahblah/MyCrappyPlugin.plugin',
          'name': 'MyCrappyPlugin',
          'version': '1.2.3',
          'description': 'My crappy plugin',
          'mimeTypes': [
            { 'description': 'Foo Media',
              'fileExtensions': [ 'foo' ],
              'mimeType': 'application/x-my-foo' },
            { 'description': 'Bar Stuff',
              'fileExtensions': [ 'bar','baz' ],
              'mimeType': 'application/my-bar' }
          ],
          'enabledMode': 'enabled'
        },
        {
          'path': '/foobar/baz/YourGreatPlugin.plugin',
          'name': 'YourGreatPlugin',
          'version': '4.5',
          'description': 'Your great plugin',
          'mimeTypes': [
            { 'description': 'Baz Stuff',
              'fileExtensions': [ 'baz' ],
              'mimeType': 'application/x-your-baz' }
          ],
          'enabledMode': 'disabledByUser'
        },
        {
          'path': '/foobiz/bar/HisGreatPlugin.plugin',
          'name': 'HisGreatPlugin',
          'version': '1.2',
          'description': 'His great plugin',
          'mimeTypes': [
            { 'description': 'More baz Stuff',
              'fileExtensions': [ 'bor' ],
              'mimeType': 'application/x-his-bor' }
          ],
          'enabledMode': 'disabledByPolicy'
        }
      ]
    }
  ]
};

/**
 * Takes the |pluginsData| input argument which represents data about the
 * currently installed/running plugins and populates the html jstemplate with
 * that data. It expects an object structure like the above.
 * @param {Object} pluginsData Detailed info about installed plugins
 */
function renderTemplate(pluginsData) {
  // This is the javascript code that processes the template:
  var input = new JsEvalContext(pluginsData);
  var output = document.getElementById('pluginTemplate');
  jstProcess(input, output);
}

/**
 * Asks the C++ PluginsDOMHandler to get details about the installed plugins and
 * return detailed data about the configuration. The PluginsDOMHandler should
 * reply to returnPluginsData() (below).
 */
function requestPluginsData() {
  chrome.send('requestPluginsData', []);
}

/**
 * Asks the C++ PluginsDOMHandler to show the terms of service (about:terms).
 */
function showTermsOfService() {
  chrome.send('showTermsOfService', []);
}

/**
 * Called by the dom_ui_ to re-populate the page with data representing the
 * current state of installed plugins.
 */
function returnPluginsData(pluginsData){
  var bodyContainer = document.getElementById('body-container');
  var body = document.body;

  // Set all page content to be visible so we can measure heights.
  bodyContainer.style.visibility = 'hidden';
  body.className = '';
  var slidables = document.getElementsByClassName('showInTmiMode');
  for (var i = 0; i < slidables.length; i++)
    slidables[i].style.height = 'auto';

  renderTemplate(pluginsData);

  // Make sure the left column (with "Description:", "Location:", etc.) is the
  // same size for all plugins.
  var labels = document.getElementsByClassName('plugin-details-label');
  var maxLabelWidth = 0;
  for (var i = 0; i < labels.length; i++)
    labels[i].style.width = 'auto';
  for (var i = 0; i < labels.length; i++)
    maxLabelWidth = Math.max(maxLabelWidth, labels[i].offsetWidth);
  for (var i = 0; i < labels.length; i++)
    labels[i].style.width = maxLabelWidth + 'px';

  // Explicitly set the height for each element that wants to be "slid" in and
  // out when the tmiModeExpanded is toggled.
  var slidables = document.getElementsByClassName('showInTmiMode');
  for (var i = 0; i < slidables.length; i++)
    slidables[i].style.height = slidables[i].offsetHeight + 'px';

  // Reset visibility of page based on the current tmi mode.
  document.getElementById('collapse').style.display =
     tmiModeExpanded ? 'inline' : 'none';
  document.getElementById('expand').style.display =
     tmiModeExpanded ? 'none' : 'inline';
  bodyContainer.style.visibility = 'visible';
  body.className = tmiModeExpanded ?
     'showTmiModeInitial' : 'hideTmiModeInitial';
}

/**
 * Handles a 'enable' or 'disable' button getting clicked.
 */
function handleEnablePlugin(node, enable, isGroup) {
  // Tell the C++ PluginsDOMHandler to enable/disable the plugin.
  chrome.send('enablePlugin', [String(node.path), String(enable),
              String(isGroup)]);
  requestPluginsData();
}

// Keeps track of whether details have been made visible (expanded) or not.
var tmiModeExpanded = false;

/*
 * Toggles visibility of details.
 */
function toggleTmiMode() {
  tmiModeExpanded = !tmiModeExpanded;

  document.getElementById('collapse').style.display =
      tmiModeExpanded ? 'inline' : 'none';
  document.getElementById('expand').style.display =
      tmiModeExpanded ? 'none' : 'inline';

  document.body.className =
      tmiModeExpanded ? 'showTmiMode' : 'hideTmiMode';
}

/**
 * Determines whether a plugin's version should be displayed.
 */
function shouldDisplayPluginVersion(plugin) {
  return !!plugin.version && plugin.version != '0';
}

/**
 * Determines whether a plugin's description should be displayed.
 */
function shouldDisplayPluginDescription(plugin) {
  // Only display the description if it's not blank and if it's not just the
  // name, version, or combination thereof.
  return plugin.description &&
         plugin.description != plugin.name &&
         plugin.description != plugin.version &&
         plugin.description != 'Version ' + plugin.version &&
         plugin.description != plugin.name + ' ' + plugin.version;
}

// Unfortunately, we don't have notifications for plugin (list) status changes
// (yet), so in the meanwhile just update regularly.
setInterval(requestPluginsData, 30000);

// Get data and have it displayed upon loading.
document.addEventListener('DOMContentLoaded', requestPluginsData);

</script>
</head>
<body i18n-values=".style.fontFamily:fontfamily;.style.fontSize:fontsize">
<div id="body-container" style="visibility:hidden">

  <div id="header"><h1 i18n-content="pluginsTitle">TITLE</h1></div>

  <div id="pluginTemplate">

    <div id="container" class="vbox-container">
    <div id="top" class="wbox">

      <div class="section-header">
        <table cellpadding="0" cellspacing="0"><tr valign="center">
          <td>
            <span class="section-header-title" i18n-content="pluginsTitle"
              >TITLE</span>
            <span class="section-header-title"
                  jsdisplay="plugins.length > 0">(<span
                  jscontent="plugins.length"></span>)</span>
          </td>
          <td width="18">
            <img id="collapse" class="tmi-mode-image"
                 style="display:none" onclick="toggleTmiMode();"
                 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9kKEBUKJtFDpJUAAADSSURBVBjTjZExTgJhEIXfjFtA4QGMHY1RD0FnYWVI8AhLwQ28gTfAUNuQYKwstuMEJiYSY8EFKBYKCH/2n3kUC4Ri2fC18715mYzM8/D5Nc0mM1Tx0G49Pd4lpTF661RKz72P3/85uumYtXTTsaIWdweQ1BhmFmPcSZtQNBs/ld5ieQNAAUSzU8vKUQKgKCxf3qqqu6vqocvMYrGvCyEcpwVC0N3NzJ07abXeWIwkRYQkAJIESaooABm+f2eT2Uv/PpqVBx+4UH0d/F1fXco5b9kCrJSRhFACKVsAAAAASUVORK5CYII=">
            <img id="expand" class="tmi-mode-image"
                 onclick="toggleTmiMode();" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9kKEBUKMVKQIVIAAADiSURBVBjTjZGxagJREEXvm2yRFJI62KUJ0Y+ws0gVBP0ELfyD/EH+IMHaRjBYWdjZGwKCQSz8AQt3I1l87LtvLN4qWxjJrS5zD3MZxmy2djT+nkzXOKd67f75qRIFYvDeOAu1Oh+L1QbN9lALAmbArDhptoeCi/LeA4guECSdczm0t9nN9bwYG/MZTJw8ABAAjvxrWYgiAFnGbfIoIgBuSwsAya5KkqTLjnXW2rwFJpg0Tb33JL3XHPpN93ROVU8tcfyjUFUVIwBMr/81ma5fulVHhoNPuhJ5fVuW70rmP285AJVgi6pOot+gAAAAAElFTkSuQmCC">
          </td>
          <td>
            <div class="tmi-mode-link">
              <a onclick="toggleTmiMode();" style="cursor: default"
                 i18n-content="pluginsDetailsModeLink">DETAILS</a>
            </div>
          </td>
        </tr></table>
      </div>

    </div>
    </div>

    <div class="content">
      <div class="plugin-name no-plugins" jsdisplay="plugins.length === 0">
        <div i18n-content="noPlugins">NO_PLUGINS_ARE_INSTALLED</div>
      </div>

      <div jsdisplay="plugins.length > 0">
      <div class="plugin" jsselect="plugins">
        <table width="100%" cellpadding="2" cellspacing="0">
        <tr jsvalues=
            ".className:enabledMode == 'enabled' ? 'plugin-enabled' : 'plugin-disabled'">
        <td valign="top">
          <div class="plugin-text">
            <div>
              <span class="plugin-name" dir="ltr"
                    jscontent="name">NAME</span>
              <span jsdisplay="plugin_files.length > 1"
                  jscontent="'(' + plugin_files.length +' files)'">(x)</span>
              <span jsdisplay="shouldDisplayPluginVersion($this)">
                - <span i18n-content="pluginVersion">VERSION</span>
                <span jsvalues=".className:critical? 'critical': ''"
                    dir="ltr" jscontent="version">x.x.x.x</span>
              </span>
              <a jsdisplay="critical" jsvalues=".href:update_url"
                    i18n-content="pluginDownload">DOWNLOAD UPDATE</a>
              <span jsdisplay="enabledMode == 'disabledByUser'"
                    i18n-content="pluginDisabled">(DISABLED)</span>
              <span jsdisplay="enabledMode == 'disabledByPolicy'"
                    i18n-content="pluginDisabledByPolicy">(DISABLED_BY_POLICY)</span>
              <div jsdisplay="shouldDisplayPluginDescription($this)">
                <span dir="ltr" jsvalues=".innerHTML:description">
              </div>
            </div>
            <div jsselect="plugin_files" class="plugin-details">
              <div class="showInTmiMode">
                <div jsvalues=
                  ".className:enabledMode == 'enabled' ? 'plugin-file-enabled' : 'plugin-file-disabled'">
                  <div><table><tr>
                    <td class="plugin-details-label"
                        i18n-content="pluginName">NAME:</td>
                    <td><span dir="ltr" jscontent="name">NAME</span></td>
                  </tr></table></div>
                  <div><table>
                    <tr jsdisplay="shouldDisplayPluginDescription($this)">
                      <td class="plugin-details-label"
                          i18n-content="pluginDescription">DESCRIPTION:</td>
                      <td>
                        <span dir="ltr" jsvalues=".innerHTML:description">
                      </td>
                    </tr>
                  </table></div>
                  <div><table><tr>
                    <td class="plugin-details-label"
                        i18n-content="pluginVersion">VERSION:</td>
                    <td><span dir="ltr" jscontent="version">x.x.x.x</span></td>
                  </tr></table></div>
                  <div><table><tr>
                    <td class="plugin-details-label"
                        i18n-content="pluginPriority">PRIORITY:</td>
                    <td><span dir="ltr" jscontent="priority">x</span></td>
                  </tr></table></div>
                  <div><table><tr>
                    <td class="plugin-details-label"
                        i18n-content="pluginPath">PATH:</td>
                    <td><span dir="ltr" jscontent="path"></span></td>
                  </tr></table></div>
                  <div><table><tr>
                    <td class="plugin-details-label">&nbsp;</td>
                    <td>
                      <span jsdisplay="enabledMode == 'disabledByUser'"
                          i18n-content="pluginDisabled">(DISABLED)</span>
                      <span jsdisplay="enabledMode == 'disabledByPolicy'"
                          i18n-content="pluginDisabled">(DISABLED_BY_POLICY)</span>
                      <span>
                        <a
                          jsvalues=".path:path"
                          jsdisplay="enabledMode == 'enabled'"
                          onclick="handleEnablePlugin(this, false, false)"
                          href="javascript:void(0);"
                          i18n-content="disable"
                          >DISABLE</a>
                        <a
                          jsvalues=".path:path"
                          jsdisplay="enabledMode == 'disabledByUser'"
                          onclick="handleEnablePlugin(this, true, false)"
                          href="javascript:void(0);"
                          i18n-content="enable"
                          >ENABLE</a>
                        <span
                          jsdisplay="enabledMode == 'disabledByPolicy'"
                          i18n-content="pluginCannotBeEnabledDueToPolicy"
                          >CANNOT_ENABLE</span>
                      </span>
                    </td>
                  </tr></table></div>
                  <table><tr jsdisplay="mimeTypes.length > 0">
                    <td class="plugin-details-label"
                        i18n-content="pluginMimeTypes">MIME_TYPES:</td>
                    <td><table width="100%" class="mime-types">
                      <tr class="header">
                        <td i18n-content="pluginMimeTypesMimeType"
                            >MIME type</td>
                        <td i18n-content="pluginMimeTypesDescription"
                            >DESCRIPTION</td>
                        <td i18n-content="pluginMimeTypesFileExtensions"
                            >FILE_EXTENSIONS</td>
                      </tr>
                      <tr jsselect="mimeTypes">
                        <td><span dir="ltr"
                                  jscontent="mimeType"></span></td>
                        <td><span dir="ltr"
                                  jsvalues=".innerHTML:description"></span></td>
                        <td><table jsdisplay="fileExtensions.length > 0"
                                   class="hlisting">
                          <tr><td jsselect="fileExtensions">
                            <span dir="ltr" jscontent="'.' + $this">
                          </td></tr>
                        </table></td>
                      </tr>
                    </table></td>
                  </tr></table>
                </div>
              </div>
            </div>
          </div>
          <div class="plugin-actions">
            <span>
              <a
                jsvalues=".path:name"
                jsdisplay="enabledMode == 'enabled'"
                onclick="handleEnablePlugin(this, false, true)"
                href="javascript:void(0);"
                i18n-content="disable"
                >DISABLE</a>
              <a
                jsvalues=".path:name"
                jsdisplay="enabledMode == 'disabledByUser'"
                onclick="handleEnablePlugin(this, true, true)"
                href="javascript:void(0);"
                i18n-content="enable"
                >ENABLE</a>
              <span
                jsdisplay="enabledMode == 'disabledByPolicy'"
                i18n-content="pluginCannotBeEnabledDueToPolicy"
                >CANNOT_ENABLE</span>
            </span>
          </div>
        </td>
        </tr>
        </table>
      </div>
      </div>
    </div>
  </div>
</div>
</body>
</html>
<!DOCTYPE html>
<html id="template_root" i18n-values="dir:textdirection">
<head>
<title i18n-content="title"></title>
<style>
body {
  background-color:#500;
  font-family:Helvetica,Arial,sans-serif;
  margin:0px;
}
.background {
  position:absolute;
  width:100%;
  height:100%;
}
.cell {
  padding:40px;
}
.box {
  width:80%;
  background-color:white;
  color:black;
  font-size:10pt;
  line-height:16pt;
  text-align:left;
  padding:20px;
  position:relative;
  -webkit-box-shadow:3px 3px 8px #200;
  border-radius:5px;
}
html[dir='rtl'] .box {
  text-align:right;
}

.icon {
  position:absolute;
}
.title {
  margin:0px 87px 0px;
  font-size:18pt;
  line-height: 140%;
  margin-bottom:6pt;
  font-weight:bold;
  color:#660000;
}
.main {
  margin:0px 90px 0px;
}
.submission {
  margin:15px 5px 15px 0px;
  padding:0px;
}
input {
  margin:0px;
}
.proceedbutton {
}
.helpbutton {
  float:right;
}
.example {
  margin: 30px 90px 0px;
  border-top:1px solid #ccc;
  padding-top:6px;
}
.moreinfotitle {
  margin-left:5px;
  margin-right:5px;
}
</style>

<script>
  function sendCommand(cmd) {
    window.domAutomationController.setAutomationId(1);
    window.domAutomationController.send(cmd);
  }

  function agreed(form) {
    form.continue_button.disabled = !form.continue_button.disabled;
  }
</script>
</head>
<body oncontextmenu="return false;">
<div class="background"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAJFCAIAAACTIQqNAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAARFJREFUeNq8VUESgzAIBMdzv9D/9tPbBEg0UwWibQ+ZqAF2Fzbt8no8FyIKFuvOWLg8A/qdmRK5zqr5sL3hSO2Cwyw7Kk7D/8vigg3RyOUdpDw61x5D1gfYs+ZR2Wufap7kW8zWr6pxV6/oRK0B7nEYsP64+iwaf4zzgXKlu/xEf/URzFu4WEt5do6YqyPeGvSp32ZrCH8EOmBzpXaHkJ4JKKcPbYaJGQ2xGZ2GzV2zx1fvb6RR7gbjlOcMx47l6AbB9615IYrDzn+xP5A4O/cOEji4yUPrsxPjn8u8A19EOnLnnzH6/7D9Xh1wWB3tq+WvCHkdzwgJzl5v4p7Nn/0qF4n7j4uY9OUeRTmOjrcAAwA2pq7tEQdVlgAAAABJRU5ErkJggg==" width="100%" height="100%" alt="background" onmousedown="return false;"/></div>
<table width="100%" cellspacing="0" cellpadding="0">
  <td class="cell" valign="middle" align="center">
    <div class="box">
      <div class="icon"><img src="data:image/png;base64,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" alt="Malware Icon" onmousedown="return false;"/></div>
      <div class="title" i18n-content="headLine"></div>
      <div class="main" i18n-values=".innerHTML:description1"></div>
      <div class="main" i18n-values=".innerHTML:description2"></div>
      <div class="main"><a href="" i18n-content="description3" onclick="sendCommand('learnMore'); return false;" onmousedown="return false;"></a></div>
      <div class="main">
        <form class="submission">
          <input name="checky" id="checky" type="checkbox" onclick="agreed(this.form)">&nbsp;<label for="checky" i18n-content="confirm_text"></label>
          <input type="button" name="continue_button" i18n-values="value:continue_button" disabled="true" onclick="sendCommand('proceed')"><br>
          <input type="button" name="back_button" i18n-values="value:back_button" onclick="sendCommand('takeMeBack')">
        </form>
      </div>
    </div>
  </td>
</table>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<title i18n-content="title"></title>
<style>
body {
  background-color:#500;
  font-family:Helvetica,Arial,sans-serif;
  margin:0px;
}
.background {
  position:absolute;
  width:100%;
  height:100%;
}
.cell {
  padding:40px;
}
.box {
  width:80%;
  background-color:white;
  color:black;
  font-size:10pt;
  line-height:16pt;
  text-align:left;
  padding:20px;
  position:relative;
  -webkit-box-shadow:3px 3px 8px #200;
  border-radius:5px;
}
html[dir='rtl'] .box {
  text-align:right;
}

.icon {
  position:absolute;
}
.title {
  margin:0px 87px 0px;
  font-size:18pt;
  line-height: 140%;
  margin-bottom:6pt;
  font-weight:bold;
  color:#660000;
}
.main {
  margin:0px 90px 0px;
}
.submission {
  margin:15px 5px 15px 0px;
  padding:0px;
}
input {
  margin:0px;
}
.proceedbutton {
}
.helpbutton {
  float:right;
}
.example {
  margin: 30px 90px 0px;
  border-top:1px solid #ccc;
  padding-top:6px;
}
.moreinfotitle {
  margin-left:5px;
  margin-right:5px;
}

.errorlist {
  background-color:white;
  color:black;
  font-size:10pt;
  line-height:16pt;
  text-align:left;
}
</style>

<script>
function agreed(form) {
  form.continue_button.disabled = !form.continue_button.disabled;
}

function sendCommand(command) {
  window.domAutomationController.setAutomationId(1);
  window.domAutomationController.send(command);
}

function showDiagnostic(errorID) {
  sendCommand("showDiagnostic:" + errorID);
}

function reportError(errorID) {
  sendCommand("reportError:" + errorID);
}

function learnMore() {
  sendCommand("learnMore");
}

function proceed() {
  sendCommand("proceed");
}

function takeMeBack() {
  sendCommand("takeMeBack");
}
</script>
</head>

<body oncontextmenu="return false;">
<div class="background"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAJFCAIAAACTIQqNAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAARFJREFUeNq8VUESgzAIBMdzv9D/9tPbBEg0UwWibQ+ZqAF2Fzbt8no8FyIKFuvOWLg8A/qdmRK5zqr5sL3hSO2Cwyw7Kk7D/8vigg3RyOUdpDw61x5D1gfYs+ZR2Wufap7kW8zWr6pxV6/oRK0B7nEYsP64+iwaf4zzgXKlu/xEf/URzFu4WEt5do6YqyPeGvSp32ZrCH8EOmBzpXaHkJ4JKKcPbYaJGQ2xGZ2GzV2zx1fvb6RR7gbjlOcMx47l6AbB9615IYrDzn+xP5A4O/cOEji4yUPrsxPjn8u8A19EOnLnnzH6/7D9Xh1wWB3tq+WvCHkdzwgJzl5v4p7Nn/0qF4n7j4uY9OUeRTmOjrcAAwA2pq7tEQdVlgAAAABJRU5ErkJggg==" width="100%" height="100%" alt="background" onmousedown="return false;"/></div>
<table width="100%" cellspacing="0" cellpadding="0">
  <td class="cell" valign="middle" align="center">
    <div class="box">
      <div class="icon"><img src="data:image/png;base64,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" alt="Malware Icon" onmousedown="return false;"/></div>
      <div class="title" i18n-content="headLine"></div>
      <div class="main" i18n-values=".innerHTML:description1"></div>
      <div class="main" i18n-content="description2"></div>
      <div class="main" id="template_root">
        <table cellpadding="5" jsvalues="$counter:{value: 0}">
          <tr jsselect="errors" class="errorlist">
            <td jscontent="typeLabel"></td>
            <td jscontent="url"></td>
            <td><a href="" onclick="var id= this.getAttribute('chromiumID'); this.getAttribute('chromiumIsMalware') ? showDiagnostic(id) : reportError(id); return false;" jscontent="errorLink" jsvalues="chromiumID:$counter.value;chromiumIsMalware:type=='malware'" jseval="$counter.value++"></a></td>
          </tr>
        </table>
      </div>

      <div class="main"><a href="" i18n-content="description3" onclick="learnMore(); return false;" onmousedown="return false;"></a></div>
      <div class="main">
        <form class="submission">
          <input name="checky" id="checky" type="checkbox" onclick="agreed(this.form)">&nbsp;<label for="checky" i18n-content="confirm_text"></label>
          <input type="button" name="continue_button" i18n-values="value:continue_button" disabled="true" onclick="proceed();"><br>
          <input type="button" name="back_button" i18n-values="value:back_button" onclick="takeMeBack()">
        </form>
      </div>
    </div>
  </td>
</table>
</body>
</html>
<!DOCTYPE html>
<html i18n-values="dir:textdirection">
<head>
<title i18n-content="title"></title>
<style>
body {
  background-color:#500;
  font-family:Helvetica,Arial,sans-serif;
  margin:0px;
}
.background {
  position:absolute;
  width:100%;
  height:100%;
}
.cell {
  padding:40px;
}
.box {
  width:80%;
  background-color:white;
  color:black;
  font-size:10pt;
  line-height:16pt;
  text-align:left;
  padding:20px;
  position:relative;
  -webkit-box-shadow:3px 3px 8px #200;
  border-radius:5px;
}
html[dir='rtl'] .box {
  text-align:right;
}
.icon {
  position:absolute;
}
.title {
  margin: 0px 87px 0px;
  font-size:18pt;
  line-height: 140%;
  margin-bottom:6pt;
  font-weight:bold;
  color:#660000;
}
.main {
  margin:0px 90px 0px;
}
.submission {
  margin:15px 5px 15px 0px;
  padding:0px;
}
input {
  margin:0px;
}
.proceedbutton {
}
.helpbutton {
  float:right;
}
html[dir='rtl'] .helpbutton {
  float:left;
}
.example {
  margin: 30px 90px 0px;
  border-top:1px solid #ccc;
  padding-top:6px;
}
.moreinfotitle {
  margin-left:5px;
  margin-right:5px;
}
</style>

<script>
  function sendCommand(cmd) {
    window.domAutomationController.setAutomationId(1);
    window.domAutomationController.send(cmd);
  }

  function agreed(form) {
    form.continue_button.disabled = !form.continue_button.disabled;
  }
</script>
</head>
<body oncontextmenu="return false;">
<div class="background"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAJFCAIAAACTIQqNAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAARFJREFUeNq8VUESgzAIBMdzv9D/9tPbBEg0UwWibQ+ZqAF2Fzbt8no8FyIKFuvOWLg8A/qdmRK5zqr5sL3hSO2Cwyw7Kk7D/8vigg3RyOUdpDw61x5D1gfYs+ZR2Wufap7kW8zWr6pxV6/oRK0B7nEYsP64+iwaf4zzgXKlu/xEf/URzFu4WEt5do6YqyPeGvSp32ZrCH8EOmBzpXaHkJ4JKKcPbYaJGQ2xGZ2GzV2zx1fvb6RR7gbjlOcMx47l6AbB9615IYrDzn+xP5A4O/cOEji4yUPrsxPjn8u8A19EOnLnnzH6/7D9Xh1wWB3tq+WvCHkdzwgJzl5v4p7Nn/0qF4n7j4uY9OUeRTmOjrcAAwA2pq7tEQdVlgAAAABJRU5ErkJggg==" width="100%" height="100%" alt="background" onmousedown="return false;"></div>
<table width="100%" cellspacing="0" cellpadding="0">
  <td class="cell" valign="middle" align="center">
    <div class="box">
      <div class="icon"><img src="data:image/png;base64,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" alt="Phishing Warning Icon" onmousedown="return false;"></div>
      <div class="title" i18n-content="headLine"></div>
      <div class="main" i18n-values=".innerHTML:description1"></div>
      <div class="main"><a href="" i18n-content="description2" onclick="sendCommand('learnMore'); return false;" onmousedown="return false;"></a></div>
      <div class="main">
        <form class="submission">
          <input type="button" name="continue_button" i18n-values="value:continue_button" onclick="sendCommand('proceed')">
          <input type="button" name="back_button" i18n-values="value:back_button" onclick="sendCommand('takeMeBack')">
        </form>
      </div>
      <div class="main"><a href="" onclick="sendCommand('reportError'); return false;" onmousedown="return false;" i18n-content="report_error"></a></div>
    </div>
  </td>
</table>
</body>
</html>
<!DOCTYPE html>
<html i18n-values="dir:textdirection">
<head>
<title i18n-content="title"></title>
<style type="text/css">
body {
  background-color:#500;
  font-family:Helvetica,Arial,sans-serif;
  margin:0px;
}
.background {
  position:absolute;
  width:100%;
  height:100%;
}
.cell {
  padding:40px;
}
.box {
  width:80%;
  background-color:white;
  color:black;
  font-size:10pt;
  line-height:16pt;
  text-align:left;
  padding:20px;
  position:relative;
  -webkit-box-shadow:3px 3px 8px #200;
  border-radius:5px;
}
html[dir='rtl'] .box {
  text-align:right;
}

.icon {
  position:absolute;
}
.title {
  margin: 0px 77px 0px;
  font-size:18pt;
  line-height: 140%;
  margin-bottom:6pt;
  font-weight:bold;
  color:#660000;
}
.main {
  margin:0px 80px 0px;
}

.submission {
  margin:15px 5px 15px 0px;
  padding:0px;
}
input {
  margin:0px;
}
.helpbutton {
  float:right;
}
.example {
  margin:30px 80px 0px;
  border-top:1px solid #ccc;
  padding-top:6px;
}
.moreinfotitle {
  margin-left:5px;
  margin-right:5px;
}
</style>

<script>
  function $(o) {return document.getElementById(o);}

  function sendCommand(cmd) {
    window.domAutomationController.setAutomationId(1);
    window.domAutomationController.send(cmd);
  }

  function toggleMoreInfo(collapse) {
    if (collapse) {
      $("more_info_long").style.display = "none";
      $("more_info_short").style.display = "block";
    } else {
      $("more_info_long").style.display = "block";
      $("more_info_short").style.display = "none";
    }
  }
  function setDirectionSensitiveImages() {
    if (document.documentElement.dir == 'rtl') {
      $("twisty_closed_rtl").style.display = "inline";
    } else {
      $("twisty_closed").style.display = "inline";
    }
  }
</script>
</head>
<body oncontextmenu="return false;">
<script>
document.addEventListener('DOMContentLoaded', setDirectionSensitiveImages);
</script>
<div class="background"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAJFCAIAAACTIQqNAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAARFJREFUeNq8VUESgzAIBMdzv9D/9tPbBEg0UwWibQ+ZqAF2Fzbt8no8FyIKFuvOWLg8A/qdmRK5zqr5sL3hSO2Cwyw7Kk7D/8vigg3RyOUdpDw61x5D1gfYs+ZR2Wufap7kW8zWr6pxV6/oRK0B7nEYsP64+iwaf4zzgXKlu/xEf/URzFu4WEt5do6YqyPeGvSp32ZrCH8EOmBzpXaHkJ4JKKcPbYaJGQ2xGZ2GzV2zx1fvb6RR7gbjlOcMx47l6AbB9615IYrDzn+xP5A4O/cOEji4yUPrsxPjn8u8A19EOnLnnzH6/7D9Xh1wWB3tq+WvCHkdzwgJzl5v4p7Nn/0qF4n7j4uY9OUeRTmOjrcAAwA2pq7tEQdVlgAAAABJRU5ErkJggg==" width="100%" height="100%" alt="background" onmousedown="return false;"></div>
<table width="100%" cellspacing="0" cellpadding="0">
  <td class="cell" valign="middle" align="center">
    <div class="box">
      <div class="icon"><img src="data:image/png;base64,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" alt="SSL Error Icon" onmousedown="return false;"></div>
      <div class="title" i18n-content="headLine"></div>
      <div class="main" i18n-values=".innerHTML:description"></div>
      <div class="main">
        <form class="submission">
          <input type="button" i18n-values="value:back" name="back" onClick="sendCommand(0);">
        </form>
      </div>
      <div class="example" id="more_info_short">
      <!--
       // The img madness here is due to the inlining of the html file
       // resources. The script that does this looks for subresources like
       // images and inlines them, so we need to have references to both the
       // ltr and rtl versions statically. Just doing
       // i18n-values="src:path_to_correct_image_set_by_c++" won't work, since
       // the inlined version will just end up with that path string rather
       // than the inlined image.
      -->
        <a href="#" onclick="toggleMoreInfo(false); return false;" onmousedown="return false;"><img id="twisty_closed" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAALCAYAAACprHcmAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAEZJREFUeNqMkTEOADAIAoX//5m2Q5PGKJVNc+eAkBQ3APYoRBPmxRHGsBPYXamEFq4EC2fhC7/tcApauOqbU7CE3QeXAAMAN8UbE2RJblUAAAAASUVORK5CYII=" border="0" style="display:none"><img id="twisty_closed_rtl" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAALCAYAAACprHcmAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAABJSURBVChTY/wPBAw4ACMjIwOKNEgxNgDUDzIERQqVB5WCKSSoGFkhXsXoCnEqxqaQOibDvE20m7FpQA47rEEHjSjiwhnZBmSTAV11VL708grTAAAAAElFTkSuQmCC" border="0" style="display:none"><span i18n-content="moreInfoTitle" class="moreinfotitle"></span></a>
      </div>
      <div class="example" id="more_info_long" style="display:none;">
        <a href="#" onclick="toggleMoreInfo(true); return false;" onmousedown="return false;"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAALCAYAAACprHcmAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAEBJREFUeNpi/P//PwOxgImBBECSYkYgJtodTEA3MxKjEKSOCcYgpBDFzbg0IIsz4ZLAxmfCZRI2mxhpFikAAQYA/CAk+RTkC90AAAAASUVORK5CYII=" border="0"><span i18n-content="moreInfoTitle" class="moreinfotitle"></span></a>
        <p i18n-values=".innerHTML:moreInfo1"></p>
        <p i18n-values=".innerHTML:moreInfo2"></p>
        <p i18n-values=".innerHTML:moreInfo3"></p>
        <p i18n-values=".innerHTML:moreInfo4"></p>
        <p i18n-values=".innerHTML:moreInfo5"></p>
      </div>
  </td>
</table>
</body>
</html>
<!DOCTYPE html>
<html i18n-values="dir:textdirection">
<head>
<title i18n-content="title"></title>
<style type="text/css">
body {
  background-color:#500;
  font-family:Helvetica,Arial,sans-serif;
  margin:0px;
}
.background {
  position:absolute;
  width:100%;
  height:100%;
}
.cell {
  padding:40px;
}
.box {
  width:80%;
  background-color:white;
  color:black;
  font-size:10pt;
  line-height:16pt;
  text-align:left;
  padding:20px;
  position:relative;
  -webkit-box-shadow:3px 3px 8px #200;
  border-radius:5px;
}
html[dir='rtl'] .box {
  text-align:right;
}

.icon {
  position:absolute;
}
.title {
  margin: 0px 77px 0px;
  font-size:18pt;
  line-height: 140%;
  margin-bottom:6pt;
  font-weight:bold;
  color:#660000;
}
.main {
  margin:0px 80px 0px;
}

.submission {
  margin:15px 5px 15px 0px;
  padding:0px;
}
input {
  margin:0px;
}
.proceedbutton {
}
.helpbutton {
  float:right;
}
.example {
  margin:30px 80px 0px;
  border-top:1px solid #ccc;
  padding-top:6px;
}
.moreinfotitle {
  margin-left:5px;
  margin-right:5px;
}
</style>

<script>
  function $(o) {return document.getElementById(o);}

  function sendCommand(cmd) {
    window.domAutomationController.setAutomationId(1);
    window.domAutomationController.send(cmd);
  }

  function toggleMoreInfo(collapse) {
    if (collapse) {
      $("more_info_long").style.display = "none";
      $("more_info_short").style.display = "block";
    } else {
      $("more_info_long").style.display = "block";
      $("more_info_short").style.display = "none";
    }
  }
  function setDirectionSensitiveImages() {
    if (document.documentElement.dir == 'rtl') {
      $("twisty_closed_rtl").style.display = "inline";
    } else {
      $("twisty_closed").style.display = "inline";
    }
  }
</script>
</head>
<body oncontextmenu="return false;">
<script>
document.addEventListener('DOMContentLoaded', setDirectionSensitiveImages);
</script>
<div class="background"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAJFCAIAAACTIQqNAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAARFJREFUeNq8VUESgzAIBMdzv9D/9tPbBEg0UwWibQ+ZqAF2Fzbt8no8FyIKFuvOWLg8A/qdmRK5zqr5sL3hSO2Cwyw7Kk7D/8vigg3RyOUdpDw61x5D1gfYs+ZR2Wufap7kW8zWr6pxV6/oRK0B7nEYsP64+iwaf4zzgXKlu/xEf/URzFu4WEt5do6YqyPeGvSp32ZrCH8EOmBzpXaHkJ4JKKcPbYaJGQ2xGZ2GzV2zx1fvb6RR7gbjlOcMx47l6AbB9615IYrDzn+xP5A4O/cOEji4yUPrsxPjn8u8A19EOnLnnzH6/7D9Xh1wWB3tq+WvCHkdzwgJzl5v4p7Nn/0qF4n7j4uY9OUeRTmOjrcAAwA2pq7tEQdVlgAAAABJRU5ErkJggg==" width="100%" height="100%" alt="background" onmousedown="return false;"></div>
<table width="100%" cellspacing="0" cellpadding="0">
  <td class="cell" valign="middle" align="center">
    <div class="box">
      <div class="icon"><img src="data:image/png;base64,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" alt="SSL Error Icon" onmousedown="return false;"></div>
      <div class="title" i18n-content="headLine"></div>
      <div class="main" i18n-values=".innerHTML:description"></div>
      <div class="main">
        <form class="submission">
          <input type="button" i18n-values="value:proceed" name="proceed" class="proceedbutton" onClick="sendCommand(1);">
          <input type="button" i18n-values="value:exit" name="exit" onClick="sendCommand(0);">
        </form>
      </div>
      <div class="example" id="more_info_short">
      <!--
       // The img madness here is due to the inlining of the html file
       // resources. The script that does this looks for subresources like
       // images and inlines them, so we need to have references to both the
       // ltr and rtl versions statically. Just doing
       // i18n-values="src:path_to_correct_image_set_by_c++" won't work, since
       // the inlined version will just end up with that path string rather
       // than the inlined image.
      -->
        <a href="#" onclick="toggleMoreInfo(false); return false;" onmousedown="return false;"><img id="twisty_closed" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAALCAYAAACprHcmAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAEZJREFUeNqMkTEOADAIAoX//5m2Q5PGKJVNc+eAkBQ3APYoRBPmxRHGsBPYXamEFq4EC2fhC7/tcApauOqbU7CE3QeXAAMAN8UbE2RJblUAAAAASUVORK5CYII=" border="0" style="display:none"><img id="twisty_closed_rtl" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAALCAYAAACprHcmAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAABJSURBVChTY/wPBAw4ACMjIwOKNEgxNgDUDzIERQqVB5WCKSSoGFkhXsXoCnEqxqaQOibDvE20m7FpQA47rEEHjSjiwhnZBmSTAV11VL708grTAAAAAElFTkSuQmCC" border="0" style="display:none"><span i18n-content="moreInfoTitle" class="moreinfotitle"></span></a>
      </div>
      <div class="example" id="more_info_long" style="display:none;">
        <a href="#" onclick="toggleMoreInfo(true); return false;" onmousedown="return false;"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAALCAYAAACprHcmAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAEBJREFUeNpi/P//PwOxgImBBECSYkYgJtodTEA3MxKjEKSOCcYgpBDFzbg0IIsz4ZLAxmfCZRI2mxhpFikAAQYA/CAk+RTkC90AAAAASUVORK5CYII=" border="0"><span i18n-content="moreInfoTitle" class="moreinfotitle"></span></a>
        <p i18n-values=".innerHTML:moreInfo1"></p>
        <p i18n-values=".innerHTML:moreInfo2"></p>
        <p i18n-values=".innerHTML:moreInfo3"></p>
        <p i18n-values=".innerHTML:moreInfo4"></p>
        <p i18n-values=".innerHTML:moreInfo5"></p>
      </div>
  </td>
</table>
</body>
</html>
<html i18n-values="dir:textdirection;">
<head>
<title></title>
<style type="text/css">
body {
   line-height: 1.5em;
   background: #FFFFFF;
   margin: 10px 15px;
   font-size: 11pt;
}
html[os='mac'] body {
  line-height: 1.5em;
  margin: 15px 20px;
  background: #FFFFFF;
}
form {
  -webkit-user-select: none;
}
.sync-header {
  font-size: 1.2em;
  font-weight: bold;
  margin-bottom: 10px;
}
.sync-select-customization {
  margin-top: 10px;
}
#chooseDataTypesRadio {
  vertical-align: top;
}
#chooseDataTypes > div {
  display: inline-block;
}
#chooseDataTypesBody {
  width: 90%;
  -webkit-margin-start: 3ex;
}
#chooseDataTypesBody > div {
  margin-top: 0px;
  -webkit-column-count: 2;
  -webkit-column-gap: 10px;
  column-count: 2;
  column-gap: 10px;
}
.sync-item-show {
  display: block;
  white-space: nowrap;
}

.sync-item-show > label {
 overflow: hidden;
 white-space: nowrap;
 text-overflow: ellipsis;
 display: inline-block;
 width: 92%;
}

.sync-item-hide {
  display: none;
}
.sync-label-inactive {
  color: #9B9B9B;
}
.sync-label-active {
  color: #000000;
}
.sync-data-types {
  margin-left: 5px;
}
.sync-errors {
  margin-top: 5px;
}
.sync-error-show {
  display: block;
  width: 80%;
  margin-left: auto;
  margin-right: auto;
  text-align: center;
  padding: 1px 10px;
  background-color: #eeb939;
  -webkit-border-radius: 4px;
  font-weight: bold;
}
.sync-error-hide {
  display: none;
}
.sync-footer {
  position: fixed;
  right: 0px;
  bottom: 0px;
  margin-right: 10px;
  margin-bottom: 10px;
}
html[dir='rtl'] .sync-footer {
  text-align: left;
  left: 0px;
  bottom: 0px;
  margin-left: 20px;
}
#throb {
  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAkAAAAAQCAYAAAD+i8DoAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAEahJREFUeNrtXX2IXNUVHwgsLAQWhEAgEAgsLAwMLFldjYlGo9H4CQFBKAjqtlujUWusNdQ2duvqpmOmnXbswta1UTEamzatbeq2226ZOnbN1MWpa9dsXI39SBubEggEFhYWpr/fnXNn7szOx7vnpV2Svj8OJLPzm/Nx77vn3HPPPS+2/p6RWAPqAE2CFkFToBSoq8n3G1EalAPtBq1W4EmbhH9CiY8ooogiuhCoE7QtBH6NrLlHlOv1WlBS1vy/gu5QyE/+s6AiaB404IFfLb7C+h7+RgHUHxAfd+S3eOu/4gH1p/zTgi2KLumAeNp/SHzeaUf+pAd/Kz/xZ+Tf/M11AfAc80HBzAv/aQ/5u+S7BcEuOPx97EfMWaEp0akz4Phb/Yuif174rwk4B7oFY8dvppH+TSfypZ//YfHGbx0v3vbc6eK25EfFa/dMzvfueHWXx2Ru5yS8ds87+J3Z4uavZouX9b+Ykc99HqqTVzz4Y/IvXn7/wREFnjQqxuCDsEK5uHAC3qnkH1FEEV28tEIcz5hyo9cmi/Ri744DxSu/9LM7FXgGDucu63+pyDV36zMfDGK99pGfTqZ42RdfLl779T+YNf/m7/xt/8ZdR4Lyp/4LlJ/8b0qdKN72/X8Xb818VrjmibeC/Mag4d//ovEV1vfwN7Y9O7dw1VfGA9nv8vtfK8tfxpf81zn8bWUTX/UEgwajP+Tftu9jgyVRF34G/FAT+yUNHva/5mtvG593y3f/YeU3MgGfElkD2Z94Ev/N3+y975VMA7wzf17Fd3MGA9uX+EMXkb8ZnrIViTf6Q2Yzfs/9y/KnbdMN8KQdZfmJp/zf+6chY3/ohLkx1ARPepnjXx4/8Kf+NyaPG/6wbRD/PXj5A68bjB2/bfs+sfqnXP/ddEJC2K0AvwyasT9Eg169+3djLZQoU0/f6HZMwimLJ2158ugEPvcJIvbcnP57Bf+NP2aBb/NcILJbBt41eDwIE+vv/UGbYpEqYAIWNz76y3EFf0vb5UGPgqiIIjp/tCYEls/yIdkxb1Lix7GmGMez9Zk/341FPOa5URzrufd5s0hjvTyLdWoz1hkf/gbPwOHWzCmuc2OgtZDHU/637To7CRoErb5uYCpI8HSY/Kk/HSZwXPNHQMOgBJxpK/4H6DyJF/4TgiflQDvwu03ld+xXFJ+1X8j6rxOwTXtP3wv17M81Hfb7vQ0aKP+o8C+4/gs2uqSO/gdoPzpuB2/lr/J/8D8cq1r8WB37W3y2xn8Sv6Le+Dv6u/bL1+CP4Lu1/itdwk/a7+UFO+r6f/42eIzVwZMOX/X4byw+20h+6DheI79Lfdd9871TYvPRJfIb/pOHYatm/nM15lHK4V+osf+E9d8tH44ND/80BoFiiKB6AZ61P4KHPFUziA1p4yO/iCGaSwA3bfE37P1wGEIEXiQ2P/FWt2uIG/YeywTlb1NzwBQc/klPPOmQjYpvGJoZVuC5+1iEPfige+lf87Byp3FX5PQiukhopZAWny5lDl5KKvFcS4rXD/6JzmsXss2+eK4lXBOKsth2bHrsV3784XyxplrHE8euObbhoZ94yS94OtseUAz/j2E37is/12iutTFkYGIMoAIEcyk6761Pv2/lN3is+TFsVmNbnszHkLlvhh8w9n/qPcu/i3is0SU8CNmUGJxrw/F35KeP6jX8930SY/BGwr878NnKm779l1iddTdN+zvj11uWf+Bdwx/rfhyfHQTt4d8u/cJ+Fz9E/UX+sv3L+hOf/KjH8V9nOTZVmS/arzR+1D9h7W/x8F1x15HjuwPAlDMvzvib+bPEfsnjva7/RHaw1n8PmOCpxMPID0wJDxvAfvzshMO/nv9dgznQX+F/zJU/4coPW6cd+avoqsd+HbslfZI2L9sfsvRU6f/0+039J+csAp2K/Z+d663iv/dDI7/Xg37Fzh+1IxVoo0EcbU3GffB4CFYiFZevRKJ5r5oepLU6YAgbTS8ikk04EXRLPBaDdhiibARE652+wQcWSYd/3rsmCbuPnE3LAh9XLNZ38WGF7Iubvvxmp3LB75Us1KrI+Ua0zMRn4Cyei1OgDiW+KIv3QTwXKjzWEuu82pHh9sF3G/7Y+csCyzUmhvIBDX+uje10PEjVB8VzDVp08XS8WKt9anaq5d/3MddaL/6SOTDBn5E/OJ6Zu3M4IrNZD/qImMfRXcKWWUjwQx9VV3+OSZ3sjzt/GHx0cPzq4Tkm1z9V4Ga8Vv55ydzkDb6B/ek/YZu78Z0NDHDlc67Bi5L5qti/TsAI/pxb1n8eco4VNyM4PCNZv4bzR/hPOf67qqYIv7fOBG4N9MdnDCCnHf8bXxp4vBTjUWU9/tCp2v/ueSfhGX+sBH7KiR/inniOrSt/IubvwEd7EA0uSjoqpQgAujAIiyLEsC8ek7jHng2Cf6b8twbRZB354zCC5a+Qf7QL/K3+acWC3YXdjFp/4hH4WP21O94TmAzMQmWUeGah+kIeO0R0cdBOqa3brc2+sGYDDmERu77VHoGDpWHiuaAxc0AHpeEvz2M3nZdnZnaY9QaCN0c9nniX/wY6L098Go6FawH1jyvwSdbsiP3iOvkP2mOXHs/gz+BZM4OjKTN+zHrUCVKC8Cd+A4Mfpf1L+iP48JR/qCT/ZyX5Yf9meMrG7OAVDx4qr6XIJk1C/jngO1vZH39bCR53MdDCZrxyUoNsIWplTNavBT6OOb4g/mPrkrKX+15p5b97YSPr/4YV/jNuT1E0/g/842X/q4sfulz5VYsenOeEPWfV4BHdZwU/q+RvzxRVeEz4XBj+kD8XUv/w/EPoz/NiRPJh8HuYhUKqcjKE41wX8tgjovNDA3JLoluJn7v68d+amhPUn6jwkr3gmhDzrJ0hzWInWDR1IsB7ZA4c/FFbM+GTuajlP2nwzY966tGM8Ocz7TrGwHjJXhj9PTJHZfkl+6PGl8eP8gfPPC3VP9z4GbzCftMuXqH/dhbncjOtlN8ELAz8bkp9yrrbIEFADJvgmGKzYP1fN+qpbud4Kf3vG+K/Div5ny//PRfS/85pF80UztDMWaYef4z4+WXCp1mhfx7w57Tyh+SfCYlPyXnxgha/uZSy1vL/nLltcN8r0yELV6MA5p6Ru0FvhMjGmeMHZHVTCudPmsfCzbmQrqlrCEoLgs+wZkDH39w24jMZBs81LQx+mE5Mg+cNlRDynwuJP4/2O7Yc+lv+GSV+TG577VTiTY0rgx/WnFwo6waf9Ssf+bkWv2rr09MPw2baNScp/vtUSP+7EBavDoDkzPdcSPxCSLzWAQ/Lrmlezz8UPh1Wf9m1zC+T/Sx+URvAbXz0zTDzh71JFlHENnqR1MCkAvb4qEdnkFJHUeD0IM/fNQ5Ebg2llQv4vNx6Af4dlQOXW0NpzOnl4G/xqbD6s9hXgT9b4a+Sf1HGLxVS/5Hltp+S/0nB9yvnzwoE7qb2BZnMaEMV9CgJReBX755QB1DIOmZg8+3aACq8/y3htQqMiwOcUeJzgtcewWQFP6flL2lr9RFSSPlztmhvmew3EXL8xsLb/2io+YPeJDzD1eKHpMHWtvO0INyuvD5tniXTtwRXM1udvzc6QpBeI7mAV56XHCGIA8kpHdBcSPyMOHAt3sqfDYmfUDpwi5/U6s8+KSX9VfznJJ2fDSs/b8uEmz8q/oWQAdBqtEhhu5ZYiz5BjQn1o8pnL6IQAZQyYDWF+wigeGT9mBJ/WPzvjGrCcdchVwZVRcDESwpqWIuXFNqwcsdt+ae0/OUIScM/4fBPhrRfSsm/KEeYmZD6a/C9jvyZ5Zo/vLWBwCHp1COx02yQW0hM+05J3xLb16mIdPICrk9rbuVl5FnCnP5Q07k3I0cIbLymuVU4LEcItGm3Dv+pxav4i/yLYeXHmqCyn23YB/trOs0nLR5HYImQ+neGsb9Sf1f+MPY/qTxC6kZRLK+WX6IMgEzdGNu1RIHF/w+xVkp5ZG3KBnCNnrfm+lQBECbcPHYdrCTXPPAH2WlSdi2+DxzrPnIOvluBL5iq/xLe+xo8aDKE/MRPObcWEhq8w99XfhYd5w3/0q2HhAIfVv8Z3kALoX+uAf+tchOpXYEfZ4NL7CCnUFjY1mr+8NYHbyKi7wcDpgRqABalY2oWD2Yr/gycTqyvvKYgjp2QvZXAsW0PMIerAtoyHrtwzG3f2qiEZEMNf9QGrAyBnwb/DgXe6p9XyB93+OcC2C/W3H4H2xS7UYsv8KpvCP0nW8yfRvpbfFZRhLvWkb9fUQS8CvzNcQYyMep6FF4tr+mtE1FE/zXiTTzemtNG3JcgbbmqSWfOZrQfV1XN7l9RhW4aZsnuf9QTz+6dU8TLNbxG+BVN+mVM8vaTadFe6nDqm3kweLnGn2HhnCd+ysEnPfmb96PgBoFtEZ7y5M9gZdrgS/o3Gr/2BpkUZn5mjfylHW+t/rQ7MzoH19d/51uv1d9mfxz+5LmAXSA74dLGPQ3kzzn4EQc/JFkY2pZzJN5g/N35U7Y/nN6w7e2EXTj5dzfAs4O5aZiGW3j91lmxPb3Tsj/Pq6INxj9LPSFDX01/jSGLh26UsasBvr/ezTvgR8st46l/3wteGwu+nqbScv7jAoLIXk98WX/MzRnI74l/bdjyh/65BvYLxp/4e5/v9tyNjjivbCiA/zo9/+OHfRukuvMH88+7MBX90fqBZ8f/VZpjJHucwWLgyLlGdCFRqDM8bcSOzpymU6TiDPAOaZh1BNTGLpE+/Uogrw0eeGW1vSF+aU+hDSzWZL8Mcf4lfLCiRzqe8fXyjhXBjxv5W+u/TupVyniRn+efbS2avjEIGBHidfWi836UQ6AVTc7s94iztXjzYjpmjuTGxKGS/kfrBZmn6eThBHnDa7+QebEgMz+SLh+ro/86dkPlbp4BMngVHP4Fi3f0r7I/eB6RYlpjY3zXxees/BL8ZA2+UvPQhiOxrBME8J0xEw5+rGT/A5b/uLFfxf6UZbzihI/T1pMOfsLi5ejWyO84G9qigscYgf+M2I74vB1/4qHnELulusEj5B9z5cd3XfmzFg+emXqvAsCzkKvS/4HX8zXjPyNZtrpBL2xZwSNArLH/YIvjReqfdd/bA7ydP0Fexkn7Z50giPYj/6Dv06rib/APvD7kk5ms0X/Ws6aE/O34nUJ63vtGJPA8RtrJdVVTDM+5yI7/URYmoigA+l9cw/NPtZauHO460lFq8/5BzPNVFF2o8s9J5qK91HAr8E4L7fEP2Xfs+OJHjOOSDINkHtrx/yDym6MZ1qs4eGYeVvD8swX+NAMGLMyGJPCy/NtME636zSMZxBR5zZ3O1uLLzSdL7weKEV9H/zVYQBfKLwBEsIRg15AETvOgXbZNf6380DXlvrOFjrTMv5R1mRf+7Ub/av7tmBMjjfAS+NjMUTuv7Lp4yMLPqvCsk7J4qXmqGj/Xfny3HT6rwtPmFi81V+X5Uys/363D9vByNFkOBGg7I3/lxX4GjzlRG7S3sT19I/kl8CL11Qu8KT9slHH5k6c7/pAn3ajWQvAN7Y8C7Z1NG8RR/73HhqvwMn/wzG8J0EtlyfiRP96nFSgjIuPv8p9fYuPm/Nugv52/42zI59ULBvwxfmxw18XXAHj3ksGzxGOk6CZTRBFdAAFQqApyZQMoHjmwUI8OwDPN3Ib2+HfYd9x44rvhALjjT9t3vDDzEBC/E07xjLToZ+BjrmuazEPrztdJBCKs0zotGYdUFf8mwROCmIerXoBX+vduvhiR+Ga3jbD77ESGIuW8d+W0ZOy4Q+3C0Wms2asGkJVaI7zcF/gVxH5riSf/evbjZ9AtIbpOCO+zYr9UZfzyzfCdYmtizjl4ftbZbPwE3y2yMtg+IwGFxSeazR+OCQpBu9nhu+YFfjPym/FWePytmfxrzW2Z6uxRtfxPHl3HDu+COWsblknguKpZoapjf353zpHfvN+plXMuyZ+39is4uq/Z8NDhQA3lHP6z8iLnwBmRkv6GP/XfzrnmG4Rg/q4y70Ea8r9gYroEo8GdppleRBFF5E//AeL3z6N0NJHvAAAAAElFTkSuQmCC");
  width: 16px;
  height: 16px;
  background-position: 0px;
  margin: -3px 10px;
  display: inline-block;
}
input[type='button'],
input[type='submit'] {
  min-width: 87px;
  min-height: 26px;
}
html[os='mac'] input[type='button'],
html[os='mac'] input[type='submit'] {
  font-size: 12pt;
}

</style>
<script src="chrome://resources/js/cr.js"></script>
<script>

  // Called once, when this html/js is loaded.
  function initializeChooseDataTypesDialog() {
    // Allow platform specific rules
    if (cr.isMac) {
      document.documentElement.setAttribute('os', 'mac');
    } else if (!cr.isWindows) {
      document.documentElement.setAttribute('os', 'linux');
    }

    setInterval(advanceThrobber, 30);
    var args = JSON.parse(chrome.dialogArguments);
    setChooseDataTypesCheckboxes(args);
  }

  function setCheckboxesAndErrors(args) {
    setChooseDataTypesCheckboxes(args);
    setErrorState(args);
  }

  // Can be called multiple times.
  function setChooseDataTypesCheckboxes(args) {
    setStateThrobbing(false);

    // If this frame is on top, the focus should be on it, so pressing enter
    // submits this form.
    if (args.iframeToShow == 'choose_data_types') {
      document.getElementById("okButton").focus();
    }

    document.getElementById("keepEverythingSyncedRadio").checked =
        args.keepEverythingSynced;
    document.getElementById("chooseDataTypesRadio").checked =
        !args.keepEverythingSynced;
    setDataTypeCheckboxesEnabled(!args.keepEverythingSynced);

    document.getElementById("bookmarksCheckbox").checked = args.syncBookmarks;
    document.getElementById("preferencesCheckbox").checked =
        args.syncPreferences;
    document.getElementById("themesCheckbox").checked = args.syncThemes;

    if (args.passwordsRegistered) {
      document.getElementById("passwordsCheckbox").checked = args.syncPasswords;
      document.getElementById("passwordsItem").className = "sync-item-show";
    } else {
      document.getElementById("passwordsItem").className = "sync-item-hide";
    }
    if (args.autofillRegistered) {
      document.getElementById("autofillCheckbox").checked = args.syncAutofill;
      document.getElementById("autofillItem").className = "sync-item-show";
    } else {
      document.getElementById("autofillItem").className = "sync-item-hide";
    }
    if (args.extensionsRegistered) {
      document.getElementById("extensionsCheckbox").checked =
          args.syncExtensions;
      document.getElementById("extensionsItem").className = "sync-item-show";
    } else {
      document.getElementById("extensionsItem").className = "sync-item-hide";
    }
    if (args.typedUrlsRegistered) {
      document.getElementById("typedUrlsCheckbox").checked = args.syncTypedUrls;
      document.getElementById("omniboxItem").className = "sync-item-show";
    } else {
      document.getElementById("omniboxItem").className = "sync-item-hide";
    }
    if (args.appsRegistered) {
      document.getElementById("appsCheckbox").checked =
          args.syncApps;
      document.getElementById("appsItem").className = "sync-item-show";
    } else {
      document.getElementById("appsItem").className = "sync-item-hide";
    }
  }

  function setErrorState(args) {
    if (!args.was_aborted)
      return;
    document.getElementById("aborted_text").className = "sync-error-show";
    document.getElementById("okButton").disabled = true;
    document.getElementById("keepEverythingSyncedRadio").disabled = true;
    document.getElementById("chooseDataTypesRadio").disabled = true;
  }

  function setDataTypeCheckboxesEnabled(enabled) {
    var checkboxes = document.getElementsByName("dataTypeCheckbox");
    var labels = document.getElementsByName("dataTypeLabel");
    for (var i = 0; i < checkboxes.length; i++) {
      checkboxes[i].disabled = !enabled;
      if (checkboxes[i].disabled) {
        labels[i].className = "sync-label-inactive";
      } else {
        labels[i].className = "sync-label-active";
      }
    }
  }

  function advanceThrobber() {
    var throbber = document.getElementById('throb');
    throbber.style.backgroundPositionX =
        ((parseInt(getComputedStyle(throbber).backgroundPositionX) - 16) %
        576) + 'px';
  }

  function setStateThrobbing(isThrobbing) {
    var throbberContainer = document.getElementById('throbber_container');
    throbberContainer.style.visibility = isThrobbing ? "visible" : "hidden";

    var okButton = document.getElementById('okButton');
    okButton.disabled = isThrobbing || templateData["was_aborted"];
    okButton.value = isThrobbing ? templateData['settingup'] :
        templateData['ok'];
  }

  // Returns true if at least one data type is enabled and no data types are
  // checked.  (If all data type checkboxes are disabled, it's because "keep
  // everything synced" is checked.)
  function noDataTypesChecked() {
    var checkboxes = document.getElementsByName("dataTypeCheckbox");
    var atLeastOneChecked = false;
    var atLeastOneEnabled = false;
    for (var i = 0; i < checkboxes.length; i++) {
      if (!checkboxes[i].disabled && checkboxes[i].style.display != 'none') {
        atLeastOneEnabled = true;
        if (checkboxes[i].checked) {
          atLeastOneChecked = true;
        }
      }
    }
    return atLeastOneEnabled && !atLeastOneChecked;
  }

  function sendChooseDataTypesAndClose() {
    // Trying to submit, so hide previous errors.
    document.getElementById("aborted_text").className = "sync-error-hide";
    document.getElementById("error_text").className = "sync-error-hide";

    if (noDataTypesChecked()) {
      document.getElementById("error_text").className = "sync-error-show";
      return;
    }

    setStateThrobbing(true);

    var f = document.getElementById("chooseDataTypesForm");
    var syncAll = f.keepEverythingSyncedRadio.checked;
    // These values need to be kept in sync with where they are read in
    // SyncSetupFlow::GetDataTypeChoiceData().
    var result = JSON.stringify({
        "keepEverythingSynced": syncAll,
        "syncBookmarks": syncAll || f.bookmarksCheckbox.checked,
        "syncPreferences": syncAll || f.preferencesCheckbox.checked,
        "syncThemes": syncAll || f.themesCheckbox.checked,
        "syncPasswords": syncAll || f.passwordsCheckbox.checked,
        "syncAutofill": syncAll || f.autofillCheckbox.checked,
        "syncExtensions": syncAll || f.extensionsCheckbox.checked,
        "syncTypedUrls": syncAll || f.typedUrlsCheckbox.checked,
        "syncApps": syncAll || f.appsCheckbox.checked
    });
    chrome.send("ChooseDataTypes", [result]);
  }

</script>
</head>
<body i18n-values=".style.fontFamily:fontfamily"
      onload="initializeChooseDataTypesDialog();">
<form id="chooseDataTypesForm" 
      onSubmit="sendChooseDataTypesAndClose(); return false;">

 <div class="sync-header" 
      i18n-content="choosedatatypesheader"></div>
 <div class="sync-choose_data_types_instructions" 
      i18n-content="choosedatatypesinstructions"></div>
 <div class="sync-select-customization">
 <div class="sync-choice_radio">
   <input id="keepEverythingSyncedRadio" type="radio" name="syncChooseDataTypes"
          onclick="setDataTypeCheckboxesEnabled(false)">
   <label for="keepEverythingSyncedRadio" i18n-content="keepeverythingsynced">
   </label>
 </div>
 <div id="chooseDataTypes" class="sync-choice_radio">
   <input id="chooseDataTypesRadio" type="radio" name="syncChooseDataTypes" 
          onclick="setDataTypeCheckboxesEnabled(true)">
   <label for="chooseDataTypesRadio" i18n-content="choosedatatypes" ></label>
   <div id="chooseDataTypesBody">
   <div>
     <!-- Apps -->
     <div class="sync-item-show" id="appsItem">
       <input id="appsCheckbox" name="dataTypeCheckbox" type="checkbox">
       <label id="appsCheckboxLabel" name="dataTypeLabel" 
              for="appsCheckbox" i18n-content="apps"
              i18n-values="title:apps"></label>
     </div>
     <!-- Autofill -->
     <div class="sync-item-show" id="autofillItem">
       <input id="autofillCheckbox" name="dataTypeCheckbox" type="checkbox">
       <label id="autofillCheckboxLabel" name="dataTypeLabel" 
              for="autofillCheckbox" i18n-content="autofill"
              i18n-values="title:autofill"></label>
     </div>
     <!-- Bookmarks -->
     <div class="sync-item-show" id="bookmarksItem">
       <input id="bookmarksCheckbox" name="dataTypeCheckbox" type="checkbox">
       <label id="bookmarksCheckboxLabel" name="dataTypeLabel" 
              for="bookmarksCheckbox" i18n-content="bookmarks"
              i18n-values="title:bookmarks"></label>
     </div>
     <!-- Extensions -->
     <div class="sync-item-show" id="extensionsItem">
       <input id="extensionsCheckbox" name="dataTypeCheckbox" type="checkbox">
       <label id="extensionsCheckboxLabel" name="dataTypeLabel" 
              for="extensionsCheckbox" i18n-content="extensions"
              i18n-values="title:extensions"></label>
     </div>
     <!-- Omnibox -->
     <div class="sync-item-show" id="omniboxItem">
       <input id="typedUrlsCheckbox" name="dataTypeCheckbox" type="checkbox">
       <label id="typedUrlsCheckboxLabel" name="dataTypeLabel" 
              for="typedUrlsCheckbox" i18n-content="typedurls"
              i18n-values="title:typedurls"></label>
     </div>
     <!-- Passwords -->
     <div class="sync-item-show" id="passwordsItem">
       <input id="passwordsCheckbox" name="dataTypeCheckbox" type="checkbox">
       <label id="passwordsCheckboxLabel" name="dataTypeLabel" 
              for="passwordsCheckbox" i18n-content="passwords"
              i18n-values="title:passwords"></label>
     </div>
     <!-- Preferences -->
     <div class="sync-item-show" id="preferencesItem">
       <input id="preferencesCheckbox" name="dataTypeCheckbox" type="checkbox">
       <label id="preferencesCheckboxLabel" name="dataTypeLabel" 
              for="preferencesCheckbox" i18n-content="preferences"
              i18n-values="title:preferences"></label>
     </div>
     <!-- Themes -->
     <div class="sync-item-show" id="themesItem">
       <input id="themesCheckbox" name="dataTypeCheckbox" type="checkbox">
       <label id="themesCheckboxLabel" name="dataTypeLabel" for="themesCheckbox"
              i18n-content="themes" i18n-values="title:themes"></label>
     </div>
  </div>
  </div>
 </div>
 <div class="sync-errors">
   <span id="error_text" i18n-content="synczerodatatypeserror"
         class="sync-error-hide"></span>
   <span id="aborted_text" i18n-content="setupabortederror"
         class="sync-error-hide"></span>
 </div>
 <div class="sync-footer">
   <span id="throbber_container" style="visibility:hidden">
     <span id="throb"></span>
   </span>
   <input id="okButton" type="submit" i18n-values="value:ok" />
   <input id="cancelButton" type="button" i18n-values="value:cancel"
             onclick='chrome.send("DialogClose", [""])' />
 </div>
</div>
</form>
</body>
</html>
<html i18n-values="dir:textdirection;">
<head>
<title></title>
<style type="text/css">
body {
  background: #FFFFFF;
  font-size: 11pt;
  line-height: 1.5em;
  margin: 10px 15px;
  -webkit-user-select: none;
}
.sync-header {
  font-size: 1.2em;
  font-weight: bold;
}
.sync-success-image {
  text-align: center;
  margin: 20px;
}
#user {
  font-weight: bold;
}
.sync-footer {
  position: fixed;
  right: 0px;
  bottom: 0px;
  margin-right: 10px;
  margin-bottom: 10px;
}
html[dir='rtl'] .sync-footer {
  text-align: left;
  left: 0px;
  bottom: 0px;
  margin-left: 20px;
}
input[type='submit'] {
  min-width: 87px;
  min-height: 26px;
}
html[os='mac'] input[type='submit'] {
  font-size: 12pt;
}

</style>
<script>
  function setShowFirstTimeSetupSummary() {
    // TODO(hclam): Show the information for the first time setup.
  }
  function setSyncedToUser(synced_to) {
    document.getElementById('user').innerHTML = synced_to;
  }
  function onPageShown() {
    document.getElementById("close").focus();
  }
</script>
</head>
<body i18n-values=".style.fontFamily:fontfamily">
  <div class="sync-header" i18n-content="success"></div>
  <div class="sync-success-image">
    <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAADUBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+Cjx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDQuMi4yLWMwNjMgNTMuMzUyNjI0LCAyMDA4LzA3LzMwLTE4OjA1OjQxICAgICAgICAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgeG1sbnM6eG1wUmlnaHRzPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvcmlnaHRzLyIKICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgIHhtbG5zOklwdGM0eG1wQ29yZT0iaHR0cDovL2lwdGMub3JnL3N0ZC9JcHRjNHhtcENvcmUvMS4wL3htbG5zLyIKICAgeG1wUmlnaHRzOk1hcmtlZD0iRmFsc2UiCiAgIHhtcFJpZ2h0czpXZWJTdGF0ZW1lbnQ9IiIKICAgcGhvdG9zaG9wOkF1dGhvcnNQb3NpdGlvbj0iIj4KICAgPGRjOnJpZ2h0cz4KICAgIDxyZGY6QWx0PgogICAgIDxyZGY6bGkgeG1sOmxhbmc9IngtZGVmYXVsdCIvPgogICAgPC9yZGY6QWx0PgogICA8L2RjOnJpZ2h0cz4KICAgPGRjOmNyZWF0b3I+CiAgICA8cmRmOlNlcT4KICAgICA8cmRmOmxpLz4KICAgIDwvcmRmOlNlcT4KICAgPC9kYzpjcmVhdG9yPgogICA8ZGM6dGl0bGU+CiAgICA8cmRmOkFsdD4KICAgICA8cmRmOmxpIHhtbDpsYW5nPSJ4LWRlZmF1bHQiLz4KICAgIDwvcmRmOkFsdD4KICAgPC9kYzp0aXRsZT4KICAgPHhtcFJpZ2h0czpVc2FnZVRlcm1zPgogICAgPHJkZjpBbHQ+CiAgICAgPHJkZjpsaSB4bWw6bGFuZz0ieC1kZWZhdWx0Ii8+CiAgICA8L3JkZjpBbHQ+CiAgIDwveG1wUmlnaHRzOlVzYWdlVGVybXM+CiAgIDxJcHRjNHhtcENvcmU6Q3JlYXRvckNvbnRhY3RJbmZvCiAgICBJcHRjNHhtcENvcmU6Q2lBZHJFeHRhZHI9IiIKICAgIElwdGM0eG1wQ29yZTpDaUFkckNpdHk9IiIKICAgIElwdGM0eG1wQ29yZTpDaUFkclJlZ2lvbj0iIgogICAgSXB0YzR4bXBDb3JlOkNpQWRyUGNvZGU9IiIKICAgIElwdGM0eG1wQ29yZTpDaUFkckN0cnk9IiIKICAgIElwdGM0eG1wQ29yZTpDaVRlbFdvcms9IiIKICAgIElwdGM0eG1wQ29yZTpDaUVtYWlsV29yaz0iIgogICAgSXB0YzR4bXBDb3JlOkNpVXJsV29yaz0iIi8+CiAgPC9yZGY6RGVzY3JpcHRpb24+CiA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9InciPz6E0RvlAAAUU0lEQVR42uxdCXwUVZr/qu/upBPIQQJJJBAgcihBITiDDjPOODjoyqygHA7orMfsuqLCrK4ILkNERVnxQJkdxfXgJwoeeM3i4LE4yg0aSEhIJyEkIeSA3J3u6uqurnnfq9d0J6aPdLpTafTr30s6larqft//u99RnCRJ8CMpR9yPAChLmvNIcNyP3FBSA8IG4FCUvtk0UJOfRtIMpOnZey1+VdZUPmdjJ9w+v+2k8Z6mOawRXJIrWt8zMhqgOMkMjyMtkbR4ZPjUP0ydkpSTNMo8wpxlTjMPN6QaskUQVWpODYZEw0iREzUS4bkgCi5Hu6Nay2nB6Xa6O5s6T/HNfJ2twVbdVt1WXji1sJDcz0ZaBzb1YbVTlMQfNYAwXcWYnUJaQt7ivLzcWbkzh+YMnWgYZhjvUDvi28Q26BQ7oVVspa1D7ABknt1th3axXZYiTgMmlQnMajNBUU3fp2hSIEGdQN9rRI1VaBRKO2o6jp7+6vSu0pdLj5HLWkhrUx1SOd1UaZTRgAEHgCMvaZqkZ0xPmXjjxEmX33L5nOSJyTMdRsews86zUC1UQ61QC+dc58ApOfvXQfIyqAyQrEmGTG0mpGpTQcfrmtpPtH9Z9VHVW5VbKovJaef0h/UdDskRgwAc7APj8yW058N0cbrM69dfv+Cin170a3GomFsn1EEpXwrVjmqwuW1RVXkVecWr4yFTlwlZuizQt+ktTd81fXjkoSOvOtucZ9BEcQcJWyDE6DA/FgDIp040LS41btTsx2fPz7oqa26LrmVYib0ELLwF0MwoEgIS0zVEPYQCkSQkne060rW1sKBwM1/L1+gPhagRgxqAfOpYh5I2eu6mub/L/lX2LU3qpqRiezGU8WVRl/a+aAX6iwxdBqS50lpb9rVsLry78EXyr3rNoSAR1GAEgJkbE3k78rLFl101c/nM+9sS28YX2gqpqeHd/KCMyREIdORp2jRIaUspO73tdEHNizW7yL+a/ZolxQE40OPv6TSySTKlmiYt3LzwXtOlpjmE6aojtiPQ6mqNjeyUmKYkTRKka9LdXAm3o3RF6cNClVClOtBLxDRdcQB8rpsu6cjPjPFzJvzs2kevfaTeVJ9z0HoQqhxVELJTG0RkVBkpEEmdSVVn/lJ3b/Obzbt1B/VWQRJ8+zxIAJguYaY6Zva62YvG3ZR7b4mzxHTAeuB8rB6ztRqiDYnqREiWku22z23/ffqh2ueMh0zNmIcMCgC4AyqQprsxg52w+J3Fy01T4xYc7joMR21HIWrp/0Bnq+SFoSsCIX0rvV13++llpkNxDTSIUFwDAMzaOO3kJe/duso5xjlrn3UflPPlF2ThDE0SAqGxaD5rvKfhLnezu5rVnxQDwEyc7dTF7y95rCO94yd7OvdAjVBzQVcv9So9mFVm4Gq4Qy0PNC8UK8VKpQCII5I/ZcnOW59C5n/d+TU0OBvgh0A6TkdrTEK1cMj+b7Z50lmpZqABQIc7iTD/USFHmLW7Y/cPhvm+IGCNyV5s/9L5L8It5FBYDFCF89kY7czbdtNyaYw0a6917w+O+UgYimKpwjjJeDW3kdvIMv6oA4DnZ/zi8asXmS83L9hv3Q81jhr4oZLD7aDVWn2+YR6sggeYZYgqAEljbxh71Zi5Y+4t7CqEcnu5HAP8gJtdtBM7Tsz3NbAMfgu/IUfV0QIgzphqvOTK/7rqkZOuk6YiWzF4Rwdjt92WehtsHLWRhJimsO/BE00w6eMNcBs8B1kwjv0jok4Yhy5zb9wx9wluPPdPX7R/CW2utpg3IRjTn5hSQqugZfYyWFJ+G2DpJNyMGYdKHUfsu+AeWEAOtUZSA5Lz7p5yTfyE+Ou+7frugmA+0srMhynzkXKNufD1JV/RY8jIvtL5rP9SYox+DxgVaSOlAXoS719+01c3v1mjr83e07EnJgtrPWmMYQwcn1JEw8mehFqwwLIIqviqsBI1R729noDwc2iH8mCZcigakD7jySt/54hzZB+zHgMK2AXgPJ8d9UyvzEfKj88nfuH5sO4rukWAVBgOS+FhcsTUXxNkMKQYstOuTJtfzlfQGQkXAl03dDZtgaig4tGw7o2mSK824jjBjZAOY4NFRcEAGJa/On8+r+OTLDbLBSH5OvJ6dvQzATv9UcPHcLCeOGOspIt9/wyn6MTZTWZYAstBnusUFgB6TZwmI21G+twq/tSgHUbsKy3PWEbtvz/COUerTjzCxBnk6Vx9JBw106kMAFfADQSG7EBaEAiAlGkF028WDM5hFfbKCyLmz9BlwsqshwMyb2vdW1DU4ZPjGML7LBfOvEsienA78QYBfIE/ABCxlJTpKbNr+VqwibYLwvw8lb2Oxv5+6ztuAVafWOM9oGWcCOOz3JIbNGo9QB7NjlP9aYE/AOKyb8yezA3lxp0MIxQbjHRlwgxYNGxhwHNeqn4ZqmxV3Wu+/aUM8voF/Mrf3fwBkDLyt6Out7qs0OZsi3nJx/miG3OeD8gn7Os6y1Pe67SMO/34XJfbJdcQZsB88tPcW4lC5cf8JMZfHD+zznHmgpD+u4bfCXnxkwOe80LVi1DH10VW+rFEgWboEpiKEWVv2XFvAMSNXpIz1WVwDUP7H+vSn6ROgrXZBQGZ1CK0wPryp73X6ZisRuDz3W43QAJ5zYJf9uaMewMgIWlacj463sEydbA/9EDWH+ncnkC0vuJpCoI3/Yzc59OJXLSUCTNBnorP9axy9iSzeWxCXrOruS9V1cFZ7zHmwPKsZQHPaeAb4IWTm7x9NUB444SBS6UAo6WJKNykNWHA5Q8AtSZeE6dN0V7c5DgLsV5zezZng996j4ceK3sCrE4rK02CvBhKijT/9eDK4DMJuGnAQ60vAD2xNoyYkzFJUAvxzc7m2K73JM+mLRBV2U7BS6c2dzc9UVB6uhzKSKC9gjpjYyATZDCNMo3mRR7XWsUs83UqHTw7ZkPQ81aXrMH1ZV7p10FUtJ6W7/H+aXAxA8Dj4r+nAUbDcFN2f5cFKV7vybqf2v9AhOWGrbVvdQ87o+ny1DQQHckiIY1fDdCn6kfiorhYtf8Z+gxYOXJFcOk/vkau3XvEUAvR7bOKAjACvMttnb1pgFaVqEqzil0xK/1PjXkiYL0H6WDLIdhx5oOBk36PiUuEIUwDtP40QCVppcQuV1dMasCVQ2bAorSFQc9bUbzS2z/1AEi/18kbgwHAgZ6LEwRnzOUAOJC+cdxzQc/7rPFz+LJpt7d/xgH7hiTEFQ0s1tL4B4ADHZZlY00D7sq4A/LMk4NLf9Eqb980rA1IX4m1V4tqFmup/JYiJI2kH4iFFYuH3wKXxE+KyL2StEmwNmdN0PPePf0+HGn9NuIFt9BcAIdgaxnk/gFwEaLRQRRLw8+OexremPgq7JzyiRwu9vOeyHwEIVgytLp4jfc6DYQ92BJOk5Cn7vNexy8AkugSHVyU7H+iJhE+mfIB3HfRUhYyjqAg4O9wCbUIzU8w2lL9JpR0lEal4BZiPowFCBfjOecXALfgtuM0u4gXxkw5cHj6frg2edb3jiMICE449MTYtUFnstGhxmIfE6WDgd8nRqIYuHpLD7qdhtPeqanCGb8Rash0ZD4yu1cpNk+CXZf9Hxg5U5/ue13KbNqC0Z8r/gI1XT5jG3ouov0LqWHOZwPc+8Dt6/Z7AiC6HM4uFRe5emy6Pg0+zHsvqITnJ06DD6e8R+s4Idd7cp8Oeh4ONT5Wss57AJmvhoEnNwWAl22Rd7V3T07zjnZHMy7Zj5TzaeAb4ZW6V0P6jtck/xLenPQ6ddTB7rv8ovv8apQvPWfZCGd5n9K6HpQZnUPj00KnerkCAWB3NDqqcYJpJGlV+Z+gjg9tfHle+o2waXzgAfQMwwhYmfNQ0HvRocbSDd2lXwXKEMr9ufODMf41wFXvrDZxxoiij4x4sGxFyN/1rqw7qHP1O79nXPB6D9K6kvXQLrQrL/0SK73VA476O5gW+DFBNbxF9gGRTQ+31r8NnzbuCvn8h0Y/QNv36j1DZ8Ci4QuCXl9nPwMvWDZ1l36lqis4ICMDUAPyZEenPwCEjk/bitwOtw1wND/CUrC09H4aEoYcYo5bC3dl3tF9fs/4Z0K6tqB4LV2/JaehnMLSTwCwEskvglPBAAC3zd1KzNBJ4CIfKuAc09UnCvp0zaaJz1O/4DFNeQnB6z0VnZXw2sk3fKRf4doisruO2H8XjYICA0Co1XnSWWhWJ0QlHt5Q8zyUdVr6VOV8c/LrMD/9Zlg77k8hXbO6qAAEnCIuscmyOgXift+GVr+SrpaxseYKBECnvdi2x4jTqyV3xIUBTdAdRf/ap2sw5n97ypag9R6kwtajsK36HZ+CG6es9KPJRQBOAE657gR5U1kpEACC9f32g5LV3SrHTpGnb9r2wiunXovKvVcdXQ3nN2X1DDUqSQLhdTPxAIWAao8rJ/lApQgPNQoljn20YBIlx/Rg2cPdZ6NFgPad2w9/rdvZveQAoOz0SDQ4x6GESX5bqACc5b+07TBrEuQQKgrU4mqB+4v/I6L3XPHdIz7OgxXdlCTRIbN7L+wBecFTh68DDgSA4PjCfljVyNVCFMcGtpzZCt+c2xuRvn56Zhd81fj3HgW3QSD9tST6sdDw8xyWpnomWIES89P8EdvfAEvTUXDGHvr9sTv7lBv4l/5VvqGT8rYf+4STS76lmzuj8z0Lvaw4CwRAs+Plrjd0XYY2WQuiE6JVdJ2E9ZZn+tXXbafegcKWY977GhQOO7HZiaA3Eon/FL5BXjIH7OwLABJxG5WwX/zUZyZdVKig8nGaPIVlZnGo8ajPml4NKL8pP07rRJk/BPtJxI+Mb2BaIPUFAKQm4TX7/2p4gxUiYCYC5QZ3F90X1rWvVW6Bsg5L97hfaeJFlHkb7ITdzPY3sigI+gqAC9qlEnGvcye46XKPqDmsz859AVtrtvUZuNWFBT7rurh+r+vqf92fl4PNfST2cdBnFJxh5kcMBwCkBukl4UVo1TRFUwuQ/ljyn33KDV448Weos53pXvNRmjDOOU3k/xP4fyb99SC7YwgXAJHEsqWwXdxM3kkgClGTngZHI6w6via0fuJQ47EnB5f08zyOeknwMXxEeNVCoZCf1CH2BwAaEcHfpO0knT4AojtqyRnSS7WvwDdng+cG64ufgRYH0xY0+0aFJV/kZUNzhHDpKM186xkAAWc6hwoAcrwCnofHiTtpBKw0RikqwqhmafGygLkBMn7DcZ95oDqFC24okJjjVhGTsx0+YKbnFAs/xUgAADSJ6ITD8DJsICZJAJcjajF0YXsRbLD4HxdG02N1dnnLzXqFY/4uJ8q7AG/DVuJ4mxnz6/xFPuECIFFkjxIL9wHBmU6ucERNqB6reAqqrKe+dxyd7gul/+PjeBWWft4u57i7SNBZDdW0+IC6INd+pEgCACyTq4J3YRN8TV4C8Qd04CPyDg1XLi49uvz8B1d0VMKO6o/gD3vvkdd1SdB9XZciTtcuLzr9hgSdu0mTE64KkI+GtM4rnK2L8UTc9+AKeBDWwxS4FLQk9VRFp/iSZ7wUypos3vFdXzJyyoWeTsb8g1AEW+AtxnR8PpmFVT2laAHg0ZxkIn0/gxXwJFwMOVEDAb9epwTfe9YafgOzQuYHmY9u9juohFfhdWKOkfmlrKEPCLl62Z/d07HiMgzi4OewDApgPAFBFyUQUJm7JC/j1SzyUaLiKTCbf5Qwfwt5CfSvMtJKWMWzT4sr+vv8AGRBGtWEf4eVcDlMAD3hkCoKdkGEHhO7FXK4TbTIdhy20UCkmdn846ze0+f1vZF4gga6wXTABzrdAQ8QKOTHtmmUzowiaQaJRelyyCzeQ5LRD0mmK1d8KpnZQecbVp2m/wC8Sxg9z64DeT8c3KDrdrgBrodEXJBDDnPq2GY+Ov82GtW74HP4K+ylD+5qYZJfBj0231AGAKR5djRH+IDO8ZAL18EtcCuMIo5aTwBQ6WKT+Q7mbC3k58fE6NTQGB+PlLN2LhyzE2EAfPYgmmdDx0wfXQhGmAYL4U4SrF5CHDUHOn3saANuUthOZVuCb6EQPiEmR6ChpSfOr6Il5ndNLtJnGDwAyCCoWJ6Au2JfDBPh1zAH/hnGEBNl8viGQboGGUeybE45kLQQi/8FYXwFLSu0swy3gpUYOkm/3ay/CgPwTi9bYt5kw5sZmF8YRYH4DcyFq+CnJGYyUSDU5N+capAwnphwm0u27HVgg8Pwd/LCsVyemZlqJvVN9Ng7Jsmnr4MQAO+XQ7+Au0ThMshsAkkuXE38w09gKgEinm7gpVHQNKGp6QIP43H2Go5j7SXmxjOJ6gwrrNHnDJO+Onvp4yAGoLs24MTOTNKySHw0kgBxLVwKk8lfqRQitEzqATBPaGZ4p1wsQBbXEKkuI5Z+D+wncb0dvFNI0OR4BlS6S31MAeD9oijmJlrCABjOtCKdGKiJJIG7gvzMhSHk/3HsrPOljX4CQhdHsBlqXYy954iZsUAxFJGUqoYOnAg+jEdpr2clBRvpnxikXwoDsN3Ut/NvPg9EEs2i5SQOQRlCIJhInPUE4r4zCTzpBAwt1Qwda2qGh1olh7YeH4KjUZ4JAy7WBPAy3Ur+qicRTD2x5SfhBEmfasC7NXcnY3YDy2Zb6PHtJjHE/sQYAN2BMLKICUPXVNYSmcmKh7EwjugKGqlh1HUPJaC5aRVKRc4aen6syU0tdCsBQH7cbythop2wvZmyvY7ELrWsmIGw2Bk07Uziz4I8mChPHQ+V8TEPgLcDHKspmUDeVzORaoPcEthxHTvHs8ODyqcsx/nUTT1rcN3svYslSgKTdo/lb2MAWMGzYmW7SQrz+ysMQGTJA4ZnXx3UkDjWTOxvnQ8QHsMEPhIu+hghO2NwF2se6ecZMIpvyjPYAOgNEE0PDdCw44E0wNcbeDTABYNxFyQEwAPCjzTw9A8BBgDbG2CYgOUCgwAAAABJRU5ErkJggg==" />
  </div>
  <div id="user"></div>
  <div id="summary" i18n-content="setupsummary"></div>
  <div class="sync-footer">
    <input id="close" type="submit" i18n-values="value:okay"
           onclick='chrome.send("DialogClose", [""])' />
  </div>
</body>
</html>
<html id='t'>
<head>
<title></title>
<script type="text/javascript">

  // Called once, when this html/js is loaded.
  function showTheRightIframe() {
    hideAllPages();
    var args = JSON.parse(chrome.dialogArguments);
    document.getElementById(args.iframeToShow).style.display = 'block';
    document.getElementById(args.iframeToShow).tabIndex = 0;
  }

  function hideAllPages() {
    document.getElementById('login').style.display = 'none';
    document.getElementById('login').tabIndex = -1;
    document.getElementById('choose_data_types').style.display = 'none';
    document.getElementById('choose_data_types').tabIndex = -1;
    document.getElementById('done').style.display = 'none'; 
    document.getElementById('done').tabIndex = -1;
 }

  function showChooseDataTypes() {
    hideAllPages();
    document.getElementById('choose_data_types').style.display = 'block';
    document.getElementById('choose_data_types').tabIndex = 0;
  }

  function showSetupDone() {
    hideAllPages();
    document.getElementById('done').style.display = 'block';
    document.getElementById('done').tabIndex = 0;
  }
</script>
</head>
<body style="margin:0; border:0;" onload="showTheRightIframe();">
  <iframe id="login" frameborder="0" width="100%" scrolling="no" height="100%"
          src="chrome://syncresources/gaialogin" style="display:none"
          tabindex="-1"></iframe>
  <iframe id="choose_data_types" frameborder="0" width="100%" scrolling="no"
          height="100%" src="chrome://syncresources/choosedatatypes"
          style="display:none" tabindex="-1"></iframe>
  <iframe id="done" frameborder="0" width="100%" scrolling="no" height="100%"
          src="chrome://syncresources/setupdone" style="display:none"
          tabindex="-1"></iframe>
</body>
</html>
<html id='t'>
<head>
<title></title>
<script type="text/javascript">
  // Called once, when this html/js is loaded.
  function showTheRightIframe() {
    hideAllPages();
    var args = JSON.parse(chrome.dialogArguments);
    document.getElementById(args.iframeToShow).style.display = 'block';
    document.getElementById(args.iframeToShow).tabIndex = 0;
  }

  function hideAllPages() {
    document.getElementById('login').style.display = 'none';
    document.getElementById('login').tabIndex = -1;
    document.getElementById('done').style.display = 'none'; 
    document.getElementById('done').tabIndex = -1;
 }

  function showSetupDone() {
    hideAllPages();
    document.getElementById('done').style.display = 'block';
    document.getElementById('done').tabIndex = 0;
  }
</script>
</head>
<body style="margin:0; border:0;" onload="showTheRightIframe();">
  <iframe id="login" frameborder="0" width="100%" scrolling="no" height="100%"
          src="chrome://remotingresources/gaialogin" style="display:none"
          tabindex="-1"></iframe>
  <iframe id="done" frameborder="0" width="100%" scrolling="no" height="100%"
          src="chrome://remotingresources/setupdone" style="display:none"
          tabindex="-1"></iframe>
</body>
</html>
<html i18n-values="dir:textdirection;">
<head>
<title></title>
<style type="text/css">
body {
  background: #FFFFFF;
  font-size: 11pt;
  line-height: 1.5em;
  margin: 10px 15px;
  -webkit-user-select: none;
}
.remoting-header {
  font-size: 1.2em;
  font-weight: bold;
}
.remoting-success-image {
  text-align: center;
  margin: 20px;
}
#message {
  font-weight: bold;
}
.remoting-footer {
  position: fixed;
  right: 0px;
  bottom: 0px;
  margin-right: 10px;
  margin-bottom: 10px;
}
html[dir='rtl'] .remoting-footer {
  text-align: left;
  left: 0px;
  bottom: 0px;
  margin-left: 20px;
}
input[type='submit'] {
  min-width: 87px;
  min-height: 26px;
}
html[os='mac'] input[type='submit'] {
  font-size: 12pt;
}

</style>
<script>
  function setShowFirstTimeSetupSummary() {
    document.getElementById("summary").innerHTML =
      templateData['firsttimesetupsummary'];
  }
  function setMessage(msg) {
    document.getElementById('msgContent').innerHTML = msg;
  }
  function onPageShown() {
    document.getElementById("close").focus();
  }
</script>
</head>
<body i18n-values=".style.fontFamily:fontfamily">
  <div class="remoting-header" i18n-content="success"></div>
  <div id="msgContent"></div>
  <div id="summary" i18n-content="setupsummary"></div>
  <div class="remoting-footer">
    <input id="close" type="submit" i18n-values="value:okay"
           onclick='chrome.send("DialogClose", [""])' />
  </div>
</body>
</html>
// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// This code is used in conjunction with the Google Translate Element script.
// It is injected in a page to translate it from one language to another.
// It should be included in the page before the Translate Element script.

var cr = {};

cr.googleTranslate = (function() {
  // Internal states.
  var lib;
  var libReady = false;
  var error = false;
  var finished = false;
  var checkReadyCount = 0;

  function checkLibReady() {
    if (lib.isAvailable()) {
      libReady = true;
      return;
    }
    if (checkReadyCount++ > 5) {
      error = true;
      return;
    }
    setTimeout(checkLibReady, 100);
  }

  function onTranslateProgress(progress, opt_finished, opt_error) {
    finished = opt_finished;
    // opt_error can be 'undefined'.
    if (typeof opt_error == 'boolean' && opt_error) {
      error = true;
      // We failed to translate, restore so the page is in a consistent state.
      lib.restore();
    }
  }

  // Public API.
  return {
    /**
     * Whether the library is ready.
     * The translate function should only be called when |libReady| is true.
     * @type {boolean}
     */
    get libReady() {
      return libReady;
    },

    /**
     * Whether the current translate has finished successfully.
     * @type {boolean}
     */
    get finished() {
      return finished;
    },

    /**
     * Whether an error occured initializing the library of translating the
     * page.
     * @type {boolean}
     */
    get error() {
      return error;
    },

    /**
     * The language the page translated was in. Is valid only after the page
     * has been successfully translated and the original language specified to
     * the translate function was 'auto'. Is empty otherwise.
     * @type {boolean}
     */
    get sourceLang() {
      if (!libReady || !finished || error)
        return "";
      return lib.getDetectedLanguage();
    },

    /**
     * Translate the page contents.  Note that the translation is asynchronous.
     * You need to regularly check the state of |finished| and |error| to know
     * if the translation finished or if there was an error.
     * @param {string} originalLang The language the page is in.
     * @param {string} targetLang The language the page should be translated to.
     * @return {boolean} False if the translate library was not ready, in which
     *                   case the translation is not started.  True otherwise.
     */
    translate: function(originalLang, targetLang) {
      finished = false;
      error = false;
      if (!libReady)
        return false;
      lib.translatePage(originalLang, targetLang, onTranslateProgress);
      return true;
    },

    /**
     * Reverts the page contents to its original value, effectively reverting
     * any performed translation.  Does nothing if the page was not translated.
     */
    revert: function() {
      lib.restore();
    },

    /**
     * Entry point called by the Translate Element once it has been injected in
     * the page.
     */
    onTranslateElementLoad : function() {
      try {
        lib = google.translate.TranslateService({});
      } catch(err) {
        error = true;
        return;
      }
      // The TranslateService is not available immediately as it needs to start
      // Flash.  Let's wait until it is ready.
      checkLibReady();
    }
  };
})();
<!DOCTYPE HTML>
<html i18n-values="dir:textdirection;">
<head>
<meta charset="utf-8"/>
<title i18n-content="title"></title>
<style>.bug-report-label {
  text-align: start;
  vertical-align: text-top;
}

.bug-report-text {
  width: 40em;
  resize: none;
}

.bug-report-button {
  width: 8em;
}

hr {
  border: none;
  height: 1px;
  background: #cccccc;
  margin-top: 10px;
  margin-bottom: 10px;
  width: 33.5em;
}

.thumbnail-list {
  -webkit-margin-start: 1em;
  width: 33.5em;
  display: block;
  margin-top: 0.5em;
  margin-bottom: 1em;
}

.image-thumbnail-container {
  display: inline-block;
  border: 2px solid white;
  -webkit-border-radius: 3px;
  z-index: 0;
}

.image-thumbnail-container-selected {
  display: inline-block;
  border: 2px solid green;
  -webkit-border-radius: 3px;
  z-index: 0;
}

.image-thumbnail-container:hover {
  border: 2px solid #B8DAB0;
  z-index: 0;
}

.image-popup {
  width: 50%;
}

.image-thumbnail {
  position: relative;
  z-index: 1;
  display: inline-block;
  padding: 0px;
  border: 2px solid white;
}

.image-thumbnail:hover {
  z-index: 2;
}

.image-thumbnail div {
  display: none;
}

.image-thumbnail img {
  display: block;
  width: 75px;
}

.image-thumbnail:hover div {
    display: block;
    position: absolute;
    top: 130%;
    left:0;
    padding: 1px;
    border: 1px dashed blue;
    background-color: transparent;
    text-align: center
}

.image-thumbnail:hover div img {
  position: absolute;
  width: 400px;
}

th {
  padding-top: 10px;
  color: #233478;
}

body {
  -webkit-user-select: none;
}
</style>

<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// TODO(arv): Namespace

/**
 * The local strings get injected into the page usig a variable named
 * {@code templateData}. This class provides a simpler interface to access those
 * strings.
 * @constructor
 */
function LocalStrings() {
}

// Start of anonymous namespace.
(function() {

/**
 * Returns a formatted string where $1 to $9 are replaced by the second to the
 * tenth argument.
 * @param {string} s The format string.
 * @param {...string} The extra values to include in the formatted output.
 * @return {string} The string after format substitution.
 */
function replaceArgs(s, args) {
  return s.replace(/\$[$1-9]/g, function(m) {
    return (m == '$$') ? '$' : args[m[1]];
  });
}

/**
 * Returns a string after removing Windows-style accelerators.
 * @param {string} s The input string that may contain accelerators.
 * @return {string} The resulting string with accelerators removed.
 */
function trimAccelerators(s) {
  return s.replace(/&{1,2}/g, function(m) {
    return (m == '&&') ? '&' : '';
  });
}

LocalStrings.prototype = {
  /**
   * The template data object.
   * @type {Object}
   */
  templateData: null,

  /**
   * Gets a localized string by its id.
   * @param {string} s The ID of the string we want.
   * @return {string} The localized string.
   */
  getString: function(id) {
    // TODO(arv): We should not rely on a global variable here.
    return (this.templateData || window.templateData)[id] || '';
  },

  /**
   * Returns a formatted localized string where $1 to $9 are replaced by the
   * second to the tenth argument.
   * @param {string} id The ID of the string we want.
   * @param {...string} The extra values to include in the formatted output.
   * @return {string} The formatted string.
   */
  getStringF: function(id, var_args) {
    return replaceArgs(this.getString(id), arguments);
  },

  /**
   * Gets a localized string (stripped of Windows-style accelerators) by its id.
   * @param {string} s The ID of the string we want.
   * @return {string} The localized string.
   */
  getStringWithoutAccelerator: function(id) {
    return trimAccelerators(this.getString(id));
  },

  /**
   * Returns a formatted localized string (stripped of Windows-style
   * accelerators) where $1 to $9 are replaced by the second to the tenth
   * argument.
   * @param {string} id The ID of the string we want.
   * @param {...string} The extra values to include in the formatted output.
   * @return {string} The formatted string.
   */
  getStringWithoutAcceleratorF: function(id, var_args) {
    return replaceArgs(this.getStringWithoutAccelerator(id), arguments);
  }
};

// End of anonymous namespace.
})();
</script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

/**
 * The global object.
 * @param {!Object}
 */
const global = this;

/**
 * Alias for document.getElementById.
 * @param {string} id The ID of the element to find.
 * @return {HTMLElement} The found element or null if not found.
 */
function $(id) {
  return document.getElementById(id);
}

/**
 * Calls chrome.send with a callback and restores the original afterwards.
 * @param {string} name The name of the message to send.
 * @param {!Array} params The parameters to send.
 * @param {string} callbackName The name of the function that the backend calls.
 * @param {!Function} The function to call.
 */
function chromeSend(name, params, callbackName, callback) {
  var old = global[callbackName];
  global[callbackName] = function() {
    // restore
    global[callbackName] = old;

    var args = Array.prototype.slice.call(arguments);
    return callback.apply(global, args);
  };
  chrome.send(name, params);
}


/**
 * Generates a CSS url string.
 * @param {string} s The URL to generate the CSS url for.
 * @return {string} The CSS url string.
 */
function url(s) {
  // http://www.w3.org/TR/css3-values/#uris
  // Parentheses, commas, whitespace characters, single quotes (') and double
  // quotes (") appearing in a URI must be escaped with a backslash
  var s2 = s.replace(/(\(|\)|\,|\s|\'|\"|\\)/g, '\\$1');
  // WebKit has a bug when it comes to URLs that end with \
  // https://bugs.webkit.org/show_bug.cgi?id=28885
  if (/\\\\$/.test(s2)) {
    // Add a space to work around the WebKit bug.
    s2 += ' ';
  }
  return 'url("' + s2 + '")';
}
</script>
<script>// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Constants.
var FEEDBACK_LANDING_PAGE =
    'http://www.google.com/support/chrome/go/feedback_confirmation'

var selectedThumbnailDivId = '';
var selectedThumbnailId = '';
var selectedImageUrl;

var savedThumbnailIds = [];
savedThumbnailIds['current-screenshots'] = '';
savedThumbnailIds['saved-screenshots'] = '';

var localStrings = new LocalStrings();

/**
 * Selects an image thumbnail in the specified div.
 */
function selectImage(divId, thumbnailId) {
  var thumbnailDivs = $(divId).children;
  selectedThumbnailDivId = divId;
  for (var i = 0; i < thumbnailDivs.length; i++) {
    // If the the current div matches the thumbnail id provided,
    // or there is no thumbnail id given, and we're at the first thumbnail.
    if ((thumbnailDivs[i].id == thumbnailId) || (!thumbnailId && !i)) {
      thumbnailDivs[i].className = 'image-thumbnail-container-selected';
      selectedThumbnailId = thumbnailId;
      savedThumbnailIds[divId] = thumbnailId;
    } else {
      thumbnailDivs[i].className = 'image-thumbnail-container';
    }
  }
}

/**
 * Adds an image thumbnail to the specified div.
 */
function addScreenshot(divId, screenshot) {
  var thumbnailDiv = document.createElement('div');
  thumbnailDiv.className = 'image-thumbnail-container';

  thumbnailDiv.id = divId + '-thumbnailDiv-' + $(divId).children.length;
  thumbnailDiv.onclick = function() {
    selectImage(divId, thumbnailDiv.id);
  };

  var innerDiv = document.createElement('div');
  innerDiv.className = 'image-thumbnail';

  var thumbnail = document.createElement('img');
  thumbnail.id = thumbnailDiv.id + '-image';
  // We add the ?+timestamp to make sure the image URLs are unique
  // and Chrome does not load the image from cache.
  thumbnail.src = screenshot + "?" + Date.now();
  innerDiv.appendChild(thumbnail);

  var largeImage = document.createElement('img');
  largeImage.src = screenshot + "?" + Date.now();

  var popupDiv = document.createElement('div');
  popupDiv.appendChild(largeImage);
  innerDiv.appendChild(popupDiv);

  thumbnailDiv.appendChild(innerDiv);
  $(divId).appendChild(thumbnailDiv);

  if (!selectedThumbnailId)
    selectImage(divId, thumbnailDiv.id);
}

/**
 * Send's the report; after the report is sent, we need to be redirected to
 * the landing page, but we shouldn't be able to navigate back, hence
 * we open the landing page in a new tab and sendReport closes this tab.
 */
function sendReport() {
  if (!$('issue-with-combo').selectedIndex) {
    alert(localStrings.getString('no-issue-selected'));
    return false;
  }

  var imagePath = '';
  if (selectedThumbnailId)
    imagePath = $(selectedThumbnailId + '-image').src;

  // Note, categories are based from 1 in our protocol buffers, so no
  // adjustment is needed on selectedIndex.
  var reportArray = [String($('issue-with-combo').selectedIndex),
                     $('page-url-text').value,
                     $('description-text').value,
                     imagePath];

  // Add chromeos data if it exists.
  if ($('user-email-text') && $('sys-info-checkbox')) {
    reportArray = reportArray.concat([$('user-email-text').value,
                                      String($('sys-info-checkbox').checked)]);
  }

  // open the landing page in a new tab, sendReport will close this one.
  window.open(FEEDBACK_LANDING_PAGE, '_blank');
  chrome.send('sendReport', reportArray);
  return true;
}

function cancel() {
  chrome.send('cancel', []);
  return true;
}

/**
 * Select the current screenshots div, restoring the image that was
 * selected when we had this div open previously.
 */
function currentSelected() {
  $('current-screenshots').style.display = 'block';
  if ($('saved-screenshots'))
    $('saved-screenshots').style.display = 'none';

  if (selectedThumbnailDivId != 'current-screenshots')
    selectImage('current-screenshots',
                savedThumbnailIds['current-screenshots']);

  return true;
}

/**
 * Select the saved screenshots div, restoring the image that was
 * selected when we had this div open previously.
 */
function savedSelected() {
  $('current-screenshots').style.display = 'none';
  $('saved-screenshots').style.display = 'block';

  if (selectedThumbnailDivId != 'saved-screenshots')
    selectImage('saved-screenshots', savedThumbnailIds['saved-screenshots']);

  return true;
}

/**
 * Unselect all screenshots divs.
 */
function noneSelected() {
  $('current-screenshots').style.display = 'none';
  if ($('saved-screenshots'))
    $('saved-screenshots').style.display = 'none';

  selectedThumbnailDivId = '';
  selectedThumbnailId = '';
  return true;
}
</script>
<script>

///////////////////////////////////////////////////////////////////////////////
// Document Functions:
/**
 * Window onload handler, sets up the page.
 */
function load() {
  // textContent on description-text textarea seems to default
  // to several spaces, this resets it to empty.
  $('description-text').textContent = '';

  $('current-screenshot').nextSibling.textContent =
      localStrings.getString('currentscreenshots');

  $('no-screenshot').nextSibling.textContent =
      localStrings.getString('noscreenshot');

  // Get a list of issues that we allow the user to select from.
  // Note, the order and the issues types themselves are different
  // between Chromium and Chromium OS, so this code needs to be
  // maintained individually between the bug_report.html and
  // bug_report_cros.html files.
  var issueTypeText = [];
  issueTypeText[0] = localStrings.getString('issue-choose');
issueTypeText[1] = localStrings.getString('issue-page-formatting');
  issueTypeText[2] = localStrings.getString('issue-page-load');
  issueTypeText[3] = localStrings.getString('issue-plugins');
  issueTypeText[4] = localStrings.getString('issue-tabs');
  issueTypeText[5] = localStrings.getString('issue-sync');
  issueTypeText[6] = localStrings.getString('issue-crashes');
  issueTypeText[7] = localStrings.getString('issue-extensions');
  issueTypeText[8] = localStrings.getString('issue-phishing');
  issueTypeText[9] = localStrings.getString('issue-other');

  // Add all the issues to the selection box.
  for (var i = 0; i < issueTypeText.length; i++) {
    var option = document.createElement('option');
    option.className = 'bug-report-text';
    option.textContent = issueTypeText[i];
    $('issue-with-combo').add(option);
  }

  chrome.send('getDialogDefaults', []);
  chrome.send('refreshScreenshots', []);
};

function setupScreenshots(screenshots) {
  if (screenshots.length == 1) {
    addScreenshot('current-screenshots', screenshots[0]);
  } else {
    // We're in Chromium OS.
    currentScreenshot = screenshots[0];
    addScreenshot('current-screenshots', currentScreenshot);

    savedScreenshots = screenshots[1];
    for (i = 0; i < savedScreenshots.length; ++i)
      addScreenshot('saved-screenshots', savedScreenshots[i]);
  }
}

function setupDialogDefaults(defaults) {
  if (defaults.length > 0) {
    $('page-url-text').value = defaults[0];
    if (defaults.length > 2) {
      // We're in Chromium OS.
      $('sysinfo-url').href = defaults[1];
      $('user-email-text').value = defaults[2];
    }
  }
}

window.addEventListener('DOMContentLoaded', load);
</script>
</head>
<body>
<table>
  <!--  Issue type dropdown -->
  <tr>
    <th id="issue-with" class="bug-report-label" i18n-content="issue-with">
    </th>
  </tr>
  <tr>
    <td>
      <select id="issue-with-combo" class="bug-report-text">
      </select>
    </td>
  </tr>
  <!--  Page URL text box -->
  <tr>
    <th colspan="2" id="page-url" class="bug-report-label"
        i18n-content="page-url">
    </th>
  </tr>
  <tr>
    <td colspan="2">
      <input id='page-url-text' maxlength=200 class="bug-report-text">
    </td>
  </tr>
  <!--  Description -->
  <tr>
    <th id="description" colspan="2" class="bug-report-label"
        i18n-content="description">
    </th>
  </tr>
  <tr>
    <td colspan="2">
      <textarea id='description-text' rows="10" class="bug-report-text">
      </textarea>
    </td>
  </tr>

  <!--  Screenshot radio buttons -->
  <tr>
    <th id="screenshot" class="bug-report-label" i18n-content="screenshot">
    </th>
  </tr>
  <tr>
    <td>
      <input id="no-screenshot" type="radio" name="screenshot-group"
             value="none" onclick="noneSelected()">
      <br>

      <input id="current-screenshot" type="radio" name="screenshot-group"
             value="current" checked onclick="currentSelected()">
      <br>
      <div id="current-screenshots" class="thumbnail-list">
      </div>
    </td>
  </tr>
  <!--  Buttons -->
  <tr>
    <td>
      <hr>
      <input id='send-report-button' type="submit" class="bug-report-button"
             i18n-values="value:send-report" onclick="sendReport()">
      <input id='cancel-button' type="submit" class="bug-report-button"
             i18n-values="value:cancel" onclick="cancel()">
    </td>
  </tr>
</table>
</body>
</html>
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
</head>
<title i18n-content="title"></title>
<body onselectstart='return false'>
Invalid BugReport options - please check.
</body>
</html>
{
  "key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCtl3tO0osjuzRsf6xtD2SKxPlTfuoy7AWoObysitBPvH5fE1NaAA1/2JkPWkVDhdLBWLaIBPYeXbzlHp3y4Vv/4XG+aN5qFE3z+1RU/NqkzVYHtIpVScf3DjTYtKVL66mzVGijSoAIwbFCC3LpGdaoe6Q1rSRDp76wR6jjFzsYwQIDAQAB",
  "name": "Chrome Web Store",
  "version": "0.1",
  "description": "Web Store",
  "icons": {
  },
  "app": {
    "launch": {
      "web_url": "https://chrome.google.com/extensions"
    },
    "urls": [
      "*://chrome.google.com/extensions",
      "*://clients2.google.com/service/update2",
      "*://clients2.googleusercontent.com/crx"
    ]
  },
  "permissions": [
    "webstorePrivate",
    "management"
  ]
}
[
  {
    "namespace": "extension",
    "unprivileged": true,
    "types": [
      {
        "id": "MessageSender",
        "type": "object",
        "description": "An object containing information about the script context that sent a message or request.",
        "properties": {
          "tab": {"$ref": "Tab", "optional": true, "description":"This property will <b>only</b> be present when the connection was opened from a tab or content script."},
          "id": {"type": "string", "description": "The extension ID of the extension that opened the connection."}
        }
      },
      {
        "id": "Event",
        "type": "object",
        "description": "An object which allows the addition and removal of listeners for a Chrome event.",
        "properties": {
          "addListener": {"type": "function"},
          "removeListener": {"type": "function"},
          "hasListener": {"type": "function"},
          "hasListeners": {"type": "function"}
        },
        "additionalProperties": { "type": "any"}
      },
      {
        "id": "Port",
        "type": "object",
        "description": "An object which allows two way communication with other pages.",
        "properties": {
          "name": {"type": "string"},
          "onDisconnect": { "$ref": "Event" },
          "onMessage": { "$ref": "Event" },
          "postMessage": {"type": "function"},
          "sender": {
            "$ref": "MessageSender",
            "optional": true,
            "description": "This property will <b>only</b> be present on ports passed to onConnect/onConnectExternal listeners."
          }
        },
        "additionalProperties": { "type": "any"}
      }
    ],
    "properties": {
      "lastError": {
        "type": "object",
        "optional": true,
        "description": "Set for the lifetime of a callback if an ansychronous extension api has resulted in an error. If no error has occured lastError will be <var>undefined</var>.",
        "properties": {
          "message": { "type": "string", "description": "Description of the error that has taken place." }
        }
      },
      "inIncognitoContext": {
        "type": "object",
        "optional": true,
        "unprivileged": true,
        "description": "True for content scripts running inside incognito tabs, and for extension pages running inside an incognito process. The latter only applies to extensions with 'split' incognito_behavior.",
        "properties": {
          "message": { "type": "boolean", "description": "True if the page or script is in an incongito process." }
        }
      }
    },
    "functions": [
      {
        "name": "connect",
        "type": "function",
        "unprivileged": true,
        "description": "Attempts to connect to other listeners within the extension (such as the extension's background page). This is primarily useful for content scripts connecting to their extension processes. Extensions may connect to content scripts embedded in tabs via <a href='tabs.html#method-connect'><code>chrome.tabs.connect()</code></a>.",
        "parameters": [
          {"type": "string", "name": "extensionId", "optional": true, "description": "The extension ID of the extension you want to connect to. If omitted, default is your own extension."},
          {
            "type": "object",
            "name": "connectInfo",
            "properties": {
              "name": { "type": "string", "optional": true, "description": "Will be passed into onConnect for extension processes that are listening for the connection event." }
            },
            "optional": true
          }
        ],
        "returns": {
          "$ref": "Port",
          "description": "Port through which messages can be sent and received with the extension."
        }
      },
      {
        "name": "sendRequest",
        "type": "function",
        "unprivileged": true,
        "description": "Sends a single request to other listeners within the extension. Similar to chrome.extension.connect, but only sends a single request with an optional response.",
        "parameters": [
          {"type": "string", "name": "extensionId", "optional": true, "description": "The extension ID of the extension you want to connect to. If omitted, default is your own extension."},
          { "type": "any", "name": "request" },
          {
            "type": "function",
            "name": "responseCallback",
            "optional": true,
            "parameters": [
              {
                "name": "response",
                "type": "any",
                "description": "The JSON response object sent by the handler of the request."
              }
            ]
          }
        ]
      },
      {
        "name": "getURL",
        "type": "function",
        "unprivileged": true,
        "description": "Converts a relative path within an extension install directory to a fully-qualified URL.",
        "parameters": [
          {
            "type": "string",
            "name": "path",
            "description": "A path to a resource within an extension expressed relative to it's install directory."
          }
        ],
        "returns": {
          "type": "string",
          "description": "The fully-qualified URL to the resource."
        }
      },
      {
        "name": "getViews",
        "type": "function",
        "description": "Returns an array of the JavaScript 'window' objects for each of the pages running inside the current extension.",
        "parameters": [
          {
            "type": "object",
            "name": "fetchProperties",
            "optional": true,
            "properties": {
              "type": {
                "type": "string",
                "enum": ["tab", "infobar", "notification", "popup"],
                "optional": true,
                "description": "The type of view to get. If omitted, returns all views (including background pages and tabs). Valid values: 'tab', 'infobar', 'notification', 'popup'."
              },
              "windowId": {
                "type": "integer",
                "optional": true,
                "description": "The window to restrict the search to. If omitted, returns all views."
              }
            }
          }
        ],
        "returns": {
          "type": "array",
          "description": "Array of global objects",
          "items": { "type": "object", "isInstanceOf": "DOMWindow", "properties": {}, "additionalProperties": { "type": "any" } }
        }
      },
      {
        "name": "getBackgroundPage",
        "type": "function",
        "description": "Returns the JavaScript 'window' object for the background page running inside the current extension. Returns null if the extension has no backround page.",
        "parameters": [],
        "returns": {
          "type": "object", "isInstanceOf": "DOMWindow", "properties": {}, "additionalProperties": { "type": "any" }
         }
      },
      {
        "name": "getToolstrips",
        "nodoc": true,
        "type": "function",
        "description": "Deprecated. Please use getViews({type: 'TOOLSTRIP'}). Returns an array of the JavaScript 'window' objects for each of the toolstrip views running inside the current extension. If windowId is specified, returns only the 'window' objects of toolstrips attached to the specified window.",
        "parameters": [
          {"type": "integer", "name": "windowId", "optional": true}
        ],
        "returns": {
          "type": "array",
          "description": "Array of global window objects",
          "items": { "type": "object", "isInstanceOf": "DOMWindow", "properties": {}, "additionalProperties": { "type": "any" } }
        }
      },
      {
        "name": "getExtensionTabs",
        "nodoc": true,
        "type": "function",
        "description": "Deprecated. Please use getViews({type: 'TAB'}). Returns an array of the JavaScript 'window' objects for each of the tabs running inside the current extension. If windowId is specified, returns only the 'window' objects of tabs attached to the specified window.",
        "parameters": [
          {"type": "integer", "name": "windowId", "optional": true}
        ],
        "returns": {
          "type": "array",
          "description": "Array of global window objects",
          "items": { "type": "object", "isInstanceOf": "DOMWindow", "properties": {}, "additionalProperties": { "type": "any" } }
        }
      }
    ],
    "events": [
      {
        "name": "onConnect",
        "type": "function",
        "unprivileged": true,
        "description": "Fired when a connection is made from either an extension process or a content script.",
        "parameters": [
          {"$ref": "Port", "name": "port"}
        ]
      },
      {
        "name": "onConnectExternal",
        "type": "function",
        "description": "Fired when a connection is made from another extension.",
        "parameters": [
          {"$ref": "Port", "name": "port"}
        ]
      },
      {
        "name": "onRequest",
        "type": "function",
        "unprivileged": true,
        "description": "Fired when a request is sent from either an extension process or a content script.",
        "parameters": [
          {"name": "request", "type": "any", "description": "The request sent by the calling script."},
          {"name": "sender", "$ref": "MessageSender" },
          {"name": "sendResponse", "type": "function", "description": "Function to call when you have a response. The argument should be any JSON-ifiable object, or undefined if there is no response." }
        ]
      },
      {
        "name": "onRequestExternal",
        "type": "function",
        "description": "Fired when a request is sent from another extension.",
        "parameters": [
          {"name": "request", "type": "any", "description": "The request sent by the calling script."},
          {"name": "sender", "$ref": "MessageSender" },
          {"name": "sendResponse", "type": "function", "description": "Function to call when you have a response. The argument should be any JSON-ifiable object, or undefined if there is no response." }
        ]
      }
    ]
  },
  {
    "namespace": "experimental.accessibility",
    "nodoc": true,
    "types": [
      {
        "id": "AccessibilityObject",
        "type": "object",
        "description": "Parent class for accessibility information about an object.",
        "properties": {
          "type": {
            "type": "string",
            "description": "The type of this object, which determines the contents of 'details'.",
            "enum": ["button", "checkbox", "combobox", "link", "menu", "menuitem", "radiobutton", "tab", "textbox", "window"]
          },
          "name": {
            "type": "string",
            "description": "The localized name of the object, like OK or Password. Do not rely on an exact string match because the text will be in the user's language and may change in the future."
          },
          "details": {
            "description": "Other details like the state, depending on the type of object.",
            "optional": true,
            "choices": [
              { "$ref": "CheckboxDetails" },
              { "$ref": "ComboBoxDetails" },
              { "$ref": "MenuDetails" },
              { "$ref": "MenuItemDetails" },
              { "$ref": "RadioButtonDetails" },
              { "$ref": "TabDetails" },
              { "$ref": "TextBoxDetails" }
            ]
          }
        }
      },
      {
        "id": "CheckboxDetails",
        "type": "object",
        "description": "Information about the state of a checkbox.",
        "properties": {
          "isChecked": {"type": "boolean", "description": "True if this checkbox is checked."}
        }
      },
      {
        "id": "ComboBoxDetails",
        "type": "object",
        "description": "Information about the state of a combo box.",
        "properties": {
          "value": {"type": "string", "description": "The value of the combo box."},
          "itemCount": {"type": "integer", "description": "The number of items in the combo box's list."},
          "itemIndex": {"type": "integer", "description": "The 0-based index of the current value, or -1 if the user entered a value not from the list."}
        }
      },
      {
        "id": "ListBoxDetails",
        "type": "object",
        "description": "Information about the state of a list box.",
        "properties": {
          "value": {"type": "string", "description": "The value of the list box."},
          "itemCount": {"type": "integer", "description": "The number of items in the list."},
          "itemIndex": {"type": "integer", "description": "The 0-based index of the selected value, or -1 if no items are selected."}
        }
      },
      {
        "id": "MenuDetails",
        "type": "object",
        "description": "Information about the state of a drop-down menu.",
        "properties": {
        }
      },
      {
        "id": "MenuItemDetails",
        "type": "object",
        "description": "Information about a menu item.",
        "properties": {
          "hasSubmenu": {"type": "boolean", "description": "True if this item opens a submenu."},
          "itemCount": {"type": "integer", "description": "The number of items in the menu."},
          "itemIndex": {"type": "integer", "description": "The 0-based index of this menu item."}
        }
      },
      {
        "id": "RadioButtonDetails",
        "type": "object",
        "description": "Information about the state of a radio button.",
        "properties": {
          "isChecked": {"type": "boolean", "description": "True if this radio button is checked."},
          "itemCount": {"type": "integer", "description": "The number of radio buttons in this group."},
          "itemIndex": {"type": "integer", "description": "The 0-based index of this radio button in this group."}
        }
      },
      {
        "id": "TabDetails",
        "type": "object",
        "description": "Additional accessibility information about a tab.",
        "properties": {
          "itemCount": {"type": "integer", "description": "The number of tabs in this group."},
          "itemIndex": {"type": "integer", "description": "The 0-based index of this tab in this group."}
        }
      },
      {
        "id": "TextBoxDetails",
        "type": "object",
        "description": "Information about the state of a text box.",
        "properties": {
          "value": {"type": "string", "description": "The value of the text box - the entered text."},
          "isPassword": {"type": "boolean", "description": "True if this control contains password text whose contents should be obscured."},
          "selectionStart": {"type": "integer", "description": "The index of the character where the selection starts, if this control contains editable text."},
          "selectionEnd": {"type": "integer", "description": "The index of the character where the selection ends, if this control contains editable text."}
        }
      }
    ],
    "functions": [
      {
        "name": "setAccessibilityEnabled",
        "type": "function",
        "description": "Enable or disable the accessibility extension api. This must be set to true before event listeners or getFocusedControl will work.",
        "parameters": [
          {
            "type": "boolean",
            "name": "enabled",
            "description": "True if accessibility support should be enabled."
          }
        ]
      },
      {
        "name": "getFocusedControl",
        "type": "function",
        "description": "Get information about the currently focused control.",
        "parameters": [
          {
            "type": "function",
            "name": "callback",
            "parameters": [
              {
                "name": "control",
                "description": "Details of the currently focused control, or null if nothing is focused.",
                "choices": [
                  { "$ref": "AccessibilityObject" },
                  { "type": "null" }
                ]
              }
            ]
          }
        ]
      }
    ],
    "events": [
      {
        "name": "onWindowOpened",
        "type": "function",
        "description": "Fired when a window is opened.",
        "parameters": [
          {
            "$ref": "AccessibilityObject",
            "name": "window",
            "description": "Information about the window that was opened."
          }
        ]
      },
      {
        "name": "onWindowClosed",
        "type": "function",
        "description": "Fired when a window is closed.",
        "parameters": [
          {
            "$ref": "AccessibilityObject",
            "name": "window",
            "description": "Information about the window that was closed."
          }
        ]
      },
      {
        "name": "onControlFocused",
        "type": "function",
        "description": "Fired when a control is focused.",
        "parameters": [
          {
            "$ref": "AccessibilityObject",
            "name": "control",
            "description": "Details of the control that was focused."
          }
        ]
      },
      {
        "name": "onControlAction",
        "type": "function",
        "description": "Fired when a control's action is taken, like pressing a button or toggling a checkbox.",
        "parameters": [
          {
            "$ref": "AccessibilityObject",
            "name": "control",
            "description": "Details of the control whose action was taken."
          }
        ]
      },
      {
        "name": "onTextChanged",
        "type": "function",
        "description": "Fired when text changes in an editable text control.",
        "parameters": [
          {
            "$ref": "AccessibilityObject",
            "name": "control",
            "description": "Details of the control where the text changed."
          }
        ]
      },
      {
        "name": "onMenuOpened",
        "type": "function",
        "description": "Fired when a menu is opened.",
        "parameters": [
          {
            "$ref": "AccessibilityObject",
            "name": "menu",
            "description": "Information about the menu that was opened."
          }
        ]
      },
      {
        "name": "onMenuClosed",
        "type": "function",
        "description": "Fired when a menu is closed.",
        "parameters": [
          {
            "$ref": "AccessibilityObject",
            "name": "menu",
            "description": "Information about the menu that was closed."
          }
        ]
      }
    ]
  },
  {
    "namespace": "experimental.extension",
    "nodoc": true,
    "types": [],
    "functions": [
      {
        "name": "getPopupView",
        "type": "function",
        "description": "Returns a reference to the JavaScript 'window' object of the popup view.  Returns undefined if no popup presently shown.",
        "parameters": [],
        "returns": {
          "type": "object",
          "isInstanceOf": "DOMWindow",
          "properties": {},
          "additionalProperties": { "type": "any" },
          "optional": true
        }
      }
    ],
    "events": []
  },
  {
    "namespace": "experimental.tts",
    "nodoc": true,
    "functions": [
      {
        "name": "speak",
        "type": "function",
        "description": "Speak text using a text-to-speech engine.",
        "parameters": [
          {
            "type": "string",
            "name": "utterance",
            "description": "The text to speak."
          },
          {
            "type": "object",
            "name": "options",
            "optional": true,
            "description": "The speak options. This parameter is currently ignored.",
            "properties": {
              "languageName": {
                "type": "string",
                "optional": true,
                "description": "The language name for synthesis specified in the form <language>-<locale>, e.g. en-US, en-GB, fr-CA, zh-CN, etc."
              },
              "gender": {
                "type": "string",
                "optional": true,
                "description": "Gender of voice for synthesized speech.",
                "enum": ["male", "female"]
              },
              "rate": {
                "type": "number",
                "optional": true,
                "minimum": 0,
                "maximum": 1,
                "description": "Speaking speed between 0 and 1 inclusive, with 0 being slowest and 1 being fastest."
              },
              "pitch": {
                "type": "number",
                "optional": true,
                "minimum": 0,
                "maximum": 1,
                "description": "Speaking pitch between 0 and 1 inclusive, with 0 being lowest and 1 being highest."
              },
              "volume": {
                "type": "number",
                "optional": true,
                "minimum": 0,
                "maximum": 1,
                "description": "Speaking volume between 0 and 1 inclusive, with 0 being lowest and 1 being highest."
              }
            }
          },
          {
            "type": "function",
            "name": "callback",
            "optional": true,
            "description": "This function is called when speaking is finished.",
            "parameters": []
          }
        ]
      },
      {
        "name": "stop",
        "type": "function",
        "description": "Stop any current speech.",
        "parameters": []
      },
      {
        "name": "isSpeaking",
        "type": "function",
        "description": "Check if the engine is currently speaking.",
        "parameters": [
          {
            "type": "function",
            "name": "callback",
            "optional": true,
            "parameters": [
              {
                "name": "speaking",
                "type": "boolean",
                "description": "True if speaking, false otherwise."
              }
            ]
          }
        ]
      }
    ]
  },
  {
    "namespace": "windows",
    "types": [
      {
        "id": "Window",
        "type": "object",
        "properties": {
          "id": {"type": "integer", "minimum": 0, "description": "The ID of the window. Window IDs are unique within a browser session."},
          "focused": {"type": "boolean", "description": "Whether the window is currently the focused window."},
          "top": {"type": "integer", "description": "The offset of the window from the top edge of the screen in pixels."},
          "left": {"type": "integer", "description": "The offset of the window from the left edge of the screen in pixels."},
          "width": {"type": "integer", "description": "The width of the window in pixels."},
          "height": {"type": "integer", "description": "The height of the window in pixels."},
          "tabs": {"type": "array", "items": { "$ref": "Tab" }, "optional": true, "description": "Array of $ref:Tab objects representing the current tabs in the window."},
          "incognito": {"type": "boolean", "description": "Whether the window is incognito."},
          "type": {
            "type": "string",
            "description": "The type of browser window this is.",
            "enum": ["normal", "popup", "app"]
          }
        }
      }
    ],
    "properties": {
      "WINDOW_ID_NONE": {
        "type": "integer",
        "value": "-1",
        "description": "The windowId value that represents the absence of a chrome browser window."
      }
    },
    "functions": [
      {
        "name": "get",
        "type": "function",
        "description": "Gets details about a window.",
        "parameters": [
          {"type": "integer", "name": "windowId", "minimum": 0},
          {
            "type": "function",
            "name": "callback",
            "parameters": [
              {
                "name": "window", "$ref": "Window"
              }
            ]
          }
        ]
      },
      {
        "name": "getCurrent",
        "type": "function",
        "description": "Gets the <a href='#current-window'>current window</a>.",
        "parameters": [
          {
            "type": "function",
            "name": "callback",
            "parameters": [
              {
                "name": "window", "$ref": "Window"
              }
            ]
          }
        ]
      },
      {
        "name": "getLastFocused",
        "type": "function",
        "description": "Gets the window that was most recently focused &mdash; typically the window 'on top'.",
        "parameters": [
          {
            "type": "function",
            "name": "callback",
            "parameters": [
              {
                "name": "window", "$ref": "Window"
              }
            ]
          }
        ]
      },
      {
        "name": "getAll",
        "type": "function",
        "description": "Gets all windows.",
        "parameters": [
          {
            "type": "object",
            "name": "getInfo",
            "optional": true,
            "description": "",
            "properties": {
              "populate": {"type": "boolean", "optional": true, "description": "If true, each window object will have a <var>tabs</var> property that contains a list of the $ref:Tab objects for that window." }
            }
          },
          {
            "type": "function",
            "name": "callback",
            "parameters": [
              {
                "name": "windows", "type": "array", "items": { "$ref": "Window" }
              }
            ]
          }
        ]
      },
      {
        "name": "create",
        "type": "function",
        "description": "Creates (opens) a new browser with any optional sizing, position or default URL provided.",
        "parameters": [
          {
            "type": "object",
            "name": "createData",
            "properties": {
              "url": {"type": "string", "optional": true, "description": "The URL to navigate the first tab to. Fully-qualified URLs must include a scheme (i.e. 'http://www.google.com', not 'www.google.com'). Relative URLs will be relative to the current page within the extension. Defaults to the New Tab Page."},
              "left": {"type": "integer", "optional": true, "description": "The number of pixels to position the new window from the left edge of the screen. If not specified, the new window is offset naturally from the last focusd window."},
              "top": {"type": "integer", "optional": true, "description": "The number of pixels to position the new window from the top edge of the screen. If not specified, the new window is offset naturally from the last focusd window."},
              "width": {"type": "integer", "minimum": 0, "optional": true, "description": "The width in pixels of the new window. If not specified defaults to a natural width."},
              "height": {"type": "integer", "minimum": 0, "optional": true, "description": "The height in pixels of the new window. If not specified defaults to a natural height."},
              "incognito": {"type": "boolean", "optional": true, "description": "Whether the new window should be an incognito window."},
              "type": {
                "type": "string",
                "optional": true,
                "description": "Specifies what type of browser window to create.",
                "enum": ["normal", "popup"]
              }
            },
            "optional": true
          },
          {
            "type": "function",
            "name": "callback",
            "optional": true,
            "parameters": [
              {
                "name": "window", "$ref": "Window", "description": "Contains details about the created window.",
                "optional": true
              }
            ]
          }
        ]
      },
      {
        "name": "update",
        "type": "function",
        "description": "Updates the properties of a window. Specify only the properties that you want to change; unspecified properties will be left unchanged.",
        "parameters": [
          {"type": "integer", "name": "windowId", "minimum": 0},
          {
            "type": "object",
            "name": "updateInfo",
            "properties": {
              "left": {"type": "integer", "optional": true, "description": "The offset from the left edge of the screen to move the window to in pixels."},
              "top": {"type": "integer", "optional": true, "description": "The offset from the top edge of the screen to move the window to in pixels."},
              "width": {"type": "integer", "minimum": 0, "optional": true, "description": "The width to resize the window to in pixels."},
              "height": {"type": "integer", "minimum": 0, "optional": true, "description": "The height to resize the window to in pixels."}
            }
          },
          {
            "type": "function",
            "name": "callback",
            "optional": true,
            "parameters": [
              {
                "name": "window", "$ref": "Window"
              }
            ]
          }
        ]
      },
      {
        "name": "remove",
        "type": "function",
        "description": "Removes (closes) a window, and all the tabs inside it.",
        "parameters": [
          {"type": "integer", "name": "windowId", "minimum": 0},
          {"type": "function", "name": "callback", "optional": true, "parameters": []}
        ]
      }
    ],
    "events": [
      {
        "name": "onCreated",
        "type": "function",
        "description": "Fired when a window is created.",
        "parameters": [
          {
            "$ref": "Window",
            "name": "window",
            "description": "Details of the window that was created."
          }
        ]
      },
      {
        "name": "onRemoved",
        "type": "function",
        "description": "Fired when a window is removed (closed).",
        "parameters": [
          {"type": "integer", "name": "windowId", "minimum": 0, "description": "ID of the removed window."}
        ]
      },
      {
        "name": "onFocusChanged",
        "type": "function",
        "description": "Fired when the currently focused window changes. Will be chrome.windows.WINDOW_ID_NONE if all chrome windows have lost focus. Note: On some Linux window managers, WINDOW_ID_NONE will always be sent immediately preceding a switch from one chrome window to another.",
        "parameters": [
          {"type": "integer", "name": "windowId", "minimum": 0, "description": "ID of the newly focused window."}
        ]
      }
    ]
  },
  {
    "namespace": "tabs",
    "types": [
      {
        "id": "Tab",
        "type": "object",
        "properties": {
          "id": {"type": "integer", "minimum": 0, "description": "The ID of the tab. Tab IDs are unique within a browser session."},
          "index": {"type": "integer", "minimum": 0, "description": "The zero-based index of the tab within its window."},
          "windowId": {"type": "integer", "minimum": 0, "description": "The ID of the window the tab is contained within."},
          "selected": {"type": "boolean", "description": "Whether the tab is selected."},
          "url": {"type": "string", "description": "The URL the tab is displaying."},
          "title": {"type": "string", "optional": true, "description": "The title of the tab. This may not be available if the tab is loading."},
          "favIconUrl": {"type": "string", "optional": true, "description": "The URL of the tab's favicon. This may not be available if the tab is loading."},
          "status": {"type": "string", "optional": true, "description": "Either <em>loading</em> or <em>complete</em>."},
          "incognito": {"type": "boolean", "description": "Whether the tab is in an incognito window."}
        }
      }
    ],
    "functions": [
      {
        "name": "get",
        "type": "function",
        "description": "Retrieves details about the specified tab.",
        "parameters": [
          {
            "type": "integer",
            "name": "tabId",
            "minimum": 0
          },
          {
            "type": "function",
            "name": "callback",
            "parameters": [
              {"name": "tab", "$ref": "Tab"}
            ]
          }
        ]
      },
      {
        "name": "getCurrent",
        "type": "function",
        "description": "Gets the tab that this script call is being made from. May be undefined if called from a non-tab context (for example: a background page or popup view).",
        "parameters": [
          {
            "type": "function",
            "name": "callback",
            "parameters": [
              {
                "name": "tab",
                "$ref": "Tab",
                "optional": true
              }
            ]
          }
        ]
      },
      {
        "name": "connect",
        "type": "function",
        "description": "Connects to the content script(s) in the specified tab. The <a href='extension.html#event-onConnect'>chrome.extension.onConnect</a> event is fired in each content script running in the specified tab for the current extension. For more details, see <a href='content_scripts.html#messaging'>Content Script Messaging</a>.",
        "parameters": [
          {
            "type": "integer",
            "name": "tabId",
            "minimum": 0
          },
          {
            "type": "object",
            "name": "connectInfo",
            "properties": {
              "name": { "type": "string", "optional": true, "description": "Will be passed into onConnect for content scripts that are listening for the connection event." }
            },
            "optional": true
          }
        ],
        "returns": {
          "$ref": "Port",
          "description": "A port that can be used to communicate with the content scripts running in the specified tab."
        }
      },
      {
        "name": "sendRequest",
        "type": "function",
        "description": "Sends a single request to the content script(s) in the specified tab, with an optional callback to run when a response is sent back.  The <a href='extension.html#event-onRequest'>chrome.extension.onRequest</a> event is fired in each content script running in the specified tab for the current extension.",
        "parameters": [
          {
            "type": "integer",
            "name": "tabId",
            "minimum": 0
          },
          {
            "type": "any",
            "name": "request"
          },
          {
            "type": "function",
            "name": "responseCallback",
            "optional": true,
            "parameters": [
              {
                "name": "response",
                "type": "any",
                "description": "The JSON response object sent by the handler of the request."
              }
            ]
          }
        ]
      },
      {
        "name": "getSelected",
        "type": "function",
        "description": "Gets the tab that is selected in the specified window.",
        "parameters": [
          {
            "type": "integer",
            "name": "windowId",
            "minimum": 0,
            "optional": true,
            "description": "Defaults to the <a href='windows.html#current-window'>current window</a>."
          },
          {
            "type": "function",
            "name": "callback",
            "parameters": [
              {"name": "tab", "$ref": "Tab"}
            ]
          }
        ]
      },
      {
        "name": "getAllInWindow",
        "type": "function",
        "description": "Gets details about all tabs in the specified window.",
        "parameters": [
          {
            "type": "integer",
            "name": "windowId",
            "minimum": 0,
            "optional": true,
            "description": "Defaults to the <a href='windows.html#current-window'>current window</a>."
            },
          {
            "type": "function",
            "name": "callback",
            "parameters": [
              {"name": "tabs", "type": "array", "items": { "$ref": "Tab" } }
            ]
          }
        ]
      },
      {
        "name": "create",
        "type": "function",
        "description": "Creates a new tab. Note: This function can be used without requesting the 'tabs' permission in the manifest.",
        "parameters": [
          {
            "type": "object",
            "name": "createProperties",
            "properties": {
              "windowId": {
                "type": "integer",
                "minimum": 0,
                "optional": true,
                "description": "The window to create the new tab in. Defaults to the <a href='windows.html#current-window'>current window</a>."
              },
              "index": {
                "type": "integer",
                "minimum": 0,
                "optional": true,
                "description": "The position the tab should take in the window. The provided value will be clamped to between zero and the number of tabs in the window."
              },
              "url": {
                "type": "string",
                "optional": true,
                "description": "The URL to navigate the tab to initially. Fully-qualified URLs must include a scheme (i.e. 'http://www.google.com', not 'www.google.com'). Relative URLs will be relative to the current page within the extension. Defaults to the New Tab Page."
              },
              "selected": {
                "type": "boolean",
                "optional": true,
                "description": "Whether the tab should become the selected tab in the window. Defaults to <var>true</var>"
              }
            }
          },
          {
            "type": "function",
            "name": "callback",
            "optional": true,
            "parameters": [
              {
                "name": "tab",
                "$ref": "Tab",
                "description": "Details about the created tab. Will contain the ID of the new tab."
              }
            ]
          }
        ]
      },
      {
        "name": "update",
        "type": "function",
        "description": "Modifies the properties of a tab. Properties that are not specified in <var>updateProperties</var> are not modified. Note: This function can be used without requesting the 'tabs' permission in the manifest.",
        "parameters": [
          {"type": "integer", "name": "tabId", "minimum": 0},
          {
            "type": "object",
            "name": "updateProperties",
            "properties": {
              "url": {"type": "string", "optional": true},
              "selected": {"type": "boolean", "optional": true}
            }
          },
          {
            "type": "function",
            "name": "callback",
            "optional": true,
            "parameters": [
              {
                "name": "tab",
                "$ref": "Tab",
                "description": "Details about the updated tab."
              }
            ]
          }
        ]
      },
      {
        "name": "move",
        "type": "function",
        "description": "Moves a tab to a new position within its window, or to a new window. Note that tabs can only be moved to and from normal (window.type === \"normal\") windows.",
        "parameters": [
          {"type": "integer", "name": "tabId", "minimum": 0},
          {
            "type": "object",
            "name": "moveProperties",
            "properties": {
              "windowId": {
                "type": "integer",
                "minimum": 0,
                "optional": true,
                "description": "Defaults to the window the tab is currently in."
              },
              "index": {
                "type": "integer",
                "minimum": 0,
                "description": "The position to move the window to. The provided value will be clamped to between zero and the number of tabs in the window."
              }
            }
          },
          {
            "type": "function",
            "name": "callback",
            "optional": true,
            "parameters": [
              {
                "name": "tab",
                "$ref": "Tab",
                "description": "Details about the moved tab."
              }
            ]
          }
        ]
      },
      {
        "name": "remove",
        "type": "function",
        "description": "Closes a tab.",
        "parameters": [
          {"type": "integer", "name": "tabId", "minimum": 0},
          {"type": "function", "name": "callback", "optional": true, "parameters": []}
        ]
      },
      {
        "name": "detectLanguage",
        "type": "function",
        "description": "Detects the primary language of the content in a tab.",
        "parameters": [
          {
            "type": "integer",
            "name": "tabId",
            "minimum": 0,
            "optional": true,
            "description": "Defaults to the selected tab of the <a href='windows.html#current-window'>current window</a>."
          },
          {
            "type": "function",
            "name": "callback",
            "parameters": [
              {
                "type": "string",
                "name": "language",
                "description": "An ISO language code such as <code>en</code> or <code>fr</code>. For a complete list of languages supported by this method, see <a href='http://src.chromium.org/viewvc/chrome/trunk/src/third_party/cld/languages/internal/languages.cc'>kLanguageInfoTable</a>. The 2nd to 4th columns will be checked and the first non-NULL value will be returned except for Simplified Chinese for which zh-CN will be returned. For an unknown language, <code>und</code> will be returned."
              }
            ]
          }
        ]
      },
      {
        "name": "captureVisibleTab",
        "type": "function",
        "description": "Captures the visible area of the currently selected tab in the specified window.",
        "parameters": [
          {
            "type": "integer",
            "name": "windowId",
            "minimum": 0,
            "optional": true,
            "description": "The target window. Defaults to the <a href='windows.html#current-window'>current window</a>."
          },
          {
            "type": "object",
            "name": "options",
            "optional": true,
            "min_version": "5.0.372.0",
            "description": "Set parameters of image capture, such as the format of the resulting image.",
            "properties": {
              "format": {
                "type": "string",
                "optional": true,
                "enum": ["jpeg", "png"],
                "description": "The format of the resulting image.  Default is jpeg."
              },
              "quality": {
                "type": "integer",
                "name": "quality",
                "optional": true,
                "minimum": 0,
                "maximum": 100,
                "description": "When format is 'jpeg', controls the quality of the resulting image.  This value is ignored for PNG images.  As quality is decreased, the resulting image will have more visual artifacts, and the number of bytes needed to store it will decrease."
              }
            }
          },
          {
            "type": "function", "name": "callback", "parameters": [
              {"type": "string", "name": "dataUrl", "description": "A data URL which encodes an image of the visible area of the captured tab. May be assigned to the 'src' property of an HTML Image element for display."}
            ]
          }
        ]
      },
      {
        "name": "executeScript",
        "type": "function",
        "description": "Injects JavaScript code into a page. For details, see the <a href='content_scripts.html#pi'>programmatic injection</a> section of the content scripts doc.",
        "parameters": [
          {"type": "integer", "name": "tabId", "optional": true, "description": "The ID of the tab in which to run the script; defaults to the selected tab of the current window."},
          {
            "type": "object",
            "name": "details",
            "description": "Details of the script to run. Either the code or the file property must be set, but both may not be set at the same time.",
            "properties": {
              "code": {"type": "string", "optional": true, "description": "JavaScript code to execute."},
              "file": {"type": "string", "optional": true, "description": "JavaScript file to execute."},
              "allFrames": {"type": "boolean", "optional": true, "description": "If allFrames is true, this function injects script into all frames of current page. By default, it's false and script is injected only into the top main frame."}
            }
          },
          {
            "type": "function",
            "name": "callback",
            "optional": true,
            "description": "Called after all the JavaScript has been executed.",
            "parameters": []
          }
        ]
      },
      {
        "name": "insertCSS",
        "type": "function",
        "description": "Injects CSS into a page. For details, see the <a href='content_scripts.html#pi'>programmatic injection</a> section of the content scripts doc.",
        "parameters": [
          {"type": "integer", "name": "tabId", "optional": true, "description": "The ID of the tab in which to insert the CSS; defaults to the selected tab of the current window."},
          {
            "type": "object",
            "name": "details",
            "description": "Details of the CSS text to insert. Either the code or the file property must be set, but both may not be set at the same time.",
            "properties": {
              "code": {"type": "string", "optional": true, "description": "CSS code to be injected."},
              "file": {"type": "string", "optional": true, "description": "CSS file to be injected."},
              "allFrames": {"type": "boolean", "optional": true, "description": "If allFrames is true, this function injects CSS text into all frames of current page. By default, it's false and CSS is injected only into the top main frame."}
            }
          },
          {
            "type": "function",
            "name": "callback",
            "optional": true,
            "description": "Called when all the CSS has been inserted.",
            "parameters": []
          }
        ]
      }
    ],
    "events": [
      {
        "name": "onCreated",
        "type": "function",
        "description": "Fires when a tab is created.",
        "parameters": [
          {
            "$ref": "Tab",
            "name": "tab",
            "description": "Details of the tab that was created."
          }
        ]
      },
      {
        "name": "onUpdated",
        "type": "function",
        "description": "Fires when a tab is updated.",
        "parameters": [
          {"type": "integer", "name": "tabId", "minimum": 0},
          {
            "type": "object",
            "name": "changeInfo",
            "description": "Lists the changes to the state of the tab that was updated.",
            "properties": {
              "status": {
                "type": "string",
                "description": "The status of the tab. Can be either <em>loading</em> or <em>complete</em>."
              },
              "url": {
                "type": "string",
                "optional": true,
                "description": "Only specified if the tab's URL changed."
              }
            }
          },
          {
            "$ref": "Tab",
            "name": "tab",
            "description": "Gives the state of the tab that was updated."
          }
        ]
      },
      {
        "name": "onMoved",
        "type": "function",
        "description": "Fires when a tab is moved within a window. Only one move event is fired, representing the tab the user directly moved. Move events are not fired for the other tabs that must move in response. This event is not fired when a tab is moved between windows. For that, see <a href='#event-onDetached'>onDetached</a>.",
        "parameters": [
          {"type": "integer", "name": "tabId", "minimum": 0},
          {
            "type": "object",
            "name": "moveInfo",
            "properties": {
              "windowId": {"type": "integer", "minimum": 0},
              "fromIndex": {"type": "integer", "minimum": 0},
              "toIndex": {"type": "integer", "minimum": 0}
            }
          }
        ]
      },
      {
        "name": "onSelectionChanged",
        "type": "function",
        "description": "Fires when the selected tab in a window changes.",
        "parameters": [
          {
            "type": "integer",
            "name": "tabId",
            "minimum": 0,
            "description": "The ID of the tab that has become selected."
          },
          {
            "type": "object",
            "name": "selectInfo",
            "properties": {
              "windowId": {
                "type": "integer",
                "minimum": 0,
                "description": "The ID of the window the selected tab changed inside of."
              }
            }
          }
        ]
      },
      {
        "name": "onDetached",
        "type": "function",
        "description": "Fired when a tab is detached from a window, for example because it is being moved between windows.",
        "parameters": [
          {"type": "integer", "name": "tabId", "minimum": 0},
          {
            "type": "object",
            "name": "detachInfo",
            "properties": {
              "oldWindowId": {"type": "integer", "minimum": 0},
              "oldPosition": {"type": "integer", "minimum": 0}
            }
          }
        ]
      },
      {
        "name": "onAttached",
        "type": "function",
        "description": "Fired when a tab is attached to a window, for example because it was moved between windows.",
        "parameters": [
          {"type": "integer", "name": "tabId", "minimum": 0},
          {
            "type": "object",
            "name": "attachInfo",
            "properties": {
              "newWindowId": {"type": "integer", "minimum": 0},
              "newPosition": {"type": "integer", "minimum": 0}
            }
          }
        ]
      },
      {
        "name": "onRemoved",
        "type": "function",
        "description": "Fires when a tab is closed.",
        "parameters": [
          {"type": "integer", "name": "tabId", "minimum": 0}
        ]
      }
    ]
  },
  {
    "namespace": "pageActions",
    "nodoc": true,
    "types": [],
    "functions": [
      {
        "name": "enableForTab",
        "type": "function",
        "description": "Enables a page action for a particular tab+URL combination (makes its icon visible in the OmniBox when a certain URL is active in a given tab). The page action will automatically be disabled (its icon hidden) if the user navigates to a new URL or closes the tab. The action will also automatically be enabled/disabled as the user switches tabs.",
        "parameters": [
          {"type": "string", "name": "pageActionId", "description": "An extension can have multiple page actions specified in the manifest, each with a unique identifier. This string identifies which page action you want to enable (and must match a page action id declared in the manifest)."},
          {
            "type": "object",
            "name": "action",
            "description": "An object specifing what action should be applied to the page action. Contains the following properties:",
            "properties": {
              "tabId": {"type": "integer", "minimum": 0, "description": "The id of the tab for which you want to enable the page action."},
              "url": {"type": "string", "description": "The URL of the page you want the page action to apply to. If the URL specified does not match the currently navigated URL (user has navigated to another page) then no action is taken."},
              "title": {"type": "string", "optional": true, "description": "Specifying <b>title</b> allows you to change the tooltip that appears when you hover over the page action icon in the OmniBox. This parameter is optional and if omitted then the page action <b>name</b> property declared in the manifest is used."},
              "iconId": {"type": "integer", "minimum": 0, "optional": true, "description": "A zero-based index into the <b>icons</b> vector specified in the manifest. This parameter is optional and if omitted then the first icon in the <b>icons</b> vector of the page action is used. This id is useful to represent different page action states. Example: An RSS feed icon could have a 'subscribe now' icon and an 'already subscribed' icon."}
            },
            "optional": false
          }
        ]
      },
      {
        "name": "disableForTab",
        "type": "function",
        "description": "Disables a page action for a particular tab+URL combination (makes its OmniBox page action icon hidden when a certain URL is active in a given tab). This can be useful to disable a page action before the user navigates away from a page containing an enabled page action.",
        "parameters": [
          {"type": "string", "name": "pageActionId", "description": "An extension can have multiple page actions specified in the manifest, each with a unique identifier. This string identifies which page action you want to disable (and must match a page action id declared in the manifest)."},
          {
            "type": "object",
            "name": "action",
            "description": "An object specifying what action should be applied to the page action. Contains the following properties:",
            "properties": {
              "tabId": {"type": "integer", "minimum": 0, "description": "The id of the tab for which you want to disable the page action."},
              "url": {"type": "string", "description": "The URL of the page you want the page action to not apply to. If the URL specified does not match the currently navigated URL (user has navigated to another page) then no action is taken."}
            },
            "optional": false
          }
        ]
      }
    ],
    "events": []
  },
  {
    "namespace": "pageAction",
    "types": [],
    "functions": [
      {
        "name": "show",
        "type": "function",
        "description": "Shows the page action. The page action is shown whenever the tab is selected.",
        "parameters": [
          {"type": "integer", "name": "tabId", "minimum": 0, "description": "The id of the tab for which you want to modify the page action."}
        ]
      },
      {
        "name": "hide",
        "type": "function",
        "description": "Hides the page action.",
        "parameters": [
          {"type": "integer", "name": "tabId", "minimum": 0, "description": "The id of the tab for which you want to modify the page action."}
        ]
      },
      {
        "name": "setTitle",
        "type": "function",
        "description": "Sets the title of the page action. This is displayed in a tooltip over the page action.",
        "parameters": [
          {
            "name": "details",
            "type": "object",
            "properties": {
              "tabId": {"type": "integer", "minimum": 0, "description": "The id of the tab for which you want to modify the page action."},
              "title": {"type": "string", "description": "The tooltip string."}
            }
          }
        ]
      },
      {
        "name": "setIcon",
        "type": "function",
        "description": "Sets the icon for the page action. The icon can be specified either as the path to an image file or as the pixel data from a canvas element. Either the <b>path</b> or the <b>imageData</b> property must be specified.",
        "parameters": [
          {
            "name": "details",
            "type": "object",
            "properties": {
              "tabId": {"type": "integer", "minimum": 0, "description": "The id of the tab for which you want to modify the page action."},
              "imageData": {
                "type": "object",
                "isInstanceOf": "ImageData",
                "properties": {},
                "additionalProperties": { "type": "any" },
                "description": "Pixel data for an image. Must be an ImageData object (for example, from a canvas element).",
                "optional": true
              },
              "path": {
                "type": "string",
                "description": "Relative path to an image in the extension to show in the browser action.",
                "optional": true
              },
              "iconIndex": {
                "type": "integer",
                "minimum": 0,
                "description": "<b>Deprecated.</b> The zero-based index into the <b>icons</b> vector specified in the manifest.",
                "optional": true
              }
            }
          }
        ]
      },
      {
        "name": "setPopup",
        "type": "function",
        "description": "Sets the html document to be opened as a popup when the user clicks on the page action's icon.",
        "min_version": "5.0.308.0",
        "parameters": [
          {
            "name": "details",
            "type": "object",
            "properties": {
              "tabId": {"type": "integer", "minimum": 0, "description": "The id of the tab for which you want to modify the page action."},
              "popup": {
                "type": "string",
                "description": "The html file to show in a popup.  If set to the empty string (''), no popup is shown."
              }
            }
          }
        ]
      }
    ],
    "events": [
      {
        "name": "onClicked",
        "perExtensionEvent": true,
        "type": "function",
        "description": "Fired when a page action icon is clicked.  This event will not fire if the page action has a popup.",
        "parameters": [
          {
            "name": "tab",
            "$ref": "Tab"
          }
        ]
      }
    ]
  },
  {
    "namespace": "browserAction",
    "types": [],
    "functions": [
      {
        "name": "setTitle",
        "type": "function",
        "description": "Sets the title of the browser action. This shows up in the tooltip.",
        "parameters": [
          {
            "name": "details",
            "type": "object",
            "properties": {
              "title": {
                "type": "string",
                "description": "The string the browser action should display when moused over."
              },
              "tabId": {
                "type": "integer",
                "optional": true,
                "description": "Limits the change to when a particular tab is selected. Automatically resets when the tab is closed."
              }
            }
          }
        ]
      },
      {
        "name": "setIcon",
        "type": "function",
        "description": "Sets the icon for the browser action. The icon can be specified either as the path to an image file or as the pixel data from a canvas element. Either the <b>path</b> or the <b>imageData</b> property must be specified.",
        "parameters": [
          {
            "name": "details",
            "type": "object",
            "properties": {
              "imageData": {
                "type": "object",
                "isInstanceOf": "ImageData",
                "properties": {},
                "additionalProperties": { "type": "any" },
                "description": "Pixel data for an image. Must be an ImageData object (for example, from a <code>canvas</code> element).",
                "optional": true
              },
              "path": {
                "type": "string",
                "description": "Relative path to an image in the extension to show in the browser action.",
                "optional": true
              },
              "tabId": {
                "type": "integer",
                "optional": true,
                "description": "Limits the change to when a particular tab is selected. Automatically resets when the tab is closed."
              }
            }
          }
        ]
      },
      {
        "name": "setPopup",
        "type": "function",
        "min_version": "5.0.316.0",
        "description": "Sets the html document to be opened as a popup when the user clicks on the browser action's icon.",
        "parameters": [
          {
            "name": "details",
            "type": "object",
            "properties": {
              "tabId": {
                "type": "integer",
                "optional": true,
                "minimum": 0,
                "description": "Limits the change to when a particular tab is selected. Automatically resets when the tab is closed."
              },
              "popup": {
                "type": "string",
                "description": "The html file to show in a popup.  If set to the empty string (''), no popup is shown."
              }
            }
          }
        ]
      },
      {
        "name": "setBadgeText",
        "type": "function",
        "description": "Sets the badge text for the browser action. The badge is displayed on top of the icon.",
        "parameters": [
          {
            "name": "details",
            "type": "object",
            "properties": {
              "text": {
                "type": "string",
                "description": "Any number of characters can be passed, but only about four can fit in the space."
              },
              "tabId": {
                "type": "integer",
                "optional": true,
                "description": "Limits the change to when a particular tab is selected. Automatically resets when the tab is closed."
              }
            }
          }
        ]
      },
      {
        "name": "setBadgeBackgroundColor",
        "type": "function",
        "description": "Sets the background color for the badge.",
        "parameters": [
          {
            "name": "details",
            "type": "object",
            "properties": {
              "color": {
                "type": "array",
                "description": "An array of four integers in the range [0,255] that make up the RGBA color of the badge. For example, opaque red is <code>[255, 0, 0, 255]</code>.",
                "items": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 255
                },
                "minItems": 4,
                "maxItems": 4
              },
              "tabId": {
                "type": "integer",
                "optional": true,
                "description": "Limits the change to when a particular tab is selected. Automatically resets when the tab is closed."
              }
            }
          }
        ]
      }
    ],
    "events": [
      {
        "name": "onClicked",
        "perExtensionEvent": true,
        "type": "function",
        "description": "Fired when a browser action icon is clicked.  This event will not fire if the browser action has a popup.",
        "parameters": [
          {
            "name": "tab",
            "$ref": "Tab"
          }
        ]
      }
    ]
  },
  {
    "namespace": "experimental.infobars",
    "types": [],
    "functions": [
      {
        "name": "show",
        "type": "function",
        "description": "Shows an infobar in the specified tab. The infobar will be closed automatically when the tab navigates. Use window.close() to close the infobar before then.",
        "parameters": [
          {
            "name": "details",
            "type": "object",
            "properties": {
              "tabId": {
                "type": "integer",
                "description": "The tab id for the tab to display the infobar in."
              },
              "path": {
                "type": "string",
                "description": "The html file that contains the infobar."
              }
            }
          },
          {
            "type": "function",
            "name": "callback",
            "optional": true,
            "parameters": [
              {
                "name": "window", "$ref": "Window", "description": "Contains details about the window in which the infobar was created."
              }
            ]
          }
        ]
      }
    ]
  },
  {
    "namespace": "bookmarks",
    "types": [
      {
        "id": "BookmarkTreeNode",
        "type": "object",
        "description": "A node (either a bookmark or a folder) in the bookmark tree.  Child nodes are ordered within their parent folder.",
        "properties": {
          "id": {"type": "string", "minimum": 0, "description": "The unique identifier for the node. IDs are unique within the current profile, and they remain valid even after the browser is restarted."},
          "parentId": {"type": "string", "minimum": 0, "optional": true, "description": "The <code>id</code> of the parent folder.  Omitted for the root node."},
          "index": {"type": "integer", "optional": true, "description": "The 0-based position of this node within its parent folder."},
          "url": {"type": "string", "optional": true, "description": "The URL navigated to when a user clicks the bookmark. Omitted for folders."},
          "title": {"type": "string", "description": "The text displayed for the node."},
          "dateAdded": {"type": "number", "optional": true, "description": "When this node was created, in milliseconds since the epoch (<code>new Date(dateAdded)</code>)."},
          "dateGroupModified": {"type": "number", "optional": true, "description": "When the contents of this folder last changed, in milliseconds since the epoch."},
          "children": {"type": "array", "optional": true, "items": {"$ref": "BookmarkTreeNode"}, "description": "An ordered list of children of this node."}
        }
      }
    ],
    "functions": [
      {
        "name": "get",
        "type": "function",
        "description": "Retrieves the specified BookmarkTreeNode(s).",
        "parameters": [
          {
            "name": "idOrIdList",
            "description": "A single string-valued id, or an array of string-valued ids",
            "choices": [
              {"type": "string"},
              {"type": "array", "items": {"type": "string"}, "minItems": 1}
            ]
          },
          {
            "type": "function",
            "name": "callback",
            "parameters": [
              {"name": "results", "type": "array", "items": { "$ref": "BookmarkTreeNode"} }
            ]
          }
        ]
      },
      {
        "name": "getChildren",
        "type": "function",
        "description": "Retrieves the children of the specified BookmarkTreeNode id.",
        "parameters": [
          {"type": "string", "name": "id"},
          {
            "type": "function",
            "name": "callback",
            "parameters": [
              {"name": "results", "type": "array", "items": { "$ref": "BookmarkTreeNode"} }
            ]
          }
        ]
      },
      {
        "name": "getRecent",
        "type": "function",
        "description": "Retrieves the recently added bookmarks.",
        "parameters": [
          {
            "type": "integer",
            "minimum": 1,
            "name": "numberOfItems",
            "description": "The maximum number of items to return."
          },
          {
            "type": "function",
            "name": "callback",
            "parameters": [
              {"name": "results", "type": "array", "items": { "$ref": "BookmarkTreeNode"} }
            ]
          }
        ]
      },
      {
        "name": "getTree",
        "type": "function",
        "description": "Retrieves the entire Bookmarks hierarchy.",
        "parameters": [
          {
            "type": "function",
            "name": "callback",
            "parameters": [
              {"name": "results", "type": "array", "items": { "$ref": "BookmarkTreeNode"} }
            ]
          }
        ]
      },
      {
        "name": "search",
        "type": "function",
        "description": "Searches for BookmarkTreeNodes matching the given query.",
        "parameters": [
          {"type": "string", "name": "query"},
          {
            "type": "function",
            "name": "callback",
            "parameters": [
              {"name": "results", "type": "array", "items": { "$ref": "BookmarkTreeNode"} }
            ]
          }
        ]
      },
      {
        "name": "create",
        "type": "function",
        "description": "Creates a bookmark or folder under the specified parentId.  If url is NULL or missing, it will be a folder.",
        "parameters": [
          {
            "type": "object",
            "name": "bookmark",
            "properties": {
              "parentId": {"type": "string"},
              "index": {"type": "integer", "minimum": 0, "optional": true},
              "title": {"type": "string", "optional": true},
              "url": {"type": "string", "optional": true}
            }
          },
          {
            "type": "function",
            "name": "callback",
            "optional": true,
            "parameters": [
              {"name": "result", "$ref": "BookmarkTreeNode" }
            ]
          }
        ]
      },
      {
        "name": "move",
        "type": "function",
        "description": "Moves the specified BookmarkTreeNode to the provided location.",
        "parameters": [
          {"type": "string", "name": "id"},
          {
            "type": "object",
            "name": "destination",
            "properties": {
              "parentId": {"type": "string"},
              "index": {"type": "integer", "minimum": 0, "optional": true}
            }
          },
          {
            "type": "function",
            "name": "callback",
            "optional": true,
            "parameters": [
              {"name": "result", "$ref": "BookmarkTreeNode" }
            ]
          }
        ]
      },
      {
        "name": "update",
        "type": "function",
        "description": "Updates the properties of a bookmark or folder. Specify only the properties that you want to change; unspecified properties will be left unchanged.  <b>Note:</b> Currently, only 'title' and 'url' are supported.",
        "parameters": [
          {"type": "string", "name": "id"},
          {
            "type": "object",
            "name": "changes",
            "properties": {
              "title": {"type": "string", "optional": true},
              "url": {"type": "string", "optional": true}
            }
          },
          {
            "type": "function",
            "name": "callback",
            "optional": true,
            "parameters": [
              {"name": "result", "$ref": "BookmarkTreeNode" }
            ]
          }
        ]
      },
      {
        "name": "remove",
        "type": "function",
        "description": "Removes a bookmark or an empty bookmark folder.",
        "parameters": [
          {"type": "string", "name": "id"},
          {"type": "function", "name": "callback", "optional": true, "parameters": []}
        ]
      },
      {
        "name": "removeTree",
        "type": "function",
        "description": "Recursively removes a bookmark folder.",
        "parameters": [
          {"type": "string", "name": "id"},
          {"type": "function", "name": "callback", "optional": true, "parameters": []}
        ]
      },
      {
        "name": "import",
        "type": "function",
        "description": "Imports bookmarks from a chrome html bookmark file",
        "nodoc": "true",
        "parameters": [
          {"type": "function", "name": "callback", "optional": true, "parameters": []}
        ]
      },
      {
        "name": "export",
        "type": "function",
        "description": "Exports bookmarks to a chrome html bookmark file",
        "nodoc": "true",
        "parameters": [
          {"type": "function", "name": "callback", "optional": true, "parameters": []}
        ]
      }
    ],
    "events": [
      {
        "name": "onCreated",
        "type": "function",
        "description": "Fired when a bookmark or folder is created.",
        "parameters": [
          {"type": "string", "name": "id"},
          {
            "$ref": "BookmarkTreeNode",
            "name": "bookmark"
          }
        ]
      },
      {
        "name": "onRemoved",
        "type": "function",
        "description": "Fired when a bookmark or folder is removed.  When a folder is removed recursively, a single notification is fired for the folder, and none for its contents.",
        "parameters": [
          {"type": "string", "name": "id"},
          {
            "type": "object",
            "name": "removeInfo",
            "properties": {
              "parentId": { "type": "string" },
              "index": { "type": "integer" }
            }
          }
        ]
      },
      {
        "name": "onChanged",
        "type": "function",
        "description": "Fired when a bookmark or folder changes.  <b>Note:</b> Currently, only title and url changes trigger this.",
        "parameters": [
          {"type": "string", "name": "id"},
          {
            "type": "object",
            "name": "changeInfo",
            "properties": {
              "title": {"type": "string"},
              "url": {"type": "string", "optional": true}
            }
          }
        ]
      },
      {
        "name": "onMoved",
        "type": "function",
        "description": "Fired when a bookmark or folder is moved to a different parent folder.",
        "parameters": [
          {"type": "string", "name": "id"},
          {
            "type": "object",
            "name": "moveInfo",
            "properties": {
              "parentId": { "type": "string" },
              "index": { "type": "integer" },
              "oldParentId": { "type": "string" },
              "oldIndex": { "type": "integer" }
            }
          }
        ]
      },
      {
        "name": "onChildrenReordered",
        "type": "function",
        "description": "Fired when the children of a folder have changed their order due to the order being sorted in the UI.  This is not called as a result of a move().",
        "parameters": [
          {"type": "string", "name": "id"},
          {
            "type": "object",
            "name": "reorderInfo",
            "properties": {
              "childIds": { "type": "array", "items": { "type": "string" } }
            }
          }
        ]
      },
      {
        "name": "onImportBegan",
        "type": "function",
        "description": "Fired when a bookmark import session is begun.  Expensive observers should ignore handleCreated updates until onImportEnded is fired.  Observers should still handle other notifications immediately.",
        "parameters": []
      },
      {
        "name": "onImportEnded",
        "type": "function",
        "description": "Fired when a bookmark import session is ended.",
        "parameters": []
      }
    ]
  },
  {
    "namespace": "history",
    "types": [
      {
        "id": "HistoryItem",
        "type": "object",
        "description": "An object encapsulating one result of a history query.",
        "properties": {
          "id": {"type": "string", "minimum": 0, "description": "The unique identifier for the item."},
          "url": {"type": "string", "optional": true, "description": "The URL navigated to by a user."},
          "title": {"type": "string", "optional": true, "description": "The title of the history page."},
          "lastVisitTime": {"type": "number", "optional": true, "description": "When this page was last loaded, represented in milliseconds since the epoch."},
          "visitCount": {"type": "integer", "optional": true, "description": "The number of times the user has navigated to this page."},
          "typedCount": {"type": "integer", "optional": true, "description": "The number of times the user has navigated to this page by typing in the address."}
        }
      },
      {
        "id": "VisitItem",
        "type": "object",
        "description": "An object encapsulating one visit to a URL.",
        "properties": {
          "id": {"type": "string", "minimum": 0, "description": "The unique identifier for the item."},
          "visitId": {"type": "string", "description": "The unique identifier for this visit."},
          "visitTime": {"type": "number", "optional": true, "description": "When this visit occurred, represented in milliseconds since the epoch."},
          "referringVisitId": {"type": "string", "description": "The visit_id of the referrer."},
          "transition": {
            "type": "string",
            "enum": ["link", "typed", "auto_bookmark", "auto_subframe", "manual_subframe", "generated", "start_page", "form_submit", "reload", "keyword", "keyword_generated"],
            "description": "The <a href='#transition_types'>transition type</a> for this visit from its referrer."
          }
        }
      }
    ],
    "functions": [
      {
        "name": "search",
        "type": "function",
        "description": "Search the history for the last visit time of each page matching the query.",
        "parameters": [
          {
            "name": "query",
            "type": "object",
            "properties": {
              "text": {"type": "string", "description": "A free-text query to the history service.  Leave empty to retrieve all pages."},
              "startTime": {"type": "number", "optional": true, "description": "Limit results to those visited after this date, represented in milliseconds since the epoch."},
              "endTime": {"type": "number", "optional": true, "description": "Limit results to those visited before this date, represented in milliseconds since the epoch."},
              "maxResults": {"type": "integer", "optional": true, "minimum": 0, "description": "The maximum number of results to retrieve.  Defaults to 100."}
            }
          },
          {
            "name": "callback",
            "type": "function",
            "parameters": [
              { "name": "results", "type": "array", "items": { "$ref": "HistoryItem"} }
            ]
          }
        ]
      },
      {
        "name": "getVisits",
        "type": "function",
        "description": "Retrieve information about visits to a URL.",
        "parameters": [
          {
            "name": "details",
            "type": "object",
            "properties": {
              "url": {"type": "string", "description": "The URL for which to retrieve visit information.  It must be in the format as returned from a call to history.search."}
            }
          },
          {
            "name": "callback",
            "type": "function",
            "parameters": [
              { "name": "results", "type": "array", "items": { "$ref": "VisitItem"} }
            ]
          }
        ]
      },
      {
        "name": "addUrl",
        "type": "function",
        "description": "Adds a URL to the history at the current time with a <a href='#transition_types'>transition type</a> of \"link\".",
        "parameters": [
          {
            "name": "details",
            "type": "object",
            "properties": {
              "url": {"type": "string", "description": "The URL to add."}
            }
          }
        ]
      },
      {
        "name": "deleteUrl",
        "type": "function",
        "description": "Removes all occurrences of the given URL from the history.",
        "parameters": [
          {
            "name": "details",
            "type": "object",
            "properties": {
              "url": {"type": "string", "description": "The URL to remove."}
            }
          }
        ]
      },
      {
        "name": "deleteRange",
        "type": "function",
        "description": "Removes all items within the specified date range from the history.  Pages will not be removed from the history unless all visits fall within the range.",
        "parameters": [
          {
            "name": "range",
            "type": "object",
            "properties": {
              "startTime": { "type": "number", "description": "Items added to history after this date, represented in milliseconds since the epoch." },
              "endTime": { "type": "number", "description": "Items added to history before this date, represented in milliseconds since the epoch." }
            }
          },
          {
            "name": "callback", "type": "function", "parameters": []
          }
        ]
      },
      {
        "name": "deleteAll",
        "type": "function",
        "description": "Deletes all items from the history.",
        "parameters": [
          {
            "name": "callback", "type": "function", "parameters": []
          }
        ]
      }
    ],
    "events": [
      {
        "name": "onVisited",
        "type": "function",
        "description": "Fired when a URL is visited, providing the HistoryItem data for that URL.",
        "parameters": [
          { "name": "result", "$ref": "HistoryItem"}
        ]
      },
      {
        "name": "onVisitRemoved",
        "type": "function",
        "description": "Fired when one or more URLs are removed from the history service.  When all visits have been removed the URL is purged from history.",
        "parameters": [
          {
            "name": "removed",
            "type": "object",
            "properties": {
              "allHistory": { "type": "boolean", "description": "True if all history was removed.  If true, then urls will be empty." },
              "urls": { "type": "array", "items": { "type": "string" }, "optional": true}
            }
          }
        ]
      }
    ]
  },
  {
    "namespace": "idle",
    "types": [],
    "functions": [
      {
        "name": "queryState",
        "type": "function",
        "description": "Returns the current state of the browser.",
        "parameters": [
          {
            "name": "thresholdSeconds",
            "type": "integer",
            "minimum": 15,
            "description": "Threshold, in seconds, used to determine when a machine is in the idle state."
          },
          {
            "name": "callback",
            "type": "function",
            "parameters": [
              {
                "name": "newState",
                "type": "string",
                "enum": ["active", "idle", "locked"]
              }
            ]
          }
        ]
      }
    ],
    "events": [
      {
        "name": "onStateChanged",
        "type": "function",
        "description": "Fired when the browser changes to an active state.  Currently only reports the transition from idle to active.",
        "parameters": [
          {
            "name": "newState",
            "type": "string",
            "enum": ["active"]
          }
        ]
      }
    ]
  },
  {
    "namespace": "i18n",
    "unprivileged": true,
    "types": [],
    "functions": [
      {
        "name": "getAcceptLanguages",
        "type": "function",
        "description": "Gets the accept-languages of the browser. This is different from the locale used by the browser; to get the locale, use <code>window.navigator.language</code>.",
        "parameters": [
          {
            "type": "function",
            "name": "callback",
            "parameters": [
              {"name": "languages", "type": "array", "items": {"type": "string"}, "description": "Array of the accept languages of the browser, such as en-US,en,zh-CN"}
            ]
          }
        ]
      },
      {
        "name": "getMessage",
        "type": "function",
        "unprivileged": true,
        "description": "Gets the localized string for the specified message. If the message is missing, this method returns an empty string (''). If the format of the <code>getMessage()</code> call is wrong &mdash; for example, <em>messageName</em> is not a string or the <em>substitutions</em> array is empty or has more than 9 elements &mdash; this method returns <code>undefined</code>.",
        "parameters": [
          { "type": "string",
            "name": "messageName",
            "description": "The name of the message, as specified in the <a href='i18n-messages.html'><code>messages.json</code></a> file."
          },
          {
            "choices": [
              { "type": "string" },
              {
                "type": "array",
                "items": { "type": "string" },
                "minItems": 1,
                "maxItems": 9
              }
            ],
            "name": "substitutions",
            "optional": true,
            "description": "1 - 9 substitution strings, if the message requires any."
          }
        ],
        "returns": {
          "type": "string",
          "description": "Message localized for current locale."
        }
      }
    ],
    "events": []
  },
  {
    "namespace": "experimental.input",
    "nodoc": true,
    "types": [],
    "functions": [
      {
        "name": "sendKeyboardEvent",
        "type": "function",
        "description": "Send a keyboard event to Chrome.",
        "parameters": [
          { "type": "object",
            "name": "event",
            "properties": {
              "type": {
                "type": "string",
                "description": "One of 'keyup' or 'keydown'."
              },
              "keyIdentifier": {
                "type": "string",
                "description": "See http://www.w3.org/TR/2003/NOTE-DOM-Level-3-Events-20031107/keyset.html#KeySet-Set"
              },
              "altKey": {
                "type": "boolean",
                "optional": true,
                "description": "Whether or not the ALT key is pressed."
              },
              "ctrlKey": {
                "type": "boolean",
                "optional": true,
                "description": "Whether or not the CTRL key is pressed."
              },
              "metaKey": {
                "type": "boolean",
                "optional": true,
                "description": "Whether or not the META key is pressed."
              },
              "shiftKey": {
                "type": "boolean",
                "optional": true,
                "description": "Whether or not the SHIFT key is pressed."
              }
            },
            "description": "The keyboard event to be sent."
          },
          { "type": "function",
            "name": "callback",
            "optional": true,
            "description": "This function is called when the event processing is completed.",
            "parameters": []
          }
        ]
      }
    ],
    "events": []
  },
  {
    "namespace": "experimental.popup",
    "nodoc": true,
    "types": [],
    "functions": [
      {
        "name": "show",
        "type": "function",
        "description": "Displays a pop-up window hosting an extension view.",
        "parameters": [
          {
            "type": "string",
            "name": "url",
            "description": "The URL of the contents to which the pop-up will be navigated."
          },
          {
            "type": "object",
            "name": "showDetails",
            "properties": {
              "relativeTo": {
                "type": "object",
                "properties": {},
                "additionalProperties": { "type": "any" },
                "isInstanceOf": "HTMLElement",
                "description": "A HTML DOM object to which the pop-up's position will be made relative."
              },
              "giveFocus": {
                "type": "boolean",
                "description": "Pass true to give the focus to the popup window.  The default behaviour is true.",
                "optional": true
              },
              "borderStyle": {
                "type": "string",
                "description": "Pass 'bubble' to give the pop-up window a bubble-chrome border, including an arrow pointing at the relative-to point.  Pass 'rectangle' to give the pop-up a rectangular black border with drop-shadow.  Default behaviour is to pass 'bubble'.",
                "optional": true,
                "enum": ["bubble", "rectangle"]
              }
            }
          },
          {
            "type": "function",
            "name": "callback",
            "optional": true,
            "parameters": []
          }
        ]
      },
      {
        "name": "getParentWindow",
        "type": "function",
        "description": "Returns a reference to the JavaScript 'window' object of the extension view that launched the popup.  Returns undefined if called outside of a popup window.",
        "parameters": [],
        "returns": {
          "type": "object",
          "isInstanceOf": "DOMWindow",
          "properties": {},
          "additionalProperties": { "type": "any" },
          "optional": true
        }
      }
    ],
    "events": [
      {
        "name": "onClosed",
        "type": "function",
        "description": "Fired when the popup view is closed.",
        "parameters": []
      }
    ]
  },
  {
    "namespace": "experimental.bookmarkManager",
    "nodoc": true,
    "types": [
      {
        "id": "BookmarkDragDataElement",
        "nodoc": true,
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "optional": true,
            "description": "The ID of the bookmark. This is only provided if the data is from the same profile."
          },
          "parentId": {
            "type": "string",
            "optional": true,
            "description": "The ID of the parent of the bookmark. This is only provided if the data is from the same profile."
          },
          "title": {"type": "string"},
          "url": {
            "type": "string",
            "optional": true
          },
          "children": {
            "type": "array",
            "items": {"$ref": "BookmarkDragDataElement"}
          }
        }
      },
      {
        "id": "BookmarkDragData",
        "nodoc": true,
        "type": "object",
        "description": "Information about the drag and drop data for use with drag and drop events.",
        "properties": {
          "sameProfile": {"type": "boolean"},
          "elements": {
            "type": "array",
            "items": {"$ref": "BookmarkDragDataElement"}
          }
        }
      }
    ],
    "functions": [
      {
        "name": "copy",
        "type": "function",
        "description": "Copies the given bookmarks into the clipboard",
        "nodoc": "true",
        "parameters": [
          {
            "name": "idList",
            "description": "An array of string-valued ids",
            "type": "array",
            "items": {"type": "string"},
            "minItems": 1
          },
          {"type": "function", "name": "callback", "optional": true, "parameters": []}
        ]
      },
      {
        "name": "cut",
        "type": "function",
        "description": "Cuts the given bookmarks into the clipboard",
        "nodoc": "true",
        "parameters": [
          {
            "name": "idList",
            "description": "An array of string-valued ids",
            "type": "array",
            "items": {"type": "string"},
            "minItems": 1
          },
          {"type": "function", "name": "callback", "optional": true, "parameters": []}
        ]
      },
      {
        "name": "paste",
        "type": "function",
        "description": "Pastes bookmarks from the clipboard into the parent folder",
        "nodoc": "true",
        "parameters": [
          {"type": "string", "name": "parentId"},
          {"type": "function", "name": "callback", "optional": true, "parameters": []}
        ]
      },
      {
        "name": "canPaste",
        "type": "function",
        "description": "Whether there are any bookmarks that can be pasted",
        "nodoc": "true",
        "parameters": [
          {"type": "string", "name": "parentId", "description": "The ID of the folder to paste into"},
          {"type": "function", "name": "callback", "parameters": [
            {"type": "boolean"}
          ]}
        ]
      },
      {
        "name": "sortChildren",
        "type": "function",
        "description": "Sorts the children of a given folder",
        "nodoc": "true",
        "parameters": [
          {"type": "string", "name": "parentId", "description": "The ID of the folder to sort the children of"}
        ]
      },
      {
        "name": "getStrings",
        "type": "function",
        "description": "Gets the i18n strings for the bookmark manager",
        "nodoc": "true",
        "parameters": [
          {
            "type": "function",
             "name": "callback",
             "parameters": [
              {
                "type": "object",
                "properties": {},
                "additionalProperties": {"type": "string"}
              }
            ]
          }
        ]
      },
      {
        "name": "startDrag",
        "type": "function",
        "description": "Begins dragging a set of bookmarks",
        "nodoc": "true",
        "parameters": [
          {
            "name": "idList",
            "description": "An array of string-valued ids",
            "type": "array",
            "items": {"type": "string"},
            "minItems": 1
          }
        ]
      },
      {
        "name": "drop",
        "type": "function",
        "description": "Performs the drop action of the drag and drop session",
        "nodoc": "true",
        "parameters": [
          {
            "name": "parentId",
            "description": "The ID of the folder that the drop was made",
            "type": "string"
          },
          {
            "name": "index",
            "description": "The index of the position to drop at. If left out the dropped items will be placed at the end of the existing children",
            "type": "integer",
            "minimum": 0,
            "optional": true
          }
        ]
      },
      {
        "name": "getSubtree",
        "type": "function",
        "description": "Retrieves a bookmark hierarchy from the given node.  If the node id is empty, it is the full tree.  If foldersOnly is true, it will only return folders, not actual bookmarks.",
        "nodoc": "true",
        "parameters": [
          {
            "name": "id",
            "type": "string",
            "description": "ID of the root of the tree to pull.  If empty, the entire tree will be returned."
          },
          {
            "name": "foldersOnly",
            "type": "boolean",
            "description": "Pass true to only return folders."
          },
          {
            "name": "callback",
            "type": "function",
            "parameters": [
              {"name": "results", "type": "array", "items": { "$ref": "BookmarkTreeNode"} }
            ]
          }
        ]
      }
    ],
    "events": [
      {
        "name": "onDragEnter",
        "type": "function",
        "description": "Fired when dragging bookmarks over the document",
        "parameters": [
          {"$ref": "BookmarkDragData"}
        ]
      },
      {
        "name": "onDragLeave",
        "type": "function",
        "description": "Fired when the drag and drop leaves the document",
        "parameters": [
          {"$ref": "BookmarkDragData"}
        ]
      },
      {
        "name": "onDrop",
        "type": "function",
        "description": "Fired when the user drops bookmarks on the document",
        "parameters": [
          {"$ref": "BookmarkDragData"}
        ]
      }
    ]
  },
  {
    "namespace": "devtools",
    "nodoc": "true",
    "types": [],
    "functions": [
      {
        "name": "getTabEvents",
        "type": "function",
        "description": "Experimental support for timeline API",
        "nodoc": "true",
        "parameters": [
          {
            "name": "tab_id",
            "type": "integer"
          }
        ],
        "returns": {
          "type": "object",
          "properties": {},
          "additionalProperties": { "type": "any" },
          "description": "DevTools tab events object"
        }
      }
    ]
  },
  {
    "namespace": "experimental.processes",
    "types": [
      {
        "id": "Process",
        "type": "object",
        "description": "An object containing information about one of the browser's processes.",
        "properties": {
          "id": {
            "type": "integer",
            "description": "The internal ID of the process."
          }
        }
      }
    ],
    "functions": [
      {
        "name": "getProcessForTab",
        "type": "function",
        "description": "Returns details about the current renderer process of the specified tab.",
        "parameters": [
          {
            "name": "tabId",
            "type": "integer",
            "minimum": 0
          },
          {
            "type": "function",
            "name": "callback",
            "parameters": [
              {
                "name": "process",
                "$ref": "Process",
                "description": "Details about the tab's process."
              }
            ]
          }
        ]
      }
    ],
    "events": []
  },
  {
    "namespace": "contextMenus",
    "types": [
      {
        "id": "OnClickData",
        "type": "object",
        "description": "Information sent when a context menu item is clicked.",
        "properties": {
          "menuItemId": {
            "type": "integer",
            "description": "The id of the menu item that was clicked."
          },
          "parentMenuItemId": {
            "type": "integer",
            "optional": true,
            "description": "The parent id, if any, for the item clicked."
          },
          "mediaType": {
            "type": "string",
            "optional": true,
            "description": "One of 'image', 'video', or 'audio' if the context menu was activated on one of these types of elements."
          },
          "linkUrl": {
            "type": "string",
            "optional": true,
            "description": "If the element is a link, the url it points to."
          },
          "srcUrl": {
            "type": "string",
            "optional": true,
            "description": "Will be present for elements with a 'src' url."
          },
          "pageUrl": {
            "type": "string",
            "description": "The url of the page where the menu item was clicked."
          },
          "frameUrl": {
            "type": "string",
            "optional": true,
            "description": " The url of the frame of the element where the context menu was clicked, if it was in a frame."
          },
          "selectionText": {
            "type": "string",
            "optional": true,
            "description": "The text for the context selection, if any."
          },   
          "editable": {
            "type": "string",                   
            "description": "A flag indicating whether the element is editable (text input, textarea, etc.)."
          }
        }
      }
    ],
    "functions": [
      {
        "name": "create",
        "type": "function",
        "description": "Creates a new context menu item. Note that if an error occurs during creation, you may not find out until the creation callback fires (the details will be in chrome.extension.lastError).",
        "returns": {
          "type": "integer",
          "description": "The id of the newly created item."
        },
        "parameters": [
          {
            "type": "object",
            "name": "createProperties",
            "properties": {
              "type": {
                "type": "string",
                "optional": true,
                "description": "The type of menu item - one of 'normal', 'checkbox', 'radio', or 'separator'. Defaults to 'normal' if not specified."
              },
              "title": {
                "type": "string",
                "optional": "true",
                "description": "This must be specified unless type is 'separator'."
              },
              "checked": {
                "type": "boolean",
                "optional": true,
                "description": "This only applies to the initial state of a checkbox or radio item. It indicates if the item should initially be checked/selected. Only one radio item can be selected at a time in a given group of radio items."
              },
              "contexts": {
                "type": "array",
                "items": {"type": "string"},
                "minItems": 1,
                "optional": true,
                "description": "List of contexts this menu item will appear in. Legal values are: 'all', 'page', 'selection', 'link', 'editable', 'image', 'video', and 'audio'. Defaults to ['page']."
              },
              "onclick": {
                "type": "function",
                "optional": true,
                "description": "A function that will be called back when the menu item is clicked.",
                "parameters": [
                  {
                    "name": "info",
                    "$ref": "OnClickData",
                    "description": "Information about the item clicked and the context where the click happened."
                  },
                  {
                    "name": "tab",
                    "$ref": "Tab",
                    "description": "The details of the tab where the click took place."
                  }
                ]            
              },
              "parentId": {
                "type": "integer",
                "optional": true,
                "description": "The id of a parent menu item - this makes the item a child of a previously added item."
              },
              "documentUrlPatterns": {
                "type": "array",
                "items": {"type": "string"},
                "optional": true,
                "description": "Lets you restrict the item to only apply to documents whose URL matches one of the given patterns. (This applies to frames as well). For details on the format of a pattern, see <a href='match_patterns.html'>Match Patterns</a>."
              },
              "targetUrlPatterns": {
                "type": "array",
                "items": {"type": "string"},
                "optional": true,
                "description": "Similar to documentUrlPatterns, but this lets you filter based on the src attribute of img/audio/video tags and the href of anchor tags."
              }
            }
          },
          {
            "type": "function",
            "name": "callback",
            "optional": true,
            "description": "Called when the item has been created in the browser. If there were any problems creating the item, details will be avilable in chrome.extension.lastError.",
            "parameters": []
          }
        ]
      },
      {
        "name": "update",
        "type": "function",
        "description": "Update a previously created context menu item.",
        "parameters": [
          {
            "type": "integer",
            "name": "id",
            "description": "The id of the item to update."
          },
          {
            "type": "object",
            "name": "updateProperties",
            "description": "The properties to update. Accepts the same values as the create function.",
            "properties": {
              "type": {
                "type": "string",
                "optional": true
              },
              "title": {
                "type": "string",
                "optional": "true"
              },
              "checked": {
                "type": "boolean",
                "optional": true
              },
              "contexts": {
                "type": "array",
                "items": {"type": "string"},
                "minItems": 1,
                "optional": true
              },
              "onclick": {
                "type": "function",
                "optional": true
              },
              "parentId": {
                "type": "integer",
                "optional": true,
                "description": "Note: you cannot change an item to be a child of one of it's own descendants."
              },
              "documentUrlPatterns": {
                "type": "array",
                "items": {"type": "string"},
                "optional": true
              },
              "targetUrlPatterns": {
                "type": "array",
                "items": {"type": "string"},
                "optional": true
              }
            }
          },
          {
            "type": "function",
            "name": "callback",
            "optional": true,
            "parameters": [],
            "description": "Called when the context menu has been updated."
          }
        ]
      },
      {
        "name": "remove",
        "type": "function",
        "description": "Remove a context menu item.",
        "parameters": [
          {
            "type": "integer",
            "name": "menuItemId",
            "description": "The id of the context menu item to remove."
          },
          {
            "type": "function",
            "name": "callback",
            "optional": true,
            "parameters": [],
            "description": "Called when the context menu has been removed."
          }
        ]
      },
      {
        "name": "removeAll",
        "type": "function",
        "description": "Remove all context menu items added by this extension.",
        "parameters": [
          {
            "type": "function",
            "name": "callback",
            "optional": true,
            "parameters": [],
            "description": "Called when removal is complete."
          }
        ]
      }
    ]
  },
  {
    "namespace": "experimental.metrics",
    "nodoc": true,
    "types": [
      {
        "id": "MetricType",
        "type":  "object",
        "description": "Describes the type of metric that is to be collected.",
        "properties": {
          "metricName": {"type": "string", "description": "A unique name within the extension for the metric."},
          "type": {
            "type": "string",
            "enum": ["histogram-log", "histogram-linear"],
            "description": "The type of metric, such as 'histogram-log' or 'histogram-linear'."
          },
          "min": {"type": "integer", "description": "The minimum sample value to be recoded.  Must be greater than zero."},
          "max": {"type": "integer", "description": "The maximum sample value to be recoded."},
          "buckets": {"type": "integer", "description": "The number of buckets to use when separating the recorded values."}
        }
      }
    ],
    "functions": [
      {
        "name": "recordUserAction",
        "type": "function",
        "description": "Records an action performed by the user.",
        "parameters": [
          {"name": "name", "type": "string"}
        ]
      },
      {
        "name": "recordPercentage",
        "type": "function",
        "description": "Record a percentage value from 1 to 100.",
        "parameters": [
          {"name": "metricName", "type": "string"},
          {"name": "value", "type": "integer"}
        ]
      },
      {
        "name": "recordCount",
        "type": "function",
        "description": "Record a value than can range from 1 to 1,000,000.",
        "parameters": [
          {"name": "metricName", "type": "string"},
          {"name": "value", "type": "integer"}
        ]
      },
      {
        "name": "recordSmallCount",
        "type": "function",
        "description": "Record a value than can range from 1 to 100.",
        "parameters": [
          {"name": "metricName", "type": "string"},
          {"name": "value", "type": "integer"}
        ]
      },
      {
        "name": "recordMediumCount",
        "type": "function",
        "description": "Record a value than can range from 1 to 10,000.",
        "parameters": [
          {"name": "metricName", "type": "string"},
          {"name": "value", "type": "integer"}
        ]
      },
      {
        "name": "recordTime",
        "type": "function",
        "description": "Record an elapsed time of no more than 10 seconds.  The sample value is specified in milliseconds.",
        "parameters": [
          {"name": "metricName", "type": "string"},
          {"name": "value", "type": "integer"}
        ]
      },
      {
        "name": "recordMediumTime",
        "type": "function",
        "description": "Record an elapsed time of no more than 3 minutes.  The sample value is specified in milliseconds.",
        "parameters": [
          {"name": "metricName", "type": "string"},
          {"name": "value", "type": "integer"}
        ]
      },
      {
        "name": "recordLongTime",
        "type": "function",
        "description": "Record an elapsed time of no more than 1 hour.  The sample value is specified in milliseconds.",
        "parameters": [
          {"name": "metricName", "type": "string"},
          {"name": "value", "type": "integer"}
        ]
      },
      {
        "name": "recordValue",
        "type": "function",
        "unprivileged": true,
        "description": "Adds a value to the given metric.",
        "parameters": [
          {"name": "metric", "$ref": "MetricType"},
          {"name": "value", "type": "integer"}
        ]
      }
    ],
    "events": []
  },
  {
    "namespace": "cookies",
    "types": [
      {
        "id": "Cookie",
        "type": "object",
        "description": "Represents information about an HTTP cookie.",
        "properties": {
          "name": {"type": "string", "description": "The name of the cookie."},
          "value": {"type": "string", "description": "The value of the cookie."},
          "domain": {"type": "string", "description": "The domain of the cookie (e.g. \"www.google.com\", \"example.com\")."},
          "hostOnly": {"type": "boolean", "description": "True if the cookie is a host-only cookie (i.e. a request's host must exactly match the domain of the cookie)."},
          "path": {"type": "string", "description": "The path of the cookie."},
          "secure": {"type": "boolean", "description": "True if the cookie is marked as Secure (i.e. its scope is limited to secure channels, typically HTTPS)."},
          "httpOnly": {"type": "boolean", "description": "True if the cookie is marked as HttpOnly (i.e. the cookie is inaccessible to client-side scripts)."},
          "session": {"type": "boolean", "description": "True if the cookie is a session cookie, as opposed to a persistent cookie with an expiration date."},
          "expirationDate": {"type": "number", "optional": true, "description": "The expiration date of the cookie as the number of seconds since the UNIX epoch. Not provided for session cookies."},
          "storeId": {"type": "string", "description": "The ID of the cookie store containing this cookie, as provided in getAllCookieStores()."}
        }
      },
      {
        "id": "CookieStore",
        "type": "object",
        "description": "Represents a cookie store in the browser. An incognito mode window, for instance, uses a separate cookie store from a non-incognito window.",
        "properties": {
          "id": {"type": "string", "description": "The unique identifier for the cookie store."},
          "tabIds": {"type": "array", "items": {"type": "integer"}, "description": "Identifiers of all the browser tabs that share this cookie store."}
        }
      }
    ],
    "functions": [
      {
        "name": "get",
        "type": "function",
        "description": "Retrieves information about a single cookie. If more than one cookie of the same name exists for the given URL, the one with the longest path will be returned. For cookies with the same path length, the cookie with the earliest creation time will be returned.",
        "parameters": [
          {
            "type": "object",
            "name": "details",
            "description": "Details to identify the cookie being retrieved.",
            "properties": {
              "url": {"type": "string", "description": "The URL with which the cookie to retrieve is associated. This argument may be a full URL, in which case any data following the URL path (e.g. the query string) is simply ignored. If host permissions for this URL are not specified in the manifest file, the API call will fail."},
              "name": {"type": "string", "description": "The name of the cookie to retrieve."},
              "storeId": {"type": "string", "optional": true, "description": "The ID of the cookie store in which to look for the cookie. By default, the current execution context's cookie store will be used."}
            }
          },
          {
            "type": "function",
            "name": "callback",
            "parameters": [
              {
                "name": "cookie", "$ref": "Cookie", "optional": true, "description": "Contains details about the cookie. This parameter is null if no such cookie was found."
              }
            ]
          }
        ]
      },
      {
        "name": "getAll",
        "type": "function",
        "description": "Retrieves all cookies from a single cookie store that match the given information.  The cookies returned will be sorted, with those with the longest path first.  If multiple cookies have the same path length, those with the earliest creation time will be first.",
        "parameters": [
          {
            "type": "object",
            "name": "details",
            "description": "Information to filter the cookies being retrieved.",
            "properties": {
              "url": {"type": "string", "optional": true, "description": "Restricts the retrieved cookies to those that would match the given URL."},
              "name": {"type": "string", "optional": true, "description": "Filters the cookies by name."},
              "domain": {"type": "string", "optional": true, "description": "Restricts the retrieved cookies to those whose domains match or are subdomains of this one."},
              "path": {"type": "string", "optional": true, "description": "Restricts the retrieved cookies to those whose path exactly matches this string."},
              "secure": {"type": "boolean", "optional": true, "description": "Filters the cookies by their Secure property."},
              "session": {"type": "boolean", "optional": true, "description": "Filters out session vs. persistent cookies."},
              "storeId": {"type": "string", "optional": true, "description": "The cookie store to retrieve cookies from. If omitted, the current execution context's cookie store will be used."}
            }
          },
          {
            "type": "function",
            "name": "callback",
            "parameters": [
              {
                "name": "cookies", "type": "array", "items": {"$ref": "Cookie"}, "description": "All the existing, unexpired cookies that match the given cookie info."
              }
            ]
          }
        ]
      },
      {
        "name": "set",
        "type": "function",
        "description": "Sets a cookie with the given cookie data; may overwrite equivalent cookies if they exist.",
        "parameters": [
          {
            "type": "object",
            "name": "details",
            "description": "Details about the cookie being set.",
            "properties": {
              "url": {"type": "string", "description": "The request-URI to associate with the setting of the cookie. This value can affect the default domain and path values of the created cookie. If host permissions for this URL are not specified in the manifest file, the API call will fail."},
              "name": {"type": "string", "optional": true, "description": "The name of the cookie. Empty by default if omitted."},
              "value": {"type": "string", "optional": true, "description": "The value of the cookie. Empty by default if omitted."},
              "domain": {"type": "string", "optional": true, "description": "The domain of the cookie. If omitted, the cookie becomes a host-only cookie."},
              "path": {"type": "string", "optional": true, "description": "The path of the cookie. Defaults to the path portion of the url parameter."},
              "secure": {"type": "boolean", "optional": true, "description": "Whether the cookie should be marked as Secure. Defaults to false."},
              "httpOnly": {"type": "boolean", "optional": true, "description": "Whether the cookie should be marked as HttpOnly. Defaults to false."},
              "expirationDate": {"type": "number", "optional": true, "description": "The expiration date of the cookie as the number of seconds since the UNIX epoch. If omitted, the cookie becomes a session cookie."},
              "storeId": {"type": "string", "optional": true, "description": "The ID of the cookie store in which to set the cookie. By default, the cookie is set in the current execution context's cookie store."}
            }
          }
        ]
      },
      {
        "name": "remove",
        "type": "function",
        "description": "Deletes a cookie by name.",
        "parameters": [
          {
            "type": "object",
            "name": "details",
            "description": "Information to identify the cookie to remove.",
            "properties": {
              "url": {"type": "string", "description": "The URL associated with the cookie. If host permissions for this URL are not specified in the manifest file, the API call will fail."},
              "name": {"type": "string", "description": "The name of the cookie to remove."},
              "storeId": {"type": "string", "optional": true, "description": "The ID of the cookie store to look in for the cookie. If unspecified, the cookie is looked for by default in the current execution context's cookie store."}
            }
          }
        ]
      },
      {
        "name": "getAllCookieStores",
        "type": "function",
        "description": "Lists all existing cookie stores.",
        "parameters": [
          {
            "type": "function",
            "name": "callback",
            "parameters": [
              {
                "name": "cookieStores", "type": "array", "items": {"$ref": "CookieStore"}, "description": "All the existing cookie stores."
              }
            ]
          }
        ]
      }
    ],
    "events": [
      {
        "name": "onChanged",
        "type": "function",
        "description": "Fired when a cookie is set or removed.",
        "parameters": [
          {
            "type": "object",
            "name": "changeInfo",
            "properties": {
              "removed": {"type": "boolean", "description": "True if a cookie was removed."},
              "cookie": {"$ref": "Cookie", "description": "Information about the cookie that was set or removed."}
            }
          }
        ]
      }
    ]
  },
  {
    "namespace": "experimental.rlz",
    "nodoc": true,
    "types": [],
    "functions": [
      {
        "name": "recordProductEvent",
        "type": "function",
        "description": "Records an RLZ event for a given product's access point.",
        "parameters": [
          {"name": "product", "type": "string", "minLength": 1, "maxLength": 1},
          {"name": "accessPoint", "type": "string", "minLength": 1, "maxLength": 2},
          {"name": "event", "type": "string", "enum": ["install", "set-to-google", "first-search", "activate"]}
        ]
      },
      {
        "name": "getAccessPointRlz",
        "type": "function",
        "description": "Gets the RLZ string to be used when accessing a Google property through the given access point.",
        "parameters": [
          {"name": "accessPoint", "type": "string", "minLength": 1, "maxLength": 2},
          {"name": "callback", "type": "function", "parameters": [{"name": "rlz", "type": "string"}]}
        ]
      },
      {
        "name": "sendFinancialPing",
        "type": "function",
        "description": "Sends Google promotional information about this extension.",
        "parameters": [
          {"name": "product", "type": "string", "minLength": 1, "maxLength": 1},
          {"name": "accessPoints", "type": "array", "items": {"type": "string", "minLength": 1, "maxLength": 2}, "minItems": 1},
          {"name": "signature", "type": "string"},
          {"name": "brand", "type": "string"},
          {"name": "id", "type": "string"},
          {"name": "lang", "type": "string"},
          {"name": "exclude_machine_id", "type": "boolean"}
        ]
      },
      {
        "name": "clearProductState",
        "type": "function",
        "description": "Clears all product-specific RLZ state from the machine, as well as clearing all events for the specified access points.",
        "parameters": [
          {"name": "product", "type": "string", "minLength": 1, "maxLength": 1},
          {"name": "accessPoints", "type": "array", "items": {"type": "string", "minLength": 1, "maxLength": 2}, "minItems": 1}
        ]
      }
    ],
    "events": []
  },
  {
    "namespace": "experimental.webNavigation",
    "types": [],
    "functions": [],
    "events": [
      {
        "name": "onBeforeNavigate",
        "type": "function",
        "description": "Fires when a navigation is about to occur.",
        "parameters": [
          {
            "type": "object",
            "name": "details",
            "properties": {
              "tabId": {"type": "integer", "description": "The ID of the tab in which the navigation is about to occur."},
              "url": {"type": "string"},
              "frameId": {"type": "integer", "description": "0 indicates the navigation happens in the tab content window; positive value indicates navigation in a subframe. Frame IDs are unique within a tab."},
              "requestId": {"type": "integer", "description": "The ID of the request to retrieve the document of this navigation. Note that this event is fired prior to the corresponding chrome.experimental.webRequest.onBeforeRequest."},
              "timeStamp": {"type": "number", "description": "The time when the browser was about to start the navigation, in milliseconds since the epoch."}
            }
          }
        ]
      },
      {
        "name": "onCommitted",
        "type": "function",
        "description": "Fires when a navigation is committed. The document (and the resources it refers to, such as images and subframes) might still be downloading, but at least part of the document has been received from the server and the browser has decided to switch to the new document.",
        "parameters": [
          {
            "type": "object",
            "name": "details",
            "properties": {
              "tabId": {"type": "integer", "description": "The ID of the tab in which the navigation occurs."},
              "url": {"type": "string"},
              "frameId": {"type": "integer", "description": "0 indicates the navigation happens in the tab content window; positive value indicates navigation in a subframe."},
              "transitionType": {"type": "string", "enum": ["link", "typed", "auto_bookmark", "auto_subframe", "manual_subframe", "generated", "start_page", "form_submit", "reload", "keyword", "keyword_generated"], "description": "Cause of the navigation. The same transition types as defined in the history API are used."},
              "transitionQualifiers": {"type": "string", "enum": ["client_redirect", "server_redirect", "forward_back"], "description": "Zero or more transition qualifiers delimited by \"|\". Possible qualifiers are \"client_redirect\", \"server_redirect\", and \"forward_backward\"."},
              "timeStamp": {"type": "number", "description": "The time when the navigation was committed, in milliseconds since the epoch."}
            }
          }
        ]
      },
      {
        "name": "onDOMContentLoaded",
        "type": "function",
        "description": "Fires when the page's DOM is fully constructed, but the referenced resources may not finish loading.",
        "parameters": [
          {
            "type": "object",
            "name": "details",
            "properties": {
              "tabId": {"type": "integer", "description": "The ID of the tab in which the navigation occurs."},
              "url": {"type": "string"},
              "frameId": {"type": "integer", "description": "0 indicates the navigation happens in the tab content window; positive value indicates navigation in a subframe."},
              "timeStamp": {"type": "number", "description": "The time when the page's DOM was fully constructed, in milliseconds since the epoch."}
            }
          }
        ]
      },
      {
        "name": "onCompleted",
        "type": "function",
        "description": "Fires when a document, including the resources it refers to, is completely loaded and initialized.",
        "parameters": [
          {
            "type": "object",
            "name": "details",
            "properties": {
              "tabId": {"type": "integer", "description": "The ID of the tab in which the navigation occurs."},
              "url": {"type": "string"},
              "frameId": {"type": "integer", "description": "0 indicates the navigation happens in the tab content window; positive value indicates navigation in a subframe."},
              "timeStamp": {"type": "number", "description": "The time when the document finished loading, in milliseconds since the epoch."}
            }
          }
        ]
      },
      {
        "name": "onErrorOccurred",
        "type": "function",
        "description": "Fires when an error occurs.",
        "parameters": [
          {
            "type": "object",
            "name": "details",
            "properties": {
              "tabId": {"type": "integer", "description": "The ID of the tab in which the navigation occurs."},
              "url": {"type": "string"},
              "frameId": {"type": "integer", "description": "0 indicates the navigation happens in the tab content window; positive value indicates navigation in a subframe."},
              "error": {"type": "string", "description": "The error description."},
              "timeStamp": {"type": "number", "description": "The time when the error occurred, in milliseconds since the epoch."}
            }
          }
        ]
      },
      {
        "name": "onBeforeRetarget",
        "type": "function",
        "description": "Fires when a new window, or a new tab in an existing window, is about to be created to host a navigation.",
        "parameters": [
          {
            "type": "object",
            "name": "details",
            "properties": {
              "sourceTabId": {"type": "integer", "description": "The ID of the tab in which the navigation is triggered."},
              "sourceUrl": {"type": "string", "description": "The URL of the document that is opening the new window."},
              "targetUrl": {"type": "string", "description": "The URL to be opened in the new window."},
              "timeStamp": {"type": "number", "description": "The time when the browser was about to create a new view, in milliseconds since the epoch."}
            }
          }
        ]
      }
    ]
  },
  {
    "namespace": "experimental.webRequest",
    "types": [],
    "functions": [],
    "events": [
      {
        "name": "onBeforeRequest",
        "type": "function",
        "description": "Fires when a request is about to occur.",
        "parameters": [
          {
            "type": "object",
            "name": "details",
            "properties": {
              "requestId": {"type": "integer", "description": "The ID of the request. Request IDs are unique within a browser session. As a result, they could be used to relate different events of the same request."},
              "url": {"type": "string"},
              "method": {"type": "string", "description": "Standard HTTP method."},
              "tabId": {"type": "integer", "description": "The ID of the tab in which the request takes place. Set to null if the request isn't related to a tab."},
              "type": {"type": "string", "enum": ["main_frame", "sub_frame", "stylesheet", "script", "image", "object", "other"], "description": "How the requested resource will be used."},
              "timeStamp": {"type": "number", "description": "The time when the browser was about to make the request, in milliseconds since the epoch."}
            }
          }
        ]
      },
      {
        "name": "onRequestSent",
        "type": "function",
        "description": "Fires when a request is sent to the server.",
        "parameters": [
          {
            "type": "object",
            "name": "details",
            "properties": {
              "requestId": {"type": "integer", "description": "The ID of the request."},
              "url": {"type": "string"},
              "ip": {"type": "string", "description": "The server IP address that is actually connected to. Note that it may be a literal IPv6 address."},
              "timeStamp": {"type": "number", "description": "The time when the browser finished sending the request, in milliseconds since the epoch."}
            }
          }
        ]
      },
      {
        "name": "onHeadersReceived",
        "type": "function",
        "description": "Fires when the status line and response headers are received after a request is sent to the server.",
        "parameters": [
          {
            "type": "object",
            "name": "details",
            "properties": {
              "requestId": {"type": "integer", "description": "The ID of the request."},
              "url": {"type": "string"},
              "statusCode": {"type": "integer", "description": "Standard HTTP status code returned by the server."},
              "timeStamp": {"type": "number", "description": "The time when the status line and response headers were received, in milliseconds since the epoch."}
            }
          }
        ]
      },
      {
        "name": "onBeforeRedirect",
        "type": "function",
        "description": "Fires when a server initiated redirect is about to occur.",
        "parameters": [
          {
            "type": "object",
            "name": "details",
            "properties": {
              "requestId": {"type": "integer", "description": "The ID of the request."},
              "url": {"type": "string", "description": "The URL of the current request."},
              "statusCode": {"type": "integer", "description": "Standard HTTP status code returned by the server."},
              "redirectUrl": {"type": "string", "description": "The new URL."},
              "timeStamp": {"type": "number", "description": "The time when the browser was about to make the redirect, in milliseconds since the epoch."}
            }
          }
        ]
      },
      {
        "name": "onCompleted",
        "type": "function",
        "description": "Fires when a request is completed.",
        "parameters": [
          {
            "type": "object",
            "name": "details",
            "properties": {
              "requestId": {"type": "integer", "description": "The ID of the request."},
              "url": {"type": "string", "description": "The URL of the current request."},
              "statusCode": {"type": "integer", "description": "Standard HTTP status code returned by the server."},
              "timeStamp": {"type": "number", "description": "The time when the response was received completely, in milliseconds since the epoch."}
            }
          }
        ]
      },
      {
        "name": "onErrorOccurred",
        "type": "function",
        "description": "Fires when an error occurs.",
        "parameters": [
          {
            "type": "object",
            "name": "details",
            "properties": {
              "requestId": {"type": "integer", "description": "The ID of the request."},
              "url": {"type": "string", "description": "The URL of the current request."},
              "error": {"type": "string", "description": "The error description."},
              "timeStamp": {"type": "number", "description": "The time when the error occurred, in milliseconds since the epoch."}
            }
          }
        ]
      }
    ]
  },
  {
    "namespace": "test",
    "nodoc": true,
    "types": [],
    "functions": [
      {
        "name": "notifyFail",
        "type": "function",
        "description": "Notify the browser process that test code running in the extension failed.  This is only used for internal unit testing.",
        "parameters": [
          {"type": "string", "name": "message"}
        ]
      },
      {
        "name": "notifyPass",
        "type": "function",
        "description": "Notify the browser process that test code running in the extension passed.  This is only used for internal unit testing.",
        "parameters": [
          {"type": "string", "name": "message", "optional": true}
        ]
      },
      {
        "name": "resetQuota",
        "type": "function",
        "description": "Reset all accumulated quota state for all extensions.  This is only used for internal unit testing.",
        "parameters": []
      },
      {
        "name": "log",
        "type": "function",
        "description": "Logs a message during internal unit testing.",
        "parameters": [
          {"type": "string", "name": "message"}
        ]
      },
      {
        "name": "createIncognitoTab",
        "type": "function",
        "description": "Creates an incognito tab during internal testing. Succeeds even if the extension is not enabled in incognito mode.",
        "parameters": [
          {"type": "string", "name": "url"}
        ]
      },
      {
        "name": "sendMessage",
        "type": "function",
        "description": "Sends a string message to the browser process, generating a Notification that C++ test code can wait for.",
        "parameters": [
          {"type": "string", "name": "message"}
        ]
      }
    ],
    "events": [
      {
        "name": "onMessage",
        "type": "function",
        "unprivileged": true,
        "description": "Used to test sending messages to extensions.",
        "parameters": [
          {
            "type": "object",
            "name": "info",
            "properties": {
              "data": { "type": "string", "description": "Additional information." },
              "lastMessage": { "type": "boolean", "description": "True if this was the last message for this test" }
            }
          }
        ]
      }
    ]
  },
  {
    "namespace": "experimental.proxy",
    "types": [
      {
        "id": "ProxyServer",
        "type": "object",
        "description": "An object encapsulating a single proxy server's specification.",
        "properties": {
          "scheme": {"type": "string", "optional": true, "enum": ["http", "socks", "socks4", "socks5"], "description": "The scheme (protocol) of the proxy server itself."},
          "host": {"type": "string", "description": "The URI of the proxy server."},
          "port": {"type": "integer", "optional": true, "description": "The port of the proxy server."}
        }
      },
      {
        "id": "ProxyRules",
        "type": "object",
        "description": "An object encapsulating the set of proxy rules for all protocols.",
        "properties": {
          "singleProxy": {"$ref": "ProxyServer", "optional": true, "description": "The proxy server to be used for all per-URL requests (i.e., http, https, and ftp)."},
          "proxyForHttp": {"$ref": "ProxyServer", "optional": true, "description": "The proxy server to be used for HTTP requests."},
          "proxyForHttps": {"$ref": "ProxyServer", "optional": true, "description": "The proxy server to be used for HTTPS requests."},
          "proxyForFtp": {"$ref": "ProxyServer", "optional": true, "description": "The proxy server to be used for FTP requests."},
          "socksProxy": {"$ref": "ProxyServer", "optional": true, "description": "The proxy server to be used for SOCKS requests."}
        }
      },
      {
        "id": "ProxyConfig",
        "type": "object",
        "description": "An object encapsulating a complete proxy configuration.",
        "properties": {
          "rules": {"$ref": "ProxyRules", "description": "The proxy rules describing this configuration."}
        }
      }
    ],
    "functions": [
      {
        "name": "useCustomProxySettings",
        "type": "function",
        "description": "Apply the given proxy configuration.",
        "parameters": [
          {"name": "config", "$ref": "ProxyConfig"}
        ]
      }
    ]
  },
  {
    "namespace": "experimental.clipboard",
    "types": [],
    "functions": [
      {
        "name": "executeCopy",
        "type": "function",
        "description": "Triggers a copy operation in the specified tab.",
        "parameters": [
          {"type": "integer", "name": "tabId", "minimum": 0},
          {"type": "function", "name": "callback", "optional": true, "parameters": []}
        ]
      },
      {
        "name": "executeCut",
        "type": "function",
        "description": "Triggers a cut operation in the specified tab.",
        "parameters": [
          {"type": "integer", "name": "tabId", "minimum": 0},
          {"type": "function", "name": "callback", "optional": true, "parameters": []}
        ]
      },
      {
        "name": "executePaste",
        "type": "function",
        "description": "Triggers a paste operation in the specified tab.",
        "parameters": [
          {"type": "integer", "name": "tabId", "minimum": 0},
          {"type": "function", "name": "callback", "optional": true, "parameters": []}
        ]
      }
    ],
    "events": []
  },
  {
    "namespace": "experimental.sidebar",
    "types": [],
    "functions": [
      {
        "name": "hide",
        "type": "function",
        "description": "Hides sidebar's mini tab for the specified tab and collapses sidebar if it was in 'active' state (see getState). Has no effect if the sidebar is already hidden.",
        "parameters": [
          {
            "type": "object",
            "name": "details",
            "optional": true,
            "properties": {
              "tabId": {
                "type": "integer",
                "minimum": 0,
                "optional": true,
                "description": "Defaults to the selected tab of the <a href='windows.html#current-window'>current window</a>."
              }
            }
          }
        ]
      },
      {
        "name": "show",
        "type": "function",
        "description": "Shows sidebar mini tab (in 'shown' state) for the specified tab. Has no effect if already expanded, otherwise changes status to 'shown'.",
        "parameters": [
          {
            "type": "object",
            "name": "details",
            "optional": true,
            "properties": {
              "tabId": {
                "type": "integer",
                "minimum": 0,
                "optional": true,
                "description": "Defaults to the selected tab of the <a href='windows.html#current-window'>current window</a>."
              }
            }
          }
        ]
      },
      {
        "name": "expand",
        "type": "function",
        "description": "Expands sidebar and switches to the specified content (if it was displaying another extension's sidebar content) for the specified tab. Extension is allowed to expand sidebar only in response to an explicit user gesture.",
        "parameters": [
          {
            "type": "object",
            "name": "details",
            "optional": true,
            "properties": {
              "tabId": {
                "type": "integer",
                "minimum": 0,
                "optional": true,
                "description": "Defaults to the selected tab of the <a href='windows.html#current-window'>current window</a>."
              }
            }
          }
        ]
      },
      {
        "name": "collapse",
        "type": "function",
        "description": "Collapses sidebar for the specified tab. Has no effect if sidebar is not in its 'active' state (see getState).",
        "parameters": [
          {
            "type": "object",
            "name": "details",
            "optional": true,
            "properties": {
              "tabId": {
                "type": "integer",
                "minimum": 0,
                "optional": true,
                "description": "Defaults to the selected tab of the <a href='windows.html#current-window'>current window</a>."
              }
            }
          }
        ]
      },
      {
        "name": "navigate",
        "type": "function",
        "description": "Navigates sidebar for the specified tab to the specified URL.",
        "parameters": [
          {
            "type": "object",
            "name": "details",
            "properties": {
              "tabId": {
                "type": "integer",
                "minimum": 0,
                "optional": true,
                "description": "Defaults to the selected tab of the <a href='windows.html#current-window'>current window</a>."
              },
              "url": { "type": "string" }
            }
          }
        ]
      },
      {
        "name": "getState",
        "type": "function",
        "description": "Returns current sidebar state for the specified tab.",
        "parameters": [
          {
            "type": "object",
            "name": "details",
            "optional": true,
            "properties": {
              "tabId": {
                "type": "integer",
                "minimum": 0,
                "optional": true,
                "description": "Defaults to the selected tab of the <a href='windows.html#current-window'>current window</a>."
              }
            }
          },
          {
            "type": "function",
            "name": "callback",
            "parameters": [
              {
                "name": "state",
                "type": "string",
                "enum": ["hidden", "shown", "active"],
                "description": "'hidden' indicates sidebar is not defined for the specified tab (show was never called or hide() was called). Nothing is displayed for this sidebar.</br>'shown' means sidebar is defined for the specified tab; mini tab is displayed for this sidebar. Sidebar UI is either collapsed or displaying a content of some other extension's sidebar.</br>'active' indicates that sidebar is defined for the specified tab; sidebar UI is expanded and displaying this sidebar's content."
              }
            ]
          }
        ]
      },
      {
        "name": "setBadgeText",
        "type": "function",
        "description": "Sets sidebar's mini tab badge text for the specified tab.",
        "parameters": [
          {
            "type": "object",
            "name": "details",
            "properties": {
              "tabId": {
                "type": "integer",
                "minimum": 0,
                "optional": true,
                "description": "Defaults to the selected tab of the <a href='windows.html#current-window'>current window</a>."
              },
              "text": {
                "type": "string",
                "description": "The sidebar's badge text. The badge is displayed on top of the sidebar's icon on the mini tab. Any number of characters can be passed, but only about four can fit in the space."
              }
            }
          }
        ]
      },
      {
        "name": "setIcon",
        "type": "function",
        "description": "Sets sidebar's mini tab icon for the specified tab.",
        "parameters": [
          {
            "type": "object",
            "name": "details",
            "properties": {
              "tabId": {
                "type": "integer",
                "minimum": 0,
                "optional": true,
                "description": "Defaults to the selected tab of the <a href='windows.html#current-window'>current window</a>."
              },
              "imageData": {
                "type": "object",
                "isInstanceOf": "ImageData",
                "properties": {},
                "additionalProperties": { "type": "any" },
                "description": "Pixel data for an image to show on the sidebar's mini tab. Must be an ImageData object (for example, from a <code>canvas</code> element). Only one of the imagePath/imageData parameters all owed. The extension's icon is used by default. The preferred size of the icon is 16x16 pixels, any other size will be scaled to 16x16.",
                "optional": true
              },
              "path": {
                "type": "string",
                "optional": true,
                "description": "Relative path to an image in the extension to show on the sidebar's mini tab. Only one of the imagePath/imageData parameters all owed. The extension's icon is used by default. The preferred size of the icon is 16x16 pixels, any other size will be scaled to 16x16."
              }
            }
          }
        ]
      },
      {
        "name": "setTitle",
        "type": "function",
        "description": "Sets sidebar's mini tab title for the specified tab.",
        "parameters": [
          {
            "type": "object",
            "name": "details",
            "properties": {
              "tabId": {
                "type": "integer",
                "minimum": 0,
                "optional": true,
                "description": "Defaults to the selected tab of the <a href='windows.html#current-window'>current window</a>."
              },
              "title": {
                "type": "string",
                "description": "The sidebar's title. It is displayed in a tooltip over the sidebar's mini tab."
              }
            }
          }
        ]
      }
    ],
    "events": [
      {
        "name": "onStateChanged",
        "perExtensionEvent": true,
        "unprivileged": true,
        "type": "function",
        "description": "Notifies about sidebar state changes.",
        "parameters": [
          {
            "type": "object",
            "name": "details",
            "properties": {
              "tabId": {
                "type": "integer",
                "minimum": 0
              },
              "state": {
                "type": "string",
                "enum": ["hidden", "shown", "active"]
              }
            }
          }
        ]
      }
    ]
  },
  {
    "namespace": "experimental.omnibox",
    "types": [
      {
        "id": "SuggestResult",
        "type": "object",
        "description": "A suggest result.",
        "properties": {
          "content": {
            "type": "string",
            "minLength": 1,
            "description": "The text that is put into the URL bar, and that is sent to the extension when the user chooses this entry."
          },
          "description": {
            "type": "string",
            "minLength": 1,
            "description": "The text that is displayed in the URL dropdown. Can optionally be stylized by the descriptionStyles parameter."
          },
          "descriptionStyles": {
            "type": "array",
            "optional": true,
            "items": {
              "type": "object",
              "description": "A style object, created using styleNone, styleUrl, styleMatch, or styleDim. A style applies to the region of text starting at the style's offset, until either the next style or the end of the description.",
              "properties": {
                "type": {"type": "string", "enum": ["none", "url", "match", "dim"]},
                "offset": {"type": "integer"}
              }
            }
          }
        }
      }
    ],
    "functions": [
      {
        "name": "sendSuggestions",
        "nodoc": true,
        "type": "function",
        "description": "A callback passed to the onInputChanged event used for sending suggestions back to the browser.",
        "parameters": [
          {"type": "integer", "name": "requestId"},
          {
            "type": "array",
            "description": "Array of suggest results",
            "items": {
              "$ref": "SuggestResult"
            }
          }
        ]
      },
      {
        "name": "styleNone",
        "type": "function",
        "description": "Constructor for the descriptionStyles parameter of the suggest callback.",
        "parameters": [ {"type": "integer", "name": "offset", "minimum": 0} ]
      },
      {
        "name": "styleUrl",
        "type": "function",
        "description": "Constructor for the descriptionStyles parameter of the suggest callback. This style designates a region of text matching a URL or filename.",
        "parameters": [ {"type": "integer", "name": "offset", "minimum": 0} ]
      },
      {
        "name": "styleMatch",
        "type": "function",
        "description": "Constructor for the descriptionStyles parameter of the suggest callback. This style designates a region of text matching what the user typed.",
        "parameters": [ {"type": "integer", "name": "offset", "minimum": 0} ]
      },
      {
        "name": "styleDim",
        "type": "function",
        "description": "Constructor for the descriptionStyles parameter of the suggest callback. This style designates a region of dim helper text.",
        "parameters": [ {"type": "integer", "name": "offset", "minimum": 0} ]
      }
    ],
    "events": [
      {
        "name": "onInputStarted",
        "perExtensionEvent": true,
        "type": "function",
        "description": "User has started a keyword input session by typing the extension's keyword. This is guaranteed to be sent exactly once per input session, and before any onInputChanged events.",
        "parameters": []
      },
      {
        "name": "onInputChanged",
        "perExtensionEvent": true,
        "type": "function",
        "description": "User has changed what is typed into the omnibox.",
        "parameters": [
          {
            "type": "string",
            "name": "text"
          },
          {
            "name": "suggest",
            "type": "function",
            "description": "A callback passed to the onInputChanged event used for sending suggestions back to the browser.",
            "parameters": [
              {"type": "integer", "name": "requestId"},
              {
                "type": "array",
                "description": "Array of suggest results",
                "items": {
                  "$ref": "SuggestResult"
                }
              }
            ]
          }
        ]
      },
      {
        "name": "onInputEntered",
        "perExtensionEvent": true,
        "type": "function",
        "description": "User has accepted what is typed into the omnibox.",
        "parameters": [
          {
            "type": "string",
            "name": "text"
          }
        ]
      },
      {
        "name": "onInputCancelled",
        "perExtensionEvent": true,
        "type": "function",
        "description": "User has ended the keyword input session without accepting the input.",
        "parameters": []
      }
    ]
  },
  {
    "namespace":"management",
    "types": [
      {
        "id": "IconInfo",
        "description": "Information about an icon belonging to an extension or app.",
        "type": "object",
        "properties": {
          "size": { "type": "integer", "description": "A number representing the width and height of the icon. Likely values include (but are not limited to) 128, 48, 24, and 16."  },
          "url": { "type": "string", "description": "The url for this icon image." }
        }
      },
      {
        "id": "ExtensionInfo",
        "description": "Information about an installed extension or app.",
        "type": "object",
        "properties": {
          "id": {
            "description": "The extension's unique identifier.",
            "type": "string"
          },
          "name": {
            "description": "The name of this extension or app.",
            "type": "string"
          },
          "version": {
            "description": "The <a href='manifest.html#version'>version</a> of this extension or app.",
            "type": "string"
          },
          "enabled": {
            "description": "Whether it is currently enabled or disabled.",
            "type": "boolean"
          },
          "enabled": {
            "description": "Whether it is currently enabled or disabled.",
            "type": "boolean"
          },
          "isApp": {
            "description": "True if this is an app.",
            "type": "boolean"
          },
          "appLaunchUrl": {
            "description": "The launch url (only present for apps).",
            "type": "string",
            "optional": true
          },
          "optionsUrl": {
            "description": "The url for the item's options page, if it has one.",
            "type": "string",
            "optional": true
          },
          "icons": {
            "description": "A list of icon information. Note that this just reflects what was declared in the manifest, and the actual image at that url may be larger or smaller than what was declared, so you might consider using explicit width and height attributes on img tags referencing these images. See the <a href='manifest.html#icons'>manifest documentation on icons</a> for more details.",
            "type": "array",
            "optional": true,
            "items": {
              "$ref": "IconInfo"
            }
          }
        }
      }
    ],
    "functions": [
      {
        "name": "getAll",
        "description": "Returns a list of information about installed extensions and apps.",
        "parameters": [
          {
            "type": "function",
            "name": "callback",
            "optional": true,
            "parameters": [
              {
                "type": "array",
                "name": "result",
                "items": {
                  "$ref": "ExtensionInfo"
                }
              }
            ]
          }
        ]
      },
      {
        "name": "setEnabled",
        "description": "Enable or disable an app or extension.",
        "parameters": [
          {
            "name": "id",
            "type": "string",
            "description": "This should be the id from an item of $ref:ExtensionInfo."
          },
          {
            "name": "enabled",
            "type": "boolean",
            "description": "Whether this item should be enabled or disabled."
          },
          {
            "name": "callback",
            "type": "function",
            "optional": "true",
            "parameters": []
          }
        ]
      },
      {
        "name": "uninstall",
        "description": "Uninstall a currently installed app or extension.",
        "parameters": [
          {
            "name": "id",
            "type": "string",
            "description": "This should be the id from an item of $ref:ExtensionInfo."
          },
          {
            "name": "callback",
            "type": "function",
            "optional": "true",
            "parameters": []
          }
        ]
      },
      {
        "name": "launchApp",
        "description": "Launches an application.",
        "parameters": [
          {
            "name": "id",
            "type": "string",
            "description": "The extension id of the application."
          },
          {
            "name": "callback",
            "type": "function",
            "optional": "true",
            "parameters": []
          }          
        ]
      }
    ],
    "events": [
      {
        "name": "onInstalled",
        "description": "Fired when an app or extension has been installed.",
        "type": "function",
        "parameters": [{"name": "info", "$ref":"ExtensionInfo"}]
      },
      {
        "name": "onUninstalled",
        "description": "Fired when an app or extension has been uninstalled.",
        "type": "function",
        "parameters": [
          {
           "name": "id", 
           "type": "string",
           "description": "The id of the extension or app that was uninstalled."
          }
        ]
      },
      {
        "name": "onEnabled",
        "description": "Fired when an app or extension has been enabled.",
        "type": "function",
        "parameters": [{"name": "info", "$ref":"ExtensionInfo"}]
      },
      {
        "name": "onDisabled",
        "description": "Fired when an app or extension has been disabled",
        "type": "function",
        "parameters": [{"name": "info", "$ref":"ExtensionInfo"}]
      }
    ]
  },

  {
    "namespace":"webstorePrivate",
    "nodoc": "true",
    "functions": [
      {
        "name": "install",
        "description": "Installs the extension corresponding to the given id",
        "parameters": [
          {
            "name": "expected_id",
            "type": "string",
            "description": "The id of the extension to install."
          },
          {
            "name": "callback",
            "type": "function",
            "optional": "true",
            "parameters": []
          }
        ]
      },
      {
        "name": "getSyncLogin",
        "description": "Returns the logged-in sync user login if there is one, or the empty string otherwise.",
        "parameters": [
          {
            "name": "callback",
            "type": "function",
            "optional": "false",
            "parameters": [
              { "name": "login", "type": "string" }
            ]
          }
        ]
      },
      {
        "name": "getStoreLogin",
        "description": "Returns the previous value set by setStoreLogin, or the empty string if there is none.",
        "parameters": [
          {
            "name": "callback",
            "type": "function",
            "optional": "false",
            "parameters": [
              { "name": "login", "type": "string" }
            ]
          }
        ]
      },
      {
        "name": "setStoreLogin",
        "description": "Set a preference value with the store login.",
        "parameters": [
          { "name": "login", "type": "string" },
          { "name": "callback", "type": "function", "optional": "true" }
        ]
      }
    ]
  }
]
// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

/**
 * @fileoverview This is a simple template engine inspired by JsTemplates
 * optimized for i18n.
 *
 * It currently supports two handlers:
 *
 *   * i18n-content which sets the textContent of the element
 *
 *     <span i18n-content="myContent"></span>
 *     i18nTemplate.process(element, {'myContent': 'Content'});
 *
 *   * i18n-values is a list of attribute-value or property-value pairs.
 *     Properties are prefixed with a '.' and can contain nested properties.
 *
 *     <span i18n-values="title:myTitle;.style.fontSize:fontSize"></span>
 *     i18nTemplate.process(element, {
 *       'myTitle': 'Title',
 *       'fontSize': '13px'
 *     });
 */

var i18nTemplate = (function() {
  /**
   * This provides the handlers for the templating engine. The key is used as
   * the attribute name and the value is the function that gets called for every
   * single node that has this attribute.
   * @type {Object}
   */
  var handlers = {
    /**
     * This handler sets the textContent of the element.
     */
    'i18n-content': function(element, attributeValue, obj) {
      element.textContent = obj[attributeValue];
    },

    /**
     * This is used to set HTML attributes and DOM properties,. The syntax is:
     *   attributename:key;
     *   .domProperty:key;
     *   .nested.dom.property:key
     */
    'i18n-values': function(element, attributeValue, obj) {
      var parts = attributeValue.replace(/\s/g, '').split(/;/);
      for (var j = 0; j < parts.length; j++) {
        var a = parts[j].match(/^([^:]+):(.+)$/);
        if (a) {
          var propName = a[1];
          var propExpr = a[2];

          // Ignore missing properties
          if (propExpr in obj) {
            var value = obj[propExpr];
            if (propName.charAt(0) == '.') {
              var path = propName.slice(1).split('.');
              var object = element;
              while (object && path.length > 1) {
                object = object[path.shift()];
              }
              if (object) {
                object[path] = value;
                // In case we set innerHTML (ignoring others) we need to
                // recursively check the content
                if (path == 'innerHTML') {
                  process(element, obj);
                }
              }
            } else {
              element.setAttribute(propName, value);
            }
          } else {
            console.warn('i18n-values: Missing value for "' + propExpr + '"');
          }
        }
      }
    }
  };

  var attributeNames = [];
  for (var key in handlers) {
    attributeNames.push(key);
  }
  var selector = '[' + attributeNames.join('],[') + ']';

  /**
   * Processes a DOM tree with the {@code obj} map.
   */
  function process(node, obj) {
    var elements = node.querySelectorAll(selector);
    for (var element, i = 0; element = elements[i]; i++) {
      for (var j = 0; j < attributeNames.length; j++) {
        var name = attributeNames[j];
        var att = element.getAttribute(name);
        if (att != null) {
          handlers[name](element, att, obj);
        }
      }
    }
  }

  return {
    process: process
  };
})();
(function(){function j(a,b){for(var c in b)a[c]=b[c]}function l(){return Function.prototype.call.apply(Array.prototype.slice,arguments)}function m(a,b){var c=l(arguments,2);return function(){return b.apply(a,c)}}var n=9;function o(a,b){b=new p(b);for(b.f=[a];b.f.length;){a=b.f.shift();b.g(a);for(a=a.firstChild;a;a=a.nextSibling)a.nodeType==1&&b.f.push(a)}}function p(a){this.g=a}function q(a,b,c){a.setAttribute(b,c)}function r(a,b){a.removeAttribute(b)}function s(a){a.style.display=""}
function t(a){a.style.display="none"};var u=":",v=/\s*;\s*/;function w(){this.i.apply(this,arguments)}w.prototype.i=function(a,b){var c=this;if(!c.a)c.a={};b?j(c.a,b.a):j(c.a,x);c.a.$this=a;c.a.$context=c;c.d=typeof a!="undefined"&&a!=null?a:"";if(!b)c.a.$top=c.d};var x={};(function(a,b){x[a]=b})("$default",null);var y=[];function z(a){for(var b in a.a)delete a.a[b];a.d=null;y.push(a)}function A(a,b,c){try{return b.call(c,a.a,a.d)}catch(e){return x.$default}}
function B(a,b,c,e){if(y.length>0){var d=y.pop();w.call(d,b,a);a=d}else a=new w(b,a);a.a.$index=c;a.a.$count=e;return a}var C="a_",E="b_",F="with (a_) with (b_) return ",G={};function H(a){if(!G[a])try{G[a]=new Function(C,E,F+a)}catch(b){}return G[a]}function I(a){return a}function J(a){var b=[];a=a.split(v);for(var c=0,e=a.length;c<e;++c){var d=a[c].indexOf(u);if(!(d<0)){var f;f=a[c].substr(0,d).replace(/^\s+/,"").replace(/\s+$/,"");d=H(a[c].substr(d+1));b.push(f,d)}}return b}
function K(a){var b=[];a=a.split(v);for(var c=0,e=a.length;c<e;++c)if(a[c]){var d=H(a[c]);b.push(d)}return b};var L="jsinstance",aa="jsts",M="*",N="div",ba="id";function ca(a,b){var c=new O;P(b);c.j=b?b.nodeType==n?b:b.ownerDocument||document:document;var e=m(c,c.e,a,b);a=c.h=[];b=c.k=[];c.c=[];e();for(var d,f,g;a.length;){d=a[a.length-1];e=b[b.length-1];if(e>=d.length){e=a.pop();e.length=0;c.c.push(e);b.pop()}else{f=d[e++];g=d[e++];d=d[e++];b[b.length-1]=e;f.call(c,g,d)}}}function O(){}var da=0,Q={};Q[0]={};var R={},S={},T=[];function P(a){a.__jstcache||o(a,function(b){U(b)})}
var V=[["jsselect",H],["jsdisplay",H],["jsvalues",J],["jsvars",J],["jseval",K],["transclude",I],["jscontent",H],["jsskip",H]];
function U(a){if(a.__jstcache)return a.__jstcache;var b=a.getAttribute("jstcache");if(b!=null)return a.__jstcache=Q[b];b=T.length=0;for(var c=V.length;b<c;++b){var e=V[b][0],d=a.getAttribute(e);S[e]=d;d!=null&&T.push(e+"="+d)}if(T.length==0){a.setAttribute("jstcache","0");return a.__jstcache=Q[0]}var f=T.join("&");if(b=R[f]){a.setAttribute("jstcache",b);return a.__jstcache=Q[b]}var g={};b=0;for(c=V.length;b<c;++b){d=V[b];e=d[0];var i=d[1];d=S[e];if(d!=null)g[e]=i(d)}b=""+ ++da;a.setAttribute("jstcache",
b);Q[b]=g;R[f]=b;return a.__jstcache=g}function W(a,b){a.h.push(b);a.k.push(0)}function X(a){return a.c.length?a.c.pop():[]}O.prototype.e=function(a,b){var c=this,e=Y(c,b),d=e.transclude;if(d)if(e=Z(d)){b.parentNode.replaceChild(e,b);b=X(c);b.push(c.e,a,e);W(c,b)}else b.parentNode.removeChild(b);else(e=e.jsselect)?ea(c,a,b,e):c.b(a,b)};
O.prototype.b=function(a,b){var c=this,e=Y(c,b),d=e.jsdisplay;if(d){if(!A(a,d,b)){t(b);return}s(b)}(d=e.jsvars)&&fa(c,a,b,d);(d=e.jsvalues)&&ga(c,a,b,d);if(d=e.jseval)for(var f=0,g=d.length;f<g;++f)A(a,d[f],b);if(d=e.jsskip)if(A(a,d,b))return;if(e=e.jscontent){a=""+A(a,e,b);if(b.innerHTML!=a){for(;b.firstChild;)b.firstChild.parentNode.removeChild(b.firstChild);c=c.j.createTextNode(a);b.appendChild(c)}}else{e=X(c);for(b=b.firstChild;b;b=b.nextSibling)b.nodeType==1&&e.push(c.e,a,b);e.length&&W(c,e)}};
function ea(a,b,c,e){e=A(b,e,c);var d=c.getAttribute(L),f=false;if(d)if(d.charAt(0)==M){var g=d.substr(1);d=parseInt(g,10);f=true}else d=parseInt(d,10);var i=e!=null&&typeof e=="object"&&typeof e.length=="number";g=i?e.length:1;var h=i&&g==0;if(i)if(h)if(d)c.parentNode.removeChild(c);else{c.setAttribute(L,"*0");t(c)}else{s(c);if(d===null||d===""||f&&d<g-1){f=X(a);d=d||0;for(i=g-1;d<i;++d){var k=c.cloneNode(true);c.parentNode.insertBefore(k,c);$(k,e,d);h=B(b,e[d],d,g);f.push(a.b,h,k,z,h,null)}$(c,
e,d);h=B(b,e[d],d,g);f.push(a.b,h,c,z,h,null);W(a,f)}else if(d<g){f=e[d];$(c,e,d);h=B(b,f,d,g);f=X(a);f.push(a.b,h,c,z,h,null);W(a,f)}else c.parentNode.removeChild(c)}else if(e==null)t(c);else{s(c);h=B(b,e,0,1);f=X(a);f.push(a.b,h,c,z,h,null);W(a,f)}}function fa(a,b,c,e){a=0;for(var d=e.length;a<d;a+=2){var f=e[a],g=A(b,e[a+1],c);b.a[f]=g}}
function ga(a,b,c,e){a=0;for(var d=e.length;a<d;a+=2){var f=e[a],g=A(b,e[a+1],c);if(f.charAt(0)=="$")b.a[f]=g;else if(f.charAt(0)=="."){f=f.substr(1).split(".");for(var i=c,h=f.length,k=0,ha=h-1;k<ha;++k){var D=f[k];i[D]||(i[D]={});i=i[D]}i[f[h-1]]=g}else if(f)if(typeof g=="boolean")g?q(c,f,f):r(c,f);else c.setAttribute(f,""+g)}}function Y(a,b){if(b.__jstcache)return b.__jstcache;if(a=b.getAttribute("jstcache"))return b.__jstcache=Q[a];return U(b)}
function Z(a,b){var c=document;if(a=b?ia(c,a,b):c.getElementById(a)){P(a);a=a.cloneNode(true);a.removeAttribute(ba);return a}else return null}function ia(a,b,c,e){var d=a.getElementById(b);if(d)return d;c=c();e=e||aa;if(d=a.getElementById(e))d=d;else{d=a.createElement(N);d.id=e;t(d);d.style.position="absolute";a.body.appendChild(d)}e=a.createElement(N);d.appendChild(e);e.innerHTML=c;return d=a.getElementById(b)}function $(a,b,c){c==b.length-1?q(a,L,M+c):q(a,L,""+c)};window.jstGetTemplate=Z;window.JsEvalContext=w;window.jstProcess=ca;
})()PNG


IHDR  szz	pHYsIDATX	W]e~̙9g.v]D~j* F{eF!QӘp`M/1QÅjⅭ
,MP[`Zm۞9gf|9,1qv>~m_E3a	pC!6
Q>b%%EnzYgٷf`ޣ8_Ot&bA {{=?e+͏(.g(S
L^rlsVV>ˠr>l"mj|?	sTz`2"f9%kA{:t9
a=AyBA-{Xx3r*fO'AQw@jE3+9?7O9{ Gj:̹fހ
)<n3*GW~am(f{JN$a
q`*|$r<0(\T;gZ:juKi!SˈeCesِ+Nw>e-UFX#AfL}ޕ2RjQ2PڵI@F蜗QCj5x8{f%ig3d=
Bco
Rr^sr5lw֮qN(|/z}dLR\AX&jAYj0Uε[p?x׍x[J+rlQ94o^	N̞74`?3sv	AJQf+PN+H̲n/JǦ{̍;]jK
j<V/#5-޺	,[˺6ɍB;
+Xh'O!k'^9a.BHs?֜!RN)3%G//ە]+"4
 E>>K@eU Co%t+t|e2z]JOoE|+!MxܶCl}^!9Yhmx?{n3/je=1c65w.}uV8@0NIٖ,sgϏ/ a@Ī73UYp!N;BUDH7Z#[zt:ODM4WSlՎg=y7.[u *(CO%Ǯ'?[w7\9X&\*O=}k_2$>vw}1y
Ӷn%SN.{?2.m8JڨMI
Vk̬Q#a_ ?5͞Ǜow\CBPkӭ6	B5-ޛ[pXh:<w?G8A/#H3%%`J_QM)OCF; X-dVFx_zs31GleSߚtaeC)H}(	
`N@2cvTߙ9C`I{Q3Ёs[%Z}geݓÖk6:S#?z!^fģ/]chl2͍jAo1!ApC
el 32묛昜PPyf14[	jX>=Dg.7
izu<gKu?~WϞÙ lR9``e6ۿQ("Y{_/-Wmגt5Υ4D<eᥣK9VQs
<e.10Q@z(
W;-V]Z=c䙜ωikIY!
Eܗdr~J vZ&HN.)~W~%WN=HXb&kn'0LjOJkc:c."	1ǢQUgxcg>r׶ip'{HDOԻw(
җӯ~~w8uMJ:hoIENDB`// Copyright 2006 Google Inc.
// All Rights Reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
//
//  * Redistributions of source code must retain the above copyright
//    notice, this list of conditions and the following disclaimer.
//  * Redistributions in binary form must reproduce the above copyright
//    notice, this list of conditions and the following disclaimer in
//    the documentation and/or other materials provided with the
//    distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.

// NOTE: This file has been changed from the one on doctype. The following
// changes were made:
// - Removed goog.globalEval because it calls eval() which is not allowed from
//   inside v8 extensions. If we ever need to use globalEval, we will need to
//   find a way to work around this problem.
// - Remove Function.prototype.apply() emulation for the same reason. This one
//   is useless anyway because V8 supports apply() natively.

/**
 * @fileoverview Bootstrap for the Google JS Library
 */

/**
 * @define {boolean} Overridden to true by the compiler when
 *     --mark_as_compiled is specified.
 */
var COMPILED = true;


/**
 * Base namespace for the Google JS library.  Checks to see goog is
 * already defined in the current scope before assigning to prevent
 * clobbering if base.js is loaded more than once.
 */
var goog = {}; // Check to see if already defined in current scope


/**
 * Reference to the global context.  In most cases this will be 'window'.
 */
goog.global = this;


/**
 * Indicates whether or not we can call 'eval' directly to eval code in the
 * global scope. Set to a Boolean by the first call to goog.globalEval (which
 * empirically tests whether eval works for globals). @see goog.globalEval
 * @type {boolean?}
 * @private
 */
goog.evalWorksForGlobals_ = null;


/**
 * Creates object stubs for a namespace. When present in a file, goog.provide
 * also indicates that the file defines the indicated object.
 * @param {string} name name of the object that this file defines.
 */
goog.provide = function(name) {
  if (!COMPILED) {
    // Ensure that the same namespace isn't provided twice. This is intended
    // to teach new developers that 'goog.provide' is effectively a variable
    // declaration. And when JSCompiler transforms goog.provide into a real
    // variable declaration, the compiled JS should work the same as the raw
    // JS--even when the raw JS uses goog.provide incorrectly.
    if (goog.getObjectByName(name) && !goog.implicitNamespaces_[name]) {
      throw 'Namespace "' + name + '" already declared.';
    }

    var namespace = name;
    while ((namespace = namespace.substr(0, namespace.lastIndexOf('.')))) {
      goog.implicitNamespaces_[namespace] = true;
    }
  }

  goog.exportPath_(name);
};


if (!COMPILED) {
  /**
   * Namespaces implicitly defined by goog.provide. For example,
   * goog.provide('goog.events.Event') implicitly declares
   * that 'goog' and 'goog.events' must be namespaces.
   *
   * @type {Object}
   * @private
   */
  goog.implicitNamespaces_ = {};
}


/**
 * Builds an object structure for the provided namespace path,
 * ensuring that names that already exist are not overwritten. For
 * example:
 * "a.b.c" -> a = {};a.b={};a.b.c={};
 * Used by goog.provide and goog.exportSymbol.
 * @param {string} name name of the object that this file defines.
 * @param {Object} opt_object the object to expose at the end of the path.
 * @private
 */
goog.exportPath_ = function(name, opt_object) {
  var parts = name.split('.');
  var cur = goog.global;
  var part;

  // Internet Explorer exhibits strange behavior when throwing errors from
  // methods externed in this manner.  See the testExportSymbolExceptions in
  // base_test.html for an example.
  if (!(parts[0] in cur) && cur.execScript) {
    cur.execScript('var ' + parts[0]);
  }

  // Parentheses added to eliminate strict JS warning in Firefox.
  while ((part = parts.shift())) {
    if (!parts.length && goog.isDef(opt_object)) {
      // last part and we have an object; use it
      cur[part] = opt_object;
    } else if (cur[part]) {
      cur = cur[part];
    } else {
      cur = cur[part] = {};
    }
  }
};


/**
 * Returns an object based on its fully qualified name
 * @param {string} name The fully qualified name.
 * @return {Object?} The object or, if not found, null.
 */
goog.getObjectByName = function(name) {
  var parts = name.split('.');
  var cur = goog.global;
  for (var part; part = parts.shift(); ) {
    if (cur[part]) {
      cur = cur[part];
    } else {
      return null;
    }
  }
  return cur;
};


/**
 * Globalizes a whole namespace, such as goog or goog.lang.
 *
 * @param {Object} obj The namespace to globalize.
 * @param {Object} opt_global The object to add the properties to.
 * @deprecated Properties may be explicitly exported to the global scope, but
 *     this should no longer be done in bulk.
 */
goog.globalize = function(obj, opt_global) {
  var global = opt_global || goog.global;
  for (var x in obj) {
    global[x] = obj[x];
  }
};


/**
 * Adds a dependency from a file to the files it requires.
 * @param {string} relPath The path to the js file.
 * @param {Array} provides An array of strings with the names of the objects
 *                         this file provides.
 * @param {Array} requires An array of strings with the names of the objects
 *                         this file requires.
 */
goog.addDependency = function(relPath, provides, requires) {
  if (!COMPILED) {
    var provide, require;
    var path = relPath.replace(/\\/g, '/');
    var deps = goog.dependencies_;
    for (var i = 0; provide = provides[i]; i++) {
      deps.nameToPath[provide] = path;
      if (!(path in deps.pathToNames)) {
        deps.pathToNames[path] = {};
      }
      deps.pathToNames[path][provide] = true;
    }
    for (var j = 0; require = requires[j]; j++) {
      if (!(path in deps.requires)) {
        deps.requires[path] = {};
      }
      deps.requires[path][require] = true;
    }
  }
};


/**
 * Implements a system for the dynamic resolution of dependencies
 * that works in parallel with the BUILD system.
 * @param {string} rule Rule to include, in the form goog.package.part.
 */
goog.require = function(rule) {

  // if the object already exists we do not need do do anything
  if (!COMPILED) {
    if (goog.getObjectByName(rule)) {
      return;
    }
    var path = goog.getPathFromDeps_(rule);
    if (path) {
      goog.included_[path] = true;
      goog.writeScripts_();
    } else {
      // NOTE(nicksantos): We could throw an error, but this would break
      // legacy users that depended on this failing silently. Instead, the
      // compiler should warn us when there are invalid goog.require calls.
    }
  }
};


/**
 * Path for included scripts
 * @type {string}
 */
goog.basePath = '';


/**
 * Null function used for default values of callbacks, etc.
 * @type {Function}
 */
goog.nullFunction = function() {};


/**
 * When defining a class Foo with an abstract method bar(), you can do:
 *
 * Foo.prototype.bar = goog.abstractMethod
 *
 * Now if a subclass of Foo fails to override bar(), an error
 * will be thrown when bar() is invoked.
 *
 * Note: This does not take the name of the function to override as
 * an argument because that would make it more difficult to obfuscate
 * our JavaScript code.
 *
 * @throws {Error} when invoked to indicate the method should be
 *   overridden.
 */
goog.abstractMethod = function() {
  throw Error('unimplemented abstract method');
};


if (!COMPILED) {
  /**
   * Object used to keep track of urls that have already been added. This
   * record allows the prevention of circular dependencies.
   * @type {Object}
   * @private
   */
  goog.included_ = {};


  /**
   * This object is used to keep track of dependencies and other data that is
   * used for loading scripts
   * @private
   * @type {Object}
   */
  goog.dependencies_ = {
    pathToNames: {}, // 1 to many
    nameToPath: {}, // 1 to 1
    requires: {}, // 1 to many
    visited: {}, // used when resolving dependencies to prevent us from
                 // visiting the file twice
    written: {} // used to keep track of script files we have written
  };


  /**
   * Tries to detect the base path of the base.js script that bootstraps
   * Google JS Library
   * @private
   */
  goog.findBasePath_ = function() {
    var doc = goog.global.document;
    if (typeof doc == 'undefined') {
      return;
    }
    if (goog.global.GOOG_BASE_PATH) {
      goog.basePath = goog.global.GOOG_BASE_PATH;
      return;
    } else {
      goog.global.GOOG_BASE_PATH = null;
    }
    var scripts = doc.getElementsByTagName('script');
    for (var script, i = 0; script = scripts[i]; i++) {
      var src = script.src;
      var l = src.length;
      if (src.substr(l - 7) == 'base.js') {
        goog.basePath = src.substr(0, l - 7);
        return;
      }
    }
  };


  /**
   * Writes a script tag if, and only if, that script hasn't already been added
   * to the document.  (Must be called at execution time)
   * @param {string} src Script source.
   * @private
   */
  goog.writeScriptTag_ = function(src) {
    var doc = goog.global.document;
    if (typeof doc != 'undefined' &&
        !goog.dependencies_.written[src]) {
      goog.dependencies_.written[src] = true;
      doc.write('<script type="text/javascript" src="' +
                src + '"></' + 'script>');
    }
  };


  /**
   * Resolves dependencies based on the dependencies added using addDependency
   * and calls writeScriptTag_ in the correct order.
   * @private
   */
  goog.writeScripts_ = function() {
    // the scripts we need to write this time
    var scripts = [];
    var seenScript = {};
    var deps = goog.dependencies_;

    function visitNode(path) {
      if (path in deps.written) {
        return;
      }

      // we have already visited this one. We can get here if we have cyclic
      // dependencies
      if (path in deps.visited) {
        if (!(path in seenScript)) {
          seenScript[path] = true;
          scripts.push(path);
        }
        return;
      }

      deps.visited[path] = true;

      if (path in deps.requires) {
        for (var requireName in deps.requires[path]) {
          visitNode(deps.nameToPath[requireName]);
        }
      }

      if (!(path in seenScript)) {
        seenScript[path] = true;
        scripts.push(path);
      }
    }

    for (var path in goog.included_) {
      if (!deps.written[path]) {
        visitNode(path);
      }
    }

    for (var i = 0; i < scripts.length; i++) {
      if (scripts[i]) {
        goog.writeScriptTag_(goog.basePath + scripts[i]);
      } else {
        throw Error('Undefined script input');
      }
    }
  };


  /**
   * Looks at the dependency rules and tries to determine the script file that
   * fulfills a particular rule.
   * @param {string} rule In the form goog.namespace.Class or project.script.
   * @return {string?} Url corresponding to the rule, or null.
   * @private
   */
  goog.getPathFromDeps_ = function(rule) {
    if (rule in goog.dependencies_.nameToPath) {
      return goog.dependencies_.nameToPath[rule];
    } else {
      return null;
    }
  };

  goog.findBasePath_();
  goog.writeScriptTag_(goog.basePath + 'deps.js');
}



//==============================================================================
// Language Enhancements
//==============================================================================


/**
 * This is a "fixed" version of the typeof operator.  It differs from the typeof
 * operator in such a way that null returns 'null' and arrays return 'array'.
 * @param {*} value The value to get the type of.
 * @return {string} The name of the type.
 */
goog.typeOf = function(value) {
  var s = typeof value;
  if (s == 'object') {
    if (value) {
      // We cannot use constructor == Array or instanceof Array because
      // different frames have different Array objects. In IE6, if the iframe
      // where the array was created is destroyed, the array loses its
      // prototype. Then dereferencing val.splice here throws an exception, so
      // we can't use goog.isFunction. Calling typeof directly returns 'unknown'
      // so that will work. In this case, this function will return false and
      // most array functions will still work because the array is still
      // array-like (supports length and []) even though it has lost its
      // prototype. Custom object cannot have non enumerable length and
      // NodeLists don't have a slice method.
      if (typeof value.length == 'number' &&
          typeof value.splice != 'undefined' &&
          !goog.propertyIsEnumerable_(value, 'length')) {
        return 'array';
      }

      // IE in cross-window calls does not correctly marshal the function type
      // (it appears just as an object) so we cannot use just typeof val ==
      // 'function'. However, if the object has a call property, it is a
      // function.
      if (typeof value.call != 'undefined') {
        return 'function';
      }
    } else {
      return 'null';
    }

  // In Safari typeof nodeList returns function.  We would like to return
  // object for those and we can detect an invalid function by making sure that
  // the function object has a call method
  } else if (s == 'function' && typeof value.call == 'undefined') {
    return 'object';
  }
  return s;
};

if (Object.prototype.propertyIsEnumerable) {
  /**
   * Safe way to test whether a property is enumarable.  It allows testing
   * for enumarable on objects where 'propertyIsEnumerable' is overridden or
   * does not exist (like DOM nodes in IE).
   * @param {Object} object The object to test if the property is enumerable.
   * @param {string} propName The property name to check for.
   * @return {boolean} True if the property is enumarable.
   * @private
   */
  goog.propertyIsEnumerable_ = function(object, propName) {
    return Object.prototype.propertyIsEnumerable.call(object, propName);
  };
} else {
  /**
   * Safe way to test whether a property is enumarable.  It allows testing
   * for enumarable on objects where 'propertyIsEnumerable' is overridden or
   * does not exist (like DOM nodes in IE).
   * @param {Object} object The object to test if the property is enumerable.
   * @param {string} propName The property name to check for.
   * @return {boolean} True if the property is enumarable.
   * @private
   */
  goog.propertyIsEnumerable_ = function(object, propName) {
    // KJS in Safari 2 is not ECMAScript compatible and lacks crucial methods
    // such as propertyIsEnumerable.  We therefore use a workaround.
    // Does anyone know a more efficient work around?
    if (propName in object) {
      for (var key in object) {
        if (key == propName) {
          return true;
        }
      }
    }
    return false;
  };
}

/**
 * Returns true if the specified value is not |undefined|.
 * WARNING: Do not use this to test if an object has a property. Use the in
 * operator instead.
 * @param {*} val Variable to test.
 * @return {boolean} Whether variable is defined.
 */
goog.isDef = function(val) {
  return typeof val != 'undefined';
};


/**
 * Returns true if the specified value is |null|
 * @param {*} val Variable to test.
 * @return {boolean} Whether variable is null.
 */
goog.isNull = function(val) {
  return val === null;
};


/**
 * Returns true if the specified value is defined and not null
 * @param {*} val Variable to test.
 * @return {boolean} Whether variable is defined and not null.
 */
goog.isDefAndNotNull = function(val) {
  return goog.isDef(val) && !goog.isNull(val);
};


/**
 * Returns true if the specified value is an array
 * @param {*} val Variable to test.
 * @return {boolean} Whether variable is an array.
 */
goog.isArray = function(val) {
  return goog.typeOf(val) == 'array';
};


/**
 * Returns true if the object looks like an array. To qualify as array like
 * the value needs to be either a NodeList or an object with a Number length
 * property.
 * @param {*} val Variable to test.
 * @return {boolean} Whether variable is an array.
 */
goog.isArrayLike = function(val) {
  var type = goog.typeOf(val);
  return type == 'array' || type == 'object' && typeof val.length == 'number';
};


/**
 * Returns true if the object looks like a Date. To qualify as Date-like
 * the value needs to be an object and have a getFullYear() function.
 * @param {*} val Variable to test.
 * @return {boolean} Whether variable is a like a Date.
 */
goog.isDateLike = function(val) {
  return goog.isObject(val) && typeof val.getFullYear == 'function';
};


/**
 * Returns true if the specified value is a string
 * @param {*} val Variable to test.
 * @return {boolean} Whether variable is a string.
 */
goog.isString = function(val) {
  return typeof val == 'string';
};


/**
 * Returns true if the specified value is a boolean
 * @param {*} val Variable to test.
 * @return {boolean} Whether variable is boolean.
 */
goog.isBoolean = function(val) {
  return typeof val == 'boolean';
};


/**
 * Returns true if the specified value is a number
 * @param {*} val Variable to test.
 * @return {boolean} Whether variable is a number.
 */
goog.isNumber = function(val) {
  return typeof val == 'number';
};


/**
 * Returns true if the specified value is a function
 * @param {*} val Variable to test.
 * @return {boolean} Whether variable is a function.
 */
goog.isFunction = function(val) {
  return goog.typeOf(val) == 'function';
};


/**
 * Returns true if the specified value is an object.  This includes arrays
 * and functions.
 * @param {*} val Variable to test.
 * @return {boolean} Whether variable is an object.
 */
goog.isObject = function(val) {
  var type = goog.typeOf(val);
  return type == 'object' || type == 'array' || type == 'function';
};


/**
 * Adds a hash code field to an object. The hash code is unique for the
 * given object.
 * @param {Object} obj The object to get the hash code for.
 * @return {number} The hash code for the object.
 */
goog.getHashCode = function(obj) {
  // In IE, DOM nodes do not extend Object so they do not have this method.
  // we need to check hasOwnProperty because the proto might have this set.

  if (obj.hasOwnProperty && obj.hasOwnProperty(goog.HASH_CODE_PROPERTY_)) {
    return obj[goog.HASH_CODE_PROPERTY_];
  }
  if (!obj[goog.HASH_CODE_PROPERTY_]) {
    obj[goog.HASH_CODE_PROPERTY_] = ++goog.hashCodeCounter_;
  }
  return obj[goog.HASH_CODE_PROPERTY_];
};


/**
 * Removes the hash code field from an object.
 * @param {Object} obj The object to remove the field from.
 */
goog.removeHashCode = function(obj) {
  // DOM nodes in IE are not instance of Object and throws exception
  // for delete. Instead we try to use removeAttribute
  if ('removeAttribute' in obj) {
    obj.removeAttribute(goog.HASH_CODE_PROPERTY_);
  }
  /** @preserveTry */
  try {
    delete obj[goog.HASH_CODE_PROPERTY_];
  } catch (ex) {
  }
};


/**
 * {String} Name for hash code property
 * @private
 */
goog.HASH_CODE_PROPERTY_ = 'goog_hashCode_';


/**
 * @type {number} Counter for hash codes.
 * @private
 */
goog.hashCodeCounter_ = 0;


/**
 * Clone an object/array (recursively)
 * @param {Object} proto Object to clone.
 * @return {Object} Clone of x;.
 */
goog.cloneObject = function(proto) {
  var type = goog.typeOf(proto);
  if (type == 'object' || type == 'array') {
    if (proto.clone) {
      return proto.clone();
    }
    var clone = type == 'array' ? [] : {};
    for (var key in proto) {
      clone[key] = goog.cloneObject(proto[key]);
    }
    return clone;
  }

  return proto;
};


/**
 * Partially applies this function to a particular 'this object' and zero or
 * more arguments. The result is a new function with some arguments of the first
 * function pre-filled and the value of |this| 'pre-specified'.<br><br>
 *
 * Remaining arguments specified at call-time are appended to the pre-
 * specified ones.<br><br>
 *
 * Also see: {@link #partial}.<br><br>
 *
 * Note that bind and partial are optimized such that repeated calls to it do
 * not create more than one function object, so there is no additional cost for
 * something like:<br>
 *
 * <pre>var g = bind(f, obj);
 * var h = partial(g, 1, 2, 3);
 * var k = partial(h, a, b, c);</pre>
 *
 * Usage:
 * <pre>var barMethBound = bind(myFunction, myObj, 'arg1', 'arg2');
 * barMethBound('arg3', 'arg4');</pre>
 *
 * @param {Function} fn A function to partially apply.
 * @param {Object} self Specifies the object which |this| should point to
 *     when the function is run. If the value is null or undefined, it will
 *     default to the global object.
 * @param {Object} var_args Additional arguments that are partially
 *     applied to the function.
 *
 * @return {Function} A partially-applied form of the function bind() was
 *     invoked as a method of.
 */
goog.bind = function(fn, self, var_args) {
  var boundArgs = fn.boundArgs_;

  if (arguments.length > 2) {
    var args = Array.prototype.slice.call(arguments, 2);
    if (boundArgs) {
      args.unshift.apply(args, boundArgs);
    }
    boundArgs = args;
  }

  self = fn.boundSelf_ || self;
  fn = fn.boundFn_ || fn;

  var newfn;
  var context = self || goog.global;

  if (boundArgs) {
    newfn = function() {
      // Combine the static args and the new args into one big array
      var args = Array.prototype.slice.call(arguments);
      args.unshift.apply(args, boundArgs);
      return fn.apply(context, args);
    }
  } else {
    newfn = function() {
      return fn.apply(context, arguments);
    }
  }

  newfn.boundArgs_ = boundArgs;
  newfn.boundSelf_ = self;
  newfn.boundFn_ = fn;

  return newfn;
};


/**
 * Like bind(), except that a 'this object' is not required. Useful when the
 * target function is already bound.
 *
 * Usage:
 * var g = partial(f, arg1, arg2);
 * g(arg3, arg4);
 *
 * @param {Function} fn A function to partially apply.
 * @param {Object} var_args Additional arguments that are partially
 *     applied to fn.
 * @return {Function} A partially-applied form of the function bind() was
 *     invoked as a method of.
 */
goog.partial = function(fn, var_args) {
  var args = Array.prototype.slice.call(arguments, 1);
  args.unshift(fn, null);
  return goog.bind.apply(null, args);
};


/**
 * Copies all the members of a source object to a target object.
 * This is deprecated. Use goog.object.extend instead.
 * @param {Object} target Target.
 * @param {Object} source Source.
 * @deprecated
 */
goog.mixin = function(target, source) {
  for (var x in source) {
    target[x] = source[x];
  }

  // For IE the for-in-loop does not contain any properties that are not
  // enumerable on the prototype object (for example, isPrototypeOf from
  // Object.prototype) but also it will not include 'replace' on objects that
  // extend String and change 'replace' (not that it is common for anyone to
  // extend anything except Object).
};


/**
 * A simple wrapper for new Date().getTime().
 *
 * @return {number} An integer value representing the number of milliseconds
 *     between midnight, January 1, 1970 and the current time.
 */
goog.now = Date.now || (function() {
  return new Date().getTime();
});


/**
 * Abstract implementation of goog.getMsg for use with localized messages
 * @param {string} str Translatable string, places holders in the form.{$foo}
 * @param {Object} opt_values Map of place holder name to value.
 */
goog.getMsg = function(str, opt_values) {
  var values = opt_values || {};
  for (var key in values) {
    str = str.replace(new RegExp('\\{\\$' + key + '\\}', 'gi'), values[key]);
  }
  return str;
};


/**
 * Exposes an unobfuscated global namespace path for the given object.
 * Note that fields of the exported object *will* be obfuscated,
 * unless they are exported in turn via this function or
 * goog.exportProperty
 *
 * <p>Also handy for making public items that are defined in anonymous
 * closures.
 *
 * ex. goog.exportSymbol('Foo', Foo);
 *
 * ex. goog.exportSymbol('public.path.Foo.staticFunction',
 *                       Foo.staticFunction);
 *     public.path.Foo.staticFunction();
 *
 * ex. goog.exportSymbol('public.path.Foo.prototype.myMethod',
 *                       Foo.prototype.myMethod);
 *     new public.path.Foo().myMethod();
 *
 * @param {string} publicPath Unobfuscated name to export.
 * @param {Object} object Object the name should point to.
 */
goog.exportSymbol = function(publicPath, object) {
  goog.exportPath_(publicPath, object);
};


/**
 * Exports a property unobfuscated into the object's namespace.
 * ex. goog.exportProperty(Foo, 'staticFunction', Foo.staticFunction);
 * ex. goog.exportProperty(Foo.prototype, 'myMethod', Foo.prototype.myMethod);
 * @param {Object} object Object whose static property is being exported.
 * @param {string} publicName Unobfuscated name to export.
 * @param {Object} symbol Object the name should point to.
 */
goog.exportProperty = function(object, publicName, symbol) {
  object[publicName] = symbol;
};



//==============================================================================
// Extending Function
//==============================================================================


/**
 * An alias to the {@link goog.bind()} global function.
 *
 * Usage:
 * var g = f.bind(obj, arg1, arg2);
 * g(arg3, arg4);
 *
 * @param {Object} self Specifies the object to which |this| should point
 *     when the function is run. If the value is null or undefined, it will
 *     default to the global object.
 * @param {Object} var_args Additional arguments that are partially
 *     applied to fn.
 * @return {Function} A partially-applied form of the Function on which bind()
 *     was invoked as a method.
 * @deprecated
 */
Function.prototype.bind = function(self, var_args) {
  if (arguments.length > 1) {
    var args = Array.prototype.slice.call(arguments, 1);
    args.unshift(this, self);
    return goog.bind.apply(null, args);
  } else {
    return goog.bind(this, self);
  }
};


/**
 * An alias to the {@link goog.partial()} global function.
 *
 * Usage:
 * var g = f.partial(arg1, arg2);
 * g(arg3, arg4);
 *
 * @param {Object} var_args Additional arguments that are partially
 *     applied to fn.
 * @return {Function} A partially-applied form of the function partial() was
 *     invoked as a method of.
 * @deprecated
 */
Function.prototype.partial = function(var_args) {
  var args = Array.prototype.slice.call(arguments);
  args.unshift(this, null);
  return goog.bind.apply(null, args);
};


/**
 * Inherit the prototype methods from one constructor into another.
 *
 * Usage:
 * <pre>
 * function ParentClass(a, b) { }
 * ParentClass.prototype.foo = function(a) { }
 *
 * function ChildClass(a, b, c) {
 *   ParentClass.call(this, a, b);
 * }
 *
 * ChildClass.inherits(ParentClass);
 *
 * var child = new ChildClass('a', 'b', 'see');
 * child.foo(); // works
 * </pre>
 *
 * In addition, a superclass' implementation of a method can be invoked
 * as follows:
 *
 * <pre>
 * ChildClass.prototype.foo = function(a) {
 *   ChildClass.superClass_.foo.call(this, a);
 *   // other code
 * };
 * </pre>
 *
 * @param {Function} parentCtor Parent class.
 */
Function.prototype.inherits = function(parentCtor) {
  goog.inherits(this, parentCtor);
};


/**
 * Static variant of Function.prototype.inherits.
 * @param {Function} childCtor Child class.
 * @param {Function} parentCtor Parent class.
 */
goog.inherits = function(childCtor, parentCtor) {
  /** @constructor */
  function tempCtor() {};
  tempCtor.prototype = parentCtor.prototype;
  childCtor.superClass_ = parentCtor.prototype;
  childCtor.prototype = new tempCtor();
  childCtor.prototype.constructor = childCtor;
};


/**
 * Mixes in an object's properties and methods into the callee's prototype.
 * Basically mixin based inheritance, thus providing an alternative method for
 * adding properties and methods to a class' prototype.
 *
 * <pre>
 * function X() {}
 * X.mixin({
 *   one: 1,
 *   two: 2,
 *   three: 3,
 *   doit: function() { return this.one + this.two + this.three; }
 * });
 *
 * function Y() { }
 * Y.mixin(X.prototype);
 * Y.prototype.four = 15;
 * Y.prototype.doit2 = function() { return this.doit() + this.four; }
 * });
 *
 * // or
 *
 * function Y() { }
 * Y.inherits(X);
 * Y.mixin({
 *   one: 10,
 *   four: 15,
 *   doit2: function() { return this.doit() + this.four; }
 * });
 * </pre>
 *
 * @param {Object} source from which to copy properties.
 * @see goog.mixin
 * @deprecated
 */
Function.prototype.mixin = function(source) {
  goog.mixin(this.prototype, source);
};
<!DOCTYPE html>
<html>
<head>
<script>
function debug(msg) {
  document.getElementById('debug').textContent = msg;
}
</script>
<style>
body {
  background-color: rgb(187, 187, 187);
  margin: 0;
  text-align: center;
  font-family: sans-serif;
  overflow: hidden;
}

h1 {
  padding: 0pt 10pt;
  font-size: 10pt;
  font-weight: normal;
  visibility: hidden;
}

#outer:hover h1 {
  visibility: visible;
}

#plugin_icon {
  opacity: .6;
}

p {
  padding: 0pt 14pt;
  font-size: 8pt;
}

#outer {
  width: 100%;
  height: 100%;
  position: absolute;
  border: 1px black solid;
  -webkit-box-sizing: border-box;
}

#inner {
  position: relative;
  top: 50%;
  margin-top: -33px;
}
</style>
</head>

<body id="t" onSelectStart="return false;">
<div id="outer">
<div id="inner">
<div><img id="plugin_icon" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEEAAABBCAYAAACO98lFAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkQ2Mzk3QTI2QjQ2QTExREZBMDFDRDJDQjEwQTc4NEU3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkQ2Mzk3QTI3QjQ2QTExREZBMDFDRDJDQjEwQTc4NEU3Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6RDYzOTdBMjRCNDZBMTFERkEwMUNEMkNCMTBBNzg0RTciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6RDYzOTdBMjVCNDZBMTFERkEwMUNEMkNCMTBBNzg0RTciLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4tYDtvAAAMbUlEQVR42tybyWtVTxbH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" /></div>
<p id="debug"> </p>
</div>
</div>
</body>
</html>
// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// dom_automation.js
// Methods for performing common DOM operations. Used in Chrome testing
// involving the DomAutomationController.

var domAutomation = domAutomation || {};

(function() {
  // |objects| is used to track objects which are sent back to the
  // DomAutomationController. Since JavaScript does not have a map type,
  // |objects| is simply an object in which the property name and
  // property value serve as the key-value pair. The key is the handle number
  // and the value is the tracked object.
  domAutomation.objects = {};

  // The next object handle to use.
  domAutomation.nextHandle = 1;

  // The current call ID for which a response is awaited. Each asynchronous
  // function is given a call ID. When the function has a result to return,
  // it must supply that call ID. If a result has not yet been received for
  // that call ID, a response containing the result will be sent to the
  // domAutomationController.
  domAutomation.currentCallId = 1;

  // The current timeout for an asynchronous JavaScript evaluation. Can be given
  // to window.clearTimeout.
  domAutomation.currentTimeout = null;

  // Returns |value| after converting it to an acceptable type for return, if
  // necessary.
  function getConvertedValue(value) {
    if (typeof value == "undefined" || !value) {
      return "";
    }
    if (value instanceof Array) {
      var result = [];
      for (var i = 0; i < value.length; i++) {
        result.push(getConvertedValue(value[i]));
      }
      return result;
    }
    if (typeof(value) == "object") {
      var handle = getHandleForObject(value);
      if (handle == -1) {
        // Track this object.
        var handle = domAutomation.nextHandle++;
        domAutomation.objects[handle] = value;
      }
      return handle;
    }
    return value;
  }

  // Returns the handle for |obj|, or -1 if no handle exists.
  function getHandleForObject(obj) {
      for (var property in domAutomation.objects) {
        if (domAutomation.objects[property] == obj)
          return parseInt(property);
      }
      return -1;
  }

  // Sends a completed response back to the domAutomationController with a
  // return value, which can be of any type.
  function sendCompletedResponse(returnValue) {
    var result = [true, "", getConvertedValue(returnValue)];
    domAutomationController.sendJSON(JSON.stringify(result));
  }

  // Sends a error response back to the domAutomationController. |exception|
  // should be a string or an exception.
  function sendErrorResponse(exception) {
    var message = exception.message;
    if (typeof message == "undefined")
      message = exception;
    if (typeof message != "string")
      message = JSON.stringify(message);
    var result = [false, message, exception];
    domAutomationController.sendJSON(JSON.stringify(result));
  }

  // Safely evaluates |javascript| and sends a response back via the
  // DomAutomationController. See javascript_execution_controller.cc
  // for more details.
  domAutomation.evaluateJavaScript = function(javascript) {
    try {
      sendCompletedResponse(eval(javascript));
    }
    catch (exception) {
      sendErrorResponse(exception);
    }
  }

  // Called by a function when it has completed successfully. Any value,
  // including undefined, is acceptable for |returnValue|. This should only
  // be used by functions with an asynchronous response.
  function onAsyncJavaScriptComplete(callId, returnValue) {
    if (domAutomation.currentCallId != callId) {
      // We are not waiting for a response for this call anymore,
      // because it already responded.
      return;
    }
    domAutomation.currentCallId++;
    window.clearTimeout(domAutomation.currentTimeout);
    sendCompletedResponse(returnValue);
  }

  // Calld by a function when it has an error preventing its successful
  // execution. |exception| should be an exception or a string.
  function onAsyncJavaScriptError(callId, exception) {
    if (domAutomation.currentCallId != callId) {
      // We are not waiting for a response for this call anymore,
      // because it already responded.
      return;
    }
    domAutomation.currentCallId++;
    window.clearTimeout(domAutomation.currentTimeout);
    sendErrorResponse(exception);
  }

  // Returns whether the call with the given ID has already finished. If true,
  // this means that the call timed out or that it already gave a response.
  function didCallFinish(callId) {
    return domAutomation.currentCallId != callId;
  }

  // Safely evaluates |javascript|. The JavaScript is expected to return
  // a response via either onAsyncJavaScriptComplete or
  // onAsyncJavaScriptError. The script should respond within the |timeoutMs|.
  domAutomation.evaluateAsyncJavaScript = function(javascript, timeoutMs) {
    try {
      eval(javascript);
    }
    catch (exception) {
      onAsyncJavaScriptError(domAutomation.currentCallId, exception);
      return;
    }
    domAutomation.currentTimeout = window.setTimeout(
        onAsyncJavaScriptError, timeoutMs, domAutomation.currentCallId,
        "JavaScript timed out waiting for response.");
  }

  // Stops tracking the object associated with |handle|.
  domAutomation.removeObject = function(handle) {
    delete domAutomation.objects[handle];
  }

  // Stops tracking all objects.
  domAutomation.removeAll = function() {
    domAutomation.objects = {};
    domAutomation.nextHandle = 1;
  }

  // Gets the object associated with this |handle|.
  domAutomation.getObject = function(handle) {
    var obj = domAutomation.objects[handle]
    if (typeof obj == "undefined") {
      throw "Object with handle " + handle + " does not exist."
    }
    return domAutomation.objects[handle];
  }

  // Gets the ID for this asynchronous call.
  domAutomation.getCallId = function() {
    return domAutomation.currentCallId;
  }

  // Converts an indexable list with a length property to an array.
  function getArray(list) {
    var arr = [];
    for (var i = 0; i < list.length; i++) {
      arr.push(list[i]);
    }
    return arr;
  }

  // Removes whitespace at the beginning and end of |text|.
  function trim(text) {
    return text.replace(/^\s+|\s+$/g, "");
  }

  // Returns the window (which is a sub window of |win|) which
  // directly contains |doc|. May return null.
  function findWindowForDocument(win, doc) {
    if (win.document == doc)
      return win;
    for (var i = 0; i < win.frames.length; i++) {
      if (findWindowForDocument(win.frames[i], doc))
        return win.frames[i];
    }
    return null;
  }

  // Returns |element|'s text. This includes all descendants' text.
  // For textareas and inputs, the text is the element's value. For Text,
  // it is the textContent.
  function getText(element) {
    if (element instanceof Text) {
      return trim(element.textContent);
    } else if (element instanceof HTMLTextAreaElement ||
               element instanceof HTMLInputElement) {
      return element.value || "";
    }
    var childrenText = "";
    for (var i = 0; i < element.childNodes.length; i++) {
      childrenText += getText(element.childNodes[i]);
    }
    return childrenText;
  }

  // Returns whether |element| is visible.
  function isVisible(element) {
    while (element.style) {
      if (element.style.display == 'none' ||
          element.style.visibility == 'hidden' ||
          element.style.visibility == 'collapse') {
        return false;
      }
      element = element.parentNode;
    }
    return true;
  }

  // Returns an array of the visible elements found in the |elements| array.
  function getVisibleElements(elements) {
    var visibleElements = [];
    for (var i = 0; i < elements.length; i++) {
      if (isVisible(elements[i]))
        visibleElements.push(elements[i]);
    }
    return visibleElements;
  }

  // Finds all the elements which satisfy the xpath query using the context
  // node |context|. This function may throw an exception.
  function findByXPath(context, xpath) {
    var xpathResult =
        document.evaluate(xpath, context, null,
                          XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
    var elements = [];
    for (var i = 0; i < xpathResult.snapshotLength; i++) {
      elements.push(xpathResult.snapshotItem(i));
    }
    return elements;
  }

  // Finds the first element which satisfies the xpath query using the context
  // node |context|. This function may throw an exception.
  function find1ByXPath(context, xpath) {
    var xpathResult =
        document.evaluate(xpath, context, null,
                          XPathResult.FIRST_ORDERED_NODE_TYPE, null);
    return xpathResult.singleNodeValue;
  }

  // Finds all the elements which satisfy the selectors query using the context
  // node |context|. This function may throw an exception.
  function findBySelectors(context, selectors) {
    return getArray(context.querySelectorAll(selectors));
  }

  // Finds the first element which satisfies the selectors query using the
  // context node |context|. This function may throw an exception.
  function find1BySelectors(context, selectors) {
    return context.querySelector(selectors);
  }

  // Finds all the elements which contain |text| using the context
  // node |context|. See getText for details about what constitutes the text
  // of an element. This function may throw an exception.
  function findByText(context, text) {
    // Find all elements containing this text and all inputs containing
    // this text.
    var xpath = ".//*[contains(text(), '" + text + "')] | " +
                ".//input[contains(@value, '" + text + "')]";
    var elements = findByXPath(context, xpath);

    // Limit to what is visible.
    return getVisibleElements(elements);
  }

  // Finds the first element which contains |text| using the context
  // node |context|. See getText for details about what constitutes the text
  // of an element. This function may throw an exception.
  function find1ByText(context, text) {
    var elements = findByText(context, text);
    if (elements.length > 0)
      return findByText(context, text)[0];
    return null;
  }

  //// DOM Element automation methods
  //// See dom_element_proxy.h for method details.

  domAutomation.getDocumentFromFrame = function(element, frameNames) {
    // Find the window this element is in.
    var containingDocument = element.ownerDocument || element;
    var frame = findWindowForDocument(window, containingDocument);

    for (var i = 0; i < frameNames.length; i++) {
      frame = frame.frames[frameNames[i]];
      if (typeof frame == "undefined" || !frame) {
        return null;
      }
    }
    return frame.document;
  }

  domAutomation.findElement = function(context, query) {
    var type = query.type;
    var queryString = query.queryString;
    if (type == "xpath") {
      return find1ByXPath(context, queryString);
    } else if (type == "selectors") {
      return find1BySelectors(context, queryString);
    } else if (type == "text") {
      return find1ByText(context, queryString);
    }
  }

  domAutomation.findElements = function(context, query) {
    var type = query.type;
    var queryString = query.queryString;
    if (type == "xpath") {
      return findByXPath(context, queryString);
    } else if (type == "selectors") {
      return findBySelectors(context, queryString);
    } else if (type == "text") {
      return findByText(context, queryString);
    }
  }

  domAutomation.waitForVisibleElementCount = function(context, query, count,
                                                      callId) {
    (function waitHelper() {
      try {
        var elements = domAutomation.findElements(context, query);
        var visibleElements = getVisibleElements(elements);
        if (visibleElements.length == count)
          onAsyncJavaScriptComplete(callId, visibleElements);
        else if (!didCallFinish(callId))
          window.setTimeout(waitHelper, 500);
      }
      catch (exception) {
        onAsyncJavaScriptError(callId, exception);
      }
    })();
  }

  domAutomation.click = function(element) {
    var evt = document.createEvent('MouseEvents');
    evt.initMouseEvent('click', true, true, window,
                       0, 0, 0, 0, 0, false, false,
                       false, false, 0, null);
    while (element) {
      element.dispatchEvent(evt);
      element = element.parentNode;
    }
  }

  domAutomation.type = function(element, text) {
    if (element instanceof HTMLTextAreaElement ||
        (element instanceof HTMLInputElement && element.type == "text")) {
      element.value += text;
      return true;
    }
    return false;
  }

  domAutomation.setText = function(element, text) {
    if (element instanceof HTMLTextAreaElement ||
        (element instanceof HTMLInputElement && element.type == "text")) {
      element.value = text;
      return true;
    }
    return false;
  }

  domAutomation.getProperty = function(element, property) {
    return element[property];
  }

  domAutomation.getAttribute = function(element, attribute) {
    return element.getAttribute(attribute);
  }

  domAutomation.getValue = function(element, type) {
    if (type == "text") {
      return getText(element);
    } else if (type == "innerhtml") {
      return trim(element.innerHTML);
    } else if (type == "visibility") {
      return isVisible(element);
    } else if (type == "id") {
      return element.id;
    } else if (type == "contentdocument") {
      return element.contentDocument;
    }
  }

  domAutomation.waitForAttribute = function(element, attribute, value, callId) {
    (function waitForAttributeHelper() {
      try {
        if (element.getAttribute(attribute) == value)
          onAsyncJavaScriptComplete(callId);
        else if (!didCallFinish(callId))
          window.setTimeout(waitForAttributeHelper, 200);
      }
      catch (exception) {
        onAsyncJavaScriptError(callId, exception);
      }
    })();
  }
})();
<!DOCTYPE html>
<html id="t" i18n-values="dir:textdirection">
<head>
<title i18n-content="title">
</title>
<style>
body {
 background-color: #fff;
 color: #000;
 font-family: Helvetica, Arial, sans-serif;
 font-size: 83%;
 line-height: 120%;
 max-width: 35em;
 padding: 0.5em 1em;
}
li {
 padding-bottom: .3em;
}
ul {
 margin: .5em 0 0;
 padding-bottom: 0;
}
h1 {
 font-size: 1.5em;
 margin-bottom: 1.5em;
}
h2 {
 font-size: 1em;
 font-weight: bold;
 margin: 0 0 .5em;
 padding: 0;
}
a {
 color: #00c;
}
a:active {
 color: #f00;
}
a:visited {
 color: #551a8b;
}
#errorSummary, #suggestions, #search {
 margin-bottom: 2.5em;
}
</style>
</head>
<body>

<h1 i18n-content="heading"></h1>

<div id="errorSummary" jsselect="summary">
 <p jsvalues=".innerHTML:msg"></p>
</div>

<div id="suggestions">
 <h2 i18n-content="suggestionsHeading"></h2>
 <ul>
  <li jsselect="suggestionsReload">
    <span jsvalues=".innerHTML:msg"></span>
  </li>
  <li jsselect="suggestionsHomepage">
    <span jscontent="suggestionsHomepageMsg"></span>
    <a jscontent="hostName" jsvalues="href:homePage"></a>
  </li>
  <li jsselect="suggestionsLearnMore">
    <span jsvalues=".innerHTML:msg"></span>
  </li>
 </ul>
</div>

</body>
</html>
// Copyright (c) 2009 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

var chrome = chrome || {};
(function () {
  native function GetChromeHidden();
  native function AttachEvent(eventName);
  native function DetachEvent(eventName);

  var chromeHidden = GetChromeHidden();

  // Local implementation of JSON.parse & JSON.stringify that protect us
  // from being clobbered by an extension.
  chromeHidden.JSON = new (function() {
    var $Object = Object;
    var $Array = Array;
    var $jsonStringify = JSON.stringify;
    var $jsonParse = JSON.parse;

    this.stringify = function(thing) {
      var customizedObjectToJSON = $Object.prototype.toJSON;
      var customizedArrayToJSON = $Array.prototype.toJSON;
      if (customizedObjectToJSON !== undefined) {
        $Object.prototype.toJSON = null;
      }
      if (customizedArrayToJSON !== undefined) {
        $Array.prototype.toJSON = null;
      }
      try {
        return $jsonStringify(thing);
      } finally {
        if (customizedObjectToJSON !== undefined) {
          $Object.prototype.toJSON = customizedObjectToJSON;
        }
        if (customizedArrayToJSON !== undefined) {
          $Array.prototype.toJSON = customizedArrayToJSON;
        }
      }
    };

    this.parse = function(thing) {
      return $jsonParse(thing);
    };
  })();

  // Event object.  If opt_eventName is provided, this object represents
  // the unique instance of that named event, and dispatching an event
  // with that name will route through this object's listeners.
  //
  // Example:
  //   chrome.tabs.onChanged = new chrome.Event("tab-changed");
  //   chrome.tabs.onChanged.addListener(function(data) { alert(data); });
  //   chromeHidden.Event.dispatch("tab-changed", "hi");
  // will result in an alert dialog that says 'hi'.
  chrome.Event = function(opt_eventName, opt_argSchemas) {
    this.eventName_ = opt_eventName;
    this.listeners_ = [];

    // Validate event parameters if we are in debug.
    if (opt_argSchemas &&
        chromeHidden.validateCallbacks &&
        chromeHidden.validate) {

      this.validate_ = function(args) {
        try {
          chromeHidden.validate(args, opt_argSchemas);
        } catch (exception) {
          return "Event validation error during " + opt_eventName + " -- " +
                 exception;
        }
      }
    }
  };

  // A map of event names to the event object that is registered to that name.
  var attachedNamedEvents = {};

  // An array of all attached event objects, used for detaching on unload.
  var allAttachedEvents = [];

  chromeHidden.Event = {};

  // Dispatches a named event with the given JSON array, which is deserialized
  // before dispatch. The JSON array is the list of arguments that will be
  // sent with the event callback.
  chromeHidden.Event.dispatchJSON = function(name, args) {
    if (attachedNamedEvents[name]) {
      if (args) {
        args = chromeHidden.JSON.parse(args);
      }
      return attachedNamedEvents[name].dispatch.apply(
          attachedNamedEvents[name], args);
    }
  };

  // Dispatches a named event with the given arguments, supplied as an array.
  chromeHidden.Event.dispatch = function(name, args) {
    if (attachedNamedEvents[name]) {
      attachedNamedEvents[name].dispatch.apply(
          attachedNamedEvents[name], args);
    }
  };

  // Test if a named event has any listeners.
  chromeHidden.Event.hasListener = function(name) {
    return (attachedNamedEvents[name] &&
            attachedNamedEvents[name].listeners_.length > 0);
  }

  // Registers a callback to be called when this event is dispatched.
  chrome.Event.prototype.addListener = function(cb) {
    this.listeners_.push(cb);
    if (this.listeners_.length == 1) {
      this.attach_();
    }
  };

  // Unregisters a callback.
  chrome.Event.prototype.removeListener = function(cb) {
    var idx = this.findListener_(cb);
    if (idx == -1) {
      return;
    }

    this.listeners_.splice(idx, 1);
    if (this.listeners_.length == 0) {
      this.detach_();
    }
  };

  // Test if the given callback is registered for this event.
  chrome.Event.prototype.hasListener = function(cb) {
    return this.findListener_(cb) > -1;
  };

  // Test if any callbacks are registered for this event.
  chrome.Event.prototype.hasListeners = function(cb) {
    return this.listeners_.length > 0;
  };

  // Returns the index of the given callback if registered, or -1 if not
  // found.
  chrome.Event.prototype.findListener_ = function(cb) {
    for (var i = 0; i < this.listeners_.length; i++) {
      if (this.listeners_[i] == cb) {
        return i;
      }
    }

    return -1;
  };

  // Dispatches this event object to all listeners, passing all supplied
  // arguments to this function each listener.
  chrome.Event.prototype.dispatch = function(varargs) {
    var args = Array.prototype.slice.call(arguments);
    if (this.validate_) {
      var validationErrors = this.validate_(args);
      if (validationErrors) {
        return validationErrors;
      }
    }
    for (var i = 0; i < this.listeners_.length; i++) {
      try {
        this.listeners_[i].apply(null, args);
      } catch (e) {
        console.error(e);
      }
    }
  };

  // Attaches this event object to its name.  Only one object can have a given
  // name.
  chrome.Event.prototype.attach_ = function() {
    AttachEvent(this.eventName_);
    allAttachedEvents[allAttachedEvents.length] = this;
    if (!this.eventName_)
      return;

    if (attachedNamedEvents[this.eventName_]) {
      throw new Error("chrome.Event '" + this.eventName_ +
                      "' is already attached.");
    }

    attachedNamedEvents[this.eventName_] = this;
  };

  // Detaches this event object from its name.
  chrome.Event.prototype.detach_ = function() {
    var i = allAttachedEvents.indexOf(this);
    if (i >= 0)
      delete allAttachedEvents[i];
    DetachEvent(this.eventName_);
    if (!this.eventName_)
      return;

    if (!attachedNamedEvents[this.eventName_]) {
      throw new Error("chrome.Event '" + this.eventName_ +
                      "' is not attached.");
    }

    delete attachedNamedEvents[this.eventName_];
  };

  // Special load events: we don't use the DOM unload because that slows
  // down tab shutdown.  On the other hand, onUnload might not always fire,
  // since Chrome will terminate renderers on shutdown (SuddenTermination).
  chromeHidden.onLoad = new chrome.Event();
  chromeHidden.onUnload = new chrome.Event();

  chromeHidden.dispatchOnLoad = function(extensionId) {
    chromeHidden.onLoad.dispatch(extensionId);
  }

  chromeHidden.dispatchOnUnload = function() {
    chromeHidden.onUnload.dispatch();
    for (var i = 0; i < allAttachedEvents.length; ++i) {
      var event = allAttachedEvents[i];
      if (event)
        event.detach_();
    }
  }

  chromeHidden.dispatchError = function(msg) {
    console.error(msg);
  }
})();
// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// extension_apitest.js
// mini-framework for ExtensionApiTest browser tests

var chrome = chrome || {};
(function() {
  chrome.test = chrome.test || {};

  chrome.test.tests = chrome.test.tests || [];

  var completed = false;
  var currentTest = null;
  var lastTest = null;

  function complete() {
    completed = true;

    // Try to get the script to stop running immediately.
    // This isn't an error, just an attempt at saying "done".
    throw "completed";
  }

  // Helper function to get around the fact that function names in javascript
  // are read-only, and you can't assign one to anonymous functions.
  function testName(test) {
    return test ? (test.name || test.generatedName) : "(no test)";
  }

  chrome.test.fail = function(message) {
    if (completed) throw "completed";
    chrome.test.log("(  FAILED  ) " + testName(currentTest));

    var stack = "(no stack available)";
    try {
      crash.me += 0;  // An intentional exception to get the stack trace.
    } catch (e) {
      if (typeof(e.stack) != undefined) {
        stack = e.stack.split("\n");
        stack = stack.slice(2);  // Remove title and fail() lines.
        stack = stack.join("\n");
      }
    }

    if (!message) {
      message = "FAIL (no message)";
    }
    message += "\n" + stack;
    console.log("[FAIL] " + testName(currentTest) + ": " + message);
    chrome.test.notifyFail(message);
    complete();
  };

  function allTestsSucceeded() {
    console.log("All tests succeeded");
    if (completed) throw "completed";

    chrome.test.notifyPass();
    complete();
  }

  var pendingCallbacks = 0;

  chrome.test.callbackAdded = function() {
    pendingCallbacks++;

    return function() {
      pendingCallbacks--;
      if (pendingCallbacks == 0) {
        chrome.test.succeed();
      }
    }
  };

  chrome.test.runNextTest = function() {
    chrome.test.assertEq(pendingCallbacks, 0);
    lastTest = currentTest;
    currentTest = chrome.test.tests.shift();
    if (!currentTest) {
      allTestsSucceeded();
      return;
    }
    try {
      chrome.test.log("( RUN      ) " + testName(currentTest));
      currentTest.call();
    } catch (e) {
      var message = e.stack || "(no stack available)";
      console.log("[FAIL] " + testName(currentTest) + ": " + message);
      chrome.test.notifyFail(message);
      complete();
    }
  };

  chrome.test.succeed = function() {
    console.log("[SUCCESS] " + testName(currentTest));
    chrome.test.log("(  SUCCESS )");
    // Use setTimeout here to allow previous test contexts to be
    // eligible for garbage collection.
    setTimeout(chrome.test.runNextTest, 0);
  };

  chrome.test.assertTrue = function(test, message) {
    chrome.test.assertBool(test, true, message);
  };

  chrome.test.assertFalse = function(test, message) {
    chrome.test.assertBool(test, false, message);
  };

  chrome.test.assertBool = function(test, expected, message) {
    if (test !== expected) {
      if (typeof(test) == "string") {
        if (message) {
          message = test + "\n" + message;
        } else {
          message = test;
        }
      }
      chrome.test.fail(message);
    }
  };

  chrome.test.assertEq = function(expected, actual) {
    if (expected != actual) {
      chrome.test.fail("API Test Error in " + testName(currentTest) +
                       "\nActual: " + actual + "\nExpected: " + expected);
    }
    if (typeof(expected) != typeof(actual)) {
      chrome.test.fail("API Test Error in " + testName(currentTest) +
                       " (type mismatch)\nActual Type: " + typeof(actual) +
                       "\nExpected Type:" + typeof(expected));
    }
  };

  chrome.test.assertNoLastError = function() {
    if (chrome.extension.lastError != undefined) {
      chrome.test.fail("lastError.message == " +
                       chrome.extension.lastError.message);
    }
  };

  function safeFunctionApply(func, arguments) {
    try {
      if (func) {
        func.apply(null, arguments);
      }
    } catch (e) {
      var stack = "(no stack available)";
      if (typeof(e.stack) != "undefined") {
        stack = e.stack.toString();
      }
      var msg = "Exception during execution of callback in " +
                testName(currentTest);
      msg += "\n" + stack;
      console.log("[FAIL] " + testName(currentTest) + ": " + msg);
      chrome.test.notifyFail(msg);
      complete();
    }
  };

  // Wrapper for generating test functions, that takes care of calling
  // assertNoLastError() and (optionally) succeed() for you.
  chrome.test.callback = function(func, expectedError) {
    if (func) {
      chrome.test.assertEq(typeof(func), 'function');
    }
    var callbackCompleted = chrome.test.callbackAdded();

    return function() {
      if (expectedError == null) {
        chrome.test.assertNoLastError();
      } else {
        chrome.test.assertEq(typeof(expectedError), 'string');
        chrome.test.assertEq(expectedError, chrome.extension.lastError.message);
      }

      if (func) {
        safeFunctionApply(func, arguments);
      }

      callbackCompleted();
    };
  };

  chrome.test.listenOnce = function(event, func) {
    var callbackCompleted = chrome.test.callbackAdded();
    var listener = function() {
      event.removeListener(listener);
      safeFunctionApply(func, arguments);
      callbackCompleted();
    };
    event.addListener(listener);
  };

  chrome.test.listenForever = function(event, func) {
    var callbackCompleted = chrome.test.callbackAdded();

    var listener = function() {
      safeFunctionApply(func, arguments);
    };

    var done = function() {
      event.removeListener(listener);
      callbackCompleted();
    };

    event.addListener(listener);
    return done;
  };

  chrome.test.callbackPass = function(func) {
    return chrome.test.callback(func);
  };

  chrome.test.callbackFail = function(expectedError) {
    return chrome.test.callback(null, expectedError);
  };

  chrome.test.runTests = function(tests) {
    chrome.test.tests = tests;
    chrome.test.runNextTest();
  };
})();
// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// This script contains privileged chrome extension related javascript APIs.
// It is loaded by pages whose URL has the chrome-extension protocol.

var chrome = chrome || {};
(function() {
  native function GetExtensionAPIDefinition();
  native function StartRequest();
  native function GetCurrentPageActions(extensionId);
  native function GetExtensionViews();
  native function GetChromeHidden();
  native function GetNextRequestId();
  native function OpenChannelToTab();
  native function GetRenderViewId();
  native function GetPopupParentWindow();
  native function GetPopupView();
  native function SetIconCommon();
  native function IsExtensionProcess();
  native function IsIncognitoProcess();

  var chromeHidden = GetChromeHidden();

  // These bindings are for the extension process only. Since a chrome-extension
  // URL can be loaded in an iframe of a regular renderer, we check here to
  // ensure we don't expose the APIs in that case.
  if (!IsExtensionProcess()) {
    chromeHidden.onLoad.addListener(function (extensionId) {
      if (!extensionId) {
        return;
      }
      chrome.initExtension(extensionId, false);
    });
    return;
  }

  if (!chrome)
    chrome = {};

  // Validate arguments.
  chromeHidden.validationTypes = [];
  chromeHidden.validate = function(args, schemas) {
    if (args.length > schemas.length)
      throw new Error("Too many arguments.");

    for (var i = 0; i < schemas.length; i++) {
      if (i in args && args[i] !== null && args[i] !== undefined) {
        var validator = new chromeHidden.JSONSchemaValidator();
        validator.addTypes(chromeHidden.validationTypes);
        validator.validate(args[i], schemas[i]);
        if (validator.errors.length == 0)
          continue;

        var message = "Invalid value for argument " + i + ". ";
        for (var i = 0, err; err = validator.errors[i]; i++) {
          if (err.path) {
            message += "Property '" + err.path + "': ";
          }
          message += err.message;
          message = message.substring(0, message.length - 1);
          message += ", ";
        }
        message = message.substring(0, message.length - 2);
        message += ".";

        throw new Error(message);
      } else if (!schemas[i].optional) {
        throw new Error("Parameter " + i + " is required.");
      }
    }
  }

  // Callback handling.
  var requests = [];
  chromeHidden.handleResponse = function(requestId, name,
                                         success, response, error) {
    try {
      var request = requests[requestId];
      if (success) {
        delete chrome.extension.lastError;
      } else {
        if (!error) {
          error = "Unknown error."
        }
        console.error("Error during " + name + ": " + error);
        chrome.extension.lastError = {
          "message": error
        };
      }

      if (request.customCallback) {
        request.customCallback(name, request, response);
      }

      if (request.callback) {
        // Callbacks currently only support one callback argument.
        var callbackArgs = response ? [chromeHidden.JSON.parse(response)] : [];

        // Validate callback in debug only -- and only when the
        // caller has provided a callback. Implementations of api
        // calls my not return data if they observe the caller
        // has not provided a callback.
        if (chromeHidden.validateCallbacks && !error) {
          try {
            if (!request.callbackSchema.parameters) {
              throw "No callback schemas defined";
            }

            if (request.callbackSchema.parameters.length > 1) {
              throw "Callbacks may only define one parameter";
            }

            chromeHidden.validate(callbackArgs,
                request.callbackSchema.parameters);
          } catch (exception) {
            return "Callback validation error during " + name + " -- " +
                   exception;
          }
        }

        if (response) {
          request.callback(callbackArgs[0]);
        } else {
          request.callback();
        }
      }
    } finally {
      delete requests[requestId];
      delete chrome.extension.lastError;
    }
  };

  chromeHidden.setViewType = function(type) {
    var modeClass = "chrome-" + type;
    var className = document.documentElement.className;
    if (className && className.length) {
      var classes = className.split(" ");
      var new_classes = [];
      classes.forEach(function(cls) {
        if (cls.indexOf("chrome-") != 0) {
          new_classes.push(cls);
        }
      });
      new_classes.push(modeClass);
      document.documentElement.className = new_classes.join(" ");
    } else {
      document.documentElement.className = modeClass;
    }
  };

  function prepareRequest(args, argSchemas) {
    var request = {};
    var argCount = args.length;

    // Look for callback param.
    if (argSchemas.length > 0 &&
        args.length == argSchemas.length &&
        argSchemas[argSchemas.length - 1].type == "function") {
      request.callback = args[argSchemas.length - 1];
      request.callbackSchema = argSchemas[argSchemas.length - 1];
      --argCount;
    }

    request.args = [];
    for (var k = 0; k < argCount; k++) {
      request.args[k] = args[k];
    }

    return request;
  }

  // Send an API request and optionally register a callback.
  function sendRequest(functionName, args, argSchemas, customCallback) {
    var request = prepareRequest(args, argSchemas);
    if (customCallback) {
      request.customCallback = customCallback;
    }
    // JSON.stringify doesn't support a root object which is undefined.
    if (request.args === undefined)
      request.args = null;

    var sargs = chromeHidden.JSON.stringify(request.args);

    var requestId = GetNextRequestId();
    requests[requestId] = request;
    var hasCallback = (request.callback || customCallback) ? true : false;
    return StartRequest(functionName, sargs, requestId, hasCallback);
  }

  // Send a special API request that is not JSON stringifiable, and optionally
  // register a callback.
  function sendCustomRequest(nativeFunction, functionName, args, argSchemas) {
    var request = prepareRequest(args, argSchemas);
    var requestId = GetNextRequestId();
    requests[requestId] = request;
    return nativeFunction(functionName, request.args, requestId,
                          request.callback ? true : false);
  }

  function bind(obj, func) {
    return function() {
      return func.apply(obj, arguments);
    };
  }

  // Helper function for positioning pop-up windows relative to DOM objects.
  // Returns the absolute position of the given element relative to the hosting
  // browser frame.
  function findAbsolutePosition(domElement) {
    var left = domElement.offsetLeft;
    var top = domElement.offsetTop;

    // Ascend through the parent hierarchy, taking into account object nesting
    // and scoll positions.
    for (var parentElement = domElement.offsetParent; parentElement;
         parentElement = parentElement.offsetParent) {
      left += parentElement.offsetLeft;
      top += parentElement.offsetTop;

      left -= parentElement.scrollLeft;
      top -= parentElement.scrollTop;
    }

    return {
      top: top,
      left: left
    };
  }

  // Returns the coordiates of the rectangle encompassing the domElement,
  // in browser coordinates relative to the frame hosting the element.
  function getAbsoluteRect(domElement) {
    var rect = findAbsolutePosition(domElement);
    rect.width = domElement.offsetWidth || 0;
    rect.height = domElement.offsetHeight || 0;
    return rect;
  }

  // --- Setup additional api's not currently handled in common/extensions/api

  // Page action events send (pageActionId, {tabId, tabUrl}).
  function setupPageActionEvents(extensionId) {
    var pageActions = GetCurrentPageActions(extensionId);

    var oldStyleEventName = "pageActions/" + extensionId;
    // TODO(EXTENSIONS_DEPRECATED): only one page action
    for (var i = 0; i < pageActions.length; ++i) {
      // Setup events for each extension_id/page_action_id string we find.
      chrome.pageActions[pageActions[i]] = new chrome.Event(oldStyleEventName);
    }
  }

  function setupToolstripEvents(renderViewId) {
    chrome.toolstrip = chrome.toolstrip || {};
    chrome.toolstrip.onExpanded =
        new chrome.Event("toolstrip.onExpanded." + renderViewId);
    chrome.toolstrip.onCollapsed =
        new chrome.Event("toolstrip.onCollapsed." + renderViewId);
  }

  function setupPopupEvents(renderViewId) {
    chrome.experimental.popup = chrome.experimental.popup || {};
    chrome.experimental.popup.onClosed =
      new chrome.Event("experimental.popup.onClosed." + renderViewId);
  }

  function setupHiddenContextMenuEvent(extensionId) {
    chromeHidden.contextMenus = {};
    chromeHidden.contextMenus.nextId = 1;
    chromeHidden.contextMenus.handlers = {};
    var eventName = "contextMenus/" + extensionId;
    chromeHidden.contextMenus.event = new chrome.Event(eventName);
    chromeHidden.contextMenus.ensureListenerSetup = function() {
      if (chromeHidden.contextMenus.listening) {
        return;
      }
      chromeHidden.contextMenus.listening = true;
      chromeHidden.contextMenus.event.addListener(function() {
        // An extension context menu item has been clicked on - fire the onclick
        // if there is one.
        var id = arguments[0].menuItemId;
        var onclick = chromeHidden.contextMenus.handlers[id];
        if (onclick) {
          onclick.apply(null, arguments);
        }
      });
    };
  }

  function setupOmniboxEvents(extensionId) {
    chrome.experimental.omnibox.onInputChanged.dispatch =
        function(text, requestId) {
      var suggestCallback = function(suggestions) {
        chrome.experimental.omnibox.sendSuggestions(requestId, suggestions);
      }
      chrome.Event.prototype.dispatch.apply(this, [text, suggestCallback]);
    };
  }

  chromeHidden.onLoad.addListener(function (extensionId) {
    if (!extensionId) {
      return;
    }
    chrome.initExtension(extensionId, false, IsIncognitoProcess());

    // |apiFunctions| is a hash of name -> object that stores the
    // name & definition of the apiFunction. Custom handling of api functions
    // is implemented by adding a "handleRequest" function to the object.
    var apiFunctions = {};

    // Read api definitions and setup api functions in the chrome namespace.
    // TODO(rafaelw): Consider defining a json schema for an api definition
    //   and validating either here, in a unit_test or both.
    // TODO(rafaelw): Handle synchronous functions.
    // TOOD(rafaelw): Consider providing some convenient override points
    //   for api functions that wish to insert themselves into the call.
    var apiDefinitions = chromeHidden.JSON.parse(GetExtensionAPIDefinition());

    apiDefinitions.forEach(function(apiDef) {
      var module = chrome;
      var namespaces = apiDef.namespace.split('.');
      for (var index = 0, name; name = namespaces[index]; index++) {
        module[name] = module[name] || {};
        module = module[name];
      };

      // Add types to global validationTypes
      if (apiDef.types) {
        apiDef.types.forEach(function(t) {
          chromeHidden.validationTypes.push(t);
        });
      }

      // Setup Functions.
      if (apiDef.functions) {
        apiDef.functions.forEach(function(functionDef) {
          // Module functions may have been defined earlier by hand. Don't
          // clobber them.
          if (module[functionDef.name])
            return;

          var apiFunction = {};
          apiFunction.definition = functionDef;
          apiFunction.name = apiDef.namespace + "." + functionDef.name;
          apiFunctions[apiFunction.name] = apiFunction;

          module[functionDef.name] = bind(apiFunction, function() {
            var args = arguments;
            if (this.updateArguments) {
              // Functions whose signature has changed can define an
              // |updateArguments| function to transform old argument lists
              // into the new form, preserving compatibility.
              // TODO(skerner): Once optional args can be omitted (crbug/29215),
              // this mechanism will become unnecessary.  Consider removing it
              // when crbug/29215 is fixed.
              args = this.updateArguments.apply(this, args);
            }
            chromeHidden.validate(args, this.definition.parameters);

            var retval;
            if (this.handleRequest) {
              retval = this.handleRequest.apply(this, args);
            } else {
              retval = sendRequest(this.name, args,
                                   this.definition.parameters,
                                   this.customCallback);
            }

            // Validate return value if defined - only in debug.
            if (chromeHidden.validateCallbacks &&
                chromeHidden.validate &&
                this.definition.returns) {
              chromeHidden.validate([retval], [this.definition.returns]);
            }
            return retval;
          });
        });
      }

      // Setup Events
      if (apiDef.events) {
        apiDef.events.forEach(function(eventDef) {
          // Module events may have been defined earlier by hand. Don't clobber
          // them.
          if (module[eventDef.name])
            return;

          var eventName = apiDef.namespace + "." + eventDef.name;
          if (eventDef.perExtensionEvent)
            eventName = eventName + "/" + extensionId;
          module[eventDef.name] = new chrome.Event(eventName,
              eventDef.parameters);
        });
      }


      // Parse any values defined for properties.
      if (apiDef.properties) {
        for (var prop in apiDef.properties) {
          if (!apiDef.properties.hasOwnProperty(prop))
            continue;

          var property = apiDef.properties[prop];
          if (property.value) {
            var value = property.value;
            if (property.type === 'integer') {
              value = parseInt(value);
            } else if (property.type === 'boolean') {
              value = value === "true";
            } else if (property.type !== 'string') {
              throw "NOT IMPLEMENTED (extension_api.json error): Cannot " +
                  "parse values for type \"" + property.type + "\"";
            }
            module[prop] = value;
          }
        }
      }

      // getTabContentses is retained for backwards compatibility
      // See http://crbug.com/21433
      chrome.extension.getTabContentses = chrome.extension.getExtensionTabs
    });

    apiFunctions["tabs.connect"].handleRequest = function(tabId, connectInfo) {
      var name = "";
      if (connectInfo) {
        name = connectInfo.name || name;
      }
      var portId = OpenChannelToTab(
          tabId, chromeHidden.extensionId, name);
      return chromeHidden.Port.createPort(portId, name);
    };

    apiFunctions["tabs.sendRequest"].handleRequest =
        function(tabId, request, responseCallback) {
      var port = chrome.tabs.connect(tabId,
                                     {name: chromeHidden.kRequestChannel});
      port.postMessage(request);
      port.onMessage.addListener(function(response) {
        if (responseCallback)
          responseCallback(response);
        port.disconnect();
      });
    };

    apiFunctions["extension.getViews"].handleRequest = function(properties) {
      var windowId = -1;
      var type = "ALL";
      if (typeof(properties) != "undefined") {
        if (typeof(properties.type) != "undefined") {
          type = properties.type;
        }
        if (typeof(properties.windowId) != "undefined") {
          windowId = properties.windowId;
        }
      }
      return GetExtensionViews(windowId, type) || null;
    };

    apiFunctions["extension.getBackgroundPage"].handleRequest = function() {
      return GetExtensionViews(-1, "BACKGROUND")[0] || null;
    };

    apiFunctions["extension.getToolstrips"].handleRequest =
        function(windowId) {
      if (typeof(windowId) == "undefined")
        windowId = -1;
      return GetExtensionViews(windowId, "TOOLSTRIP");
    };

    apiFunctions["extension.getExtensionTabs"].handleRequest =
        function(windowId) {
      if (typeof(windowId) == "undefined")
        windowId = -1;
      return GetExtensionViews(windowId, "TAB");
    };

    apiFunctions["devtools.getTabEvents"].handleRequest = function(tabId) {
      var tabIdProxy = {};
      var functions = ["onPageEvent", "onTabClose"];
      functions.forEach(function(name) {
        // Event disambiguation is handled by name munging.  See
        // chrome/browser/extensions/extension_devtools_events.h for the C++
        // equivalent of this logic.
        tabIdProxy[name] = new chrome.Event("devtools." + tabId + "." + name);
      });
      return tabIdProxy;
    };

    apiFunctions["experimental.popup.show"].handleRequest =
        function(url, showDetails, callback) {
      // Second argument is a transform from HTMLElement to Rect.
      var internalSchema = [
        this.definition.parameters[0],
        {
          type: "object",
          name: "showDetails",
          properties: {
            domAnchor: {
              type: "object",
              properties: {
                top: { type: "integer", minimum: 0 },
                left: { type: "integer", minimum: 0 },
                width: { type: "integer", minimum: 0 },
                height: { type: "integer", minimum: 0 }
              }
            },
            giveFocus: {
              type: "boolean",
              optional: true
            },
            borderStyle: {
              type: "string",
              optional: true,
              enum: ["bubble", "rectangle"]
            }
          }
        },
        this.definition.parameters[2]
      ];
      return sendRequest(this.name,
                         [url,
                          {
                            domAnchor: getAbsoluteRect(showDetails.relativeTo),
                            giveFocus: showDetails.giveFocus,
                            borderStyle: showDetails.borderStyle
                          },
                          callback],
                         internalSchema);
    };

    apiFunctions["experimental.extension.getPopupView"].handleRequest =
        function() {
      return GetPopupView();
    };

    apiFunctions["experimental.popup.getParentWindow"].handleRequest =
        function() {
      return GetPopupParentWindow();
    };

    var canvas;
    function setIconCommon(details, name, parameters, actionType, iconSize,
                           nativeFunction) {
      if ("iconIndex" in details) {
        sendRequest(name, [details], parameters);
      } else if ("imageData" in details) {
        // Verify that this at least looks like an ImageData element.
        // Unfortunately, we cannot use instanceof because the ImageData
        // constructor is not public.
        //
        // We do this manually instead of using JSONSchema to avoid having these
        // properties show up in the doc.
        if (!("width" in details.imageData) ||
            !("height" in details.imageData) ||
            !("data" in details.imageData)) {
          throw new Error(
              "The imageData property must contain an ImageData object.");
        }

        if (details.imageData.width > iconSize ||
            details.imageData.height > iconSize) {
          throw new Error(
              "The imageData property must contain an ImageData object that " +
              "is no larger than " + iconSize + " pixels square.");
        }

        sendCustomRequest(nativeFunction, name, [details], parameters);
      } else if ("path" in details) {
        var img = new Image();
        img.onerror = function() {
          console.error("Could not load " + actionType + " icon '" +
                        details.path + "'.");
        }
        img.onload = function() {
          var canvas = document.createElement("canvas");
          canvas.width = img.width > iconSize ? iconSize : img.width;
          canvas.height = img.height > iconSize ? iconSize : img.height;

          var canvas_context = canvas.getContext('2d');
          canvas_context.clearRect(0, 0, canvas.width, canvas.height);
          canvas_context.drawImage(img, 0, 0, canvas.width, canvas.height);
          delete details.path;
          details.imageData = canvas_context.getImageData(0, 0, canvas.width,
                                                          canvas.height);
          sendCustomRequest(nativeFunction, name, [details], parameters);
        }
        img.src = details.path;
      } else {
        throw new Error(
            "Either the path or imageData property must be specified.");
      }
    }

    function setExtensionActionIconCommon(details, name, parameters,
                                          actionType) {
      var EXTENSION_ACTION_ICON_SIZE = 19;
      setIconCommon(details, name, parameters, actionType,
                    EXTENSION_ACTION_ICON_SIZE, SetIconCommon);
    }

    apiFunctions["browserAction.setIcon"].handleRequest = function(details) {
      setExtensionActionIconCommon(
          details, this.name, this.definition.parameters, "browser action");
    };

    apiFunctions["pageAction.setIcon"].handleRequest = function(details) {
      setExtensionActionIconCommon(
          details, this.name, this.definition.parameters, "page action");
    };

    apiFunctions["experimental.sidebar.setIcon"].handleRequest =
        function(details) {
      var SIDEBAR_ICON_SIZE = 16;
      setIconCommon(
          details, this.name, this.definition.parameters, "sidebar",
          SIDEBAR_ICON_SIZE, SetIconCommon);
    };

    apiFunctions["contextMenus.create"].handleRequest =
        function() {
      var args = arguments;
      var id = chromeHidden.contextMenus.nextId++;
      args[0].generatedId = id;
      sendRequest(this.name, args, this.definition.parameters,
                  this.customCallback);
      return id;
    };

    apiFunctions["contextMenus.create"].customCallback =
        function(name, request, response) {
      if (chrome.extension.lastError) {
        return;
      }

      var id = request.args[0].generatedId;

      // Set up the onclick handler if we were passed one in the request.
      var onclick = request.args.length ? request.args[0].onclick : null;
      if (onclick) {
        chromeHidden.contextMenus.ensureListenerSetup();
        chromeHidden.contextMenus.handlers[id] = onclick;
      }
    };

    apiFunctions["contextMenus.remove"].customCallback =
        function(name, request, response) {
      if (chrome.extension.lastError) {
        return;
      }
      var id = request.args[0];
      delete chromeHidden.contextMenus.handlers[id];
    };

    apiFunctions["contextMenus.update"].customCallback =
        function(name, request, response) {
      if (chrome.extension.lastError) {
        return;
      }
      var id = request.args[0];
      if (request.args[1].onclick) {
        chromeHidden.contextMenus.handlers[id] = request.args[1].onclick;
      }
    };

    apiFunctions["contextMenus.removeAll"].customCallback =
        function(name, request, response) {
      if (chrome.extension.lastError) {
        return;
      }
      chromeHidden.contextMenus.handlers = {};
    };

    apiFunctions["tabs.captureVisibleTab"].updateArguments = function() {
      // Old signature:
      //    captureVisibleTab(int windowId, function callback);
      // New signature:
      //    captureVisibleTab(int windowId, object details, function callback);
      //
      // TODO(skerner): The next step to omitting optional arguments is the
      // replacement of this code with code that matches arguments by type.
      // Once this is working for captureVisibleTab() it can be enabled for
      // the rest of the API. See crbug/29215 .
      if (arguments.length == 2 && typeof(arguments[1]) == "function") {
        // If the old signature is used, add a null details object.
        newArgs = [arguments[0], null, arguments[1]];
      } else {
        newArgs = arguments;
      }
      return newArgs;
    };

    apiFunctions["experimental.omnibox.styleNone"].handleRequest =
        function(offset) {
      return {type: "none", offset: offset};
    }
    apiFunctions["experimental.omnibox.styleUrl"].handleRequest =
        function(offset) {
      return {type: "url", offset: offset};
    }
    apiFunctions["experimental.omnibox.styleMatch"].handleRequest =
        function(offset) {
      return {type: "match", offset: offset};
    }
    apiFunctions["experimental.omnibox.styleDim"].handleRequest =
        function(offset) {
      return {type: "dim", offset: offset};
    }

    if (chrome.test) {
      chrome.test.getApiDefinitions = GetExtensionAPIDefinition;
    }

    setupPageActionEvents(extensionId);
    setupToolstripEvents(GetRenderViewId());
    setupPopupEvents(GetRenderViewId());
    setupHiddenContextMenuEvent(extensionId);
    setupOmniboxEvents(extensionId);
  });

  if (!chrome.experimental)
    chrome.experimental = {};

  if (!chrome.experimental.accessibility)
    chrome.experimental.accessibility = {};

  if (!chrome.experimental.tts)
    chrome.experimental.tts = {};
})();
// Copyright (c) 2009 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// -----------------------------------------------------------------------------
// NOTE: If you change this file you need to touch renderer_resources.grd to
// have your change take effect.
// -----------------------------------------------------------------------------

// Partial implementation of the Greasemonkey API, see:
// http://wiki.greasespot.net/Greasemonkey_Manual:APIs

function GM_addStyle(css) {
  var parent = document.getElementsByTagName("head")[0];
  if (!parent) {
    parent = document.documentElement;
  }
  var style = document.createElement("style");
  style.type = "text/css";
  var textNode = document.createTextNode(css);
  style.appendChild(textNode);
  parent.appendChild(style);
}

function GM_xmlhttpRequest(details) {
  function setupEvent(xhr, url, eventName, callback) {
    xhr[eventName] = function () {
      var isComplete = xhr.readyState == 4;
      var responseState = {
        responseText: xhr.responseText,
        readyState: xhr.readyState,
        responseHeaders: isComplete ? xhr.getAllResponseHeaders() : "",
        status: isComplete ? xhr.status : 0,
        statusText: isComplete ? xhr.statusText : "",
        finalUrl: isComplete ? url : ""
      };
      callback(responseState);
    };
  }

  var xhr = new XMLHttpRequest();
  var eventNames = ["onload", "onerror", "onreadystatechange"];
  for (var i = 0; i < eventNames.length; i++ ) {
    var eventName = eventNames[i];
    if (eventName in details) {
      setupEvent(xhr, details.url, eventName, details[eventName]);
    }
  }

  xhr.open(details.method, details.url);

  if (details.overrideMimeType) {
    xhr.overrideMimeType(details.overrideMimeType);
  }
  if (details.headers) {
    for (var header in details.headers) {
      xhr.setRequestHeader(header, details.headers[header]);
    }
  }
  xhr.send(details.data ? details.data : null);
}

function GM_openInTab(url) {
  window.open(url, "");
}

function GM_log(message) {
  window.console.log(message);
}

(function() {
  var apis = ["GM_getValue", "GM_setValue", "GM_registerMenuCommand"];
  for (var i = 0, api; api = apis[i]; i++) {
    window[api] = function() {
      console.log("%s is not supported.", api);
    }
  }
})();
// Copyright (c) 2009 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// -----------------------------------------------------------------------------
// NOTE: If you change this file you need to touch renderer_resources.grd to
// have your change take effect.
// -----------------------------------------------------------------------------

//==============================================================================
// This file contains a class that implements a subset of JSON Schema.
// See: http://www.json.com/json-schema-proposal/ for more details.
//
// The following features of JSON Schema are not implemented:
// - requires
// - unique
// - disallow
// - union types (but replaced with 'choices')
//
// The following properties are not applicable to the interface exposed by
// this class:
// - options
// - readonly
// - title
// - description
// - format
// - default
// - transient
// - hidden
//
// There are also these departures from the JSON Schema proposal:
// - function and undefined types are supported
// - null counts as 'unspecified' for optional values
// - added the 'choices' property, to allow specifying a list of possible types
//   for a value
// - by default an "object" typed schema does not allow additional properties.
//   if present, "additionalProperties" is to be a schema against which all
//   additional properties will be validated.
//==============================================================================

(function() {
native function GetChromeHidden();
var chromeHidden = GetChromeHidden();

/**
 * Validates an instance against a schema and accumulates errors. Usage:
 *
 * var validator = new chromeHidden.JSONSchemaValidator();
 * validator.validate(inst, schema);
 * if (validator.errors.length == 0)
 *   console.log("Valid!");
 * else
 *   console.log(validator.errors);
 *
 * The errors property contains a list of objects. Each object has two
 * properties: "path" and "message". The "path" property contains the path to
 * the key that had the problem, and the "message" property contains a sentence
 * describing the error.
 */
chromeHidden.JSONSchemaValidator = function() {
  this.errors = [];
  this.types = [];
};

chromeHidden.JSONSchemaValidator.messages = {
  invalidEnum: "Value must be one of: [*].",
  propertyRequired: "Property is required.",
  unexpectedProperty: "Unexpected property.",
  arrayMinItems: "Array must have at least * items.",
  arrayMaxItems: "Array must not have more than * items.",
  itemRequired: "Item is required.",
  stringMinLength: "String must be at least * characters long.",
  stringMaxLength: "String must not be more than * characters long.",
  stringPattern: "String must match the pattern: *.",
  numberFiniteNotNan: "Value must not be *.",
  numberMinValue: "Value must not be less than *.",
  numberMaxValue: "Value must not be greater than *.",
  numberMaxDecimal: "Value must not have more than * decimal places.",
  invalidType: "Expected '*' but got '*'.",
  invalidChoice: "Value does not match any valid type choices.",
  invalidPropertyType: "Missing property type.",
  schemaRequired: "Schema value required.",
  unknownSchemaReference: "Unknown schema reference: *.",
  notInstance: "Object must be an instance of *."
};

/**
 * Builds an error message. Key is the property in the |errors| object, and
 * |opt_replacements| is an array of values to replace "*" characters with.
 */
chromeHidden.JSONSchemaValidator.formatError = function(key, opt_replacements) {
  var message = this.messages[key];
  if (opt_replacements) {
    for (var i = 0; i < opt_replacements.length; i++) {
      message = message.replace("*", opt_replacements[i]);
    }
  }
  return message;
};

/**
 * Classifies a value as one of the JSON schema primitive types. Note that we
 * don't explicitly disallow 'function', because we want to allow functions in
 * the input values.
 */
chromeHidden.JSONSchemaValidator.getType = function(value) {
  var s = typeof value;

  if (s == "object") {
    if (value === null) {
      return "null";
    } else if (value instanceof Array ||
               Object.prototype.toString.call(value) == "[Object Array]") {
      return "array";
    }
  } else if (s == "number") {
    if (value % 1 == 0) {
      return "integer";
    }
  }

  return s;
};

/**
 * Add types that may be referenced by validated schemas that reference them
 * with "$ref": <typeId>. Each type must be a valid schema and define an
 * "id" property.
 */
chromeHidden.JSONSchemaValidator.prototype.addTypes = function(typeOrTypeList) {
  function addType(validator, type) {
    if(!type.id)
      throw "Attempt to addType with missing 'id' property";
    validator.types[type.id] = type;
  }

  if (typeOrTypeList instanceof Array) {
    for (var i = 0; i < typeOrTypeList.length; i++) {
      addType(this, typeOrTypeList[i]);
    }
  } else {
    addType(this, typeOrTypeList);
  }
}

/**
 * Validates an instance against a schema. The instance can be any JavaScript
 * value and will be validated recursively. When this method returns, the
 * |errors| property will contain a list of errors, if any.
 */
chromeHidden.JSONSchemaValidator.prototype.validate = function(
    instance, schema, opt_path) {
  var path = opt_path || "";

  if (!schema) {
    this.addError(path, "schemaRequired");
    return;
  }

  // If this schema defines itself as reference type, save it in this.types.
  if (schema.id)
    this.types[schema.id] = schema;

  // If the schema has an extends property, the instance must validate against
  // that schema too.
  if (schema.extends)
    this.validate(instance, schema.extends, path);

  // If the schema has a $ref property, the instance must validate against
  // that schema too. It must be present in this.types to be referenced.
  if (schema["$ref"]) {
    if (!this.types[schema["$ref"]])
      this.addError(path, "unknownSchemaReference", [ schema["$ref"] ]);
    else
      this.validate(instance, this.types[schema["$ref"]], path)
  }

  // If the schema has a choices property, the instance must validate against at
  // least one of the items in that array.
  if (schema.choices) {
    this.validateChoices(instance, schema, path);
    return;
  }

  // If the schema has an enum property, the instance must be one of those
  // values.
  if (schema.enum) {
    if (!this.validateEnum(instance, schema, path))
      return;
  }

  if (schema.type && schema.type != "any") {
    if (!this.validateType(instance, schema, path))
      return;

    // Type-specific validation.
    switch (schema.type) {
      case "object":
        this.validateObject(instance, schema, path);
        break;
      case "array":
        this.validateArray(instance, schema, path);
        break;
      case "string":
        this.validateString(instance, schema, path);
        break;
      case "number":
      case "integer":
        this.validateNumber(instance, schema, path);
        break;
    }
  }
};

/**
 * Validates an instance against a choices schema. The instance must match at
 * least one of the provided choices.
 */
chromeHidden.JSONSchemaValidator.prototype.validateChoices = function(
    instance, schema, path) {
  var originalErrors = this.errors;

  for (var i = 0; i < schema.choices.length; i++) {
    this.errors = [];
    this.validate(instance, schema.choices[i], path);
    if (this.errors.length == 0) {
      this.errors = originalErrors;
      return;
    }
  }

  this.errors = originalErrors;
  this.addError(path, "invalidChoice");
};

/**
 * Validates an instance against a schema with an enum type. Populates the
 * |errors| property, and returns a boolean indicating whether the instance
 * validates.
 */
chromeHidden.JSONSchemaValidator.prototype.validateEnum = function(
    instance, schema, path) {
  for (var i = 0; i < schema.enum.length; i++) {
    if (instance === schema.enum[i])
      return true;
  }

  this.addError(path, "invalidEnum", [schema.enum.join(", ")]);
  return false;
};

/**
 * Validates an instance against an object schema and populates the errors
 * property.
 */
chromeHidden.JSONSchemaValidator.prototype.validateObject = function(
    instance, schema, path) {
  for (var prop in schema.properties) {
    // It is common in JavaScript to add properties to Object.prototype. This
    // check prevents such additions from being interpreted as required schema
    // properties.
    // TODO(aa): If it ever turns out that we actually want this to work, there
    // are other checks we could put here, like requiring that schema properties
    // be objects that have a 'type' property.
    if (!schema.properties.hasOwnProperty(prop))
      continue;

    var propPath = path ? path + "." + prop : prop;
    if (schema.properties[prop] == undefined) {
      this.addError(propPath, "invalidPropertyType");
    } else if (prop in instance && instance[prop] !== undefined) {
      this.validate(instance[prop], schema.properties[prop], propPath);
    } else if (!schema.properties[prop].optional) {
      this.addError(propPath, "propertyRequired");
    }
  }

  // If "instanceof" property is set, check that this object inherits from
  // the specified constructor (function).
  if (schema.isInstanceOf) {
    var isInstance = function() {
      var constructor = this[schema.isInstanceOf];
      if (constructor) {
        return (instance instanceof constructor);
      }

      // Special-case constructors that can not always be found on the global
      // object, but for which we to allow validation.
      var allowedNamedConstructors = {
        "DOMWindow": true,
        "ImageData": true
      }
      if (!allowedNamedConstructors[schema.isInstanceOf]) {
        throw "Attempt to validate against an instance ctor that could not be" +
              "found: " + schema.isInstanceOf;
      }
      return (schema.isInstanceOf == instance.constructor.name)
    }();

    if (!isInstance)
      this.addError(propPath, "notInstance", [schema.isInstanceOf]);
  }

  // Exit early from additional property check if "type":"any" is defined.
  if (schema.additionalProperties &&
      schema.additionalProperties.type &&
      schema.additionalProperties.type == "any") {
    return;
  }

  // By default, additional properties are not allowed on instance objects. This
  // can be overridden by setting the additionalProperties property to a schema
  // which any additional properties must validate against.
  for (var prop in instance) {
    if (prop in schema.properties)
      continue;

    // Any properties inherited through the prototype are ignored.
    if (!instance.hasOwnProperty(prop))
      continue;

    var propPath = path ? path + "." + prop : prop;
    if (schema.additionalProperties)
      this.validate(instance[prop], schema.additionalProperties, propPath);
    else
      this.addError(propPath, "unexpectedProperty");
  }
};

/**
 * Validates an instance against an array schema and populates the errors
 * property.
 */
chromeHidden.JSONSchemaValidator.prototype.validateArray = function(
    instance, schema, path) {
  var typeOfItems = chromeHidden.JSONSchemaValidator.getType(schema.items);

  if (typeOfItems == 'object') {
    if (schema.minItems && instance.length < schema.minItems) {
      this.addError(path, "arrayMinItems", [schema.minItems]);
    }

    if (typeof schema.maxItems != "undefined" &&
        instance.length > schema.maxItems) {
      this.addError(path, "arrayMaxItems", [schema.maxItems]);
    }

    // If the items property is a single schema, each item in the array must
    // have that schema.
    for (var i = 0; i < instance.length; i++) {
      this.validate(instance[i], schema.items, path + "." + i);
    }
  } else if (typeOfItems == 'array') {
    // If the items property is an array of schemas, each item in the array must
    // validate against the corresponding schema.
    for (var i = 0; i < schema.items.length; i++) {
      var itemPath = path ? path + "." + i : String(i);
      if (i in instance && instance[i] !== null && instance[i] !== undefined) {
        this.validate(instance[i], schema.items[i], itemPath);
      } else if (!schema.items[i].optional) {
        this.addError(itemPath, "itemRequired");
      }
    }

    if (schema.additionalProperties) {
      for (var i = schema.items.length; i < instance.length; i++) {
        var itemPath = path ? path + "." + i : String(i);
        this.validate(instance[i], schema.additionalProperties, itemPath);
      }
    } else {
      if (instance.length > schema.items.length) {
        this.addError(path, "arrayMaxItems", [schema.items.length]);
      }
    }
  }
};

/**
 * Validates a string and populates the errors property.
 */
chromeHidden.JSONSchemaValidator.prototype.validateString = function(
    instance, schema, path) {
  if (schema.minLength && instance.length < schema.minLength)
    this.addError(path, "stringMinLength", [schema.minLength]);

  if (schema.maxLength && instance.length > schema.maxLength)
    this.addError(path, "stringMaxLength", [schema.maxLength]);

  if (schema.pattern && !schema.pattern.test(instance))
    this.addError(path, "stringPattern", [schema.pattern]);
};

/**
 * Validates a number and populates the errors property. The instance is
 * assumed to be a number.
 */
chromeHidden.JSONSchemaValidator.prototype.validateNumber = function(
    instance, schema, path) {

  // Forbid NaN, +Infinity, and -Infinity.  Our APIs don't use them, and
  // JSON serialization encodes them as 'null'.  Re-evaluate supporting
  // them if we add an API that could reasonably take them as a parameter.
  if (isNaN(instance) ||
      instance == Number.POSITIVE_INFINITY ||
      instance == Number.NEGATIVE_INFINITY )
    this.addError(path, "numberFiniteNotNan", [instance]);

  if (schema.minimum && instance < schema.minimum)
    this.addError(path, "numberMinValue", [schema.minimum]);

  if (schema.maximum && instance > schema.maximum)
    this.addError(path, "numberMaxValue", [schema.maximum]);

  if (schema.maxDecimal && instance * Math.pow(10, schema.maxDecimal) % 1)
    this.addError(path, "numberMaxDecimal", [schema.maxDecimal]);
};

/**
 * Validates the primitive type of an instance and populates the errors
 * property. Returns true if the instance validates, false otherwise.
 */
chromeHidden.JSONSchemaValidator.prototype.validateType = function(
    instance, schema, path) {
  var actualType = chromeHidden.JSONSchemaValidator.getType(instance);
  if (schema.type != actualType && !(schema.type == "number" &&
      actualType == "integer")) {
    this.addError(path, "invalidType", [schema.type, actualType]);
    return false;
  }

  return true;
};

/**
 * Adds an error message. |key| is an index into the |messages| object.
 * |replacements| is an array of values to replace '*' characters in the
 * message.
 */
chromeHidden.JSONSchemaValidator.prototype.addError = function(
    path, key, replacements) {
  this.errors.push({
    path: path,
    message: chromeHidden.JSONSchemaValidator.formatError(key, replacements)
  });
};

})();
<!DOCTYPE html>
<html i18n-values="dir:textdirection">
<head>
<title i18n-content="title">
</title>
<style>
body {
  background-color: #fff;
  color: #000;
  font-family: Helvetica, Arial, sans-serif;
  font-size: 83%;
  line-height: 120%;
  max-width: 35em;
  padding: 0.5em 1em;
}
li {
  padding-bottom: .3em;
}
ul {
  margin: .5em 0 0;
  padding-bottom: 0;
}
h1 {
  font-size: 1.5em;
  margin-bottom: 1.5em;
}
h2 {
  font-size: 1em;
  font-weight: bold;
  margin: 0 0 .5em;
  padding: 0;
}
a {
  color: #00c;
}
a:active {
  color: #f00;
}
a:visited {
  color: #551a8b;
}
#errorSummary, #suggestions, #search {
  margin-bottom: 2.5em;
}
#zipInfo {
  padding-left: 16px;
  overflow: hidden;
  -webkit-transition: height .1s ease-out;
}
#plus {
  border: 0;
  cursor: pointer;
  vertical-align: baseline;
}
#details {
  background-color: #e0e0e0;
  max-width: 30em;
  padding: 1em;
}
#errorDetails.hide-details #plus {
  display: inline;
}
#errorDetails.show-details #plus {
  display: none;
}
#errorDetails.hide-details #minus {
  display: none;
}
#errorDetails.show-details #minus {
  display: inline;
}
#errorDetails.hide-details #zipInfo {
  height: 0 !important;
}
</style>
<script>
function toggleDiv() {
  var elt = document.getElementById('errorDetails');
  elt.className = (elt.className == 'show-details') ? 'hide-details'
                                                    : 'show-details';

  if (elt.className == 'show-details') {
    zipInfo.style.height = zipInfo.offsetHeight + 'px';
  } else {
    zipInfo.style.height = 'auto';
  }
}
</script>
</head>

<body id="t">

<h1 i18n-content="heading"></h1>

<div id="errorSummary" jsselect="summary">
 <p jsvalues=".innerHTML:msg"></p>
</div>

<div id="suggestions">
 <h2 i18n-content="suggestionsHeading"></h2>
 <ul>
  <li jsselect="suggestionsReload">
    <span jsvalues=".innerHTML:msg"></span>
  </li>
  <li jsselect="suggestionsHomepage">
    <span jscontent="suggestionsHomepageMsg"></span>
    <a jscontent="hostName" jsvalues="href:homePage"></a>
  </li>
  <li jsselect="suggestionsLearnMore">
    <span jsvalues=".innerHTML:msg"></span>
  </li>
 </ul>
</div>

<div id="errorDetails" class="hide-details">
 <a href="javascript:void(0);" style="text-decoration:none" onclick="toggleDiv()">
  <img id="plus" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9kKEBUKMVKQIVIAAADiSURBVBjTjZGxagJREEXvm2yRFJI62KUJ0Y+ws0gVBP0ELfyD/EH+IMHaRjBYWdjZGwKCQSz8AQt3I1l87LtvLN4qWxjJrS5zD3MZxmy2djT+nkzXOKd67f75qRIFYvDeOAu1Oh+L1QbN9lALAmbArDhptoeCi/LeA4guECSdczm0t9nN9bwYG/MZTJw8ABAAjvxrWYgiAFnGbfIoIgBuSwsAya5KkqTLjnXW2rwFJpg0Tb33JL3XHPpN93ROVU8tcfyjUFUVIwBMr/81ma5fulVHhoNPuhJ5fVuW70rmP285AJVgi6pOot+gAAAAAElFTkSuQmCC">
  <img id="minus" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9kKEBUKJtFDpJUAAADSSURBVBjTjZExTgJhEIXfjFtA4QGMHY1RD0FnYWVI8AhLwQ28gTfAUNuQYKwstuMEJiYSY8EFKBYKCH/2n3kUC4Ri2fC18715mYzM8/D5Nc0mM1Tx0G49Pd4lpTF661RKz72P3/85uumYtXTTsaIWdweQ1BhmFmPcSZtQNBs/ld5ieQNAAUSzU8vKUQKgKCxf3qqqu6vqocvMYrGvCyEcpwVC0N3NzJ07abXeWIwkRYQkAJIESaooABm+f2eT2Uv/PpqVBx+4UH0d/F1fXco5b9kCrJSRhFACKVsAAAAASUVORK5CYII=">
  <span id="errorExpander" i18n-content="detailsLink" style="text-decoration:underline"></span>
 </a>
 <div id="zipInfo">
  <p i18n-content="detailsHeading"></p>
  <div id="details" i18n-content="details"></div>
 </div>
</div>
</body>
</html>
// Copyright (c) 2009 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// This script contains unprivileged javascript APIs related to chrome
// extensions.  It is loaded by any extension-related context, such as content
// scripts or toolstrips.
// See user_script_slave.cc for script that is loaded by content scripts only.
// TODO(mpcomplete): we also load this in regular web pages, but don't need
// to.

var chrome = chrome || {};
(function () {
  native function OpenChannelToExtension(sourceId, targetId, name);
  native function CloseChannel(portId);
  native function PortAddRef(portId);
  native function PortRelease(portId);
  native function PostMessage(portId, msg);
  native function GetChromeHidden();
  native function GetL10nMessage();

  var chromeHidden = GetChromeHidden();

  // The reserved channel name for the sendRequest API.
  chromeHidden.kRequestChannel = "chrome.extension.sendRequest";

  // Map of port IDs to port object.
  var ports = {};

  // Change even to odd and vice versa, to get the other side of a given
  // channel.
  function getOppositePortId(portId) { return portId ^ 1; }

  // Port object.  Represents a connection to another script context through
  // which messages can be passed.
  chrome.Port = function(portId, opt_name) {
    this.portId_ = portId;
    this.name = opt_name;
    this.onDisconnect = new chrome.Event();
    this.onMessage = new chrome.Event();
  };

  chromeHidden.Port = {};

  // Hidden port creation function.  We don't want to expose an API that lets
  // people add arbitrary port IDs to the port list.
  chromeHidden.Port.createPort = function(portId, opt_name) {
    if (ports[portId]) {
      throw new Error("Port '" + portId + "' already exists.");
    }
    var port = new chrome.Port(portId, opt_name);
    ports[portId] = port;
    chromeHidden.onUnload.addListener(function() {
      PortRelease(portId);
    });
    PortAddRef(portId);
    return port;
  }

  // Called by native code when a channel has been opened to this context.
  chromeHidden.Port.dispatchOnConnect = function(portId, channelName, tab,
                                                 sourceExtensionId,
                                                 targetExtensionId) {
    // Only create a new Port if someone is actually listening for a connection.
    // In addition to being an optimization, this also fixes a bug where if 2
    // channels were opened to and from the same process, closing one would
    // close both.
    if (targetExtensionId != chromeHidden.extensionId)
      return;  // not for us
    if (ports[getOppositePortId(portId)])
      return;  // this channel was opened by us, so ignore it

    // Determine whether this is coming from another extension, so we can use
    // the right event.
    var isExternal = sourceExtensionId != chromeHidden.extensionId;

    if (tab)
      tab = chromeHidden.JSON.parse(tab);
    var sender = {tab: tab, id: sourceExtensionId};

    // Special case for sendRequest/onRequest.
    if (channelName == chromeHidden.kRequestChannel) {
      var requestEvent = (isExternal ?
          chrome.extension.onRequestExternal : chrome.extension.onRequest);
      if (requestEvent.hasListeners()) {
        var port = chromeHidden.Port.createPort(portId, channelName);
        port.onMessage.addListener(function(request) {
          requestEvent.dispatch(request, sender, function(response) {
            port.postMessage(response);
          });
        });
      }
      return;
    }

    var connectEvent = (isExternal ?
        chrome.extension.onConnectExternal : chrome.extension.onConnect);
    if (connectEvent.hasListeners()) {
      var port = chromeHidden.Port.createPort(portId, channelName);
      port.sender = sender;
      // TODO(EXTENSIONS_DEPRECATED): port.tab is obsolete.
      port.tab = port.sender.tab;

      connectEvent.dispatch(port);
    }
  };

  // Called by native code when a channel has been closed.
  chromeHidden.Port.dispatchOnDisconnect = function(portId) {
    var port = ports[portId];
    if (port) {
      port.onDisconnect.dispatch(port);
      delete ports[portId];
    }
  };

  // Called by native code when a message has been sent to the given port.
  chromeHidden.Port.dispatchOnMessage = function(msg, portId) {
    var port = ports[portId];
    if (port) {
      if (msg) {
        msg = chromeHidden.JSON.parse(msg);
      }
      port.onMessage.dispatch(msg, port);
    }
  };

  // Sends a message asynchronously to the context on the other end of this
  // port.
  chrome.Port.prototype.postMessage = function(msg) {
    // JSON.stringify doesn't support a root object which is undefined.
    if (msg === undefined)
      msg = null;
    PostMessage(this.portId_, chromeHidden.JSON.stringify(msg));
  };

  // Disconnects the port from the other end.
  chrome.Port.prototype.disconnect = function() {
    delete ports[this.portId_];
    CloseChannel(this.portId_);
  }

  // This function is called on context initialization for both content scripts
  // and extension contexts.
  chrome.initExtension = function(extensionId, warnOnPrivilegedApiAccess,
                                  inIncognitoContext) {
    delete chrome.initExtension;
    chromeHidden.extensionId = extensionId;

    chrome.extension = chrome.extension || {};
    chrome.self = chrome.extension;

    chrome.extension.inIncognitoTab = inIncognitoContext;  // deprecated
    chrome.extension.inIncognitoContext = inIncognitoContext;

    // Events for when a message channel is opened to our extension.
    chrome.extension.onConnect = new chrome.Event();
    chrome.extension.onConnectExternal = new chrome.Event();
    chrome.extension.onRequest = new chrome.Event();
    chrome.extension.onRequestExternal = new chrome.Event();

    // Opens a message channel to the given target extension, or the current one
    // if unspecified.  Returns a Port for message passing.
    chrome.extension.connect = function(targetId_opt, connectInfo_opt) {
      var name = "";
      var targetId = extensionId;
      var nextArg = 0;
      if (typeof(arguments[nextArg]) == "string")
        targetId = arguments[nextArg++];
      if (typeof(arguments[nextArg]) == "object")
        name = arguments[nextArg++].name || name;
      if (nextArg != arguments.length)
        throw new Error("Invalid arguments to connect.");

      var portId = OpenChannelToExtension(extensionId, targetId, name);
      if (portId >= 0)
        return chromeHidden.Port.createPort(portId, name);
      throw new Error("Error connecting to extension '" + targetId + "'");
    };

    chrome.extension.sendRequest =
        function(targetId_opt, request, responseCallback_opt) {
      var targetId = extensionId;
      var responseCallback = null;
      var lastArg = arguments.length - 1;
      if (typeof(arguments[lastArg]) == "function")
        responseCallback = arguments[lastArg--];
      request = arguments[lastArg--];
      if (lastArg >= 0 && typeof(arguments[lastArg]) == "string")
        targetId = arguments[lastArg--];
      if (lastArg != -1)
        throw new Error("Invalid arguments to sendRequest.");

      var port = chrome.extension.connect(targetId,
                                          {name: chromeHidden.kRequestChannel});
      port.postMessage(request);
      port.onMessage.addListener(function(response) {
        if (responseCallback)
          responseCallback(response);
        port.disconnect();
      });
    };

    // Returns a resource URL that can be used to fetch a resource from this
    // extension.
    chrome.extension.getURL = function(path) {
      return "chrome-extension://" + extensionId + "/" + path;
    };

    chrome.i18n = chrome.i18n || {};
    chrome.i18n.getMessage = function(message_name, placeholders) {
      return GetL10nMessage(message_name, placeholders, extensionId);
    };

    if (warnOnPrivilegedApiAccess) {
      setupApiStubs();
    }
  }

  var notSupportedSuffix = " is not supported in content scripts. " +
      "See the content scripts documentation for more details.";

  // Setup to throw an error message when trying to access |name| on the chrome
  // object. The |name| can be a dot-separated path.
  function createStub(name) {
    var module = chrome;
    var parts = name.split(".");
    for (var i = 0; i < parts.length - 1; i++) {
      var nextPart = parts[i];
      // Make sure an object at the path so far is defined.
      module[nextPart] = module[nextPart] || {};
      module = module[nextPart];
    }
    var finalPart = parts[parts.length-1];
    module.__defineGetter__(finalPart, function() {
      throw new Error("chrome." + name + notSupportedSuffix);
    });
  }

  // Sets up stubs to throw a better error message for the common case of
  // developers trying to call extension API's that aren't allowed to be
  // called from content scripts.
  function setupApiStubs() {
    // TODO(asargent) It would be nice to eventually generate this
    // programmatically from extension_api.json (there is already a browser test
    // that should prevent it from getting stale).
    var privileged = [
      // Entire namespaces.
      "bookmarks",
      "browserAction",
      "contextMenus",
      "cookies",
      "devtools",
      "experimental.accessibility",
      "experimental.bookmarkManager",
      "experimental.clipboard",
      "experimental.extension",
      "experimental.infobars",
      "experimental.input",
      "experimental.metrics",
      "experimental.omnibox",
      "experimental.popup",
      "experimental.processes",
      "experimental.tts",
      "experimental.proxy",
      "experimental.rlz",
      "experimental.sidebar",
      "experimental.webNavigation",
      "experimental.webRequest",
      "history",
      "idle",
      "management",
      "pageAction",
      "pageActions",
      "tabs",
      "test",
      "toolstrip",
      "webstorePrivate",
      "windows",

      // Functions/events/properties within the extension namespace.
      "extension.getBackgroundPage",
      "extension.getExtensionTabs",
      "extension.getToolstrips",
      "extension.getViews",
      "extension.lastError",
      "extension.onConnectExternal",
      "extension.onRequestExternal",
      "i18n.getAcceptLanguages"
    ];
    for (var i = 0; i < privileged.length; i++) {
      createStub(privileged[i]);
    }
  }

})();
PNG


IHDRJAutEXtSoftwareAdobe ImageReadyqe<IDATxZ elIcJ<G@bTƢ){e!hy!nL4`S^MMōS'e}QG4pbTVvo'[%V׽XƩS2v.ϟ[ߑ:?PvŒGZZKNyG>{x${Լ#uFI 
zS2
~ݳ{&;9Ne\'!ڙ)[rZύ}l6:)5oFHxsYN!<0ʤmActQ5% kZF4& ˆshNQy-oԩfu'bö暺si5{oox.<}#ps=4Kύ^IENDB`<!DOCTYPE html>
<html i18n-values="dir:textdirection">
<head>
<title i18n-content="title">
</title>
<style>
html {
  height: 100%;
}
body {
  color: #000;
  font-family: Helvetica, Arial, sans-serif;
  background-image: -webkit-gradient(
      linear,
      left bottom,
      left top,
      color-stop(0, rgb(236,244,255)),
      color-stop(0.50, rgb(255,255,255))
  );
  height: 100%;
  padding: 0px;
  margin: 0px;
}
#error {
  position: absolute;
  left: 180px;
  top: 150px;
  font-size: 24px;
}
#error img {
  margin-right: 10px;
  vertical-align: middle;
}
#name  {
  font-weight: bold;
}
#msg {
}
</style>
</head>

<body id="t">

<div id="error" jsvalues=".title:url">
<img jsvalues=".src:icon" width="96"  height="96">
<div style="display:inline-block; vertical-align: middle;">
<div id="name" jsvalues=".innerText:name"></div>
<div id="msg" jsvalues=".innerText:msg"></div>
</div>
</div>

</body>
</html>
<!DOCTYPE html>

<html>

<head>

<script>
function addRow(name, url, isdir, size, date_modified) {
  if (name == ".")
    return;

  var root = "" + document.location;
  if (root.substr(-1) !== "/")
    root += "/";

  var table = document.getElementById("table");
  var row = document.createElement("tr");
  var file_cell = document.createElement("td");
  var link = document.createElement("a");

  link.className = isdir ? "icon dir" : "icon file";

  if (name == "..") {
    link.href = root + "..";
    link.innerText = document.getElementById("parentDirText").innerText;
    link.className = "icon up";
    size = "";
    date_modified = "";
  } else {
    if (isdir) {
      name = name + "/";
      url = url + "/";
      size = "";
    }
    link.innerText = name;
    link.href = root + url;
  }
  file_cell.appendChild(link);

  row.appendChild(file_cell);
  row.appendChild(createCell(size));
  row.appendChild(createCell(date_modified));

  table.appendChild(row);
}

function createCell(text) {
  var cell = document.createElement("td");
  cell.setAttribute("class", "detailsColumn");
  cell.innerText = text;
  return cell;
}

function start(location) {
  var header = document.getElementById("header");
  header.innerText = header.innerText.replace("LOCATION", location);

  document.getElementById("title").innerText = header.innerText;
}

function onListingParsingError() {
  var box = document.getElementById("listingParsingErrorBox");
  box.innerHTML = box.innerHTML.replace("LOCATION", encodeURI(document.location)
      + "?raw");
  box.style.display = "block";
}
</script>

<style>

  h1 {
    border-bottom: 1px solid #c0c0c0;
    margin-bottom: 10px;
    padding-bottom: 10px;
    white-space: nowrap;
  }

  table {
    border-collapse: collapse;
  }

  tr.header {
    font-weight: bold;
  }

  td.detailsColumn {
    padding-left: 2em;
    text-align: right;
    white-space: nowrap;
  }

  a.icon {
    padding-left: 1.5em;
    text-decoration: none;
  }

  a.icon:hover {
    text-decoration: underline;
  }

  a.file {
    background : url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABnRSTlMAAAAAAABupgeRAAABHUlEQVR42o2RMW7DIBiF3498iHRJD5JKHurL+CRVBp+i2T16tTynF2gO0KSb5ZrBBl4HHDBuK/WXACH4eO9/CAAAbdvijzLGNE1TVZXfZuHg6XCAQESAZXbOKaXO57eiKG6ft9PrKQIkCQqFoIiQFBGlFIB5nvM8t9aOX2Nd18oDzjnPgCDpn/BH4zh2XZdlWVmWiUK4IgCBoFMUz9eP6zRN75cLgEQhcmTQIbl72O0f9865qLAAsURAAgKBJKEtgLXWvyjLuFsThCSstb8rBCaAQhDYWgIZ7myM+TUBjDHrHlZcbMYYk34cN0YSLcgS+wL0fe9TXDMbY33fR2AYBvyQ8L0Gk8MwREBrTfKe4TpTzwhArXWi8HI84h/1DfwI5mhxJamFAAAAAElFTkSuQmCC ") left top no-repeat;
  }

  a.dir {
    background : url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAd5JREFUeNqMU79rFUEQ/vbuodFEEkzAImBpkUabFP4ldpaJhZXYm/RiZWsv/hkWFglBUyTIgyAIIfgIRjHv3r39MePM7N3LcbxAFvZ2b2bn22/mm3XMjF+HL3YW7q28YSIw8mBKoBihhhgCsoORot9d3/ywg3YowMXwNde/PzGnk2vn6PitrT+/PGeNaecg4+qNY3D43vy16A5wDDd4Aqg/ngmrjl/GoN0U5V1QquHQG3q+TPDVhVwyBffcmQGJmSVfyZk7R3SngI4JKfwDJ2+05zIg8gbiereTZRHhJ5KCMOwDFLjhoBTn2g0ghagfKeIYJDPFyibJVBtTREwq60SpYvh5++PpwatHsxSm9QRLSQpEVSd7/TYJUb49TX7gztpjjEffnoVw66+Ytovs14Yp7HaKmUXeX9rKUoMoLNW3srqI5fWn8JejrVkK0QcrkFLOgS39yoKUQe292WJ1guUHG8K2o8K00oO1BTvXoW4yasclUTgZYJY9aFNfAThX5CZRmczAV52oAPoupHhWRIUUAOoyUIlYVaAa/VbLbyiZUiyFbjQFNwiZQSGl4IDy9sO5Wrty0QLKhdZPxmgGcDo8ejn+c/6eiK9poz15Kw7Dr/vN/z6W7q++091/AQYA5mZ8GYJ9K0AAAAAASUVORK5CYII= ") left top no-repeat;
  }

  a.up {
    background : url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmlJREFUeNpsU0toU0EUPfPysx/tTxuDH9SCWhUDooIbd7oRUUTMouqi2iIoCO6lceHWhegy4EJFinWjrlQUpVm0IIoFpVDEIthm0dpikpf3ZuZ6Z94nrXhhMjM3c8895977BBHB2PznK8WPtDgyWH5q77cPH8PpdXuhpQT4ifR9u5sfJb1bmw6VivahATDrxcRZ2njfoaMv+2j7mLDn93MPiNRMvGbL18L9IpF8h9/TN+EYkMffSiOXJ5+hkD+PdqcLpICWHOHc2CC+LEyA/K+cKQMnlQHJX8wqYG3MAJy88Wa4OLDvEqAEOpJd0LxHIMdHBziowSwVlF8D6QaicK01krw/JynwcKoEwZczewroTvZirlKJs5CqQ5CG8pb57FnJUA0LYCXMX5fibd+p8LWDDemcPZbzQyjvH+Ki1TlIciElA7ghwLKV4kRZstt2sANWRjYTAGzuP2hXZFpJ/GsxgGJ0ox1aoFWsDXyyxqCs26+ydmagFN/rRjymJ1898bzGzmQE0HCZpmk5A0RFIv8Pn0WYPsiu6t/Rsj6PauVTwffTSzGAGZhUG2F06hEc9ibS7OPMNp6ErYFlKavo7MkhmTqCxZ/jwzGA9Hx82H2BZSw1NTN9Gx8ycHkajU/7M+jInsDC7DiaEmo1bNl1AMr9ASFgqVu9MCTIzoGUimXVAnnaN0PdBBDCCYbEtMk6wkpQwIG0sn0PQIUF4GsTwLSIFKNqF6DVrQq+IWVrQDxAYQC/1SsYOI4pOxKZrfifiUSbDUisif7XlpGIPufXd/uvdvZm760M0no1FZcnrzUdjw7au3vu/BVgAFLXeuTxhTXVAAAAAElFTkSuQmCC ") left top no-repeat;
  }

  #listingParsingErrorBox {
    border: 1px solid black;
    background: #fae691;
    padding: 10px;
    display: none;
  }
</style>

<title id="title"></title>

</head>

<body>

<div id="listingParsingErrorBox" i18n-values=".innerHTML:listingParsingErrorBoxText"></div>

<span id="parentDirText" style="display:none" i18n-content="parentDirText"></span>

<h1 id="header" i18n-content="header"></h1>

<table id="table">
  <tr class="header">
    <td i18n-content="headerName"></td>
    <td class="detailsColumn" i18n-content="headerSize"></td>
    <td class="detailsColumn" i18n-content="headerDateModified"></td>
  </tr>
</table>

</body>

</html>
  0( @`@,D??p ???GIF89a!,RIѺ齑]!"X(y""H(](f@8JQpA"a 0^)B{9­;  0( @?  
0( @PPPPPP@0P``P0S`P00P`P@PPPPP  0( @ PP ??p ??PNG


IHDR))`gAMAasRGB cHRMz&u0`:pQ<aIDATXX	OWQ"(!46`n|p߁4H\UB D?a:3޵.m&+}}ξ73;AAwtwΘˋz%!&:RS!77!&&BCCap`VN0=54׃"!#sё~Sdd\ߐ475nOxuĤ`RItvv]	N)]s`|l1&`OzuR	}yIQCR
Xuu5d&'zFЌK[Ua_nkN'ћC0.T~O^UYmI7UUUH$WWV8v]W`z$WdG6brx+3E7IfDzaaIŅEŒAD7;;\pCGG{[D[().7߀_WW:;:9(Kd݂R
EŰxv|qֆ%N(**!ٌ281ݞ$0cZQ^:ֳcv(Kn[=-zMH]`2cfյjb[[l'ozKў3O''VAP,FvBV?)*yznOW~U-&HP‚ga8~&xԆ:UT^
T*C{`0v6+מM>2	&Iy&&"S[S>
M	e5""",JჂx?V=|qeBуzN>,\Z	>])ՠ'1IPt0'r Ɔ^.

+j@Ч@,v(V95̓w=~}FYYY>#HUae.%Xޟ2((spx
Gφ|aaa
9J:0Gsh^bv.f>?'Y	cb_x)oz@I74XjR{p)|4JC$5676FRDTP/	qqqdNv${'6KII	$%&q.ǘHS
G?`|ǩ8r++3!PE-lDeXAAόtHLL$8"㩺 ўd[kNnBnJBDm{
٭H
pݹNeIENDB`PNG


IHDR))`gAMAasRGB cHRMz&u0`:pQ<eIDATX͘OQ[e$Ҙ1i6Դ0fZfKcVj"%"e-4C^yyrߝ<<:۹BBF}nngJΝo]]2Dj׮I̴i3{\5KRdwh<	V-]*w-'{HÃPrKƍmKK+)1QPS<~{k۵.؍p<I7kC.\ɎP[^.Iti^i޷O~=mXsKoY$._4%$E';.NK_ӿo.\ɜioKK]&tPOI$_]ORY8oˬ,;S\
I{@yqms⛢"wI'sʛ‘'G6I=ܲA{g3t0nܠ##C_?	I(o	1}z$"k݆
:Ipmmڤ%v5Iֳ׽ի5'V$Ʀ,mu=褝]7O`:E=/$9	}U`38oGGkyqmcI̺SLeẸ\Ap2lU
^jo4"bAsQkjjp$\)8Qk$M=kB۱crumfϠ\ϟ)HVJ~dD az8^chE\-m:2Ha6*!EVTȿzb@f*PS3rQ#WqX_Ĕ)R7Fb	Z<vK"#%kL]J3FE~ܬpVwjݥHǏkCܵ9R0t\j@Hctwm\U
9tUvtxSr!qgIPP5\3(d=!=prQ$^C9!B9qzpD"
);?y}u/(Bi'HvaHTdq9+Gq
	u$y$$KU_i
KD'e/IENDB`PNG


IHDRVΎWgAMAasRGB cHRMz&u0`:pQ<}IDAT8˵
 PvNNG6VKWZׯ["DR{!vAB!4ߗ!k""RH7 6
eH'xC4b}	FH;O"j	G$IENDB`PNG


IHDR]tEXtSoftwareAdobe ImageReadyqe<;IDATxb&xg+A1:8;
Xp9.LT4jШA ORGhJm{IENDB`PNG


IHDR]tEXtSoftwareAdobe ImageReadyqe<IDATxb?5.4j3x7+Qj])1:`bzUĸBKAPu@]hLAȑqj %1 3PoSd`!S_''נ=@\gu{$W@
R
5`%
Y\Ϡ=PWܣ$ӡ Bw)uIENDB`PNG


IHDR]tEXtSoftwareAdobe ImageReadyqe<IDATxڬ DნI&ܜ:aMI	qɍ\[ZRr
,z&!
2M(4լ)!iW  R*(OdQ
#hiN?߽Jke]*T!}a*+5/h&|Fv0(O?IENDB`PNG


IHDR" wsRGBbKGD	pHYstIME
4EķIDATX=!F 6Gd;cg	"X̫H0Lq:"i%)V qH
HDX	lTu0ga]Yjk!Z/Eg{܊xYA]#f6<n۶2I	ä.iY7qg*/4cIENDB`PNG


IHDR" wsRGBbKGD	pHYstIME

"V*MIDATXM+mQu'*RJ)nQw(F2'#/t(CP̔<Vݢ6Owz^



rB
ږȺzuwꎺ65BY+I8[uN-e|$ư[ESu::C"L)?θWիXG}>3eDG	5`
&C90G3Vc:B΀X._	!<b[mXNODڧ)p	,Zz,vM{"Vr۾)b+h,F\f_˥WpBm-~


sJ
IENDB`PNG


IHDR" wsRGBbKGD	pHYstIME
#ApIDATX햽	AF=;
042k114y*bpl0&0R@[d
'<J3Hm>t""ig⿵H蔲BxY9ޘ]h2CdЦ0OQ%pt.t8@3IENDB`PNG


IHDR	xFtEXtSoftwareAdobe ImageReadyqe<IDATxM
04h{^O
"JMEK&Wf1f.TpB/txmCkfUI,u
LQ"; ݣV:tFӍKFWЃKC(hCD"4̈7ɒҌ	12לb)T4U*e&=fؗ=\8)'TNΎ`%I.Xt
0/H.IENDB`PNG


IHDR%NgAMAaIDAT(Sc?H@:CH){.uIENDB`  ( @ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++0????0  ( @ nnnmKKK!!!!!!KKKnnnmeeeeee888섄888쀀!!!!!!FFF888eeeeeennnmnnnmKKKKKK!!!!!!!!!!!!KKKKKKnnnmnnnmeeeeee888888!!!!!!888섄888쀀eeeeeennnmKKK!!!!!!KKKnnnm??  ( @ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++???  ( @ ++++++++++++++++++++++++++++++++++++++++++++++++000++++++++++++++++++++++++++++++++++++++++++++++++?   ( @ ++++++++++++++++++++++++++++++++++++++++++++++++000++++++++++++++++++++++++++++++++++++++++++++++++??PNG


IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxڤ
 Di6$SҤ4{ID}U#sJ)h9gT#ynp 7KWE
I^CC8(|lTOIA\ANVQ_e='RS&N334{tsV`pʔ
IENDB`  ( @ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++???  ( @ ++++++++++++++++++++++++++++++++++++++++++++++++000++++++++++++++++++++++++++++++++++++++++++++++++ ?  ( @ ++++++++++++++++++++++++++++++++++++++++++++++++000++++++++++++++++++++++++++++++++++++++++++++++++??  ( @ ---
666+++
666++++++
444***666+++++++++
666+++++++++666+++++++++
666+++++++++666++++++
666***666+++
---
??  	
0( @PNG


IHDRr
ߔtEXtSoftwareAdobe ImageReadyqe<.IDATxڜV_[AI,%,as4DR	kJ?A	-KTBeY͝9sޙܹٴcr߹/scH>c.)1AE.5c˞%#+zU&dK`Ucfry4vgc>A	`Q L:H±gCK)-rcMF)dZɅ:mByNBѴTe[-WлzW9"{Gjgb@Kxʿ@]j)z4.tVGu"l-,sR
P̭,w)5\g)'&Y2Vl=Sy"i'Iro!>&CR
CdɘSsz
I&mG%dƇ6z"Bg)!cj`!	h^qa cOR{!A;nBr;!LN
Lٱ0e'Slh]J:7V_$fKw̞zyk󓐅AHύ!pE/i置W{=_sfl0:0+%u I{FJ
G7Gȗq*KF$5lԖ{#o)>Kqa⯕tof;
<AXd 7ވU'}
$UQzw$G~D<]vܔu>]vSns7,_1ܧmVNIENDB`PNG


IHDRr
ߔtEXtSoftwareAdobe ImageReadyqe<!IDATxڔVχ#A~2iiB!0ka`Y=aa	srZ,ÐtUwU';Q}'"@-kmAT2rIxބ#:=_3pݐFLG%:MKB6
{h	+7G:gr'οO2
?P
pK`)64?"/XQVx^[Lj#3C}썇yYJ+`LdR1z/Cu
(%pHT
{;:kx,1J`
dZ[<K5ȡ^Z4XWS#%mrZkѹ%sJ.˾Iġ8Եmtވu*|n<i&'h{z
Yۤ |')FԦ7r!:72mxk>T	SǮ8Ʀ,-"	_}ʤNb-捴-w|KEcDBo|%UĹb
]RNm"֞˹.`MVB>}dyKUBXL]d-mFi`&
cmuCWzKeiWlL{慣TpϷ-L,f8KF,GkK%{}y5?jaS|{+t咿Ҥg\,\.TmNmYr﫴B%N]_ gЫvxܽ!jFP8쯇h,O]IENDB`PNG


IHDR;0tEXtSoftwareAdobe ImageReadyqe<IDATxڬHAg@0K#@00P
@)QD?_ EB Qͼvwv̛o7odǽeQC9r:)d	>Kl?!

	JMɀ^0>WL
h%	Ĉ$v~;
KA;)ȼ5-֐?eLH(Xj,qtچ
pip/uh@GcFrH㺑TiMX&@
+ vL;@5wA_W+mE4	,&ܳ	0#(ȉvnoz<&
?HA_KHd.pَATNT Sw*ղRi;vdlb)➱pnvŞWf{)S6XɁv2u"
`DhDw@TړgEl60BŷϷj=ok\@Vw4P&0rdVk{mT`>-
= v0>~k+A#UwwHb*B)8*pZޙt?2j2]r8-dU=gV k|a<	Jťb	(Ü<!3A`H&-GX\9lT$$XnŅtJ
q~y鼱*U1֒+ktNb<O^4KS)W0,~<r7ՠX1
)kyK,@bYx:ŦLse*r9	=,VbHH,l@1㵔պTÕ+^bSnk.P<I?mV50GcsIENDB`PNG


IHDR+tEXtSoftwareAdobe ImageReadyqe<jIDATxڼ]h\Eg6Kd(*<U
>XTb}TZZ@b0DJҒTZl(
A_\QKEQ,b1P}(@!
@nfs{g޻{wt~33gfw[T%cA,;j=v πz@cc^|0b	הQ8R;	*'΄{ITI=z
iE<O[`AW
9>wޙ`?x<
Gà߁́~n3Ac
*EpJ44
)p?V,s:
噹
`(D|f4o5oۓuóQ}K'@319@\{Kj;sn,+91׶0@4;ؖJcx#NlHIIs^^N t(dv׊:#v7M9_	o2:?I66ǺVojJ L;ݧ1Ѐg
$Y9-56Ԯ΃$DtiMgvk6xu{\FXM	~#kaXVWHjcE_לSտH=U–ٕ$+xѡ2cͧ`UEvP&*3
.~(1^9H^<v)_0hr*ȳ|Py
x/|^ 4p"^+o>Jq8LL[F}:5#-=>q:$w97{ߪ=뮼u9|u]yt|ԓ6?\^-LbqNFf
Og:h0YX<?1mٗ3r߇	6`s#%׳8[$VpQɉew|>	^fAFHoc3xu--upb[S,7QDC<%HQ]Lb[J-SNG4T`_=qvEیXJr:)s"QvBn4Ī	eGxT*.*td(%ӻpPvy
o3ͥA͗吢4IENDB`PNG


IHDR	pHYsgAMA|Q cHRMz%u0`:o_F9IDATx|
 ^JЬ%e5,tj|6vjHf7h8@3=XWkIENDB`PNG


IHDRusjtEXtSoftwareAdobe ImageReadyqe<IDATxb|zBěa!`IENDB`  	0( @@@@@@@  0( @?9y````y9??  0( @??````???PNG


IHDRԫtEXtSoftwareAdobe ImageReadyqe<IDATxL[ewq{u32\S1*\,"J
(.]&@좂BoV16<溫3w~{[f?ox=cZR
pB*Q]=ʷ
Wm@+9gXGĤb#Zxn3ʊ nJ[12BNhJhR "$3PKNlI)jY2|$KDD:"ZQDن%!!{Q5۱<5Q"yfHdQ3rIƓO)pp&-&%C]Iב
;`	T+x$0b
7tٵBGL,jdpeeqȰ	;&q' ƔtJ%dFQ?ׇaZNW:iZՕp[UݜuXݕe8O0YqR	CBU\)
Y;MU9_1hOܕPgǙIݚcMOcd̡RŭjĞCvux~
閹hWt3V*EٿC{4GMuk_F-W(?7X	?2lG&z(n_B_b߷
w8vP>6TP`dEɋEܚw-gT|xCFk<vR6q8ghi81-kZˠwc,z>}yeS;?9'1~,9]cXaزt.53˰^RTTǗ00\=w'OW>5Q'GXGYޖ杍bƑvE,nW}$4p.9bI
aB,0{	ʿKvZK8ct±D|DaDάuB2&O/	Q-X:4D"
FeV'@=T%j" 3;\Oۉ .vVxDFTPKv!Aaɳ0!=LM3ARM*wM)x囲q.nvU3!@$B7
`ʔeBlZlGVZ2Ai]±'VTg_*'],pIENDB`PNG


IHDRotEXtSoftwareAdobe ImageReadyqe<IDATxڔTKk$UnխWWw*I12f&х:(N?0эz@B\EQIfF<c:=ꪺ~v2Ię=|;G\|/=}C(^_΋~#恔9RG8e[.<q<xLN/z#'븺ڀFCxILD4ۑ[2daZu<OrOP.Nf+Uaz
ox'Ƽ!?ȶ3dJK)]\`7;xXמ?Sy97?lLmK*^ZJ)XDiϮ]]H`a*$q^
c6HKR?Guaf<@ۇ;X|(#%*:E4ehmraxO.cvDmςjL͏!N:Jyp}fL	XVN{%e|=Ia	GvŘ9:<xHeZ6z(/@Zߨ2f3.>:l^q/ę*=ƣgGX7@:}Uo%ɍwI%H(;Tt7kDBE5Ք8CN\,ML#gOY1\夨f0GHX0[B1ѡ׍)^22׌lmCIcZQ M[V,:0tA)&G<P)y8=QeB(ݜ	ZtPh"ؒjlwc,U_ϕ͡.ÉB3`uf}'mohћautW\yfھR#r pkIL?l
GIENDB`PNG


IHDRԫtEXtSoftwareAdobe ImageReadyqe<GIDATxڴ]hUidNvbv01Q`xBPxi^‹Ul@/tf~-SѵcyֹP&i&y?<2e }s9g`|>W
`//TU\*:HIP!zө׍a
ꚟAEN8Fdh\2vg)D3FP;LuG-D'b{g$?Orx|^LN{Dm{"eX=+U>xwΝӯZyc$
XEe?<4."%ՍiMnB\xǞ8&мmn5ޤ*yi=#GOr+uGnRP'ԪrqS$&5p
5׮9c;.FfӴjwb8<
_y@OCpa<0AY4MCQ}q6wuŰ$046V	t^32|xGK_d{Pg+lJ(E!WrVvme͸_$ly;pX+s3r;aÒ[ƜssgKnTo^E+v%+L^hUi&'Ђj}XX۷(;[ئNm/.Cn	e{XVYmJ±*<wKsszZìCOJbRT8Ӱs!"R|Sv`zs[!IENDB`PNG


IHDR(tEXtSoftwareAdobe ImageReadyqe<(IDATxbt=yvsIp%'ˀ@+!3!`G~Ձ-G%8!f̅Z@%d[[ >`4\
fjЁ̆%ɊR	h	 >ϐ(
d0_Mf3eO,Z=Mʽ/`G~0xY:J<Xŗy
әO4Dž00ϸbﱺ
8:@N] t~
X@7O}}{2
` :IENDB`PNG


IHDR&tEXtSoftwareAdobe ImageReadyqe<IDATxlKh\e9;If:icAJj[m%Pp]\%"dՍ6Xj%	f9y̝]ϽC/ߝϧA=-B㣓wlr)՛K!a`mĬSе],5%=Ndi|3;/?\8ISY˷4	o1a
)E!铎mp)/ȟ|<0
5:>gY ag\
OyCIX%=U-l>s}jAihNkҢe\	;D"WuLM	p	3,aJĺ@&@JWykn*6uOQ19pM!PJ38:HU2jL/!<	]dzrj>`J.f=/f>2ɣ]TׯwA$ySl{;-TbZ"f"|?afDz>"F<)o*غ͒HikCQ=4حEmww|ew)#C[?ŻB6U]&W_!!ViUoDŽHW)f)2lZSR8[`np҉/G"ٚr&k\W2}ywLt<W"V^o}'G|}qZ G6\ce*gP嶄.f\U,<=Ld2@ChΈC5]nj1do_L&q3$ۗlEdDi_dcJyʫK/
o۝[km~T/G>Ev5Em/3}$q#Rc1Ҷ'Pz9Mxm+KJҺֹۑV+7JR)R]cS,WEauG	0͘IENDB`PNG


IHDRԫtEXtSoftwareAdobe ImageReadyqe<IDATxl[lTUsΜ9sk7:@QE>o/&G5'/bb$}!HDF$^c BZm:ZʔЙuLU쓕>{ֿkf4ty\'5=Z3pe]k<L]Qn0[J|iuKDRXa|NE3<sOu^ƖdZˉ vn摱n=)(0W3,$gDWyj!Xh+=|z<z9Hʞda`Os`GHn^r?`lEP/26IdU׀\`{K{Qj;p^) DҸ-ۆ&k[M"%ZGc9'!uzqJCKAHnw՜b"(\1/@s[z\"jK`	cC:D<2g
8=lgqE9TiRPUҁqd,O~&YRjqq_*+PPRY]U˿_PRo9USJթcrWjʂrsKRS}=xJ# *LL7RbSѥ+
g9[,5Upr$2,eRs\<	z鑋ӭeD@yc?}oБpIh+q&O|D0)H<@cX:+R#чJ1$TtoH|+Y-)7ls/I$.$<j
1Fy#3$kj`veGLmBУz-6i}Om`ۀ		dd)K
e!g#q^?>7kɷfs<>K}3M*{}O)ެEMizygf!uS`ӣ)^tN(Wsdn7\s,Y
Vv_ueF35[gdqy~
_NͧG,#H?R/qAH{
If/C">VMiI#krIENDB`PNG


IHDR"atEXtSoftwareAdobe ImageReadyqe<IDATxMoW@ϼy8qB	JEl@Tu
?	'*$+MW$VRT`$'3ï/sqC$i4M$!K/q?)2?V.ڀl^>"tcBd_#(`OR͈R̉TN8 3X,2_Q?Yb5NDa$6s'rzb'j%||L{i~MAGqL%^LզY8zӵ3/Ju4XJˆУ2Ue>G[Bx
AHija&3b2hlJ!);z>DM1"MA/]{'2 ;E5HOIVL,ǮՈgm翼)
4Vgb?gkq{קܧrD
:z8sYD<Ҷx24=æ^FD٪(Jܕm2EɲBNNX<]*2ZlFmݣMԎЁʰFš-E`HAoBv;}OoګFCf>J*oSp~IENDB`PNG


IHDRԫtEXtSoftwareAdobe ImageReadyqe<IDATxڴ]hU3;;$l0ncuM[<HjRZhz$>IAEBPL>TP|DP|ԏB$VYfdٙ6!>I/p=9_wC~zcybj-BUqx_۩JnDlE]TU&,j-b)ljd	=z2$3IPAb
#95),O"ZpBr1M[
P4je)	558)Ay)ږ8QjU).n
,gPm7l]C
0]&n<)"mRa	]Y&F[T,^ʣj*U"͍pe-$XF=wLMA>9o0|)G"=Wbdt
q)G:v^y
GPFtǽ^W>%縣£/eϠCN~Ϙ}+SoW_·G
nS]uS"0>ýCBiit:̓9,-[t9kGTWcr8:Uɋ9vg?L4P\0i;D]oq6og)OgImKq1>jkr6kG6&8x|q8.zwng>v)03vF1{cAPȯx2rMdJۚwSsjWȗťkX׋x	M[ܱ#da
ԉoSK\\dF3uɫ+Jl_5}_ʪ*Vn"$)T2i_zj'[`KwIENDB`PNG


IHDR

E5NgAMA|Q cHRMR@}y<s<w
9iCCPPhotoshop ICC profileHǝwTTϽwz0R޻{^Ea`(34!ED"HPĀP$VDT$(1ET,oF֋oZ/K<Qt`)LVF_{ͅ!r_zXp3NY|9,8%K.ϊ,f%f(Aˉ9a
>,٩<9SbL!GĈ3,F0+7T3IlpX"61"H	_qW,dėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j-
-b8o׿M</AqVV2Og$>]9La.+-%Mȧg3YះuAxEK
i<:ŹPcu*@~(
 ]o0 ~y*s7g%9%(3H*@C`-pn	VH@
A1	jPA3hA'8΃Kn`Lg`a!2D!H҇ dAP	B	Byf*z:	@]h~L	CUp΅p%;56<
?"GxG
iE>&2 oQEGlQPUFFuzQ7QcYG4G۠t]nB/o'Я1
xb"1I>Lf3bX}
*QYvGĩp(
&qx)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd	3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))TUEMSPgeedɆfȞ!4--VJ;N	g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,<zD{xRby5{z[y!T<v~~\[w?Xc &0 &IiP^P_0%8&HҐ:О0ɰpu""]Qبn+.^*{Օ
SVaƜEdž}g60jfY.glGv9{c)LŗO%%NNtHHp/<%J	OiKťƦyiiiklY37e@2TTPGE8iY&+,Dt6/?G/g{d{kQkYk{T6卭sZWZg
=6Dؔ|W7w(l,ⱥP_8vk66۫,b]-6)(~_*7|cԲtNN]I喍QN//*'fϕeu{	{{G+}+4vVN]\VXv~{~uJuupܩhj89yIcXc߷o>=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv
>mяN9-{LOgsΝK?7s>xOLn\x}N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEV<R|m\??K/'
TLL6OMvtӉgf
~s6bvŧK^ʿ<j٫GS_/s-m߻wY+?~OPLTE}}}Mr>tRNSS%	pHYstIME	/htEXtSoftwarePaint.NET v3.5.5I+IDATWc0xLA9 .!#nv\2W\9uIENDB`PNG


IHDR

r|
OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*!	J!QEEȠQ,
!{kּ>H3Q5B.@
$pd!s#~<<+"xM0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^uf@Wp~<<EJB[aW}g_Wl~<$2]GLϒ	bG"IbX*QqD2"B)%d,>5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A,`6B$BB
dr`)B(Ͱ*`/@4Qhp.U=pa(	Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q=C7Fdt1r=6Ыhڏ>C03l0.B8,	c˱"VcϱwE	6wB aAHXLXNH $4	7	Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![
b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw
Ljg(gwLӋT071oUX**|
J&*/TުUUT^S}FU3S	ԖUPSSg;goT?~YYLOCQ_ cx,!k
u5&|v*=9C3J3WRf?qtN	(~))4L1e\kXHQG6EYAJ'\'GgSSݧ
M=:.kDwn^Loy}/TmGX$<5qo</QC]@Caaᄑ<FFi\$mmƣ&&!&KMMRM);L;L֙͢5=12כ߷`ZxZ,eIZYnZ9YXUZ]F%ֻNNgðɶۮm}agbgŮ}}=
Z~sr:V:ޚΜ?}/gX3)iSGggs󈋉K.>.ȽJtq]zۯ6iܟ4)Y3sCQ?0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl{/]py.,:@LN8A*%w%
yg"/6шC\*NH*Mz쑼5y$3,幄'L
Lݛ:v m2=:1qB!Mggfvˬen/kY-
BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9<qy
+V<*mOW~&zMk^ʂkU
}]OX/Yߵa>(xoʿܔĹdff-[n
ڴ
VE/(ۻC<e;?TTTT6ݵan{4[>ɾUUMfeI?m]Nmq#׹=TR+Gw-
6
U#pDy	
:v{vg/jBFS[b[O>zG4<YyJTiӓgό}~.`ۢ{cjotE;;\tWW:_mt<Oǻ\kz{f7y՞9=ݽzo~r'˻w'O_@AC݇?[jwGCˆ
8>99?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-bKGD	pHYstIME	/hTIDAT(c``1N<M61ףj:B6220000a4M3f`/NϟgD`ee}2'OWIENDB`PNG


IHDR

r|
OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*!	J!QEEȠQ,
!{kּ>H3Q5B.@
$pd!s#~<<+"xM0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^uf@Wp~<<EJB[aW}g_Wl~<$2]GLϒ	bG"IbX*QqD2"B)%d,>5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A,`6B$BB
dr`)B(Ͱ*`/@4Qhp.U=pa(	Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q=C7Fdt1r=6Ыhڏ>C03l0.B8,	c˱"VcϱwE	6wB aAHXLXNH $4	7	Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![
b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw
Ljg(gwLӋT071oUX**|
J&*/TުUUT^S}FU3S	ԖUPSSg;goT?~YYLOCQ_ cx,!k
u5&|v*=9C3J3WRf?qtN	(~))4L1e\kXHQG6EYAJ'\'GgSSݧ
M=:.kDwn^Loy}/TmGX$<5qo</QC]@Caaᄑ<FFi\$mmƣ&&!&KMMRM);L;L֙͢5=12כ߷`ZxZ,eIZYnZ9YXUZ]F%ֻNNgðɶۮm}agbgŮ}}=
Z~sr:V:ޚΜ?}/gX3)iSGggs󈋉K.>.ȽJtq]zۯ6iܟ4)Y3sCQ?0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl{/]py.,:@LN8A*%w%
yg"/6шC\*NH*Mz쑼5y$3,幄'L
Lݛ:v m2=:1qB!Mggfvˬen/kY-
BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9<qy
+V<*mOW~&zMk^ʂkU
}]OX/Yߵa>(xoʿܔĹdff-[n
ڴ
VE/(ۻC<e;?TTTT6ݵan{4[>ɾUUMfeI?m]Nmq#׹=TR+Gw-
6
U#pDy	
:v{vg/jBFS[b[O>zG4<YyJTiӓgό}~.`ۢ{cjotE;;\tWW:_mt<Oǻ\kz{f7y՞9=ݽzo~r'˻w'O_@AC݇?[jwGCˆ
8>99?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-bKGD	pHYstIME	nAAIDAT(ϕ!n@$# p5<$5+Hj@"Jҗofw26eY^u}70k$ڋÿAUU<ً0`GmP]FYh܍(
y34M,(""v])!}޵{z15PJw]ȲAt

M m~ORJY?#@Dw:\C17T~g3xIENDB`PNG


IHDR

r|gAMA|Q cHRMR@}y<s<w
9iCCPPhotoshop ICC profileHǝwTTϽwz0R޻{^Ea`(34!ED"HPĀP$VDT$(1ET,oF֋oZ/K<Qt`)LVF_{ͅ!r_zXp3NY|9,8%K.ϊ,f%f(Aˉ9a
>,٩<9SbL!GĈ3,F0+7T3IlpX"61"H	_qW,dėrIKst.ښAdp&+g]RәY2EE44432PuoJEzg`̉j-
-b8o׿M</AqVV2Og$>]9La.+-%Mȧg3YះuAxEK
i<:ŹPcu*@~(
 ]o0 ~y*s7g%9%(3H*@C`-pn	VH@
A1	jPA3hA'8΃Kn`Lg`a!2D!H҇ dAP	B	Byf*z:	@]h~L	CUp΅p%;56<
?"GxG
iE>&2 oQEGlQPUFFuzQ7QcYG4G۠t]nB/o'Я1
xb"1I>Lf3bX}
*QYvGĩp(
&qx)&gsF|7:~@&h!$&B%pH$D.q#xx8F|K!\H$!i.%L";r3EHK-AFCbH$^RSIrdd	3Rx)-))zR#RsiSiT#Wd2Z2n2l2d)EBaQ6S))TUEMSPgeedɆfȞ!4--VJ;N	g%K-sɵݖ{'OwO%)P_RRۥEK/+))U<د8䡔TtAiF쨜\|FyZbU)W9.Kw+YUEUOUjꂚZZZCu:C=^\G}VCEO#OE&^WOs^K[+\kV֔vv[]n>z^^u}XROm`m3h01$:fь|:kG23hbabhrT4ߴw3=3Y-s.q_vǂbgբ⃥%߲rJ*֪jAe0JOY6rvvtXLǎl&I']$NϝM.6.\ι"En2nnn[g=,<zD{xRby5{z[y!T<v~~\[w?Xc &0 &IiP^P_0%8&HҐ:О0ɰpu""]Qبn+.^*{Օ
SVaƜEdž}g60jfY.glGv9{c)LŗO%%NNtHHp/<%J	OiKťƦyiiiklY37e@2TTPGE8iY&+,Dt6/?G/g{d{kQkYk{T6卭sZWZg
=6Dؔ|W7w(l,ⱥP_8vk66۫,b]-6)(~_*7|cԲtNN]I喍QN//*'fϕeu{	{{G+}+4vVN]\VXv~{~uJuupܩhj89yIcXc߷o>=t٪E2}4\j5loDŽǞ~q=''Z^utv&vvEv
>mяN9-{LOgsΝK?7s>xOLn\x}N}g/]>uɫ,u[dS@u]7ot.<30tKn]p;;SwSyoEV<R|m\??K/'
TLL6OMvtӉgf
~s6bvŧK^ʿ<j٫GS_/s-m߻wY+?~O	pHYstIME#۔tEXtSoftwarePaint.NET v3.5.5IIDAT(SJPPή0Ѳ	ZAAuH^wp7!*"xEK=hu?\,y-_K8TUu(Vn*ߕBiaβv;Sa,K`m۲ 74MaN<S؃vI#4m  ƑQ8,z~Ӎa(
Elݣ,zFׂ |Za$m0x8;;g_st9NrcIENDB`PNG


IHDR

r|
OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*!	J!QEEȠQ,
!{kּ>H3Q5B.@
$pd!s#~<<+"xM0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^uf@Wp~<<EJB[aW}g_Wl~<$2]GLϒ	bG"IbX*QqD2"B)%d,>5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A,`6B$BB
dr`)B(Ͱ*`/@4Qhp.U=pa(	Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q=C7Fdt1r=6Ыhڏ>C03l0.B8,	c˱"VcϱwE	6wB aAHXLXNH $4	7	Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![
b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw
Ljg(gwLӋT071oUX**|
J&*/TުUUT^S}FU3S	ԖUPSSg;goT?~YYLOCQ_ cx,!k
u5&|v*=9C3J3WRf?qtN	(~))4L1e\kXHQG6EYAJ'\'GgSSݧ
M=:.kDwn^Loy}/TmGX$<5qo</QC]@Caaᄑ<FFi\$mmƣ&&!&KMMRM);L;L֙͢5=12כ߷`ZxZ,eIZYnZ9YXUZ]F%ֻNNgðɶۮm}agbgŮ}}=
Z~sr:V:ޚΜ?}/gX3)iSGggs󈋉K.>.ȽJtq]zۯ6iܟ4)Y3sCQ?0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl{/]py.,:@LN8A*%w%
yg"/6шC\*NH*Mz쑼5y$3,幄'L
Lݛ:v m2=:1qB!Mggfvˬen/kY-
BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9<qy
+V<*mOW~&zMk^ʂkU
}]OX/Yߵa>(xoʿܔĹdff-[n
ڴ
VE/(ۻC<e;?TTTT6ݵan{4[>ɾUUMfeI?m]Nmq#׹=TR+Gw-
6
U#pDy	
:v{vg/jBFS[b[O>zG4<YyJTiӓgό}~.`ۢ{cjotE;;\tWW:_mt<Oǻ\kz{f7y՞9=ݽzo~r'˻w'O_@AC݇?[jwGCˆ
8>99?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-bKGD	pHYstIME#۔IDAT(ϝ=n0Fc[v0r{ѡkc>B='	$.BbPh)'#	0+X$rVιvs<pw97ͷs4Utm
x9&"r	!sN.a03Ii7y3C}BHV,	MӔg{n0?tj1|anA˲R%Q#C4MQTU%UUezy"q_' K@'7#u	@IENDB`PNG


IHDR

r|
OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*!	J!QEEȠQ,
!{kּ>H3Q5B.@
$pd!s#~<<+"xM0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^uf@Wp~<<EJB[aW}g_Wl~<$2]GLϒ	bG"IbX*QqD2"B)%d,>5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A,`6B$BB
dr`)B(Ͱ*`/@4Qhp.U=pa(	Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q=C7Fdt1r=6Ыhڏ>C03l0.B8,	c˱"VcϱwE	6wB aAHXLXNH $4	7	Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![
b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw
Ljg(gwLӋT071oUX**|
J&*/TުUUT^S}FU3S	ԖUPSSg;goT?~YYLOCQ_ cx,!k
u5&|v*=9C3J3WRf?qtN	(~))4L1e\kXHQG6EYAJ'\'GgSSݧ
M=:.kDwn^Loy}/TmGX$<5qo</QC]@Caaᄑ<FFi\$mmƣ&&!&KMMRM);L;L֙͢5=12כ߷`ZxZ,eIZYnZ9YXUZ]F%ֻNNgðɶۮm}agbgŮ}}=
Z~sr:V:ޚΜ?}/gX3)iSGggs󈋉K.>.ȽJtq]zۯ6iܟ4)Y3sCQ?0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl{/]py.,:@LN8A*%w%
yg"/6шC\*NH*Mz쑼5y$3,幄'L
Lݛ:v m2=:1qB!Mggfvˬen/kY-
BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9<qy
+V<*mOW~&zMk^ʂkU
}]OX/Yߵa>(xoʿܔĹdff-[n
ڴ
VE/(ۻC<e;?TTTT6ݵan{4[>ɾUUMfeI?m]Nmq#׹=TR+Gw-
6
U#pDy	
:v{vg/jBFS[b[O>zG4<YyJTiӓgό}~.`ۢ{cjotE;;\tWW:_mt<Oǻ\kz{f7y՞9=ݽzo~r'˻w'O_@AC݇?[jwGCˆ
8>99?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-bKGD	pHYstIMEcRIDAT(ϕ1QwXXRzs>e,$',XHHi&6Z)DQ4Frf9Ìrq~ͽě`P(rH0~m6^bbh4jdsKy+A IZ&cO_{\,VҹT*IVvժZ-t:z]*vݮ1fl6>ܡhdá"|ӓ1J&ǚWtp8.~Im14MNA\;\ѥxP.IRXk!qxT:v|k\u
 ˽M$N,#yx}^N.w_g`^@,ڂ{;IENDB`PNG


IHDR

r|
OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*!	J!QEEȠQ,
!{kּ>H3Q5B.@
$pd!s#~<<+"xM0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^uf@Wp~<<EJB[aW}g_Wl~<$2]GLϒ	bG"IbX*QqD2"B)%d,>5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A,`6B$BB
dr`)B(Ͱ*`/@4Qhp.U=pa(	Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q=C7Fdt1r=6Ыhڏ>C03l0.B8,	c˱"VcϱwE	6wB aAHXLXNH $4	7	Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![
b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw
Ljg(gwLӋT071oUX**|
J&*/TުUUT^S}FU3S	ԖUPSSg;goT?~YYLOCQ_ cx,!k
u5&|v*=9C3J3WRf?qtN	(~))4L1e\kXHQG6EYAJ'\'GgSSݧ
M=:.kDwn^Loy}/TmGX$<5qo</QC]@Caaᄑ<FFi\$mmƣ&&!&KMMRM);L;L֙͢5=12כ߷`ZxZ,eIZYnZ9YXUZ]F%ֻNNgðɶۮm}agbgŮ}}=
Z~sr:V:ޚΜ?}/gX3)iSGggs󈋉K.>.ȽJtq]zۯ6iܟ4)Y3sCQ?0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl{/]py.,:@LN8A*%w%
yg"/6шC\*NH*Mz쑼5y$3,幄'L
Lݛ:v m2=:1qB!Mggfvˬen/kY-
BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9<qy
+V<*mOW~&zMk^ʂkU
}]OX/Yߵa>(xoʿܔĹdff-[n
ڴ
VE/(ۻC<e;?TTTT6ݵan{4[>ɾUUMfeI?m]Nmq#׹=TR+Gw-
6
U#pDy	
:v{vg/jBFS[b[O>zG4<YyJTiӓgό}~.`ۢ{cjotE;;\tWW:_mt<Oǻ\kz{f7y՞9=ݽzo~r'˻w'O_@AC݇?[jwGCˆ
8>99?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-bKGDIDAT(Ő=`j	Kpn'`l$sN؜u4i>yoJ眍X:UU-q*E* "V:䜳OA s7
jF5v]'3<꺦-PʲDD4iҶ,PUfiӲ7Iw=IENDB`PNG


IHDR

r|
OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*!	J!QEEȠQ,
!{kּ>H3Q5B.@
$pd!s#~<<+"xM0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^uf@Wp~<<EJB[aW}g_Wl~<$2]GLϒ	bG"IbX*QqD2"B)%d,>5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A,`6B$BB
dr`)B(Ͱ*`/@4Qhp.U=pa(	Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q=C7Fdt1r=6Ыhڏ>C03l0.B8,	c˱"VcϱwE	6wB aAHXLXNH $4	7	Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![
b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw
Ljg(gwLӋT071oUX**|
J&*/TުUUT^S}FU3S	ԖUPSSg;goT?~YYLOCQ_ cx,!k
u5&|v*=9C3J3WRf?qtN	(~))4L1e\kXHQG6EYAJ'\'GgSSݧ
M=:.kDwn^Loy}/TmGX$<5qo</QC]@Caaᄑ<FFi\$mmƣ&&!&KMMRM);L;L֙͢5=12כ߷`ZxZ,eIZYnZ9YXUZ]F%ֻNNgðɶۮm}agbgŮ}}=
Z~sr:V:ޚΜ?}/gX3)iSGggs󈋉K.>.ȽJtq]zۯ6iܟ4)Y3sCQ?0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl{/]py.,:@LN8A*%w%
yg"/6шC\*NH*Mz쑼5y$3,幄'L
Lݛ:v m2=:1qB!Mggfvˬen/kY-
BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9<qy
+V<*mOW~&zMk^ʂkU
}]OX/Yߵa>(xoʿܔĹdff-[n
ڴ
VE/(ۻC<e;?TTTT6ݵan{4[>ɾUUMfeI?m]Nmq#׹=TR+Gw-
6
U#pDy	
:v{vg/jBFS[b[O>zG4<YyJTiӓgό}~.`ۢ{cjotE;;\tWW:_mt<Oǻ\kz{f7y՞9=ݽzo~r'˻w'O_@AC݇?[jwGCˆ
8>99?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-bKGD!IDAT(ő1`1ؠxx	EwHE#Ub7Y5;00̛73VUkl6un:HUe\yZ:uaX48V0 P,4s9cvLf*Qd2!ITغfwa4@
~z-<ϩ0n^-˲Jpbr?LeYVs:d(B1XkQն"'|>j*oz:8Pzcrrt4IENDB`PNG


IHDR

r|
OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*!	J!QEEȠQ,
!{kּ>H3Q5B.@
$pd!s#~<<+"xM0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^uf@Wp~<<EJB[aW}g_Wl~<$2]GLϒ	bG"IbX*QqD2"B)%d,>5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A,`6B$BB
dr`)B(Ͱ*`/@4Qhp.U=pa(	Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q=C7Fdt1r=6Ыhڏ>C03l0.B8,	c˱"VcϱwE	6wB aAHXLXNH $4	7	Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![
b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw
Ljg(gwLӋT071oUX**|
J&*/TުUUT^S}FU3S	ԖUPSSg;goT?~YYLOCQ_ cx,!k
u5&|v*=9C3J3WRf?qtN	(~))4L1e\kXHQG6EYAJ'\'GgSSݧ
M=:.kDwn^Loy}/TmGX$<5qo</QC]@Caaᄑ<FFi\$mmƣ&&!&KMMRM);L;L֙͢5=12כ߷`ZxZ,eIZYnZ9YXUZ]F%ֻNNgðɶۮm}agbgŮ}}=
Z~sr:V:ޚΜ?}/gX3)iSGggs󈋉K.>.ȽJtq]zۯ6iܟ4)Y3sCQ?0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl{/]py.,:@LN8A*%w%
yg"/6шC\*NH*Mz쑼5y$3,幄'L
Lݛ:v m2=:1qB!Mggfvˬen/kY-
BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9<qy
+V<*mOW~&zMk^ʂkU
}]OX/Yߵa>(xoʿܔĹdff-[n
ڴ
VE/(ۻC<e;?TTTT6ݵan{4[>ɾUUMfeI?m]Nmq#׹=TR+Gw-
6
U#pDy	
:v{vg/jBFS[b[O>zG4<YyJTiӓgό}~.`ۢ{cjotE;;\tWW:_mt<Oǻ\kz{f7y՞9=ݽzo~r'˻w'O_@AC݇?[jwGCˆ
8>99?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-bKGDIDAT(ϝOagLsbF "S$3H
\lvMH!`SPЅrN3Zٜ!9wpK|גVd29]V5hjQUlvZV6_j60 t^(4"
@*@vvnZLFDUk-J^?o~BǞnHUJx^\.jcZklfgh4r9iJ$ibq=@b`0xKqq!S(H$zOE9@c8T*r|u݋q;Σt8#"r7k މU]Huw
IENDB`PNG


IHDR

r|
OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*!	J!QEEȠQ,
!{kּ>H3Q5B.@
$pd!s#~<<+"xM0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^uf@Wp~<<EJB[aW}g_Wl~<$2]GLϒ	bG"IbX*QqD2"B)%d,>5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A,`6B$BB
dr`)B(Ͱ*`/@4Qhp.U=pa(	Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q=C7Fdt1r=6Ыhڏ>C03l0.B8,	c˱"VcϱwE	6wB aAHXLXNH $4	7	Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![
b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw
Ljg(gwLӋT071oUX**|
J&*/TުUUT^S}FU3S	ԖUPSSg;goT?~YYLOCQ_ cx,!k
u5&|v*=9C3J3WRf?qtN	(~))4L1e\kXHQG6EYAJ'\'GgSSݧ
M=:.kDwn^Loy}/TmGX$<5qo</QC]@Caaᄑ<FFi\$mmƣ&&!&KMMRM);L;L֙͢5=12כ߷`ZxZ,eIZYnZ9YXUZ]F%ֻNNgðɶۮm}agbgŮ}}=
Z~sr:V:ޚΜ?}/gX3)iSGggs󈋉K.>.ȽJtq]zۯ6iܟ4)Y3sCQ?0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl{/]py.,:@LN8A*%w%
yg"/6шC\*NH*Mz쑼5y$3,幄'L
Lݛ:v m2=:1qB!Mggfvˬen/kY-
BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9<qy
+V<*mOW~&zMk^ʂkU
}]OX/Yߵa>(xoʿܔĹdff-[n
ڴ
VE/(ۻC<e;?TTTT6ݵan{4[>ɾUUMfeI?m]Nmq#׹=TR+Gw-
6
U#pDy	
:v{vg/jBFS[b[O>zG4<YyJTiӓgό}~.`ۢ{cjotE;;\tWW:_mt<Oǻ\kz{f7y՞9=ݽzo~r'˻w'O_@AC݇?[jwGCˆ
8>99?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-bKGDIDAT(ϝAqu#jLЃeCG=I) ^!'`(. gƷ,[mzོ{߇C}lyd^z|_J[pFRs]W~eYHaZJӯ˥l6Vd2)Ba?NBG:=ϣVeYlT\VJ΀'סx<<J$v}]@l
Ðv|'FnV9ij,\.iXydYvm_U
`ȚqF2Ld<8b07Juxp8MkX|?4B)u""c!FJO"2o5:n\0W	6X#IENDB`PNG


IHDRsRGBbKGD	pHYstIME
2J6IDAT(c\d	)ī~`Tèixih$K5Oy:IENDB`PNG


IHDRQgsRGBbKGD	pHYstIME
98ɻIDATcXd&}X="IENDB`PNG


IHDRiNsRGBbKGD	pHYstIME
:5IDATcXd	50'IENDB`PNG


IHDRsRGBbKGD	pHYstIME
6a'IDAT(c\d	)gV401F5jXxÃx?IENDB`PNG


IHDROU:tEXtSoftwareAdobe ImageReadyqe<IDATxb?0	K AsRIENDB`PNG


IHDR{7	pHYs
OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*!	J!QEEȠQ,
!{kּ>H3Q5B.@
$pd!s#~<<+"xM0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^uf@Wp~<<EJB[aW}g_Wl~<$2]GLϒ	bG"IbX*QqD2"B)%d,>5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A,`6B$BB
dr`)B(Ͱ*`/@4Qhp.U=pa(	Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q=C7Fdt1r=6Ыhڏ>C03l0.B8,	c˱"VcϱwE	6wB aAHXLXNH $4	7	Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![
b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw
Ljg(gwLӋT071oUX**|
J&*/TުUUT^S}FU3S	ԖUPSSg;goT?~YYLOCQ_ cx,!k
u5&|v*=9C3J3WRf?qtN	(~))4L1e\kXHQG6EYAJ'\'GgSSݧ
M=:.kDwn^Loy}/TmGX$<5qo</QC]@Caaᄑ<FFi\$mmƣ&&!&KMMRM);L;L֙͢5=12כ߷`ZxZ,eIZYnZ9YXUZ]F%ֻNNgðɶۮm}agbgŮ}}=
Z~sr:V:ޚΜ?}/gX3)iSGggs󈋉K.>.ȽJtq]zۯ6iܟ4)Y3sCQ?0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl{/]py.,:@LN8A*%w%
yg"/6шC\*NH*Mz쑼5y$3,幄'L
Lݛ:v m2=:1qB!Mggfvˬen/kY-
BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9<qy
+V<*mOW~&zMk^ʂkU
}]OX/Yߵa>(xoʿܔĹdff-[n
ڴ
VE/(ۻC<e;?TTTT6ݵan{4[>ɾUUMfeI?m]Nmq#׹=TR+Gw-
6
U#pDy	
:v{vg/jBFS[b[O>zG4<YyJTiӓgό}~.`ۢ{cjotE;;\tWW:_mt<Oǻ\kz{f7y՞9=ݽzo~r'˻w'O_@AC݇?[jwGCˆ
8>99?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_F6IDATxbd``e?~H8<pd'N2#E漁qYIENDB`PNG


IHDRX,	pHYs
OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*!	J!QEEȠQ,
!{kּ>H3Q5B.@
$pd!s#~<<+"xM0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^uf@Wp~<<EJB[aW}g_Wl~<$2]GLϒ	bG"IbX*QqD2"B)%d,>5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A,`6B$BB
dr`)B(Ͱ*`/@4Qhp.U=pa(	Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q=C7Fdt1r=6Ыhڏ>C03l0.B8,	c˱"VcϱwE	6wB aAHXLXNH $4	7	Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![
b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw
Ljg(gwLӋT071oUX**|
J&*/TުUUT^S}FU3S	ԖUPSSg;goT?~YYLOCQ_ cx,!k
u5&|v*=9C3J3WRf?qtN	(~))4L1e\kXHQG6EYAJ'\'GgSSݧ
M=:.kDwn^Loy}/TmGX$<5qo</QC]@Caaᄑ<FFi\$mmƣ&&!&KMMRM);L;L֙͢5=12כ߷`ZxZ,eIZYnZ9YXUZ]F%ֻNNgðɶۮm}agbgŮ}}=
Z~sr:V:ޚΜ?}/gX3)iSGggs󈋉K.>.ȽJtq]zۯ6iܟ4)Y3sCQ?0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl{/]py.,:@LN8A*%w%
yg"/6шC\*NH*Mz쑼5y$3,幄'L
Lݛ:v m2=:1qB!Mggfvˬen/kY-
BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9<qy
+V<*mOW~&zMk^ʂkU
}]OX/Yߵa>(xoʿܔĹdff-[n
ڴ
VE/(ۻC<e;?TTTT6ݵan{4[>ɾUUMfeI?m]Nmq#׹=TR+Gw-
6
U#pDy	
:v{vg/jBFS[b[O>zG4<YyJTiӓgό}~.`ۢ{cjotE;;\tWW:_mt<Oǻ\kz{f7y՞9=ݽzo~r'˻w'O_@AC݇?[jwGCˆ
8>99?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FdIDATxڄ1
@j
v"E>fq748lp9#bC_JSJwhpâ_am]zlh/<
U;RIENDB`PNG


IHDRX,	pHYs
OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*!	J!QEEȠQ,
!{kּ>H3Q5B.@
$pd!s#~<<+"xM0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^uf@Wp~<<EJB[aW}g_Wl~<$2]GLϒ	bG"IbX*QqD2"B)%d,>5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A,`6B$BB
dr`)B(Ͱ*`/@4Qhp.U=pa(	Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q=C7Fdt1r=6Ыhڏ>C03l0.B8,	c˱"VcϱwE	6wB aAHXLXNH $4	7	Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![
b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw
Ljg(gwLӋT071oUX**|
J&*/TުUUT^S}FU3S	ԖUPSSg;goT?~YYLOCQ_ cx,!k
u5&|v*=9C3J3WRf?qtN	(~))4L1e\kXHQG6EYAJ'\'GgSSݧ
M=:.kDwn^Loy}/TmGX$<5qo</QC]@Caaᄑ<FFi\$mmƣ&&!&KMMRM);L;L֙͢5=12כ߷`ZxZ,eIZYnZ9YXUZ]F%ֻNNgðɶۮm}agbgŮ}}=
Z~sr:V:ޚΜ?}/gX3)iSGggs󈋉K.>.ȽJtq]zۯ6iܟ4)Y3sCQ?0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl{/]py.,:@LN8A*%w%
yg"/6шC\*NH*Mz쑼5y$3,幄'L
Lݛ:v m2=:1qB!Mggfvˬen/kY-
BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9<qy
+V<*mOW~&zMk^ʂkU
}]OX/Yߵa>(xoʿܔĹdff-[n
ڴ
VE/(ۻC<e;?TTTT6ݵan{4[>ɾUUMfeI?m]Nmq#׹=TR+Gw-
6
U#pDy	
:v{vg/jBFS[b[O>zG4<YyJTiӓgό}~.`ۢ{cjotE;;\tWW:_mt<Oǻ\kz{f7y՞9=ݽzo~r'˻w'O_@AC݇?[jwGCˆ
8>99?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FdIDATxlα	0E	J";X9kfA>V
ީf`-Tթ!Xc\_:&6ٗwf=}zP3ڢTIENDB`PNG


IHDRAsRGBbKGD	pHYsM&e4IDAT8˵1r0E2NO(Xp{D'Ȥt約"i֌C3jW#`L8GI0n1ƾH6͓ITRK`dN$EnfafC@]ly]eY$EO%ʲ56]d2y8#	.2yMX,N}tPwծ@V Öux0:	\e\wIMi\sJ

=pUσludy@JicmZފ&v?1T;IENDB`PNG


IHDRAsRGBbKGD	pHYsM&eIDAT8˵N@n.KG#3lO
yjDVT
vA94wa&Wiwt=c;^<j!S$I=6fJI
F.COܻx	ziO~ͦ@JU{\JVDyYE[qIeYF[]*˲5Hk<_='O2yEъ'3I$}F.cI#`6?G'k,yI`P3Eē^ạ-s22[$]Y,$Mgqn6Ʈ3`z6ȵ&-i$I>{=iPqѷVIENDB`PNG


IHDRAsRGBbKGD	pHYsM&e+IDAT8ŕ=n1A*HNPހpJΑMDRP0i!(Od߼-@;`o0PE ۪DQU_2(c6ثj؋H_ދ6a^U+"Eߎ0==	0֎sBZ;
Dy?y?P՞D4@Ip'I_8䧹ZqI~:sd5ϛ[zZs%|ɋ"YE\?VMY'fVIENDB`PNG


IHDRRetEXtSoftwareAdobe ImageReadyqe<IDATxb````@3@kFX&IENDB`PNG


IHDRV(tEXtSoftwareAdobe ImageReadyqe<#IDATxb```bc fef?@$@@	`vb%UIENDB`PNG


IHDRV(tEXtSoftwareAdobe ImageReadyqe<%IDATxbf``b5 $$gg 
`Q3IENDB`PNG


IHDRtEXtSoftwareAdobe ImageReadyqe<IDATxbd``b0(PIENDB`PNG


IHDRtEXtSoftwareAdobe ImageReadyqe<IDATxbf``bG `DP待IENDB`PNG


IHDR(-StEXtSoftwareAdobe ImageReadyqe<?PLTEsvx\KtRNSfn\IDATWuI DшE@FT[E7fX)H3K(fibb3T=<B?GBvp)zF-S
YIENDB`PNG


IHDRitEXtSoftwareAdobe ImageReadyqe<>IDATxb?hJtHR3ȧ?0$@T`+lY@a	i*3-t! ̅'Oĥ (c`x|im(?T*C3AÈMP26?e (*kx3aH

"b#첿]l~~!° ~A4
٠񙸤аߟ	u@.cf,FAN/labg%Zӷq>}#3;A r!FlqЕg(ٴSIENDB`PNG


IHDRitEXtSoftwareAdobe ImageReadyqe<XIDATxb?)ҀL,Rub!1~
`ׯ_	 f1d$Ld1qCBIGwx6Qy##1@R 9n&Vo~E@L4Ah&=zf 
@h?f4	#fj`ƿ2
s5#;E_Hd4IHg?>]
h(0A\h0+/ЅH?B"?At/);}	{,2?0c8tF,Ee#6o2 i!ƑIENDB`PNG


IHDR[tEXtSoftwareAdobe ImageReadyqe<PLTE`?`?`?}c|WyNΪtϫrѩjؼҥoدt՞̓Ҍӎ΄хӈّْؐؑړڔڕۖܗݙݚޛޜߝߟߡ殢.tRNS>fبIDAT1n@ovMGBHP:nvBr{T6!vNWb*O!wf#E?px)5e<kTG3PEHK0]8ϒ	VH飰]V*Q<RTw]IENDB`PNG


IHDR[tEXtSoftwareAdobe ImageReadyqe<PLTE`?`?`?}c|WyNΪtϫrѩjؼҥoدt՞̓Ҍӎ΄хӈّْؐؑړڔڕۖܗݙݚޛޜߝߟߡ殢.tRNS>fبIDATnPϿ
u`_
UV"%n(9cY^|lt<xM&\{0df\y>g
pD6T<ԝ?/
O~Fe9`2-Njn>eO_%(2fnΛ\4#k7IENDB`PNG


IHDR@4=tEXtSoftwareAdobe ImageReadyqe<IDATxYGzJ9_nb*3@ȱ~+_wAz~y__y~1?.scz-ӏk
=kKZ*z4# $}O#z}i
B55cr
J/&X5
RMkWD_~7^b5D~#u{
KmV9֠
3/@s q!7/88|lsf0u<_y BP.
n6[Ziy1lla?<nhK2w㕱]t_>sQ/ʀM}[|7X`p@L\fܸcDb5q'/-g#dP_-\M4܃I_װn	QaHsiA!>3Zz'$H&+Y{BB,\Isb)
#˦=u#(ruc:?1][L<hXae9|?γlaf1آ2BP3>8?]/mӟ2`e*U}ge2L򂉊uUUհ֖3D4?[mɘ,"\ĬJ30P83U#+Kz"FoRBcVq¹ӯ l"8Qjm"}tE*Un;plU@RN3D@J֛e΃*NJK&fDoXm%]|̻s
CƐOt.SM0$.y^'ii]"47.Hљ0"Af{~预>J@X;\%C;%RxeFԷ8k9J7<y<*f*Þ-džnfcKqSt
3vKOK\Q]s[ȰQ9ڄ)&Yt^}l˩`}*n ͅJ[t.ʙ J	yS5	8KJNM2b9<1E}#`|L:7{C]mӖu%Pb%v7.TP[/rQ/pf
OnW#f)l6fQ_"bTK%h&c;|7T=E-4ZfJRf(]GTB]j:UM"?{Es
O%jr;`~3o-(a[@O#8T_1IT{_"@y/u
Ռ:Rמlqv)[y1Ѧ%1S"ݸv|cgg*8Nt%j2-Tc)V#[JьX̣%Q{z$oAm`G\O3#,o+z[W&l)<M?lŽjFA6W(X%1$d/-AΞ֩+C1@JҠ<`(DSRK:18r-T+wgzqϵ535t`5ݪB:h4ǹ%69Wp*):?\~m|n<@
7zc&_>M{ j͹sM(czwL'*YM;nbًS	`\8' z;cA[ޤW/>yg~^_ʜBpppO}x(t.@P?o''pK[HO>O*A|_
p|^x(x(tJz/
p
3::pʏIENDB`PNG


IHDR@ojsRGBgAMAa	pHYs+tEXtSoftwareAdobe ImageReadyqe<IDATx^_MSEQH
#e1
xO~&?&`p`|>W,˂^@~<^|~n`&68l\.la
p:}߳#p8c{6@۶liu]be(
9`۱- 26faiH
1`^(B0t	@ޠ/NҔW+0&`p+`&0&`p+`&0&`p+`&0&`p+`&0&`p+`&0~f*IENDB`PNG


IHDR@4=tEXtSoftwareAdobe ImageReadyqe<IDATxYu8!W]x.bRKn["!1+W~7xWۇvq\ﳐv/avX?=A\$dd 0H~KHyةOXN<e*memd~Gx~m_C;Fqڮ3aK&g7'OW;ۆWl45]+]mwHb%w}
9wQ75fj">x$FJaN/Fc1|i#@ 6Oi7v[k۩Țe‡Hwyh`CT9r$.m )&m&(gTceR:4e\A-śhYXE jFL桫,G{b<
y`I'HW4-;ŊyR^R 	h:`1*0KmzN{XȔż4ֵXU0;Q[72HO|0"g9uy]a<9EH%;hXƪчrrh0.Ⱥ
Fq?l)*d33BS
At!6OU1J'cai*ty!=9%
(hi~^G5==db9B"K9orMj8~`XTՠpuڜeuZVĵMdž)#[Q9_)'i]``xQQ!"w/t8w[-00+y4c<e1QVwE,vfثw&@^G:wֹJRbnWJk>Mg4Zu){ʿX@԰ot ǥ`z!?=SM;$&	=LZvLa4SdɔI
sU@H=}̅l}hsbѥ97"fXh+mh6b:“"cq
z9ϥ`,iO44˖mdT $MJ~KZk&m	j::\o#܂h LK
rCb0=e-Lh`=}Lxh܄㧣X?gO!LAD[׀X\YZI#':szN:n/}>28M
@庯KmRP
@(P
^zu(
į	EPL/B!N@(vBP$]
B/X#^$~T!".PH%P~I^QPBv-
@(uU*;^0S^Z^IENDB`PNG


IHDRB tEXtSoftwareAdobe ImageReadyqe<IDAT8k\U?3LfLERk5HJc[t!n kJwE](⢅Ѝ"+(D*bRVD[m~L~L޼{qd8=Ucqlb,@PTQElhGDDwBVlj!UɠQby	À
9XmlRt/nڋrK(
xaA8lˆhj(QTDdk(s8|B5QU"Xc ArP-O}rW}|֬g%(@7$;ea֑eMę/输xAqeg)0tS"]Y2{Oxr淜TDtصfn:R48C,zE?kv0p
U*j0ϣO6qkk`ׁAT)L (DC<k>.AE2|B0AJ!*
!ٟ*+qnSڝ9&&HRƋd#>beuF%e&>ťTU47ƲnnK˹KhwPU8w4&Z`EE Q//
[Wb9Yo72XS23,T~dA\lʛ篾҂5CfhJ{񪺉TT8sc` TkS*`M`)pnP̡ۚOTog'.='m^dTU0Xٱe>5/0oT4{a`3nlޫe20	\x`tz,2̊_IENDB`PNG


IHDRAsRGBbKGD	pHYsM&eIDAT8˵1n0E @BB9)sco#DTKMIpF<{<[{ @4͇1ƫH۶bJU?Rc_\BDe'lFUׂ^}?eY>KϋvF.re"֞DdխTU\;`TuYsev@uˮ;郇\SU}	hFD#Z>xm]׽E|z4IENDB`PNG


IHDRAsRGBbKGD	pHYsM&eFIDAT8˵1N0?Wiڡ `+GAJszPzHuh'YD@z%:Z{
_
97hx#|VcLt撖[fiz"ze~E;aE/$IFƘ#I>EHt.@~fiI:tx1f`e$84Esߓ}ZuӟD$O"Z#^WkӳڿZ{uv6[S^ԹuXIENDB`PNG


IHDRAsRGBbKGD	pHYsM&eIDAT8˵U1n0EHi.A'i"Ž#%~CJRN]؎Jvgƻ	aHQJm*2ù(4TѼZ_o&c3[v`I;v$Z%-WeY~"6Rc2TU޶j4Ʌ
,䟖ч8xGQ0C%ȸxa5\N~hqf\fE4,{
\Gk]
hIENDB`PNG


IHDR		tEXtSoftwareAdobe ImageReadyqe<IDATxb?!@ JKBiv 	9?)p*Ô;["UkٸQZA@]M6+FFf{9jDXu8Oش~ q!I<@ c9@lA ">-IENDB`PNG


IHDRAsRGBbKGD	pHYsM&eIDAT8=0FɚL#KNх	CW!
H9,Yh9wVx69pB%z967PWV|^>z[1!<&ƸUJSJ{(" ފhd:Ԛ\s>Zk{eG1s%7$IENDB`PNG


IHDRAsRGBbKGD	pHYsM&eIDAT8-S1t0=Q5u
~?Bb'75Y>w6x 0
1ƕ,^h:ƪz_*3PS>Bw/$1gԷrM0ţ6)"0{?=Ƹ!<El"`׺X*4B@m^@U[yWZ׍9A?>c3_IENDB`PNG


IHDRAsRGBbKGD	pHYsM&eIDAT8=
@F߄M4bs-=Kr>%l\+&+.Z80`sMܴ^!}_˲$ZƘYD&iX|v`MD8bGm
d@BcN. nΥ>Q)uXȵhYX4ERۿ9u]{=k	BmUUEO/IENDB`PNG


IHDRAsRGBbKGD	pHYsM&eIDAT8˵0#]MlWY&><S0.Ն\@P*y&UU(2@
T !{<k	l"H&RfD(LcM)us@RK)S"::E&PbuMER'ȉ̼|]֮
3'wLj`Y{ZbQMhG
>ނBeQP#˲gky(dIENDB`PNG


IHDRAsRGBbKGD	pHYsM&e6IDAT8˵1O0? u]:Q簳SX+2.	K#cFШnoN{|9+%6JkA#\ey<3|%d%=+L$8 ^PJ@ki:X`u6Pոm;c$ް˲|>F3QJӦ:uTCN7U{G**X|
Ck6݊Z;Ju_,ŢwJй|?Yc!^C8*q#pUZ`q]8`^/^qpF
ʔIENDB`PNG


IHDRAsRGBbKGD	pHYsM&eIDAT8˵UAj05BnC_'~@zzB_a 'rSȱ	&k,բ]J`	 <¢(eO$@J)ODt¤`.8eڀcKg	z㜯Z&1W9+0D{K4VuCLUJ=wAMpR굗EfɴNZ{nMr֥
/9sowu͢(zhGIENDB`PNG


IHDR5Y^tEXtSoftwareAdobe ImageReadyqe<"IDATxb<F %`u#IENDB`PNG


IHDRRWtEXtSoftwareAdobe ImageReadyqe<pIDATxbd```b??+`@L/21J2C""_u989%8#//3YYϬll"0
P4[ ٠IENDB`PNG


IHDRRWtEXtSoftwareAdobe ImageReadyqe<IDATxb?X

8Inn6(`_ccc|r߿ス=|t #K.30B)ׯ>}gF$L'B17$0@~$pIENDB`PNG


IHDR5Y^tEXtSoftwareAdobe ImageReadyqe<LIDATxb|Fπ1tp`6\F	#0٣xm)'`IENDB`PNG


IHDRRWtEXtSoftwareAdobe ImageReadyqe<qIDATxb$,@&4{@/H˗/޾=b@7$7?/zvQm}PX@ I	@2ame?IENDB`PNG


IHDRRWtEXtSoftwareAdobe ImageReadyqe<IDATxbxW_Ξ=;@@9_	(	ӧׁl@ I߿]M??NJJ^K^pBPPE@@'Y }($j{(II2;G=OIENDB`PNG


IHDR8EatEXtSoftwareAdobe ImageReadyqe<IDATxb
@|IENDB`PNG


IHDRtEXtSoftwareAdobe ImageReadyqe<WIDATxlA
@M-[jWj8JuAO#~:ء<e	҄o"u	*jyxc_/^j|Ui&IIENDB`PNG


IHDRtEXtSoftwareAdobe ImageReadyqe<IDATxbd```bɿ20rϱIENDB`PNG


IHDRtEXtSoftwareAdobe ImageReadyqe<#IDATxb?X322~~E..nF !
kIENDB`PNG


IHDRtEXtSoftwareAdobe ImageReadyqe<IDATxb4fIENDB`PNG


IHDR]tEXtSoftwareAdobe ImageReadyqe<gIDATxڔQ0CXcqYU6P,t?k_7h4m&Y**LDK!5Hn:uCWK%hgG?oX*998WK4IENDB`PNG


IHDR5Y^tEXtSoftwareAdobe ImageReadyqe<,IDATxbd```eXXƿk301+0YdSIENDB`PNG


IHDRRWtEXtSoftwareAdobe ImageReadyqe<tIDATxbd@ȘM
Y`:E|]30] W̯#TPGb@]p@
%$$!I K2srr*l-xBIENDB`PNG


IHDRRWtEXtSoftwareAdobe ImageReadyqe<IDATxb?.fbN bn&$	Oܹ8//O#XnƍTԽma
^rE(ᢣ3Vp֭m99XR cB@@ɳ?ӗ?1@b2IENDB`PNG


IHDR5Y^tEXtSoftwareAdobe ImageReadyqe<BIDATxb?>6x022~§嫷vme
U
a@ei&6d#418lIENDB`PNG


IHDRRWtEXtSoftwareAdobe ImageReadyqe<yIDATxbf```bF(F@,
Ĝ@
\g>EMF@!n fK~A
8@0L4_P."2BQqc ŎUS	PFT"; IENDB`PNG


IHDRRWtEXtSoftwareAdobe ImageReadyqe<IDATxb?.@Cw dnllz'''/ Ɔ_|e9z#)))^w@,\\\B,,,7n8 --dlFFFVVV%%\(g`|_ 0b-@4IENDB`PNG


IHDR@tEXtSoftwareAdobe ImageReadyqe<IDATx]}\,,@ ,,,Y]F	A([Qk56vcvֵQ16mn:vũkl\Hߝsgǻ]?$qs=/XMASQVIB("-~GZPRPO"h4_-Fwxӂ-.xH|iG+?guAi.8}GY)ѩ3[^	8coM'ao/GkLxudn$v;f}W<c/^~4*BpީQD]BϘr&b+;x.5w3bNx_.^?5m]GoJ(o|V扷Ơ7=;pW_+_Ɨ9me_?߶c%Q~P%
kowwa72YٟxL3^wsۗC7Cf3~m
e!c脹1Oz_?7&m=xm>\tBBح?D^wc-(SOvL)'my>	"ܜ{?fo\ [5x<Ab*`7>qKA":&!1oRDZdz?ߍE<QyHc<uj3)scS:;	n`*Ht?&p\G@ài+<'@;MwW_M{O5
(/6h?:no?ZX[|;໵+]O;6x_o,>H~8^#K}}Sb%afs5Q_-
4bz?<U3
i#!K7m7pB^$6?VkoSsIO<鐍oVX={_rqW"Hh.e^J*\Kk;x%\vlzW~|ZǮ9ᡟx/x:Pa7+?h1d`bs):Oo7x1lVc[ǐo0=˿x%<ٔkw䧏5}cF¿;ʛXu7M;[]~.~?DE_g96U/گ4~?ao]qב3/~㽮DvL	~ÿ]9_̕?[~%}6/TM',C#׃~#hAmM}xV"Dy:`M/"M8tK<vlD띾I޻&	MW,wa싛fr,ԪFg,S%(A<*<ڑw5&
t<Hs
ZttX}jv1Z/90?8s8"Y]–YHCUWI;|tp9&?UfVy
?a
psؿN[r7#8<#YGO9n
g _xQe=Щy'~ʉx+"G{
.J:*0"İ/Ǟ
d0寐ił݅݌ZX;BexfB;DtqNۭ;faa⹠1s@/c7gfv7G=x:/O|k+I:cY3)3~z	R'~K#$g%afx*&MB9;[[	w1frRl!jeL֯>9 c뒲^i{a#3nOQ4e\U=gg?oUxL\?RCbDa{Br2\#CrK[ߚԟ!b'X4u"{dQ[3ᓹ?i͏zь3:x^=2Ge%ƗǏ<-?~.^vr3,nJ}ʺ A@b`_7nx)+/=iYe§Y	Oymp+!W枑AoƙduS
O͹kJϰf@635-~NL
?;[%~Ln{TM+֜\(+jf5')TH\HBHˮi^?>Vٵ/,~Qm|0IQ6zGgRGQ 5Dn
z[CioW?[ᯒQ/R嶟I+
hC(	EWPP:f`*-
Qsd?/ikRHsho7rh$<⇤ֶ ܮ>m%ӷW3[7:B^#W!)\H8p-ʟ
P:p>)%U$
+?o˄?*jHaX>A	g/2`5xdXjq!WUEK
jXڰrmI?O_Jɿ(Gk?!#l[HLNIשtOkneYœPӹ7#GlU8,Giūaǚmk:'-G`wRW0?<BFQ,_L۵DVJydmpT&<v$<iRv->r[/<h2O9W~
ҭV@r]gK PXjo"jcjf+N m02pmڨdC
Ww/~Q/o'[̟F[|VQ֑_Q
q21z^-QD5M<ޚFܗ mIgfWU_QnfS5FMeLi^py0xƟa'~'=m`eK7f~fo;3:[f乀] ;=
9?$Yږs$`S?ް]8w7i[xY=Ӳ?ϫ
?K=!C_M!n;G-^r^O|YmƟ{܍8l(:=}ϻ0gUc${bȹFt!Q3<mĎΜSiu.>J 
xe!~iO
,dq%|G:Uxm-1u~CMxb:fġGyky 3?.:vCn2xw?xbZcc|d
RІ#1~d_eℏ֓~8ڢ؎#sw]z5?#YA/lY#@`Eu?A^Ig #Ӫo>䓙ֳBzF$<FuUSϹȎQ&(_\O:QjAU]I梽p+NwGd ֫8xfV4,̆$L#y͝'K_G5X@/D`אN]M5徳̿uFj#Q;xϪ𬓲xy?~|>/5WS+?߭r4Yh;#~9Q=}#%")?lq;'ݨB
MQdž2o	Ke?ާ(#"_b۠l1~lpxc&SD]P
re(9P3܆wwxOw0NgckCI":-T&^WnfD"wdCi٫Z#~k'zg-!NbTebkb9x~l-2>#'	
A~3VxkmQO]9kIสYc~wΑ߼ߩs.ɟ+8@
"?ι`2A`b^DEOϣt4IENDB`PNG


IHDR@shtEXtSoftwareAdobe ImageReadyqe<%IDATxb?HL#hp2KAqZtIENDB`PNG


IHDRHtEXtSoftwareAdobe ImageReadyqe<9IDATxbpqqZ@̀ I&:H `0΅IENDB`PNG


IHDRHtEXtSoftwareAdobe ImageReadyqe<:IDATxb?:vqqĀ`H`wfdBS=H، ` 06@g+WzIENDB`PNG


IHDRtEXtSoftwareAdobe ImageReadyqe<IDATxbZ@̀
VIENDB`PNG


IHDRtEXtSoftwareAdobe ImageReadyqe<IDATxb?:vqq`٤7IENDB`PNG


IHDR@shtEXtSoftwareAdobe ImageReadyqe<)IDATxb0Fzd301p0#=KwRDIENDB`PNG


IHDRHtEXtSoftwareAdobe ImageReadyqe<aIDATxb?7~Ǐ1@[%i/ Vb)}da&vNN{@S3 &( KBIENDB`PNG


IHDRHtEXtSoftwareAdobe ImageReadyqe<XIDATxb~bXf
#
?}da f3edo&Tw@t	80b0jIENDB`PNG


IHDR)tEXtSoftwareAdobe ImageReadyqe<
@iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.2.2-c063 53.352624, 2008/07/30-18:12:18        ">
 <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
  <rdf:Description rdf:about=""
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:xmpRights="http://ns.adobe.com/xap/1.0/rights/"
    xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/"
    xmlns:Iptc4xmpCore="http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/"
   xmpRights:Marked="False"
   xmpRights:WebStatement=""
   photoshop:AuthorsPosition="">
   <dc:rights>
    <rdf:Alt>
     <rdf:li xml:lang="x-default"/>
    </rdf:Alt>
   </dc:rights>
   <dc:creator>
    <rdf:Seq>
     <rdf:li/>
    </rdf:Seq>
   </dc:creator>
   <dc:title>
    <rdf:Alt>
     <rdf:li xml:lang="x-default"/>
    </rdf:Alt>
   </dc:title>
   <xmpRights:UsageTerms>
    <rdf:Alt>
     <rdf:li xml:lang="x-default"/>
    </rdf:Alt>
   </xmpRights:UsageTerms>
   <Iptc4xmpCore:CreatorContactInfo
    Iptc4xmpCore:CiAdrExtadr=""
    Iptc4xmpCore:CiAdrCity=""
    Iptc4xmpCore:CiAdrRegion=""
    Iptc4xmpCore:CiAdrPcode=""
    Iptc4xmpCore:CiAdrCtry=""
    Iptc4xmpCore:CiTelWork=""
    Iptc4xmpCore:CiEmailWork=""
    Iptc4xmpCore:CiUrlWork=""/>
  </rdf:Description>
 </rdf:RDF>
</x:xmpmeta>
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                           
<?xpacket end="w"?>
IDATxdyv97'lNo_$@@-\"E%ڪ-UU--MMX%DIE
@}o_6Nɝogft~?}!_/z_s>t݇_s[?Kp@#ߟ!$C'݇wWh8J|Ox;HB{'&!H&t([$IyBQ(hI-Z>tM|7.4fa"wZ(~]Cwy'(#g`T7LM!3EV.fI*5;#߁dՎ+KzrAx,(HY(B"H6"tv)D42fTbTbtӜ6dGCۏHGG"yν^_Wsˋ)	兟A1B8LTf%E:"c;<NGV2A"sp_M>1pSS桃,5
0C+mĽN魭+6"i4hb* -hEcT~		126fPTI_8	U'p)_$
U'}융sb>t++w㺿lpu!(crqS&Y&ÐJT!68
1ThgԟSD'.Ɣ?
!PKQM$aY

Ňo95u:a%Kq;$y]8\3_a[5_ WdE %B*z&Ș7z$(U`os۸wD	LKhDG&yV?t9}|KAsrw^OzMD:#yQ."XY:uG'<
ys"XZ	+Iz:]Ԏ|#ݠ8HxPOR%i*CbV)zʧ2>9U~9kf%ӯ7oʅE+)Kx"
2<jp}kIX-dMK2$~-*Ԯ;ՐeF_4OןЩ:r)q<4Rl] \
C/3o@W~Y8Po4rox(Gp8B^ X&a\r-(H_!$oEGj@'GEPʏMA(8ωNJ?x|{F
3ñ.=5?J%.AӮwfkM-z"0_Y9BpB#aZ$Q0VLlz>'B{Cn?1߈
6-@8]ҜHkR
"{TQ*ڇ'Oy؜;Ҿ/Ż/QRTCâyG"2+scד1!gFSc<}{Oj-JӀ*Q3:,!wd05tgJF`H,H{n-.܇Nvp\Ɂ/YLkkJw{?H%049uiCivɞɐK&eHJ=x4Өa2ˠwB`	`b
˓^naa?qqjY߹Q5WX&ʣTxM6\.\/w+ApCٜ̜7B?S O9]㩜P
-!vQM5Q9IJJ3B-4~-{|)h@Cj3Gb;:μ+2xYC|OBHdۺcKKx0|W<Ez(DUWo1Y01#m<R*Ȣ]CGB@*WL
t>3V):A4Hp<Ru!HHT|j0 H{?
@ M@(5yaPߓ1YfWjГvǻNo
EzE+_wAc<JD 8c*/($Y0Ede==@uұ&$p*%MM$Oi//TQ~˯ѷiӅ5µ[Ӆ4BrȒRރ vN;;>5%4`U$qi(.z hXF=mdT14{;Lq$+ypҮ!P"9d@8I.^Vz߬k?s&in*($-O~䴪AF6uۆUG~5Cַ&_?^ckV㉪a+$*׌e5A
C4TLC<p~LO]J3 o^;_?ۿՉ>CTG!Eɠ*~ĚY%q@xIF|7irn+kE2OS8b]&aFUh0ġb!C
^
'$݂?a"~wz.O~
0:kuFbpsw{"SN+0<DGH!o{kT
N`7EK7tE$^h^Nv@ɝ!(;$ƓƛfXLA0
懚&4YPJitӧo\_?^w[*_=M~w:kz֊$*녉^#OoW}Y!]yjULR&#/Q&-B|]B/%)AGYoBT!	
L;[8p'@Toohc:;յn[;$"Dǭ)CmnljQD97&'=(ʹ-FcEuy+\8yDa_;>:4mfuwx~ >W LOɸ\W0d!OE	t6H	4dl/C3Ip_\>B?(ʹ?*r@~sB2mZlPnlj~@DB1$1kiCĊ'|)Z0ZY5NPdL4kÂs2V%dx(
kJNt	W)#_}s?	ciJ_'</7?{cw\Jo찶/0JS_Fa<"4!*w$o^jEFuDz+^.:d<5jg~HGbիB0 WIl֘~?m
(6W]vg߽rŕsFҖ<`i[DRiy>=UxAwMw49Y0H	ˠ=y^ހ;:{_:*ޣC6H'ngEbc#"CbNL0Nq3*UnD[$}<PmՉoE6.c4vN£A
M#+omKsic
z2$]9nKKzuWOG/pcd wʨ+ei{Nvֱ-;֐ő!FLoB2<\x"#|1>Gm:]mF[\ƙZh+3s3CXNjYNH]UD|k-t)%I°'Hv^{TȰqn;kn|oor6z-fY;8N&O{!	-&bx	10~'~.Бo"V{Atή]
чžP}(DׄE;-K_qZN譭N?=Y?
5f͎
7oP
nmm%2$1[W"ݪ'Ht$#f~'ZZ_DކdhpVY}C|	fh>-I25yx˜5'&e%Etpaho.@q?xciw6Ƚb`=IɐAvVz"cdCw,mCDӬ:XUٶH9\u1juɕ_7ohNOAG:۝R;X5XRZIϻkurзnXL׵ @ɛ|Q/WBNk@iwU!?ϐ'n{kfKҫ.^c1mCO=S=Z
׈*(vC?Qlue*#EqyCOτosn:]Nj;6(1mw떌\>A&&ءJ}Җ?rVڥI	-|sGL]"wg2Zty.(<oPrT]ϮWf9'C!,4'{!M&韱桽<ac2"ط|MH/9Iw_tV:oF׼Z܍b]t;%XMQ
O|чK 4X<d)&{x0$1g0YN$B!5-j[ڈ
l
 %?=QmmZw)Ɖ3CMbc]֐ω?'?
ÿɿ<|{anѻ]JX^׋:8ݹBgyG?쳔'qUqj	\	^1np)RN*8	!13#K,gURD!:%^AFpfcF`o7a[㌍f1FhO-t!t;6_4_k[[]駶w/zqOF97=?2Z+ϋ*s_`ԑ9j>
&ɈRyi1Ddh{ܖW>3.F9lF^йKmN5kzp/j	gR24AҎR./GqoAck6hI]hS\	nJA'8fxjEљb,&"O:/)|/:҅7FpMz;.͕ɘ^5dMr3a"ouJHlu
%+4b$djR4ZO/qTOJ]Y睅OU_TORHhGk5@S}sbTU%EȨH!?Y9`/7֓pio^Hc<M+1Hw蘍Oޑ$*OC'Iwx#ONY|+#iͮFU?MɏMi>&k yn)93z!C077HJ@Etvc_):~q,K6Bdr[Dݤ*ǬKHٱ#3SFu
SoP@0,K#Ȑ(*<4T=;x wՎҒdu
C+jh+p/D=C!RB3n!4h
sN,"1ʛ*5Ը_BtWW#5+nؖ\hN
7dt2[<Z4D3%.[E<˲`֟V	QC*LM}_0`_uֽ߭)F4QAktP9>R~9^zNuVQ`\$SRTWBIJJH%s	e@p$JB	dHSLL.|W\(9btFdd kk-;@i,GEvF)Ea֊صű+45;+79;`ihk1&?Tac0~JTϾ&Yn_taEjӰK$t[᫯?\7gmvBbN*CM'
o{a听ZOLӗ3Ec8Db=FO褊9͢aW$Q^SD*CSEҺJI'P
omٷse_1F2Nh}QE]J:ddT;"{3js"݇>9p[{/_8m+-oM(r
.jn_ٜYzN/jL|)hƖgT*P%jT+|0x4	aS[й8Ӷ`뛖?;?O*$'XIf&1aRh(
#rr!s,LXDw,p<Ei)AS:
܃'CZ.Xna~,\՗Ks͖hڈOISmqgh]`do'!{R^Ğ 8&6:?Q@'#v[c9fd϶Q2(Hjh*&R#zszpu!b􃈙R'Uo^?	dmD{|,FǨ?1?tCZǞQΖøyGnnvnjŝlƁ/_۴*$⁛%*W\ޞ949U)Mե+z}M8-gj>;t|{M9q(=>#d$rb,mqBP=j>F9zBWu蠱I8Qˏr)s^񣮡;u8LC#im,zWk=ƉcT:9 YM">Z~uZsjKm,;^`E%1.Gya5uWnsN4n/	Z8zWo{['*y9]0!mS*;zZY_X|AƨJzT.'sރ_bxF:$]
{0=<Ci\UXrQ~
H\'?Yζ>*MFZЫeOJtmœ#Q{^H&g%s5{rbzMpwFaWC{m]\,Xpzde3iZkj:}&raJK-ԯ}~$`֔$Mϫ0^<T&l'fjʇy/Ds/O&%KKVr%G~+/~ٗJ$H֏4$=^<+DZm'\2:Ζcοϲ'ǃ?_s&7zWݰ%բQ$pV]6o8OoTDSs~V8S:Vxx9{ٳ%u1DZZ!4h1EMՋ5ɉ$xy8Zb&1,Qw˿L{Z@,'j<ۑd?E
yg=gœ@0*bx4DxZqӟ6>;>ܱtݮhq"TBUsH:b?..4>V`>
1(9fzhZ[@u)ddӲvy<T)T?[_Կo:r3oޒoaTp>Vn`9QyNfےbnmVrɓGc+Vuv%{Ay~:JuMSiJ$_ҧЇdB
28gH>]Vnwm>K_Z`wh~R/N>0t)e5-00<+-Vbmxfoh!IWOz'~z?:q!=ʈaJI,PxQVoͻ.z}سhYXBX6YAQHދ_#/~3	R5ƌ{HlDᰟz6ajZa؅4C눖3j!hCOٯ
6i1̴=e(8{s[YGF8Δ
7י96`Hcb~}iykMTHA"irSyXrZ9YNAP'\ gvN٘<gڮ[tOc!/t7<g<uJ`IldDK_)
5,S6[cnqec/Er%93?3(tVWw;g%kY(Ս;Fh(&JOcSv0!%򾋍fˋP.>QBG}GDH9yY&4EO$Ik~<Ed#|h!>o?[y؉a4ff9o9QJi*ճXAԝ0^ԩZcb"p= 55v;7m?mnM<WJrF6SJVnqOOWWu5RcNn;2.grw{CGEf}׷`IUt(.)&
z^U,
gTM>NOpU&S\)h •~r%c&P<д?	{>%v+0njoml}՗^	m璪۳~x{fVzJ&"@ɇv*Ir*At0l0l3'Zlt*}rŊc!(
cee
*(Š{%Y3sg2^@TC{wާ+Δ,AW2AGډ6DKݷHjO9[-PBrn6jxh&ЈgӠeM4Һ.mW\vy$ȷf+/(>ka$G\<OY)kJ\
v϶R?罝]yu^r[ɗJr4uY9HӠsetfZIjN`j
\5OK{93ݩ)0`1?\Wfo֞yJ x(!0f`l\&[99.>^@л%2fnO٫eq3ňGjN/cѮPuG$DЃF͋>_?._;W^}}ϾOx&SDy{>L
Cy3sGY,òlyn뿾ůpaJuٙ}aPaYlB6+udJT(.[>$T(Cw}Fvk~_nXqXҥnWJyb1Vn(fhn_ҟl?2;Bj,T|$$wk+,K"QBy|ldikiyZ12"CDu|ͯ|f_x3j[WgaÍzL(;f"0MgBzHU\)~X{j3ЉEw3%ٷښjڒçJQf12ΗVn[ٸtY̭~LyF3*bكy.X	bnJ|q2pxO$qH	ݐ0+U/|jP쁄GqZLVޚ^ߨ;2y˿'>B$a'd¡zΎWgx[^d+UJJH	A&_tӆit/@K7X;Jʹ}&!di	XӍJ)&a,RR;|&*ѤgrO{
(;^ͪL
kW.$w#G/2bG
n"
hew>T봝vv;w#[zmХ5Zn0/+yK{Nmv{roYD&K`-x
(m+0=e9XS^/-[CyT-ɞ4/y4mYDgT4Vx9)gmKҾ⑖	p"qE,3BNJ]fNࣰu[/ܵu孭]]?1gTOd*u?W(V
cgGkn+	3zԴV}ӯ6.O"Su2Xi8\O|Ϗ~#SϊwGxvLJTxʑ]Bbpa@$F
x
v<u0AS^CJ&-֬VbXލkת>B:?-4Je0Yd{Z9Ї
q=HPI_=A'Т|c.CW|R~܍eJ̐&qt[x
u^qæP:0YD;vߠlnnW\4GSZJrhi['#?R<"aڙ7闒(T*o>gT<2yc^[{>0}{2L,ڤVO3sJer2W+<\T6'Z-h̏y'8z-sbњ:Án>;5z VfqsilM>xJ:M>Uf>ʓj]Ȟ1=bo6C+=<{/Љy|~JjŞٹwdd8&w%7B6(hhOa죶?6wz_OzA܋1*;[-常7ZWeD%yd	x/Ud]>w^*"+O6P5&(KS?|/i/wZ.sҔ9`-`sy23UkSjc;f؈P!VO/t=5-U	3"f(ثI`yZ7 />\}`HGš	-SaQAhbV(M^V%ҫNC"eO}g6yol%G?YYE|uVKgyA7U~EJ\=9F5ܢ?GEWrBC;v4 ᾙYѨmrXF19:??V<VlYKׯlbm۷t萟AZlu?Xrݷ^o~yØN~hC;]nptG1V`$	މFeOn1KLv8Ɖ)N#GpGarɈgЗ&qg{kҲ
Gj2꜎4yRo\w}:'{3~w5E ;	= \
m5X/6#35aϬn0T,Yiҍkn*ּ~*
E(]AMyRV Nݸ؅鉺Amϩ&(	^VKz'ejqVNt0G?H›N쮮
?0Q.JϿ9Iq;2{0ZY-gTszn3#ǨE"Ǻc;ޮoϞKSF8+P=JǵGS5*܁#<DksUZ]V0j\ٿ7=h6AL^=tI"5
IJd3b<hz%(WϿDW)`VJtT	$+OEU^vj
]M0н*R0/\z?C?4;=7jq)ln>QA?deZ'?[[%Ѐ8zƮT8ci	:+N;Qxԉe_]BIciǪ$(l	FdЦ<(@7&1OL;$|b%Ob"_,(0{3vq+YXa'ξ9{k4_*bq&ej/!w53hLJ.Rnd܎cu>sQ"?Խ2mOf=YFIfq`t`/4یjJ~dw̽(z6i]9oƱtFx$(W|ic4w~ؒo^;| Tk4f0'?7_	B#?_%.n3+摺u+YI:R/"lh a		\? &WtbFs\9f9iW1X^/nZ>w{hm	ԝjNKn.@HZӧK{ӴIdb.u]7{]*FbQJUB]$ȽnMnw>s7NbI}t,`]kУDq1x2LdHA㘡j!=j-\u6lZ9sUm0`d_gzdZg_ڍ?dUPv(쀩||ՋH< |:SǗM6]k>a[GƄ9D	Ȃ8N
k:l{Z06=xo&|
}4 %t$S\4Rۏwwؗ6_.U:34F'NbImΣeJ\ʅ1QNFwgdl,΢ndžX/5Myϴ49ɶ
@BMU8ډ%.i<
سlO$7rYgk
`Ysȋ$dfLMBFn*V~I$Cv~߱	ܞn37%1O
w=3Tqb>\7Q2|,#Gz$RV31BGY->5>͙1VO0EG$OT{4;pй̰e؞0dLPtY"
ٸ4R9&&\’>&i[,G[iD2W@yqBJor~B֌-;A3Q"t]IȑS#'U1C|רY8al@niv]eغtzV9~(;7J6˥NK/;$xs7`˄|8`XufۯYՌJȭz'*C3N2ٲ.A"IHx! CZRaZ8jt0՞J ~'AwW<!gD;S3yC2|+ޙT8ReNi9>q~ǘkZ;ZS'ղMR=3.46<S&wh*:[9)`k'DnK`q$:Kՠ`|DD%ch"07gX\7R<.=͊~}˯T6rZs+_RM~dP($'!csss:붽޾Gč!ܢ3ƻyG)[ۑn
P%Da5LHw'ƚԹAR1d䅗+!Jm%l<U'	|dS$oïGp鳱NI|pyYI,N{jݸy
Hj\N#S|ZWj<9a9רQHV涶$wIIYo`:Rf{/m+5&r:\~wcrǔ0&mPȍ
	UKخ@Tَt.y&p'^Ù̗.W>=*'kkkׯ7h@>tיL._؈\p[!SUg.:–CGu.ӸYC	]m'pHRP@㴱2MQ=D)V%r6YyxرN}+9׃C
@ijbydȹamתJZ?V(̈́ͦjv6zo[e25M8Y %6rwl뉈Mr:a[XɨX
`>Le[Ԅ^:LT0{4&Z'J [MpcB(f<qu3>i)` qLfƴ,#;ۛΜv]c4*N7o'&r"2lnFS0.q@5d3HYpV,	
m#oO`t{+γ&QsXIXiM3O!J#5s{#+eLonW[M{h@{H:F'=wr\,8ٙ<
$ݥlG%(mN:~.qcZ,ٯ.ZuFz(Qp(NOT
eidYj'4OU`0&2%`>o37Wک'8qtx1{󥗂Un:s۾X44b	 ٴl=?_4
Z턒	1`y#6[v!'0^	+TXj4
@{(U$DF}<WTmI'-;Ag~aTث'˹~~00@OE̒C
8Ʃ!ڡz:'`^U	T
)8y4Z693]Y>ήXH@%bT~4ƥVaE
Ut5*:InWQiX6u].0(>.WM#!XXu}띳}$	8km/UݒƆSS4`,
6lzs'iw(84OC¹yuc)h1)
 cN%Etb`hA	Dgՠ#/6/w@W`;sux*5
};6B~_3\:<I$R5B/X[p^fM
9Ġד2Mӱr~bƦzw;Cb*.98{oC{ӊdAwP;&SIb$ʊ=QRW"{E"$az%kт =sLݾxFP ?*2ѓνsAF݄tH$_5a'zJ-ѩD^F6Z۽pjQB]OL)tcRuCr:Gz=ڇ1SDJpфZp[0\L:l}[	I~vAKh %Bv[lT>
-RRBb(/0@ьB[un7P>(NPƒЏq|;/,.Y%n۝yqk3L?[
̛%FS8&YʅSts_RTQPC"!1hNl?ʟ8?0O7LCg.]	I}r	9MJy}l`FWwxaa`mhd4UO`Mk&8t_#wSijSl а]:eGpĄ̃*aJןr,$@&^\4{yQ셩H5ϔ߳a֧_hO-(s80qku<|g{kvl6QqFzG [\%N$ZqzETP::%&NB8:zndm8vN
>Ŋ8
wo._dvN3upifgܷ	-I!fCW^*{gY	u }xy'M 1QX7P-Pؿ>b:BAZ{'c!ЉXut}S7no4N(ZB9A쇉mN*
JKhZiWݸ}-ϵ7KB*(zڵ+W$޷B<Lbi&$0JvOd53Fُ[ꁊ$CA3E0iFZ	iQ(	"&9p孝k9\#z^Got80|͆|.*l8u7؎6@:GN=^g,M%

XḺrd@10Lӕ&}zҒ>s;U)V'\8VqiIc$˓ț;}ٷ(XK~$H"uڙTa(q9kr	hI$!(Cn0pWiϾu;t^>mJ#fO3
:	gaҀQ,qU*̉tJ@PGQ%:U= NXjJH=yꘄ|[9pDWc0|)<ü=xs79Pt[aCb
.`"I445B|64}U[B/I6WK°.b
;&,i	Rv5lV/дB?ΠzJ@ɷ{Q'1դa:$g9RY7H=NmgX\͝΄<!mZTɬ&"Hn;kTR;4ME&8uȖ`|L1ʄxΨ*5,x{G8;\jۢ0
@db<ȍ&WrxU=Tk\e
dw`lp;)0SȧY(l cH*ʡɃDr+ㆈ0iLF>6i]XtKrK_'
''oq$\XU)Jܐ ~ 5H;YL46Gݳ)v}g{t.4/.$q	Y C8.$)JժG$MЅ=ɉJ'xQuS;$DVRqmn[F9\h./<~uǯ	!tR8AYڜ ɄA&f,K[`] XS2MUz'2Ɂ J1E?섢fJZ-]V'dVb3~5mDpihF?^e9?9W原~#hI/~?ZqFaw)%rP$'d*%Kp|u$X@TqtZSzVg3 ,fxQOz+W)H&$:~*,CQIFYSUi5͑a+V6T3KRy,>TPhQ{Tݤm3
ir]^)Q.L~i 696
146OLtG贆hDK)Pv	 ᪫
F!Z"yi?Tu%Dmw:ܘ'eyֵnڷx8[Ngggk;FEJSAzCFN>o;Z'3Mֲ5UN0bcJ[hVy7w
5%yQ22Bѕ&UT0먩/IBEZT=Y'Sw4q\màMGUcۺn1=1}沤RaWA-TGK6+f(63@-sX0U#K{65>ȯ!K9dLa}h8pKel;|M-(ϞltZ݆b~,Txs΃p.Z/v;d(W6&"KG7Xp#JI^r =8Td8UHe6DX!"E=JF37l	nK!=ʋhS*<YAecA0,H҃͡9ZTjD4ļ4Ttp=wvDǙș˭FSaVNB:6:l!giTS"23TuI{OU4O7]QM*`AZ7zn 
TLolEU yȆ%;hͩ]ƾ#O8$Dw)-PfS<-%F_
vx}ۭJZRWcv\Rݠ}QTPdkYAn'z%Z]%ob>ӖmaC&NE
use]xJש۠DUhA
$7Sn{~fuj[VՒazԥ1ƞd,.ƍЍaRel_$ci(sw|6È˨3h:Lt	ml[,
ueDs-0\by :4G	H8qܚ<az+hg6V32}qunmI{$a(l
2&UKIۖfi,:;^cݔvbeVY~֘ǒ	fDJt4ڂIZF#Tkg.iCe\'"@UhZp;	O[QJI
f:7L>4>FdyEYOV0}ύnȸ4p_M2s5RA2bGqHoE\c_tn~bqAa$<i;m
HS\
dO4EL-
c^!Z鞞}3ϴ^A,7wh%)";ښ&<
`U# !X
譤fH M9UZвJU<I]~,K$]cQ[h*+@thku%@JKkkA$"#1e!,&'&py41|HܹJᦉ(硩079V$RTƲΙnh$~1܏(a~H0X-?l'80:b*ѠQXTq?jp}m-l§&!GF
]=qx7pvi}+Zb]\#mexfGˀ8Bb$>Lg5X[Lb7F$
Q@4 mA-(5MWeγk`SLTumҬGrEU|]ҔӚLp,i2NxZ9$@BWV$*
VjCPtp'<`R7PC⊢TmghyڀRM
	G
Ą<XQƉ&
Ou|B.Y)A` %/[׋S7#efD=*plYW=FTB:GQ)4._	/.tq\^Ǒh}!\^@p:+p}G
8<ʩ>/N!ĘKڏULjepEO`"7PVtǹS4sePFhbD3u
E-f1(H(ANcĔg@/$f+=|dm:PWWS8fviT42̄	/57xMGwi{8lQ|Nin)ZW/BJA+ӈ.ے
bᔊ|D?ti7#Y0 $)6SR}۔d[>{ҝiJbiYdW)N5_&Fb{"\_Jj-҉1I
5Wi=sSU4	ڧ4rs
$#(blPy(WpEA*i)i<F q-EKbWF+ē%ƜWVFqBD!>tQ-3gCEjs49JbQ$
K(-Q4.LZӏ?zkX{h芑1dACeu"a_6PG5*`~Y% &Os7DH9iB2Q"o)H%7tǎxGE1÷Đ{;ڶa^)/"8	:acA3")`uAt1$TI}Ig=5Y/)怱WGe"H\WD(~p	
D	JkF,zE
0W6iAۗ/<JHI;*j@`д)U2Љ愫My*Dq3}Tr3
0%!`E460sh~~μnRU?䣷&d85Cg0l[mg	t&LYC(A<QT@V4ѱy=mB0.Ǵ36HPs׼u^%C-a$Az\LɀJ4UHJ@hYh,v+Sx#~8luBDx"7	 WL(Q
' V[۪Pg]+??np.ѲL8:%*M[7&ihb<ۛ{HD2>բv-{_?M$qޗXvU{OOwNp4$,ˊ-[۲eG@#O_8OA$p,Ģ[DYL8r}٪*/u鞦<{j}_\FPaxTgJT.oRea8']	\VXPjek74jiX3MZ'{r85/v*)?^3p∎Kk(hp4w|C?7>}ṁe`FリYc)t$5%[)XZv4FH*٘ro)x8<\Ǧĸ>BMySwjLp۝뒆qE|G_)^|jК</J>y@c'z1<a7fabm60pٹsx$A&!uQ۵j00q%`U&-!p*Sd`0U K}&\ly3bgH·6#lfN3{|yv'gH2=ˣ֚^뒅j6kh:Mwzy?3@GD!Ah2Ee+7y*$EC3C(LQg]20i;@ĹCM²֢ľx(lP.$޳QKpL 'o?Ȋ˧W$u}q*MD6!c΂RV2!#ûSB2z@gf6E
	7	kda)ǩzzhR}w'xxҝ@cixY@W?<AD=yk,k@OKk/lIw9lv<6mfEn1ꌏAB`MH|̧p+JSw4 H-\t]d(7$PMiRvB?VSf\eV*ѐ{
%ՖS9oS%Os"78"GK2uOi:.?|J?" }%p0lěVK&+8Q+
uKpfH,ShCQMm^$@z{≢Vs!>Yan0a2AetlRݹ>ɲQv0	H-=m4ڹ
w	O,Gpza\AJ2Ph,vh X2 pV1 uǤKx̙qDe)63K
$d =2x	GmǖOB}R\b{i/5Xֳ@䏡/u'm#+bzKT1˂?	Ca1:)<V#񦅽q`7FC|%p&&|is_B|ύqN(,%JK龊]\祅aO+Я1;}!Fq
a6HrNbJxK(tt`#'΀	kY?%p&g?D4+tx3.9@Skɝڴh>%ihk	,h꠲\B\3W1lK0W^9ό^3?2 q[bW$`<#FcWrb8%ЖQemDE~
(e(gb"fj(n΍e֣h *,f2WzZT
YZsHM^" ` 0X8{+gFAcNwjʞGzO	/v!-Q
j	ͻytSO,֍E`!4kn'}FwI羦#ܺ^?iK}
nNeS9wSYA vd%pCac,JV$
c_ciYQa$?qlt/;#djkr
J$슃E,ty=2ZYe%t`wfV%'ʦu酹wNʰ050Xm+e,1/ATB%;g..@)Ĭ-쬫빤&d`'H^Ϻ,w)Q<\[Pgin
0AxuaVmJ9<nTh˕<WOÃvB剥&XOv֣1&x 	jgєƙktYG9VY)퐫Z
.Øqd$.eN1=LG~@7jAV	Z	rIrnd	vK9㦢	lKQ#Fj`ŗ1"^
aI$G!<tyąTڿcDK2x0^,ab9<:v;Ii&G$ 7vo?s"ACc
с"q0-0TERF*nPCZ)U~ntUR{|b!Nh]k⸴+w8y	yAqypjQ]DNEg:& yؚ%+^[5tRWf4P[嶞:0XRx_q10ת~@)rnL(?5$εeLfGFf4MCbЦ:\+Qr82Yܾ.ŶI	_&<v%/_d- v)!=KBNO :7!st_LNմ{YE֓8İVܘStr#W*:(\@Uj%y?T
2ώS5reǕuM0du3l{D50yH	]	#/NaXǖ>3z4]5cGrѼQms8aiHRLߘ]04Ƣ2ï*/0t+c`@h\q+lf6T5\	֌bR(R}hA&hꪪ(ˇu	EbqPF(mdaX.]~JBb~/HƏ(a=ʋvޏdd٣
jA>3C>6@@^P8h8yt%V@?7\HHqmfk}G+[ݕ.:eԡDr$%Ъ'V.e09Rj"{m5nĸ-∑e(J%KzJkG[wwB;rg4)MAX"XDXA;*fY2T+ hH, ?ICbkOjEv˼L_Eڼ
i1AT{œy;zʋVxKg3<
6ŰjF]|ia~myXoG++a.!(9I	~(cV98h2r6@­AZPcc]Ka`Tse-4itTaa`/f[	YTf`o[iY之ް<F̠?]F$Q909qٞ2;r‘W?S{|?5&6%sDx(F-#
-gBFy`ߊ ]+d=Gd~]
E.wõ
Ac(Z:h}>

"/D>luXAS Ga14(ǁ](F@!:d<݌FAZ}߅gwU+LFJuN%;NHkr8C6lr~@q@\cvZ#WY,]
UTI{ug:{M8hSt?V^iH{46/K{\w	xHe/V LxS?Qa
m*Ym-y՜)y<c0*s3U,@E>^2*
!{yװx&Q3no+D+JWܓ4h	"1 A2,(C~
[9i<^NI8DVrwӵ+`5GQ8sq&)RN$I1
YąA45<|HzC+C̭ND([PfDÖM/M嬨	dmw'ZBZVJv-le'bot/8A!;ÅKh,0FVyꌺf}sEA1
qp>'?5;ge]
%C_P|	2,_sQQ&^Z9.NjF#tg.*b
g,
W0F:k7Y:Ӟ>XP!ݡzV.dP	ճSySyu졺zg7I?p\`jn
)}%/]<Ɉ۳ydC᫟m9ܙ?̙EBPQ|$ف<pyD!ɀqX1ꕖ~F0{z|B6d8sQIu.*cY!!AV8'Fju5
Gwqyk~qfUݔdBi9Ն?Lʘ8(I@ffV2x
-f*%?AwA!|a|ǀ:3Ȫ&t/-|qv~a_zcn`fjL~^)^B9ױY/A@wRBxO4p)P+|W ܙtUn\t .<9/0,RSҶ;v+	}}iz̙4cCVwDtdNN`KΓFSO)7/~
u`I4̢㤏.'9QX^f -4B'\
t)m4<$qAp-V7^n'ŌeK=;I8+
{q᷿;`A/ڸ~XDPʼLGY 0J8d&„h [󃰙]H@_tJ xQ8p~>o7ÇEF˅1swcHX+xJu?$rMp_ sNF:~5-a1p'NyLw]*]t)^[.8Vd%iWpC\ڬѥդHU;eLER^͆ASO	aT&hdByw"E/X`Y?eB`J3[(%z%%qzh	1)zțBs9ʔΫ%d.~2\]
ɖs{9؍wYg'9߸rڋcR&48t~d_;R~E}yl6:i*0`gIa#
leWsPQpQyG'0(Ҙ@hB~1oeG=1.R}mPN*
W<n?wo.땣kPC
t6ݑGlO[J~&vQv` R5E
1@8uhF}rOk$v]ia.!%]e4Ÿ<;#C/"tj5(6{SW~6!$vg/K39<}"<VѯYt
]:CMZIu6u'bHK.8D/geoCFqW#=/߉u5ʋl+A]gn|wVz识lbCe -Ķ͝k{"M3\
%0Yt
+0:BhX90蠱BhO*׸{;,F`F.~PgCPay I'(q5
mgז/Yzب:A61{C*%.+]\ϲYϐTxL4y<-zir<Ƹ{ɜ*d(V,1ecHX
(ZU
uWgM'Kxqë}՟]߃vԨ'?o;4w%s
jbWqX'	H¾2%-*lf4t6,upb:{F= ,xI\̀P1	 /d9,Wi]jXgO5A
+.g#6ir(ѕl4{nSJtHڮvWGe
i52@O;lbXQ2	ՄE~eCeׂƔG%W *zMx@Zn9j8F/ݍ߾;|OYwtUG̡RF0L0mr44l\Ԉka]4@!@**c9"d5y\CcSHSi/nQkX6
4\gl(uHTA!5H.F'_x~3N"[dy_nZ͖#W{05H[Ifm؊Z t9@!3ix8 S@	=~zڊe`Sq
y8Van,ȴO,Àjq [o\Vb
kԠvɟ߾n/n'{ EВ2&pPe"WYhFhI*l(abexp;΁JvaC5Wl>RŃ CBKB60X9Jaum$vB_.a֐
Ax{8{xJƥD1
փ	k+Z2|iA:p!`щ(e!]m͡JHFK#TSN$quOQhɊJf:+A34NC&Qb{N79XJ1y8owۃ[2y §|?<|)ŽX`q [TdE>
*tR̀XH2 iDD?Y(Qwȡ`'9	lkn:Fr#(>.=aPv
[S!P&JO_ڧ>RKX<ئtȓ	()fmKZ}h6#܃<'<|!PUytXkBVHxu=rY8`+GOR>}oCw4g
T0~Mz0R&ϝC)"W:
Bmİ)|z.Kg%҅dA˪a+c4	>V!ZifH]NVlVnqq.R{嗹iNv
q4~d!
uBK&R~4fYKӫr4td1*-S#L;ZM;QǫUy%<>m@i3=pto3
LC2`0鏾4Wo#<zo&w/i4?wXKB"d.PU0H! er]t&B.\vR(HzCr(W\-ވѿ+hG.}v~EnN6S˛xSTgrT~h5iጙyO'pJkŬNRDb@:uaފV~/h^22-SBT[~RQ)(yCC,j,*ho~#6.ޔ<N鴚?ǎFx޽^:}(E$ī
jʀӢ9;
-}g2M8V9^*&&sLnq,4}0Q̕X̀H%LӅZau!R.3#	xq=^(ZʃPUn`}jk+rW`:텷nBWPlT3hiqd +Kx7c n#
w̄4VOE+=tZX22mD\<Zl'}n1kswyvngꍷ<88~PXi3`	(;B֣´\Q?:`
MlQYMM)y W,mZM"O^/l5ZцO.lTˠNCYغՈI60f[I4s.	1h&,r?kZPZ'p(EiueYbK!!5{}"3m5Ʉb
U-[ۭh~.9֢,\ɯ|.t(ݵp㏽ʏeMsȢ%&L	Kd<Y
Z䧬[}HCv:$iXF΀F+//ʗ>m;l-eW7.Z;%8gXj>mŢ]3[5L[x>b,âɊzajB(=FSÓ&BLSiJOḼA'-~w
yhΦϘh<N;W\i5<-OA+(K(+Xp;ű̩vϾv+_dKdEgx>]5fߐfzBk9Y_-jŭM,b;Bb	i-5gz
]ㅦЩJƿ]z(ULUja2sNkUW_H[58UMu{͢A}1@}oo֥|ow_9sauyiiڽY
Gڂ;a=6l6F1x˻>gL+B:RxOcץ9	8O4::myN~cCi}xbү<b'G愊FD˟Z;a,=C^8+A7r-/,>t!w~ JKϜqIFY!&'JVd=>N݆&Dx/K}	N>i!|iDhf!ăʜFD)\㓄Z\;8v2%\fL[woLyyj'ӗ3 %Xqԩ-Q'TB ܀BUG	ų&s/ҝA>36sMtظz3]:΃1 zpafzeyS3)JE	/1.?d"0ggg5HE?';?S>( @q!AGp;aqEEkYys3+WeO݌$ȬS%yL]{ۿs`WJD&Po*%YY+E6FM(jU
.N2b4cߣ{N2le5̤ȰʞOO2,gɵť-?98zQqwã?h7;/^<p8P%:tnCiRJ(8k6TtX?dTDAXj`&"Ue~XGG(ΪK2o@/?z93,һuhWg.O0(G3ZQɶQV=mv/~|ET7ϡ\D
J*
IaPuŧfSo9J;[ٝv굫/7$IB5YiQ38Fl.tN>VGCqnO]G_fTA;𸮂[*&
xQӽx:qhM`5 _aYa0\2uihoTd vg}.
eT2v6WkK|wT`&|;FvņRrQ~Cz!5HońjBV;OjҐrldՙiƿ܍O^wnߌ;Z۹YlMOMϜ]Z\p/0g`!p}wK}(
CWgE~*)9˗/>/]<X'LU-!qA3h}cmmIMY~"3l2y`y>%εtfZd+3JflPރgw7趔RvQ԰ux#5I>?XE"gq[" /)6hjΦ/&ekbT79
 zRo>rm}c^SOٖGUBbzB*Ta"XLQJnx>-%{rO<~QdD N*oY7>ufF1xe7uf*eu9ts]j{q=¾7xj1ҕYj/&VАKhځay.2d)mYzDkEtq@Үx:c}'~`,WAŋ$̰ܿGq@3+%t+=|un{O齛N˪'WaK?ѐ ߽{>(qĒ!JxjS']}rkylPje?\p{q[
iQKQmLhGIb]&U3&5n	4‡eҕٵdjz`*hv-hBQ2pRZR~EKdVpO;0\ūK2>B׬[3+L5A.3	|`ϭ.\ʦtgpD=*S<x	A@|eTQ4`f*~7.=s]'Fsq;qM\f\X*0a06EpZko1AϲI|;@H^HBgg	\S3i3t#x'mڇ[Y,XҠCXyJp$HkC (.<q
#JY*0);,w6n3
!| ӲoO{I\Ƴ~pt@{7'*nveʢmqҌ҅0j\q>2e1
U0=.$x- Oi!\W5+PTIfSә4ٗZKsܥ.fξ;VԻ[\:c6{ڗNFTHOD	t%NLL^*Tc=Hl^)2
E$
O)& Kb	ȴl#+KsQضo'`ڲ~w%RI]ʝq%rv>==F6<
AKcz&`nj&VGHSJZ'Q&L	d']SRjsU|3(;Q$]KifgNΖTώDVi3sWSݕ^RGp{|!3SQ{PhmϪjDb@lbLiMHAܩ4ݲf?+CL'JTI(D3yH=X{RɩVqIuwcE{pty`zٙ//r(Q宂-bb*!Z~`bc0"*#Vz9mU\yxg*2}y3GY3ĝn?ҿm2=62p9+AKL-oqM\+	n*+U˰. &@&Xe2T`g\1}r0`B]bo+uOƷƼ{<4ƕݹw;3_.-̡TڏTEɋӾ)LT)yVnZ*"(xV̄txXʞd[:e0ŶIyuՙg9\?ӘiGa7ݹ>Z3\TO<!IL~k͞ t:>-ʽjDJմH0+^g,㇃bw!<׺ԐBG~BUGwqV+|4lt 7Dge:L&XzjjchY`.
DR^8cU	_
D/$G8O!D-cR/ګeGԐ:Qx_pwoiQphsTa#Jidno%pVW[NZ1%
$Π.O>`#-0f^hU膰{\zkTvu.gFe#-3Ks_W?6<:*=F0Tڑ;Qq+(#MϢVŊ	ޜeiY($h˲2LYf䜨),3?՛l29>4?zL̃Ѯ19a y,D@Ce-50qx^^!o)Dz%7F"ΡlizGG2^_Ʌ~^J0./}駟{0lJxqn2ƒCr)sKw}WN.`N$$]afpy麚L.k*{I3sf
sXiYrE2:stӟZy:l^m
gΪQ{/+B\Sx7}%#9&{[qxO	
}1CB3hR?^1
$>rIzh`޺g2ifaú޸/W.sſD&3Ò>1
Ð*꛲|_#XuTȜ[$eWѱ<(Tz@=5o4p{be5ҎN{*
?n~ԅV̲`{AoaԜ?KASKqX&b"
Oa=	gb}^MrÝ&ٌ_½iKM`li~ʹ-S[д#ʟ͖lU0ÅwA.׾KA&.BNacKs<6aˮ2[Qj+㴈f|Q	d|'eŏ㼎{	$]'E=Y.8VU')i;atFko
,\m;X#m=0~^,GO0A@ъ4JP\D	t+Hh{&4Xh!t0>6ܮ|08%A^k=k‹HiiS?vUF}i_w^dɒ
7W=e͚99pNVU13oPx]&CyV0@r1f;K;oSΌZ]QqП'<OIENDB`PNG


IHDREtEXtSoftwareAdobe ImageReadyqe<
@iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.2.2-c063 53.352624, 2008/07/30-18:12:18        ">
 <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
  <rdf:Description rdf:about=""
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:xmpRights="http://ns.adobe.com/xap/1.0/rights/"
    xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/"
    xmlns:Iptc4xmpCore="http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/"
   xmpRights:Marked="False"
   xmpRights:WebStatement=""
   photoshop:AuthorsPosition="">
   <dc:rights>
    <rdf:Alt>
     <rdf:li xml:lang="x-default"/>
    </rdf:Alt>
   </dc:rights>
   <dc:creator>
    <rdf:Seq>
     <rdf:li/>
    </rdf:Seq>
   </dc:creator>
   <dc:title>
    <rdf:Alt>
     <rdf:li xml:lang="x-default"/>
    </rdf:Alt>
   </dc:title>
   <xmpRights:UsageTerms>
    <rdf:Alt>
     <rdf:li xml:lang="x-default"/>
    </rdf:Alt>
   </xmpRights:UsageTerms>
   <Iptc4xmpCore:CreatorContactInfo
    Iptc4xmpCore:CiAdrExtadr=""
    Iptc4xmpCore:CiAdrCity=""
    Iptc4xmpCore:CiAdrRegion=""
    Iptc4xmpCore:CiAdrPcode=""
    Iptc4xmpCore:CiAdrCtry=""
    Iptc4xmpCore:CiTelWork=""
    Iptc4xmpCore:CiEmailWork=""
    Iptc4xmpCore:CiUrlWork=""/>
  </rdf:Description>
 </rdf:RDF>
</x:xmpmeta>
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                           
<?xpacket end="w"?>
IDATxb?(h0/IENDB`PNG


IHDR)tEXtSoftwareAdobe ImageReadyqe<
@iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.2.2-c063 53.352624, 2008/07/30-18:12:18        ">
 <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
  <rdf:Description rdf:about=""
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:xmpRights="http://ns.adobe.com/xap/1.0/rights/"
    xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/"
    xmlns:Iptc4xmpCore="http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/"
   xmpRights:Marked="False"
   xmpRights:WebStatement=""
   photoshop:AuthorsPosition="">
   <dc:rights>
    <rdf:Alt>
     <rdf:li xml:lang="x-default"/>
    </rdf:Alt>
   </dc:rights>
   <dc:creator>
    <rdf:Seq>
     <rdf:li/>
    </rdf:Seq>
   </dc:creator>
   <dc:title>
    <rdf:Alt>
     <rdf:li xml:lang="x-default"/>
    </rdf:Alt>
   </dc:title>
   <xmpRights:UsageTerms>
    <rdf:Alt>
     <rdf:li xml:lang="x-default"/>
    </rdf:Alt>
   </xmpRights:UsageTerms>
   <Iptc4xmpCore:CreatorContactInfo
    Iptc4xmpCore:CiAdrExtadr=""
    Iptc4xmpCore:CiAdrCity=""
    Iptc4xmpCore:CiAdrRegion=""
    Iptc4xmpCore:CiAdrPcode=""
    Iptc4xmpCore:CiAdrCtry=""
    Iptc4xmpCore:CiTelWork=""
    Iptc4xmpCore:CiEmailWork=""
    Iptc4xmpCore:CiUrlWork=""/>
  </rdf:Description>
 </rdf:RDF>
</x:xmpmeta>
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                           
<?xpacket end="w"?>
IDATxeyvirؙH@A"bf0I,V.˶,R"KEX%ZE1SiArX`r{O>ޛY,@y
{1Ɣ?~<y?t<΃?~'zxFyo9Ds8i^q)!c(@acն_8Ah٬8UH+ otN'<h{{Q0q)Qˆ*+fb=E̤Б?'#Xt!Pr9RțSTɘVMv.]peFeFS80*b@ǾR$eR@a9c%^Su}jJ_@盏pEhu/^VWQ	LDn3&bN`+	a)ۡQ,pCRG#
)&61i=9lL`]C4tj~½zmG[0@"Hﮔ
\RXp{h`Ca0䁼&L|.CO8ʰjK@d+*Rs3̬@JEZ}y꪿޹l;5*o$),A i0_ܘp©	Au9T
6TBȷsD'.)Ƥ='dl@PKPKMpN`VO	LY17ON>7\޽ݿt-ji>Y{&+ty(Y0-&hbLh&|GhD9%؈/9mT7
	D9h$&#WZ.KsS=4׮77ZA&")JDW 1
wpbc:4hr	CMM-DM	r
o	5
"UÉ8px`">$W*gS8fRК߅;T'&=k,6@kUL^\xջ{V.,Z~0qKI$1UCr[cjp?l!;kT$r8AR<I~p??Qb~R
yh!$ٺ"|PaopTX%X|
/3ضI6:_hkx3PhpAn2tRiJ*aDc!p[* ]ώ#(GR^F#(A8J1zBI-P44J4۲>ic~|.FӞ{nK/;J	W|5bܲVF|nAyJȕ0VRF`1]?#ϐ4$6,q8H@J	o7"Z>g9f>=>3:ܾͦԧׯE{{\/a0RbTF*36G&H.V̩D"JCP+,EMo"FL=1ƓH$l%$܀ғO_itEQq@äI,Y5;{޾ Xg{5FC%./QI1L*kru׏)\W	 \0*-vaSE`ୡni&,~P2AɏM8!ˆKXRr7\
ƣ3
k:14iE*AUDD!Wyv`s-,?b:
[:,z}woSB+q
Q^`ae<W^Yev{K%F0ၔ98n$M=#t֌+'}"ѐ	$t00<RH$Fh5S ^KEJCJЄUp
Of+=#$&___Dr:p#b,ն$Q^SJk>5XUo6Y$0
6;6FT0e(QbFB@
L
E8}s-HB+QB HW99P}/?!cadBf~'
@MC(R3f
66
RVeq^B7t iXIܿ,,ݓʻx%/
xQB_R$gX IY_B| U8N%p	>pɓ[K矬|k7tQ!5
i
rKcnȢ|Xw:~YX0<NNr;HNtsG	J1"Hqa9FC'	b48@C^<s U׸%'vJNWy˫oV{#aq"%fĶ|sߍ-sq~/hS28RAnkFd-
j
ޭL>kVabka5&xi\P5N@5QȭOCUB}s{R7\DvvuO\CT&q~ĘEi~58ciѨ
>Qk
">D:Y1HRi&1D! NC
Z
^G(
DXow]?$`otv[2L*tY;y fA\|(c#'rk
.`wowTA8^4t?jr7%CtzؽxPaL)^A~\`]Di	'v>lC(_w3?#W:͍[w_ٸrkgll7ݛױm:Q^{qUwiSK	ȽN^]Q—-}Eg-#ZgҼ;dzܡtqh:c5
NaX8+*VL~0]Nsw?xvˉ/,^TղDRmb"w,2-¥{D{3%Pd.xIrrt/3`8F,Lq8FA@4_n"lTF=78YOOdC&_H?1኏ϯ>B<e9Jalm+XIn*. t5Oq:t+
OPmdwߛiu;э=4'zm0al?'CIC\ @NI$@Wr t.^WRUC'mo]n0䝽-}ϿQ#-i\n3T|[c"4D8Fw'ŷv_BEuG+~k:d<$*)ggKGl\Qe H+8Ro"B!ϻW/lZN[֔zn\~i"*}i0LnZ-MS&gҞ׶QSL&`F{/>;fn::ޣ#h8)~Vƥb!9`Q5F	OXJdx ڪ"5o[yQlߌЉiӻݏwN^?unp" uB~~v
~~=[*U~?ny/zoV3X^>'㉬q^^L=a
þ;yi{2u{Y^:,
xHD/ETvH#5'Am?>l\x
wtf'._߾DZ2=13?;=`
!B=d
X-R5/(R'zpZXCqLDN=ߧPz]D q/Vac^|oܹ^qcCIuPٍRH<I38׈
.HB G(]??;?~-okw3bA]z5
)<G==&P07<g[z)>]_e?N`=$^?E$jKώ
__:h
n`2i%7&X$"ք+٪&
QD?S|*0+*}vܝET%5yl9{a/.="<ƚY~tfgD[_;X.~.dHw_mIA"B#d£ui<FqYTJ#6K8\r*TuKэ_wßѧʠÕm׃mFx3NOUY%jQUPΛLN-bE(ƀe^U&?Mʒ3:׈ʹ}B.&蓟d#[v^xzmQ~>`/CРU1R~sd?Pc+s?ggjջjnsܠni;{n'YyQ%bI&F8!C?g4\x`"~2qdG<(L\v5_@UOz/DhDT3*y2d4IImlLd,L>,D&{o(K?Uaj^PnvTtD0r0R	PCm(,Er<YFv>3$c}`C9O}?p!`2(hĠ
BA aQ	BQ+k%Y1y0L1Jt(6wiB>EXtw_˃_`׏ܭ
/`D֢;nIԧUIXpj:83`G؍[(3A Bm|ۙ1e$/vTF10Zm5'fLb^8d	
SavN{5ӢXTӆbqc yC<ƶFfGhM$t!T;QHv~_0:iWhԎϜU7X+3NU|QDqs
:YǂDϾ93$hb"Ę_}CJBh#j-#N
lHSEZA15=|XI)/f04R.ߊ¨Ӎ7M68X	)cv༒bPyGM:SnFhJ`ly)jByb<1_}|UxYNܭushݨ*Zޘ̛ACw4ZF%XlÜQ`:*U[2ы;%`S=dJr-.9}r&;7`(вM#,1TU\⿙g)`7
6^6pű6&cdh|1t?Gdcl?
>{U8n=G}],Ơi͞ℭM/5'a8~}8kT5̯=jL߀Y۲!S';+M\#HJD{d6Ҿd؆4WAȷ3)9uzR+UI>+#?4IHe	bIbsU&(./;o֌ 0</*14>d,!42iIBksʒL !bCE;f<e<
NYiX:As>oS'LxN/!E\!E9M;nUE"q2a@?b[X
0<iOX,DQbcQO6܍QOr~|gJJ,ZFqTĢhI) G~Zp	Ųl9Os-D4Q9;z4sv__Lb%,@k@ k-=Aq4b{'";TICݔZHH!E֪E+lQm%i{Zf$
yۘoÚ.zYOǫPeF(1y~Ȓ?ӝfkljU2{pN_ 1M'e|#쪚;Q1{r;> +2d biD9HMj!2"S놨B(e$W@*
WpL*"٬uuHmKDX#lX>0FA4`2qϵ\<3YO޹OLßz^z6u~Yl5;%sO$<%T1T7l.NLHW,/hEV=r^ &y09ն`73>v~ꩧRYtIDI&HJFa0QlmB‡|!L:Hh TG&tbs\P.̅!γW^n6.I">H*Mĝt$L ƒ^NؘOG̎ʧvK[[~_sZHѻ֋yk_~f{aM.6J)͖&*͜fCpI[>Q{+O'L MSG#0\S3YHM/r~>[
NVglNcvݩ;{{A[NqcaqG}K-S)fƚĦ,MOf
SqXGс'p?[GG9ׯ]hw;&9X14gFl7FД}ň;%֣" +#ůCrҺ^]Xvޚuöv4ծ؇TbiRAɄiEUbeFn}K(uOBe&bT(7}'UY7fgE:=Y%P'ʊavV7V_}eEV

N,TdThWwwW'rhwk+aN;_+T\_X|̙sLtwu#T%Q+{L[w2!n`hCy@G9eCڟ!"""}Sݧ(_ˬnorջjYp)D̞b^-E霮ν6umƠuNqQY'zQKw\Akv_o999@9AKPϩӑOvVc߇ZS=/K/l'**3Kڤ5FqQo7||T-=X|Hm
ݮX%粹Xǎu>Ƌ/:}@|A&p{&gÏ4x*#i'
=|KUԖfSϐ'B;=o6lbbϗEٛ)D*jc뚊'oTwNP<raj("E2.spS!J,VEFPb$]GruL8sQ5Y)Ct#dS=}wg?Ϲ8fHPUN2MrBz\/u3~.&#
Y
6~IUbsRn_cfr,Rk<~nl8'իctItdI=P[+&IA#*j}4%Nhƺ}G$SGf{:mwlqf2smQ#gΈ"X$Aڶ(gNv?po<jplNjRDpΜ/]o )iZubԫSO~ÄW&Mn.$?~Sx/Fz;0tϴl/er5[JiL/MCKB`wMׂ mYN@&hP*^zSO=9q8b#e%[Ի}\ٟFoq<8{%YG4VV15Hm/?y]_}:w"A]_ak"{Th#bI{AnkSu''V s@e@[F:*xmMi[#wxIw^xA5$-Ҷ-V,lnl^77_rzT86-=3}ۊTQ qX(#eLXٝnVJR/8WBZ%۪͵_YD&OT4,.0!sK|4{O`w.xذ'Ij89ջBdgjޜ
(zEYne|c7[۵J.K?z(-tqeux"ez	M
+'dz3!n]ސ=7c7~OcMO>vtwnQ3PGi'%:g<+&r2VwLp`yRU*׫U߶ )ADkwo\nTVy(N,S0DomMu-k)_	:#kᰂQF$a(bl^BGQZJuE.ʛլZI$xS(ڇXwn߸ua	G}TvDzV/sV1mPWɓ57'eG[;_ڗ^	Z-,TUݝû3\C	2#۩IO4S
iH4ճv0,(<~Z]ݺpa왳ٖA^i"IXŬ$czV
z	@f((=ryW&XIK{p6JnMf)(AJq8m(ڞɣ#
|	:~o:fN2TX2=\Du\5핗0@@z1XPds5`=7?G/Ϲ=~w!nxCf;IS34JADwt
sD5u4]5LMUٿM7DORv2Px؈\mOO+L#5]ǹ/姟cƲJ<N`Sdo{DŽ6gÕ5T:l^b	ȭ}i@Gq:u9ll~1ZL~|`N4b\,5kjN:2
6i)+e셬9?miHȥOm"W[ImfGz$!;t/گߧqYts'N:՝^,q9G1m<cU
ԑՙSӇT3|97Q>RMؓs2sU5WuP?
:"
hgEI8>gl}N%3_2i>)PبVX\7uV¸P9(U/q)QNO?&>N?OkDQhrJ֜fdb(%,2
D~ﮮ>jZOWu",%[S)%+JR)Ĥ9ՁNn0g
++__~u133{葽igL>~^:S-/Lؕ];ֽZlnkkr67^
ƖadLdKFuƜ\{4p2Nv?oT*ܼWIZzƍ|QDA\Si*(.뎣J_E)уf/
eмGnҘUA;[_MfI#a!|-`ׂ$V&N@tJٸH&|KFRt۠mڏ.-casuѝ;Hd۸wN}oZOhT.ݹq߶nAľ;q]Pd,H*pq<i=_n읺lkFG{R2M5r=L}
YpznvZ^z.*F6p8u(axB+%~n~}F)O<)a*,+FuU*'=*ɖhLo~
5vo
;>19$	*.W²秞WO>ϵ<TN~[͉P9X*)~vq9C!	xŖc4;;{9whiL:?\䊍V)VJ?j.K'%,vA%QznoB
m,qETl?rL:?n^߫;.ޡYjeϞ2.RGF662Tf	$&bik8AqnYڭsTԘ[iN.W٫A
-R<ϽsVԇQZ7KȘQ{!}CeE]ЈpV$ٽ=_ȽeMWb4#"ö27Qqw48\`Bx谩ZAܝeoXq9(,+3?S	[%Wl̫_~_8,"bͧt4`Sh"™&+m)_-Գ&$̐4.O(jfbNT'gĄY(k<?S3U6J-E(zQݦ^]4&ӠϩRgM.(/HefwImg8TΉ0C\W8kk6G+eA}R+1{^tRqq3;FݞϾGE>EJ$H(4gM
G?Pl7͆^nVpNM:3IFW+\>#xb	-+{?D?ŋ?=GW!n~8y ,`&,<7syg>ת5bI}jX8DfԩyYQ&v#鱭P
2jm٨0T8_BDϰҘ6!⧯t|4t{4pʼF43Q chJZhvJ'+'wO:[R
Tae.}z:XI=.;BmbWwՉ9SϞ@j=Bdv04BJIV"qĴ-/jC~a	$_P*z+LP{e7B4921Dh="82|C60o~7~_=7|gZZsq>3[5.ܢAt;x<spV^س+yl:D6ڃ8!Uۡ$V]+5`b?q(V
tU	1Ad]K	؉hj&gsSEb#N!
⨽3aǕH
ur*Zwn۽q=E?n2a@7N_FMtx-sKŊIS:
Hҡot#Hqw;{A
7X}oB43|fu}ݶStNS:J%F|jސ)vwN_[ZF\n7P>t|^v֘k1+d
DK	.Zlj%SjVU-nl`&Ǫ#m*/fNyI-ca1{ĥʇţ;|~бlowxHX00iuwuiqI:rN+RE׮@)KKiQ
/p4+b	aGO_7vedf>^7^}.fPw֥%8
]oEogL/f3d&ǗcEu3B?1iOw7!+TQ?rx	%p8'Bݻ
tJ8:zԍ'>IM
1d.g.V04 Z
@DJ<zDbc=+/.=^xܙ9O'c{k}lO9\>ޝkԧ,n5^y3ϡ
;@1X#FJn53>|p
Ӕ{EW#e;羷t_N-&3<^앙J8'ANq`Eˎۃ_M-YofջsӶe%caK\d2u;2tbүj"%]ݙu8R#x!j~E+-,|DzZ"t/*Ʊ7%ȇ!@Ak\4CYEB/u0Z`ڞYE)3mmy>k0w1Qɷ:fB#iE.\KNeBʀhf;nf}6(Dd`t~O}4i5t,)YzkwO$#&•#|0&+DbUdn9*lf+ۭfs:aBr^}}ESCx/OsVa[ǏSUM
j->vcwo^FzkO\9Շd*-j*Zֈ3=[$c@
{k1VU>CO,xئBp"<w0J;Jqr+DQ
S$WA%m2й4.ADF&`6ѰެEJ(S
E:=쮹V2VG?(	b%$͊HBrC%tє5rFlq4Q.k3 A1O37HnsSU9z̳-сeji[:~z+wnS>ŌZG+zN:/Ymt\sYt/i>*#>O`~h D۝$_L>A Hkݠ%
g4nsAj[qERbƦiaزP[.(4&
LPtos0
x+oT
|a}]Sb!A؍dQ1rdN:%$WuU8bl./gkW<˾vɈ#.>V櫵w>fkbP<F[U UtƅxϠL(ԒR%$ǪD@X)Ep3F?B]/lz|vmohƐo}睭/b[듌tCSsh2?ry*(ḏuB@!5ś>}'֛uW۝\:G[LV;1_1KB
A8K&ɏ%|;9SqzQ=;ܫo1Q,#H~igegsHN8 j0qbvv[[9ӝ{$2lJH1GϐfGm9b^j
P11XEc59&AĒDiY5T"mXġͩT$a)tl
Dz4{9L8Jwe}2R#8/Xnu;: $
d2JXȔJuhR\[Z^S2CVjt3QVR&+e7ܩ2Q}4
JQ&!!j	
NMR%Sdx9*럽^ȷLY?ଯ߾
w=z]ѧ1ձgՙW=af&79:Hxf1gݏ.x[/ͺ"U+Ѓi$eX#<tgHSl?Tfd22&}k@ްH?ooMX|D2q
q<,8
[~ˢ[VT*Jr%|Nh&n5^C	<nfg#B'lz?ey!.]*|n]t_~>x$=IzRbgn%9I i@
ѡ54QʺLޮy;;=-:B,5ݟ1=-`?T8r^oj$+L5bUg*7#3J\埪rcKJVﲍ:}DQHj)#.(e9ҜL)U0Hiu~?K3'vY7s2D%uF Ɉ谼5V>`/d9Fg|ol"^,榝陸ZEՊ:5/4X0}`dB_CqƮmN͘F
[GUcAt2LA*M<̑ټç鼲\fo\Yk>Y&iժ~)mB=[ǻp,8nL[ڪ6[0_8T0tQfݦgͶ|3Ef4,Fs0Nc	q\3БErN3KgFQ%i8i'IZ녶A'*u:)Z|TjKqm˳m8o1W±BU(k]2e;vmgosume^ml0P;&Ң>3
\/Eϰ PIF衵thmmG՜c3[a5^eä8CÑ	FW?x׾oުVĀ+t$+ٹ#ǎu=>C}-xf1V
ui<61atjfޭŭXԃ+:!h! Z14nibv6hHbyBA: AYdRVyB{Yq|qgV(ezK8ə A+|7tE"p=Ԓ$9*z_*7cU]
sZYE]U۴SEhX,2apJV0wnm,=3/GKj=·BqI<I]rn0Rw HIS0lDzGzN҉>9;ҋ_t<䤮As\Loū9mŨGfXfSU4
aLhXaZ3j*=
 ĪU*!fEHͥ/s"dЩUFh@Bd81śy5zH	lGO9拾TtkOb9A!g1bE泝Rywzbknvff3!F#e-đqe~{˫+{E|PƎlGibY޼Y:){\5ɷyYs&"J:ĵp&4GgA$i_8LR*؍Fg}eure	2G-䯯=fFF7Gl\UQP1NYק׷(֓٬MNp"xSXb+B,)DZeAz',RbOnNU'"ZuɬO+hЃUIÔnnh4$"|]uVTڙY=ԨVڅR?+ȩ/L5Fhܼq+;Ν%gq3\$RnðO~i;,#4"\>eȁ[9em(0
%s)9}ZG7T&琎.Ϋ&AȎUNu햣f!KR=/#U_؇˶vU;t3bCHRO~(Ѥ9xJĄhd$qbɝN&̄#Cޣ"GoóYQwtB]\qN?g}t@8X5xсl1nq-6'&vkJ[(us~uB;24" kwoZ9q1mq	evd.o,yMY7*ߍ\K$_db1r>&<X]'7 pv[8 Y8d&'';tZCǎ%5
u/	\$1aMe|HLr¦0#&J!KLQBIcZa"Ar$XdW`:0MJ_4bܦ+F?5m(q+Z	s0tO,(:@8h3Vg4zVa!zG؏C)H23Uv
>1N!;@n7igt4ۭ;oݼ~ujrj<	e/WFSlk2[lܠSng+AUȾ*OSi	JL$g2BIïް"ê83*ԪA2Xѥ@33'8to]t!UMقFccp+bF/B1j	iFp{0UZ’$tS,ė}٫4FY?$~Q.MK^e
l댸*Ϝv9YMٟ6g>W1]('XtRp}QUn͠4gr"ǵqa.
"[Y[ټqCg:33ς6jw܀6٣Xf~Kqt]a=f4Fא}夝(Ci>jBh,`]:?t&\*ʕkVe`h+r>lhRxK.2B 5.KWd[Mpt3ap	`į*b&:	N94)W#`30&	⺧OqHvAHWf]Xn.LNN{k?~~NOBԹЍb.eA^}5H5dD"m0
UTlcZJmW}s j~ѣ33+Žk|+z[⪌s~'nuONWRFFo᠉}͓nW2"iƝKE;rB.?⋝KBlf#=C-TӹeNlhsu;jK::!-RS	H.itzQHxtybȦ$rþICY 8²P.
wA_v1ss]VWPwo;<uRMe7
}U~`r>-(|"~ٰjV.)R9c[b݀_-L;!
G}9Xz77=qEYfb2?Sj:@sCI\M1*ϯäOB8c:F:ʞIsL4#Q6)f&!Zt)ak8}iӕIݸI~'lR1
~"P3*eVGR$E	&NIKF@%nd=4i}!fI"?Z Q2~fq)摀rhOޑ
BUeTqsN
$[s/[<z^{o֮jݩ7~%YICzv&c٬T
|$'3MN]-0IwԄ[e2Ycлptd)4ScБcss_!N[%iTNLGyBUt}}Q;!2GilUBޫקSpȸzFB[H[<CܳF0iZ]*,0e"܋Ҥb	:B
~
	Nꐅ;1CM-^d:*؏TsF
5vLQG\};vS܂=k47ْLbL'w|Ӿk^au(Obj6Y>p&+cPrdqX!s#Oڍs<,M"8tZ{!ta
6FQeE\#%)V xDb),Ӊ&Q4b|9qZaZQL-YZHM_^e&Y,e:8N:JB8%>C<BE76lGhHL){X*X|PZ*DuwRoXg?l~ʚĜ85zdzcSb]4h,&?cjeerm޵ks7&62~)>g࿶e;N00H3,ZN[QϵY4Zˆ6jڋ!Cs>=F!<1Tk&[
=hR@Fc؁TiZ#"Lw{mYb<g(a4Mn˝ʅn
H߀  Ig~e̠pK6G)R*	$!iPGFXBhR0|7=$BI߬@~+~̈BWWmR^8qJqZfRsGHVX0uwo6թke~C1Y\V32f);-.-E;qQgiP
[A%1Kuɣ-QHRCQbb	{Nҡ5JP)IF!@1QzQ``	SQP-hvJsmX4cPӗcً P)ctF[3fJJf*K
CʼnPl1F1k_xE]~Է~Um*9~ټ0FJsi7|Ԡ1LԐ$
:VP@blFQKH"S%==?t[JfMste$Vtv4D:%u_0i1,lYZR	3+Fܐ&UF1',ML##H߱xNixQTDInp;@b@e[u)R:P-<NAw<6>|$ZGDSa b.A7DGt
LL16־
TwдDK1vw6^U͋T	\uQJ~tِ׌R5z>DjAAY*:;y;ds7nV7^ǂ&b"eetð<Σ}-eu?N}"VuxrՊ:J^Ef`1`F	BS4,^z)M*x3	EIy%.NdeBk0!B(DfΑhʍ+h-r {utKc X3ʛӤyL0TFŧV$ "$[7;>򓅥X'C&
bzY}v4őLM48ΘuňC`\|VlV~#L}
nЛqz"	!7n<S@:7!DףڡcKbQo’,i&M$(1,1`4K%?]ߜcc_Y2
):rjJ&QS*8E?(y
5^TmIb~bJ3(k.eD8CQ1 J+AOꇺn؅1滪uZe <UNM4Old$TL(Ѳ=y"
m8f!'N}T׿vm7͐ʘk:([ZÜCzSTCZ|ۋ<~,f~tFD,'aOw#\gH5`4 NHd|Wb~ˠmXj%*󅘮j""x+I#EAPc9FAqh3R|c$	fr?'-JȢ ؑҢT
9Lj%|Q(B =17p4敊[ljYP$ii_>uŊS=󤶶Q?V2=g:Dܽ Y\5l]t| 46"3k(ZH("Z'Ȥ5[J
eY@wXGIeGlo,ļZ_q0cp0Cj9'eA'eфC(~XL
C,z=C%= 2x!RqyCcƐ.APt'`+|)< a'U c7o`L/̤4GT1IW!,qKZn&_UeL,L.wVm:1fJև"9eQ`}0؊uC9ӱ¢fTA2)/f:
VNCaIE771YH^N̐u݌mFʵlBBIBAiȡ]"Z/:;ܥezg̐Ý4cɋdɢlXYP F @"y<1/`;
XٖlRi/=wUݺ9'[νzzPlVwUWWo}&%7
m	`xޏƣ`ߜ1b5dٍFsA'iLHCKn1AWL[V`s?®)ѳJO͉,`|%͸eě=pg(v,6od
 k&	NwuqX))$7UڊdOFu CCPq@,AHhDFi
`@p}|J4e_X,4cd)19Wn:WwpE^Z>{Oż	%,Q+lFSv@n}k%SZHro
A>c>εxr񖺏45ӷ=yϞϚO>o͕/.ޙT`Ý\G5z¹UҊE4phzI>lfFvaqk
?swP9ԅFjךrXْBcqqg8MӪL	w8,$lEC1Y\*7΁ }<D'tlL$͜E+"%k'$ҀQ4*핇YTM/BuBP5[:/>_|~wpxZNm:PM9QA/bqCa%xɝE)6Aɩdyemf	
	T7j%E;5Ԟ7uqmB5p:_G	  7%Ij-ɡMH7=6!
<Pgx)f!oݡ#"᳁˞st
xe==4w:+j`4];<JT;fTtGW^Zk9:tJ"߱urߕ|HE[RdNuykac׃v{۟|Q|Z¬T:uAdڀyaL
QwJ80̈́$Gq X\
pCe4jl%(㲀V!lANwVFCvS`)L#dOvh>6Lo} 4|.Xd"pbC)
,*;ђLSWLZM' I5Mݱ'z3{oǝ<ܣ3-5ݝXW6XF4+Cr墢
-J'VhpGd!$dK+a#LX"ݕ,K°%[t~Z;wFœP\^aWxпR 
%pbBL%rO()7ӅStiW
1)U`Y`<]~˰|֔
X
PРmf$'oBu'MW_Z8wr/VEasjsd}Ut-1
ʩ>_(LN*
Ό)\]h b%N"([g|8-utdr,2ҡLXR.}PBa0汥 #E˝V,[
*)A78EB3vS`n<7E!x+[UfX=ho7!AhVO62Kn1*`s_<sbo<]^ԋ	܈:gBVj\34@[̾$Ė^.gƅ!~5jY{~nIކuQ9[Q-0(#GGN_~RSM]eI29lB[GQyE,a savl\CSt1ejx:l]b&
gca7ڙʎ!se v5-2
rWf7tuMv+gz.q=8i({>*`=<)Acg!Ь6*v{c}Ss=LR%ˡy7%LM"Ez.$H#j&iZ7AeSk{, t&ɶl@ >0N])@X"iô0Z(@QF D]׀p?Κ;=e`Pm
J]D8jOMY<,g
Pˑ	YWN
N[n[jEQrlP~(a梒9ڋ95NY.["9ψ4Q+Yl靺%h:P
1-m;*kBR2QO$-;G PN6BiS*ݼ{˯<88Ye,v3.,+>x $؟F5]nLpGcZCMn@FC	2>3+q24sW.ICm*KTqv"TVg@cY"%#LG>2Nݜ!Y-$v@]w@8: OՊ4:._~'|,i߫>,	)\W:<BMV*_@^ʩ>Gi
2\i'MZvߊ[3o)LYv{?1E,.^ɾviZCFf莢S{Ċ*U# ݲhb!Nh]jc\iM3
G"r3r;NvҎҦlEg:X	sV󐯱
)Y_KZyL
ں/=cף1tҭmeM+c<kxN10<&rS{6%9b_ZX,qtZN}Hcm[ܿrv9*SUNp'U&ؖs1p"f\r}\R"oaw
=DxZ;SvYKq«iF֓-p‰axiaW%^ȇ	L%\aU*\@VPS[^Ѻ<k,03!*eW!;cp(
c/H[$}Xl$2& &	#R0cKDךбU9lwnbN0\azo%,F&
(.CerF]3pepM.,2W66\	$h1)؊3){MF
05+jr%TWU%IO:/LV
JȈeā҃vo O16t8*<a?)k쇝IV2cGt׊Iocpg56hE,s燀MDm^FPY}B<fnlI(CcL-q.Qۥm `V:QGl$Onܽѝ1":XK@$GR"	*phRC-Py,6IV *bD@$m'84 3<v>2Ə%=%\ӝۻ@w]@8wFlD^T,pCW@-ѐrYB"b~hRlq
Y_ĀG<"I"_+[=+QZ30"̴\8ú)q&B@DMrZ+Q!NQi}%gIՉȸ7ӸM77 (\B`PbsPv~B5*DˀzvAE0\LWC-N\00
eͲ%UXح6ˁ\ a>A>Q(l>p^sGb:oPgm38tEb@ъagzG(NsCHmBLN,vvV4B U!B??I[Bw:yeЯb%,Ch)7La;	grPgRp&u@\-E1mz+k;"sgή,_ubod/pO8y~RUo6?42	RDx
z/yt]kPE*g4Ԑ?PXT~~SnzeIE'h".+R@q:.Pί><*vmXȪ;󪥑;vh;kmhN8Hvn=;>$aɵCWS_	@P
+'mh[ +Zh~rARfp1W_Yޟ%ŃQܓ^~oҤ:` O ZXqhc=y?[(MNr	J/%ƃ!+ƈ.%rJ"/P+Gzrz0뚎X\Inw24.	3sGgzs$!wnX{}eձũKeUR4X۪e"ͦwgp\?0*\*9V+<GhA0hk(Va{pa
^Sٽ,\t.v~҉ōUK~j{C#E<A߄H[>q(( <<0}%OaD)-uYB
/SS[xB&LjR\NM͡GE{qhlo(pp?;sQy*\j:yf}a\Non6hF`yƢPw !Hr\zD{UB}X&pT^xӄ4AO-<x1J6꿼"k\Z+}jE9+F̵։
zYw5vRr=X_]M(ܯ9(A(
n)k'Of`!=C%9Q`~qJɘ
PB9y7]Rlt0'#e0)ӟWܼº]O{B|WiJCCЁT7|fee>,eQ6b}7j_ Srwf[ݹK';Q5/FW@ 	ӪY]ļ^	앓yM#wT;ݶ7nasIϤ#@POmqˏ<DaE3򠈳U/dx_]XBV`1pyqw;Gf{Ǔ#M#q0t㢕5C?[1-Dś?~+z;։Paf5Hq,ũ)DzE2:"
Qi>p5`	"?Xx|tJ9yiRHa+:yLzRLdmDjί3NNſ}brqGVdvT3x-p'/GTn?)`X576)HQ./ű=XYCr`YEMǷTS-Dbr#iv_!ȇ"Z'NNo%`e/iDՇf}d3;~c'gk똂YK!ư@
.0rW3\ʕJր a=4D!E:f7dd8 T/Z6had¿$*[hog֠ѼNQRi,mW:'eBź
d-3@Z_P5+5eҚБ^
EՕK3W1ۭ:O:~fĐiM]FB˻l2pM^:?}cR&48tdf~hN?gfu{P.濪lZZA
rwTX##W׹^Gd
J(x*R@Yd
CՊxݭ֨Y7Zl}*4
>V]۱27_%SF?	`>
@C&nE~?wnX>w})pnC(˹pC<.wPDbTejoxP.mYY^ngO(>oXn.xa-7FǣUc$Fr9TۦRuClvHȾ%
ϖپU<˔#JA_++)JXʣlf5R4R3S~A^CmN3wodz-/-M
ή
罸"^!jQWvJ[=@Xa9[|-9cB(*g&uKP:oG$p]+g@W~h@Պ{.q9؎6>/-U2r;JWwEIc9;$d~*i(ﱍjaWt>ȳV'^Z1<
\e+O\Y@M#
gnkۡh'TBOzb'<rwhmn~rw;	KWtSVkk-۸wDeAk\H+]ўK
Hw!X%i܇Ҕb
u塆n4TI.͓(D:iT
TY[)dA?`މ+/_pAZ_Qe"ȿz
1,mSӑNUDeYi:LILEW%ãe[]XW.U od>AZJ|rR̐`Z)QxC>Ѧ@]apa~?(Q~屋Xwvw]B*XІqO+ց{mۀS*(Ll+Ѐ
Iѧp#ǝ^'Kt?úv:|P-[o/?ؿt?yMA"&7Tgʌr+^ʚmUlČjdd,v/ZVYruaps[P ;T-_Zp.7raIT>mD(YqfU`K1ǴRN7\@m=z(L\~|Y;{W;~ŭD0&~@Mvǹ̦;(wG?tӝtk.npND"s3a6nQHs{й)~BQipM]+粟GWO2M ¡;@eSoa)5d5˚X4dST0 VIE }X2aǒhw'6_lpI꒨</UD%0KgϸKۅRy.YhNLăAke 9׼ٯͽ%ٺ};«_%;Kd	 )qcs0&+B2g<BF,Q_ vN?*+OZKeDΰ0~a)nJvD6aF}Akw/O-(>S/l^~0(س`7%s9<GU`~Ѫkq"3ߦdYRM;	`{	`®CTDydkMM[
ҐFlFP"ieJ)kř^wk7"ك?
dhIh/gz_'h|%:n݁g	2k:7@U81llsr&Y2}({kդ䗐֘(=!H]͈nӃQ)\~s{EBXPu1۰u%KRJ8{8AWU|\m35HP%̲섡6&GJFz)M5I=?J1Q D^X~17y6O>A~,(e~3>[&?=y?iu޻~Qp3ȕLъ<`Q3Bp
#\e)ct&̎8@͝hF1aH~^-*{o
>MbE&]-ʈE"4=A	xGBn,}qs>qHL5Ă4֒1%D%qe@X
GzhrFx
.;bHuO v0A13n/|0>W<yu8o%)R A
UFFcɀuU^a
-}e26;M``P0a[7yҊ{S&Zq8y-\aKԧ>93 ʀ*^A)
pgvRlJPMCsW<%tN[^
qԳRc!s;y泥*IUF
[6x[3βXŽ$e_AMV+|乥'ut6-,,N CT14EpOs"k'"Ǻ:%3jW4Q6lR ;
WR%4>{ad^7Qq#A>.6BI{TM޾"/IE*
~ B6.[
`|NA>_jYV45$~M3c
{=p/E3't!wCeSbfOݔ֏S+p}mM"S`EO;<N);ڙ''75M@+@UR~eJOcNy.up~/^#=|hvz97d$<USq_}vޫʿfo,|[¾˺'Tq*V1b]4:]|6--I*}d݇m/BZ6tɅ
ت9XqW^+3_Ոc\t-RJO˧Noӻ&ڛ&{^4O<dաDɇYUYuلpn0ű=`īg՗V>7쏥CXxiG`+`qe+/U"6;
XFfkabT-\u
©0#?̕Fcɾ+Pc^lFpf,Z=VP'n?:6m
77VNOwǶgOn(s\HV5"g);#^:zF:]}/~#a+6fQzQN2%S4jcftcIM凚]sf5^I1غUl:ZKzbYPzдlUgn=?>>U5қZÔl9V6je
o/J܉32"Wiڜ_~fL6m﵋V>=oZ^Yv;YfyZUV:|5Tt@IY
qXgX^0U˖D4~[idk|{'MaQ}W杒Vz2oRL=xhkW~4(jKL4=(5?!zq?l<;h`V ^mKxyvQs	rg.lؾ-}}/Ȃ[GƹݧOQ*x>~E.a-,;kv~Nv@YK3~˟8yrXe偁v:
WDPo{o/-jVScutj2_yUȆ7>!+f'zCWUrB&em%Ѽ0ڧz @$].k9&T5 X*S{*s%s0a#HGښn<n>2U*2[W?~^vO|rxw7{ҹgVW0LH.DBn///}˰"J]:2aZ_{)lPy#|/LјWj:EV#<NHj`&"Uutd*l(S
VfIS=+RR2&l-|{p6&l+Ljיm%+|j|ś捑ۋ.a)8QtAZ?smA>1dA1a:ݾ5'6N^zvjVRXjD63_w [ӆ]yENja	קN~ruG26SR{Qa@WԻnP/ԙW`7az~VwFk~SMA{aEeb0$o)&k~@<Ѥ͎i3CYa2`KLL;9KG-kQ{NNն!O8ĿK/;o׷yo[qz7-'wOnonsao}emuy	x<N2P=nܝ0.)
g
0(dE~*)9s?{g7Ϟ^#"1ObBwQiHh덨25iKV6y<T9Jcj0!MaB q/h$oZڪ?,ʝO35?(Zž!WO%$=tBuM4fDq>.ȨzoVDo'$"]
bCɍ'OKs_~>sie$XY<Qt:mwX ޯGP!?g,.
z~'ΝZY09p3G8ߪ| )t=3ESű^BSfӔc)9Y%Kb&49Jlp`:%f+3ay.2nW3VAQӲ*إV0@)y,WAŋ$̤ܻq'34{ ̊QmH!t7Z[lqo_o7V={v5
i27n/n0'Q"nOUtY˗0&aX
F}o\טԻq?Æ7Z	SCO^/9QGX:p1F5I\`-Yf+lulrkDf*ky(ESMa$TnҘ#?4U~<:Nٵbq҈ҝ(\ųK2XiWDZ_sy7Yd^3$"S^Vɥlx~0^hT\p}W$
)ͦo߹uAB)P/ۨQjaOYtXH
OƶHމ+HٌKeX'>\v><vǾjv_sBY~6euBDxG[_Z	#]
#ߠxnBm:^AIVV4Vx45/Gq!l7ړ0{Fx2LiMn<2ϧxX鑏bWף7FӽmMu$.u![8hv]Z]D
8nu3^=sdf8!ӟG+^{EŷUMa 4@4D.D#au{6ߙtmeguK-n"R;

>/6^CW۽
^3ae,%5'dӕ811yQR
 MIUg
1OQZ9a82Bك^VNڛ3Qسo'KfhwFys-
Kݽ;N`nʈ݅G?runC6<
n[sq,.tV*d0^IkU4`NR⯂⚰J4$keEnU@j-7|_QͶ|ad2[hV8דDIc-b՞Ï,&Ơ#!ջP]j6{W|,<_TsAjƈݿ;eV;k_M	L;~ӽ<*ZZ7nL>A)8,LVX!0T#>C	c<DZil1FυI3*^rT+=*u5/wx<F6j<
7T?~zcѓhJe欈 8yxŪd~$CYUvYs'	^%FY$_*03yZƺɸ,O {Xl\^"_??'=Ja\IG|K?f bFqjl2vi,ұHnU![Uy$gU/ɘ88WCڢdžf٪
I,<T43J@=QNw;0c:HxWxj= #jy伇%nk)딕{:&Zk`VdOֹf[v>o#Lc!
*
ƌFɵ[&TS 2nW~M;wTDke:LKKl78F%5|.٣0SU_
DxhxE-&"*`.\B<p$u,].2AcQsn'ZRlj@UO(PTI4$[,Z&=`SN$U\0*@7DDv'o立D~js1R5u{[0Rdfuy/@Xa0!&B#cm3;F6v;*	ץ9h.6EɈ5<Q.hcI%7qlaZV_0`B,'Y Eu5uWξv6]~',]IK+T[CB
HEb
9Т!J6-Hx%7F⚟4V;FvEL4o߻B t~7׿=a+6z,m*+}2SїL%}'Vf];lW,Չ$Hfe~,dfi8z\eg4x.羭J*16"fI /Rk";Xx>=d:աu[$XœJ+E¹Ji>a/fHZzM'_G@0QiUQ\^`✌w|@t[-_@G#ǰ/t+_ō\]Ql;	kEL
m4#=-J
[|_C'e9OUG.e̫<
3Q#e=5٠S`^j0*kؕ0UGTmq_8-VTFW]4̓4L/+Ij|NF_Л,VVQi,)Q #ކG/?/R͛.H;	|~D@b{AS)8DņT
|SUf˹#
Rmz\zV+Dva8..~$PvPIB:Y.8N`K	U0By=,#Z'nr))s`Ea<ؙ$Z>n8
+VIV$^d_(UA+HPEok-Q?|}>3޺!`	qv(Z֤{Bn{7b^~k?^aLp.v;Oma%KhGJp7kn)c3	d^e%i$sSqGFË҇Q㚞3L43;oS7tg*M[S0n!Z[w|K<}3`IENDB`PNG


IHDRrP6sRGBbKGD	pHYstIME#IDAT8͔IOSQT(R%@K*.J¦4D[&KiMJ!B-m,hą朜<yXl6{=Bq.^:l&=0
p_9l&V[޵i2b0|O~bsRvsL[M2r:'-2?ffr鰙ZmkhxenjCNcGb
[*4ئtvk$%%+g+Nb$Dx0֘,g4fvvcG[n6PBQE#G{k]N/ve@NI.LAYU3R<Ll?Buc'=8lޫ`H6&9",@J$H̎e;@C4|~GIy#OQFhы{!GQ"_r҄e0b`@D(ZV*ZK.!'qj_M밙EuZRDRQ7p^"L"yloǙb"U—gi<6)e=R-.;䄝4
Ŕjf3DD6cGo~%:_[?I|zxcIENDB`PNG


IHDR``w8tEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:42C0ACCE332068118F62DD49A1501FC2" xmpMM:DocumentID="xmp.did:CC894019AD3911DF8D23FB6F4D33E864" xmpMM:InstanceID="xmp.iid:CC894018AD3911DF8D23FB6F4D33E864" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:42C0ACCE332068118F62DD49A1501FC2" stRef:documentID="xmp.did:42C0ACCE332068118F62DD49A1501FC2"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>ްIDATx][dy>Uu}"k$Er"%"!xH!(y!o	"H"C,lda$!Y]2;t>:rtOlL_fCt4tVu1ƌq]Cc	1cmLq		@}<0~c	8 .3Ï"?<8s~*ǯq3 G{yoP(|v#h6L-jP_Mxj_s=oK#ُvt[ow}B9w{+I6{k}@?߮:ܣGoԙ@AjBqJB:s̟/..&|NC}M_/gˍLP7$p+<]x瞿/GA|3'O1e//~v%7ń`;NX_7~7M,	 O<wz)0E];^5yB7'J9vfLI1Aay1r49KXN$!Jc=[ιud)j@+.]ZA^.;	瀄8Now륉|=91D
bO$(Π2CLa%(+4ЬYV	>4]:~9LyѬW~M'˥B=wC۲(+.28$]E0T$ZyI'PI	fC	Af_#o0HְyԗW6o|wy@Ge>hUde	cNB&GhxϿJб"JEeЦ(5=RB9W(2h"1@Hc7bK*' 	ݼwVMb&ĔFH=n˂.Lh&A5A5M>~H;ƻ.@8AgDQbjpdo,mّ|x%(pVd@J\JRQav$&>DAHc0I
`0f{vesɀ$.|mϳ1BH1B!XBʚ7R.9`@E,	1c1w[	Rn$
BR6-RkRR`l	p%H]'L$	Xi,"9f>QiNb9hz97hUh~>Fҹ9
$XH|	kC(Y-h\v2i_k'DOȄQ*B(]U׌ɔak'LFdmzd
xHjOF@0u=I
cSĠ:t
耾TK%X[I:;aixԝIRѝ/qLj}s;<ף$q_$4J`#NȱH:2ErDo7^DZk$$w[reu?p*_|NMځ-kĂ8i쳌x*06}HiP:VSˉX+;uo96Yj
y1lqcUXb	A,!Lx	"XEcW3>(j@M8_JZGclJ~h٦O,["%2v5K%NDV٪Sˉc\!jAx	o`x_l@c3ء @5#!m~~5bIX|Y5_s̖<K~UۅgmTJuw@ "Ct<F1CN
1)3݆QԆWksSY3\.{]u3SNyr®n5m5	4`F+
jdd;R)M-9)oa@'݆o1.OENze˯V$Y&c/oH_FteH#uݶqn4|<p/L9&iiVOΧm1-̕a{K+F%jڶ2PL|ز[l
l##9Ri4#ź+mh׎8;փ1ǽ&edkgbu}:m\F-$vsCkշ̄&]\٨][Z7M93SEsPRՍhem\ʥQ]7?]x7
SF	Ď-U>omtR}xzeascs0KgAwkVT-	XYj-X^(Cǟ.ŞmZGb!!kxqi=D|v9|!(x3.׈iހQ }^qvL"WFbǟ.GE>2?e;:~Hd9.>Bżqҭ'LK,dSH'b("fJd)o-nqփ?+akʉ3I:]\axTY̸UHث#';71<tӺ$W>[	rQBBd̚qmKln# :1xi0f~Z5YL7@qQVذJc3^ZaK<|\cljVַժud~A<q\Oc9?[rwCjGnq}qōZZ.m<#)ݶ\O`8V6ۍ:P
N<9@d3*?tKCW7

<35v
iA6"@uɎO'[#;
>Qe:yA4}Z?%)&&@>_Dtg԰lр~߯O
Dv?.~gri=)b{_aCtkah&'އCGYoD4<v
3m'Ҁ{2[}X^ЧL9tF@MĐF$F6`B!moi4;=,NB0ԋ+xum3\7rf*d"`-c=Tt}yV,uiuӏWV/[GgْՋH-ze+^\Z0$laODzCWOpC]CK};&ĉneED֌c4=RٌW֪ܔ=].F^p5sq*_Xc2C^bKf%k󈢠uvEҳvv++d@:sc0"7-Z'9G=7׶abG\.=AI&,n6JGWz7G;#'΂IU-MpdNW_ Kl.WVb6ٲS,x<+r=ϣRlquh"D@6ү58M~j3EJ6?Y3D~S#V"TP2RDReB"SD'i8iGj5\z漸4Uw	&eó,U>weE}dtNX@`Q@!d$hHPp9YHhL3E2~|tZ49bkr%ZlQρ#4
J$*R
[LSFjڝ0`mfj/`UHvTPI̘*c.,pҖ\,DҺ J<;]g%%
ccu}#ZYFF2)˪,\%w"MUj0
釺A2m9TWf:#YQo ДD LkPBn5U[Q3.]$͊e
a.|GPR!6όdAL

P1A5 (R:F4F2 ffyU0ף2<dCԨwbINY9b2b윈
	w2A:1(H!ꈑ)	Hb]oZ‴&PA
kioDl`uS<ZNT;(l$/$RB:bh
yDǩdR/N4@H>SNSiZvj}&IZ2_vU*Ui0.MV`ZIzM
S'5=	Khc$Q.[Ia ̗"|hardHMK%VɲdK@cVӡ	ka>KtENk3YF@*P'sg)mE1XKE_hՑcw+AQDPPG5D/9_Hmb&#%uYB)[)EuQsŃJg*_|kwvhB]MK
RJFEMZr8eVp-ʔϬ9ykFq[[Q0z+AX<oVx~X5"(躢"C~"B,MH2hB[t)M6THtq0шL[P3?~+F| ^tw&`_śꖑ-]Q\ed9ܚqͥ*Yر7Wa]|AϿOEQ\G??zWUYFMRY:v7n~3^x7^p_6ׂq(a+vz~9ڗR:^L4>>nKĽ-,,J	u7Iq?}衇?OM*g}ٳgNR
";qp_k/>/u~no5P[?wܩ{ӧ*'wA@<J	#<k/ex̏O^s~ˆnQXh9 	qND\/Y5FǴͫ$`M
	0&`˜16&`L1z%ۧ
sIENDB`PNG


IHDR?
sIDATc`8  Ϸ
',IENDB`PNG


IHDR[HtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:22A502E08C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:22A502DF8C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>URIDATxb?e
XHQ,nZ??:&iXpr	4q/ KPɨ[-obeZg!ՃQZboV<LzUQ2i3M^*&6?,xxAq-
J?&2F\&'|V.A66LG?>P?_?{$iji?z=@7,lX3`8@R>*b{߿ ZhvT
bUY$#h߸`u\NO_	p2/^#,O@WIlW78믟>%=}ގBa?3Y}iZ+=Aa]N^!VeJ?O;`Ի?nVSjI.A@i7XDh9j0 c	;IENDB`PNG


IHDR[HtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:22A272AF8C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:22A272AE8C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>57IDATxb?e
XHQ,n)*̛_4LNZK@XDOn"~Yvl\8u2R=,!qcad`[̨"Iq
J3gf`aY6P1*%L89Y8x322O>2?hz}I򙦖矙Y98qgba
q %(d>!)Ud1	

<?0d,YŽYXXX4`*|<Kװ)J#2W-ogq?}.z;>`EdhQ6{א
f6<Lr
*y}_wџܬ2R-d-e_#5c3F-
CIENDB`PNG


IHDR[HtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:22EB0FFB8C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:22EB0FFA8C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>3{g~IDATxڼV}HSQw>t-Ʀ6%!?
2ȕTҊ)*}921HK@Je
$a_VT6԰ͯ}M$nu8=se_†^BJxl}"7hrTt2~Wv'KNd+**c¾o@dqRRl6O}@Irr2<?Oč$*@4zJBF,!ʸU:Tu8WT
СUg/ddlgf_z.b<]NGwB*=|,|b`ɾ6yĈ>\-fmWt>ݩ"SJj;uw-d5Y[]㣧wDxI9MYR#*!HVυ6keB*%|;f|F48w5as6Wyü(ILI"F"MciBxq7@ָPI,.Ӭ"OZ
o
a>.=JS4<Rw\oI]
"- <ain(EE?^юcG8,Ao˭9s8A(Zer˭+m my*Gyb)
 3*|I~du֯	Ȕ|Tuij㤍P&"4
|"gٯxOV@@B!\.d2mP)V."*455aCihh`4G-iDGG]__8)2744d<oNKKVVVrcbC?A[߿tbpAAjRRR^ʃfd#xBa;/-dYEIENDB`PNG


IHDR[HtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:231242698C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:231242688C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>wIDATxڼV]HSa휳sgEOta`]uь~?.."
((0ʠ(qTDdYLWmt휯6S:v΃!($H! AALX,9%%%4FE-)+FFFd۽m	˯|,HIIY_UUeIMM
qliQf``mhhSfjt:0̬
$Iy]QQ1%,	 OlìF@A{|d
‚Lͅ2iKL&%ۦ@I"!wKO2RjS˚/][	͞roj#qGk8|*d7$qϜ
j$Vr덶뉞ø.ڹSv[
dNP/d8LpNGO{YfX
r	A"ԞIZ<9&-fyYQ!S BdtW~N 3yb轄aa+GgJ70j݈Kb=E3p䍲͖D*2qf6<l<_
<rִ4sv!z+񩱧cff扚}[;}UBk~xɦEV[j;Wmqj\roet-_y4sӥpt.KRd&tXgOƙ3x^qhDVUS[U#W4: 
5_I	x_3̂z,\ ;ڳaaȤua(/t8g-h0׫mjj
a67Oȶڬ,
lPFfu}c#^D*ib_LqIENDB`PNG


IHDRH-sRGBbKGD	pHYstIME}IDAT(ϭ
 =0RaA
TNI<3J9#Ľ>R6h[yb9
Ù8X3iKPDIKMc|9ː_wIENDB`PNG


IHDRH-sRGBbKGD	pHYstIME)&wtIDAT(c`@cbb#c.؁Ԑ	f`MM9s`(`|> +wflb`?c3&Rx0Ʀv*У
@v#'r)@)wsIENDB`PNG


IHDR

r|tEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:22D950288C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:22D950278C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>dCIDATxڔRK@nF2!=tXKE{ra/ěMc[bNB7o~p(#B-·EQH/IHkֈXp@)AL	
4͊!$,2ɲ<kNgV%$	%uNi3%NzJ޶(ƒJC/Q-QUUgLJ׻FIwz\F$-*<gyGdǏ/lVu;~d2	8u]oà^82[ZᜭIENDB`PNG


IHDR

r|tEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:22D501D38C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:22D501D28C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>FLIDATxb?DȨY1221K}io_M#ȦWo;tsզ̟>/_?0cj> NlRao@ίߘͦ蚘$L*]v
bV~be789x0#Pb
aefgg@dm9=vF,\
 l\Jf
y<2ww?7S} 2׷[_?]z 
P'`HV6L׿d˯o/5&0Io=lb#k{
j
Krˈ227aˀl"$? 1M`,IENDB`PNG


IHDR

r|tEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:22D090F68C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:22D090F58C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>IDATxb?DȨY0Nfdb?ݏo_M#ȦWoz;tzƪMY>}ߟ_L~~aSf`@\ٜ__?1ﵓ51I*1Hgʵۖhο`+;w*հg#_SLT0;;	+ϟ em[04el4bca?Pca`hgfJP2@X#}G~
1q3w'Y~}ӹȡ@ed{i7?O_?P?#pփ1M>|_L?d}zm$ԲASMyZ.y1VFf:`MAbc#=IENDB`PNG


IHDRrP6tEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:22CB390C8C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:22CB390B8C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>VZ IDATxڬTkHSa~dita`-LOeH2#v~Ua?da-RKK74ssy:߇[*Z|;<}}ò,KpB}]rQHپN9~RXr
IhdDdI.{iڱ#/?[
R@s)yPŖ6 	"L >jNKv?@
6=A
7)ܔ|f5`0Ux{PE%M<HX-fڛ!o|EM0EL5K씳T
pcѠuP->}kQIiY-W*d00-0?xYnE
^_ͱjŎ9p/Fr,:	`1a8Acm!N%banCyPEtuR!6卓Apø0Z[s2+)]Yh@_sK@8#:ۃ.]xb3u28zX+n|]O~a	/Ntj}```
u`@54ǗÝ\ٴݤ=۱쳒AtG}xlXؔG$#"$eM"i9tۺ0cW?"`A ~?)<u:ۈ"GGY%6Ț*KH/-$bD2"@ć9?qIENDB`PNG


IHDRrP6tEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:22CB39108C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:22CB390F8C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>g'IDATxڬT=KPOP?@&Kխt(i.v4.uH[T$^bB\N=5,"`DJb^򌽤2lljsh5;Qcn􌈌eikHV(df{&<J	p'\*j۰X, C$\.!yOöm"
T*BӁdf=[FC$SW<BER	"B~@uZv٦4(+N/	\E.齜6#RtݘuyCJ亮9M
D*~
ٌ.!Iŋs8y~(m&i	y[7<K} r*BFx6h4z9ŗ#AgXda?c0чx10=</f
IENDB`PNG


IHDRrP6tEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:22CE06238C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:22CE06228C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>zIDATxڬT_HSQns6"5ȇ$4fЛ2|z1 ?I/Df5uj6=+۔=wB)26ڀ6l
0WːJI(sEH<ŐO)#U[eYQiF<.rg[	o0pHD*	*:7XeMLx{1
z>~[El]X>}oM8VH}^efϡs*UQ9-NIJA"TQ1a!J*<%1xg{"J7(X<Jt:k&rqwlE	!9Uw;؁էB:F*Gm_WtNҠ@AZN&"Έi-ֹ"K*4 NӶVWeBXjj$D>1npuudemG-;KylN$D)`PVwh<"ONLp!1PXE
աk
N'*y(;ttstլigdWda|na%5B yfPp8^|ư֏`0ǎd3_ڿpvIENDB`PNG


IHDRrP6tEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:22CB39148C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:22CB39138C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>@MIDATxڬTkHSq?;se[=B0
"-	@oabP%VE>PHZjR1EmkK]˜Kzlw_[l8{{~qB̔0…Lf/WL
wÖ,B`N	MҌJ'6T64,yўU>4]f<Bz*g4WϧIozޑpQk')yjbUIgv#4>𖆏aA"k!vMk7w{\#5Sp{C~p8v~VKˆtVo's:.A2$_@sjurZbe9?SU9c:0eDQ"@ ^`F9<|읛W)uGcuuH__Qc_{ёyO^EK)!9HFlLx,p8 !Hb=U2&_[Ȩ"kF mͺʲry oʨwVa4Mc 9C:{}G΍tv(W((J[Vώn,}6-|!C<T_ӀoĮ	
 aט(I2Ѐt4.-/-.JL-ޠgM
utl
3RM/mOiU(`ܭDcWD+-x]-5YkO+NϛͱW65
]NG 2Y-ZlcQh[xIENDB`PNG


IHDRrP6tEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:22CE061F8C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:22CE061E8C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>IDATxb?U
c1'?kddd#E_v+5elU@(jxYQ	+RI2%bKA
B?,?A7s122"MA_>ZAB/?q
E<x0Ma@q02a ??`g*`UH|||-#,Ly[}"&
L3P}wܫW&(&1/W1
qfqq|d'\709X/&E rH:ߗ/_NDÎb"Nr4ak׮m38NAb O.G6j 1& ͏=Z	a$ɓDH͒ itL#IENDB`PNG


IHDRaIDAT8MMh]UsOKҔRKLZ20Ҕ#)ԱHt@Q"t(PQAm
JEm_޻vplڰˍf~d$I`303
5L1Qto?~#O=GjZ֨n잋>I8LyGj`&VT+DJsc01gpRi{!ƨr@U%fhA^TN5Ż)!c[TΎbZT+8*Qyɱ2q6i9hOGBfE9ur(B+P5{IN83ʵA38
^z#5l4nqYYm344E]\/^}Sn7ۢ5^~}V~힪h"eolDQ9nlp;T(WyhMu{iF;jJj5ƒۓq/h2ͱINp'晛.i#i=LQ&w勫W㭳/[M[C	q% UDΝ_L}SS|Տx*t	 ".ں{w0stmhv8.\7ownAQʋ'*خIENDB`PNG


IHDR(PLTEU~tRNS@fIDATc8Ð`g0;aIENDB`PNG


IHDRR;^jDIDAT8ŔJCA+,,N_&hXXXXX^6M;AS
ׄܟU$'S̙9{v2M0E[%+zP(pٕF0+ٹy8FlѤjÖ+z5^@yTaa-l4C0}zq㊑P
HX;s$O O
`aKTN1.YB/~*y
YU5tF@K!y@GN5SuCez+7<_Npn?xǦIENDB`PNG


IHDR[HtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:0CD37AD68C7011DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:0CD37AD58C7011DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:F77F11740720681188C6F7ADE30FB7DE" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>"*IDATx1 b`LML&d2L&yT7,IENDB`PNG


IHDR[HtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:0D11DFAB8C7011DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:0D11DFAA8C7011DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:F77F11740720681188C6F7ADE30FB7DE" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>H1IDATx얿jPƽ17D[3ĊZ"%ة[AW BuroQfۢF{LJ_n8˹$|$TRB2	 ~?amA+-a:Jӹ	QI繎6'opbEfjSJh/LŢTUՁcKmIK?x&G<Ƭ(اP(žAòMO~f7u~?^&I:IwxuhF1f[U%6O~\2z=49t:eY~T*h
Cj<3cBGvxWrnsKG|#;gh4raZZviP*! {^5H-xԅ&jzDηsIENDB`PNG


IHDR[HtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:0D3633698C7011DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:0D3633688C7011DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:F77F11740720681188C6F7ADE30FB7DE" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>q=IDATxV;n@.I1J $!%qJND
MNA B"a	O޳?R>+͛Y{yR\B5<PWPjPoPsW$E[]V.Y&IPJMu]nbacs<-_,{^*tNRnPZÁv;Z~X.8jպT*V.,BڶM8TQl^*f2`?7
@p (h$F&`ua_>2Lh+%z%Oߍ?ύ2n,m= Yw:"O&q
,0(GSnptZM@44(Y"VJ$n30<vKDIENDB`PNG


IHDR<tEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:22AD233F8C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:22AD233E8C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>?~IDATxb?5Ax###Ub.j$Ĭ0Ha5HFTSFՔM̌$ɪ[Js.dY$j6L^v2+|9
iǙRX9x88yʪ[]6]K;'o%aqeaZ=]&&v^vvn.c$bYq1wK;^ڽn#?|/}
Tz SpƚOœ10pm)Q߾,B|~bfj|߿
9aSYY&I[]p/(`	qrMefל/iW%j#?)

#d7C: 9̊J=@>~AAb ^H2;
k;@a_{
T:R7hF?q@yBIENDB`PNG


IHDR<tEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:22F177CF8C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:22F177CE8C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>IDATxb?5	Y?#!
WTfccgʯ_>nyy:@޲\R]]^__>g"Vqqqٳg(**Nq(.t			fI
W^:5.P|!#
		iNAL,,,@dD/,v~P󿑣oJ
b?{?yƈ,pj)tuHkNj霑nތr?C={u
5[YgQ$1"'̭M<B9TkYAVqMM?s7epq
۾x5qymǯECݝ-[01q隸 o<aˠ͝Ӷ#3879p<\lc7yGrpivYd?]m5@eO#x9w{ւL,\۪3ALqK|񻊁6w@eݸ/mcinڙRki7r(ѩ&&$1^ @
*fġ@\ğ1ad3,4ZyZ6<x*1T?A.\FAfbv͛N
iMcƇAj@jAz@zAf0Bl{Yʕ+;wo,s+))ʧOHu?bh*7@|>HkIENDB`PNG


IHDR<tEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:231DBB088C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:231BC5FA8C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>3n|dIDATxb?5(
X9	o!
ڂ:>>>,LLLX?ϟ?}-[Lp>۷o,ϟ?g1cƇgϞyMۛGQQ񇐐Ovv,,,xϟ??d`3g q==?999B7@O}}}Pxb
???rph	£rL,LHu
RrA0|Er"wL]0\tueqL
**,ch~aUx)./[1D.6crVqpxQ芵;MՃ0 P\˷~'chS֧O5Tfpr;aɳWd`aa:thuocG&3WLVYhkoӮo0[Vw/33¬]_8r/&F6V(a ?ƲdncWlK4sqv`}7޼s$fV͕Zj˒sjE}%0ݻr77	Ȑ'OH;|2SGCSNbu Bk޽uĉ 13#S<ӧormݺu!g^a5TBeЏ?/({.Xsm^sΟ߿gULa$Ù3g/:bx4ˌgk@HbH5-մԪ|s\0wHIENDB`PNG


IHDR1tEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:2328EB338C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:2328EB328C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>
8 IDATxb```e?@3``,;Q\:(IENDB`PNG


IHDR	
fttEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:2320EE038C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:2320EE028C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>IIoaIDATxlK0EQۄO!:$`xZE&(VUmkQ	?
=(߉w&	)F%$]	%?@vD!D!/*7SIENDB`PNG


IHDR	
fttEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:2324AD328C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:2324AD318C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>mC4IDATxlϱ
PjkwDwKZMpCPQU-N(lv}]*R:jeE;cTo<%}1lVAXLn٭9ai$ߴyGe1:IENDB`PNG


IHDRІtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:232C176A8C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:232C17698C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>';IDATxڔ
@4+]""=w [i[̈́?ܱ.h91	h.ڂ
bPh@]=QaTa4=5˘`vEh1n2>nTSa&pMPi8#OQ}a)AduX!{jg:n`Lo7#(LIENDB`PNG


IHDR<tEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:230491F98C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:230491F88C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>IDATxb?###3-O	BIENDB`PNG


IHDR?dtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:230E57B68C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:230E57B58C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>޽TIDATx̓
0{m)*⻻./ "@	V7}I\!"2Lئɏ&8^Aj,ꪴ+uKa굘`GX)tԨL ʾf
o;Y|(-)r7KJ7xt%
<CI<QM3S0d8pdVs)(]kJ8KjTq*y10CCtIENDB`PNG


IHDR<tEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:23080BAA8C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:23080BA98C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>R:IDATxb```bN f?@
QWǼIENDB`PNG


IHDR?dtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:230E57BA8C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:230E57B98C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>IDATxڼ=
@FwWll,A[;+O<DD&f'2Lv'q5cv`!ռ9cG9}=Eut!؂e]%BJ4)S0\Q:$\7)+Pxࢎwpm@-%@J,ݝ_	4sALbi'̅T\?{XosFԄIENDB`PNG


IHDR'tEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:22FED5018C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:22FED5008C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>!IDATxb??K{^IENDB`PNG


IHDR
ntEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:22FB408C8C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:22FB408B8C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>k,ehIDATxb?1]0+ sőM*b 
? P Eb@Ĭ0qfB2j
ot'1An{30P66Md<4(렙-IENDB`PNG


IHDR
ntEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:23011EBC8C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:22FED5088C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>inIDATxb?1}@h&0@J	@Qb#c `b Ln

ATo΀cU4b59T I0D)C^IENDB`PNG


IHDRІtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:22F7293D8C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:22F7293C8C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>iIDATxb?5FFF% %ď{,1B)gA4i(61, dlP16($ΈU1!5h1$HAXԄ28P
@
@|!fIENDB`PNG


IHDR(-S9PLTELptRNS379==FFILMOWY@YIDATWK DUR{VLݶ y//csK0xLĀ
p)/Cb'R`59;lRc
=pIENDB`PNG


IHDR(-SBPLTE{{{yyyjjjhhhggg```\\\.B*OtRNS 6OP[]^eiaxiIDATӍNI ,neEsIa2 HI`5{/\.l{<JHꐘ]LނOZW\]$&Ifd}0IENDB`PNG


IHDRa
8iCCPPhotoshop ICC profile8˝wTSϽ7P^CS . E($@(!!#42*C"A	2((Yot͚޼8s$  V C y2bb~<؜la" S#[m

(?)s"lP92.qzX(OȘ,M0J"e*Y3rf2YʹGs$<#A2.re|Sk3xlP$y\Z$QD#%˾b1/O,Wp"fpL6,?/7'3Cٜ4gQeȚlohoϴQߔYz3%Wy&e%3̷_݇.Xdekq,
C3oYʷ=o^[.fLϔB6`yq_"(ٔ2\)`X'εLԆO`	k@Q-w߂Q@uFfoςK6?sWx#~?Kh@
h}`8g|"@,X
8 d`-(`jA8
:	p\W5p<R0	LCRt CX+AP,%CH@RAq,t	A;F`L`#
fp /,8.7Up=|nW[~O"!"tDa",	A$DBJJiA^"EƑw(b(g?*AeVP5CvTj5&5h't:E+m[aCc0XL*fӊ9a&X
bl1{{{;}#tp8_\N+Uppq#is|*~?MP&\TZBpH$aD>q
xx8H|GH^xtttL&qd1y3|V`UXPЮp]"^PCqbb1ūJx%#%/%*ZJw&6!eMʗG)XŇ¥QSQUEPQ4͘@KҾ&T(*TTTjUNH݈@Oӏoњ17gӜ9LjTKT[UoWcmUP{R7SSU߭~^}\(8q_4\_OsRK[OKUuNk\]UU]3
ÃΨb0&t5uu%tu"
ZYI't


Y);
{
6u7?4!dԛ4ŘLLw^3Rjͮ|]hGE&a63-A/⬶ZZ}Nn~`CY`She󻭙-Ƕ\\߹v}9|oywvv>;؋[hPV#q	wNNbN93ӜGo?v"ue&u麱ݞsxzzxi)lrZu.D<Mm[wNV'1`bÂzIkۂ.4\(XBB<
5
1V4& wuQ¢Eo"<##DDJ"+1V1+cĪc;qQq&,ޱx8.8%yK.-U_db;X":1:);]Ϟ\nNj*x#I.II.ےRR*S^T=Si!ifң[3pA'S;3/s@h.,JvdME%ٝbX(HKs\sjsFS-7[iHo+P+8+tXoj٪V[sh-amڟ
+
_^UUhhbbQ
lDmo4wSO%ܒ˥֥8eꛙIwollm
mڷ3l#aǥy{vvJvJ:
TIUYZYnjw[h)~/}~+c-J|<(8(=~ѡIn4?|;:[-Z魥Gɑg'~hcc-?PFm+iڗOttH;c;/8O螨=rTѩ'όM>;ԝ\̹=a=_{\G.O\rt2r+}v}m?o~j5k]N]w~7n^wߑ~<D?,yMnKOz=Yg/ٿ|.zJ~Z938j;zbwڳφOk?[DK˙^:zo2LOU{{]#ӹ>~L̿  cHRMz%u0`:o_F	pHYsdIDAT8c?%ap+/Nҙ 6΄6`Ӱ,p7oބ	b#@42*B.PHYB	!^\IENDB`PNG


IHDRbPLTEwtRNS>`|2IDATc{*CaOeO!Dq% ŨIENDB`PNG


IHDR,vKPLTEٟtRNS0J!IDAT(cd 0QŃW1#A
IpiCI'0IENDB`PNG


IHDR tL	PLTEDDD2C2IDAT5
0A/H"}L;9ȃ61!:+*"agԳ]GIENDB`PNG


IHDR{PLTEDDD3aIDATc`d`Vb`҂,BJ@RXMIENDB`PNG


IHDR	PLTEDDD2CIDATcHm`Hu`&C~IENDB`PNG


IHDRrHIDATcpqq_t5
IENDB`PNG


IHDRrHIDATc+2rqqz
*IENDB`PNG


IHDR WWIDAThS@o7ZP
	(Wy\v/	NgLrB{9>_EUqujåtDRA\EY-jUFYr}m*ش)XK9NfcucUxײe$1tlL0:Bjvn$k,BѪN"YhPV> lsT!֎TT
+}?rFY:r2y䑜<[詢=K*|6OCByVB[gKdOlv.K0`
\O}48zw`p0>bg#0|\`%pΰ	p3=?)؂0uV`쟸.h30`-ދ 7s%^>z/W4UE0wv)|w
?O83	?'O
mhq^rV\Y&En2DP$T50
v'<wI춨>8WiMr?(JP忚%疑bau
NbDhJM{en[<z*L06qbT۹,ME&ЪJJw$vDb8m3jI"gh3?ZCc.ñ3i$ʹ?Yqr45+e\bZ]HHH1v9ձ3Zb`ϑ.={zQ`Eۂ|5ԀPj@
ob	LIENDB`PNG


IHDRAIDATH핽R0P1CA
f('mRa’-fSRWO9p8z>>>r{J49x{|>N~A7>zsTzGIAÂ<41
TP$$hh7Ԛ~gj"sG+H:NEg HYDEagBHTiV-o*a5UH/ۭW(Qq|w>K@Bxt__\
۸s*W{+TäTQBS<vhw!~"Tdwb҈)<QpIOvBc0!F{Q0Go<QEs捲E鸺2"2<vU"q4[A8JLsDn˹U<{bdu}Y2Uw/NܮIENDB`PNG


IHDRAyIDATH핱J@(vz XU>j'6yBBA,2I.]rpofh:yʲD	8*>89/찼ā_I{BKBđD!<50,/txuXCJ^K2*#H]'ιtݍ.	/Dw	u+m7+
5\K,!	uBebya0~1^%UU?8Qͨ̿r#,ft+*l^Ys<F(yD»g]
mNT¼fEu	w}-jSdiIzKkɑ9;a';>R]{FIENDB`PNG


IHDR&tEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh" xmpMM:InstanceID="xmp.iid:39FE8DD38E0C11DFB1BF9E0F3A7ADF5C" xmpMM:DocumentID="xmp.did:39FE8DD48E0C11DFB1BF9E0F3A7ADF5C"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:1CB3B1B28E0C11DFB1BF9E0F3A7ADF5C" stRef:documentID="xmp.did:39FE8DD28E0C11DFB1BF9E0F3A7ADF5C"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>WR#IDATxb```d&Lba@AOXfIENDB`PNG


IHDR%atEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh" xmpMM:InstanceID="xmp.iid:1CB3B1AC8E0C11DFB1BF9E0F3A7ADF5C" xmpMM:DocumentID="xmp.did:1CB3B1AD8E0C11DFB1BF9E0F3A7ADF5C"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:1CB3B1AA8E0C11DFB1BF9E0F3A7ADF5C" stRef:documentID="xmp.did:1CB3B1AB8E0C11DFB1BF9E0F3A7ADF5C"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>IDATxb?###+1s0	 'Hćp_)wb@l
(17@up~/+b#'@20A1H_$KaTbTb8H$Y)TIENDB`PNG


IHDR%atEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh" xmpMM:InstanceID="xmp.iid:1CB3B1B08E0C11DFB1BF9E0F3A7ADF5C" xmpMM:DocumentID="xmp.did:1CB3B1B18E0C11DFB1BF9E0F3A7ADF5C"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:1CB3B1AE8E0C11DFB1BF9E0F3A7ADF5C" stRef:documentID="xmp.did:1CB3B1AF8E0C11DFB1BF9E0F3A7ADF5C"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>*5IDATxb?6Hq(HY*Qq1*1*1B%,IENDB`PNG


IHDR%atEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh" xmpMM:InstanceID="xmp.iid:D36C8C858E0911DFB1BF9E0F3A7ADF5C" xmpMM:DocumentID="xmp.did:D36C8C868E0911DFB1BF9E0F3A7ADF5C"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:D36C8C838E0911DFB1BF9E0F3A7ADF5C" stRef:documentID="xmp.did:D36C8C848E0911DFB1BF9E0F3A7ADF5C"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>pVzIDATxbf``bV(f dw O5##wf$s``+eenR77>. fbH
$`	( Į@,?(
YI	JJ;	,UNIENDB`PNG


IHDR&`~tEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh" xmpMM:InstanceID="xmp.iid:1CB3B1A88E0C11DFB1BF9E0F3A7ADF5C" xmpMM:DocumentID="xmp.did:1CB3B1A98E0C11DFB1BF9E0F3A7ADF5C"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:D36C8C878E0911DFB1BF9E0F3A7ADF5C" stRef:documentID="xmp.did:D36C8C888E0911DFB1BF9E0F3A7ADF5C"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>pӛ:IDATxb?6Ā$BqKe`$$cHQQ.`ɴ4h˘IENDB`PNG


IHDRa9IDAT8˵ORaƽ/˼骵f.k4)nek\H ;m*Qtj^Rp#?Ҙ40ɡ̴.\?}Ov.j]<;;y>TU,뎈Dї=q{k?Fz.s=)$i5=]j)ba|/E}+-Mt42mM#Et
RI=JA_a3 6&FCQh,B1uz;
ޡZĊ<oFi'b#:Ž0bK`Ʃ_ Eޕcp"n)x
~A'Zla-d`;c9ƫ5C@vkc֣A=YС Y^wcsގwQ1F`v}ȀiV
RW]׀Hg:L琙	7ɑؐ
3$L	hˮ	xڐ
.4	
E.lFt5#gAu*F[a"<nK/ʦbJrCKr\Ac_Β3~40BIENDB`PNG


IHDRaIDAT8MMk]U}>֤i",VAhA(sq3@QRP4
ִjm&m=_{U,doX\9~jZpwwfQ}p~5r20
L>	MIIJsƓs>mj>xjyW_<eAe<i7bcs~V‰:.<9)Qb㼴v7?%
38@54MM(*QED1>-M=TeS8a7oqp$J#gMBܹGB'rjE=w(˒*
TCrH0Yh3du묝~5	u!epPtbϿ[W@0sl_	q>e$Li*B1wbB΂JgeePMCڮh<a_l߼GRV8N6!Ny;czs#9"Ju^{,L%!	7.q!bn6mLLĤn1ss/]<9ʲ ee2i?]6$uPsh4&Hk`vzA(y4n⻭Ob!̪+O2LL?">\:IENDB`PNG


IHDRg2%IDATxRMFsW
 ^G2=@hHe*[4>_                  1/..yxxG0ΜDQg|\.'///n؏A`puuuv\Ү/OHr|vtɤfb[{,l+|wc<Riv:RwWa@.|ZM%`2Q&ŧN@Ri6~d{||89|>O++_^^>??5@|zN+EQTos/4%tzi#_S8Bm2(_g	E(@*_bsAHԮ$qf@*^Gw̨ݗHAA16r9OA
S|Yl6~&}g4l[G!"_)e7oZ5J/sY"˧lldm:FmJZ1UTc<Ei:	V-Cc|i9Y(S\.wM;&;8,lX)*Bk$k6VTաOyŒ|#{̗UfnP4)qÊ%Y/Oik2eqeb|ooo|d:?sP`s1okp_vtC>3޺2f󡈸G4[]䳇1el>c(
Böy|(Yqv<Q'Z9!uzjlq(MjZJRב/TTm×'Ot/T!lSKzen"5~ &
gˢuݦrKC>έS.981iN[N]>qU!9SۛcU;cá7ET*ͽ"9W#5qd YÌ=SV}Nf _0	s[%5cdsd|g%v?yAQûST@5T,!!ߏOAO/,vʘ9f?8K_JǦ[f3/
~:dfƬaɺE48R?=d}r2>Ar:v)JqݜZHh4ɹ6[YIˋil}UTK[Mu< -ȗ.{Sޔ*D9WT!b>|-Ic(Tl%l|Vgӽ}O|'JMQMX*
Í
Խ$6·goNWNM&,Dr5KɼGT*WX6{FgrJӹ@"wwSJTDoi21JXF;BR圡{8NE ^tȊ >H6V8~"tw;@>gWo-x_;iFQ^㝰|f|{|F%WZ=ZL/<ae|'5ʿ2237];b0Zn<Veө>#O)@rvVeYC?~z|}}M*. 73n[nSzIENDB`PNG


IHDR>^oIDATXYJ@v*zhOOBJ<(ҋ/=ۦ;;ۆV
	ew 
8t81VCLޟGfv2g)/JFY'yZG~RBf7(OW
tuyu}2=,r^x4xFD
p<?24̧E<.މNN6CM093ŏ`S̬öaR5/ɺ2*80,x3g]
P!MH($5Wy8\Nl\eetU.̟)$Uȅ\Bgf`>?<\һm
oͫݕ)IENDB`PNG


IHDR>>sDIDATh?K@ƟDR]pCwN
qpQD?8ֺ9KvIuhZJAm\.}r(hV;/DQA0[
G~h܊uHjJcK8>]*]WD@:>>=$]7?˫A
:<:>}h6ofV@vmfș[aImyrrBqin*Oj\ڎc"
$'HOJi^	im?-5cc/EzCWWWp'83G		t'8_Y	e)	N8t9&o?/[_
k	Np[*ո>=mwAIgO__/{/;MEȗIENDB`PNG


IHDR@yj}IDATXJ0N(<7'Z?ەRn=&;AQT慎ʺPanyr+INRNRICUt&c^X͙Ӵ,ˊ'50&!@)cG'%)Ez\<#ðPNd
tbm{p<,==:>+]*\2d]U\;Brm{I̧\$w*:mA0$0_(orfn? \0L7G\{ܽ\?!Mlc]@Q n
.`,$t!ʀz
ƌ9F0ryvczw^5O07=pIENDB`PNG


IHDRaIDAT8E͋UG}ϙQ3@7B+;? ٸHp/NQfJV&B *mg0GU@7UN:n_m
~L)o!`fV*rm|o7TOWuM	6.@
720SDv?kfbLiH)3LAt
ǜCU!6<)ebĜ1|3Q3Tsk8&8E)3UD"Ž/8O3|M)XǂvӤDQ(~I}\p>DPQچf
ECU3i.)\1"505cTûQ5JY)PUv;!i7Scr/{Eboݾg6CDL1
?莋Wnqh3v#9E93wNjO8s䜭@
px#Vt,;9t$A^_M&!#ź5)f<.Ԥniboԛ8>ODDqbE͐:Å11*?`Syif-1e|WyDmənDgfπOpc<06pY~0•	PIENDB`PNG


IHDR{k0IDATx}kmYU7\q^r/Mn#`
Z&QS	IPDTT*yMnlm
M+y# ݍt<瞳{͑Ɯkε޷kƜoAX?9ym@\uwy炨zUPb!UV?CB=ɣ"/PN#=*O|gԾ=q:?0`/J_~/pK g8o8ͣ'.:qճ7v_>lSz4§by碭C?k掿r8CM].OΟ~#w5?8svC;
}U|7Џ8}g=_x9~e@JS,z!2.yw	S
XH9=T,e'dr#Obf{05^^.>зu/#1
*7pKz~9?{?\=Tn_,._DMZ57AREA쾜ٿȽ /Hv#rfe92e4t#L@`}|Ā:1
`@npxf=ywCo}S
3,̜`ݭ]?_;G/ bD"("RA{QxV!?!z{~
9q~Bc^jE)Dgw/ %G
6u׈ⵯ00`c.sSx-N_ԫ^#_t爩PM7PonI7S
@. >VP{!H|
NXЊs_8:$iNPќ[(͂v8_;6УϸjwgzX8KTc3/~dSӛ(j8yub{qD3yqg09”{B}[إuЄ]$ݱxC,!:`	U8gOdυnc"(^oy?3|32*Jx᱋,H:@r׷wq5WVQJ|'xɶw1Ǘc׍u-Ӝ*{pY:L+y;n;-v%B?L7tW>VﴀrjORA
)QHESۈؼ7yϒB|Iz ~eyS{CC,q&>p"{r
]H&_p듯L6^1&`rW]s`$뽑>Q^뉐y-q]O*
YGj^6#ÛTYu`%Wo`y'j,çRYCgazɉl a?+B;H[E2NwQM|>JBXvy;$ıA#悭MZn?dBga+בҕlB>CU1+^y_a_;WbŒtXʷq(ĂnX->|#/^C$8AuR`q Sb%"yus8"}
&9DqɽQ)]MR!t8Wp;)&^ްSܮ7})),2*قwDBu|i}:kJ
ѠL0""(]mXX4*Q^&*<}-;b788Y	Lx`&dH\X@+ Ymܱ|fDyo$q^؀`(IQR$8
9o.C@vR.P`cAOkٍa,,l![ǴvUyks8<w&or=dLT5~Xx,-cX1zf'5GzU)])8nM3z8[aـg"07ma	wTl/88Myxԡ{0vJCk-=_+Fg0HB"BZН_Se1`S``1b!p2l;.5dPD`R6 JNrBv~N[qGQF	#a:Cl1ʗapЦ1,5n;w=sfp6Ko)
eFم@`X(Zb+qCŬh0yeN`~{A[G-hL
65P0u,a%e4wj##dXdPVJfMdE1DCw}LeqW6ɣUYGy<=8z./z^b>A)IEcj)Q&ݗ@(9&R!	K֨Fc&kvظ	es'k?s)VɺaqCfhk­oT15j'\G:	c:]C9d f:O}}L&S(eKQB.7h:@tC20j뺆}kp
"Lr`TrY\z1<'p3.kA`2Iq`Q6@aw{D^P5`L,
v={1Y%s<~㗮].d9uٝO8yz׿
KsM0.|B	p;w@cP~T'ieۛj4JxJ<v,s+.-XX-^p,J܁6/j|/zqf3vmBda!~8>H7$T7j.=#*./b+vIkrsddke]IGp%0?W!2&05qs̜W`c8H|Qn"]@)Q@Z1G) kuO4F#²^Tj@+'鬉ke$	&jB&hK^^pb[P1(/nmҀ75Xx!yKy(׵4@ZM.C؁7]#޲WݺV΍`)PN}B\|3IH$!u|_QWKe=Tsp&fKqE:zOlv$C֡E}Y[r,͢=O%eHg)fnC}?A[a,ɴx15X	HIkĵN"iI}֔:a4,,5Aάl\3$	[/oxS-e%>YnNǪBԉs[=<?rH	R|*1Ls&>W9DMRr$#!ʓz=|۱;4|q`'m

2g C[YDVQus'N"yu2L֜ߙkJ۱W_u&mRTk4YƼ#[I&q)?$,MPOdNUOpO~B/:'#:9nƜAĠ
'̬d:kp:pR{_gU[ct$/_tz#[ϝ}	81rWQB?i^}/9AZgsBm}yw/.9(I<zdRE(N=N3kxIMHy\Bbz8QDnRIV
%9k8:
 37Q츪'.f(z%lํ+̮ry#NN];v1E,8ׯjڧ`Yܶ[<2%l<ʠ®G2tb~PL/%[ϺŶً%KBQ$z*r	#R6!V2aw=	?SƝFp/(e`Ss֑.92]>zT~NC2"Y-^>(vXYC:s+cwTڜz
7d/DphE98 YQ@w~©
nYn-msh[-VlK"|NZ^Nz
6&@%zQ.)Oz
.[4n߿_spFer9gѳ9ͅP)5fAM+2EC}U-̙<Q}riVhDeGLUq@1,AK,T~7UkD@M0}z0EŽb$,0{%UOfVqhd"Z\Dl8Y?Hjw7NؼCT~FpG)jUW25QD6VzShV 8Ԋ~Biz۽8sTDRz.&PE7M;5\׮*bhZN,XrSCj
T]ÐPJUog)&I2a0Ȱ/lR+`dCoØ3f
!r@2k|QhX<@G	*ȆCy@1e6Rzea
\^MSd;RGy0i&!a	¢1M*2
4n~섾Y.aLS9ve
m0Chu9-UdjPKvJ}({29!]2ĶIC]9%[b	nk90f94fir*lqK%^wd)g79Bw31u
m
hGБI5Z
NFs~EVJ&ysHM;8:@l9\Dp罺7^6~X_`HD?&ƫwrLF^5=]M&|;$7lCG	+&vAQlD5z7vcjP8a\cy
"%Tp	8ƀt
C4Ͷٵ!@.`A.mAq#)U)ڸսk7ybqܵy\`uX,Pm+sJd"1!ϣ*(=҇ ]YOUVo&eZkTqh7C"QHA	,;;d- V3HT@Q9fW]ur|۵/~p\l=U~Wy.ؽ=9WV݄Ծ l%0z	=C345))4plFNqgt'f׈23K
%Ga<gV+m,Hp>|\LYV+\#"'T;'?NV&.5}>x?Cȹ(	|EXn(_G(P-L%8O~&K4/ʶNYPT/w,ù88s񔋞܏AK,k58q"u6$:Pȡ@.ƛgfxWXuu-+<D粑];I|J/1eb#|ñ#X.Nrf+m554X9HFX-(E}<g!eIԷB/bX.qƕrђq
cMbTahòY'$:D]šƐmXQbU2p?X*|^4D}229'n5radIaflvؼ{l
<?/[=[.Yp3`$Ӧ#X S&LF#|kNb4Zʼv3n7[1B>[\&^\dT/܁Swn[ϥr{*$;Rp#0K#OFpU[VS,	 unnl=iKvi[VΐE3Gkp1^xˇ0;\Bf/E|r_$i1W*:\~"h4GB]9!RfK#ŧ'԰ŨF:c{7ߺۨF/a1r1o}NK:[F}I•0O|
C^ŲhLmzBǰ{=[pask;aH5#b5ǹB([dX`r@`Eڎ'!mehS=4ΞoKp#8<\*t2w@[_msä
xwF>݂>m(=9]J܎01S+s/7sh
V֓$#5x e	lOt6֦=lj/l>xpB%j!x[YTsWN^g7'Ocsk&]J0@!L;4zN`x{f P
G$ԡ[~Wԑvl=tl˷V+@)]Uxߟ9~܄S#=.{@[S:`Z]
)
fr'AW#l{ůޅr^'{''i۬Ei!m%oq#MijQi[MlɘnlA
JܣN#Q
mNJA4RdPO{ΧN36.-'	w[oF_}ȩ'KTWu:庠cs1J+koykL[j'PݯQmWgȱbi79L܋vjژmWauj]YUGOm
QUjV.jsI\	2g3ʻ^ޛlvBO6ըnx⨥UЕma㈀8DxIBt<帱H3E1[xF]YGh30k˜
BNdސ?x;׽'-jv(hK8ij(AZ!2
H
WBާʴ7AKAJ8`JÃ\?	5 F.#ﱟBxW싘2ぇ^V|Kwbj49hL$)
kXá";MX⒟#0'#, zy~]Ynƨi1KL	Cp
ө#Xި~hxWPvcc;q/^p7(=9o_]nדRnKn\=f6	1Dx`7:&^QK]	
|}|JncO`ۯ,vvpx8*;T=0|o+^{uc>U]gb=hE.qp`DPѮo
>Aj/M	I2!|cw<y\vEmu6/%PgQc'1>/7܂GObgHpɇyzEV/4Aќ΁1Оktb=8c7s"psrE/A	_@[ۄO~#毿Oe9M5	*?ڻ.hxޅslnmݮNN(M)+5pPB?19| [9eEG3(,R0*Ez4Α#ʝ^q#obFRQL!+KiʶkR#JA)wc
oYmg?ry>!@B=N'`tpSaXs" :W(e"&`ckwW_x]{;|]jpu7ll8|=aiqe4bx:;'JvyJ@P
Ԕ7ytKJäƣw^6|b2C)Ù]?=x׽x;?]M,A6/ڇ"WvjN$hO3.^#
2	4,=fAi[.y!AR8W\vO_`j_4<g[5Jjxp[?yL76Qw޾mzj=A؞017׮vE|2?a0\x,
lf01lv};3?vJtSs5=ۿ$}iˀR@:4]^,G4r*uq%f[r(91֣CI	ċWښ%ө|7a/2C#4y[@c}xn—~w8&H5ea(Ʞ:d:8yFA	
$,p?%FJ56LƇ@
oy痿0Vo}2+_;7{wD:WxR3'z'M̘q0X*)Diī( v5
6
@ĹM,ގ3g_%
l;DZx4§o2ɳiT>t[녆Oۨ<Z~fHYA1<;/cԩ;ZJ!=P
;@K>yװk/weMJ>zx
ęlnlCU5q$?7Tug)za`ATc^`.O,
/lށZ뵣iK,qu5bko_y#{9]iJa<||[hYӎGP.cuX_rwwQ|T!y.ī!T#:*9c{gw0׫؜Lri7CM|ILwzϏ'okM帘9D(w8+pެzZ1x,6o/Ӂ'{\u˨r-#;xko­<Q8k:4Ҩ0_,?|7Ӎ-P5r&f.!7L"<&Z	%7jEdqcHl+86Në^vAbsmon|1o`4ްj<ӬPP<1`("S9٣ x&xΕx$R&K2V^=ЕrYg;y~^[|-TIJw$CkŋBOe09-T5@q*n<+̕8jVHA@p+AGS`q8ol)hf)D<q}1o`kk;Xrדn{Pezy?Ah
(СPv=sgZ/2BƚXTSG4a<N-
v+"lobv8n)`:of|[){Gʁ;o2#5X;8kvOӤ/١ZwbEa
m`<Ʃ3_z1.m_kHۢOރ=e%T~ m:&thN7kK(
,-"50߽ZfV<|K[Pû
Ȕ
Wy*ߍB@ĩoO_Cic2]|wvyQ|뇖mUeg5"c A1>6m<.\wr*BSa&֖7}ؘ@X,0ܶY;U.wO*hAp'!ꩴ/`*˩n	4*֏>)+ZMC2<T$(lV@TTqu/O]v`>x!O
-vI_g*oEfu
\nTL4P4/`E)~D-vUșߓWMr	͎CЁ-ᣜ\CcP\TYwjTAGDg@25Mmܱz -BSCG +hҶ?1討
Ԥm}Woځ#we9>\fikE>b19BzYxnfN
89;F}cklK&E&'mv8rf&ڤ<~*4wHvhq$DG*T~Qƫ֣>A0$O_[xqeRG,Ak4Y|з!cibR	Mnj**ٵ͗<YvRSA&x^/lv!
vM262RZU:lQ8Lr6'm0x"Eq0e^r+)
{awiogSk-;ٲU*3cE
)_8~?dKݴo;M!\4rE:qw
ENl+GMMհ\O,Yf\n+]%lZ
|WEQ392~%rmg|0)'߅U"&(†3ʜc
oP~߄Z;RAlR*]
Z&.iLfaߡ^|p`=w{#?NK-:  DeϙKE:6\-!AO8FQ.13dsN?l=46~	PFe1s~9!ԑt*=SWOr foܾ>`dp23xh^7Eu*Lf[Idae8R%KSewnWfq|*>6SpFGZFpWj21fٰBf̈ƿ7R#l͍eܖjƴw¤f#{lv!b{{O'os9_R%nW`1F88w򛷾ev/9@
I>8ɺ>:]tA$	9򧤥6Jv}{Cr.QҜRpV*mśιKt6o>ݷݼЗnp
i{p0M4w}?ŗ7t3ah]
ixj4^zیJOI)hbeDZ)^/f䧢ǟZZdMڍ x"ޣ<[ors]/M&#8:8KO%O(](Ty
p)8\JH>3N^/uLFoxmJٳcݔb'3}o9	!mG.~Ӯo<鄮IU2v⩛w<L-yk7Cq24lz9;<<}w󽇝'?_6{LBt`-߬?ۏIr7K̜گӕW
H#a&nQLPbpY
g?Nӂ} ģJ*l#?hZ<4F]52_';
Zc!QOxs
5(ؾ	IENDB`PNG


IHDR	!LIDAT(ϽOI /wO$&
.1!*-F,SӵZ1->GjSHy	QbD@O呣cȻ]@!V)!me>98bSXo~5lCR8<Nor*|=dW}^ィ=ZS8G6sI~ߗA7q~so>qIENDB`PNG


IHDR	!LIDAT(ϽO[
0kOҳ?d,|̌ZMK)9ȝ| KGf(=KS.,_.^@fƋsz z/BC7	uЌZJQ4U/#G/r^?l`-ģwJA7IENDB`PNG


IHDR	!LIDAT(ϽOA O^Y>It
콇ag@R=mƺѠxPzXnPq\v?Dj\OQ}3beW
{QNx1+xii3ꇏGG?W8G=׬op۶u}|?@IENDB`PNG


IHDREIDATc/=1FXU@IENDB`PNG


IHDREIDATc_=1	]U܈IENDB`PNG


IHDREIDATcx1=1nVp@IENDB`PNG


IHDR[mA}IDATHǽAr EIzN1AS3M>a~>	$f)f:YEzv͓@%Lu]:
;j~TT=NimIÅ9I/.PÂ>@uFΫ7XzXuA^=PD>iд@̟BrQ}6ANkG\t9	2_ˎ1qn,8ce^ga{x\0}P9GZx[gn9ma~Nޙ{`bW>r71=
xC=]R~uɑ7&ւhؽůQ}%XwmDo^R7eysZIENDB`PNG


IHDR[mAIDATHŐ[ EJlS#P!Ngj?<.d9f~x	l<84"h&Gk`{s܅Q4 z`#hWؕ$3\
n$~l=rteU$\keaʴ$gEӵWMg?$iP.ʼn
ɰ/\˅z	ul-ޢ87aOeIENDB`PNG


IHDR[mAIDATHKIr0\xJM,Qd8Xhq%8UPIIB(]}꺟GH9瘖RAѫwTwYV9W^-%Î|Cg8?GIdFY}>yNC3ےj{#o4spK$MU4[tk9a'puߓG|^}v.48:I*s-G|}p&4	!yo\pWPUsk6,pr
P8Hduϳj*[W+IO뛏/:X籼>e<xS<J@f)/=j/{<x}f~%MIENDB`PNG


IHDR	Sm.IDAT2}w"d(z?_ڈ&22`z:Oo \PThIh<O%2>ZienQn9&kHQF@<<?
~z˫i,
 6@T6IENDB`PNG


IHDR	Sm.IDATMP{?`;m
(2+%
e&}
@P@;ED@߷u]FAhhy^_ܪ8nϟ_.iZyO8 l9m\xIENDB`PNG


IHDR	Sm.IDATAJCBA
+@7^VW.FHJoU/V7/GEP$	kKRB磯Ϗao.	|fn\UJRI`^t9?<Nm۞+	4m6v;z`0h+	@k1m%cT(K)IENDB`PNG


IHDRCIDATc````b61#{IENDB`PNG


IHDRCIDATc````bo_:=	IENDB`PNG


IHDRCIDATc?000>q?TF_]HIENDB`PNG


IHDRLIDAT(1NTas1m`bch'lC6KBy`qry<N˯o_Uޛnp|}}{~z~Utq{baIbֺĄ00@@@``@}
@),AlA$]va"Jb^DIENDB`PNG


IHDRLIDAT(υ1@E1*%-\+mrOaeXXa&/f2؃8^ ')IKQoUU?9t eY~RO(;ʤĜ%H֢)pK֮	$/O;5Z#&Q uK͖P##{B0gSXW%IENDB`PNG


IHDRLIDAT(}1n@E)la9
&t三i+p)N@AL)Ed>3B64xu]y "_"r+ۗe85UXm:5~IKqUUYϛ^?}GQDr]v$I(R)¾R)!m@".p$tceݴ̵]F?7p.ymSdntL00Ӻ?oo>UlIENDB`PNG


IHDR	;*2IDAT(A.aydžXJ[vѸJ	;{ZI{f\\fW/PWME4@Q A@H0PP(UPB%|~|`N
	a(*FR${/.*(aYwE3
P@xV>1IENDB`PNG


IHDR	;*2IDAT(ύ0KGW}fƄ0Ϧ>	&aL6׫-L4Bv6U#ZH%4=c,<jAşjLOPZMF
s`(A,HUFD4{]BxPk%(Jj_j. <6*'#DRx

;Z
=IENDB`PNG


IHDR	;*2IDAT(jSqS(77)'p}<DVG'ƭupqr$b$?ϩv_>=yry(E '>u0E UU@!EBDaEkfJBUAeq/]wf"B뺫p:Oju=z|>5@kbXw>'$#	*	|c/vSIENDB`PNG


IHDRy._IDATc8qc?~K
f``Pb6I,/[5IENDB`PNG


IHDRy._IDATcxUЯ?jF
f``Pb6.aIENDB`PNG


IHDRy._'IDATchoow6s/cL	
3-.$IENDB`PNG


IHDRgIDAT81j?B2:tJN St>B-zC]/Q|7xŠx+ZutaPPū+~~wnE ~560
 ^b!Va `a0@0@\
#af	!QEVC"b|!4"րaZ1`Z9|<"T6Ikix<8/ϻJQجF5*/ϻi5TZ_v?6}[IENDB`PNG


IHDRgQIDAT8ˍMN0;n] Y$Cxu|8Ӣ&B˃< Bbs`L		\YG$|CYVOy^izsBY	!<_$InpH
2ȠׯoK|p/
p~+u(e| ]̜haaz`<{fNi?
`0Ǝg
;@yu+Ynd8jDl*ojOpY&NZ	jXAVG
͎@d*	$:\`
;12@s#ȷTAiH.ZIENDB`PNG


IHDRgIDAT8OKNP@1N'*Hn|DL5qF
4B`w_HML|w?'m<ϓ,Dg/$Zj|fB~1U4r]!'T*Sbz;hlF~rzV׏될TVEkw&(r(I@~c
C/=}`DGVJZ]Dt_as"P@̄&FRb&9
.%O4\"
&06	k$\(e:l#I(ҝsE6'Ǒ17f#!2{it`8HT|	
Em.3x(~ _,g-0$x#~GG$!*xzm@}`M"IENDB`PNG


IHDR	EIDAT@1Jh  rEwpCD80[%8$0C.@R3
 \#
IENDB`PNG


IHDR	IIDATm	@Ue̦A&
	)I',;cS-}!7(",ѢO\_uu0> `IENDB`PNG


IHDR	Sm.IDAT1jayؤXr	*mzQk
?l~ԭ=.(PPTEQr?PmÀ
%Uo߯h(|mWR0	)MYKoIENDB`PNG


IHDR	eIDATcx/!=;0 ~"cD(
LO"=802^
 Wo4aؽ{w	2޵kWm1H+NŚIENDB`PNG


IHDRdIDATc/:
JIENDB`PNG


IHDRdIDATc_::IENDB`PNG


IHDRCIDATc/6l>9IENDB`PNG


IHDRdIDATcx12޻ڏIENDB`PNG


IHDRXcoIDATm01ƨ0M~.1f$`h$W50H '.dq({(6qEP&}"ʭ![rPH9IENDB`PNG


IHDRXcdIDATWu0d%֖mNC l舠wJ!)!,̏l\/g.cm3ȵbxW@:U^/qrDp淐w jGIENDB`PNG


IHDRLIDAT(m;R0ɣHAz%*H\#>[rWXZIoZvf7DD+pCWA{SJ#]׽7Ms[`bL&	om۾_YY)f~߭( ?gӚxy>N8F_!րR%cu*y,GjXǦ*(BಆYb_`ٜF#^zg
~)`ʰ"$C`ZIENDB`PNG


IHDRXcIDATUA@11!R?4m8&؏4no¸0рr%9g4@XA4 A\
BBX%LPa`h[.'SikQIENDB`PNG


IHDR''Q5IDATX;NAr,b;p3$
$Z_`B$S,0r}U{Yz`A-MOWS]WHۿG7OŤI{|kUDevvVJ.//ejjJdssSNOO}wL|yIro#d_fffEYYYq$onnAg-//$YE6ĖdccCdwwWV;<sϻxR)fRR16NjirXsuzA$BcY͆,qɯGQo[,9O\],Z>ܻ09J<EP%@H.$PW=,Κ/16
	cO)y@,LJ2tc,MPGUQP*zEҹP{H:<`oU9P^B[b$+әgGYU;;;`J]4$6#΃$	a8ܚj<D +mDG)9L%.:u3&X9GX	(sdO V	qqqes}z	Q*rg[VYR?F,)Af\bUOZɼm(VͤEIX˟~(
t	e5|-S
b{zq\
Yϥ	^}j?x:"9P1!yn45"gdo6=\ؐWCAb7r"5ƼǺ^RMbd491RI:_a23.qRv'yJڭOX7fuԝ_ZZ䚄?/zyIENDB`PNG


IHDR00WIDAThŚIj+I7MAht	.`<A(϶<<Oԫ/(ՐU%w'#2J*Cou[;Y׷5|5߾֏߽c	cɌW>v[__fff`z^
Q5z5?oMi/lqqvܜ7??o>	ϱs-@6va[G <mmmGGG"~_YY񶷷
`aVWW%Cncc#vh
@] !	C,D͵!CGhVJ0*„*-6Mfss3XIE	4̘Bzi$2F+
q$LҬY8r%0&wzc=??z}Bqۖd;991MJE 
P+5ji.yI%^$KĠ$֑IشC"4`UԌ#@]cR<7K'C$Ӆ"_4'S:D`D27ZmH.`eC:xQ'$74dZ4eNǑx{{8v5k~«e^,z~5S]P$i}	[#s#goc((t/ƵJVG5T'q$Ď_BSʌ q p||:d-*(#z#Kxlji'h ծY^焊lҙ>b*kwDG=+B@}\l֢-	tzz䝬q&`$vssc#͔xIe~L;TBS-Ĵ^\G;1C 0(8Th0ʈ4S18=ƁH/d_ӌzhIāczOևT6lecBܨ]</ ,SAUF'U\owD&\ϭ	O$y	Il|/󎋌QI25	Ф1~\O!TǙ*DŽ@KryH0©D>9༜횮>rZ1:vUqOqSۡ虸#jT{`ALc(lu	_hQ/.O;"Ҡ3]pptʗӲ%|R_-FK۬8PBQaX	ڲm܊{b+ {!}?@"
wi(ie[JqEBt;]{زs%yy?вiǁwyCΖ˴ׅGL;&	(Х^)JWC/덥N$Av\^yOܒ'
Q4"yw"uԇCKilߕhDnHgutMD}gK+"ߗ(-~҆_Vb4{_	$)IENDB`PNG


IHDR''Q5YIDATXXKOSAf$w<,TpcbܨAB"PKB{@1*Ph1@E	>-(h7̭04p/̜̙sνID"iUܪXXH,6H5KZFeD19 mS?&n=#i8EElt3ʠoF`[̑sׯdF*1xZHwRyw&Ur};cEma6ŜȏpHrJeFߤ7z6ɢ6۩>OT3G-hc-FL^TI]#tMAchoS7əqz'oi#s_L&jxh%prӽ.t+8:A~ymmOg;^M`BH~[u_8J7,CAuO@H<+"ySCLC8ҳ#5y^bUrER;#G`0peI3
z<,R!dKݥ
4.p_QiJNoS5ձavm+-?sT?wɓ05MC^tof]`]{w^۱-V{+=~嚦!q*i?W5	qCᅹOȥ\Ӕ88hV-]M\	qs$4/NʉDtcYqa
ı""q(jX1G90=hXŅ(^ꈇdXB59F\V/%e/w^SCv*4Jbޅ86`JD02%{ᮅ.P8Ri9Ԃ[-%y6W	}p:5;O@$rNcT(S>t
>{)?^2M*G.p\'8v;vYcN%k+mLbTO8`\Nߌ)_WLFs-1+3=
ܣT[\y+jR93`!`?Rm9QF3'pm||?~[_p$72%~IENDB`PNG


IHDR00W
IDAThŚWSWk_f-@H%Ą@pLgFzkmG*P
 A$XrQDTpVvk}>d'\ֳ}>ndBա<>P.k_.Q[o(ET@c<oQ0Gkby,vn{mP;P	,QTl'	T/	`+.Bu_X\
n;{N&|=|};
{åa&dC;	;c/Am={pj|_&(C1PO4o[/¸v{1ҰQ&vƇKxwBI/CP؇
I3EcH,I0%}R\C6"-P׃GpoBFNpvZ/(+01P6[Ozz҈'[{OP<'qqvp`&i&
{d ZaQVWO`L*I8L$P5t9(AF/Ԋ˫>2q'g\4I"0U@B U[&Omj23pp줭
A($
A/y9*@TDF8$y2!
@45\	|(0OV8ErH.Y&>n#J7
'm*TyWP$N
'<=,{<vџ$G"zgoBq	P	<		&+
a\x|,dc5w@qO5^_UX(;ow2TP5 {=f!DDL晏(Hs#Zv^W-<Gai|@qW2sϒ$XBS{3cY;f6CAh'^ZaKK%)lfd,xdIw	:+Y;u֮xXC\:<F<W@_knf"9z8ӱlNj	".Mb'P6pBӉh8SdԓkN*h>c<hbvK $k_*1C)\Ͽ'=d9 bKQƣՕ#Dj`*eqD!ê-p^$䷛37݋f4i BAWXeBFP{K^|'@TG[d#p2@x?P*C@B`19ci+{(gT&9A?Q,\eZ Hsu'I'Hs}4O]1kih|OB\QY
Ihi- mh|zߌCP-(b@2	4p	S@bZU5_V&qdԍ\:
S}k{(@XvjGWp_>*V	/[WVXT24Jr3R7[])ACȖO1DiAV?HK(ˆ
LA39+V!~eқIXH1@dNIT5>IohP+OU(Of'@Fn9*%_Iۊ]x|]M"@ۅ*T@UEO{'sN@3ﰍ2{>) Kj!U:xEΖ1$4#"-D텶'[W!G6if,i\c|(e?y+EϺeBay0n}[0j"|(H>>T[)doqKi	Ueu	Ah$OvY;Np.	wwO@T[,=1mSqV.h_?ˠuD܆ӀK&s@bnw`g%o^Q.Rw&]h)F,ݝSi[v@A>ܾޝOH
jc4Χ=u6|8>|{(2x&.Yiƕ'oOO¢-z{a7-0	g>WZz'r$Ό!@LΡ/Y1RSr1F1T(Zl`CXocT<|unncoI*u$(BBW~J.idQ`>3_d?7u"y1#@hRG je󂷰ur%?/<NªB	oi+,gn4oKC
Txue߫ 1%
yD N	Zę*@U(	~8{/RDC4M?-dǭkyNl#j2D
pr5AWS1/^~e&^4PˁXd
!vC+0Lk|W"_u3!v?kV7<77@5	׬o--=+l
o}[Ew!vD:M
y#f?Q^YqIENDB`PNG


IHDR@@iqtEXtSoftwareAdobe ImageReadyqe<IDATx[Yl\y}Nr*R()+T%$hR5p$m@ShSѠHh8ؒ-˲HW,N=qqI#]ps9߿~ΰpT
##Q'C'FGB!`Y<P)R||~qch}5=S,:}1!ޞ@؉>>(%i<$Gg._C31QE8}a@3]Z!G/([ޜI7t:)!b+wCš<A!˲t*)Λ|.+Za3<g&YhԹ*SOyG'05dI0nblSg'{:A<醶t{}ѕ5B7[0#Nbg_}Fw~QűO+j:u$eZ/K$S,G5g=;yjPM.ȦiI`kfL%j1d?@m
VrY@pHmz#\h!p,?e8ryxeVeM^D?|uˢDuyubXjQw$V@\\fu\*=Є	'P7yoxz$ӹ_ͷ/e2Su4k ;35H59w &0Y$ɦ$+}hѰLi&`vʵ[OL՛?,8[3^K/RALpVL`;6ai0?vD%M/]E
;Cu,,&3ق~y>˳5/c`AF}Ã=z/RRc%E381S]W	+2a'ȞȎ|?tlf8O+v|xqJANn,
{|(7hvn!ڔP_=H%")7w9'&~GO0vwԝnX$&L&*:pD4RR^++|l&ot3p<g6yMiK믺|u.	tS>onW.)I+nGI7tg;ɤX
J3j@Édi[WLtj,Mm`T_>@< sgZFּiɲ&vaY=Jӻ0E[P=3
p atahR+i!hz8ɔ6wV̰ϙP etҩ:
LAm(7ZZo
Z`'өĖ23x
qb,%˿?OF)g`!NգlcPovn#]y>	M˲9ÙGwР'_GN{/pw/}\fbV3.`^[kO;}
?}98"`@όvgO_|M
v]~Mg^I㊮[Ռ.`{Ԟ!⊲ڌpԘ_^YBX*oRiR{gִ()K͞-[斮<
tL/yu&Ȣ/dW7o,F.xSg>/B3Zo~x>$L[1Ea[.Ȼ㉭RRgM$I#+$5wfYIPac[KY\䍆7Ty($;̮`gg`m&遡CdjQo_zL^m[soh%pCparb485q\*pK7ܑ%%rC`ws;CT/viw_G7嵴Y>rXXoag붃ɱ|{yދ

uu܇};tWK@H|S'kDbw;	R{bi/h9			[58ǾOyudtk̩vR[;y5x`익KW>bɘ_ZKy<أIJ]KŖAĠ5NYGK)xRg#+Jgo.Ahn<ztBC88z Lv=Z|k˱݊]!4O(w% #S25'(.GAț$(`@!T\a ]ޓZ&4ŷdzv9t"&y r9$!&ˡ(^aX{X  k*EC.5#owgn.eYZrI{goVV#o>{S1~N.[3wȒ^1ubEgkmE[iЩu,!ڦ֬U;W+]:9"/r'T
ulQAB0Y2d8d7_֎W3s+Iм;}v@\Zu]+pt
#+dWaܶRߨŒ-aCswz@PcQyЎ(oHPLJ{Zomet մhGymZZ-M\eL!j/x^	!^r
.@4cMzitыW8ж8Zr/؞.g_b>gSj>c{i64UXN*0ڦLeY
v*~2X%KKNZz>4b.s Z+X4{{2fWz4ۧ2)zd;jF$O$3d*[Lt:CK=̉=lpujln
aar#}n䡪Ѐ1tFF~"uO`Ne=|Yf:dy#נrLĽhv/*H
8meaҭX4LT*`9[N>rMP rHCL[Lߚ}5]7#(D`؝(]eݩeUui]!k8xs$X[sPX3`<X*ܲ`ֺZlak%äA(dRfj5Hš0׼m
H|
`Wi.a`@%Q@@$"iU˴nWM8Z8u
qjuFŌ*yb*gA`BS-tu[.u\h^;`L]M{P@2,MY{ H9n}omj	5 Pܷm8P}5+ܰxЎL^}XYVQjlUdZ%
mwu'/\޺zz_S\h^u(pg;03ba@._J#F66T1puxMsD|ߘ_^oPYK;IE$x2pB<.l籴`U>eFߏj`7uIENDB`PNG


IHDRCCʸssRGBbKGD	pHYstIME

BIDATx}]w]y=g7d7	I@	-TB2#?8:qGh;/qtgv+RF֡`[(PK!l}~<g9`NnϮ=vrl@@2fA @ZGox_=av>k~#O|oݶmm@ @@RdB!RӺv?_/Oʏ`=o|?xv:=9m;f6l`1@$$hJA
dZ:,C_/Ü]??Ȼ?<z~qnҶ6c1afLAaX@"$D$
@%JRT":.W+ò#';_wo?v}n{ŵfͶl000f(`f$PI[,0HB2hDhռzo'vr؜sgggsrzbٶͶm1Y$0$$
HE(3c`Z̨LhC!k2-A†m\OmӓN'v{۶ن1L @	3iش-(0	F[jZP6B#!1@$$n}3>76mlf7Ͷf`̆1c4l`04b&	b&c03Lf$h
fv~h6۶̴̶0ff)3e[4ͬ$hf9suup8XkfONM
1[M,aDAl̑P)fL3f̘؀-AbbfiLG\/}~r//qzvaۛ5Ҍ	MH2C3$B4f&alA4&xw]gc>ݸ~nfsOE?ӿNNdPf@(&hF%`@cfc0FҌ&pS:tqptvv>->u<	DCc0c!FPQ6@A5&M6_򴫫Vryy[7᏾vCXH #BDPl`0ah0A4p8<zq!(Nc?G!e1،&MB@$E
 `2F3ML@ǣV)28+$ 1`` 
P`BhQmϼdX%>'g
`Fj JMfɘĄhƨ1Rl'xםw 3cϹx	)hAV83*3f
IRQKXłT`$cĠQY$5!vϿ_ëFRin{f[EˊZXJ(VPEe03DA4lf6֘f5߹]\ce?\xw۟]3Ê0#نǃCGی$4E+%Y (c>!#F`puXY^x5Ͽòlc3xt<<z~'ݼqj<z?m{Y:GǵWx\gzĭ];+5HeV$ɢ0-Wٻ}7~h˽0޾s߱7;]vpu!w=M'nSmܸ~nkg'&똿W7\7v`bP(!(3Li6J`mm667޼PPmSZf(*O޾۷ԒA
	C45G>j&B$2P!!I2`,5F10jIY6SXPTDR ɠ*0H+[O=:bT*TRR	# (6dfEm2Q
(I R䍷޶N0ʔ&вPVHRq=daXkv~h( Qj@+A$(8jPaֲm;fG4c ,I*ZV@Tmdǵܼ8uډJAR4$,"$ &,5
32+k-B"Z#=@EI֌)0Jh@Ő@&-H%(PL4$Kf!(Ĵ1Q6NQ-DD

2 
TA)
I(j08nzĭG.QJRQ	PBPB0
P@P!Q=#Q& äm^z-q}JIad"EH0T&NNNJx<Xhfl*YRAQI LAQ\><zx089vWW00*K*!$hk.<zl6⃷l/3V$$J@
T5jYͷsArgҫVy}}uIbBYj4{Oz7|K}ߟ:7ټ~~͏zޕkB(fQ؃ V`5hpnsڹ_5_)$dIaAT&w=|2,o?껿]]^?vI$ZR0NN;oA?c?z3Nή-
w8F	) %"@,\v/'pup+Py?Y]䶂h$HTǬ3;/.qz~S>Ս[~ڏ89=
h$
RրD45q<z퍷A\^^yrwr-ٴ01	M`#$Ypt<"*Vj1?g>:if8=:3?HEQY,+,IX(ZJBBttgqR*IQ;I%	nYJRT*EPITZJJ+3IV:ZUlx\eYHpt<dE)Z)JP*4C%ܼyÃ=M'(o߹n
*BدL%b6Vx.stz~afnj;|ǟZBj4D%J
P
o{}{G?!?Pnϼl5X	{-k%a-FVLѵ3w?|ٵ[W>c~cEI
RP"KX_|O/s;xÇ>m)?_z25Ȋ$)fKǞk*?N-;wzt8A#)
@AD0ZhP<Gn?cwv/O‹_qpڭN
($>Y0,q9ُݶ9ZNON=~s/ypytzgn~\+Ja 	 
Khb_06fo:w_GNoް۟3;EDRed:(̗**PkA
ƶv%0I4*&@Gk1ٟ^۟[ǃ5̦I+0Ē{`)Uf-kY4慗ko{1HjZ2m<ŗ^?O=i92"h1#7.dѶ335lZ0QLC10`\#ha"B2HH
q}?w~;;=W9ݎ?m/5Ch$ӦBZ0(S,"4) ؃(EbAnۼ;x랙X,lÇ~?ӋGlK>?:?
^^4i%k_/ڃN.RcHDI!-؄ ETZKeo^y߼kfR,FXs󁏺SN?jwvuwz)/y/fbkaɓu8JQID `3%J(qqyXZ*!Q
b8|?`qOFeprvw޹wiJFZnz$EJR [bJ%LT*5G
hh!yם^ضZ8N@jFedGC>JeE%iQ)RlXHt\VQeGŊRYV*AW8.ZnЗ=Or8.Y"T=Օb-Z(J(؀(EQU9BTJB6>ozh!زۖqfs,K3R֢ׯZKFe5BQ`3VB"
yޥ+J%QLIeח<s;wTyO|Y}qeEDlضn9ٱ!P*JdI6(EKkiJev;}79;;uzvjvv0fɩӓ={wݷoM;g_;;?:^+jY-J%)*$CZcT~S?+>N;7n\srrح[r<Os&^/kZ+{<x[o֝}ǝ;;=fvDkIDВ
R*)PHǏ9't۷\\[ǣ4>__E7{ƨv{u_>t8ƛoΝwk^zu/NO/;9;wzvlV(jha)ddRI*	0v'n?ᡷ˃/:_~^e'Wڝٶem^_~pbv޶NO3O{bfMadRCKHB}hY+3I(0'{*
,h-Ķۻݸ
2SHkdѨ$BbD5d1F0Fd-X	D(kPRIHQZH(ؓJ
hLYI1CE@PQ#@@ 	 R1Jh՘"1dZdXVHFBA!+)J(X@$bQBJ10c־ղ2@G`R0HAZcPH KFedb3Kb T`fnfb[o:~:.ni6$##ZHCj	P"QJ	(e4c7.N=~۶]>_{/Z"I,YRLR(qdJVIR%JQR)*B%`D00cfz;>O~٧v۬ݫ/?~~s߼ݶmٶ	#D!EDQ*e$QV!J$

QBXLیfTÇW^~?_s|?{ڕ~3/?߼ˇl@2*
P(*a$X,`" ?z_++?G'\֬gO}楧~?/31
bB@ P"@vgw?k_{~]zk#̜ᑵz,=)@3fk۶AqUx0IENDB`PNG


IHDRשPLTE8Q}8Q~:T;U<V<W>Z?[?[@]A^A_B_GaIdLfNiOeVo^ue}su
tRNS?@_oՅ7VIDAT(}0@ {ŎtC&љs
z;$C3p@H	Y:Sa1ap,ͯ,ki4]Elf#S3=$Y4觅w8<tϨ(
?t4_K,]:UfO|`ÁAOuGd(|pIENDB`PNG


IHDRשPLTE8Q}8Q~:T;U<V<W>Z?[?[@]A^A_B_GaIdLfNiOeVo^ue}suEtRNS?@_o6אIDAT(ϝ0@*V{(L96Lr2q1 Ds<='F5}_I8x0)W*8JK:4uSk̦EykhB"h(͡fd?l!Bʾ䴩!hLfjB3IENDB`PNG


IHDRw=IDATHǽ֋JPq77|WHK1ȼ"Di(yK.g_Q-,r.@䣟S9>F|FX"h<n"~[T] _œ q5s@%Ås\RB<ek  ϷJbQ_"^pJxiseZ{v/eT,b"!  o7w
J?B,l2fӟB(Q1 Bg0;ο*6|h
:LJs.Ir [|v]O_KDXlum=e
L;iU2gd%_e 
fvUK-?+*>k_IENDB`PNG


IHDRw=IDATHKK`YZ<nu+;youuV "x 
/B7elMi&OÃOxPxly;%	X|H=t:Nȧie.`TM	_&yB[ϹOv-teJGbx<gg?R{"3	_cpr/0-GlmrcKUF48GMO~ś7zǩ;?**\"Mo <LnZ7碉3_X`d3UCs]ǖ8_MI*tm
Cb9W&̮lGwZs^\y>Pku^ƥa*C*5Ss\^le<.T֝膅5]س|~%/i:u IENDB`PNG


IHDRw=IDATHKAp^NJt݂B*C]N("HRY~vuo;®L-Y^S`thZIR ZuЪNU/	1/Vu^/%3URpBנiK	b1/zXD9Y,@r
A&bwF,ۼsxY
yK%	ίBhF1[! IOX.4a#vX@6in/3(Z}4\}m&Op}/et{:R! h%ݻ.Αͽ3brKEMVBLqJ"En,
) 󆔃-c.l(wJ<P~[b)@&IENDB`PNG


IHDRw=rIDATHǽJ`.;vR2)KK(QɹLw׻6<}=3q:#X1jۉ$
qeGO<q(I%9GCu	Kѐ)Q)7w	bTBBtjtH..w<t߹}b*'$M#UXhu	mTB"G![bjP%n_I9l;F2@`41xFZ"XJ
7̨@*u
oKc=tḼ>'0V629yY71#fڧ?p͏33r^ JMHIENDB`PNG


IHDR5']	PLTEsxctRNS@FPIDATcEh`2hԀPIENDB`PNG


IHDR+>!PLTE8k
tRNS?@_o&IDATc`TMci6fШ\<kC*0Y 3f#ᩔ%IENDB`PNG


IHDR b]UIDAT(c?.̰yf $x"VpÇ1"SG$ԇ-K
Pb``cRpB0?j5eIENDB`PNG


IHDRf 
PIDATh101(9H'J^&0F`#0`#0F`0I63սRP{vIENDB`PNG


IHDR b]PIDAT(Sc?:͛7I(@l2lK.KŰ$ޤpB 0	E$55\H:IENDB`PNG


IHDR b]gAMAasRGB cHRMz&u0`:pQ<IDAT(ϭn@=\!pDI3L*DE
)
|6hX1J̌6"/A$Eh+TdYt~q	}Ptΰkl;$#CmnyNɧʎ:vh}}_edeB
9
9U4M
ptrx,q֙BIENDB`PNG


IHDRf oDIDAThI@-<Kg4ЀX|	BrTV'_7PdPpK(YdY)R(إ&lS
~^n|Q7酁ulB*6`PL(XD&#
)PG2gB̙PLɔLɔLd*L<#X.IENDB`PNG


IHDR b]gAMAasRGB cHRMz&u0`:pQ<IDAT(ϵK
0ῥNH
J}ᣐ8PMNLs#I”by$B '1LGCT㘈UPܸr: %u &>LIBN2ۏS[xҁm)ԅmi698qddI4q
r`IENDB`PNG


IHDR[HtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:22A502E48C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:22A502E38C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>3IDATxb?e
XH f.¶?<f>WchӰe3&4	1s	a$n@t͙P[7Bi5K2Y6j߼puJQO_|:SILBXu>##3/,Y9xsefa?_?0;sԨ{vfN?ЕLҿl5%Á⬪4UXX:f?0`@A,d/((PUJNiZ &y1-o>}d^4SCM!ȽJji&!j7C6@qVɎ"43L>C(۱Ed <l\Aא%iWd$gG7rN:aہ@pbl
('E/hjԲi@@.dʈIENDB`PNG


IHDR[HtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:22A272B38C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:22A272B28C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>eIDATxb?e
XH f¦goG3+r1K0qr	iX̲Eعg䓕QejL```a-h-/u۳zxxY8ظ	IKqȈ P4dfaUfddfF?3;~߿~ޙ$F---3]É ab
A70`*bc`eςٸ3|dBFAA!,&X
hl>Hp2,RŤpFjiMBJՆOCF&hUGⵈ("̨k]Ed <Ll\kb{d%gG9'nv(&L^F2<le?&GDsԲal@0ϞjIENDB`PNG


IHDR[HtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:22EB0FFF8C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:22EB0FFE8C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>&w {IDATxڼVkHTA޹ݻ݇eWW뗂ʟ=b&dQf䚈j>„,EBL~`VfDB[|dGglW*n3̝͙sA$)Wc
:SFi0hnbrss-n{`HdYV.盞v8tnt\I.lVk
"GGGf30}]566&q=9Fd"~P\FQQaĢ~*u#χ[w;S8K.]I	aR>Ɏ[{XmH]3%Q$\p8DbGwoeֆ|ָgFT0JPk|'E:Ɛ_]եXJh8@k]5M)	4%*it
s"󴻺ސ|eܲk$c2>$9YH8 u4z=:cGM+%jڕ~+(:3;/(-G5U6%YNeDM3ho;V"n5uW"ciF	{QN'7Z׮UQ8e9Jx?߷k{)LԲ:{eJ3J5OrQ~m%0쐛r`bEtU\X$*mkg7xA`ܑD$
g-Kj:OZZZ3444`Cq||=99\z
R֦pgl,pA}D/OxPx]7ln%$$<"D
ߩS"j~	0V|^Z5IENDB`PNG


IHDR[HtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:2312426D8C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:2312426C8C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>UIDATxڼV]HSa>;wv~K&MA5.$(+"n*B*BR","#Hd(kRj)j:[;?ja><|1keYbBB_!>X-˦RFC-l(RwYYYiˋzyufffP$ä>844ӭ+))1DVkLө)2Ő bqq:lچFe@Xaa!@#BgRIL&%)<
Բ/C]Z?CQ|=kF\/˙f54;?$;/s@LVu5`RDM~\澵8T9j"yQ%(~AQF`dpHb߿RwDf7M|y)Ӊw<V5V.;∦Wɂd83ĹOPR@:68<<ƺ4q232T2n,ɍ6]#A!",ii4:ϧNK^6yxm\;R7
D$5$2=WCTz񨥣
a=iH84q?M˙Kvb~q[
G)L#F|Ot[>.1^P{Ըyֺ@33Ȭ33U'feV
c	 ӺPN,2|{}VX	̲n@ 0v+faVph41)PF3,lGRQf###kaN`8Ѳ
x8`fm0+ X]644>'rrIlH4!'+wIENDB`PNG


IHDRdd̈gPLTEDtRNSIDATXQ DM8U74D'18OKbJNcbC<I,*b@ȕ+kEW,^•)1P!^%M;Er0e'^6{23cXR2 T Ѽ$7ؐd^h^7[9#G(peqdj
Aˁٙ߄Ę3*e,_dA~w!RBnEuŭ[uq+-˩cGAA#{/H!9!@*F-{苤HtMPQCUUzgv@*x4A\
Zd.ڹ9=y'i߰8hӭ8O4YTAC$
Y|A녵-s;N|H!0$Ն#_c\F`ENc/b?h*dIENDB`PNG


IHDRsO/
8iCCPPhotoshop ICC profile8˝wTSϽ7P^CS . E($@(!!#42*C"A	2((Yot͚޼8s$  V C y2bb~<؜la" S#[m

(?)s"lP92.qzX(OȘ,M0J"e*Y3rf2YʹGs$<#A2.re|Sk3xlP$y\Z$QD#%˾b1/O,Wp"fpL6,?/7'3Cٜ4gQeȚlohoϴQߔYz3%Wy&e%3̷_݇.Xdekq,
C3oYʷ=o^[.fLϔB6`yq_"(ٔ2\)`X'εLԆO`	k@Q-w߂Q@uFfoςK6?sWx#~?Kh@
h}`8g|"@,X
8 d`-(`jA8
:	p\W5p<R0	LCRt CX+AP,%CH@RAq,t	A;F`L`#
fp /,8.7Up=|nW[~O"!"tDa",	A$DBJJiA^"EƑw(b(g?*AeVP5CvTj5&5h't:E+m[aCc0XL*fӊ9a&X
bl1{{{;}#tp8_\N+Uppq#is|*~?MP&\TZBpH$aD>q
xx8H|GH^xtttL&qd1y3|V`UXPЮp]"^PCqbb1ūJx%#%/%*ZJw&6!eMʗG)XŇ¥QSQUEPQ4͘@KҾ&T(*TTTjUNH݈@Oӏoњ17gӜ9LjTKT[UoWcmUP{R7SSU߭~^}\(8q_4\_OsRK[OKUuNk\]UU]3
ÃΨb0&t5uu%tu"
ZYI't


Y);
{
6u7?4!dԛ4ŘLLw^3Rjͮ|]hGE&a63-A/⬶ZZ}Nn~`CY`She󻭙-Ƕ\\߹v}9|oywvv>;؋[hPV#q	wNNbN93ӜGo?v"ue&u麱ݞsxzzxi)lrZu.D<Mm[wNV'1`bÂzIkۂ.4\(XBB<
5
1V4& wuQ¢Eo"<##DDJ"+1V1+cĪc;qQq&,ޱx8.8%yK.-U_db;X":1:);]Ϟ\nNj*x#I.II.ےRR*S^T=Si!ifң[3pA'S;3/s@h.,JvdME%ٝbX(HKs\sjsFS-7[iHo+P+8+tXoj٪V[sh-amڟ
+
_^UUhhbbQ
lDmo4wSO%ܒ˥֥8eꛙIwollm
mڷ3l#aǥy{vvJvJ:
TIUYZYnjw[h)~/}~+c-J|<(8(=~ѡIn4?|;:[-Z魥Gɑg'~hcc-?PFm+iڗOttH;c;/8O螨=rTѩ'όM>;ԝ\̹=a=_{\G.O\rt2r+}v}m?o~j5k]N]w~7n^wߑ~<D?,yMnKOz=Yg/ٿ|.zJ~Z938j;zbwڳφOk?[DK˙^:zo2LOU{{]#ӹ>~L̿  cHRMz%u0`:o_F	pHYsjIDAT(c@D#@f!H"H-L

!h|k|"ӀDVy>Nь]
@N/$H2[Jj%)@QnIENDB`PNG


IHDR1_IDAT8c?	q2/;@J/"aFv
@UփnH$TS Nb(_
埄l 0#0	"d
sQ2!ˡ	hU]eŠ@#rD`XX݁"c=]壨6MG]P+L;TI'TIT;0bdpCemR1vqIENDB`PNG


IHDR1_]IDAT8˕J@@Al<36Za:7>Pԃ-lZmggCٝfgw
!N$FR"_Mx.2@92tHx:!-
PUj_*
H*Eb-pLLot;&2;G`{tþ޵H#Ie\<ϯή]?	G1fnx
RMד3tqA6QL]%-	dmu=i;yfPy`B:4G}'㊔ኜSv:[0Nc5E>ί@m(seO_F\_
hTIENDB`PNG


IHDR#"Յ`sRGBbKGD	pHYstIME:F/IDATXWS)3}KӤIv2Cg4IdL8[?$6I/"ƀYfBHBZ@ms	uӦO3W߽=9W>Վ
q(JJpet:.AGG߯Dkk+ܼy0>>ǃvė1V 	bb62)zG8@]fgڈR$`v^\.m#"I#N!!Nc)lmbe%
ykkY9c3nnt#mئfƴMH%p*ᰀqRlm[YCFMm.rkHD}$#H,R*= >fg{[
РViwb`c#P5ցq(JK^*APFjFFFnbj}i^5Yz&j4hA6,!53a/66'2sĻjhii,
v.\+WT*quLOנ?b~VEyN~VO,ePJDj%Ɔ__GK$$d$@
mhnn58!&>3F]7
Y"q<+F67``%*Vhkk,t6j5EQ`HE4f#jfl#Z8ێۨ3:ơ(V#\%("`d,Zdvရ3"kZi-]{mp8Qf@?t^(~rg+|],jQ,a07
H.0pҷ9ZgFBq.G9 F)I=ě,춎ˢ|V=D׌Wql^|?|
~MzT}5oK#b.%A8p58lE\bz%6H˪ 9
`h҉<3SuF<}E<~Q̭gDm:3P2eMf]=}[#ء=a8~b?~z`e?yJ14aoB]IƱTNA)U7Qwj
SZh`T6z፫֪e>/c+̊޹Naή!w$G%3q\:H.rEtbЮ#
)fn7?z
J8M#tAdNc!10iWϿV~~#C`)mQM'YV"`SڐZI%eD	ީjo|\.̭Sߐ<(Xsd}b{=#aa<uY7Yp7OC4XA%ØHR؏_ q6N>X'5!8;0P\9/nEd!ZEEsDN<s7_䒆hԜ3:rԅeTk.>8O`g&5nWr:cm/zHqD){Qq)z֩nR_Dn,Ղe\
hr8ܦ'FsP	n4є-(Hsٯ{]LB?UP8N}%Uh/24*0g2EcmՊgMbև}VY?(awUD%
`xɒ:cLh1GaPMeEC>).TsUg'yr+MOOݓ
~h>r벌fSj1Uد߻bR9IsQLbC6ÞZIfϦVd!.jUM\6H>.H8M]#_|*ηV},&qfL?)wU}ϟ© l͉!*5*GkUɊ^-4=6sSO$VPCurq[\czHqbգP~وw4ZJ?Hތf5264#SLb1EDFױ0IR@yyQ0%{1bց!syfc1ik=AL<HsnlHV-S0'SrzLBM_{ragCsHO܎DJD"ǞegX'eLn沓8ߛb20ˑ0Ťf&׎_[SINaٔ"eVˆ4⼍^^KvA"YCU4_<tYs/ӕ6L\!]4
)Qo-=Rg(G`vNG¢i"Ke(N8m0)R~=KiL
5q$
Q=%7{ȯ`ZGkJM3U{uC׎rϐw0\5d\t9#Dj%Ƅ'<GH,:6A`>->Gj^]w,H闤e<&ujKJBY٬f=avs;q(Ne0NbLN=rwh-墙"a,->""=ĹNd_jc%NSԓ~\o|[/sg>c}4ƺIENDB`PNG


IHDRaIDAT8eMhU9μyhZOEh
"JXAPAY(ԅZ1b@w`u禭%T]Hhxkɛ9x/P˽}{Nl/x)M$D$ếGV{ݢ, " )f
n
f8	3^)wt</v"`\6392+Sb,[f#!i"!cy{Ljz jΎm{nCS/N~ֵ	v߲3nͷP5TFg-YqLyp͘j@m}75V42n7
:X68wx5+K(nFY~::IY4ezA\XU98~U?1k0kJ݀3*3[xѧG繉gmoպ
t.ۯ>C͘_8#@$eddD
a,h؁P5z4WĬM"9
w'9~5Vvl,/>Y!X+isē,O/heܔ$	Hi  /,.odw~QbEhm ;HDby->/6`TU%*i&I<,5s1ͼtIENDB`PNG


IHDR[HtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:AD8E439CA30A11DFADD0C38A2D2A53BD" xmpMM:InstanceID="xmp.iid:AD8BA704A30A11DFADD0C38A2D2A53BD" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:018011740720681192B0AD457941F74E" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>_+IDATxb?e#2i@d5er6l< &+jm+7o
ą3re֭<8xh_Iϵyjvn6f1SȪ[s	-񏑑L~|a<<kb&EIYr-bfϯ|GN]Kv0JZs
xsabbtgdb/ҪVdY&b
d<ÿ00H+'V.>o>-{v׃;!
>v܋Th,	  }c!ȃ?2E96Sp2=@B),DoFuyP0=0/bdd#dA@aK
|
B-c@@d0P2pzg/7U13,Hyeh`Բg@^IENDB`PNG


IHDR[HtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:ADF094D7A30A11DFADD0C38A2D2A53BD" xmpMM:InstanceID="xmp.iid:ADF094D6A30A11DFADD0C38A2D2A53BD" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:018011740720681192B0AD457941F74E" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>IDATxڼV_HSa߽z7LA%
(˕KEȗ0|A{(ԂlB
$YQ
ZXJ˨Ӗn~_mU=ws~{q0:`1ZIs!644:::srr
K)|
3e]kkk#3`7L>6f=qѨojjje`0`z}H
㸯%g;6Dϋ-ȱH%C5Co6Y2tʵg#œO}ݘmP\"9`	CW}DRm^Y2Jێiil?|U8nwbfHZèPjҳħ-v?)a;V?~zɔU,OdB$%tg/
ϔ:QPL@p(mؽ}E`{G&=rQN ذz&fɓ}^,9{p"tQ tvMm[
)a'sa]9V#rxVhZ}[EIŬWQw$sĬ")Ĵx.zJK?8FM#vْD![Eš,)]xi,Z!@J`
AmH"v)0EѶV3pPEm-A<V1h*ɵ~m0pm1)`vK&?F`	9===Ux!^PPP𭨨@7t#0~]"bd	S_4pf
p\)V+okkkuOAA!|O5
<B/YqpIENDB`PNG


IHDR[HtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:AE2691D1A30A11DFADD0C38A2D2A53BD" xmpMM:InstanceID="xmp.iid:AE2691D0A30A11DFADD0C38A2D2A53BD" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:018011740720681192B0AD457941F74E" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>bT_{IDATxڼVMLAlk]Zު!^)$&A6ŋH<h%HM5PNk4R9P(-4By+ۦ.͛y|<$IqPR?K
f|oaY2	@Gx<vmllm6E?SER)a~~h(:b\oo!gXx(VJ+͒Ғ&iغCMMMiÑ1L"MydHlr\V`uRUUUaa{*d H2AfjUX	˲@&,iQF=/ZbA_f/>n-;l--郞!h##{)9+r&@˞'C7hńJ
bXX ZW׶N߼o&]1A?sc`KZ
f0=[?cFiH$/!6+/A
WpTaF>0@/D2Zl",Kb`w/LӑKa.1\c}%xFc~nF\1By(eW$Ϟ|?~
C`Kì/AlgzbU4bwm|dZ!mD')}]%|䁩3P;FqOˇ_q(l̔lyV6']겕dUe.-&lZrVptZ-Dカ_6;66I${mL&I8q'&&H$RkrWDoAx|
CEQZUElޏP*e>Z
aCѾIENDB`PNG


IHDR  szzIDATX嗿U?JHnF~ 	jBc&Xal-0ZXPielW!j\&,,sŽwf„—{oޛ{?ν̌}/aMEQ3yoރYjXp,\S)홳]ksML8nzc^V2k``fhP3\,:vE^[7<LoG^85XB#fKLR#>G<udY.Rn0afap08UP
3wa?0	|@#EE^8aĄ8ݺͻ|+xWsHQS֯{soPPDJ^y~/{̍,"Uq#~Z114g`2@8D
Qc,ޝGDjLQM-fYuΚs5PSv@U9wOLY:1P
iPURՕͬ?b!U}~JQLΓm0V L
%aU16UЪ
ܾnrvYgm/
Z.vNhͦ!}z1P+y|"q46Psr%	u7S4DɊ {Rr9CwqY&l.5z=|$RQ[G)ʕfy+偁4{
q
AmZmH)r4>+W}u$HSnsd}왤,?f#@;IhJRuJD4h-6 "<>+y\Uj
Z5=6h̿AWB6kՀjt`
Yr[ybaW:p.?^$AOKFgT:voED95%Sѿ|O`ukٯʾ=[h.^m|‘BN(qÄةƎpv΅3"BFq'LuS2	R\'&TO_9Qs\cLӆ,mUj2g#J
E#~UojՋZZ_2V_DOR"Ux|=\1	3PQS")hYH?HO#0y4n<b	<xO+>?_;[̏mstqi
I)
?;>һ|䭗>|Ю߀i[Vy8mۀ=-sU=6e)IENDB`PNG


IHDR  szzsRGBbKGD	pHYstIME
TZV6IDATXݗo\W?7o~;x&qq-JH
$6,XB7X@,X@BBjA	Wܦ8cϯ=x8̪Gj4ygT/2,_p-שw.l~f:Ξ27no_ß&|^{WGW_gfz,ݹVV1\<-K|*$8$&F]w\^UzD`!Iu΁*@L~jʴo2iSRJ@nY>p:2]'RLOlnh۠02R$ͰQb{{8/>5Ϝ\Y^!>)k9iַZĝ|.K&!Ek-b%Cq$IH9TWo\hIV@fJ@1ϓϗIc9μBicoZtXD	
XcֲKY$0T	VHsNg'ic:YS"O/`]_U9|w?a#ˤ&.35\e֫<xPǏPc=S;w[;ܿ!<&\(0sB'8e"kcaF<-cR`ɗ`?YRNa+
6Ħrٗ @/&Gӌmn݀jR*cbƅ3Gy̵w˩)a*xP"MS<<kfqNLCXo8LSņ-fK$mrd/eG<#~<*W@R^o\ϐԳ A֐R06>dHNHMz!M71?ogɣm>h"B`t:1cTIdϨBN#<k/IM}@;:VZO
_Fo0ZY`$Sd|́*k	5޽@_AX2LwWX]e.F$t{=;nj]D$x
" -lj
Vc:cٻqc>_>?py23'-$;`
rQȥȧ6.y
@1ZGc\7xR\*P)':P@D"j]o
h0Nw?Hdv|t0
^~b4"eˈwp"s[X]`:ԺqN#q){SgkvH
;K
;ΗoaB=cP07Hl7/V v#?;OnRc	e@k!,?9?,x<ѵ\
F̡ܫj[nx''1	@1}u<2jA"	I1FOZ{Op3dJM6}vWtoIsK_LW,.kW#~{2A#kw\&34`^fIENDB`PNG


IHDR  szz'IDATXŗ[]UvnSf14j+O7%VL414!>H4		JZQ)
H#xC
9g>sN{SWueeUR%Bk-@iKE(䌤t"y™?80n/v{NK:1c5#0
I4H۪;n4,MB_6;Kocm&6c,hBTѤDRH Ԡ0CkX{'pzv{]3=:.y05
cL)b#>ۮ"	5Ƶ6u5༟>lPY{00Ak6ڷ#Z"JY7
8:a]cj*`Flrƚ$%bY: IH̠,tF5fPCH$(UUU;*i8 ]*5}L8oo#]yfDm+_$疇|/TecWẾVT	I*b.$V%,q5ss3$z$l
׿gC'0`2=MEQI)#(Ǟx%ُ2;aB+u 8DmºָOD:lr|GnNvؚMUa9~4{eO7";:AN>Gal^ TQAE){Vnܽm٤QB
{Xdz/ _ǩlfh$cE0w^Qeue0&=}k߿xp.&m`!S,*HR$FRwձH "\BB:2*P!tַǤDdژ!'bHUpUum`6hNcb}B-ir<X]9[;UbnpM}s}+w;r`]y_
ќ.\AUI)gVn5"oovg;#{Iجx5RZ"CG_7AzL<u(.%Є1#kԖ,?cQ?UgΊcOMP4*RD;%=_R`5O>GJ~<6t01U['3AŌp
bguXNSUľ5Eyq91Gueu١U6`C~!$*?GBgߞņU~c@4"sIG\%\tZ/,2t,5].(Q}Aue}I~S٧D8
]V>
):|wַ4®lvLd1H*˛\(aqX=0+Tc,15Ōz]Sj.΢?RW_)!UQʊT&RD-684AB*UCUKb,^IUq$ÝҸM3.
cL6SL}_7wK{_E<o+IENDB`PNG


IHDR  szzIDATX]]W{qϹ8I;MCd&
MMT5)j>h_
jA$*EXBV¤Ŷ62ɐ6L{k=Nfطxaۨ*Wgʿ ~{q(QւVѡj1/y_=\<z4}!V$	92:C"u`"nޢ[v:6YOs8X*" (.&HgdV\LJMzcފϜ'K3I
 VZDH((q@:0/Ξv23}-߾NVߥᥪ߉6LYk.6k-N_q
}oy"UEE@"A"4TEEU٣*(e#?}
0>eCR]e٥*Z+mD]a7PV9[kT}9{܇19W\am`#s $!RHp-j3oI\:Q0^bKT@UMRj=U]^DHom	1QņTY	`Yꆌ\	@y=xuSt%)2ԅFX^]k&{_T։LT݋zyA9"SP:SrAM.E~%~8n~~Mfݯejj'ʍ3#ljmKC&ǟgOٹS#5#Ԏ]HYtPЧ_D02>>Aw_Έ
»_mBwnUE>óS='",rC
?	s/̾=xMP,~~{OUV|}:8;P(=x}ws>.3s\clBܚF)j!\u_iIN]୅5~ğu6%c|'Qk\JlPEK1$%n]q3`l2L{_!PU7(Rs t=6
kAcykL_kwlORnFUY^Y
/:k
%B,k5NoEg
.nRñDY—@KpQpDLx
E-|/Qu(EZ"R6Y
*_}.o]Ы!RFlڐ*.2!CD1`ENYƞ	WCeQ|$81`#PŚxCQc%
F5墂-
Nfcca09׈pf3xf@7肊̉	4?^mC>>&IENDB`PNG


IHDR  szzIDATX]]U{{e3-c!L:XL(T#F$
4!
}iP%&C(Q1`P(PJCHIә{9g>;;&}${gZ{o\rK WFQ0n
Jk-@*:?@Q5Ns+:O3ڹ[$/Y6R8T`!@U?VUTq2/6&뇏e Y662:Jc'2*CD*C!H)Q޲=|X4KI,%zR*	~wv#"<w?AbMTPoֲm^_% [QF7TT{fq8r.^YZ'Z3ơY`Z1<༧ӕU\}|?\@wi2 "/@/N^맡**Z,.eL)myD>nۡ;eCY8WV|#*BՊj8Gw"
ӓ;qmWbE͛ZD)F3"^UimWyPna;qm;p{,/~@##HF06ƫPˀ
[6I Tu{<	S,֧b:_T4	\@WxtwEJ࿩ZSK=z⫛
*33Sƕek1UX;^?{ӧNgg
zf3O>&TkG&!̀ta"~tE.t#?5v#x5[,ۨ/"cm$q+Xʿ[p:tP,'ET}lf7m߿qX*aƛ˯2;ïcczeQfٹcpQ^x%~gqqw볟^53(oG'16&jaNz+WgO=['xwn>~ffFQ:Nm"lBw7@Tν?fQyd9FA806$SLT{_$B_Uz3W)|`l	y d56CѪ1U<|
&yY
>u*x	TW_{v"TqJUXDQcyW{y{h
A nl H{|@^Ok#i	@-Hˉ`TP,A ưQ&X(ac$n`l
b֕Uckpҕ_F	\-6LeH 4>}D1`ENYTؼ1;pem)Eނc-jT&ZUxb՚bLjrQ!,'C<xq;cSzkk?ӧ V_m;
mZ@?:6]$֤m[xIENDB`PNG


IHDRJLsBIT|d	pHYs~iIDATHDž_]UkϹ܎NTJiT"4jM}0iH4H"⟇&71 b#h5Ƃ0jhi3:iig;asfM>w߽]k}[?OOΞ8@{`mZN=0>_o}zGx]}e9
e+
D62yo]C0S4'O+pkg-1шj0*+BYBE(!/(Ç"xB(P2C4/w*XQ1
1+}$}TUhcKD'Sal(<1jK6,	$P$:ѶC$l){wsp;X^Y_oX^Ye4ST%&s{>xжn,PUz%}#WDviʏ:cK1*J]7L5ӺgF Arٵs!	_f03wr5)i,K,I6aqa{n׆qG8.[33>pu4#1B)2Cs8fa,Ϣ^|Y]!Y\Bnsu[A˟^9͉_Gxi}0{o7oφ6{ԓĦpSr $}?^_eraz"|?ώ|刚P)cOdjLQ]}܀jrzq¡>#Dz<cRQƈOt)#ʪ10dk}ͩSgWI&q&uiSU4HF0j,OߗQ3g92j/)WT$u2]%	HX[8Ldu[P E6j 
EpSv}h/-
x%
_1.1sj7%A5EU05bvE$b\=??sԽ0qĨY{J-zm*Q綷Ͳ6(9&q5f7S49+He~bԾ_XO;wz:)=1tFjCR`c<y3~d
/]bZT7#27Ԗ,!Ck,t?/LaRRH@yIw?34,PlWLH'DC?EUwC;pXD
k,6`%q@!R -
1Fh4Rd=/}U5*cMS?H.(΃8?+(J(sEE~H'wRكskl֫u6#TGxa[=qCJ %2IENDB`PNG


IHDR  szzIDATXMUUܯ^
Gd%RAD
QA#"

T(%iX"ȂO}{Z
>_nA=}^_:FU*_Wݹ6˲|mޯւU6sS±~Su{ٝn7uiZX0fP#!@U4W=*@Oio>z`׉dYMOYCo2dTk,hB!#C&H.v/ 0
^DNsLƄj]{*1Q+`-ˋ3/WpVe8"u !G$ݛȊu\e(Iv@(u.`a:6+Qٱŷת$KZ8!_Wf<-*ʗʥ9._$H ZxG)Z`$@ș$ٿ}N]5Ҽ"(&UHU	ך㎕ިlދK{>דs8V.>+d HP;X0`y8hVtm
j[6=['B5pb<MCɯQE{).|*8.We|0X1nL.*R2a]rTiB՜ 9U;^4VD|ԱßVz3	Y:@\@@24Q||X2deՍ|Cq9!EPDpEPD %̕:afu&9Ȋ]o}y˗8|胊IQ76P-\ED/06rC- Iܙy&~F4l5{
P>}6(hV	ZV08s!h(
0ʅxs>laȆ)SluΑ\؍UXM,
o1UBqW~yZ)J2ez^iU7X: Go!IJx6NB_ME+Xc-`Qຩ@	 $Ϸ+}pE0ƂUPQR3U=[;QY.>s#xv
ypcP;+z\]G
Eekw=;lp(*m`ZW
0WeqXz8IENDB`PNG


IHDR  szzIDATXOEU3ݛdwBDrQ	$x	x$Db "!
zH1"F?$BBċM&3]yٙ!jz{.\ˏyk4}1I;$Yc(WEq
88+}OG^;<490a-V뫼(ENeX0qV*꽊*dkgv@E1rrb ISPm!
 K=͋|]8Q+-K@D	K8cKXk_N,	%I'24Tn]{=[<Q7	_ΗS9cLq905RV1( x<Cp4F(2vo]GD$u
bU/YG[ Y{.icCq}_te8g#:ZuԊcVK2TB.uqcl,R
*?~Q`eHKDJEN]F,רK;	ul훌:$sDH*V3P+cRa]H|3`*
*z]ta	ZDZwpicJMZA"@`^wu3tu<履Ys|89N!mMҚƸ6
 Te#A	W/yQUٹN>GYCb$7*oc]JҚĺQ%;\&˧&fH+jDn
&XMr\Q\Z97Ʀ4ǥE},h𓺛F@@4F$3!QTk5Ƃ1`L%YQ.V{MhuksM7]R
m4*
	X/WvW5fĦb
̀E2CܤEk_hxсо	riCVAȐ-_tF?`;Ҁoݾ20(:PseOK_"cz1luo{~{D(_lbL~$mvaE
:1g~xe2$Ui4+8ߏ?z^ϑM[ޘ_{SC/$ֵؚ;ijt;|7+p,1t3Xw
?I|@IENDB`PNG


IHDR  szzIDATXOheMdDEGa{QD^DATǢERMA7QAWZQmlC=4mS#fI6zͬ;%M;7yQUn2&H^ANwN瓳PgJɈ7CO~;t׺LK!,8.xn>p7^əC~~TAgi@F]\,P0Gu_
ә,ԗKJ&3岠
\6sa&
+UaK=/Z(reN:_}hMy?ܺඝjҴ2goMa(CBOpz^1Hzˊi\8bQwpcφʠP~G!y-W<ٰ"J4[(a.Ky婯+1q<r~Pڋk)ePflH{G
`&ץ(bE\[	S P0f>tMOdO/Mz5a,VODJ,.X
|-}UN7|&vBK, aiֳ~ô@?lo瓾jpEs;*2W|0ws/va4ijH$GT*؛f~QڰiC&̟w?oi5VjO>~kV$ƦW-}FҊfdže'GwI)wu^TjMl%*kRw}q;R˟R"ziiNxf
EI/L|`9!:!d-rl^ׁRCn9*,VIENDB`PNG


IHDR  szzIDATXŗm.lMl,i*bMJFHTB1~6MCKC6XBMSӦ
	kMTPXv]wy~8s/mO2sg1J2pWu3Lxw_$K%0(~FavYk6zmPPUTT59%n;ίO010g솆MbBST<UМ""8eHN2li%?VUɦbqbKDqB00zTgR,K18anZ'{'R.4>|xٜ9s.GbM4c	*wqY8%ri۾O(M3!a9*ȃ*UΥ8pYs8'8qK	}#+.`5Ssa&hi	Xkb!hU~G24!G+ôs= 'dfjbv?ȞrXah^[粘4%M*L,tN&^>ny﹍]9/:{&&Ԍ_TAT<å1iR!pMgǷ}r+*}~Rs#7\?it7W^cbcIEq 2\&d4M8L	QyBO
B1`QcP0k/U@U|1qҘ,7OJ%iȜC>?/2'&Dj1
P/KZ4o)YQMX`.˗.fw'8QDU3YjY1.b'")N2:l۰Im{\VݳP<
)N53sj+^(A(L1{a|끭z(Y#~Z_O"Hp_/ac8dΡ@9zn"W~*ϜO`,my'ǬGh=l\r
& IRG*tcl4}x'9zc
bT"O"J=P:~Aڲr4HS2:sm_`xx6(`l1!E|0[XCX2~	1/n{7oƐfB7Ϗb-	}}|04ءڽ6ZVo+-TilԀ
0A&j)~ER+}!](O8soY{IÑ4`l5^X/bAUՄJǻ.aP2}څ*ب0X'(S71&`"} .,l'Ncoφr,
=Xo$D<9rR:4MaB8y47c!FT4U<x`6:ˤSFN
W	b/~!E>5
ڊoVCe飁RQ` 'f
]4w?OVguu#Q!ݿrπ55/%_NҜ3763b5}FOw?s7rbDKswze	T@*}% >zY?3u`IENDB`PNG


IHDRw=tEXtSoftwareAdobe ImageReadyqe<NIDATxڄpT~o6i†HdU"22h'}R-*t:F*tTg8
!LHb{{~2S|w=s>]wѷ9@g C#7JƔT++}9SVqTZXt!iN2,<n.;qKO@g?H*>{,ow'1֩_]JoH)5*7zG	ߵinÁ0xYK,bmLEE(޼l!QUd#1Xf?]/Q˭65/}Z.n8tmDCu+׮t|Yz4 ݂,o*9LTǨEZ6
u?B-g<xW-84?Ъ#QBQamt?>h%%+6bH#jK+UHqW4WzK]:
թPFվnMI?-Oj4ct0|C%L;tnoߣ()`HpjQIu@ˈLBgq8ЛD 6T]6f|>oA9KM[	g?5A4
ƴp8yg\|i|Zo{B1B=Q%ELQEfV&5Cw\JBDHWɛSD4@?GWI	>iKK5RߣpU枙ԫ`ҋ>EmoCyyINȊn/.%x^b/JLdOBbOMmMWMYQX>+\ඉ@uڞ8%|):Vϵq8R'q-`sȨC˙/L[N-6fPuxvxfylAlOF	2_ )ȤV?R+b<zC2%
 Z/\7M;~Ү9=пKta '$5+dDqeХ8\+*%%9:!4ȂbG{3з.K,ZjLV[$Nq(#	n\FKR8m3	!͛ԓHCa!(
yFž|pޙܫoeaBeEFbLbRZn"1Czcs3udYB
~;N{ax}/ӴLbjT]V/ްEnIB$)YGϰynZuja3W_B﷓gwм%=	KzgYrG{-	֬ZgT2xWOa=ǐ-aǞ!B>\Bμx>+N턣#'d#}4A(&Sl_}5><@f)ĩl3YfCx#<2
#NĨJKyuϛ;2<oY?O{MEnBU,EqbΞ*ƎLuԁlF7zo~.zrWyN 
=9cIHqh/;o@؎gb-SFجڙy7VD"q\	0f~IENDB`PNG


IHDRf0'PLTEprpzxz^
+p]IDATchq3 La9Xs>,~H1,9d+Ԝ9
Ags@lsL/ahuuquq5HuIENDB`PNG


IHDRB tEXtSoftwareAdobe ImageReadyqe<IDATxڌT=hAfv.
`DEllAlMNLiaiaRQwfofgwgp{{FP8q;Dw^~@0"T<ҋ@V>sEՊe䐑CepDvIkcxx2ܔ=DlHheH*#H)P`O1x*vVG#hL
HbL=||rGI+T+2V[a
>++lI.{	90&O%	J
.h8)yk!Na	YPX|u骦D*Y1Q@D$Uec%QRPJ^Djq\PrhIe2atg913^H2%ZowsDe9j3i׹a~+⾂gA䥣S$Բ(&zY(	d,YB>E:ѥ8/^Ӟux1KkYr86菸AeĽ(%Of> c;M8
udM)r|O6VoU+b)Z%~9"GnYͺf
0(hx퟼ORo{
W1\TLGkhQQ_ȧ=0gMmL=lylu'w}36-=rA.7c1/Ua`wm3IENDB`PNG


IHDRrP6tEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:22C20C628C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:22C20C618C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>aIDATxb?5]4b
 @| EoFaP~@eZ@.b(@J\eFz@I݀E
@؄4|.R@Yabj)r~@cI()L 7|@JghaHxȘz@tE S3mMIENDB`PNG


IHDRatEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh" xmpMM:InstanceID="xmp.iid:AA6F28B3AC7411DF88ACBD34F4CB8A6E" xmpMM:DocumentID="xmp.did:AA6F28B4AC7411DF88ACBD34F4CB8A6E"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:AA6F28B1AC7411DF88ACBD34F4CB8A6E" stRef:documentID="xmp.did:AA6F28B2AC7411DF88ACBD34F4CB8A6E"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>FRSIDATxdS=kA=>6iUPJLBR*Ex *%X%U*@
{VVFLvvfsg6Ν{=cԅGKEm,4"Jl!+"+*&~?kgP4@8:jy,?kڢ{蟙걻3$DjĘzĝշ-)Wi*W1EQR`6B΁rw
я<YhɞmP9=D:?LDdjҢb	$t.ES;B{4,fIBKr1Eucv]\hJ(;"H{C "i8H[s[pj_~	5S[B2t֟N"߿^C=zx?h'OY"G U\)܅8\BfHm}2^)LmoS礨GXF.V)z<NW>Wc;5Qu)UJP:]BYstu>ݺ.\vΕUUa<zꌤ oAYvt:;'C*IENDB`PNG


IHDRkitEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:8920A4AE935811DFB228EB5DAFCC8503" xmpMM:InstanceID="xmp.iid:8920A4AD935811DFB228EB5DAFCC8503" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FB7F1174072068118E63DAE80B1FBC06" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>7IDATxb?W}߿T;IENDB`PNG


IHDR	xFtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:22B05AF68C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:22B05AF58C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>IDATxb?!Sd*ّ@(Z[gGg	
벱em"==ӧϟ~ׯ_`o8$qY'(",hRĄ"	L  Il
`&L!ͤQE[ /k}9|&1)h7#Cgff&vlу?=~&bm:l|Lr胇OC;Sk6> b9 AV`y[Ԥ]IENDB`PNG


IHDR P,gAMAa4IDATHα
 ?%
Bbdo|s'PkN>EEIENDB`PNG


IHDRDgAMAa/IDAT[c8x&3@X.D,dHbgΊIENDB`PNG


IHDR	xFtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:22B3EC678C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:22B3EC668C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>P3IDATxb?!hm&?}+Q~~g.vٳ@
W߿ şg]nML蘅7,+G@(f	db	231p*WQ&*@߿߁̿xMzń˔߿|^j\ )rK'N?@έc`%E96{;3~g'y5_|y݀f ~;lB?q+d_IENDB`PNG


IHDR"#8<rIDATHK͖oWƽkD?ϛ.ꦭUդmFJv7;6af`>=ƶE#%QF왹~w9w"WaX8X?>aѕYf.86.N)2Gɟ_!0-K z
j5k԰0dF?¿xqFgXwb8v"Ԙj٠"fFM^Z5ϺxeN֣ɟSdr,2WT-稢eY7PVa=|__)8 t6JN&4:&2FQv.ZJפ)/%	i)Ky)qiA 0qH-f ITu:wҞJ1!_XY})k2!+73y vbF&ضIXFGG_̴׊"p|/eC9+愳rY9!䁴&)>˱{.@mS-!d'DFW=3S)}`@tb>zV#7;;# 8r{|[	,ؘ7LI	J\M=
Csfd3HK<Q4'w.g鼣VRD,Iv!%'
_H"DKAH2585bw6gDz~drKFG1vl>e+|kk-L?DݪS	8|~pX@}.2 =kU|C87#
/)B&NHSR4g<Ta2K 2D??e,=;e4ou'P
T.knM<w.3zиmCc]O>ki9ɍ.:l
<~%=zBi0j%YWs^+\I۾.$-O;,E8idbIJjIzqMM:_ýiy*HD&0y MO޳(AG{FDͧ4 tg#Wcw,zOB,D/GhG1IENDB`PNG


IHDR!tEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:1DD7AAF18EC611DFA694E44B27E7A82A" xmpMM:InstanceID="xmp.iid:1DD7AAF08EC611DFA694E44B27E7A82A" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FA7F11740720681188C6F7ADE30FB7DE" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>Z[IDATxbq|?`,񟁁	faa)0c`Jǔbd$56o~0f2,IiIENDB`PNG


IHDRqutEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:1DD7AAED8EC611DFA694E44B27E7A82A" xmpMM:InstanceID="xmp.iid:1DD7AAEC8EC611DFA694E44B27E7A82A" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FA7F11740720681188C6F7ADE30FB7DE" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>p3"YIDATxb?S[g VbFǁZR64$Y@*J<>p1?+H	ؘ? 013@X!,Jla
E⵳#"}?}*f	r#:@i0IS!e0`IENDB`PNG


IHDRqutEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:1DDB0D7A8EC611DFA694E44B27E7A82A" xmpMM:InstanceID="xmp.iid:1DDB0D798EC611DFA694E44B27E7A82A" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FA7F11740720681188C6F7ADE30FB7DE" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>|2IDATxbt|}e2?$r/G>\{s3@,LK?𝍍P?f1!`
â*YY)t+BY#	~4J&ןo$y_P l^(sEpIENDB`PNG


IHDRd<PLTEVtRNS
AIDATcgGe{IENDB`PNG


IHDRr> cHRMz%u0`:o_FPLTE			:ptRNSKF	pHYsIDATc`F)\X,FIENDB`PNG


IHDRNPLTEâtttzzznnnRRRVVV>>>@@@///888###(((Fa.Mv~xTCtRNS
 !#&'''''((((()))**+++++,,--...///00011111122223щuiIDAT(}g@"Ł[O(A.ܓ6=崬![XN	fћyVdG蹮դH#}f|0`X6߬	x/#X*!JGCX#fH/ Kf^F$lʯc!B-57Dy;7ie3XIENDB`PNG


IHDRNPLTE			(((,,,///222999AAAOOOWWWXXXmmmqqqGc%Fp/FtRNS	
"$&(+-/2345689::;;;;;<<<===>>?@@@ABBBBCCDDDEEEEEEEȇYIDAT(}g@(*sނORAK|?5ͥE@:Z z>0n/32UªDuvErv#.B"< u
65D<^E(tE'襁(G:,OV9D^"ґĮ(V[*cKQ<)IENDB`PNG


IHDRHIDAT8c?=1ÀX@w O"~g8EpdeS	h!PVoPRv||*[hKBjQBCQR>|@- d-AB>hCMKEYzT0 _6P, ^O,ԑUO>ѱ':0ZIENDB`PNG


IHDRHIDAT8˵}N@K H%
VAk[$oMӥ]y;3u?8Pf`V`m<d	v.@4'{GՔ@Zr[&e1z~||>@)*Lќ5P"n)3_˷.%F&A)[
ҝw+{iwQa
]PcCX]Vn$2٪вuyM	7	*[ޥ	Kt؇SZT-bL!{'œQ4[IP:ъTyx5HTnΩӤ5O#K=IPe9c/9$Yǵ$at@b,>'pMJ-hWfq~@qvIENDB`PNG


IHDRaIIDAT8]h.͵IJqi۹k
ek'·Q0c>/D* SdBg;خM?MژrM#w'\Hzkl%0GwW.^>)XW,f/ǏZ82 2R0Te9s=;5;KN.usy<l'
8KlȲ6D|L3o
qv=˭d7P.zR)p*>HnE\Hx^q;T[x;ٌ<Ov##춰i餇MOcw5kax/n>NsZ1Ai0BKܟ"'SJթ=2
Ǧh)5bET
rpg/(W&A|uFjՇ+-nAV%ѶO8˿_cA-1˫ y*]ڄ=
2N\rL6
uK!u?AG<Qrhf3ꢦ隴.{;UkY=gi5Ӗ4	MX[+ZuC|^v-Baäm^{A```mYV^W\-M#ß_;V_CFv/hJ3`@c5l>FRophw??$NG[ކXu,lkթG+Zo:p$XC,ʻLzMylCGFcCTOG4reR:?M`hāL=
?{q-DIENDB`JFIFC




C		

"	
}!1AQa"q2#BR$3br	
%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz	
w!1AQaq"2B	#3Rbr
$4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz?O}}J)_UNjdnmr-ק?Jy?.\[mbU(XRWUEE-Z]kR8K3`(N:Q
ȸ'H]CVR28?$ծ&Cgm28#5|+KRJ]B6n 8+۷9$%to?nFn=ǞIm#l ֬O$.G&WcZz~֮1~Z!+j
%DYpI$#޴'uDm[QrT1Q^]ɤ+hZO\ީGvcV6[;F݀	N28Z.T:^DF,\{!ۀޤϧBM;?w_j<jnxjoEšqsǰ5'e60J*n~Ԁ|ty}o[F}	|+&7m#k<eR隼'i\iƤd	@w_jiPp^0}<XCjC`nSl`q	=0{sU5ͭxW]I^ۅ*FX}x<J
2v2rKW:ZZ)k"?_j7?_j`GQTP?MX^uV0p$&q78dYTOs:#3r?ɮΊy*)-?bI4<<w{c<⊳EsqQHľ#ݖ{oZ.aEΤmTo0'=1.\]3Zo7Y3;W~	AպG&[¬+?z,2݆q
x"vfnc&7Pp0U^i?շ}8KߩgK7#[m͟+s3U5oJy@7")cvyF#<W:KM~’/%R%m\Ȯ%MͲ>[kG#]RëxYt=<viS'zq_%G{MxR.qWWksiq;?(C7@mlwZ`FJтR]Sn#@="ݗa9SXr6x_2Q=3GԼ+[JKG9JLF%ux񦢘TЬလ4[yq֪GOwWDq!>^3k
w'uOPE>m=L$nrL#qT21'8[O|HT?2G(<֏1o;A^2sQyהocմBͤҮ7 +6Wpw#ե}ZߎT>
IXƹtg.#A2byD~Ҝ2"LW8#<z{');Jߏ/=pj-v
cS]s>f	y}|wq
x:8)8M>F6@'#S62ʻ āЎdjwzy*AmOC( ji9 \`U;juZm;72n /|cQVFr0 (1pd%rTq=xW^1?}:N:>g:py0ZKi$a:sN7	"MI@8PABc'#뚹j^!=SHKT
ޤ?whA+"m_qį)?*W1aϦ{y-i0F#=^{50ٿF/n
"Mlt91*\l˴QEAAEPEP>>]ϗBеk.y[u!=kjsi@P֧gNx+'_ɖŏ[wOK-B0m.pS&8BIT^4~5
x]ߝ>\H[8!t;;<b
q>ʴFܤM}QbQ^!_w*y;A{24[#;w18' b>şZ~.'yU6)Qa~n`^ez)RJ;(>(+)3/CN~{t͡ܥr0Ǯ@_^'5/Cwn!hhg8`ĞM⋟HRS',Tsp*Bה$̞b#Rim}CKto/yزA `>s
|+V4	VecucϬ;RVk^xRÍ>mAnDn	,n:qۊ_$Kk7	< ]*[FF`qhcscJT?))8"qXζ>/<ĻWwQ?*$үhZn2[!%#e.xUzNoքD2mR)l~5$FN:tD49815N,RIcI>`s)RmMvZ}ێ0^8p#˸syߟj~OC4}};^`=i4~>~sӹq]/~Rx_ѡm5A.x`7*#w]l%\d(SxPJSQbĒx~l8NVJWWfN^\ee껛WhzȥVenmá]N(ð((+oŷ2%P{W_ѹvk'vhW^ڲk&[31ɢhn/ŵv vGuoUZ_o-V׼"4Rwnff<.3kĶ吇V\9
5]oC]Qrx횧mFU#U	w|n\,{H?xlU$hU1E|ZI3UqwN[uiyqu<?
3M*Yi(F-$
}+|#V>tv{+8$	yr(݀2OgNE7xZF#t?b>`'#n	-)l
r!-NX`n!sV3Yii#hVu&gh~4-*=;淧Y@D[Y۬Hqp>^3]S]-EmD`H{l{}V|8`.n98]{Ǜ;A`eI@!YPaIɻ&iQG%Yzt
%arDr(wSuY$.Ό<+t|萒t<{W
x>𦗥i]_l4̶lЪ]}qZ(eB>(hvV:ԙl8·ΨYy
eer Ԯ%]AA#]F^](R`v8JLNgY7l㵖+q%¬SJk32puy~p ͶKr+ SsiuO]3j1h$2"7}2Hvմ4"Z۽նMz}6=xpqa0ҲƪYIϧi>:$M, c8[&fΕidp="@BF
:T1sC_K摮څʻ;kp;r?1XzUT|꺔n,Y0NJORj6c=ۙ%{B#[CNJ:1RiO2)U!կ9-W1\APȚtA`vAתh	¸6?7?]GLC*4le<:q\o'J#n(((+ׇnO}%RHq}xגfxVl15Xl2PNFH;~
_u٥6l2عoODm֞y\-p@
$ҽ24X*('䝬5/׾$he&9s׫XًYYnB3'<oU9*-:;5IC5߉xYO
K	@GʜgO'4.ӵ=1RVmBF2B%ylxIh֚IѮLKFSMoGM\`n{9ϧ,)$o&Kgъ_x\+FxrrUN?1os-n/52>ud'3Y^ܾ;qF+]0iB_`n	o㚖24̰I$
vw:mȨ[bW\A򷇮ù 3kz/Zs=X4)#"N)'s1Iﵛh'jZ"b	BrTGzg]:q}goslz}8=tO{_2MBf"N(^O[BnI4Hc^KMM:Mn@翡WopV$"1y^m8=+nF$]SA,vy=9kO`~?UQO;-2
eQa 'qȨ<opEIox@l0Fǡ9^鯸F+l3s_CF,k$A9<p}
B7Xr/[ЮD
3O\VIl<qe^kAL4^3fPǩqֺ*Z(
(
(כ^m+ŗ(-"<eAm9zMp~(ur]=|maUKYa|H\`5O/4L[Wq۝ɥ-e$d8]jmGV?wFXvؑhXq=kqm)$A&x9jUY+/D$lJm}^_.
3HR\"gs;B-_n+h&۩ȭC3/gKgW-%__L>O5v]ȧ^A#qѧ]{{{/Lhbr`r1ԑxxSy[YRJ>Ŷ$ej
B8դA}I!s.y.2sMOgꗖk-ɏZH3>#'=*+!YWf+,K-ˀ F*ŦiWVikpF ?ւ3,{}MK>"4og|OMKM8ܪhpNNzV
x>{a,b{`Z̪j*.5zz^әrƊK=VQf[k
bbVyw\goXl|\(=H5iN];ەA$8hA"ڠ${
tߌO4}RD)qlYAPeSӡdx={q;2GoR;|,!ik=|bV{[3ĶQ+ĺʀ!7yzS0/.w>m|ǯ@}jăzb&y6#>41J6*~;`RY]_g;]Alpp3v[`]Φƾ wjB1B$IZ[E$42h(H8yGhO4wz@	d:n#Ze= oߓs@{2IF)}e%wz6qoQ$k;p9_ʨm<{{yJ7(=gӴx9gյ-,VNs<Zx+PdAƊȡYnJ˺NF	8n0jM7_-լuv)*2*:Ե˟k+MnFD=+"EQEQEQwx0tͰ?ך\֯u]Jk/,f7C݌}:مsn]Q,|7c%ν`NJړ*[`roA"LtO
n/
A,qj7a~9z

0GQV"{;vydu wyԷuQ*{.seq9=rz^%fI22#/G%w]KhO)Aܦ#$O'k)sO,[wx~x&[k/L)w=f䝼&4yA}N[''g9'▵ͪnX\]a d	y1^[RHNҥY!\sLUD3Mz[fW'Z5Ή,Eo+*|zT6~үvg{ &K0q;_ȣh"uhq<~<-[K<-IWLrJ6;9nu$T^+𖫭Yj:r$ʋ
[H^	1#^( ~s@
HzgŭgU8FV{f&8hWd=+--P/<[s62Or{,5kMBjfxkr-8#'IZPBPz_˺G7yKdǕI!ghdq횭b.,`i*hFvjrPǒ޼{b|)mf-%6۝Ա۾s{PHA3_{Wqey>$H%Sͪpwc89lNhj!Zü)tc(jP]oUy0cКk$7u* y+nܶT>stXk:<I;'86M=A
o~"M`~ʷv)juh4nWo͞bPhIV̡G,$
t4@)h(((
y_soxÖڛ<@T|#iǧQkjӹy F=YWeC776$DCwtS{5vZV᛫\<:pElb#P?KYԔe&଻>WƚƭcAԵx-aմ{}>hK5|`g=vר(ZjWԾLe|=q"->`kԚXEB;rw'?>5v>vLnf\2!A|.*sŷ^kFQW+%VxQIiV[RҘt9&K
 +Ɨ+6JO\,sq"s
T6֋2\7ϸ-ׂG)qRpS"LGirI֝ޗݱΛk
tk	Tf	Bn;/K,7Լ")|=s:p1CW!-%"ưvυYz$oD5{w-m}Zմd:oiUc+ǤK=H+gþ!v<vw[HS=sרȩtn܀P6}:Ջ[/c-x8a m&9ZteYS=Z|ux}FoK)DcgSgpTmhx:(^	V-lGpC1J_ޣ)UKƬ	Am-G?m	A,p$2fl(szۯ3ek02GJ>nYp|[-RmZFICXNisƶId@Ps8 C]7/v?8+nHΞƬymB=-JH=RP#1;x/};gif !#g?1"bcu`9s×r/K~}L[	׿dsKdJtɢA9eii0aRF́tB?֒xێ{s|>;y\Z$Go7S8dy|KjQp
y$C 7zDY>j[KpTat"kZ~,Z_[]IH&W+Wh(((((Vֳ$2\Ev"!۷v3r=ϩ$i[|BI:\#dmdwy9ES+Y+E"iٚ6/1'90Oio.Z"[[Y,TyX\xQE\)wG>ED"[[NYyqQ[jByX=:*RIY=YM;TUvu-?-pe
N=s׌TZ'Ci`5[[."A1(L:d&ǧZ!};`Q(EvTqRm#Oë&:o&@O3E'hE41NjdQge4gRV0J:&GO)x[EA$E!	8Ctۉgmf;F|2y(
(
(?ىPNG


IHDRaIIDAT8]h.͵IJqi۹k
ek'·Q0c>/D* SdBg;خM?MژrM#w'\Hzkl%0GwW.^>)XW,f/ǏZ82 2R0Te9s=;5;KN.usy<l'
8KlȲ6D|L3o
qv=˭d7P.zR)p*>HnE\Hx^q;T[x;ٌ<Ov##춰i餇MOcw5kax/n>NsZ1Ai0BKܟ"'SJթ=2
Ǧh)5bET
rpg/(W&A|uFjՇ+-nAV%ѶO8˿_cA-1˫ y*]ڄ=
2N\rL6
uK!u?AG<Qrhf3ꢦ隴.{;UkY=gi5Ӗ4	MX[+ZuC|^v-Baäm^{A```mYV^W\-M#ß_;V_CFv/hJ3`@c5l>FRophw??$NG[ކXu,lkթG+Zo:p$XC,ʻLzMylCGFcCTOG4reR:?M`hāL=
?{q-DIENDB`JFIFC




C		

"	
}!1AQa"q2#BR$3br	
%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz	
w!1AQaq"2B	#3Rbr
$4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz?S((wM_-~e`nPvXtB'pF܀@>3ku|v4ԄڃNQYPS{
6F>Fz[ۓwqjRL<9gܭjǏ%qp5ߎ:$sjb{XnXcиm0>l
r|-h"ծ?|JuKn4'ڑ5ݼ~ɑb2DNXh!N[>!7i6.4rv?h/-ԶM\[’J!&FEFTgfENԵ$ąt!|83֔+8܆Vv_3n&cms!L5L̰3e?GA^s}^}gz<
6YPd9616	 `u_ß/i$e.`eE%OҜ+r[+2((((((ZCҀ<ž&H."_9pmy#Ɗ#$
ETQE'EuO՞HPkմBŷ\O驻9[7
㬞xaiXK<>P:OAXmoFV7dyᘧ-&"^*47
N
X#baX=Tm<@`:zzB+)I55jԻmoxM:Q_GRs3UuXb?@m8(9IFWB2%"9b>ʏt_xw_U;ĚV1SWy$`:g9~%
-v<,gI2<6	ٽ@9'ᖅ?]>@IR㍬	qڵ,Jr]Ug
tɿ=PL#FP(9 ]CD%XS^o߄^?ugwQ,7DTsҹ'
#.,tA윋{+	8rKnTvRyr(n2X2(R@OLWiUP[iڒ\YM-gkcyi˵Tm$T>&-
~ʾImE(y <gA@&]rHA#R3F@ầ>Xw+c:|OlAF n
nM&
Oqy:++eB={1n^ӳ̮f^YM\!'|q<xUfOkRū#'W@cD<
Ġ	W4i^їJѡdQNC;oFcp;VQE-!@'FI??QG$tmEPETQE,HKH`_kqCM8Ms#Yє\ޯ%-xcHGUlzgNƳFC1p2繭aq%P$L
pd׊n4y4냷º4bIYp]p7duZFYY.imkR8
E1Ҽbh>_nte.]V?S1#Skn-a)ߙ#?7Z:_KonDwQ$w6UL**mcJ-<24jn>a5zo>"
."21'~\
XUaY~Z4[jIi-N냶EmI9]ǃ-&i<,%fb@vMּWKs}ٛ`vZJ@D]_kkֺ@M$E@2px#kJkWk]˞#qd^+!9'iWJ-<T&77
I:(_ dVe'T5lx{'4^cȥ k?Zn|iw<0L|Tu^QO
x{adFhY.w")KbѮ~(d116s0]cfxֺQd-)*Q2=*J(((=(#'Cj(#$
h
(0W5wvEMS;(r*QN_zTI~¯txkipΟcXbwczѽNmC$LȈ9%=M|_o~f5mo[kuH]A#rpqdVuqUzRsk{-{,KI*$w:rֶe`C
}k
@>kio˩y^!@HtJ^m
;Q:Iz`0E(ba]{XܧI,]uc?>_Ѿ="Z9pqCXnѾ%ubTFmrpI]%
8˳Vܷ9UmI=l _
Lf4Ԧ)̃v`=Xj?VG9Kx##2zTzzňxZLf_+BxA=qX|ξ5OM3]/FdkXJbS{`z/Y/G\w.-cCmPٻ,wt7PFx2P~r@sր=R;GԖ𵆍X%2-D#"F99jšlfQI
sQ8z
+/*nN[x%?+;m<uo,[ZX†;geW=	Q@!KHzPGOOR|Fa	,6n*@(?OWԬp*$?_R?OZ;|_)ADՠD|yHO@xSs<0o(^gYVkۅaL4R0X{q݆C-ʹS|ׄuoEmCL#nhC2|ˁn@KPIRXGVC>$̰^
]ӕGm7{/yjq,y'\Y&a9C0Ê?o▩k/t-g|MCt]`[ ЌNj,<mko=V-Qd0fYR91Q(|zxb3oqȁO;w=ks'`>/nnY|-.ꮭUSUa׼koGs9*r_WFF['C}$I7Z'Lо$2F|``y[Mk“,JasYqc\x٭6`u`m`}잔mH3pn\ Veʝ*pX9XF> gRU&+)ܸmdM>e7I
S>^6746<F\Gf0aG0nş˲4br18إQ8tEag<EfYng"FbY6bH	R[I,Qkr$%Z)B)߉cGGkeY^Qq.8B0$-)psn~pI8469o"hnd}K.“m6^*mO0ǯôd-;k7-uwRl2ʩNKIog喚fk̬[r3	:oQԢ>F)P<ǎ>?>Zjn'zF8u^9\ry
b:aҖ)Rxo[HS y2q2EMFI??QTE QEB'jR2+Wzx)纸)Eȅ&,a0/S98>,kmJż6J8R3C6m8hfO\qk|OgŸt]F2Tg$xm}#z{#wdF:x>è3ʞ>(nHCǪZRH*Ѐњ%B[>ɆScJ)ɫ4
pWyVӱ¢.I5?>KVҕJGsA5.m ~Tī[e9lGFHdR~֢ٵdzM*bG)UMԥ7e&tEm\8֏q}Rk{}(Dd:?x8?ԏ1KEQEQE&)h
(
(
CҖ#$
?6m*@(sٰYbHcZۥL^=3űw+m56oS\_>&-I|o.L0;Gx8<WLiI{OSǿR1M圏
B{dll
c꿵G$:xoB(^'	XQ5;+F-]VGRGθ#3R߲1xff1܀ztCf?<޿Wh&U<]ig$Qy }.Ȫ?0<G*j1s?
>ᏈntMZ(u"my"ct%@`Fk=WF;.anT2(?1%we:Rq
]xHLʡH?tFA' ko4w:~\Hۀp2rzW\xKLQ1g(U09WSFFH;
ђI$V<OV<;勿MgOkZZvrM(C?)PXizVnVClLp9)o'/J	9p1Sl>,׼=nvmPz{WU:|_8[Hq}t.evXQv4Cok-ϋn`0"f)cΔ
֟M,S$[O~^گܗӢa+@ASќn<wXZUo
?.dC}I|6u;>ŖP\FervA]-G|Kkbt2"ɐ>Ϧ*o\]]bI4{1UBH"G%{8[\4$d`Ar\{RqRV1#|~|!xDO2Y+${ 㚂kf<c_2BqVOfᇀn<4n$}A}id&,da$X!}Ӓ[bG]'-uM./4!<sVs5RIƋ@ym,׀=t8:r֡ET)JZCҀ<O?62Iڊ=((Y4~VU#i6|=EaxU&H%eX8#,;ևk,C36"7J09*M$'SӢͥӎr'Oih%>e75;*RvU#U?m$|çZH41Bĺor,hQںXݢ1`UR'm(umh_(dd2z(dxWCP-gKHh̓@|r(0I+V/Vډt;K2d>leBsӀgu9.o#($^=bdXgOzFbӵu6e#Z 7037%_j7hZ~{{*ð['G|]MFY'$Ab,# -	f'u(FGEe{5vw[d(m1,+<W<%8D;o?T5l|A%*Ḏ>8AbR}Q3y~/)PN`g<pH'k92h#7.Ha1NH'zl.y{O=2x1h*2}[Y4'J`|Ed9<݁t&qJ)-?V8:eX
Hk&ppA y40̇eة@oN+֧?V9>%gorWf1 Nzz(*Mԗ3KQEnd_j:4\L2w1}誸ETQEBFeBIf@g?( /)Əhh6?.&Ud28ǧZ6c(h@J\
(bEQEQEQEQEQERQ@K(?ىPNG


IHDR?.IDAT8c?3P F
5l԰kUK
gwmn6IENDB`PNG


IHDR?IDAT8c````b
 vb_2+T?M
P9n@J1QRl5J1a'(ȆB@qc\zaaR7l..f>upaA
k#VN)F6,R37(Ű	+5(1*-h9
5
s0jIENDB`PNG


IHDR?IDAT8c````b dN~9  szb9PWC]61ٰkbdNP
ۅi0pVc8¥n\\ |PD)F6RlX.f(oQayVjPbUr(,Ϻʼn3IENDB`PNG


IHDR?IDAT8˭1
@FWx !EHp"`!\.i!fy@\
*/J|`ޡ^
^]l"6
DɜaO"4$DOلu9C bwMg"\=tyК%IENDB`PNG


IHDRaIIDAT8]h.͵IJqi۹k
ek'·Q0c>/D* SdBg;خM?MژrM#w'\Hzkl%0GwW.^>)XW,f/ǏZ82 2R0Te9s=;5;KN.usy<l'
8KlȲ6D|L3o
qv=˭d7P.zR)p*>HnE\Hx^q;T[x;ٌ<Ov##춰i餇MOcw5kax/n>NsZ1Ai0BKܟ"'SJթ=2
Ǧh)5bET
rpg/(W&A|uFjՇ+-nAV%ѶO8˿_cA-1˫ y*]ڄ=
2N\rL6
uK!u?AG<Qrhf3ꢦ隴.{;UkY=gi5Ӗ4	MX[+ZuC|^v-Baäm^{A```mYV^W\-M#ß_;V_CFv/hJ3`@c5l>FRophw??$NG[ކXu,lkթG+Zo:p$XC,ʻLzMylCGFcCTOG4reR:?M`hāL=
?{q-DIENDB`JFIFC




C		

"	
}!1AQa"q2#BR$3br	
%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz	
w!1AQaq"2B	#3Rbr
$4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz?g<;g)KK{{Xn}}VG|˅ Ȥp~=-ߖ՚-[ui\1庝A*U:炮|
^ )$m<^A$Z[❯.!xb	/4&O`b3NOǗD~]{o]???~0M#."5Ot`-w:F3>"
ʠbVD|!r9pp;1|pxeac[h$Z#l1j~P8,@zo5MZEu!˕AsǯZS o!IO0, \ͩYɱe$2r0zqޜC(ǽ)2,l	5LZ̠(Z(
(
)2=ih(((n,o5ˈeb\h^H6񢱾#'Cj*>3o )quTIg`2p>w<
㏉uγOĖ >ΖvNNVNr0?z-_K]+@PFZüHAqE"
ſ5S/׷{F4}էX*7Tïhow}ZLo^q<{_rT8^ۜMTd{Gtn
!W
\2^|͓*XGIInP*OUUhߌCh_Y\j֋V4%eOk{&:DDJj4躬<5n#,cO-M|TaJ1U0dWӳr՝_/~7>\LʰS>jx:$Q"}ʨ
 9 rpgE?Tg#
xGw>5Hl*[r?:ׁ[e(n=ՄtQۋ,fTifhE#P!aI<bFONߧR^
st$qNH|_> /<=sl.#9$T *F\5/!<ikY, i@,n0	:{e\>uAFKfk-\,A7Yuֵ;};UFo~5j(Vdzw]t9>VgZ>
Zp ``{4iڵʹʒTTᱹ+;^Q;Sy`a~njR|"Bs''wSSeTHEB|ZA^WvX\.y漉/Ӷ%xPam_ᦛxȪˆgc"A9ۼmncR]IgŤ1*3!@F23zSmbD<ul#0]rqڳ\^Isy$yyKAV7R0'N'GimgԑQҁW$01(_Wq}"=([mvC~Ӗ~hƥ?3;p`zҧr9vRi$}tߣ`%%{U_Z_G׼C+C.rf8潨kmaX-%K\O"hpK5CQ\ZETHzRd|GOOUzV4;{M6wbOn+#*:n'<יZS[xzm^Fx ڬsszV wQf׮mXfue]fʍ
Ѐ8^8·*>ݾiYভgT
<ZeM)}Y4dž;x]u85kB
T@:0r+ÃǞZ[kB6gWwO;nl_߉.D 鶈NsN(J2_-`5uo
/= (AAҼO[oEaVhB?I9h?^ۧҞkY&[I$ |19tҩvhݞ+]q9v#9uҋ=NFȅUך*:_OIp3Ǧ\W%:I,j,!
~pf#]6
[-,LPJ뜞⴩[sBnYjgV|Mg4-/Z(1bAb7^rkӭ`6;ʨR־uۻt#WH\A|Nʌy qz0Kj_z3pH@#*~U./!V.̱p@:󽶹jjqI5鰜|q101ZK_vN䝷U,zq/͟Ix៉5mE[dcI27$78'zUi~xI$u%%Q t h%NI9դi;;g@*y?hA+$ԃ#">+˖wk]w"t,.m+NX.eK]h9Zx|㛔U\#kW_^2M֓~dnJ[Ppx)OKϪHήF.sJ\z~xzLjY4thNl@#7y8ھM9Z|Qfм0hŜw.%ၑU^e妷4~
ԍG2Td-6>m^ZTe
V<v;tQ*8̏pi/AR20@#~Լ;jVBn$d(@Wk?<A+SՋXIFӡ<s@
.nXG$vVڍI&	Z5(''oaʻ-|uWc=/]}U5>ݬ<T&NkE9jڍET)JZCҀ<O?6QrY(s倇!w7NsEP
P6qo%1Y0e3##lB*]
-	koOϾk2fz|MFmkTpAኲ  f괒3S]31c.!hYP@ۢ$5"4"eۻ;bAV#;z5k6S$18<G\RM.\.۬m$O^W3Wឥx_LVo!xHysU)J]A!F㌓T8EnRI&(~zynu
@y%"I>3MLו-]X19^Z1o$@J'5'T7s#Jaa1%_|;gq\pQo5*Ei`6P[:XZvUL<+#T?aƫwO)ox^o'$"cn0T{ע1[{{3/j/
k|:̷L3tJG pZ_r)SR\~?JpY
I' ]AR<9e(hߗmҖ&7kGo_=_j̕%_qV۵^!7CnLVWF+RcS{TIdoxd
;Ln8ފxJT)W4ߡxxٕ_u>-pcd?=IƱ[>K	&Yq[Fa.eڵy,
EȒ+y<< l#z4j&ui"x&6}{W,傰b8>x\Ρ|iyN]nWmdT]C\c!GKf^!5ƶw)$X@?sY1XC_1pGsH$FGS]_|]FQRVu#qx@*y#5aEƞ'U\/u`Cx9tRrQEH!KHzPGOOQFI??QTo%oE<>3#q'ů6ϣIĞNTA p8$|E)oͫ$,˱'%XM $-bCpG͞3ثJ>34s?h;MK#[X9:32W/?Ǐڢ%rbBq}Vd_F:uz~,QjSJٶnn>`mR@8دע~?<Es^%JwVm(Y%ɲ5`0r9_D?~_+B߂|9U{}.+4&G	#RDCH9ۄ*UTO˳DVG}H}ow-ѲFI qC7_innLBnY#Z2I.D56Fw ǙIJt"J|KXX[6ZHI*s$5Տ$uicΛnP̭kFFqڭ(?mc'(mCWΛ:]n=G=+A>YGOopw_vb񏌾 |
-+XcՖ{BKdoa;8_Skc1;H%7j#CcnI1zƅ{3ڶqK{sxd+qwq-.UxdSamqcךT>T5CKҭt;P-ic[F5U@PA$j~"@o%ގ,Ip wo2c73V?ذ*vM}+'voz}-7!K4c٩?\:kdIakw88%Z^d7v+:Q=+LhUyw)^o-I|s7_|`- ܽ5]:yIn-mQ["Q[m+@Ӳ$1+g?\^:%yuw=ԗ&"wU8&ž
RNҭAPƲwa·%Aۜ{WkN1&Ug*_C,<VPP'p柑rsS @ӒA 
^$	՛M)]e׻~"yVw_tNNi[W>ݞlЮ35d):\xV[M8XSS[ӽucrVߡ"bEh-!@'FI??QG$tmEPxE/#ukHn6e27ޢ':,iCA0)"T9 G
Q>
 ]^˦. [kw0w<p7B?iK-#CYZB3Bkq]5#8]
)ҝG}D;I=+	6<i݃3؁OƵ9UTh#2k48y`մdzqQ[0Y~V#F24\@BD"W2N1iG?:k~n70;K)cdUqqmMn{jb3_K}d%4՚Ҵًݹsq]XK^4⛶<f"8:-TU]/m@GBJ@s‹w.oU̹.X'ps'=k-9퐁!*?{^ڶmujRXȟ"F<XI)FW-,KB5i\Zikm<-9"CW{1j@U@a_!
-eA⤔ި4ϛ¿~O6L>Kˊ컛lT;aU@$VE|9M6q4e؞.s^3)<}~~?>6%5X,ca'ȶxx5xuB+maNRnpI-ݮĨ2qjyo`n	?;N2N8='OE;M$bX`O~ھIVEojڥaC>H<>y5$$}]XI]!S^ڼ>sK*5,}BgFm%aF,3WwQ^FcrN
AzuH>IRu[Iȏ]vLG+6s}}lNOj!vI"5eesJ|E=6Wt!y'rsw#{fmQx^ziomg"D>xY89<zk{{ֺnc>OL1^;WJ%a]s_~X"%Z8I1JfpN3@5xWZG x4

y8I&FGŨuΘǗ,:|g9B{vڋ_]?<ScissX7Un)kN4Z=J^pX2۳u&4ǧ}32J*Җ8/W\{T*'ފ.hp<=WFe
-adg,Ԝ<3jo.~'x(9Efc5&oƥ+Ɔ	z@U#9?_vۉfT8:Q)Bi'.%qC"c.nBn8\_ѿ>
طӾ>B+[I!I Z?4yMO&ptC628B7%i$ór2H`ZkJU {][ٟç4?|I
ş<WþX-/7	`rq޽7?i>Nǧق(8Fr8n;JZЩGOK.UӯNTū5|~ź=\".W(>=n>ōn	!k
U˴7 Uf͌<bH>þ7W4+hr#naҏ5[4y\ܤgτ5ybn%\p@]q:H?a+kEL_F/|6,ԃVqUc@TA\#Gdr,v|?moSXTBMF ;q9?`
-0/^/}Q6UԞUm,~UQ!\*~2Anc7m;q9m7Zh^[ZluTQkm<kq?YӤyC	db7cԓ|a`h[}?L`q}{:{ٴ;^k)v4)F*rLWA
XĀyt鏧:2pRGMkA $}~|O:ޠ<O{Qj#
0mI8:KX-aX!RHD98a(MTM&Yqv̈́r
4o<ӏ6YWr:tuӼ)*.!VIm5$ɐvR
^}]))kYB	#EjG?:D:6ޟq4X	
ʑG#{()GT}\tRie]I؈p!<fM;Z%t888e0Eo'ÿDSBU!DZZW}6{65;x:qqj)R]n>
(=(롢(uoIDVUW`>i
F2Ԑ9YtD{DLcz5j-{&h&pB#/Vzqhv@(I–2I8rjvoڷs67mbgk̀^^qOg=2|.G!}8
8Gcu	;w섓ytȭ
xF^vv?/osӱzXllJSYE?Tǥ p}5[<okGFn<E[v5Y,"ai,
C*O}r<;QWwo~
isq]FK	ێ<F:X^h6XJԛ^/OuK/)!ײ1|Ɍ>1xö_Xܫo:H299⾿_Ɲe=,H\kN{hzS^c <z7]gE/cXc/ 3@co~˿	803?3^ǧ<qeVmR0n)qq^o. Q\Pn~><o/ٯ?~~7ٛgYiR;醣c˩#hЬby>cAzyo*ȭjΤ(Cy<7ҽ࿁
.	+K/\4o49܎}+N5mP+6> ?Wefjk('y7/gw.§c}'=b;FJar=G=k|ij_3a;_cPkMBSaV"7q3GV~TUXYDr	Yg	y}5
j=w$ꭎWEt5#ńqrIUd1֗t)tX@ѥ%zu?RzCs+߽崗2Lј}(`O+rܷ3LMQf콌oqխJPj2w_8KOn]/<'ho9-bGүzMpPH1hǧ֟ډ.mUb}I\mGjC	 q;貜yv#Wp?kfHgOC$/9&Ǟhau
T8`RB!' WHc3cS1RhԎGqM;-OLOdo;`]FסTsvx$kɼUY$R)A'twQEfHzR\E}]
TsAr(<4Q@f?f?œ6u5`r ~Q@EEJ`2
AhE:Ԍxk`
((iěx'$'uokQ@E
@#EE O*lInY8`mFqm3_"Lqd*f(Z(
(
CҊ(롢(ىPNG


IHDR!tEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:1DDB0D828EC611DFA694E44B27E7A82A" xmpMM:InstanceID="xmp.iid:1DDB0D818EC611DFA694E44B27E7A82A" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FA7F11740720681188C6F7ADE30FB7DE" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>#@jQIDATxbt簘`y.?0?ጿj"-߿C3a0ITg|IENDB`PNG


IHDRqutEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:1DDB0D7E8EC611DFA694E44B27E7A82A" xmpMM:InstanceID="xmp.iid:1DDB0D7D8EC611DFA694E44B27E7A82A" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FA7F11740720681188C6F7ADE30FB7DE" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>vIDATxb?|G[g VbFyVV))Ҋ\ ALL	Vvw=	e/߿Pdo$?l1?XUJʴcU2O>1$`$Ӣ_a?ff 46Au:9'IENDB`PNG


IHDRqutEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:1DDE33BB8EC611DFA694E44B27E7A82A" xmpMM:InstanceID="xmp.iid:1DDE33BA8EC611DFA694E44B27E7A82A" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FA7F11740720681188C6F7ADE30FB7DE" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>fHIDATxbt簘3*H朝c	$oegX>0|gL_ bS%L*d¦h3q	%V%_{|Q s
?6`ln0J[{IENDB`PNG


IHDRrP6tEXtSoftwareAdobe ImageReadyqe<IDATxb`8[ @|cG@ 74
 ~ϥ 8:\S`U$`QU	I
D4}]8zI61Tab
@Ko
{MGg {	)ݽf,09pdÁi`$@_bh6AA7$]aI>@K~ޤj1x@:0	dIENDB`PNG


IHDRrP6tEXtSoftwareAdobe ImageReadyqe<IDATxb`87{="@c@ L@_RA+8:\΄bh-ân)$Ӊh0;-`qPX
Glbi>(&5(b49S>hГ$%/R.PBrrU&UK)R|}9IENDB`PNG


IHDRrP6tEXtSoftwareAdobe ImageReadyqe<IDATxT
0N܀8#l@@7
:nP&Ʌw~}m3ƌY'p[Nt\o~*\ysG?=5€A)$̈vAczaubkŋĎR#ᑢĸB;z6//bwB-}U/W8oyi}ds}m*>Ƅ%iyIENDB`PNG


IHDRrP6tEXtSoftwareAdobe ImageReadyqe<KIDATx̔=K@Fbq6baiaiiiOW)	BCR#Hwaˢ
<fldRc*`vg5p
_V
R%=pC^ޡg`
$VwΠiyn`&÷	&F[4Tr||k\osF>Th+11:x
OLǶvD*u^0zثBn27|k_;efc;Z7gВ.1i}yטZ?GrCXH~ˊ_{Z;6bw_?U6IENDB`PNG


IHDRrP6tEXtSoftwareAdobe ImageReadyqe<MIDATx̓k`ǟhlVHTEq.ԵJOpv?=OEh16**S,U+%=O0T:ء/yx7'Gb]r9>nww>6h0<]exxc~(
F#,Ah40S_2B۶!
v|:{z890#г=>5B%	 vWB0σ(ts
Ń`AKxP,I/t(Tʲ%6/`c]ŤIT_S?>곢8;M7Z,?=Uw4s4PL&kl2@,+hm)JAǿ,<|-TvJꞲ
T*rZMӌp#/EJB]<kYKV3KWU-fLiZ^>gYdZne}]lt@SBA ,$InZƽ7aPm~ёB˲i[OF<S|6Aܑ6h(:IENDB`PNG


IHDRrP6tEXtSoftwareAdobe ImageReadyqe<IDATxԓ1O@RR*LH4K3?h48L@$FāwI4=託\޻ׯjTN=I~_aF|^Oup,˂V
7aXq+E˫ɬ$mm5Yӛ"7		`:T5{0XʲL.`0h0PBCY!0,w(iڏsAhfWp]l	fy*z?PY!G+:K&^ۮ
b'`{9~j$SQY %Nlg78*40ea^hd˃u_F#c}aQ-&4P~r ys{7垡o	}	0V;3IENDB`PNG


IHDRrP6tEXtSoftwareAdobe ImageReadyqe<IDATxRkq$4MF^;Df!Iv1_p,ZCPH.J[J<4mb^z<!![p}U,J)
yX,g#BDQ4K}j0Z|T*p0*,Z#dׅcI0nn#;ק5x^[b#;s9xOv`ӁM5oDlW8uTτzXZ?ۋ\񾃷u.e7'L3PPqn6ov]5s2KЀ:mZ>
bgrv{؝H9Oij&r+NdyXH+ǥtg.^'F|Y|O94KrS5ccFibS7?8
l6	nj_	x55Ҭ
[Eh'gN(Jg&3AJ#z&%%}&IENDB`PNG


IHDRrP6tEXtSoftwareAdobe ImageReadyqe<PIDATx̔1KAO"x6AFFmޟb+E!`( o[69
dع3oKQ|&vĦ|G\t[bq1-b
,NE71:mq->śg&őF;1޷7UuQ$"&f\:s.y>S/XW8wT&f\9Q<[.R'#ގR6]nPXFoy\ÏDŢX·WEסwcf;ZqgВAb)AcGwZ\ٰ'Xڵv{7`Tm2IENDB`PNG


IHDRrP6tEXtSoftwareAdobe ImageReadyqe<qIDATxTR1mɓQ:\'l]_P΁p稬'#
o4dyKn69'1fX́[CE̯1XKw
>?(lW-8[pF6nDP55E,$=%0bvA[pW[B9a4&J6P #Iq}y,;,%6a4p$o ]Ϗ߯ڱȴៗVFAZ9}	BQ-K3~?atg&'6
JYp\FUhxEmCԥfE (BO65j\LO?d́Z<0%IENDB`PNG


IHDRrP6tEXtSoftwareAdobe ImageReadyqe<IDATxb`-TkU,h
8j ~	t	
q@*5+`2$ԕ W@
D'ÈX4"@=]D_o2N:@ V-5kTMk@8]U
#PPh8r@H.дWp@@D}Mpy?IW:-\$ნ_@]
(=
.CeIENDB`PNG


IHDRrP6tEXtSoftwareAdobe ImageReadyqe<IDATx쓡@Q`XXf&ݜ`Ǧ@7XȒn~ᎏǻ;'ɇrEf` 5.؂8{!͌juu.^-cu`'E
d`#Th2ٙAFL1M9+'~ZgV)iξŜCEL+![i/x5LQ-F'p`Sw5*l~3y|*F9z	0/&gIENDB`PNG


IHDRrP6tEXtSoftwareAdobe ImageReadyqe<IDATxTQ
 )@*a*	HA%T0	v$,w.KK).<ԍX&z"!ڳ
}Ɖ.</5D%&&G
(7Q+(cֆ@4`4
W=WhnV]~j	%[`fvBD1#Cky\6xҳbHZnzz QK
I[g>IENDB`PNG


IHDRrP6tEXtSoftwareAdobe ImageReadyqe<IDATx̔0a Da999CN&HD%@p$pJ{|{mIFۓ 1ǀT 8cЍt 
4åFN{eFHcjT"ZDsf8'óMԵ0Bdtq7GD'
 [UpxD;h="i>ZwL`ۘ8N8nMt@u쇟r
m"X=4L;IENDB`PNG


IHDRrP6tEXtSoftwareAdobe ImageReadyqe<IDATxb`(q@$2p!g3X
_u 
u)T5b
2hgCW@
&2x=ʃ\oc3	0Fl2&@f
QBal0B@BkP@
夤3/h:Ct4Lj'|L4:
d$1٣AI4!Ի`
urC7rh 4.Mp4`IENDB`PNG


IHDRrP6tEXtSoftwareAdobe ImageReadyqe<IDATx̔
0E	dQ:Bؠ
	:Bؠ#k(HXbы]O21f}
g	.YlcH7 '0hT*qE\u8=1'VNV߆ҌhШQ&%֐|P{!A3/w-N@E_g6ft;ḺM6~/`̳jIENDB`PNG


IHDRrP6tEXtSoftwareAdobe ImageReadyqe<3IDATxb`"`&B ~Ca@uPa
P,44>Ɇq@5PZ*@i	 
@uX4l^@i>_XM*XlUzB%3h^Q&Otbh0bF40+Kf`1,PuXc+xbK74; rWg(jXaf4Y~4܎3d	K
L@G9,˰U8)Ah!FÏIENDB`PNG


IHDRrP6tEXtSoftwareAdobe ImageReadyqe<;IDATxb`"`&B)7 ~O!#Dx2?_RD0-(OaPz:dø5(m
Xg<5אh\4P?fB!M@?T ٪" >Ņ	-<3]ό} z( bV ^vn9:af/Xc+\8"
&ބlKg$J;eO6?0l=~CcA跇ʉBw#>@@-)&rh@cɒ׸	60v.R;
_CJ0Ft
\իIENDB`PNG


IHDRrP6tEXtSoftwareAdobe ImageReadyqe<IDATxڬT
 '`GpAWl
#<'m|	A8yܽ{BmhQIƹS#jd}#	!ֿIM׿ʤ}
k]-F	x-f/tPBRJ}p`#^8ӣapoY@X&ei.1ˆF<d>CuIb7Q]\2m22hLfnaVϚ3a?bih#d	*
	S+e3nGuϱnW夶GIENDB`PNG


IHDR&HIDATXý	pU
n+F%,XK( Š$,(PP@BH@]ap$"r$dgwguƀ_MOw7tc>qd0r+c2=U?$dr2܇<O w G܍˄LD@KNN^[PP}X
bLF 9ӒXfg*+xp8`6[UoظƖݥiiթMFejNn"KzYB͛a-fM.{I .@@OT8~*gU=6BikN 
fzE#=w!EK **,ӼEݦjt+!C,0ab"׸[$h<2y)Sf[Jր9VUS			8ПZqL]My3V\ɑfMG]PrUfdf6)ߨqoij3gMۚly)._OC
a"B|
jyNhu-3gs5y[G79sSN
*j?,@pzxp:3Ux8MgP^YUQND[F::@/OXZ
,\ܭ%_Yjlbluc@аxܷO.IΡe".\Tbk{,eir4b?)^M94IJ2gt.Y'RR_;2oظuDD\,B!3kFgkV$vҁ_ۜ>8ZJ3efZ+Ode|kvXx7'ms?[$l2{Ijڞ¢cEM.E#vxYCEm**n=tn0h_:BФщD;BBG4$yW]n^EgpRABRU"{y8dU4wgy8yv49Vߵf;cvOjfG#GBs'뗿5:cN6Y]+{ǗW7bǧэQ
Xu"Dl.hqɴ<`[OWVo1]H?Ӭ5HAK6.V7;`o5lZUz򌩬odnP6|t!i8N2ϼMhӛayGYcYis篷xqMzfD\d126zdU/tW^cوⱺ˸3ߖ;ظQk3Ga8
'y//D AϥћO9m;Y)5f-`&,)>M޵@"<(KbbylF
ǥ<7.\ԓ#PEu{N.Z
+T':id1~pkt.J_w5ގ.QEۆĊѳ<EL67G%)%m=9}
OD''\qX]y-_v!0﬿A>ݢi_-&Ӆ׿f*YFzWsE&1='tm3פ+ڨǸX T5h4>Vc_K*'
sĘϘ"ې_5
[
sbW\(&~①VM^{=Z'O+isV/vf0w=k{=zVBIENDB`PNG


IHDRUtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:0E483FB143C3DE11B50FCDCE7930288A" xmpMM:DocumentID="xmp.did:97096D27AD3E11DF8D23FB6F4D33E864" xmpMM:InstanceID="xmp.iid:97096D26AD3E11DF8D23FB6F4D33E864" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:028011740720681188C6EBB4DC8207C0" stRef:documentID="xmp.did:0E483FB143C3DE11B50FCDCE7930288A"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>JU^IDATxڬVilUE֖*-BM  !(Т,Q"*i)hDCPDIXİX$*QCBXBYRBKHU"}J{g̻o_s:ޙ9wsf!fgreLiB(ͦwp$ͭrx
`m0LCm63}1vBQk\q$>Hf(?3eHd̋Z	Rj(TҐPҺhbφi)7M(̖tАTtG^4>N6)ϖm3ĊD$A^F
 ܊FzWvXdtJI)D[B&	\$RPI?@~QZy.^xw72
HD˟e"99B$redRSG"Lt	nc89"̵LpB$H&o@빳gx9ob,[LFd^%5A~1u{hPq^$9~]Gϰ%V%{"SlS\%|Ψ^Frއ!{!W._f2PdjXZ'cxz_@Z20|8vW:.#C,
;P7rhW51N1.mTQԮ[N=0h0z8=KqWX`ui(NKǕa/ʉvL[1-)ى3Gފ/1h4w?CJP%$-tSa/=<,HL۱f
jP#xՋ(QΞ2IɠdS0%%7P+۲y`Um
&u9wz1JKkgD籡ud 0NL]<Nr@Y4=}r(Cp99q
v_JPtFFgmXG8nwuQ!2wb;&lnRGptbN$2S+f30n]{nᚔGЅHG/QJ`Hʖ1*g <7]%;/#&Mjo:&~y<L~
7fW#;X
N$RG]@!9eoTza:XÝ|ϦLE:Z~z0UzCX֙V.Nk(j&~"CaF-v*6͝S2);:u#mMo+<Yd9h?ya:2PY2/;sTƵV>X7[BS_f0İ[%jl¯\9}؏ n@Tt: 93f<xw(MC'wXMwi h>`BditZ1}n>:H!:ѽD6=/X>/+!
u߰$44rQTNJZϐt!#9&m	Y@}3Op HB*
RL@'oW|!ᨵ5r#kMKZŶDWt8}GKݬDN8J&j/~RzȄ	ҧ#R )"ɖH:I.'ު4,̹i]IENDB`PNG


IHDRUtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:0E483FB143C3DE11B50FCDCE7930288A" xmpMM:DocumentID="xmp.did:CC7EAFDCAD3911DF8D23FB6F4D33E864" xmpMM:InstanceID="xmp.iid:CC7EAFDBAD3911DF8D23FB6F4D33E864" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:40C0ACCE332068118F62DD49A1501FC2" stRef:documentID="xmp.did:0E483FB143C3DE11B50FCDCE7930288A"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>t?4IDATxڬVk\U?7//3If246~	.B,(B(HW
tQp#"6EQ(XVPhX&1g$w޻=;W|~PLƱ8h4$&G@%Ѯa4C$x/ݼ;X`dD,Uk>VP.(F:y蟈^q>SnɍX~.׫5YoP0L`2 D! +GRW^$Nta<sc5$#Ief+=U_nlTH«劀xasg4QX{"kF&yPtf㡤ݼ {Xo#pW׮}>!VPg0,]AJ͕P²q@;8e5{…OCyLs`$CQl	<8[7`qyV>{3ٗ`nvw9!5蓂d1n )|]xI[եH#'D+4p	3Gl問7		{̸'`j9
s_L98J)2Za"43ާJA茀r!+>ztjZB藩R c
d{#3CMF.@%nhxR,"|Ҁ;.nbD*&}4,yy0{|қ=ͻarϙ9٤ i54th
*vA{g~f[km#)ɗ\Y|39s|4HZ:dT},1`lq~^@>M 
fnhlJ<3c?aYg:"s8l&N>S88@P`2h.Z	_aGT9.شvb)uY[^(/5EE^*TJMh]	h5!
qmPl32帺IJ"*KR`O_t|6DLl46GH5PLTʼnf4g!Hܸ!jg'x|5(kAaFW"S^=iikЩhz+l{wnnCAWdVts-Ś,z%jgn?FW̱|СZ
Ѩ҈P
+C^dIENDB`PNG


IHDRUtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:0E483FB143C3DE11B50FCDCE7930288A" xmpMM:DocumentID="xmp.did:CC894011AD3911DF8D23FB6F4D33E864" xmpMM:InstanceID="xmp.iid:CC894010AD3911DF8D23FB6F4D33E864" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:40C0ACCE332068118F62DD49A1501FC2" stRef:documentID="xmp.did:0E483FB143C3DE11B50FCDCE7930288A"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>ZH=IDATxڬVKLU'[.l41@{PAA/,DFCc1n&4h۠
v&bij<M(}t?gnuW׍4](!xs[AkR?Xҷ|7ɫ.uxW@Lc@Bm.3fMۙόћLU!H4F!VԾ@+!@F\2fn&00fEXڈƒrBBK+4 n`
"0c\阚HYN{|0Ϭ5Hxj|u*q5O?|rҷ	D?ݐޞ#HgxGػw'܌fd3Y=;HN(POJ/Ýs!@5mkĞ=0;;sR[ܱq}:iQ4dsH|#+HG&O>S{,}?&033\8iuk#łpAFFlBma(f`fL*

Q,P*E0$a;1K*F:],w`-t*糨]Hbͬn5̐Jd.>oy2	P겂_  ,CPcJ׏4E^̨78wCfGN @:nTQ%+r2{qLR~z܇SO=/(5ݏBaRY݅jx67h!N!VV7}q}kPwni]P}|)ĵ}?vE2_
f4H1,в-n"g>H!nPppܵi3:z\ $t	<ۃus?jysmω	;Jeҥ?]s##@.*IWҭjn$#*JNZyeeYTG3LwuPO^t6d""vw=ԡ%F/FoAy=c(X?

/"6(ҷ2g}XX\PEC:-w.%L:pr5O66+͈UU5bpWF%_V`T(7=RIo7A1uvs
̗+\'5۲Bj
;&[Pӵ[iHbW׾izSGOMM^^)nT/q)ZeVz9*<L_KK4-СQI+ATOq.[IENDB`PNG


IHDRaIDAT8eKh\eo2$3ITRjkcVR
.\	.KEЍ FqƅP0TJJMjә:y-,9DŽl!@AUQ@)Z?|0ͼ֬kc5BT$%±i÷—p.Q H^wCZFul=*Ĝ0QPJCQD&u#-XkȳAcU굽E:7[Ab]bU0p{9vh̨Oh4TFj	X"Qgrw"**Jṧ-b"(_|s>c\%EnK_D4w(X"|vۧHXTֲoGig̞~od1J_yWykPTy7P~GcAGpyvځ
1*ǟ9pɱ΁=,ȯsz/&"^$Gc"%cGL{ݏ87xӨ(Y<IC "\[^#)(`&e/ Z|VEg•%7:dyΓ&C|i<gq:s`fK&C4u

`R\Z<6y_-ߵ;>?ulڴнdlPX0.]0qm	IENDB`PNG


IHDR  szztEXtSoftwareAdobe ImageReadyqe<
`IDATxڜWil~˻^^;;E.pnp"@8"DJiRhB ("@Z	N\&clqZ{=wf4jf<~wuuz.òL0y`VRY8xy]s=R-貹D3Dz>$M+d2CǏ^qԅK	ooiypN4&kd
V|F:}Jo3|Su+nl|>|g^,L&1{7BiV؎E0Ψ'?l.Z"~t?兡y0~>G\g#DJ40}j
m-/3"Gw7:BOuk*黗klY,f;b:Yn4m^^#s>]_k\մޟEbJDb1cDa:𝝐CAȦex!кEkM'C!3]՝A`㣛~\Z@0/a	qJ+|,>0H8&&xJDo7C~)cc.hceOO>Zڶ-}doWT	ٸG*Ǚp3ۡ..KdúEk<o1KqզugW)FY'7T	T,rF8CAlf?OB;!.
ւ[
6.Z7
ot@X|o/^rHƳqhZ޺E?-b-OoH6@>W¹q3^ɡ)h#kHe#둙=Gp9_^QL4lmzkj.19gGI-UTnMN1%я0i\FCc҃贉
y[ly}q
%CBc 6Kwo}{O|07dKyhnE~ŧ$z>E}5򒅐[IWdӳ#..+~`0	D>Ewqct(̇s̀èJŨz]khQt|,12eah!_QX(Z:;7|=@%[КT(5qJaϋ
Hg+pw\*P6&c8{)<$U +0(.TT"6t"YT9mS@%ۘ9DFx5ضYik:uΕ2+4VUID}If
Y/Ed w1d@"DhLpdi?aWȆx$ɖnYrr] |Dz'~:,}N=nJ
p1t+^<#7[Y
!2+&emD55y}\dM=b!	XJ3;mGa*ACfXv6+i5QXM7-wu0ʿEW{˵ewz2+򰔓&Rumd	8$\p
4G;dzyҌCj,:/QOF֕xMHW2"(hZbm
`e4K^*ҙ@S]R*.033R[ۗń]Xi…D|oYDD(6r4<	kѳC.*쎬ip,G
@˶Q|!*6Z}xhDoG`O_ӼAwEPPTƾC9}!Oe'RxI,x 8{\c4
1lR<l`8Dcg3Gl\xUk:jdou>*p8MVJp;AKu"+]$?ގ@ŃqWIJ"NH9ѪE\WUGY	'ڜa]~[7/jpEĩFl.v`WtSh-\w"ލ8y>O)g7ؙ4<(Ӌf-ASfτ U<􀊦n0J`jb.8j(*׊J$&?yzs#{_	]X«fzq7h0ƥ]ۮm3Gۨ#G8bY??cpR%צ-!%t͈gi5Wk	4UCՃQTҩqa_@7w|?S3ty=xCjs	/^o`q0tVnml
0=Lg*S[6x܋?u׊j0MRUS)_+TQPGh[;w[+K':r*͚4ܔְsMɒLV*A)μ/~+N Wj/;9Inh꘳~Ng|IS%r&[|f"^REV92tŲ1TgCP##z_	ubYV^!j
Rn]=kZ5v9hw\`M'?kAIENDB`PNG


IHDR"v:tEXtSoftwareAdobe ImageReadyqe< iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CS5 Windows" xmpMM:InstanceID="xmp.iid:DED0C086B6EA11DF9B6DC5ECF3DF7D54" xmpMM:DocumentID="xmp.did:DED0C087B6EA11DF9B6DC5ECF3DF7D54"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:DED0C084B6EA11DF9B6DC5ECF3DF7D54" stRef:documentID="xmp.did:DED0C085B6EA11DF9B6DC5ECF3DF7D54"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>IDATx[tT{$$
5(BXc+]VȮۭ[v=z._Je.(G!!I<0d27|C/ә@NwG0M3Ca5|}͚"Rt8IIJqT7Z>SHtt ىŋQ\W܇>3\
Y_.[p7@hfn`GZ,gil<~p;oT|k}``>8PKXPA3[xz`ɒ_v?V*iFdw5]6m0
{^w?&w?3jk޳ZW$xU fg_ܯ(߫vy})Qpagkcѵ_9Fn':'4#̄[_|X57_.Cn~4&/F
[zu'T>;ss=ҤI
HB!(dfg@W0Y^=/jL.)4f)f]^dBq@$~-n9сP$ ԓ`mA޵Ν>uMOZ6~)_2*7eA=^1V#W{-J^xkq,+/؎O]nc&A*ribq?$`&Pl>'~_d&)yy}ɧ{8ʜ:օO)>#vu+"t6I5pv!݌ϯXOB~`&]o'MuswO_AeD3};ћDӖ9sgv)z,RhT71j>/ofoj]o4N
nKn-znSyE{|zW\(.Es}&zm5'ԠbbNև݆PXP݂w}S'"}(DGȮik+{OU}(ГIz<tKPkiaIQ
mW-G^}﷝uN)Rΐg[8sc]e-_X&jS2+t7'y_+h].h_5Ʃ95hs̯TÈ1*DiM@`+Dnkz/C`z`9 J&Ģ
3-ZFnfT{;tj3sp%v#ߤuD
)heRHT;v#Ma32oёjޞ̤y%ִ3uzsV,,Ƅ9*,aAeDTUAQQ	>q reԚ|Q*%q	d7nDVa?LBZ<s<<6k~vLz7HBbQ[|SjFKvpV7%eNl'4m9p5CשUzn֤Xr.@nu8o@l&
?IEkPu'z%GFb&BQ
15ET`2N?у潇Gz!WF1vf::N*ԍ#359]ޘMiKfrL\4Skoy5᧴N٪Dzfnfsm#:U!		4<#)CHZb^GGk&zH(#b
u_}?\6sRRE3lPM!eJΡZʯۆjlQKh=pr!ae|ok;2Ɩc'BT	6
Q[6
ѐ#|Qh/O0)2DZۧPN>B~U#p
n/nAH'aIvJ0lB\LE;w*/n|1ܹI8MBpW͘"/!E/zh)Fj'5uaƞlে0z w)OAa*GΩbVjLlH3%6$u~9N\0(V#_%,JsQ䷿[a0ns6&L.%x:if2.4Fzf4"9k@EH	"y@+=b2<c{ކGv;tu) pu3p=7ABs<8H̦հylوn0Sđ2IJVPCg#ɱ8Ȳ|:k0Zs>xĬQL-G+'a=k:1/Ɲy,LIhvr*5
H@=K]:.pNLH/ͼ̄_`|-z*Ah|n_73
5U,.aQi1z\9Ơ0#7D{`5Ҩ$zFe-w)K1[Xq/RiW4D
\2N7/:e`ndp䋤'
TYEXO;OšP9=?|q8,+{|WH->"Ga/őS/RMӤ3+E+<fcUSi5i"ZڐJZDg|X.j{8k4:1.x1dL>YG'"cXrMEr!Α@0bq-/	ES4,;oz^4j*KWqIJWwMּltWy:w3W^>et#Kwo {Ƴ6(m˷ E(Ka AE[%84RIQ2C(ʼ;wiLՋF]0EL?۷/Vk?pMO[R{y^k6^95|Od=ؚT}WZgb#}jt55؜N9=+Z۰$g?@ s<9v̫K<
9#~{
7?HaD<T/#uD\V_Ns'Ɍ9w.¬v1boxh\|组Ss-΀ήP%%rĸ˲HTC(AT(MS~w#WϘy􍇤kJTĨ</"
><3RNz̕$@㧂TM3IK*E]%w]iA8͔K_b<V|;<7Aًkp2~{Ʊcn@񴭪Iͻ0
E
|B)WB}uXH~rEXrC9csWe#80Y
LT +h7MAD3GzYu'+n1BC[/>-ZyfCrq`W&^W47KHxߡu?h;i ky2_>'vkW\մn.ɚgfۦ9Q]5ٔs[o?d~j0
?fȀyB,pm~AZKj=gC~l;'b+j++dIENDB`PNG


IHDRatEXtSoftwareAdobe ImageReadyqe<hIDATxlSKlU=yu~kO⸶V(rڔ*PXH@,B*H,!X.Y?m.**HR:iܤNb'I%~s=[0ğ0

&b~P8| E(`.nn.R(L/U*k>{@Ǹ\
0do76>zPhRZÝ7y񗟜ˍ5<oް6{eA0sVQpl)}gzGa-{/bh3t'Bm_v;LJSb°WF>޵3rA,&xWa݃sׁPR"n=_ϱt=.7pz\7P2{p|Jb@Vu# Yҕ9^SH-*$æqLPq1QqW2/R2F	hK	VkHxi-bae0#p,]dFS
6]q4UW(CEɾhw݇( [wݜ{`VdH-'TF	e~Ǒj
;cGQYGdHD]DwJ85OI`'k,Aƻ_\]|żnv`~Ę)P̈́hJ<~_.;9HYgÐ?kVx-=OLÄ1V,۟߫7yvlb_>O'	n4PhʈZ/8>3g'ޚѴ]^`0,mm
*gv:5͛	8uy]w9k&mtd6WU7@;z)<DmuE;0fs.CIENDB`PNG


IHDR"v:tEXtSoftwareAdobe ImageReadyqe< iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CS5 Windows" xmpMM:InstanceID="xmp.iid:EAB29776B6EA11DFB880E54AAAB33E61" xmpMM:DocumentID="xmp.did:EAB29777B6EA11DFB880E54AAAB33E61"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:EAB29774B6EA11DFB880E54AAAB33E61" stRef:documentID="xmp.did:EAB29775B6EA11DFB880E54AAAB33E61"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>>&IDATx[pTeIwN t;BHXD$(ARQU!:#N[g˩juvgq!((߀  L :t}ziC`I{{/gr)|n
rELp7[WXTvln&N5]?	CU<Do0LU~ȝHtur2X‡}
S+W~r}
sd"l68-z$酰$=}UsK>3NuﰅBKADZ[',كvpGv/]~90Fa\[Hwn%@}{F-_}P!3MR6Sݢy,+sov8iiK/	=4<u5ϝhs3DZӀOo5JaF˄{X[φWsAnLן??Ye˻!̘\@\@%A`B~]:t
~r2R'_官1qus[݇r/d&n	嗣m;EaxxoҞ=vN֩YIfksd/`!|ޜB[<|f/F'm?,ף=/ډ.g@(@/6sdhO=;4`OO8AU˜EE%?<+G+nLx~}]ߡE.>Qe"{[ϟ7߹3
~iu0**츃
fҋ6.c>Kti``ml$]e!cueֲ 4dߺYxwRI~溟zD<:ǣ"ߋ8
zľY
5`887f68z878*#~b(ԦiШ׬0;DmRLeyQfVri[͎ky\>m>m`,ֺWqe*v/\mc"xd珿;SP?1W@DҲ&CTLO
8a_oB0Ѐw<!d
qևΩ F9DP"Vp}Ƴ钚d4w13MFΦ40c2'iC)b+Vv{:2]M:2ʛZύMi棓ޫR4	q=EQZZpʯpn14Z5PP1N@>u
dނNV5-c{G9ӏW\.j߳2Qa @˙{W~0K}ڒeY6f\#7=PFVǺcY9pŋC$UT-	~LEP4C}pz2LWX@$n@&ckd9ԅS{Q5
~{x{aӝqL+EgTr%Uc&mb]7fE=>V&f-+=&kK=skS!ƻ'1=>KV$($((BPôù
8DDA(Ѻ4(
}?1me"օ-	{	,)ūE,;ikPښ	F 8dV)1ʔ_#{%6&ͬOS~kDF@)(".G?'TNt෍CGqe.&h%j/CG%|
|Xz7A6 aq\mef<{.XjU۠*jRAIo@w~=Q>2ރ^~Zʐ C`DtrـDq>Hۡ3\DԞ7mH4u6&FWrH(ݛ<Q9/ix66^ʔ}%@+K+qw
(h߶ӪDoFQ`\H*1F<t<k$yq<c͚UV}c?TR^;w}KG(8t<aIuM* k$u70
GkI)+Y}](Hr#!% IgϼN8;聛PWb$|Cesg`#]kzVxdӨ6
*UV5Ӓ\Ң߯J:٧l>6ޏL%%)zR]X~KQL\(SPXDC?CT*%y=GKZw@n-~)qᥐfߐ!O7
.`[d*[ăE%No}M5})9o;#(j(Ś M^,#FT<1l^}t9DeOEٲ:YembxG3eTSY/+W:n?P7vx3{%TFXnɽDoZHz<<ŒU	N{O</gTmvXk;M7Y[d{XVYѣ)Y^lO7>KOΎwϺ0S:b0p%Ӌk
Z:&A,ԱaUS}f@gJF"[=^UM;an{oMRڎ\FKֱdtfh3L_vݯczTwS=󵼒+y+QAU&5rx+EyD!>LU'=DP],G`@Qi
mk 5VvafF[R/!a>X<a~O=ؐ”	}Q%7=>ʨ<C~Ror+G^/I"QbZ+ O~иG38H4-clcO)oo@1G_P{fOCuyy*.2
$HzDr)xg9Q}q=?=sil4/'_~JL/b7^}^}l40EgtvfXh>5i[ESsO;o
߾ר
g_"_~
=,+8󞎻*tQ򺒤w솪{tpmLH%Łޘ7/Egiio|at/\Ψ+, EmK\]E=m4CBuTE	}Hx׆|?Iwʓ쀟nE׬f;<Ф?
J
2ہK
((3G<x:Ԩ9ǍI96,'$u360ݰ3vůFx-c|`ۘVB5	0샸6.μIENDB`GIF89aL߉-Sܗ㫹찏
s$G}KrxENro,&&M3UhOKRJzppm{ݙ(W@!Z0Kee튒֠-?DOA7E+eէŧWF>¸zMwppdPI⦥?i25+;mHL'e$4rз󄭈ZZ:wjɋیVݹB@Io:.Jl7=r䵜c?S':Gw}ENi(8rxs#$"#7]ߛ>T(1n<lCFN]axDD26I[ۺGdgԢŀ673t游ƮSr$_Qu8gLSWuaSO9o؞M4eApfffpfwݸϸ_.*'ʾȺAN`f]jiaVc;aqKlUod}dԷdl&8+`LNRRV\ȝ!NETSCAPE2.0!d,L	H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@
JѣH*]ʴӧPJJիXjʵׯ`ÊKٳh)*N<.-]ym}ɕAI1H2{}nQş?
mx 6FiѢ
IAՇ*,<0CSRtT	%5z8ͤ!	
]6ʴM&Jr$goӅ/5rbV|dȹIR_jK
, pMBD-:4_Rh4dP@=A Xp">dH'yġb
+!-\CD(sGg2QuDYJt x@FAST
$Bd%e$:p@@cC#>0w(H%&(BHrRHQ8X 21,J9>;@
0B
@Ppgj䬵|9Ppr0BQ.P=`kk-F ۃQV9ʎ`A$]"(A"wh26)B@3H
=#;cQ@@
XdK-
Rր̭B/%$k- T--W[#b@ג@,1E$ 4tLC
1>|Xܒ?h) l,D
TA?(,вLJx9gA8^@*P1J
CW58lC01D`
1trJhaC9ԇ4 |@lO([5dN4{P5܊"jj|Xp
hWT,GPq	J1b<
tj0).4`AA,Fz'(->"v'#
G(S\AN 
`\=qqVYe1HIi>q@C[77)6@ESb!% .~*xADlƑ%0<i!Ch9ְ eB.ɆwD@Bb@>!bGHA"a
8SprlBt6р f|4Q!t
Y;A gSB8ъs!218bM/Н)xH
c@I"&>`!ɨ0"@9	f(p.dDǗ=4਴pC*8=
l
LHiR#lMCЉ={x@ ٸABoH:A
P$X
;:Nz1[4+T#F+4HZĀ	wBD@
҉5a <3\g%.	?  ,^9v+<r)Wl HUZ+hYA4dV ~x8p:˜n&pa@BI*Cɦ![AGbBtCcL
D)C~lkj~5H%*kpS.ij50{,	gH0
abuf	-]eerh @ l"[#x
ug H^8cH7‡I#@ӁH(PɀCc^R2:~bPVlE$hm%MU 0d@0KX!*Axx|/^
a@JN<tq{h HCFL@ TAkXӠAD=f"gp@3pBB{&*Rqh=
@<opC7Bq. )>@CaXA-R
`ηmqۛRp,d#bpp$Fր
dlȆ
5C,C7w^Ai9As	Vo\B8&C	kXDu&H)Zkk>T1ƪXx0bD^?J8G"HQ(6 ^'@H8d(ha#:P_F l(dlhFaGpeCֻI<8`9A ޳=|02ZTU0zGD}0
`(0tb< ?PP$E_XOG@_BaU U|0''  WP% | $hr~,P-;J"@C0 ?؃h303ЂP7(,~D@ VHY&\#_9XZ(v"b"#P%IׄRqP(W6]8ЅXgh"b8w(X&`>؊TbQqǂQ#c0OUAc؋	hH<Pqmq	pd3y"opXxY0@%'8"}%X	xưQ3(ȀC0N(w{%~駌Ԉ*P~̧19<iMAP1o # &bS
|Ɛ,-钕@kٖ7i`C	rIb2Pa%!؃YO	$=؇0hYpa!
,,	8#*|R821R8k$h'=zlDB%QttGe.	BsCYetBo[Bq"%:pDU3>yA'&JԘ"GMf1C3?dj]S|؛D`#wSzxΆ/Phi7eiԐ;bB2$DjetcΞB@iRƌBMN3O^xX9
\g0ߤ^fG3DN@J›@wv/oLzdH^HE-[$Ga>A\HA E@RL*I	A@!
,,	8#*|R82!THЀ8k$h'=zlT	B%QsG#KI@sCYep-w0YJ:uFf
|CNz1ej.cfu?~4ԆP7@wSzx܆/PNC5vo PI<IGN{2 PЈnR*ҖQٳ"េB#5蟻$GϰXDt7p<C4"vCf}~$&b>!A$x,<0!	tEBVDRCXb@!
,+	8#&|R82!T8Ѐ8k$h'=zlT	B%QsG#KI@sCYep-w0YJ:uFf	|CNz1ej.cFu?~4ԆP7@wSzx܆/PNC5vo PI<IGN{2 PЈ)i(Ӊ*N@<7zGϰ't6~gVH9!a2!”+9>)?bI<  $8`HNPÀTЅ"!MX!
,*	8#&|R82!T8Ѐ8k$h'=zlT	B%QsG#KI@sCYep-w0YJ:uFf	|CNz1ej.cFu?~4ԆP7@wSzx܆/PNC5vo PI<IGN{2 PЈ)i(Ӊ*N@<7zGϰ't6~gdH9!a2
8/W.s>|	A/,<0|!sADQ$P@`H8
t	qHl?0\H!Ub!
,( 	8#*|R821R8k$h'=zlDB%QttGe.	BsCYetBo[Bq"%:pDU3>yA'&JԘ"GMf1C3?dj]S|؛d)p=<Pcg×
vp	@(Ol!r7SL(@$N09L=ys4AJE2
5e;-;A/=O
.3mt<Cݥ-aOHE-[G
”9>VX7	@t3$i<-HG$@c@!11aHC!B*4DH VD,Vp+tHT@'!^Pǀ;
TҌ
T$M:IQ@!
,(	H#&|R82!T8Ѐ8k$h'=zlT	B%QsG#KI@sCYep-w0YJ:uFf	|CNz1ej.cFu?~4ԆP7@wSzx܆/PNC5vo PI<IGN{2 PЈ)i(Ӊ*N@<7zGϰ't6~gHH9!a2!”+9>)B8
$8!`HEÀt#!t`B!
,)&	Hp #F$
*TqdKq#H>2O*'N#&z(RȊO0LΝ-_$
cf˧…fwf)%ZIV	
:QƔ=j4{7~hp
xMo@

_6Q%>ᇇ4j @1xaˏ0hAMRҗQٳSc"(4@ك4P<h^bC]>^]:8!$^nL >̋\F^$i<@$8`
@aE^X|aE1LЇ
|$DG!RRA8CTibԎ64QH(	 "A0tA/C5Q2eAM!
,-
*	8#|R82!T(Ѐ8k$h'爉=w6
r!'Q޹qe$As,}2VpᖻBq,%:pDU3=A'=JԘ2GMf1C?dj]S(|؛䟻)p=<PCn×
vp	@(ox!;7SL(C$"{#L=y(@hBCJ52
5{tZ9C=O3
.E-=ѥkݥ-As&HEC<Ew0e·4)
)I<`yI1N`B;<HQBXDal(#"H˄b&.R4I
M!$>#;r#E!
,+ 	8#*|R821R8k$h'=zlDB%QttGe.	BsCYetBo[Bq"%:pDU3>yA'&JԘ"GMf1C3?dj]S|؛d)p=<Pcg×
vp	@(Ol!r7SL(@$N09L=ys4AJE2
5e;-;A/=O
.3mt<Cݥ-aXOHE-[G
”9>9	xEc
CRHф&am?rb#ZXv`@!
,+"	H#&|R821RH8k$h'=zlDB%QttGe.BsCYetBo[Bq"%:pDU3>yA'&JԘ"GMf1C#?dj]S|؛D)p=<Pcg×
vp	@(Ol!r7SL(@$M09L=ys4!"]gaI&bv?xN!ҁɮ[$"̖-#paƜhzń	;$i<@7&$@`=aBN8PN!&#WbH'*!
,,0	H
dĈO
aG8F	HAyr8}s z$	>r%KGwZVS 474roQGA.&!,Rҩ
7Jh5ߓg[tbD)r{tin34N65GIB5v6|`G
2oʖҨ!x9DŽdHBya:Ilgσ@)(Ԥ8@<M7E4
t6ΖgtH} al1.o!tS6|@<LCAB`pcCR8ЄRa."#>TB'&"B+ԢA/cxah@;X
!
,,	8#|R821R88k$h'爉=w6
r!'Q:As̬|2
p!7-pgNnQd<Ҡ%jLۣKwg`ݏ
nt2N>Mݔ;j SF
%& CS<Hia;{cHDSFl'rG%iҠ%w.gpTt7pf<CI9eur;\r1y0K~cRC!
,,0	H*\#>)A *4 Κ#=p	GIBp9bGϝ*4ʖ.s@9f|+\popgNnQdqxhI5LQӥٻy4Ǐ7:
'n]Ԑe5\
)~xH
 ʐ!ig;{
!!J={:E&!A=(O3
.&E-=etݥ㭼3Y6HE"C}Bw0e·4-L`@DAāC]@nOȐHB*Ң	2	iM
]
c!
,.-	H1"Bđ!QÁOYs A<N>GLQ`8r;,+Y8ʷ|+w)%ZIFɳ-
:1Q=j4{7F'S#$M;lKB|x"8eiԐK\cB2$<pa:Algσ@!-RӘQAq
z1x4(np!h/n/K",-.
1ϐlA/lbh]>B?\m&E^0^g$i<-
I1NA;LHU!An(P#z88P,4?
B/6.^x-,2.yK`iA`$S pAW
X!
,1	H#&|R821RH8k$h'=zlDB%QttGe.BsCYetBo[Bq"%:pDU3>yA'&JԘ"GMf1C#?dj]S|؛D)p=<Pcg×
vp	@(Ol!r7SL(@$M09L=ys4!"]gaI&bv?xN!ҁɮ7$"̖-#paƜhzń	^$i<-&$P@c~!,2.	H#F$
*$qdc8k$h'=zlD'JL
<\憆1-(… 0EJ:uFf
|lKNL1En.cfu?~4Ԇ:7@wSzxΆ/PNC5o PI"rN{ hDejvbw^H{&
\zgÇyyI	Kg{xg3$^ċ0[ZÅ)Ws>|RLC
AtC`A^@R
,.4`]@nOX#z8bBMh-!HKПE.$)B.TD$ 9ɍ
 psɏ!]qP
2A*(Y! *!<!
,4+	H#&|R821RH8k$h'=zlDB%QttGe.BsCYetBo[Bq"%:pDU3>yA'&JԘ"GMf1C#?dj]S|؛D)p=<Pcg×
vp	@(Ol!r7SL(@$M09L=ys4!"]gaI&bv?xN!ҁɮ$"̖-#paƜhzń	;$i<-&$`@!!ENHPalhrX" Nb+
IqđЊ"$,1#EMÅ5.R-,1dH 2.@IK`
iB`$c&D7%!
,5	8#|R82!T(Ѐ8k$h'爉=w6
r!'Q޹qe$As,}2VpᖻBq,%:pDU3=A'=JԘ2GMf1C?dj]S(|؛䟻)p=<PCn×
vp	@(ox!;7SL(C$"{#L=y(@hBCJ52
5{tZ9C=O3
.E-=ѥkݥ-A=&HEC<Ew0e·4)
)I<M	yI1N E>P!,!,21	8#*qdCq#H>2O*
'N#&z(RȅO0LΝ-_$
cf˧…fwf)%ZIF	
:QƔ=j4{7~hp
xMo@

_6Q%>ᇇ4j @1xaˏ0hA=RҗQٳSc"$4@ك4P<^bC]>]:8!$^nL >̋\F|^$i<@$8`	@B^Xr8P#rX'@)Rb/?G(BHr9. O9tP#BH)ҢIB),|)
D
&p&)1V*4	lNfB$x\ЋW0',\	A1"((!|AA@!,/1	8#*qdCq#H>2O*
'N#&z(RȅO0LΝ-_$
cf˧…fwf)%ZIF	
:QƔ=j4{7~hp
xMo@

_6Q%>ᇇ4j @1xaˏ0hA=RҗQٳSc"$4@ك4P<^bC]>]:8!$^nL >̋\F|^$i<@$8`	@B^Xr8P(H
H'(B(R+hS5.T"-,H.2.0YK`"iB $_&D7%
xi-䠂sh@y(cB!,*1	8#*qdCPq#H>2O*'N#&z(RHO0LΝ-_*$
cf˧…)fwf)%ZI	
:QƔ=j4{7~hp
xMo@

_6Q%>)ᇇ4j @1xaˏ0hARҗQٳSc",4@ك4P<^bC]>.]:8!d$^nL >̋\F|^;W$i<@7.$P`"MHB^Pa}ءxؠX!H0|hѢGQD)KP@*I
 \@MBHT	|\Vtu_ոics^!,'0	8#*qdCq#H>2O*
'N#&z(RȅO0LΝ-_$
cf˧…fwf)%ZIF	
:QƔ=j4{7~hp
xMo@

_6Q%>ᇇ4j @1xaˏ0hA=RҗQٳSc"$4@ك4P<^bC]>]:8!$^nL >̋\F|^;$i<@7&$P`MHB^8Pá^"#6Xt+עH/Vt"E8
0X|L24C0dEJ1bXQ9CTP	8B}DyTF!BD	gaBTC5s*dG*!,#.	8#*qdC0q#H>2O*'N#&z(RȊO0LΝ-_&$
cf˧…%fwf)%ZI	
:QƔ=j4{7~hp
xMo@

_6Q%>%ᇇ4j @1xaˏ0hAMRҗQٳSc"(4@ك4P<h^bC]>^]:8!$^nL >̋\F^;$i<@7*$`@
VDa
]!An8PX	ؠ+ȡD=A !0+<aHH@
0|(1p||,"	J1b<)R9CTP/8eE}yk*TFgBԄ	wcB!,!1	8#*|R82!THЀ8k$h'=zlT	B%QsG#KI@sCYep-w0YJ:uFf
|CNz1ej.cfu?~4ԆP7@wSzx܆/PNC5vo PI<IGN{2 PЈ)i(Ӊ*N@<7Gϰ+t6~gHY!a2!Å)W.s>|	_L`@
AtC`B^@R;,_*Da]@n!a#rX'(+*4!}X*0+<AH@
((1Hb||X	J1b_9CTP(8aeH}y^TD'EԄ	w&QcHTC5*Qp*O4a@!,!	H8hI!Lj'9G}d'N#&z(HO0Lѝx
cf[QЅA	laŅ;ttÍ-X$lKNL1En.c柁u?~4Ԇ:7?wSzxΆ/PMC5o PI"O@9L=ys4!"mgAIbv?|N!Rɮ7$"̖-#xpaƜhz[b„I<MyI1A!,!+	H1"Bđ!aYs A<iN>GLQP`8r;]H8җcǹ!Rҩ
7Jh5ltңD)S{tin34
N65GIB56|`G
6pҨx9DŽ2dH⩲-?tΞd@HNgFfϞNEg@ЀeL@q	{jr~t	={Awt#oLxd
xƺ!3D@.Lr
x`AH:hPam?f#@%"+X8P@OH4a90PA% 4 t`1C0A$(1GQЊQAGjP$[Vĕ!k~P5GU#!,#0	HP #F$
*,qdc8k$h'=zlD'JL
<\憆1-(… 
0EJ:uFf|lKNL1En.cu?~4Ԇ:7	AwSzxΆ/PNC5o PI"rN{ hDejvbw^H{&
\zgZÇyyIKg{xg3$ˮċ0[ZÅ)Ws>|rLCAtCB^@R4.XQ.Da]@n!V#aA%bR@OH1
ELXA"
*41J0AGC01DCqJTTdEReNdYQ\^P&UsDfHp	CsVԡcETC5*kFHC0!,&0	H #F$
*\I!Lj'9G}dX$N>GLQ=#`8r;,+8ʷh|cw)%ZIvٖ(Qc5]B~hp
xMuo@
_6Q%><-凇4j!@1HV8C0A Ќ.)(Ԝ8@<M7@42t6ΖgH"al1.o!ʏtS6|@|dA/,L0YI<MAR428R2Da
]!An(PXȠĊ#C-D
,hJ0AG8C01BC!3D蘡0YPǔpQ/5S#1u$iQ%Pq]24xHP@!,,0	Hp #F$
*Tqdc8k$h'=zlDd'JL
<\*憆1-(… 0EJ:uFf|lKNL1En.cu?~4Ԇ:7IAwSzxΆ/P
NC5o PI"rN{ hDejvbw^H{&
\zgzÇyyIKg{xg3$˾ċ0[Z+Å)Ws>|LEABB^@4,XDa]aAn(P#nX"'V+."/b,2 5VԈ-,2.IK`!i=N$ d	eE$x[VtYQCZ@1R@!,00	H1"Bđ!aYs A<iN>GLQP`8r;]H8җcǹ!Rҩ
7Jh5ltңD)S{tin34
N65GIB56|`G
6pҨx9DŽ2dH⩲-?tΞd@HNgFfϞNEg@ЀeL@q	{jr~t	={Awt#oLxd
xƺ!3D@.Lr
x`AHDa]@naa#'%r '(Bb+hS5.x-,CC!2. yK`iA$[ psA)^qX`9 -b!,21	HP #F$
*,qdKq#H>2O*
'N#&z(RȅO0LΝ-_$
cf˧…fwf)%ZIF	
:QƔ=j4{7~hp
xMo@

_6Q%>ᇇ4j @1xaˏ0hA=RҗQٳSc"4@ك4P<^bC]>]:8!$^nL >̋\F|^;$i<@7$8a@HB^HPaj"#'
Tb+/"'yG
26EB.Ԉ2_hO*D KPB,	[I
 rMš	|7	%pHG +h|1=?x! |0P!,21	8#*qdCq#H>2O*
'N#&z(RȅO0LΝ-_$
cf˧…fwf)%ZIF	
:QƔ=j4{7~hp
xMo@

_6Q%>ᇇ4j @1xaˏ0hA=RҗQٳSc"$4@ك4P<^bC]>]:8!$^nL >̋\F|^$i<@$8`	@B^Xr8P#rX'@)Rb/?G(BHr9. O9tP#BH)ҢIB),|)
D
&p&)1V*4	lNfB$x\ЋW0',\	A1"((!|AA@!,01	H1"Bđ!QCOYs A<iN>GLQ`8r;,+I8ʷ|#w)%ZI6ɳ-
:1Q=j4{7F'S#$M;lKB|x8eiԐK\cB2$,pa:Algσ@!RӘQAqz1x4(np!/n/K",%.
1ϐl{A/lbh]>B7\m&^0^W$i<-
	`A;LhPamr88
hxqr"Č
26ExP# Ѣ9 "),႒	D
&&)1D4	`N%A$x\BEWp&,k^B*q'0!,,0	8#*qdcPq#H>2O*'N#&z(^ȊO0LѝxT
cf[QЅA)laŅ;ttÍ-X$Kٖ(Qc5]MB~hp
xMuo@
_6Q%><%凇4j!@1H&8C0A Ќ)(Ԝ8
@<M7@4*t6ΖgH}!al1.o!WtS6|@\$A/,L0UI<MyI1ȠHNP&am?rb#ZX'2b+R/b, 5؈(-,2.K`
i=^$ d	eB$x[&tPCZ@-IP@!,'+	8#*qdcpq#H>2O*'N#&z(^HO0Lѝx\
cf[QЅA-laŅ;ttÍ-X$Sٖ(Qc5]B~hp
xMuo@
_6Q%><)凇4j!@1HN8C0A Ќ&)(Ԝ8@<M7@t4.t6ΖgH"al1.o!ʋtS6|@\dB/,L0I<CyI1,`NXQ*amȡ@~"#'&T+N"/PH/ҀH721C01?C!B-3D YLǓ`9HQHd_@!,&0	8#&|R821RH8k$h'=zlDB%QttGe.BsCYetBo[Bq"%:pDU3>yA'&JԘ"GMf1C#?dj]S|؛D)p=<Pcg×
vp	@(Ol!r7SL(@$M09L=ys4!"]gaI&bv?xN!ҁɮ$"̖-#paƜhzń	;$i<@7&$@`=BN8PN!&4~'!~
E4  !)1#E|DH	J1bP9CTP&8dB}Dy	}X\b!Q%>IC\P
URIeidBC0I
!,!0	8#*qdcpq#H>2O*'N#&z(^HO0Lѝx\
cf[QЅA-laŅ;ttÍ-X$Sٖ(Qc5]B~hp
xMuo@
_6Q%><)凇4j!@1HN8C0A Ќ&)(Ԝ8@<M7@t4.t6ΖgH"al1.o!ʋtS6|@\dB/,L0I<MyI1@ MHaE^Pa}?"vX'8bB)Rآ"C"
1
ElXA"1J0AG( C01
HCqRXT@/I8%}yaT\pcQC&QC\PUR Zy?IC0I!,!	8#|R82!T(Ѐ8k$h'爉=w6
r!'Q޹qe$As,}2VpᖻBq,%:pDU3=A'=JԘ2GMf1C?dj]S(|؛䟻)p=<PCn×
vp	@(ox!;7SL(C$"{#L=y(@hBCJ52
5{tZ9C=O3
.E-=ѥkݥ-A9&HEC<Ew0e·4)
)I<M	yI1;`R!,!1	H#F$
*$qdKpq#H>2O*'N#&z(RHO0LΝ-_$
cf˧…
fwf)%ZI6	
:QƔ=j4{7~hp
xMo@

_6Q%>
ᇇ4j @1xaˏ0hA-RҗQٳSc"4@ك4P<h^bC]>]:8!d$^nL >̋tS\|@#\@/,<0)I<MyI1;@ MHaA^8P
ġ^"#!A%'nآCH
1
ETA"*41J0AG()C01VDCqRVTT$"EeNPd^ЦUsQ7I5d1uYQ%P
aԜJ$
$!,#.	Hp #F$
*TqdKq#H>2O*'N#&z(RȊO0LΝ-_$
cf˧…fwf)%ZIV	
:QƔ=j4{7~hp
xMo@

_6Q%>ᇇ4j @1xaˏ0hAMRҗQٳSc"(4@ك4P<h^bC]>^]:8!$^nL >̋\F^;$i<@7*$P`MHB^HP
aj#RXt+|!R@OH1
E4A"b(1J0AGT(C01NC!"3D|`Y\VǗЉaToG͗04BxqA>!,'0	HP #F$
*,qdKq#H>2O*
'N#&z(RȅO0LΝ-_$
cf˧…fwf)%ZIF	
:QƔ=j4{7~hp
xMo@

_6Q%>ᇇ4j @1xaˏ0hA=RҗQٳSc"4@ك4P<^bC]>]:8!$^nL >̋\F|^;$i<@7$P`MHaA^8Pa^"#6X'|+bE/VXEX
0bEL;.4C0BJ1bXQ9CTP2*8q$A}DyN*TF!@D	aBTC5s*dg
!,*	H*\#>)A-|"Κ#=p	GIBp9bGϝ4ʖ.yYL9fVE]P\HIN7(L2϶4DS<fhXGLmkt7jl.ei-?<QCnr	Ȑ)0G=?HRkFFm'G iҠ%x}.gt7=p<CIeuޠ;\r1yx@(@	!,,.	H*\H#>)A &4 Κ#=p	G	Bp9bGϝ*,ʖ.s@9f|+\p˝opgNnQdqxhI5LQӥٻy4Ǐ7:
'n]Ԑe5\
)~xH
 ʐ!ig;{
! J={:E&!@=(O3
.E-=etݥ{㭼3Y.HE"C=Bw0e·4)LCDAt?^@R>8P>!F"C#.TB'&A+-*&DJ	@Ah$:#
ԢACtb@!,-,	H*\ #F$>)A""4 Κ#=p	GAp9bGϝ*$ʖ.s?9f|+\pݿopgNnQdР%jLڣKwg`ݏ
nt2)>Nݔ!;j ǷS<FE&!CO=lӞv< C4!R={:I.!@=(O3
.E-=хݥx㭼3]&HE*CAw0e·4%L`@C@ā
C]?ba"bC#2T@ t??&2&4IiTЋ*nȡ<B!,-(	H*\ȰÅxqdc8k$h'	爉=wF
,_tt'f5	BsCYtBo[Bq"%:pDW3>yA'&JԘ"GMf1C3?dj_S|d)x=<Pcg×
vp	@(Ol!r7L(@$N9L=yt4AJź3
5m;M@<A/=(O
.3@]ot1-=Cݥ뭼/HE-[DG”9>aB^0^<[<@^@R
(8	5Ѣ D $&aA,Bi*"4	4""{|P#BW#B-i
"iB!,.	HdĈBO
aG8F
HAy8}s z$>r%KGwZVs 474roQGA.6!,Rҩ
7Jh5Lg[tbD)r{tin34
N65GIB5v6|`G
2$pʖҨ!x9DŽdHBtړΞD@SR*ԙQIqz9x4(np!i/n/"0.
1>ϐl;A/lbh]>B/\m&B/,L0I<CB$@Ah!,,!	8#*|82!THЀ8k$h'=zlT	B%Qqt玞-憆1!r…
fw^)%ZI6	
:QƔ=j4{7F'SB#$MrlKB||8iI\cB2$DÖaPlgσ@2@CZ T=L@fϞNCgPiv"<h^r.eW.]
	nϐlB/Pe&PhCsS\|@C\@/,L)IX`B^@R.6Ѣ2|R$ ʧI
%4	)RD7-RtEb6?!,*!	HdĈ‚O
aG8

HAy8}s磠J$
>r%;w<9474r/_
.r7C(.ܙSnhj&'8<4GS<fhXGLmk
t7jm.m?<Qcgr	eȐēe[~鴧=iR֌B͞= Jt"ՖR"6qoN*$"uCf>;\r2yAyI1N bCTЍVA*t `aA%"TGB1T
c!,*	H
dĈO
aG8
HAyr8}s磠J$	>r%;w<474r/_
.rC(.ܙSnhj&ٿ'8<4GS<fhXGLmk
s7jm.?<Qcgr	eȐēe[~鴧=iHPkFfϞNGg eL@q{jr~tM{8Awt#koLxd	xƺ!3F@?@we·4A^!tAdP$PA8a
]aA &t*ÆxPhP51>T$"!,*	H#&|R82!T8Ѐ8k$h'=zlT	B%QsG#KI@sCYep-w0YJ:uFf	|CNz1ej.cFu?~4ԆP7@wSzx܆/PNC5vo PI<IGN{2 PЈ)i(Ӊ*N@<7zGϰ't6~gdH9!a2	Å)W.s>|	NAB/,<0!sAR$8 E8As
qXH$"E0\Љ
Q 	Ub!,+	H*\Ȑ#	>)A1|"Κ#=p	GBp9bGϝ<ʖ.yŶ9fVE][P\HIN7(L2϶4DS<fhXGLmkt7jl.e-?<QCnr	Ȑ)0G=ƴ@HRkFFm'G(iҠ%x
}.gQAwtgoydhiSċ0[Z(NI
f.La>1@,A^0I
I<A͆h)F.cXP@!,,	H*\ȰÇ1"I!hq#H>2O=zD/'ZŒ
<l憆1-)… 0EJ:uFf
|lKNL1En.cfu?~4Ԇ:@8F@
_6Q%><oʖҨ!y9ʄdHԠ>籝=Ӏ% *gX&L@=t7,IL^Ï.g7ɢ
2ċ0[la:,CS҆9>FsA.!,,	H*\h#>)A *4 Κ#=p	GIBp9bGϝ*4ʖ.s@9f|+\p˝FBq,%:pDW3ǖ(Qc5]?RN66GI	Xh
_Ԑe5\
㛦x!;7L(C$&aˏ0A?HjFfϞN]g ?=hO3
.H&E-=ѥuݥS3};HEk>藐;@-;^xBBh;PNG


IHDR[HtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:22A81F318C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:22A81F308C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>^ΆIDATxb?e,(R1fdddddTf}jUL9~FbMf
fV6cfLLe7gЂ֭2R&gҪ|l|XX911gdb0]׏/tpp	IK|'+U598~sqazͿ-}[i76@Y	5f:Uj3Px5?5U}s70eON4' okE@HJk;yraf& '
ąA͍4OY l`hdd')%_1!$[gk`o`"]ݓ@5#$gVpa",d<ŗ
kU\y9]4ag`d[sqE)rq	hij[\=.ʌ\+ߍb
&L4O)5,#T\iovpSqwb+`###3`&`Fm×@)oy6a'.YB[}x~u2AVA!7>Ɲ<JJa$u%Xj8?&V3hSnԲAc@|V#ĤIENDB`PNG


IHDR[HtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:22EB10038C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:22EB10028C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>}IDATxڼL[U}2'uc0u!ͱt$Թ,de!b`L%I0̀C:iB
\.Z`&߼sϧs;H
$A6kkkk_T*[8SDKzNZQQmUWWbYvn|jZ|&558fv	ȷnc_$(STd^-\ĸnUx?>ŵLѢ0'Y5Omۮ9s>gkU6/-}Jή/75\>6mw2"Nif`4>jGasEO1”pqH,FUD"S`N,4#M~Y=.:I+Se yگ^rE˄GsĚč}_t^Êhͧb4
⭸[J%1J^p[e#̽ :1>cy|-~8RzUvc2/8#%0yqqRMa)|}8ĝ?R0SO͸/Bߟ:c: Jw,)LUܫ2	>/A.Mj{P:o'ѰcOG@kt?R)%ԡW^suo^̻TYK94b3W|q͖тp>=jI-W^~ͤƼ-ޛ)c
]6`)p<8Zԥg{{ 9w^üy[`B0JyN"iwPp4D lewjj꯸	++,W.R*-RA{B?5=;f7ͷ}ݶ%MҨ
yaskA;AaLX9gfZZz>$)L
c|EMMM,&;Urr]^OZQnhhHE.,DbM&6&Z8$K
߱9mmm󭭭fs}hdKJJbiii`r^*ЂG;H5C."_7RIENDB`PNG


IHDR[HtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:2318BAC48C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:2318BAC38C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>*IDATxڼVkL[e>
^+踬PBbBc4KX/?1hhY4:.me"d0Kmv0!\|JI0͹|y}yA/pφSDtrB,@:*ʇfsfnn.)	@kˬAIaLjmmmUDe2#ҊD"p8L	;;;>*bVАOT*Z,s$IYHapD\__UL&^PR]+ÞC2| ]^^<p	Ddff"d P6Dc4>5}F?}Xg,JtSb`yݍQ*VF?2
]D"J7,i'jzVǧOB
!`d\X}ͅ3'VT2!7<G#T,mޘ^C>NO	6~nɳX=t*V"w؋W?]")B`q]z}I"SB{ˮúx3=f}qG$V.X7,j[JJDE%>xUN#0nM\u$
a(VlÖ/VeFVLtAGJF%`\)e"x$&h4!m}WW]Pd1<u逍N򦒼
CCCeJ"Xb6ztbj9ϼ{{LHw(b8[^.Wo6K._L1B|.ؖnQՖN:i1r49zYE+ay0vyrァܸ:WsY,`>v巉<–G$|z.7~\!s519l6̘W
mYRɳs4^fwhGo6c4ÇHEFmllnwm!ڡ?tyƧ---&\H,
So^nw\޸(EQNiw:!p?u8m6GCYn#
P~cFeill$%s3 ÆB!koXcWhzf=8IENDB`PNG


IHDRd<PLTEVtRNS
AIDATcgGe{IENDB`PNG


IHDRb	PLTEi	otRNS@f5IDATc
```Z'0dZBe-d\BHdVD


9ho3IENDB`PNG


IHDRBB:{gAMA7	PLTE~OtRNS@fIDAT8
 PBvءRD㣅D#$\BkQFФCf&Ez$D	YZ	ɐRuOEJI%U
D[s959]^.N	Af^T9ğIENDB`PNG


IHDR<vCsRGBbKGD	pHYstIME/TdIDATx}AKmKӺP
Q%E	* "Q!V	&Cb$TUUbQAN888g/ѽ<ޞ}o;#23=L^12(CA\.W\?$ny^A0  8[zpM*EhN'@Z(0$E8'1ˢqP\v+ID^^ιt۽l{e^Ƙe}9HF%ټUZ%hU&eUU#k
~FiyXkkjt_e}r?Pcx+|V[إؚl*ϕǭJ"&ho{@RDZTO$JDո8[2~ƦmzZ+cM-As}$,!A<hyWS٘\- խ((:#@[#h}XA  @+#m-"YCQmXfhuXhjX%IB!",rnsS[u]/xIf8qW/XY}ֱW>nާw{3x[([R{-o݌znƽ7a`dͫtE*?
L^ږ5VB^|A0W_=;\79{μ8C;w8`X( (mnG`iUt?O':1``
0R2#K]o{Ycl]##k9'//u]c3WWWT岞{Ew3c`༓8nm5(
#uuwmhx\jEIQTR 4\.˗z,&aQ*hZU8+QWH33}o;{G~jMjv`uËhq&g$Q>WWkcMi6u$!㜡3V*T*T(GXso_uö{ν}A~
=G--k TW`Y.qnn1[qĄ;}BA3/hGo˯W8w
Vc	@1(C
AH&yOnť1mC	9rDrYbQ}}}*JȈJ>
ΌO
z>y\ mZ|>|.ߑ-:R+ѡVrx1e
?::?~\*$%w&wO>XAI/vV]*i6&-/<EQt-̗RqE$
j||\@ώ_E?墼
==ڿw$izUss^o_Ij@K3()+\˵*JU\H:A=7Wy|+m~`GjtyOSSSz,@2(Thu~A JsQ^ӞҡOU^'wFyOQ5MZVQ. -?{__
&&&4::hY\%-@#RY}I}G43t+͙#汓"G:ZA@
Pa@u$k
Ȉ500RǏ/2u+_7U[gzfV~Ꮥxޥ_z3ڱ}2,Z`eeAXvA
KJg|k3EJ%>|Z:ێGVT,Wݥb0鋏>lx%1!@njOĄFFF$H錄I;n3zEOKw1ow%f\|jhY99Z~a:M.}L68mL]vmI[X,jhhj!zϜ~Asڻ_g^՟?\scSO/`y5V7 -+NbI͵W-
uMç$I'ժ$ix1FڅKt}#)	ƀ
5,N?yy>|Aՙ~T݅N?]v`SRU`f"1
Pa/(IʊXι-ێFmcM-$#Bk,T,)RM̪<[U5q}pzӺg蠞oѓAZջ]ҍ;o)W5UV$I\NaR,!z޴eKTTU_ˬx5B dUF2J/9QP(P@ueէG1J[f3tPnc_}B_ԮˇWp"-R(NbEQ:
Bf'\1Fa*
եZ:甸D.q6Xm69VC%Z!WaX[416JAȞ$p[{Uww~]$v`6?S,i\]ҲVHAHr8彯u?L\RX[l ش.XZqwE[6YK/^{Mg۷BpS-wΩ1K	@[BJ%b@+kQe_(MrO\jOڕ^qKVh[q42ral{qR7ݸeս+I:q$b!ν;5V/4IIcMAKgmuVK>OR|χ^\eqJ8qaמ~fXaHS\𪧧G4=='Nv%=ӟ`ha0RA^2=OKcwˍ@-J_1\umNr~	3/<>y'X«!yܜ8vB`luL.S`vu|zjF<%4UV(7>}odЬѶ
}kXU}ݵ^xO\Qf^Wd
Yh܋֐M]b.o.󶦦O+;Enr/Nw$h귷}~/!_fcYzYP_\~Lo>XZXu+/9򀫻]7KHz{{6$I'XZ0]Ϻe*JN=sʿ曺~Ԕ;~}Ö"،JV]eU+8_t-UfzzZO}[_"hJIgue4ZhEhz«!K݈+qK
lzѝF«!CОM()A%smDx!V" AΦͬHc#ë!
5$455
t$G?g;l,W`«!@V6;ba-g«!6@rMmux!f!Pո*\*C@С8V5nszSJDjUqRWUJD9f@Mpë!64I)t(kE5HDZR9$IW!5FA(C墜 `vDXf	MOOɣO_wu7'w@*"se#$K*lZCc
l k(5Vaf21baCX0et	˟6Ptf2Xhؑ
@i*XӼif3z&لW9}IENDB`PNG


IHDRRf2(IDATH1 ? mJr\.r\._>VacxIENDB`PNG


IHDRdJtEXtSoftwareAdobe ImageReadyqe<
IDATx]lGjR#-PU
jc*>`#

QBA NPUZcDu=_
ܝݝٝݜV3gFs~{;3UW4%<Ն#f'L^o%{|/mQ84M{`8p;78Nlp0%CHsPȫѰ$zt8=?_u8/XrzH_Yh}@`-~(?1	#,ZLn) >,Q.T^=z 7"s{P'Ⴇ^jg˄CcTZg#=#eXԚ06%<j}8*-qL+JT~v:k5+߶KߐO`ܡC88T1@|'Eީ$? "p04UE,uH;,e82MOLQpPE,P=W`Q,=JPE4`,GvR}ȠKQ&-գ5r:X6QSk8!TXI8}1տ'.TGpTTVtBe݇&{@
pp/e)8jzpH+1m#(9.jFd8*z5bƠozs{ʆiT,hw3aGln#b^QqW'^VxV=1~Ƀ)nH
a}vp)U<lb@Z@S*햛-p =VQn+^
={1	YYakum+dž:aGqmG9zsXvQȡ'(kKMH>^Bjw(&p&zá e8bmjPY,rׯM477'	>2\YRÊciw{dUАt.ֶMnllChvvִ %p't-dSȞd5Mǧƽ

RxXqDS>^(6Wr3(`VW&nnn֖ɀ
pL[V#zzRO8n6[/9F"Snˆ!'jY#)ڋzS$47o&oS\(=x n}>2N2hhMo.Nvwx~B@KR*;\A8:j\qo-yۡ#Y-%l1VOgKKm_s(ͤQe5KpرVr/̍P=!ǔl&)l|-E[{>è2c2y
?2+	2E98(|pأCkNTw۫!EEpP0J2Z6Yҩ0?Ջ\}˾Q3WBD|y%wpi%ǸD	r&XLD"
Llt[h8b\D0X	pyᨐn~5,ZLw]-ھk'69H8R%)z7Vm<-id>
"̮_&7_EXEeTMথV`&!
&U1v$Փb[
{z~y]
hɨn'P2vpTAH|| yJ+p];M%<2ɹ2br"
w鿆J8Aq$yZ62F2;;)khlRs_I8;NU<';p0_2oz^1j>|	0c(*ة~gNvŕ1I&/N\
G瞟:aL}<穒2'?gzQ%w0VQU7wj8S+b[|&CFO	gwȤR2pcbeM2CiuQp@{![Nr@O%b
 \6M%q1<|:%V"*b"H>XP8'appɴy72psuGșLJ:cxaBqyGLz#yjDp?_q:}8?px'U3o#+aܐ2褒Spr?[Ο`	KKn:bf?b9c+l+ïFݟ?{F8,	MU|)TiJX:Phy!Jps7>4q6+
+Al`c8X<b8X,pb8X`1,pX`1,U:
IENDB`PNG


IHDRx[tEXtSoftwareAdobe ImageReadyqe<+IDATx]XUG&&&w{
ذػ`/
{o^PA*RDlK&F|~޽[Μk!4?(5&5D&hDhM4@khM4&5yO(9{7o".01{AlhM>b?|z
@؁ڴ	Mw߾۾=6V(M5j_?څhM>߿{ׯ㎯/O@0Az}.^'A8س'vhyb\X&Ϟg#]IIp潓nƝKkWԩ83jMEeA#/(`{ԯyY(@g2.~D]sq?&!NB]sqi0gƌf
n;`;=;>^iݓ#F`^ռ96TŋcyXBβhQwO##9~Kp!Ύ͚5S&8ӦE^'z
П :~7i,Kqe\$OGu7eoɏ?b?c}z8ڿ?~#SiBC	 ësg ehZV33^rcokkxZZb[Nٴ)֔)3۱#N:91g}.&	^~=w)ʃ{pbq(׭S\gl#pGmlpwox[Xp>˩apjp:TA$Zq}dądjŃ	>W@xMc{{eIJnPIIj$@ˑspX
vScoC8?sfŝ	,rv?i8UΊ:sF	xcMbEl]Y0S}?ו.ի+-My߭HcXFdȀUm۾[Dҩ}ml@3'sPu[-rI>9}9-EB[Qz.lYkE\L怏d2A_vbY,KriFCC#=X 4Y9H:|B˩L>Nԛ+U%^zWRӹq8H{ML^'feqMp)Rժ)mË79spљ38&Y6+rYOWe*@093gzJbiJ55UϟM!jvN1xgg<xub5hcEufg܉ 0jh"6"t>C<HruwLjY1"^JN9|x=̅%tCH(XS$&s"
dl(!;:n`
<% &hz3\hS;4	7ݠ 	hcc`'ݳʔ(Gx<
DJ@[6ϝlympMȟ:sE3e9LgGf
Я;~~*"`N~ Z-\*+bQW08`)x7),"w\jiDk˫iɖcs]7	hMSz܂e%X/
/scVxө[[Q㭧$3'*+YO?*>6`Lj%)AիB^ʠn|yjVI%l$<sF¶
x7t'`5B*:Fpeƫh̵y7or~/:;c1^=fz0%
|͟/9P<:f!tdw{Ӧehf!d^$PvzogrBȂu,yv"y_%|,o^	.v͒fy/	AZuuźrTE!@N@gcPѴpqLj&^\܏~ϔ%9x:hn)g]qTN¥D9l%`U |河;9ЃfgfigyG;֟<e:֯Mja1)7hBQ&S"!ܧV;2A$nWNrJ/,Ԭ#Mh&Q+pad,/ZT҅sF׭뗯|ZVb	@\;>>*FCEa$R)[;H9NÜ$l0T8,lK5;Nz'_3#F`iBhfҌ#o-7&RkVcGlTI%KVto'>C`W˖pƴǁ{SKݻXN`7wq;;\/\43'ˤF~?1.(qY	ﭒ$bŰVlɓDUs7qݻ{}R_!ـtnП8@:#+{ϔ	Xh~K,WχEs%)߇>ܷ/\Azl|ߡOp~7pj52´`{vΑ[H=|l9
(ɤ)ɫ*Tt{8/֟*у"<|{gS?	&=p
$I-+c:Z*	iQjÕ<u߀MOg͟93:ސUIWpN6#{	2OgNъhr҅?Ͽ9oެrז)8D;w[CW$WWlsZM,r¶ѣU/h2d(
jdee6uΒ.6\u{뜒DsBJ㴓J>I,s۷cYZ2d1crKڴ^ݢ	nHO3#GbI<* qa*!-Oʃj/o"o!96@d@'3%e%\uy\7G:̉& # UEIݔe
D"=5/7FdJ<h<X1}ӧlNZOOdŇݓC`CҘB3.;BjÇWȽ`$
254PZ8|?YĢKݨ/a,^^3f Fh,ٖ/xwpY:-rĆ<$?szZ;Ed(٥}kW̟_$KΚVhBO~=4@8H|Uv "LùuTc
(կItH(N\'+y$#=gΨS/d5lBrvcB,KD2YZb6)p]g[,r[*
1Uv+=v->@zX8ʒ`R&\2dPa
AxYUq ԩXU$ΝNrIry<u:tAibA6KDV;#T
ݷO9UsgƘJ0F!5&MeWWD9~yny_~fO?d	3ʑ	5%JG||mSJy'hZN
v}Z94ǧW׵V25͓ʕUHɓX[9P\z'5x&ٰpa,̞]8zB֬pkH$ʟ e8xNu +ȑ+
Ra9YXܳ	dL4Yj5j`wavAsqt*jc9,Hc7?7XrJ19L)p8H"p.*gM%(_×`QM"g	crСg.
5	#"w*UIٖ03Nz1X1x@ڪjPC"@eERD4
B9<A,wS6逺R.ʓG
Bsi
̤'w*NNZuHM'NDGAU{y߲ej777{DX/Z,*zrgglkDmbNGti8I,z^ {jSs8L+UJrv&qrZvhwzkRW(ϋh'菰1#lC8rœK!vg˖XN.Lқ
Ab*+rċNaYٲ@*!Ȓ©ti,a{%ׂCв{d=M,gˡ(t	P1Oz|#ZFIfF-N?B|uW_r	_^W"fObH;6D,4@&HVW,RhLc'$顫jIjq9UKJ'PqQEƐJڥ|E9cƨMrB9 {dwN{D>8-6UV1>"kS 9ƒ*7:k8ʛ8ܻ:6v7)ĖjԻMZ?|A<wΒ:&~OJB'hedKvƨHN&M4@$!ޘAkPljZt1FjV\vș<҆	ټN(إD	ig}'OjHjf9WF*h2+;v`:Ϳ,>;!r6Xق4Qz;Z
	9@vGl]]D'ZK~+WT<9#M4@V"Ο.LYte\gN#geŰK۹/k93F͋
`0zv` NAş?H>}isa
B#>C@Iezc~Nּ9Ìƍ1C}dps,;~bbS>qB6SHJ疸96Wox\I?{IO|ob͞Sp&Sm+37ã^}w"l:
zI"UTޡv/$De#L<-[he?9WSTCÔ\
1uD1i<x:5~Z479 OSjo5ؼ,gnɠ(%1SiK!^ҕj~g[pz?Xzq'g [m[d
)q?65ev5]a@P*5_E	h?9@MXULze5ۣpC:mh{*r%Ǻ49+c%n\.Ҩ}7̀=hf399vvx
G	Iq=4VECaP;6
rL\"D$ 9(#!)YYW/uWHDݍC$˭۱%rhUL9!QqF)H`HWӣOWQ|RO<D|C@KVisGȶO%qz<=5ϥ|J+Q1ד_w:浀ųrg}03V8-!sb )#\b3J
B@7'?-tC@*ZNHm:#gd1#8vvI\w`,{&=Ъ\3>xìM}0P߁7e
N^u
;xGmyvpbxN'}=4
K(7XM\_r<'=\
YSWEy0'R@(68kc4{+Iv:=&ߧ`v8##cUKEdk:ug-q<޺)Ķm9p٬2$UH`ĕu^E[<7i&mDnt:Yw8;_ ouCYrַNE(|w*]&|W׆\	y%@FD"":.kPx
7C厣P9SHW'U}
~en,cɖOMsT럋%_c{h3:GEq(b
zMN)-^+w@A>j):[R&`)';wn{vjqBeDvՄ|2
A8'ϤUhl=86Ymk?l/4FOuZV.4GP紕嫰-T&?5D?u=ZLs"Gb\
lۣlQT8tHIqsVcq0l,Cg
bJ<Cv{7꙽T7C:uclv"H G=;5V0Ŕ%S-ȡs7rBTl",GRokZZ*["m.o{4ï&QY=~d1GRW׿@ms/F֬Yfo)b_/Lf#K5KPϖu"@J⻪8rիBS._tg|QѲ`s3Vy)+sa$HilN,sOʁӾPr*鋷A	J.EYM{[j#Qٰ/a/~C@tNe۱Pm2oE
~Ս곋ZHS9b@ob&hb1U0jr4>Fqzs{	w._
_
*/+ApoهԆYjX!{K{ic_:eur(.y.:ᷢ0t&jP'h6i*T,T۔BXD)tjq(=OzZ˘H}mk>V
g̗h堀%Wϵ⧩#Tx2T4\ʭ>;ynstV55<'tX3,ݰR¶y5PJHQT('tN[]9-PCs^a
cӒEޯxM/Y7p}/N^*֌zf(ӎd:7X0#)ߏr}qt*_v䀈NSRc[vJ]Cs>/KAsQҔc0B:q/>-+jSgfC_״1A!CNn8@c4@t#}VXXNcCl&PHS>FZl:Y|~6/ZGAwE)/|~L\Gq[:EQ69`UFO:ž~GO
;A*5?LCyI	U|t]ʩ=~,.G/^X[V(>'2{.zQ^mjiTj	t%FvF4e锔ʫ?rn/y-V:t"345oVt4*B2T)Z|"ѥ`,x
JtAz7ZdtBƜDf
iZ+eE:KsrLc2:-D*C:s@EŤ
xjitFZߐT#2ikH]x+<VɶiKw#oÞW0wCiK|M0Z&#v^('dkGd٪&UtEQ!¿z>jwKC	4׿Н^h~[kvE;/m@%69'uוo|tJ
/PѾt t%ϧo>G:Gǰϣ"'r7DT&@D`	_otEZ!M1j|~.M_U3|<)쉼
QcMI(jb/} +.=QV*oc=sň^踄Dx
K<*KqBTl7?ookZZ9sPx-[SK:z{_5ФtvMpZ^RPtf]j.
X_8(
Lۉ!#0$;_pԌ㐹*VT3oF6κJQC}	h["HQUN-iGZ:{_U=G.N1|-E?`+mۘ25:MD#3'8A6֪֨Rݰvf`5ʶq+U
]=tz={qއqU<E-E
BZNL[Lą=)ۡJk[ddee5`@Ǒ'S;F{,YԌ	'9A?]ƣtʖo˼^C\(%CT'ّu)B3t[8
=OCl=Iu%11 ס|QzdZp!s9IlP#~2
ׂ#U<x6HS-7w 2*6+lSĭHxzoƣpHGmhP3zH$_Sxo2cC	'rq*na1vZ6KDF`o'N
ZhYyr?ͼMm?-RI\gU<NQ4e)4y	W<:6nJ@/썼vt6nB0-:G"$*V9=eENΨ9::̀ߍ[?I]^BIW/VO-)$voꈾVD5jl.w2Q7(6U@ѯ8
1O?i5{OWs*(llb۾_KrL6/Q-vK&ePW8QI5/]6ԯ.&}\%vG&DZ*)+ait,+w:~thA0{An8i))oDpcN5?6).kЩrH=
d:Gr3֓„yi8qII&=	]J(g2ftd,yX$vAO:Y1INLU/{:vǢo~wmԽJ%b)?ثVm\nZp/Vm#EH~FQ#XM0ܟeif)c(ԀHۆu}Zς%G[VqSk(,:0dVUfl¤eu2y4edmSPHdwڕkK`E9s;d󑵺+9W|B62b
aHDg:y2
=}x3(ը,NnT2=XURx7,⻊'/m`'YG|Jݟ?U
ARtm^tE׿$ARB- yXܵ`0D"
:dj" Yr~#QkdRdRWd]EF`d)C'S?|GŒS#oeSq6ъAp̐Ϣ-xrƤ_mU\}7x!n2NjjPϲVy(l"ݽfaj<
@#{TlmJ/(߲4rViUQٰZZ8s'&
(ܞb,`5|B+O>m9G
֣ܟϩ`hRMqWG"qI`ڡlkny?ic%i?`+sX՞&,{n-,F۽e|AݣQe_cڹF''7JJտMER*Մ
3y=8
!l}=]P*.V=א%؎ftw6_U
6Fwy,]ը?tq]6}Tx՛p-\.]yPkpd,9ߣVnEgO 0e@Cɗ/{,g3~!Vc/z|V\/eeNjp49Ր%`=yخ#pT|#"KG2#nǩ$5ma^U9~r}oDr)gG(\9qszl3&SjIhM4@khM4&5Z
КhZM4@khM4@kD&hD
КhZ
5&5D&hD&hDКhZM4@khM4hM4&5D&hD&hD
КhZM4@kZM4@khM4&5&5䟐,OIENDB`PNG


IHDRxԅOtEXtSoftwareAdobe ImageReadyqe<1uIDATx}Tva`AQDb(5L(7\%Fx75vc"bҖ]2;SN;)4fgΜ9s{:ّip[YpdGّGvdYpdGّGvdGm?XW㴾>CXkܬJOhXY9O͵r8:K]]Z$jkXLgώ
tYV%4
'b*6`B<ȑ|Q?1z4@G8Q:أ5vwGxeeRc
ZOϣN
12(8^؆L>9i ADB	~bO?߹3ޮ5
DgY~WxCXQ^ JSN
̛=],IBGNoHֿiS/'vJI}},ۀѐkiR$\
L|3cƐ|3g}hC	`i~,8&"_Ӯ_L豘NC4Щ0\9(J*pUOqnwM.pM|aw8TUu:xa
1"/5خ]ի{׮X4JA$)&(8Jx{R`zgʔ/^CCCn N	cǍkkn/*r{<Yk0߳jU(	Uu0Ho0>_8!zaҏs{$EFXVߺu,rno8(}}㥗JopdPauwǣQcw:O,!â5{_YV	AH9&/,Z$uj%%
Qanv[`"MUay$bg
,
:|C`C|k‚/.Y9n\IQ.W<E~Y?!5]O>ٽa/P@:kKENp_hj.{F(gN7va&`8=<&j9wl"iv{] B=b
yEuedquw6n>hd:&V?O_,io}KI#@QdB@5|x"kW\RTNM=~cqm…UpE`>,YEEZKD쳎XN樗B@nrs휦	RH'XHVxI"<QĒÀ4668`.Wڡ20>xP;@V`p/~8;Yq9V\C?8gxDs3AdA{|IcpM%s[0M3F@$\.TDSSs{{/85
1@{VK#W?+Vp§CA50=z}>b  6w/:Krо$1g-jbeeԷEIu#vSh=БQ
lwЪA顇:zJ.X 94ʞ=2ŕg"_]K.-MHkMMMo/|'KiZكN>W*C\s
ǁG{ygߴᕱDAv~8|4βm<4Ng4	ǎM5z]UUHhR(C &X}y +VGsNTy$?&H(AH%gj

xys
:&gHF!CR9n#tE
_:a2$灟2qذAc{)yٲƻdx%">@ .nI/;~{{z[ZXĢqgGiVP
;wV}7Yp$sun#ӏ2CP:aS?@c!B9B!SFŀNIںx]8N<Oa.:J-O@<TϚ5YpKR-Zٸ@idFB	zs,Z
HlWzCq}@sиڀu9!~<&	k 3ԇ
O7(J;q<gaܩs
FOaQN>6MYZ(ʄ+0dFe#,8,z&`jg+.N6"IuW`PvKg	Y Ww_vpx
7ĆīH NA8eH1@^D;E2GJ0\FiP$ZE`CC! 6@8h`jK2
8NFO5C7$NE%|jXU&Hd8˒{<] qI&_Z!մ0X<؃ZR:pZ\q,"f).@Cur^߽[jʪDwH'iyfUU7
rn
0R7dB	]@eH젬(ѣٴp{{KCgj=Jx4JJQᒺ6l8nڴCO.<Z$5:i(-N/Iْ=Q7qiXlD>H=	9y,8H'-c)ȔhCzap2rLbh/nHokK\v$)	
u8dpѭ]K덒 dQac<[2t9`
iV{}}L7|%b&![T
iߺ5R+n66pXU>l<gIgzsrT
Fybƞ~8AK2O#
bá6ݞ
|a=7?Ax祮>{VpD֯oZ\MMa"ɲ!CĉQ++HDʛI^e~xHఖ4#ݗF4RNHخ)]\,eq*XÎ}t}A:9C=I|;sݻ\rɷ񖖺_"⢘0;b?eTT00]_pZ@aMjŒ,	,="
X5fVM$mT3+V8#0{VU%j&D55
'ҿu3)3`]%kCط2(%p2*Mab(h1x-cU0cqs;~<9ŸVeHUf<Y4ѹoKQ\R3ϴ
bEc8sbEt44|+X9	ɝqc^ΠP*,䯻ٞËJ#.KDW+g.\<d#(z0lh<8ZyԵkWHV1yf._.ISTAh,i(cKFQu[ߡ("!jùOWJJnknǸ/>@Ea(fr&<p .//1PX(,>@jv8޵KBr?oVP		PɋpU`TɁ$ШK&籘HPB{a[[E*64#w)m߮ձ0lD-H	#Qͅoǥir>+lmmロeD:7t(~dݮ]:B3g,\no?GU]H{(hk)Ut~XuJ\~?wYOlc#{ âE\]d׭8rrnFY nKZws\ˆa@\(HWCalsornfiPNY4C*h:fe:7Fs8ORUUG]rI,(7v2#Հ+S}y$obCAAӧ-Kbc<3}z)5kv1$G	͖ڳw8~ʻ[yd˺u zW;u]4L ֙V
r35MyD''XW]ŗIoJ`]Fۻ&\~y]=99-Ųv\Zجoݺu?YΝҩW_}9[?arYLE=:5˻hٲH?HHUAE(8NLXW+%L03hPJjpo׿4,I] QEBՖ}n^0ņa۸Q[uusaq
NLmK=nkڴTm;wƑsGioWև93u@je9${f#ne8
hða'qFj%c-C2l&0vuid4_Kt|q&VIJ<^š5JZn{EŎۃ{꺌޳:ȗ1
%<JEEɈ-_rٵWoyiP(Lv,u3+֌&R2e1tiTx=sv숼*GIv|ܹ)ZSa|"0@&U6lӨ9D KM4Lnwَd':x3 t'W#TYyٯ~U6mo{;%	0pOӜE25 E+NNK'N<:?YXk9}y6~=u+<Tg-9seϛo6'mj4&A,\pFq'ݘ9&"-ls\1s`"4={Ɩ良/G1exŲ~
*T[rZjߢm%#ۈIM7{&\P=$]fw%R-]о}y'JL<uKCJL*oywl@<?BKa‹v/vY\M(~zJ@F$@f`m0-
	ņL{'LpJDyGݷϬ6#Q\,O'LW7Yqivժz,_̜T<	}^Ir:ssq'oyE2#>fڴO9oQAg^ufy@_Tl_pfSW##9`k`	`׶mwdZZpX4는(A\Wdwt|D`%GqQy'8?
ĝg5GiMQU?L#m4W2k"Q8 eND$(Di1;i ʃsmgG|͛c4ҨaѢ^&?7nawtrt=l~ΜмiHI\rrj&tQ>X:sdY.ÔUC1‘&͛X,3f-+FBpHa-64V0qF8vL	tI~<UdM&>Fŋ8}8bD1IPxś[nUOcnYzu}X$+-e-d56T!4dShV ÍE}t#~6ٳ gr?6?)қu`%,mmܹ)'ڳg믓bÛs=24+8ʌc~ǟyfDŅTޗHGGoUcGIN9̀ҁr'^t9Fz5҂z<c,Y#5)ky9Q|}=SS.p]`{`[4=TџTV]KE1J.a^pUu?}X$xnͦgJ쬯45l:xPy 8.q'xͩ0<Y^^<s&3ƑG056LCX.PzZŢNeq*~zu߾ >iLĀ{D%0Qƣi+Wn\"hO͙Ӭi-Z Nix#͝yLC*hF"K:`H(3?RG߶mq,~iѨ$bCK[$@6j`˂

+4)'ͱ-zMC	tzo}}?4pR.(pe2xSM
}[2eg#-6RN3>lxOƧ֎
?`IJ0LQU!f*j@NOg;/E9L¢%%\
llQU	\LGT*>㌒2M;?*UU<㤴ڪQ&ٲwA89.퉣C=i<	fN%E. Uc1kNU}}B0RO3sn՝W-ǖ?`ySy{O+/\v/di4i̘ۛ*+mH6^P0rdf	Ιi.+
Y]BaG"@&4e%jtGVf$

4QY$ࡪ8?}d20LYPK@aRw'uMһ}}aI
4gJso
I?`ko~SOU5n.q1"PjDx#ow%-д>Qt	db"2:V]yezJa
e>2`)|$EƂzNv:pX#%(Ip%[vm:ܚwժ.McO;uj҄ TNAtn3 Ty:̌x14GÕE)be}O!+XT4d\㑭1>0Wz߾P.žLw%kB!Vm[nߞCDq9DEs> Jet,.]HбcO/9A8j锘Vb
EU|qJԑX{qRpFSfpԄ+sSO6p@#%iFu&;*+]'-,-Mmc={8jrԅ//92@$bXj&Md3[
R<IrA͐y&
uֆ*+̛w)G:^4^qOa{yUVMҌ=y:TǏyz:::Z[IYD_5kמl !ڪ*]Q4b%*	G4
V̴%K&_+@;	RDC
Es!=y7uUݽvmmuuMuu}vY=ӍQ80U(斗:uԩ
^z1cĉ\ZPl@%b"OƍVF**[Zꛚ:¸3Pd'R.v8tM"1ym9%(zTP,]=2Wy,ncɮ.
++]Uu\6jb1g Pih޵nd!@lXFeFI9iD%G[ނp
xE)>;+W3ɰs≮]Κ"D-?T+L7hbOclf{`LANfc3Ӭ!@ݼkٵ}e#^<dV~wuuwUUID6j60W%bkZKlhAl	|s(#ht)-WTa9"֞-MD<'^xao(il4MK1\99oOY8_۪X_~Ѩ#Q:t3LeO3H\x8Uy+I=86JCp)˗Oo8i]okMD"(v-X`T5;wqkFCzYNp<㸱g7jcl6'Ib==֝;7wމIbEM9E1tTҴQcF5xŇDq䃷0q㍳zaϘ\R4
:Rw
 >˖LsuѮLmsKJ@#0{_[bʕ'N%tWU{CP[[OssW[:EtXE̥I_bRGf]Q86E3Z-f(BU0Z0hYVUKϾnG8eeTk(6tT
:^rdhoP,|8hc|Ͳb`n߾^L1ڷ~}BFiQa/0.,1,1S;phY8Nx6FAʌyC72'OxW:4gҌ'Y⋡^v|<Ae!Yw0vnٹeVɘJGpLa-Z6%)s^s G(	4lu8T_$~=a3Y@\u܇Spˆ/XRcST2red{|HQBPxa">)իVdA#ʆբ1#;8rZ
jpɆE"9♡^Ҟ4"; /4"yd_=(θ馳S{u}siY"FlXC64j+,ӟ|LD$WEyG*N%,2A p+֍M=5$FJt1ݟ@A 켈Ҥ|`#XfI;9ff4x_}Cq$RheBBaG:eˀ&괾h0_WWԴ~ǦM<-A3i[H
'Unq:J60KL7Eq
tF;@e@dqsP
qNP`r?d[Ttp!|m[Or7w%~CU93cG,*ۆ8qLB]/,[̃GTR`<u=ȲݪƄ9· 
آ
a=CR9Z/ղF_,t)-Fd	JeigcR}譮t={6I	fbxJamu&:L66q<RO`[<椒¨E8.QOp-E\ԣ9hP,AͲ`~&B,s%'^rɼd2Ǿ0/<lz`鰊^]dNEմ0߇-~){ؘٗ
_M:33Sx4C=1ZNVɒ+?:	I/я|C~&Z-@oMFby}F*{1vh\(G(3
F/vr?ڍ:ݤ>O؃ϲuՅe[x&]5}VHԸNNOkҼ+.H5dl0wYO6m\[[zL<sRA[l<usM[RUUUm۶mǖoܼs;sko(3f\tÆWXvC@G@:CEl1,[Ql69i)/5}[$=AxQ+֢nIU~ԅgxcf^]wFQ6$IG~x6xgV~{Mu?~nRllٲN_|e)((wC;, _'(:
J??_P0zCիyAPېc
LoYg,d*ijp}?p[*tm`Ut'c(
f.NzӄN}ٴ+W{Ç_bĉ;;;{F}W~z/_~)n>G}tׂ7>\H<{w' Q֬^~ٲ@NΏ,Ypmmm|^g?!ֵZERe׸{֋w'oC$&٦HVx)b)}NRM[WU%EreW\Qdff={vOObmn䝵L:{޼y7o_ؒv}ݲ|sKk֮]h~'b1`ʿ֯qٲB׮]{g^xEO?p_c3t'ܶlY/
W#Y0p(iGdL&d]!8%j1bGB;5
,UG 0y?3ʖ[!s=wO?,++<ҥK_|-[nڴtʘ8a©f
lA0a|L\1bVP:>~~qFHK*vF2AlTIS:6EX7-.IL4vؕ>p꩓.sW!8cE%%%)Nȑ#?ݶ' ri_[=bȃ +k-CS?}<V+en}*f:l馒򖖼%
tM½8%ӮzܹG3S~~> ---B zB!#IтjWW@d@NwM"ypƿc7e?',Lf@6L|?f?x,C9lbAQǎh_>1\U*i777?O>[nϞ=âmf#@BloXG٤I3Qn"s .tߗ4䓋'Mx-c"v<\$)LyVQnHFYO:i痕ُDx6m_;/bx+n'ߟy7\:fOvٍ7׿'xW?jx(Px"2ߚJ/̜YknaA>qG*=JFw̩]tOw;VUWW܃?~<[W_]d	0	&`q7ky}]uU. x";x!f_-qCbI4Rb	K;7{]fzD___8ŃHvMFU薇IGʝ}My?KKfrG4߳8揗,{ل0zw1a@`qμy
`Ι3]0qA|ɿ+.t`|r8)R^^|U
߿QvlţF?ǡ֊wܰ_kkSNjU$Z1$
j,]E߹'N//U^j%>כ8FF2$J$͍{e0^^}==*uy
A`@X~Sx7lXǗNwq9S
ePHk޶wݻ۪kk.ݲjQ.L
k	SEEaG*,+O()&Yp+ utn9Qb1¹Sd.\ld80|8	0}AoZwwvK==Zo/pYYQ0
;ݺxhDp؜onf1ّGvdYpdGّGvdYpdGّGvdّGvdYpdGّGvdYpdGّGvdّGvd_~Ź{IENDB`PNG


IHDRxԅOtEXtSoftwareAdobe ImageReadyqe<IDATxM1ǍwpI.=ƃq-E܊Gp#PPAf&JgyB{ө$C8p @8p @o}	~p6,&|Y_~]!vd&/3g6m,WFiah#iM/y"8ĖU8bgQpp6H3<#5g	53r\4b鄃`y]nsxR#IWH=E's+a
yI0&A5q`3~9M\?Nh'Vbx~X%YGvdžIB!PtiiUgr
sl"OS<w<M{u8ӳ&ݽD̑瓴HY[8SY\6R8n?~A<'^hq'wqYNg8:l"_r/9,u$vFJu&2ҙ.uċ/#;СӺ+4ilt)NPJcgpne!K`棩I@tᰯX5N1ܤ|v6e؎}V}i2ҺiXA:pB->npV:}>_2~k'6(p$W3&~e_*9ĺB%p1AkDs4;hta9>8ܤ&>#s7!wp
R4Q
lwڶ	l(,wkuÂ0ITvݷuq?{KM5
QláX1&(>=}e
Gk5GÓgM[dxn8"wGw
ڨV8tٛwHac6+	nMVd%!jQ y'Wͭ$<Cv&;[#\VX	6%[IuaG#ntO8:޽	U*KOj~uc._QpCOcȑ
KdJXpꙈ#=;?NzdgQ9TPSQ
8wي<g`-?*U33cY
‘5s'`̱:mJElx f\(zocVv#^5O`Ick݄Ex^uRXs0
bbOr!'XY>הdҦ
l%xj^ܳxp`Zݫ>@d	lTH#Gl&8B>b;p%O{'EsҶ08|Wi=f;$ZX$g;/$
.=[_hyz=@,8p @8p @8p @B8p @BZ0Kx/IENDB`PNG


IHDRxԅOtEXtSoftwareAdobe ImageReadyqe<IDATx	x׵BHB
I_ڗ&%	I%im6IIkK[E6LXlC!K3ؒe[-yWY,۲d-sgl,/OGs{b.p`a80X,Áp`a80X,Áp`a80X,,Áp`a80X,Áp`a80X,{mvqc8Lݽ5VG].ҟ
ʃJ'OfY+hynՏ7)_*]^H/;{"r>;wsܗ=ڽ׼n<c{ԬV+K*cr_\>Oys'>?6x4,ɊJc_So^tcW;i.1o䰸,r>~2^Fd=
xM
<pQʓ1ZG~anٟ{jr?
vNGVp=k<G63HSø~oh~өn.V[q7t:;~᰻<mݽ-]]oukWYRku@S{\Q.l5tՍ X_Բ$gӔ%ɧ'!
Wyѐ,nحl7tT48:ő[n^sڟ)}a[Tţ)GSOmV$d~͒U[ōpv:,ӾKfI{AY'B(FjZo9i^塲KHSL $EڍBcEKMMY'!Xt,U]Tr*1}[ݾ!!Y0&pTͼ#mL"gN]'e87=VR7zK,dEO*>ڪm]iqXn7h%X$g	 -|]!j	O-}v7o)G^
3L7lPP4"8s4GUͬ	'z&Uҋ}Ƨ-¥g<7w,6%
1Y:,Mۇ˦)!&dD Aʥ(3,QcB0+E^Ro1깍y:ymWaD.[D
4K*|>M%QDoxuApJ_U'(UͦWu;?o1}LX3pOrN+a5Dx4steg;U7w7'JUUY>R27`F)j^J	/F!dՅϲuEYhB4vFJg(t%/l)Bߢ,j=I`}{Ǵ_Ux5N6Eg<5a&Ylw+_UJD
)kf`6qW}[č^35r߅*Kyó[&p.F	(,n.([::M<3mҦ#l2XEK
|^wҦ4"zH^MW+׈XqbKzBe{StC9W{`5"S3"!dܾJ.ռ)ΒdpX7ZMܷJN(Y1&Zp.^v	X~`h=Q<Z\SP!S	l:Lng?@p$cqm|QD{?]Z6g@'ƉRyt
GĢeeNziN
?X2oԇ:A=b	RM}&I~}UBGJ̎bo/k
/,<єUSZs8A8H
e`0	k;=Ug98ڎD5"|qUe8
X~J\=FIRJ`89c%%J8;M	!=j6,u)^T&EpDig-)ofԠp8[Z)7Dh%K4w[$,.GT&KdP>Or<jڵE9U3ҕq	e[77n}%rZs-lG.trݧr&d]1OSыCWk
wpzx7v||xAmǵpm
+Wp͕2(&ߖN]+U6uγ{XrzP\H6.&i~h#ȏIz\GZh{G 
Gd|~kş8(okCt{c#swʼn~qbQrK?8Rj)bؑ
1P&ݧlgpĢP!*^o:CH-"V$1چ(~Gmu3:mM!ydu/31yD9J	!g%ogppC	uߜ6IP89.,n
h28ۣn+Wk^e:&# 4/:CU!Lt%Ԋ.bN!e롖#p#XCÚhGa5囻Ka&$H-1c2#$yQcKBpp{׌>?!R4vMK|*E9쀁;a܏nQjSCMl!8=^䑧}@XDvˋgj~=>[ҔA'2qȜ]l"0L{\$ģ7ᨶ8f&FTd܋5|}?]xk*Q,+|iu71u,VBKii(kCl*>1m al:ܳJ2н\rqv1omWC:dΎbݻ=⬞
H)?okKbrH`g8
֘උMUl7hL뇼$8
	)x%D'ccSϤ(Bb|ѤXQvix[B`qZc.|Cbz0NV|\xRh-DmRS5/yX>YaÄ×J[tc %9``c/l.2Ӛzjҟ:'ɦ-DCXpyTk%9j.	=wNja6T_jRI&nϷ{);PJӹ\FCf&&H6|#pRȆiگ2lY
_e`eڤ2Pĭ3'^e3iU0~0)U!	`w
j=	)-#NCe{Z*	ہ%ֿؗ@(;We~=}<GSR&kU[y^Ts/צ˛~vrZ<zx.RgY[5ƌQy\rvbA&DRl?VjJ57Nҙ!9™Ioe8nFRcGG+A<D.*j:#|+6|@b'o{wŊ"xt6QI	x6hsPm䑐O)pQc>`]>e]bBcx{6)Na0xa+>RmKOm8Q-a'C/7vrnFhZGHDDHU| 8W)Z~ݝ*KXḤNZ0PmQDAvY}y>1nwZUьIԾC@/wvoS&qx;
-FX]tXmu)y4xfIc^ּ$)I*vjSu繕#@5nw\[S7tqTݺSќ*nL"6SfnWݺ*oOG!3iLfSk񓬊Tj+ꂁrHôpB)ѡaCڌevs)OGs~9dV	=>9WKLv-#k+>nis|yVϽPSiiVoj<I4Z:Ƴ#C7"tDtEi90ZV4%b$xOML5}ޱmYb#whWJ{^y=	jm-b_H4ebm[c8FD~}i<hbF,R
؃xM=t53Wmsj7cUߋ7od_+]Y$?4ݚnQ}fΒߋ%懲-9Yeuc,6/ZAݬd/y%I:
Kޑ {
*hW{'z,iډ3_z h觞I!(J''dUXzFV%ce9*o,nD woH/د(4J;;#Pa8Ɖ^ehw|[վ[Ѽs&!꼁sɐLZ%Nfkc80X,Áp`aa80X,Áp`a80X,,Áp`a80X,ֿ.0̘IENDB`PNG


IHDRxԅOtEXtSoftwareAdobe ImageReadyqe<IDATx	TSǯֺӾׯNZ;վjë
*ġ:u.Z,0@E'@ypQ1<{CھB9{WVʎB8P
@!(pB8P(pB8P
@!(pP
@!(pB8P
@B8P
@!(pB8P(¡Ӌq^knaZ$Z:)HBA(O6(qvVT`B""$Q$N<#>Bm"j	Q]	~qV':!ba41/ѯj+p_D8EF2:4 zk4@psKɀ!;8/PB'V"Měv8:居bn"PyGg5UycdۊAoYEZʤ	meZ"ZQGRdX,BB&>DC(}aF辏=/|qiY!篖׶RQ|6(>X	ঝRV
.$`*/Mw~,n{ᛍ{^ٚmKb*:"w8ݞ'&jPX46{=tCg]l	y</Lv[Սn
1%vOLK	Ihv=he^㡽#\_/uWoSOV>CfRutUBh˶C
'ٖMP잊])(RsWlP5S/ő銜E;GS֪SYs$HĄbbi6sb 1o݇MKt&:ھʄS'].c!ULv
/oeZ	GR3Uv}FVp̱k]D85y$N9	JFB8p[dJ
EK)m42/M
ɾz>:/"c:6+CV[2c@?u)'.#&pYGOW%~y-E<iK.0F0Z8!3ҝ/C퍎w͝,84}Vk_™GLm܄UNT{1֗0@u0N۟en3x=ĨD
}[\?tNKb^v8`O뮭ʦ:#Qf&Z6!`Zj b\)hʄp4uҜv>@x:iihJ05涬ꘕ{E|u#2RtRI2y$ٞd@2u4u]CUP9.^;$9TГޠ"V?;Øk\׼_E(sႝyl4
qq][A7.FIpk4;OXcqTFA'I@.6&S8hcmpuG™.GC+3B7\Bv Î`a+1ZFJԠj2bl䎡)ϴ-gO
|=fql9-ݜ=- =.2,2x]sjʉk'd]cu:6j臄ﻰ1T2nнX:Dumuou
ژvPS;x>)'#.Uap`[qZupXd7\ϤOֲ=ji:lhJ%BSIygzt${(A)"j[`Yp
LgʹR#{+oƎY&5bCppx8
j-T6M,9bbC-nJ8oW]%@зK^m>-8x;3pVՋO8۰Sp<&req:
lyӓ!i\FaD+2Ux.s;JIGO
|f&a\'p498bUy,je68"zTUFv9PYaC8I[k?mYMBYϜ{\*Kۏ l`8}L9㑄gX3jm9mѪWBY(1٭oupRʷecك v
}.8i|p(O~Y+Cz9,t@iCozgE!_\}y+cЩ;qπcĨQ/[D2ؚ
{+Lz.z ӿRT5cACZ?R^&l1λ>:P|PXs1<8*S]>)
v)xDA8s0p=G8os}Z2[vMd6Vq.8c]'":r;2O;p3Oy"p\6););iφi<'ܻty6r0nbЩl?!~q?Jp3T ㍹Ne۾eȵ4BҜ/pq򛜾~zKҺY`Ԕxp5ckPK>>?!<	ģŬmu-2\%ٶXl:,iD9^s#=D0|ҢHT2Yet+^ZEf|"C(6+eM
Sà3b.S7W.>ϡش:5t">˽=V^dѲԌC.6Mf8yo*,8S
pRѡ|ק:oMj5聊FTxrX+8NAr
<nVK>l-8tao)_
p.|jymKu" ݫkɹzU
SS</^cUKV-Y3ci=.Qi	Oܨp@p2
Ό~5FUCMZCWp@쪹E]W_˨gEw/i?qi7`yulb߅*=_ƼHW&/ݜmfęk^doW!vA^ݾ
}eoC</8k\7m5g(Wn8Ƿu-7M?\:SRx(޲FC`;GU$#[M*G@h+Ӊd ]%f^&N?)rN<Vc/Gg`pٴ/guZ9Qy;EYgWo<ʜ/~N^t|eEQٝl~-Ȓq#@hS3=ҍhn'Ѧ.PYu)R居T*
V(B窺:-TX쁏#`BiF+|)wߒw)9J
/#Sޘ6f3Tl#F_X :r}>lL~`멐NXgp)ƬK*RUL@_`	4RWRm
Z"W\$FxY
|;3	GBn11›Ym0Cq'm4/TjZ`ׇS/̲,:=&I%\;Hls#mA#.ao̍*
[`U1Ty^s";󺹄B-b]37m}×&JT1z]j}D(&~;7q-I=iUF"W/;_po-Vض
[Tx'(3rYGwX̎0mpҸmgYښ
NqmY,[Wa[Lzr[?׾dbݣ3jmJ_n.A|L'JRF#[ul~]v_݇9o˿InQeIU3`?z%q9WA-E,
z	x yLjڽ2ߖNڝZ9mxQ?q)5p90H^C7f.B*	=JG-2EW|,O(P* &ZtjYcVQ)xҩtu\mueU9+u3ޣ'4V9P/B8P
@!(B8P
@!(pB8P
pB8P
@!(pB!(pB8P
@!(B8P
@!(WFN~$@¥IENDB`PNG


IHDRxԅOtEXtSoftwareAdobe ImageReadyqe<IDATxHu𣠂X4B,
`DM**,Ic9J'-P2Kmi"lMqۥԜ:<wvӛ=x|~
y1s Lt p p p p p p pDXVJ
ܡ'^CY2ճ8888888bVx^n}Ƹxz|QKQ!ޅ1?>@֞⯢B0q+eX
\{vLonfbH ݻGtsp#8tKhFWX:g*ޖm˕[eB0e?~$c8ی\'Xi!=qdLqZ8-pԥ\p<'?~|h-/#(8zcm-a/Ml9Xv{(࠶z?9cf?tvVnpJ!U}cCSwjC(#8y؍ӑV܊q|]h@4\)W~j9 
ΙG0.1*)fĂz*֭O)BoxB@
KqBɛTq{M-E{(]Eoհfp|4Ȃ38+m}X+ژwp*sZyjsՍ2˱
׾w^Bڟy=qu_'YShiV6$'T]LL
Iq*ӎhAZ*ضCy沎!/ѱ0wTV}mSc-(r⪪֫
23|8Wi~Jf|كWCuE83o2!~%1P+1űKKw82RJK\
8_2ue-By#8*l/8s$-5?JyqH}W+̆)6>jxc2mYud(yS'ơZ8x[xȠ+ykf!yBhT}d)^38z#'8J02[=?bȏ࠵1ٹq.yAFFƑ	G_%ٵOp\X{g#޿(iD}EnZZHCM*Ҭmc:ƍ[ZJW]dM%:&+]'s8R/VˌOpڿWZG(<1
!w5{HyJGagԨs
a#!sl_UnD78"G-&)r2hz9p2{hI!Qck#lpo2#-8,NxXG/WQq^	ш!s8#8"-7n(_h'BF鷮s|44YN )	^rܾ/"q p p p Q88C0A|98up:Z_1@8@@8@8@8_?J1"jIENDB`PNG


IHDRxԅOtEXtSoftwareAdobe ImageReadyqe<
IDATx{lƯ!DA-G
$@4BPEj8B5%BH p&DP#Q
ԂQ.,$j!`	;s޽3;.hg͹Dq$"C$p!8DH	"C$pDH	"C$p!8DH!8DH	"C$p!	"C$p!8DH	"C$pD
ֆe>w}-~n|s3tAɵGNt*z;ʾ뽖w|/:k{86kt!q'n&Iv~
qZzۂ]޹
ۑ9띟b6[o2|xp 9vQa5J9U	5gԔjj~ZͨW3Ϫ973(4KpTH>}ÉU1cɗBsӴ%n*8C-u6omn|L]
ةFT_
/2#G;5᝺Yu߆]S</`Fډ-F,(aXDQƇ`ɞ;^Vq0"G<2xeDgBvp"9MŽxlD"v
Ç곝`ba].
zdHfd"8D)$:nΦΪN[n%eg;4o\uJpDx,{{+
w+C}2_Nup|DD)dn;צ-?2:&3^Zy>B.U/D@Jic	N++GO?&
3y-s0U8PC=aEЂO9@yeW%2m'h.wkD܎f[cJNޞI! #&%$B7Ρǥ7	Em_` WH:DT³LY
.}%oVwD8;Шc_S=1ͣ 8M縏
G&s UNcT8ZSNf7ߧ"1\J#R|-ÁbH!Mͯ3vhYÁ|mՈUHf@'e\gb8}j:BQ8e2(±Fϒ)8pq5I\0	<<#pP'ey6谞dpTԹ?xf8zi>`$T!cNbdUJ`8v<a;3îsNxF}Á(|X&	4z%=<3;	LP˺0͐f>=[V7DUPYd)t;lջEϒ7{8Fp`l3HeӐr/
8(U@XR_3wRvR")8p jeЩ,Lx-uAplLp>u
h84snԦt}F|s[BrӆcM$,|,>|ipb4մ駛&Ͼ<z57 ~8ZѤ'a)ilnlsb0KMe=,neÈq+hqf_YQz3jډfI	k=g_cc;:>zK_=?fȰR~+nҮDău@9 uὸ#ts/ě!8a개ZOY2nup	Ԁ3ñCfSd܉cG78mgt_2˘dq	ᰪ1SN>p6ߞDӾz~Su.$X?~ pP!RDK셫xN!DE`Xm'7Ts{
Y±5aWsos>8̱)(u*zHʎ7q=LG颱QF0Z>)P@@IYp\rb_<Z^8Aݝ#Dzo{jGyI"Nu+2
AsN;@ԧ U51/^a8iϐÑVͱ{
T̐>Qp mY`Pd]ccu[|(	&مvT)6E.]D+/#bit^)DSk<Yѱ)jVUEfߗQ%&P|,s4n9&z@uv=Q2ņPaޞt-ÙNg>086k8q>3<_dO}5pA򐱴q2|p>.9sh2 8U˿I&乂k<?!p<:|,uL	¢ȵNGdL뷧ᬃ7,s|p}
tbMwq_3 &Y88-Eܮ5'Ѵ&.hM#y8V(A%'Rb"A?qA|L)veoO?&Gd[\䶙Wh^5
1qPY\!H\FГ!aÁs?IHayVjPenAk| b`"pY[[Q8[-pk^3
h:Jm*8^<ZJfyvˆMq~4>rn6ϻg㦟Ιy
mzjFQyK/Ep8.6'nU><~0	o!^˹8cTok&HFv-"C$p!8DF-݅#Lk}$-ƄplO|7f~J6Q-ef6=#N䊄ywjT}o#
N*1/ͷVD#nq^:
m6$3OǒA_A#Co浵3NlS6$5?9g^~sݫס߁hbLmk"Hr
`7md0sls+6=yI?sl.G/C6Igf	HgCm7ց`~LJ+]L9QWOL5gixF$uFk8GM}UiS,㹼CtijMo.+?c}}*kUuHF!CYs!8DH	"C$pDH	"C$p!8DH!8DH	"C$p!	"C!ڂ/OIENDB`PNG


IHDRx[tEXtSoftwareAdobe ImageReadyqe<IDATxyG}?sk]괴|ȇ$۲P™Jp(BEpLBI
Uc@mƲ|Hu˺=5o;v[Y߮vTΛί_GcIbmXA[,V
bX-)=}K^*b^ c춠} 5bh cJuC<GC[,V
bX-+hpŰ`8L=nX07ffӁr`8u0#J"F+E}g/paj5nkjdȦ@-}]w^m*OWGJ<'RE7L+zX뜐k~l=Xff~Ari>zeVЯF*
/(PH K~hk%EƕHO)ocn_l;PDΗ8mz0+7߱~5#ttNn5E5
nb$1477֔qXHI'+\4'
c:oQc롈DP\3PC[#x2~!	5m VWB/hPSܮh%6V5!VЖ&:Ri]:)̑m^IڗqDfWJ
i+hKy^3R5ԢFn
{Gz%ן&O?weK}5MfЍvQEoZi6(c;C\ A!%5y^>f7#kzv8-P J>G=ܸ*3Wp4_E<7j~aWgx'F5vK?jM-Ҽ5Yz3ӶB.YbǾ1E%0-8˟x\ՌV5=
XA2r)iwӞpNmBIIkCeSc~ŞH52dAAte)+2O,s*)/>PK]{I%-C̛EC%54ۨ7'5nr PYt6*3Ҽ"9/gʸ@&R0X>ߵ)(*Q᪦ݛr5@f=.gwfyH _o
m5EzN,n⢡oZ'"<Â& 4<#eZcHp٠J*@#OW7q'qeܮ%ͲkJ[A5~<h%+[t
/XϞpBV,[仐3 Ŗo	v55%C]
0 r*3-n<)ߣ!Li_I#|E~\@]A4c]oGqQxVc_>]WrI,""H!ߝD#ƾ-?莀/l6BM+eD!v+|֮^=]
}ȷ~("I22IM!91:&D<[/.&/	2."c6xl{ϼܼljtT͸c¾&ٚu;ybGBFrEC@5(Uw{*JTXe+5<P$ЛWDC2nJ56')T` 	
i爦EM{JUſH1b)TݶkxoD1O	*nd_00\єCC<@CڋFq[:ILKe=**#ܱ')Yʸ#bl渜1ϡ?#U7;`H54Ғ'0:~1a?C[hm8UӲ7mh1*ާa58IטDF*5}BV2~Op4]
$=NK~VKX
zZja~i_Z7݈(ъ"KnXs3\g~!xޜwǚ}!X*Ȧ%)i<	
8&E1uP4i?#G];i<~Ď=~i(G.,M/1rF7H~eh
߽I?b(\cWri)sN[Fdq<熕Y>py'V=)ٲxOl|N_t0F
2Pj]n}s?7QH}yv	g|#HS9H7HՐOK>u]?
|_e+5z3葿N|N*tXt3i
Z	 aY1+Ml<C3=pm!ҍg1\Q,uMWKM{[.ɳd˭?>ȺmzRlimI>އA1Md=щbnozbn4Ω63wCiO
cghh0R5/-M]xyc!ԷI,[JSN1,325jM!ons/D㛴]<1+`!TZi$j@>~yI]8ŗ1XUHzfmrwDu6'v|P
o ǻ/-t!.LzJ1\-e246*7ۆu+r|~URnAs;j4eL"d]BCcWżß]GOڍ׮fyX8=ZU" "yw^ͯ%)FJt]iZVkp:YgM).^3Prv5c3$ME
)ѰZ@q=gp\w TDz9D-a&qoaq%\n\JvCϝۥ.+yojh <=0NFo*q#&n
UgH6JGfA^L.fvuG8Eƌ1Tk2ӖdY(E(:ְTHu
Z8V,]%n:'y0>1_g_-Ys"F{IiZn;
3&&0,u;]s]hISJ{kI H/sȤ]WTLn-nRVKb`\`w{"kQlmj.G
#Ms֋㬏)谵g9D}_^bW?mePmТnitF}<F7K{bEѡƴg-7qB]BXz
#Z`(Mi*Q	!uEKhN9ZNֶm-MfI8e
ρEsz%K&a4}7?҆HrR,i18Z&7ݿN3XzJ-Y!1(5 =UNBceŦtMHMhsuۨsyhYwӈlJK1kFw+E@bp$l[橭ik5mA#L
NJ۷>ux:uwqZPie]Vq	B{kr>kpzͣlY'砢	E=ă-pm?I0;1o0Tde=2s*"ŝL7~[#c?X(NnyBQiPL;AzIe5z.׬$:ؗII6*&RSkU~~==N0~K>UO%5vu+ߩFt3(lq&FYRpy8-Oq4H'#
wˏ7e_ȗ܊6r[ZwvDG[^?]rF'bx'ontVS̙dP
a4Ji)_#]?΃&6n/Hd^I\\~jI(Sև3F$wc|ϰvCD@|d?gZ,Y|=mY|W(f
5ln8wIT<ORz2'6kRᑍ#|䟟ǿ{//ُ]Ot:ƱŃD.t!媅<qHgd\#|soE94m`
wݷo6m/p$q ؐZFW4NV JJJ(}ػ^4Qyavix|ݧ1}pFHZh1=ppAZcNw/*
W
y}OqSP!W"^Q&$A=i%CNO(qgTOj>y0e5be|hx锃R! u4lm|Ys
\|<Wrh$`ž2OocǾ2ap.==vO;(
rKtQJ54ݬ<񔮖T{iqhY9IaN睚<O${h:"qh<W]fϡ*{#AB: $BJ!pS\ދMT8BM0qys|~8R
Id]z~YOh
:~;Wn4]^y(h	
|-C+EHet&]A.ɹϗԴ&+.K6%&Z0tCd||vB BjHXiN\cBXhDӿ8ˢ.|_Oaʹ8Nsf)@z[w
Z9.r
4s2C|ƥ,_%2n!gjl
zz,|ON7;]]H+ۿ1M7..'j(\wC\u`Tu?}܂%4 &^jc9+
zzq38Y/7_>~?g7P(*,2HB֑4./%ga ?~V҆0ИPz(
5'L"15MƟVC
5Q~ZkCXPDdI%.:9;ľ}-n6(1xҳ~*Ԗ16leŐZ!92s,38{q%2^"'Pp"ІTqK-jrDDr)	nGd:HU/3s"CRD8
z?4Wj(A1KdRϑ|f_xzy
<O*hH^=8nߔ'y׵K8sqߓ.\X8aԝ3YI%xNį|eeR=jsP~V?wa=.~s|HO9Fޓ:mgXA[-+h
bX-VSIRAfF==R'YKD<\[n13fXmXA[,V
bX-+h
bmXA[,VbmX-+h
bXA[,VbmXA[-+h
byYg,k-+h
bXA[,3_A'^YIENDB`PNG


IHDRxԅOtEXtSoftwareAdobe ImageReadyqe<IDATxϊ$E]<w}}}}.ETOW_oNeEfFFfUX5_,35WwJF(B8(B8(B8(B8(B8(A!A!A!A!A!





pP8뻻ͤ/*',B&Rp6R#㻷}_^hoO>XH[~Irp uE2rXH_㶶Eˇ.R+;!iXVgj8H)ED^~m|c,ü9فɵi8N)4_m(u'IAZz"n?g9ɷr؛ao^]UgO<SvXӧ&'OEbu/b
R=C&WMJ׻?İ6}Wϯ?CV
"#>>jx<zIYyE,k'MJjQ`lGXX@]s\5qʰtCpw~8c|i?q+kE‡t5dx>Oc4h8Y!K.1;TT&p[?x%p[9&dǾ|)*A~նnC}0TO65^	HWtK0XcMUu̙p+85fM!
8G}30hӰMP,Lypj@	"QFMo<6c|:,c+WLoG1q,;Dur9!"M}8r%
.>
4B[Rk>sCQtl[dDפCuYa'>T(&u3piCoK1
5aAEsC-Fa2)j0%59DHW6/xl<MS ;kTY=}W5I&eKzvt-!՞**r0j0Ya6on8Zvl^mAMqVE-R$WHťUpHinkt}Cq^fy`\9tF{.8C8ׯ-jP4nG=˂܆ZZMQQƙREU
ތ'nd'^Y턴4:Y=/da!jJ1i돸&HWeit+^QwYMMiA]
塮g+.~P+(iI1<=ށ:xD
2p,T39j6WWk꜈Z>("onQ:h2k
|rofn=FZTWE+u-n4[vK:6uG"cuE{č,MϙՊ[ר2ͨc\p42+;s?Vܱ-︪K̦^몣PbE(징؎Rc+92G֠Cq4$ߊ7d	Znpaj葝wQaxX1Sx9.j]UY*c1bl8֒Aԏq"n$Q8Bҁ:^mr	W[Cجr.,^0&~&ɱ<Es+܉qͻbj#3+0W}a.`Y΁ǚ՝j/-:Q[
URST7cpnf]q&ɖQ>s#
Ra6^ᘻ.pLw|Sx-xFtSim?=-ōLÙbh_-ʛS;Aa!_~M3dNWve-(r/SbSwTݒ,s,D¡ʏҬVVKۊ;Gp,oE\jTg?'t~8iJ+](q?Qv1mGb?y8QS!}wsuԞ	ܯ/YNm<Z8bѹk߬\I1f;Qsp,/]n;rӀ7ϟ=
#3X']XV{yKK0(Z[LoJPo{~,#vVy0Dpt@]
u^27=u^2疺J(QX

pPpPpPpPpPpP(B8(B8(B8(B8(.m	&IENDB`PNG


IHDRxԅOiTXtDescriptionThis logo was created as a refresh of the original Google logo. It was a collaboration between the designers Jon Wiley and Micheal Lopez. Valuable feedback was provided by Jamie Divine, Susan Shepard, Margaret Stewart, Michael Leggett, and Nundu Janakiram.]tEXtSoftwareAdobe ImageReadyqe<tEXtALTTagThis logo was created as a refresh of the original Google logo. It was a collaboration between the designers Jon Wiley and Micheal Lopez. Valuable feedback was provided by Jamie Divine, Susan Shepard, Margaret Stewart, Michael Leggett, and Nundu Janakiram.\	NIDATx	e?<se
ܥfB%3t*QӚgY9IZ)h"z
D@vnsϻ=o	1?FD#|p>8@G #|p>8@G #|p>8@G #|p>8@G #o@ 4W˖W㑒,z=a`xix7d-t`G?H`sR9QH8Fճahb&oe)kA»6tmjTVi,dI+3v*z10PގyhzC):IE\AfFxy*QSa51Ommø%e[XԓVض3wtwˊRU_Cxj9VoD_2Ш̉ZD}55"/o6޾kk,aD*Ŏr
	-5c'0"|S1liy;fDUM>µ4gVm`.2s'n94}ڤfGWI_nOΙTV|]N._ճK!	Cg``@h8^HW
fx'LEk:'??skWU&%ӹre~"[k"f7vc Fh(YG{
+`}%.;y7lihnEipʧ䣋XTcPҒQ64iXJU@D APA(@J$>7]sD8V\7ۑצXh薫k.=&v@
֣q'=Կ3}
7^㐄إ46bpʼn\#wDC<I;DWq7^lpl7TWp'!@) Av[FϽi>;/ϛ[Z(E9˾q{#D(W
C*N?OwfED@$+xO~(bjA	`88t,<sniݰ
Ry<8C6KԤNRuuЪFHWpIL$Z[ixiȿb
a@sfd(IF"BR$6F@@(eRԾSW,
Qubdm
ao|~ɒ%sL{{ٳ}ɓ'766by'`vAږ7e3ǖ/.ijzWT$j3_J@Cvy(DoxL%Vw
ƒ4DyQoK*Z&`VP0j5X:_uџ1Fe$]<"Kex&rYeэc]@D@z`=۸5ehPʘ1ՕPߨsVCuuuEEECCCyy֭[=>4H±9{Q/:ۧi	"2/6lӕ.ϙ_<tt܉W:wv+;5(PΗBߐ]4mU?G8'W}K+11Ӭk[+Dp]Ƭlk2UfP윺1cFqF(+(K7s
5+?[>}Y[|~`_nުlR;:~ٴ_boDiÆ
co|hDuH)%8_gafE/L<P-s?yU,Vuer{+	(v-otSό4~<9ꔞ_|lղɿ*p3,;7}jVوa
y!Ç#Uй[}a-`/"R @ [/N+WoM&13ߎ/zIoidaӾR}cbرGfao>:)1 t+t§߲-`	gU
aoq^yvs
MAI;
;ѹo~ʙq:+-sR؏}GK^bۄ#Ͳz=\4Ҥ`_!;rm7>jmUmx{#
D 
 E?e=7Ə7ں;c
Ltށ'&McsMӄsGW?
DRDBHB>>e
+/;nc?_q@3%E070z-};r=O<W4bμ'-2p-hqmUzsڊT5w^Vh؋8QRj|W¾P "(a-c\?e}z\s3'W\'=L$3wO(9I	`؅3~_q=]UcΞ-p yuؑ١r#={R6:̣0З0jh>RL,?ʂ
A==<&Bzxڱ܌5`?ί>y/Z8DE~@@)%ͩ᧜!W(;2.lZ֞Di8|$=\0	dٞ}x;fv(b'=
<*҃VҊďNnކ\r-aBȥA39ii$H2)D>5SPV~ez[`5tE?54|AJ0OdZ}AOPP%sR?cy>$<(Ҷh%W,6Σdę\m#ƙU$kwpc)&`*1mwd{ GX|\Ũ:J<f?D}дsgM5e8.L*g05̨-:(MuLdq3/*M#\o_yC=v)lAj%Zq%2ƞ#{I48eSK5ުQ'%I5jӎОzDʲPoA~Ԇ
p%J3S׹}ؙu+ί}'LiQSF$``n\{LyMeLqa@ٴcO>'HArnd'<BɌV8JH\4"lډ|DP}FO삈d%q0(VvBA=+
vcԟqѭe\PiX])8`0ز
zrȩ4S[pGDGcٙ;7ŝ,pyR@)DY(kFq# 	BvJ@!)-A!8:|WqTg<A>FRڶzj~n\$V8cft5UV	S|J0]c
xDR$)^J7J+/#%<Ka7r2s9 ^t%`",bͬ)`)Es]\p/ߨuYM:|:.ҳ-!7~R\.#&̧G
_++jbuuw*gRiO..Κ♕nb4
HIKEA_
!t#X<4ν%$&6wJ]HY )8vRr4aPZ ܄0G@
%1ưQy]HQ(k::G9^@ k;VӋUՕ/EurCctGj1vIOKmgYBuTQkWJ)MTWJipl]2|#q	ult-KQ
i2G)ȖܨnJʢ55a+	2),r
p"&9Qs4_?]a:YAqqc.?o4c_?ѫm:L"џ]"6#xp񡪘9M {[tC}|p]%6~MWYu#i+ϢbJcL.#F,v4]=VG'J\1b(Mqt'BZQvP*.8KN
Xa*<~I]ԙKKU`}-<žSˈbɁXᱧ<h?~q7^c\X=?qzḶ(J	^!]Lp0T7rǦb(wf@nڤ-IQ`B=-k׊R(%RYQZGc7Q;UZM.ğLfN6x¼Ƨn$XCO,6.w?k4Vq&7KZǏtW˦N 0aobQQx8/VZ1e2m®9/	"]C7ҳ%`HW0,
hkyAY:ʳ9\1ɜ6٭-%F0}U%PC)HgLé؇(vZ5i
VVP(-v/En塐F1	wcj9-J>A9gwsni3usU;uq#I-=T(J%yȓIw1&<ɵQ_7[+DAo
.9?\J%aJ{vJY1Y騋cQux]qrf7~ 	oB
+B%+0ؤ#{M;{Tr޽s[r_<]"WN:a]R;v8 ٦~B&RJ{aI6MWUMer-H"_ͧ<Vcsa2e%RJXE;\{٨ѣz>|bz|~okJdz53;	W\r~oOOC&2'iƌǁ@@TYR)ßgw۩*7vCy<bEr
$3̾G
0@kMy+x^(DϾ.۲#'왧|r<Z5|
0k87Ӌ69L
G<i|GMLJ)E81`0}T0-7Ut=	&ܿޖߐR8 JApck~vCLc|ABRD#%$bY\7WL:M?-|>XL\{k7[8q,}Ѻ
ӳTY|N`!,y{rVN
oEɔ"큅7,5*\[pӧ
umE7wl@؇۾{׼҈[n%8lD}al*t)pJs*FCi^aaAr>^TP;}J>^+WmLӰg5-Y~ƌYO<kkqKB+nXl"-`:F1|wlֆOꞶqcq0+]1f3+ߢ}j߲	buBfXBYҘ&Ft|cSVDL
[?>k/]%dWy¼o~wIF\pNJEn'7ha0CCBI򏄦ca3a_TK':dǴ`/Z9+^эrG?u=`š-]p5W4W=ly?2+Q^H
VԟH6wsGo/:ܣ
|\ZOݜ~%1&ə_aos7_.@@-P7)<_z)Ͻ[wyD)"bJcJ**Plf~W\Ci`vώri#	顐0L-l@aiOf5Ap-RORop~7?teI)'bop5G:[;x[)-+OFl 3F٧~춶?9ΚǴ7ip^q8ÇsRԗjm@J72!Naw~)9+"b؅ܺHͅ'?u8<`ҿP2m pz}i㯺x6[?k@
	C'.s2V1G
dk
2LkKnLX~ĸëp@%ش%I2"ǎ=\$ɁPRaZHT
ʪJJezfzu#mA	7.
Bp<YGZ(Ca2#}7B;f7uy=uJ,Vj:jbCcƈLwԊYπ[•$ &ixmu4ڣ[QѶ֪͕eq CB+Vɹ/^H&7BoiW.}8IhD7MMG\0{@8FDxP'/ٹ纊1EDe^UnTU+Ѩ5Hg-~MƜGr?M9
8<y]d>G̿3|q80"BPu%smA/p~;3Z7l;
3CUtp˃M@Wgu})X#OƵ8Ţl_pyKznol]Uɴ8J672s)!$xʦw&GSs-JvS"H<~8?6lNڥ<tv'!=Y+
CR)⚀DH@G	Nj-TEpLqp/^ٰX3M.8pIUO"`.o%(ͪEϲ?zBrcqX"aͲ!
ޫ-/NieFpXrN7SrPJpҸxu3[-4Qpk]25mnn8pbDso7۟Ga40DH%i6
n$jS|e|\Cɯ\>|lkcxG՝w[@Rq"U=PzIm~\/]9z٫2r4hj*ԈF:v<1)>~FDlǶy˶])pHFÚB_|p>8@G #|p>8@G #|p>8@G #|p>8Ε`_IENDB`PNG


IHDRxԅOtEXtSoftwareAdobe ImageReadyqe<
IDATxkLTgǻDhIM\6~q4Y&D?71klf4166[?3 ժlEقV(A)Gyf^<N3w=D/b8X`1,pb8X,pb8X`1,pX`1,pb8X`8&{jڭ[e۶7}Ũe8ac_;j8
}" ?Sqa#hC O9ƑDYp8ΖC}
}t88cƕRA4'gȂ6Ynmcaf8(m"q1:9sсi,Abh)p~;۔liٶ[>6"VtZǠIƒy4.dPʡ8:]_T̓Ҳ+uc[WXre `FO['\}۠?1
w?6c؎C6BNlðOlGdp*j@?9֥קe/G<^#gZ٫ɥQ/;/ՠcĻ];.V#EVh1=v9c;QjW5xht|%،*1 F"/,Z&}q_")"T8:$0g9Dn@啂ڤ`c^T2rW'ޜ
<̄H
$<~r^DvW(y|oF2@ ľ93/պv+:Z|M4;G6[m>ťG@ئBGzD&@yۋZUZ
e…[WciL(,!B( 8gTm&AތP&[K
`%J1*a8X(j'rL1B3|Va<"a[6K/E)H !
|́SA^ܝJ^I,Fr	KZ".ֻ-3ah0q'1,Q2EK%K	D0DgۏuGJڃյn4xEp,ڔ#ھ1A+H5S	
!`<a?uc\*\+|\EeuE)|2tDZZҶ6bc8~F!R2#
MD4CE8XlT#cţ5nAIByX,NϊPvD8N( /e&4m>4l#w|RzRxr٧ONKK3vd2^v
f٪k{eeea1)d RP8	p"A[Ki@Lw*V`4MTPoooff1H:T*<()qd0OF،*
IՁf(+p<utw1̚\(9dRSSׯ#gܸVpy8FPKAC}	1Ӹ)RcS&VOto}ΝjDA㟿{HPUU>+cӬlBF#ro9\AE "ex}-]<M
v	qU"*
ŒТ?2o_n޼)Tk02"J@k.+4z]ǠÍ]|AQ)
$φ򗗗S9hpp<{RFAV6$8DG_pp;J6	s}so~َFOܔC3Yb(''}GG
W쒔tBCI0c~}r2>5j}J2χO\<D*c.ozL݃J2s[H~Bn]քOWplI7y]hl_l}JT_<SH(zˀAMWأ_},eeQ}`8BZͺfH=SpH-bY(F"ʋ@2셶E'ƀ}`#PMfdnS58-">7.-ZjaTMދ-D]Z80^nw
9>wp7 X@(1IkP^|ZԔUZF+FNGuþSw9"gMҕ+W\GOj&6w|,!g;xQ/,Gj̷	qjltc4^܈8T rj4c666&h9;;b!03--r#?J"I'NVx+7\jB_}<Fqq1I{Kb0  7Wffh	{c-
LJW17&E{.Mc²/".ɫ۬	_IpQ̑#C m/HsIHrS|#
иo$IGqL{vV%fWa-vKcҒw*UK|4*)iii6
hbϜ9\SE`$` ! yL2!	_ܳaFڐ!F/SA^gj
{kMH]]jiB`#9>ؽ#$rɡ铛bUN>&͹eSaFN%M_/Fzs]|yB\24 yh,ǜ"kmQt6ir}	y'*H}c1ueu;EQsYג-馀L4~2=

ZZ (:^cO:7U0.JA@pMH/Z֎᧛ɦ䖛DȫҪt-MMMs\aOtf)V(hG06[?7<
0,*he/a8_8߿C0^^9T@臑~GjȥޟxH~~AJJ
Zj<;;{Y~>p.\N=ӣ+=3뒍Uh<k=ZC.l;GJAR@R!s/ˀXy[!ֆ"e11'͐jwW4^!xۆS=HY18+X$N0Г'O3	Oն`b8X`1,pb8X,pb8X`1,pX`1,pb8X`b8XM#IENDB`PNG


IHDRxԅOtEXtSoftwareAdobe ImageReadyqe<IDATxXTGYb[4jLF]Hot" Җe+A((ySLأFM"ofR_ܽ;ޙ=ss,&p`a80X,Áp`a80X,Áp`a80X,,Áp`a80X,Áp`a80X,ÁosqEQ0`8pp_rЍGňxty_<q/Z<Hs0݊%ch6!NˈbV6N{YYVKҭ?솸♎|@i2R#gL|[hH,{PyVP"qJOQjl@㿩P;eݾha^Q]㳦ܝh9<@2gxL{</KCQ
{TD[څo"Sm3oh
Ͷ@'m̓?TL)Iշ9(֡	K2)}"e@&r9%qF0jq_u(T`Ȝw_
8%T7q-0f҉
|@Jt3Bq~~MLaɋ_t3vHHdH~ ҙlݳna"Б460`Y_ul/=Dz}T^B{ƒ
Hx	Mv<R?^_lr*0J$7,B))aSê`=T!щA\N!C_{pI|a22$ϼ[V{2ltwbg*8n~h[JXSg6CuGۿ5z[6e
W?du*ZbwњBzxuT|uE[fV,@^Ʃv.0RnQa^'`!	
S2X`)k#&r*xg
W-F,tç{9ηȂ~V8ou&T?%Y9Pœ3F*qLMRwိNw[0> G9<dٯ_9x{L@B!Bۜ%JΗg:T]qWgn;UWyqSSkcSkóK=Ȩi`o.]sO'M|gsɑf)=CG\Vt/݃ÓM4ZWu·wX.\toD9_S9~@w?<! AIFg,5qF%`y+ol3io1ܽ0Jn14Ǹ35Ij,_ݝ13ŭќ|y6.k-FEiG-Q:0ͶLfY<J˙Zl7)`Id(pM=
瀾R\B{۾(Y+/HI)O{<ٝ	ˎ|{Ƕֶ~ݜ˵3AOd^8jVi/}c>0ygWXO1{={+yPy+"Lw}bw#'p?"t`_& OVNfFl-dI|#5ך=p)]kil^}߉xwjS']]Ќ7yt_ޫ~^j{δA-yYiݪX*a
I?̞5UpPD!w$\beTL8H"UY4[&łCz7߶\613w%|B<9h6X@Cݻ
g^ݕ[L,F>K^{D{?_mni}Qg.5;1)79]
{])jƦ"KH{n
d=ʛC80ဃ?JƼVm\W1߳ڢd,]2!ˆdR(
4q{wN[י%{N	8Λ1<v;ߥNrǻee%4X{]z{*&٦NHN=ޱh=Y0\2
]`u|;i9ئ'~pcL-h+m1hBmY<V%	!jp_Řۧיɾ
RdJAsѐE+B`(ƻÉ=G^>Qq)eJg h
rSҊt8Bp>|ULC *	I5Wڻvolesmmoܫ,e
/gَ	b%"K/0ئ5aShˢ?i)Oe$?dPRP{Ehm0b9wE#'f1uW@at`]+E+ܴg7T(C\$Vljyܔ
-mܢa0<'XcZ&U7<MQU_^}}pEvR8y3UI_$Tlb?1Ssn$CY@_سi"ۅG5Cj#EYnpiƂ4Z|l:YcHՐiuG
8\!nO6u/9W74&8ĉYR;Ő?OU{a]v0E2ACtws5dϻ1&l8vî3αUjt^_u>t~rakce'.8U*KglTg2+o1`Ǫۂ1=G828$;mx/+F&_z8N<:
au{av6A2<epj뱺8ԍYMp(,Tf:8يNj_5%RR_/4l}뀃1|Df^
A8u>`gx	<J` ~~@zO+0O5x\*!VHhhC8"Jh^™J--]x% stOω')t
8-},QBDž.!ZI1ph.U&P*Wʻ3%pMCr'H4߆2bC8rkܣB< ҠGt|*5v"Gu|~1+K]߾:8`Gϸ'0bW3`h槛h2
?t9ѷ|Λ6j+8CĬh]`ͦo.Q7ZD;PhEe~a]{V+IvG8E3~
gXpi(R]zqx)YK/h:_4!?zJ4!$5ip!s<QAt҆H0d)oYF8fC?[WЎo,Q1彰(IwÀd]yFqrCc4Ǭf

Ɍ^6;>֚7!Diz)[[!Iqd/sX@}K>1-ߐ@¸
5:Jm}PH0!,>rQQmKk[䴚@:AtA&ocsK0L$n2٩cDٲ;2fδ}|<0%jrUz;y#h1 ]_A3 1`bB*}`(a:(VsG~/B,]Ȝ\F'!4 (;,??ujHx[˔B-kQHov;2njsWkoh'k'P8t;PFF2O4NNi]	Xc;jhf	Zs7X#{%kX6DFb
 ,	!֟;GWbUv/zTh9N'۬0vi/:Vq9([:举"8`ltk߼{\zˬ:qα64w_wR|j>:x
pP}@@J0E9R:p22+ڹD<U$W}'{E9ێ1CF)^;P,Xvk2߳r:e2)QdHYıqbm_Q.pe	.pGQWߴ:P''&?OJ鮳Wj?AӝxR('OziDf7M=o:	tZ70J	@/cu?w簆~[,49B
&wH*R*챴%R9%}˨ܙP1-@vHgl@Q@/|oJ|9t8sg|b3v_{ہ~r_m
ñchjja_|<pi%?uLxaʝ&rw7=$_)1iڭ>A\W	LWx/#CH5g1Xi{[b(N1gYG~.L.Ղ6Asl75Ӡڅ7m0ݶx
>OLtԤ'VxpZ[]cђz S͐w۝ںE^RJҌۏ9:S#m3?ބc>|xͭ_Z="m@at~׈'NcFc	OK\0Hottg|VZ×m$zřṢ`҇U'AyX~VۖQ\	/d [il"te{U 7:N&:
_M
Q1IfȻ_D?$C>e*{et`v5`pL=,>gniЖ,ei7HtVFxێ(\jltvݳMB5#YvlG:{>$z5o,U1KCCY6&%eeO}Hǎp; 5^:|I+B>%x<,[[	>RqҊծ04%[eVF+e's48`*zNĢ
#ݷ&H7,C'%_X-Dϝxxa*X'1;DvK*')*grx5'?lTȩ0;ѯa
fX~QR4:{eI·o^*'z_ÑMȳ+䠠-B,4hpqyw,Hx&Re#wQVҌHXB,Vzknq+ϭP30j)jBu`wGSZ4j+FT:wWʟ*N\^Ftm)Áp`a80X,Áp`a80X,Áp`a80X,Áp`a80X,Áp`a80XRM?QIENDB`PNG


IHDRxԅOtEXtSoftwareAdobe ImageReadyqe<IDATx흇sSמ߿;ټv	c܈{-W8	)P*d[w\q7ܫ\յYW
8$3cr|ί/  * B B B B B B B B B B BAAAAAAAAAA
1?xqRҶTxYY:pLM˶D琶
Cy	1=#3{	IRcHqj͆KhśW^n{rs:rM58^Oꛨ[PUPvq;8c'MP\Nq3[^^_xSH؊퀻&06Y]AXwx8~]8	[.pN}#"plfX=ms/
cm($p8T@J:RHPA)倇hwM>ǁc݃s6t"cp+O)Zׁr5T#P-lK;fG֤	4L=7N1|47>u7^oOl'WD7K_Ǟcn<]Gu`/O^͹p+r^p6]s:t1ĕs7rq5<uWߡ&vc,zk>}.<̴&m}TģT1#_G~]8̼bp_[Szuw潶iJsmAN|LEd%Բ`V/c%~QU&={=75=%=)niyL9׃e(8rF-|9/[.x{2cRJGZM7F\] NilYX\•^'骆Fq|RzݖWwr&ӆ	{H^_ڃFKKT1ށρ$JQV0iʷҒ#%5~gRx_u [(=,*KxZ\_8\v0=l=8
;/t
ۯ7E5jSمO\/P,e5"Xt0=K/"*S0c;61Lsי8^I1?Oj.Q"V`ztI2bvr<O$SsM),Oj:G],>ªB8ũEncTuN첍:{#Gswd1Xс{^flh	ۀ^i:^قjPVpiyCklU!@CP܋YM>Ua5l<B4	0T8b\=yvy7J
GW߄8OgVa>ʹf.h}I`x̓#/mx;./|
8b,|C_/w>~Սaj,e[lJz,İ[㥥e~B=3yC*4``QV=JGLU	BJjBT
du+z4kQEȍvԕeo&
8geʽ򅅕%eH`@\^S>s&Qf{(]{XK7t8$}mdv^usb1O)M4OO UC*JR9KR9ųHVHGf}'.Uc{RIh|}
yX~~YpyǖT7uelN';qU1cV>}X{i ו<X?KhDU3B00wNڡeèA}8X̐P>цnn>yML<򠌇CP<QiGτZ8pxtj#_B8|G&cx;hzg+H鵍ï
4U:@	c	|526S0s*`5uDOF~M8#zڣjLedvaQJa`DFkdp8#Zl,ir,AEX9\ILNYǑUC"pHc4a夼A.^Lmn
Î-y}8<"$GCq Fmo+r9ˊWշ}hFXZ8kJe+Ar<zl51vek A၊ێ
!cVJ
cRpȹy#౵kaJ<R1
>Ԣo4\}R&@EypLM6{k@%2DF=S#!
}'C@{HBqE5ZK!|+3ո
Cm!0˦a&ߧxzU=npwGm0s;l"uKk4xe*uا!PC.0;0LI5VHn80Ij33ALfS-	:C̼U$0}Á\!"d3/M͑<i#*ZG^./o<8@^^IOi٤;lɍoyGXU%[Xo E0okobOn*T]{T
>"coya'־*2+A_
-LX78yNl]42ۿ=3S^	P+?IjNOA^߭!U
jF֑yU*=p\\FK-=L
bRõ𻀃}2={8!!2c{>zhͰҊ7~bQ{uYe.
QzfnFh1쇲	Ou䞺;9%c>oD^4ec/  >
TӮ8P!.),Q~GN7Z4
.GlvQzNTA"ranXE0	X3\ǤǤo
Ŭc.8pN_yO[jg;E?pp;06qa8O,#>,1*}l©ioŒw㋒Mi3J0pcITVbӚd4衇Pm
kM0%bFw$cCoЅ4*YH
o`JyZ¤&sHG
|u}
|2I)<22aV>O4}cr3e.;csYrʏEIj2Oۛxi	Kǘ?#B	ӵ9/l"qjB/8F
hw~dOOH'ɅikOt؉[>'=-mrWƐ+]$Nxٽ)4Q
nPDUhzSSz,C00mGPFnTp$n3V­<Ly"R"ʯ>,2OptL++ȅl3:{vwd 'J{O$dkܴOoQyOUƽ#p(jAFgO|tqڲGѕ7BKBϞk-Y"#uojE7e*Tpn^i/:vn]8wp
$anAO~fuYKšN''v+]/s+9f o|g&]6QgR
HF~*p_]qaIC&j.3AKdŎ5WPpxP`zNSɃ/f^i+vrz~nN}QȬcp|AY+tKl="w~0oTׅ7+#
rzϓ0gSLEtQ1>U(-6gl(gd%CvaA'd9rD󠐙hʃw4AP$q!_}5д9[pB/^gucWǷmyǟx۝^	0bw 6&
bk/{vNAO%=NMaUl-""iKlUo#pm_YX`~Wޕ.OOS(:4X(qp첸^h[q=`hxS2'158m{Irn}RC7g*XfSt
^}i V.":Sȴ9l)OJ{&q
}.}:e;(rҲ/NAPd4t*AG⌨3F688gQ&@:킶1pz}m=1iRV"Y^zç~"sNg䶿dL~#!D7[D)XǓ~iB
JX\u/0kt7 e=7*@BGH>\bP,DOK_../~gRwdtWU/s=&CjMW	m$.u"-$V/zT8&0­|abC^iwIU_ĬJp{B<gRᠹ$__2!p_{zGeCηv2>qr2
j'
ftA'hp[u!_?A#4T_>OD-eOTL75{)3AH>+WXSbw0]O~ibcu~Dɕ[ӛlZC1(jғteWLb%235
WkCc`t5NCp.%%<mEnr;FV(11}%lRǶso`l©3"Wp<<Q{H™8DS|}}.-S9׮ʪ,|M[
^ٴ~mo#m>#omU{G:pu?zl=Ǖ%uP|gs~d#W˱܊]joq86	fǖCh8Qm(!fX9!l!x8mucˈO"[E"}C}!_m59g<8́cjZevHÆ*|SHf}wȥ嚦f؆ICb~"h"""""""""""DDDDDDDDD;MՐ"IENDB`PNG


IHDRx[tEXtSoftwareAdobe ImageReadyqe<IDATx\eǏZ*jemM,+G‘Y^8pi2TܥInÁAeL{8p2a<<~$D4ZHH-$$@	BBh!!ZH-$$@		Bh!!ZHH-$$@		BBh!!ZHH-$$@	5B.B@Ž-Bh!!ZHH-$@		Vː
LRFpD2
P)VqZ]V؄4DvT
tEERr	@^AhaǻS(-.ELB:2
p7>鹢_KJ\dJO^*(Ek@W >)Rh
B:usGQ !3RihqhֱOEXTrdlY xĤ@ZT
\ſ/DDJQ,G~7"2&lCDyEGʠVW̔rȡVU3/FhZt$M$IVBfV+**/E½x	NFlu$$ϔґ'+TJ=:=CdH	h_/)UeVr(.JG^Nً(\Mߧ"	JyA}	בqIL=*Vܹ{giKJ+Bn~1$S.';RYERBJJ 23\(JߤdY@wyD|&EE.2<@xߊFAUQYe~M+]B'[VPխmZvl*h9EPU(4=FC}<ABMSV|@@HN!I4JQ$+A:y)W ;PVv|e;o!&(/K@EY?"<'a
FzbG"ls)įAF9`
6R+Dn	Ug]|6I /5]!8'NVg;ձm	w2\-A37λйΩm8zzY_YSeWw,wTaΨA#lGV
'4S!eP%ek<t=	|cqtF‰F`BQ\	Z32{ As0]X$Eőc)ۢ=.Kq
G"]+w/HͪߦuADY$ƺip=H9	&{|D@jFJU];}/|IYhO||p6>9?|YԳm
\~kmW;cvac#=+n+mJx&'%PUd5[ҞRBQq	QHMwĖng!#"/-w'{r7ڋ,={f
RvNG,0N~8v
ZS&t3,[NAO:l6w.@*Я1ġ>#d1ekeg

EzI++Jo0old.̿ŗL_hi&B߾uyW3jiCGDHwoF_:=#Q>\NEBrK3pkP9eru%l^H\	Y
}C^
iyr'Y8*©c+pV m@;c.
b}[Н<1[yRk}vX:IX7^XYm';mCY݀¶5F޵ 9-Jo=Ƴ{_з6l[Xf\5W{$[2>y2ȏGBCpT=\'eAZ\BڊWըr%Қ)RFHLÙ+exgȔ湠
H7
Evml.h}XJYy
]!0Ml9N۱63.Ӻq`3٣5Z})}ϞLx=ˮiКޖڬ
o7ͧ&SKi-z't.1M~>tU,QYy,xa0ХUY
q=,#P0"b
]N68bn,ÅO@@MX
{j^c07l1u6O	(V`H4\;y>$\^@Uj
Ury	S<b{:&w̫ -)NYL:jh
dC2(++jY2YyfU"& .ёl	
^pu9D |vEdWPq7Th~ѿrzwХNM?-ٙ]D27./^=8ݖgݛ_+3\RO{:\h,i=g	ƀDG7p+lY"G,ύ'V쿳n	4)hzy4.+;{v-pݥHCѱN+i#*7n-J
G:yPHslPY3֧rdfP6")uXfc_h;T>;Te
 Y3jRVw[ڮż~[}v}mZdWf7h@y:J7ؚof)wk`Da7禠iWZM5[1ᛡoٳNEJF"O3uL/`DE#m:#(DGGp3cgɚQd}h@|}gˀWf
Kn]gdXw7_[jpl:jf恈_}@YUH={Pru}h6_ڠ"ӨfO%]t^	baN7?k-%4ϧfx|yϮ~	d@8aɬX8x]5[bpEOع60Sh<\0{PyLSE&Ư,R"m6<L	ظa~;
J77L?2Y:EGzdN?Qʦɴ%ڦdexmx;<_Z0_[x9vC5_#u{m޵=#(E@kB`{6,in	^)@ ([g}n;w=J]^0cB,4
S&Xbnv8(`zo/F~rdG,GEZ2$ܘĠeچkvan,'`Qغ}-y(9rHqXhU<kAWp9)d ;	r}`'>ݱ`8h&?Ok<}ݖՊfwGmO#l)Ua5pgk@d4h0N|>$T2{
*Ƿ.5# ?{~it{5H$zxw1a2.	؆+S`S_Xe-g"oj"l͂DUEl1ԩcn仝Qe]~>ݑgz%-YC!({u>%
3ZO1)Fz[7<>X1Ҡz%<kz$?UFٖ@T??3ײl5m =;=Sټ*J\koV
:#=Ux@l8FiNxw0z<nf_c=n>,~.n?!ەYp^s''T|bԅsC٠2E@{0BЅxomfS@Zy~Y8|w5ܩW?kUv
jݓCPhvcE,e4mгZ?K@|`G
츲yʌ?RXh?cؿm&n,-C.hlLg~iVQt8xZM))cO͙ɰ4s'"?
k.gaTQ>6d!JOX-z>nkG7Pkkƀ.Ra
w7=b>1g]NAg{z
j<-M=!Xb:YgrGLҲg'z(@ggg聹8oΜ#G(4/<[kɓGa朙7s5.üF0?4xqNcLޝS9i	돑a><6"
W[4eg( q}EkHWun	Z7t+v'6hᴼk:z]ǹ!Җ4kp!=lV4X缓ƀ2[
傀lwƚp2ef7>pgp4z㣙>M%%
2یj
NO$0 VvC"逧zCGbi-y`~d
Oɪ8t&f`٘r
}э=Qn cTVr(Hrm1ћX0;)54+i۷od4C>:֚БwRu>
n3ӌuX=eDhoK`fdN;v@NӋpK;*^v8[\3ta
Yp<
V
;oH@Ѻu;=7}03
FF0o530rBL^ރ'㞃`A7un<N	td5ϢԺʹhMdz#ZSk~)#~ne+
'A&U}lryD([,+a.
c8y׸NAUMס`|XUZG:M1!]fও!uf:ũc0r8u;>Shժ-"O>:?:^~+z3}t9Ͼ(=!L:֎8AMP;Yq7oͫd=^Org` ,<6ɨ-,c瞸
l[ U5:յ9BVskÂeчN쁕wel	c7<d=,K{]SeeH2DMxΆ!lzॗ6m%Юkho{
Lfl7dDrn.lT
+X¿
4$oC
F;oбPL˺-~yHu҅7Nz]˴?*5xvz5^v6e,bM
`
Dx766Ni\2곜4ɦ𳛈0D3k&"}g#u,/ðt~|>]_ňo{K!J~iz9ѻ7
9agwe;m@kG1=ZU<aOk}lIHGJDFD
;y|6˺5lձي,1,΁ex#^H72ߙPѢo|!s5:4DmEd=+-Ua =jýf 	kQa |9_Fg+kW~ (L7Y-%\,@\<+*Fޟ5z̺	z]^u0	y?VnU/H`o_AlQζcj'c޵N'	Xk͚l5Ol3W$8]zoSo̞.ocۼt탭*EvIKhq#=a؞q{oZ}qlj9oHo(HM0m8M]()y,7(toςFfz
4{
MS]5*&{ߏ-fƱmY9'߫(7[GvL+
Cޒ
u|go!(oW-ݒnye`5O⶚m^͸\34^w'<+.2[imtlc\_棦͘uXRUGLO`}n	"|!w!Bܧ![8Їw [&A4	n˗/r>{#&xPʬ(<bfil/͇	&zco;o_\OV8p+:œL.ʊðlub%Tl֘:˱XwˀWO`HcEU.ń,aǼ&]E*UOb@l=qq漋jݡ%p
~5h^b^amP|عzLcb(ad~+++|@Q0tmzbur	B\ (J9U\4z[rYyZ%o<}M~]93N#1n?,O/)(G֝8܄ۻ_GH|m.>8xG;W
(MuN@;ÐZ 3dQ.T/	'"H8?}	>e;kPL$e3Sw$ rN")~˥8dGFHhBBi{ၰZN1͆8Cԑ98cȟ;e8z>oCVZ!eԏ-BfFT
$%gv8maS@?^X?
'G{\E\|2ʄUo1T}((R	cBBh!ZHH-$$@	BBh!!ZH-$-$?44
"ZHX!!ZHH-$@		BBh!ZHH-$$@	BBh!!ZH-$$@	=$?Jd/tIENDB`PNG


IHDRxԅOtEXtSoftwareAdobe ImageReadyqe<!YIDATx}I$qޗ_Uݯߛ}0X7QD$$J–D>9O>"}XKSDє(")R؈@,3ۺ?3}{3 Hb<(TWUe1 `d 81Ap2cdd 81Ap2cdd 81w58p0֋uA^c@h~]][u˻!d/KcyAp*y=XW_~We%kxus.oJ^, ו:Al"`}ղJ̱h:u5`
on_n̘ݝ۳[{vL D0hܝDd͘&|;o;vb&xjLDpWqTmk>X=w7fKLQU`Јf9H]m[漽{o75"s
5af3N)%wg#'ebf&2zZ>YHa^,||zV_1b}HbΎ* luG/[mī_}Ln%:60p'"z߽~/](1:iv󖲝{L|yc~_kD	e9L{fc-">}'ާ9iODRxy!+سn_L)ooyWmopc s%
:jpُW)\UUKvuɾim{	^+}c@V\=-u+.(#&g'~Cg9`g>؟~ilND:Hj/"2W%H7F1"DDm;vҮ=&~czj{GבsG%+@,^hO@j]}^)/8EP/ nW[gYo(^ؒz#&v_7 $>q<	^q…M-V?6gfVU P3#
C+mv8ffff@Dfff 2Dus3[U0XⲻpEZEWZW;/s_=^U$r`fKvȑ)m[Wk_"V/\kq[[Z͌<`WQ02CXO)Yb@tv;J)QU1uHLNT1S|-RΉ(‰(;IN.[vr{b"<szƎB
Hg(|V#ɖ]b\@B Zkumafm$CٺHmwww3/{sN/l7^>yƇO"D}g3"ziF)HB "Ӿlw9Z,avF{wǾsiu#Sd*WUQUerζbrƵ:Ƣ+&ӽ1:'Fg|J)̻fvi_86nݸM~S6dgUujA@]ݝApgw0HDDbɌIDjٓV\DdUl9bK4(. YpV	%23(,ib<؛$g?zNNx[D0sgw|dz0+)\-3#XRJgi'o:|XUUfݮT3aBÉpACJWbJ"2a,""f)SHD}$Ll$fJ@prD SNĞݝ|cJwqvq{7d1LiKnMㆫx!`Q&~g8+XNn~=QX1Rl\RGfdYUSfrwl+q`|WܙDD1/!Nݹ3(rMn1aw
$,q2s7M+W^\DDd>Oϟ{y+X1a2C76Znww{ggg9~kk˼Z__!&UhzVZДŘXD	+f%~.̕X9ۜR~R^9JDe^,:&,c0HpX@ںU`R!s&&.Fh{<؎kބ{]9:o)8jT5;;!*
gǂked;<JDN(uHrafOvnMc[݉.gP߿MM竪*!+'wEv#
@rv: ~gʤh9j:
+ZTqsO<t]ّ#G={c	$duX___d=E`1FTթl/I:/}'
癙ȻquFo	")'iH`)
g?c	UB@A!@m@
ێcԠm!5c9݅1+U]"8@dcU5sO3~ews}([gJouuØ!שsePסlv+a?ȝ
[#kv[Lo:zC{GpG[T(6U+l"{ѡUanLNjGt眙c]|OގDk#d&0xUB8s&Hkb)ʋ?gƇwO&fGM4w
e\U*(Ãd6n7?tQ?ճ1F2SӠYDK"X@U/u}vw"H|SU BFB/ִi@gR%:d%ӋOl응QCf/N%;ҭ:1y<[Gf 'ʑ[L$̡k!]̵<4c$QWn~iQjKȉP1S?Y""䝝yXf۝L|/e":.ݏo?J,Dx|r]MDi8;shOpbfrf7jFP嫼Ixw.\!}?LndCk7QUU|/oOS9$*D薻,FKR[H?J!1p?l铻x<mu	 d@Dqӧ?ӹ^33&54:Rҗcfpw8~x%`gK)`][)=zXR^1sT%`m0cq緼%Tkt~
v8iIL'.-hDB)9\UDb=;{@_R@Ul%'Hݷ̐fJq(ߘN/aA9DL@ήt6UE#@~g<n.u)TsԪ]pQv}t:$"^{h)8#)Sc.x5^mp,7777SJDѣGg!YJIUɪZբ8U&14&]ZVJ!A/cc?OZU
)ѪW'Os0Vյz{~yUum%ܽ*)+w]S9g}(Е2+LL`r5MujٌЩ,IqF&n	5,uszcŪU!E&fϥbdvm`(rŽ?{Z=z"_f^pq~]G!qm b1l6gٔ*&r0ȳ3ΖISS-*Z%4&]e99wƆnk4}*kf9{jKIF{^VVNc Uu]!Hԍc.m-tmQ(N7|K_z]wr81B~p^KʉC
k4v0)Ç&j3uUm&{ŘH)UUe0!Wh"9Cz_%p(	l5Q֎Yk=`,}K#VӼ[MHDjQU^N© 7<ԙ(]ϔzU5a</#<Gɓȉ1&}s&ۈAr!l̀q	$2A
_dکnhy( Tz8`$LRYbIb[0YWn9$V.BZU]BRhvjəzt{O0#T(׵dRU۳e3b<wqǛ~h+Qw/'_3g*	}Sw*{^΋{bɫ	 Wv0}Hݙf=sFLfIvDΖeϪUUT[Q?q<w)3)E.N54IHгO|yklS2b|yiݽw?{dڅ53ԒY8k	yjqAv0Tٵt7.DT)?~	1ƽU5-m۾SJymۮ:uj<O&t:-_
~"-܅жlmm^漘kna0Ai%)#")m{mZsM_CqÆl ?-KGnw)Ky&W+3_DIY{$Jdq?枷|fZu`p;	DR*6:XW9?;&up_5J/t"1Ślsf;%6Dq%.hװ(Kn̹1GI7!"N:w(5cc2PR5lKU鴸w>l)]ř3g !fNS,S2ejfU_Wl҇滎mHUUpCos !O=TTUe5ȼaǷaB?Uʈ (SopOLvavuV!#ݷ]0CߘD1&J)ETIzRF=Z{;Ɲ󵣿{&MxLR(/8YRww?|V`dj2@deG KQ!3W>O$D\f̉a78[1jd,cp7СC<+cf-ڶU՜s(w/_\
BprBھ:+t}3,xZt<b]QVFphVYuc/z`QR)eを1ƴL}_af\:Dt@&"4&N,ScD@)0)	#λKG"u~oڈ|qvY/#/@ C8?6aڎ\J|~^ݿs @zbH*"\2Q	#UP03.Ќ;{87u<VИ!\gMlx]lpeHn̐`wS~a)WU%<zjc1Dqwrfg"B.Z5n{zO{]i/3*k"
Uc#;;;l8z}lֈ'?yT{MӸSO=;s92-̾,tlnn2!O3}AEE;WBblssSCML%<yBT5
[Lc'Yha0j1eo"؍kDAъh[7ΣkwO<LGqcе-m21vmKD!!4@sYBй=1D\	s.]E%Y,"}^U9EU㈙Ҹ&ZcO;ᙙMFUqIs}ѡtEsE*
د/7/+ԅB#Z7Sc99&YR8~==MllMwv
UF"ҶӢffnML3m;RE
̅UmꦄA׻>/):V"RHDq!0UU%bռLp])iluթRLjP
IL/骟W&	9qLB
ZEQZt}j&geb<ޟVx?۵HUƒ}dP7&j{]2$v]'TUUUedhkwp&GҺu("5nR̝@kqRT<YQL.='2;ew)yXec`ac2qK7eNO9O摪
eyӌ(TT$NmqT}!9l3x<j#-2c)%ɢ5)9:L9H(MΙ,"]4H.`!lJybpmvyp53Ky rUSfSLD.lDbۄֈ(VM
I|΃}8zwwHicP~e%4*)%"̨*}5kcݸ{zfꍌD1fiu,S vw̞M1}B۶dsqrsR6ib
Kk6rgD>փ<y\n}ϡhV*mL̬f.v d9yYfFHpwW,כ!0h7c%A%(B?C:B&a$iWb	Z!B(,~19}Q$=,N⁌9}M:g).Y&*s%apL(}Е+G]$]V&"X7=\ūR-qpFe$5mJD˹][
hZ>9:3P[y]@v@ZwO=;J
};;	o즉 V8o^D`^1Vb0KX
sUSJ1}8xv`do>Ot?|dcmc!d;UgXnXl/}
RklHvb|tM_5}:~wD3gE1;{6SJ?̬j2n_{fɞ~~xb>O<qTCE8czo
ڒs s)tt7o㱦~4}>zx| ҫHwUUe_y_]tTAHDD.9lycV8_5;w2_Qpf]Nӓ~_O)VF_볭-h<dLDpe,Au#qB`rxAD~_!p&ݿp_~롇JTv3fV3lK1Į?̵exrW
W^Bxmѩ)qFnr}ȇ͸q-h͈Eyn|qt'g(c5q.a·m/]A"}FKzฒ.ƣ#\vN38Z72:qCЏGz(*7xWce> 3W~ww?677uM$̜s
B,`1]upYþ:~K̿-q˾IS&k̜s!;yOs]aFTv`9E녮Q_][}䚸Ι?}ԑ\AAsd 81Ap2cdd 81Ap2cdd 81AprPH#YIENDB`PNG


IHDRxԅOtEXtSoftwareAdobe ImageReadyqe<+IDATx{Dh)D.- Lnkjh0cFLS2c0*4eQR)*;!Rn.:_<휭{?v~>y9mٲUPP6*8AGP#(
p8AAGP#(
p8AGPP#(
p8AGP#(
p8AGP#(
p8A"P*D?\z͛+**sGV믿O>yKnܸ[h:[~~r1f̘z뮻\r/bŊ]v٥uz?|С%cÆ
.-uرcٲe|}M6-Ydڴi8zժUGq_=z4=c?+rر555rHK_|1o<$Awv:wr?n
۶m{wo榛nBtV-cQݻwy؀N:uQx?k;Zie4㑻THGyd߾}oᄋzg]U>!aT_˺~+_~<ϟi߾}K96mڄKqK.t+ZPע?.د_?軨qW^p@bL{zB6ŻDYqw[\y9`'{w<DꞦG)/N>dŗ&e6Ћ$j<d@EwP>3
}эT<?cTvt	h	̰^{(mAܜiBDJx:q_B,c𮕕
IeS6"3[

XN8!
Y4g}{k<	[дƵ*>"偻viWvݺuLJ-:<]EI7֭1,Jɺ'LyWr&a
˗>vw_|6[J19S!eueˬ*+-: sw0a ]z<8qb]]Y!0`?Vz.?ަ"P蒢
$[J-צ	*Ю. F7߄sɄ>3'뮻@
ŋ/ZH5IdWcJ=ܬ`؊+,X>ciyٱ38Q(6mRxbe!O>k֬!>N<861MC؅=*CG@p:l+;3K`{0!Q5kQA
	]$viylԀ!^4kr~ań
&'Tep+yր9 訤33,x3gΧ~j.v_fcow8p&d	hyG7j=8#&M$5#SD[<O=f?ٻ
U|Pgpޣ`z̏>|8Ȑuɇ|:&qH6ܴeu>)W_ 8n8ܶ3gT$BALV[flP$%ɸ	p`hn3IxBP1cI&s).[,ie<m,4x;C|%CjaSz9z行
@1_mE0$+9\owވeWp []@ٌqHd! VUU~K/`i2	0+[2_aFځL2RYj,h0k\Ek/Iٳg`W:,=f&~i!)a7Y֍l^%kg&.#6z7v/܇Ok1xAQp z-FZ2&3$@neof,b]bGy$($:?|8yЅj2sy0QF!m5҇F
pXztABX`%:@-(:*ΚPa+s^ٳ';c+ʋ`K)Su?͊+TD1hnJe_<eIo
ٵoY`fN  h_É=Hd_Jc<3kɇ+ 0}ms4җy$TW>I=@2"I]k*;VeUi"0q-B?E3ph#C4M<|m:X)%Mf";cP,ʶ$i@mޞt%^Eb[@oH|ge35<j,e?SO418uTJ*G?o&Ǽ{'ut邷0Xh@\J`%|W_mR&8p9}?[=oc䰙Y,Sy6&@*smY̑PTTSIe'aHJ'W"Ě7*l>a
Q
_yδ4LOlVBB>F\Q}fXޖ`ERQ;!p'bH%Jl$/*MR&3;ZNݢYq]ٽ%q$
TVV"PLS4yyŁ>t+;s4]6>rH'aTKY03o+U$Kӄ%${p٬\&рa"~%rSYM
KCse`LT>f|uGSq
vm0}o;
L.G6/)pB^Vf	*QdGEyyoϢ-)@l5 hx!j2tMybb{=SYRNk΍
j7<i:/%,`2aeO"!aH~Sŋ-ea<R\AڀT{p	aks꼯bK"\a)ì<$^n0,3p4ӱ|: Lߒ&4
<-7!
$`LE"WM_dA%Ibf͚e>	a2U];&LP__/p0!SNJvUuG6-aE& LƖՓ*1q.Mæ2eyEN]ȓ\,Iy09'
d}e}Qa53f:yf̘1vXuYd6D[>+ݻwR}|r3!)x9bEs?DV˰(ՁIS's´ֲז]GYaoj^[vW=rCfMߌg'3Z@Q1T@EOm6qY=IECDLtf}yMHI8_5%k?Ь:9XD8j~ECxllշ>ȅ.v8l!eL`C
D7o޼%KH&MȢ^X1@
2&NNWt=+bO#0w!'hݚ%jd\ҥK}'BSL0f:pү_$8Զ[9%_YGbBU9j̙ꎰs<ꔨ,cM3`WϜ9%دW0~ە3@x:T}r:wDʣG~gq
q-5jfZl0	ʧ^(w&$uJYxOгg#]sD][[V$6æy7H`!YS"~bjΪ*Rgϑn
Uip ޶kbEi0uTa"f*A^T'tmv[`vGGȠu
'6yݐztfٳ/81%>ZL._B6mż61F`fâN3PDDP大z*Sa[[$vK/,wuV74lѢEZ,29.UBgC٨I';`S8+p$ZbvNr`FĖNS!..xE#
spr'1RD٦_%^uUP,JjnJpsk?Af`Z94Ad)Z%Y/\o (h$zobFseU1ϰadr]555W_#3s9ىEkyV$'˜bPHT`GkڰfY5rPcQ/):'J ?<	ƢYn>ۦ4(׺3f̃>hݨ' x4ċX%R(ƢTKl	SaNJ<*M!}[>ܰ}Z5/4m$fa[i)5IKJU>0@i	wؕY
d㹲;*4؁ԅ#…5SJ?<zDՖ:ЕkU۷ten6$[e6ZN_m0^*?<oNX<OsL-8JsѤI^yHP·[m[=z5ؙDCOJYexh_&նNKݛ|
4pR#`hNPkQY\~*!6l#ԉc9VB&Jcjk]R.QuY$[&8UR8
=j2鳝fKQNg9
I&wZh P֧IDSPa5,PWZ/LB?ObZ}sP&Qɮz+ᰟ\'<Te[2C4=W\Q
Yr(K5|avթUH#G7

 ;=РܽkّWQEӮY\vb%r֚^:"OV?SBҔg!^tEzR@P]]ݲ\cscR5ǿ[*v4hgo8AGP#(
p8AAGP#(
p8AGPP#(
p8AGP#(MRIENDB`PNG


IHDRxԅOtEXtSoftwareAdobe ImageReadyqe<IDATxHW!(HP,A
@TeLdEPa+k):LDE(aLWRFјDw;w޵Y[,8 p@p@8 p@8 p@p@8,BEG׾='''op8b=Wbce¿tm;ڊ'"]ϗ/5疪JÏoG</pL~%Y+--R%4ߦR(Eսz7PxeBw=cGt,SVV.}n[qvvVĄWyy},`
\*86&;+-VG~~~1y<x<p'gX
!GP^bbd\8svGƻMXm|ZN
5#ew>e\8>ϮልL]f=W+l,77O9˞[Z^rWoǃh]R'_k_<Y!FйQJɖl2دjU"TOjU[LʿH9r 5'U,>}ƒM196:IQuЇp"p4	Fr:sssZ](Uw!bh(hE`GAͅvoTUUe||
6C̗^7nY`6پx"p:v옺8"%:S*mݍO^%%%^^73ԥ3nxLs,D7e]áTRϦN8s~=uͬ`Y˔p%jO){f.7JdDQhirSo){566fpxD?7
#`*9pLOO}RԒph:۾Zfo[G杧IbLZgn!;`j+=ČMwh8ȣfmmmƛzS1/
œj'gJX5<xA^plC̠@Yau~`vRqㆺZ؅=-	=ԏZz'Ūl<T^Vy#f7#Q]\ݞ(ϼaj`/ٰe`ɞ`~%#?UTO8fgg6Pb|Jqz3͉lW~IytprZ0نA8x)zRTRZ b/..niiHgMHBCNkCk&pjm3%>t6y@h7+r ApxqU#cM2<z=vxm8NrĤgf7ΥxFVpܹcd|q8>O
vc!|Tf
>TmAj$npFFF	g (Ga#C2QO]3D}\nlj_}~E:v
PQ48pXǹsۤlL%/{Ғ,]@OOА8".w=wQS(Vߗ6ѣ.pЗb\>ҡ+W6}#>zJm!//!]^X^\8*Bŕȳp3yLv&ה)A8OFo:D
DG ZJAٔݓQK//ZG!B-Q/spN܂rnPW<h C<CЉ'd$Sا`&EKۆv$-ٜp[_197$i_
26PIoՊ<T FIL{Qd][Ms0#",RCU2 '!09>	XEΡ&re`Z!ga"(j%Mڟw㽑ibBt,(Jwdp@8 p@8 p@8 p@8 p@8 YŲ
b]IENDB`PNG


IHDRx[tEXtSoftwareAdobe ImageReadyqe<IDATx]xT!=DDzia/<I(	;{B%k߹;w&!o;_df笳ksDjj!ˤ]VSS@)j
h55ZMMVS@)jj
h55ZMMVSS@)jj#hvmzhT@ZMVS@+jj
h5ZMVS@+jj
h5ZMVS@+jj
h5ZMVS@+o׮_Ig]]{iMH,4jxpjHjv"}LRtp߸V@v
:p,
w<xeNYcC(kpwR#A99`hjv<U
hc7ث<zO@ٟUlAFnT`g*j>X}3%Ek4)Cf葲];x\xPz=x7{ҕ

giS+;
ۏѾg'U"9r2F'H`3
ydzV7>l5>wڸm4ypվ{ЗyRXFNLcwyiՆCtݷRc?zيЛ>^b"}	M]&p
'􉊡(7fQ~'@;\ȅܞ<znwV3Nsq^{ݘEtWCr!i6<Nap{7rzujLTp<5|9J6o-_̀5<{Ooʬwm~-}X,Ůes9|
/WC&m̠~kGNvs$(o2}m=T<獤Ġ
DSG҇?Π;Υi>awON,x
فY&r{0_+BFܳ9etN`l8n)l`޲Č{6_Fn) -aMj5c}ˢ25h4
Nx+T3KפVo<L1#PwGȊ%5ϳ|֒=s\Pz*Q
8Fo3
^p:{4lFċm9.4x5cUf򤏖J^M&o}/P	T~O]}r,BK}
A[OpCwLX{3׮0;z=Lfl6w(/vv:h'A0ūGtTvn)cEzlP-ghŹq#xe,mPuZǘqO7<i?'6co?ϤA֋eI
Ɣt9v+=u
j6Hhhl\utEC57.~,
܇=#eicr~󴗗t֍zr#왛|<ZvmwR2(;vN({o9(X5{O
~<k'V\4`@ ~Pmzdz1TX`iU^HS7;WY=4+4T^	/[f!"Cefض{@@U~1T<У)2Y~dv߂'D]	q'
׷:A϶"Cr&o0Wm6[5UyAoG
W4K*ͯ3yd9ɽy|߃eB[I_gS
zO(}ll׵<9!zЄ
@Zαz'Nf,EA20Fx=DlˁS/'Q¦~y:='izKSAʓcꂝm7ERUq*Ĝ+>@͟UDh\:5
fM 5cnfOИڇ.99A!;_wO"4C&cow9D|
prYx%D@^
hMg#iI~Xv3غmf>fdj!X+Z(bxdnԜ8}IfmPF1B%d "d@]06=]hĚ-GCϥ<f	Ҍԯ_HKv͛7
f;(pe8HsOu&䇖Y5x/Ȉqx_[Hf5	'&|lp.|(XT$aV^T^0k^Q.<:ⱹcA?'_0جU\|-5i)0ZߴN!^
ArnE<IZ}A?vk79}YW6	& Kˤ5:77vWhq7M$_X".[Bae[DF	rs;9LM֏Ǚ:#4q@\͎6Kn[qo؜A[k۰Tc೩ד's):21^X$U^π=P35R\ýQBѧhOӊOJlm:6lz
!4?O$jTmrFD	ҨE)jT}KzsAT_eeu.@WYw݄F|+M+VgߞxLbA\3J2@7zf7K/`bnMAhC;6Sxu#IӦl	m=*k1ΣM@ fj#?IWo;QK|.OJ+s
SB**BiUYw PP"ᐭjWC8~˥&7~w*+8ހtOڀs%~cz
_0Zz`ʹ|e^A4n(dw6n"fIJ04T`B1
tP˾W+J):!M)	@ŕF.Y/aj8"pA+JӐiõc'hKPأ1m-ZQ
ߜ:zxR(V3&
W>˨;ƘAsE>o" 5M~Y&q@4صk7=ԝ/vJT
9TV؀iҕ:	hfzJUw_G-$qg!"gP8D*))+![u;!-U~~(cgneL[˷̔⟩H,_+W.%.`:	(&{콑f]ޭi>3
y2
ItI%.,എGzXs!
j>У4)_<h(jddL$JW%QZ
nTJ8DH:v9ڹ/ʼP)R&ڭGtv!󥳬^LzʼncPEڅz\3WI<dΠ
, uvb(>oi_@-U	'V->չڽ
q'KarDU)o)(}045h^{ZkS;Q5;6$p0~'hV|Ci{hI7YnV$S0CBsR\3D{Z8Id&Z/'y)04b4h
)X[74pyn[t. uwO6aÛ>X8+D-	GpJj1T5(LV@`#7{p'
Y-VьE
Q_!i3GMyw	 E|x$,i9Єw*pT(a	5˾G{k߃Q5phQƒ:IɴG"s#%hׇm!:dJ?
)kyL!{#{>n9"2aK~
1AِhmMƴ	uv$t:qG;qQ2i:WK+̀Nw@=C3'y}}hpCGpOƃ0I EI)XCbtG2r<b
b[sejs&v))Vb_%8pkաkѠQjI|;)j9:ΖMpl3dzgS

ώ%ʁBpYI5q
뾜*@^BY?Ӽʼn"HK\(kKtk߰*dpE,J>}:3~qq9
E	\2p4~QW|6?5ecǼӚ~Zj#Ziu26yy2rsW-:{Ё>R>[VN)xDR$S_*|lv6no9S/׿̧S
 i~*OD!N-PV
vQD2Øh'#wQOH(=S$hCti/'uI4L);oFPb_iotl(v<{ؔM.٭dhI9ܫd;Տ3D</RLڇΧ>H囡D~~cGyXY'B1E{K8hʬtt']%WVI.bCVk6Hhݒ	HU2Yx
J/Iu۝^֥{~l4`lzXJ>s7(g1Y(xz=<0&].C_QR,@g)B'J~S#u>y_@6;ʨqe@PWQXt,t^
"O;̒[0T!QbnY>%X~~\DVH|ApOgc5)bb3(;ǭ『J,В5`dW~Qc?-Nn+&SZW&(Hx\$k?Y?Z;	PԢ
ͽp$ޟn<|m-;ht-uYefWEGp0@CF
&mkVlaig
a[{"$$1[uQ"Ӄ%flu2[	[>g#$OdP62e'3fԠim>LN(1R	f%/ݤ>cZ{{k' 
 1sQ3W,Qhs'A
9d545vXuZ|"q{|PÈZ4C&ŋ蓯fQ?m[mT;bI!h#إ1IpGv#Ml8lk7q۩04{ՐDu)u00l-t8,20ۀB~BayH>yl(	u;K|KؓgR.8$S
5)efvXPBiFӘk"x蜖COljY=O~j]:9{7z]nh류l8tcӎcTBG
fAS)jJ-n*GO}w<@;0;mEp{hm2&Q?exuE櫒^MbTб͒Wg0
u/X2TH<ᰰf^'/+G@nJm~lprg&tݻAVxxꙋv7*m6ٜM<u
a`s7(
ww<:4[$|JGg˔P*U8
T_^Ujyx#d)m@͝*oSiȅ
z"S
}{nvfoɏfKwE]T@CB=%V(p}7<~@[ézAdAvCLIy*jxЏ2PٗJ|)6Л59"lTax5lTD俗aZ-'nyN)!\lmY
!~fLB\n5XW#jd<r;fpsS"#tqG{ziP:x9fO;}
XP@=r("|=`$f,2Q8HcހB WWsv+>X,f

۞J>7.[E(ָ7h1HH@-A!0Y*ڗa@%{Qj|w;_sDyxf09P+[Gr=Õkf%)tF
\:n3Ėuk87]="$5Ԇ~Cvs`yu61թߚG6ώi:A堷pvnɖx4bIdV@*oMe`ǎtt_?@= <6FG3f-P$~~s襲[=tf(zExC<#,8aPާ]V5	tȃv3k=64l5d۾%;ywD=qdBj^^*vU׸syYF;&/vnf1cR#(5ho=5:B5Ҽ.;,d(J݂u'7U2MU&iH%92
xkBe<P"6[=ҙ c	s3bm'PF96xvN˙xQ
r<CuLCc9C/hv S3Кgz$;^dMgK)d$ЈS,6:ydPՆ(
!AԮ够Q_AM0}?G-)-9v$
6v^p2S(8li~98MBU&S;LM[5	;zcl'@DtYVS@)jj
h55ZMMVSS@)jj
h55ZMMVSS@)jj
h5ZMMVS@)jj
h55ZMMVSS@)jj?|QKIENDB`PNG


IHDRxԅOtEXtSoftwareAdobe ImageReadyqe<IDATx\	tSeg@nnЖH) EPEE@*a;s"CѲ*4{tMf4i{/M_^^K:w{Iחo{~G+,HX08`p`,X08`p`,X08`p`,X08`p`,X`p`,X08`p`QWgիE3fRSy))IO ?2;YLu8Z^88NYU=*33l;*շ/cbvx8+$@XV'-߬8u:CٳYؑرtd͊`pG,0^7%.[`= r`	%,p$z&NT㴼^Wsj
Pp?vC"F]GӹsPϞmxXjt!mk.^䧧#XDG,^ 
|:K]j0ȎK?įU{h/^\de,h!J>Kêg<.xYYNUp T9zq,:
)},ZdVj$ƚ^zzqϞ/hZdAlih߾
%p`ehXŠ;0СmJG˥>w=hl;.a!f!xOŽz.474t}0&J0e
b09]#FD**?eJ1|x'}ppxǽ
,'-
S(AVΉNZjU+23YYUW,ߗAҌUp(Ԝ(6^C"
.X384A=Gtĉj2`,/op-ry	$&!![[ܻ7xʵkZХ[RåK5ɓɜ9	S8}[SSܹ%"%c`#[GpֻqݟF>~brYiDgW/\V؞(Yu.;j5HWQh$Re_NRR>{VYP ߺUmϴEE&.	`]2f||maa͉lܨqCѣkkZ:2ŋ9Ɉ+3W0@/"jhHاI!hD$;Gۭt*3d,ΐ!DNB'>&&D3fH7o_	_ݫٷT}CM&E">-ԩn#*3pf*Rw4oЀ!KӾn+ԟ?ppáCS a2-]JtngơJgTSEEW	i08֯67krrcƐCE {IRS[)d*zqӵkRVTOO4ܸ]pȘJd[Tտ?7%h>\xp$ 
OKL,;vM)6
^uuVIVXL"Q`24RPcUUw<
assds8\f3Y`G\d*/j-C<O7v
tHJpXիM!|Vq%/db
]ڃ/XyFUmR|9 Eu
OW8i3 Μ}Vϛ';W⋢^xRnz:$p+𽉉nRCn	-Onݥlq;*,){睲`I<t琬\	vB~"|4HU!jh7كpxBY*So8u.؃^?x~߾O?\1d咒ЄI+2pl6v7FM[)
‰gΘKK-Baق\wGk5mz q:~M+PIؠAKH_y3wH0T>!zF䓕|MG
oê"Kħ{N
7ZQ?6^$mqdGE-	^y+R
ԏ:,~vCXXyAlͦ8xb7ÆaZ4c++]IdOssw';Dl/.&ͥ#:*JUXJ׭C^Duذ`$2RsU)`M
eWrjjok)vq>oq8umXXi`],ERԒ9sXVNJ
WHsH?&tF;lo
gׯv1XC\neǷZىA쁭.E^KCrJ0eˤ oUVHLѠy^Ep6:VLpwj]cq:0XSedQ$R_@Uյks={ن<p0#ΜYEee^b7:t	:vLWZ:y?aB{7UԞ<(,A'W)/oPjmZYV`&x8&핖q@>1 X\2ݥ!|Fl,"dLe~LѣnɀI	?19֭@	0]go۷Qš=ya!9\RABYd>`INO`'Y @@
=vLDE?ooE'&T)sskvFN(T?ϐipFd/tp45X
mg%*gԨy~g&"DJ6m2Bi`+ܤɪ`p<He+&9J=pCO7r8g`%S'3O"2OnxKع(bY*q/+h
'&F]TԞ<+(w+nefo򞩩utU!4^[J:eR{C<s2Sݺ}!z)ZHt)A%
pAm#YC<!C?|6LxيD믑!7XNwAAR}y^,KNJ-Ko}iw3lU?ʯUYYo/^e'2FV+ٶEF*o/p|
T8`VV^hnj,$Ç|?u*=XQzuM08,q刟yƮRZ_ʼnT]k7I<w=7=:?A[		0*5[0Ql 5*;I^?kJe6T<8y$$TV݁=Լ`R3Ma
oKIgNTy gr~6˗/g'\}sT
i08V;J;IZCMuEEZ,7(zw92-Qũ~"a޳#pCf0Fzn./t'm،쌲={OoS8pFFdRJ!Bx/{YqsXtfMK2{*y
[[O
Jpu|6@'
7~0x#R 4#IHYesf̨ؼ3tP逸)Qm0Μܼi'o7}֭n9Sv1#:Z8f2,k}p\pTlt:&S=JްD*a0䥗 N^OFDTdfz;ʊ#@B|r'h
Ӈ=K|V""jvjv#Mv$bc|SuHMe=L,Yj0gδSNd\HMK~.8Pl2e,+kRi0gaEslV?.zvѯ:O>$azzɜ9 աC66F8q"@Ÿ|r֟wGy# ʸyջvL0*2/휍Xs0EG+vkPDMچ]XL7o{_Ǽ8۶V db	hpZؖ\6x
X_\햪*رPT}Wg-?!jzUf#r
jF4E[GفƜRw˦=k0p&?l|z<Ox͆h[eUV^2&livM޽!2Hg+vjɶh<GпH~-AmA>r`Aѥ_<bIAsM
J$6f4R&yy}&M2vڂa[T="
4܈Tv=Y&?;:dHjb%ݛ^x"B^T!PM߄(%-W?!`?&'K7lIwI?Xc`hk4		GϘ!6
d4ѳϖ2wM\.9aӂ+N<6mjJGL#+E+VSŘ k	sK>(eVQIv*Q-,:S+:V?	Tff{#F(
P6f]СԳP6єN-l4g"ie

,
N;$)

°
&q57{\2p]>=9Rn[B/ɆaRSnҞ;%QQw)_K!Z'ѫr-J ڀr
ӁO<:{4&6MqJmJ8GPu…]wذ<Sρ@Ο\S͘Lj#̺Q[
+휖hP!u;۷6`DeA+w#8$#2TB7˖V;fC?32pҮh&innzj~vӇ
L8ujM^I"&_4p#Aj_ݺ>;`l!;im~mJ%0tvqޅGz,uuYI:zԌ`64ՋC(
QP9VEɐN||Xq+׭cpDB(KK@j0@)9a1l͆J,pY~Ҝ;t!RtϪ~ICfǦP0t"Hт4+UmWI) /(oHY,
Ε/Yau $\pE:%Kd@!MrJZ٣GhR
myL5
Z&bj5_~YI|I$&XW~vZ y\Lqo(Gxq,
c͚M@
d kxgrk-dCD7gXU#8rzҥe@e6k~e7%/T>g|b_GhQyW_"d(v׷WP7?_ӧu'NT啽hd#,ȍC*L"92*J4{6dC49^7nt9u"RǏ??MM^Cu60.=~R\d(uwWSSscMkNȮ]sكtV1"@0m&xe!7IN$3Ss'@mr92U.*+o)_|ӯV 3gP~MX/-]^$N /՜:h,M|SܢjuɲN*7|S3f&x)}1JNUdgWnݻfNwoMk*>P~k<r/-D*3bfɶm#G䔭_yS{ .\mVBApuKd`mW_g@8
LM\kx@cUo6+rDD "ҧ
Tl<iW_	gbq/@(dZsoLz[رd=HR0R7$[}%B+4BaʤYY I_Dvs)')d\ߺ%ݺU4s&gPA_'8!~iiieD_)qN	8\Q0!:V4Q1Դo}`7ͥ?lTعSeKͻddԬ['7g.\h˻;F-uaaEF,޸qdxrx&ϯٱL#cp`,X08`p`,X08`p`,X08`,X08`p`,X08`p`r0!҃ىIENDB`PNG


IHDRxԅOtEXtSoftwareAdobe ImageReadyqe<IDATx	xTսVb KQQںVTVmXk+}(OTPI&3IY Yl$$L373sgVo]Μ{snN#A2d.@@@@@@@@@@@											$$ qM(:
G,p<E1,g%YP~^	oO'"UHXgI0w>HlI½&`/A0@FrG#yA4q;cZP>νs
E4cs8a3JOo7`n/[Ag\*NvBi!6ۘ?ױ`Ig4p^mt2tt~Nb"IKÈw-M7}uj{jOh#	ne[ع<].iak{v#\䗶z}+kcy:4z0HqaX1Fox^bXzG&}6gL^&6 ڃee8#Z΁j97ՆڭԨݛ}"kv/|$9ilտ0ITU91QRHq
gx1ӑ^owpwffE+dc8(/9j42*mF=[[	xUHR>]8`rCc5
6SNT<^wׯwoX ))13\.gIx},B*yXVVLXx\EFim`ya|Ӆ& EQt2Y9o38`}`'7ou&֟馅aPNn;_2sKNrF8Ƙ
e	_FD.1'	xǓZu~7߰~/HUd~udQea6*:/۽(^m6IF>n,#4~{U}}Me^:,{=҂ff~bOaSQ2.Cb?18`n@g;0i53ՈD"~<5lEGd1jU~}_?m}=C!pX~~N[O;XՕlyEHn`AYJWS`NqB9;IRu1$\܄)0P\*;Po	'HZPp)M1S?r>hs|TvC+rzNțm+v4?4zNG8vͥ5SO0[< nӿ=BYNRv߱"`]nNy};UC
蔻ki+yNqr!ͲB'bxxB?cnU1kbmAA<^Jέ~	=c>WUĜ
:\MX&09؊਎?9J_^FCV &)3wQof/G|Ct3_os0ߌ+[oWSy۸3NqPp	4VrztsG?dWt0oc8Vy(P-yA|N)~)<oݫ+ָH$YMa`8&<|c
L6vRfzY%	@Yy!|X+j)?qvOZMkZj	
pb˚Y4f5O) 6
blk#:Z<PZ[@n<"NZOR~p_諛WF盛he`KO/	~>fg5eiyq_~<)Q%<׵;p%58ZP9h;ѨrG55S3𑕋t1\ciin捪mJȬ/8/Kav
1-pƌ5cH%-RdsRgfu?=QJZRҌÂ)Smn_:"G<G,(vO>X~ Y.ngw+z]>]XZߎR&o,LZF!Ȫt=F;K8Zݰ.|!?/yeo
||C^3@F'jwML +\SpR7qQS?06	k@{pI)[AfFd.vS	o֒FGF8"+ݚf϶zm~_opR_dW4R7oSW[v>SjOF{	8b4A`ZK>9ׄg#;%U#71TC±Dc>\u1![-VxY	9ƨ9ª^!PWskCKC~Ȥj+qTu	F1'0rL7v,\6KoǙG'ITv1;;A(b[(q/7y=웭]ᕇqk8LPɆ
cajlHj2]_A*7aa_̮)ba,!2fY!Qyn5.?uvb!}WxĔV-x<ɭᡵ2O4`|<ͬ`Ovld*(PA%URNIopT(!2sq	1,ha/-!@.~M|T3^\Buk7b#F+c)Z|E%voQLSP2n="ڐJC+sky᭝̳:FpZ(pT^
nl.( ҬF.|Sx)m\_NpAdc[¥ņf|e	Ì
B'~D.ujBdGa8obpiiZ@:~q6P)%]^BtIZ"}$aD)1Ό4yD
mrEplci"%%xMC%wۨǨ"+m
|lK!^?`-gm-9}0\J`+)f	J&||<@
& H-jŦlcH'g6FUc>ҙ6x$| O_, VvzGUX_`IwaJ>nIL-6<^O0Qbc/'QD2}Qut?_l"Km?
+rr~&5=o(?l
.O
Eۿ28Ӄ0PO%J/iSR?1>`VD@tQ?D_-"vy_r.Hu\6ԩg`YJv!6#$ơ<>TO`qLxKY8ӕLAڳkJqCEZ=N(<p&/	ip`iJ3tH5{0A"?+
+߲)wf_x/2=L_d!Oߪ4}D*n;D%Ypytqp_rc2
3Ղ?:$Q8bod0#qꮃqW%r"-=hpHCxS4 OOlx]fV(yYVmUi _<JJ:B^םˣ#];|}̷ݓ_s޹+99"zRgNٝ$E>	vG-NḻV=Mc9i``?'ZpOʨPn j|R>}L8
p߯#<|GPMX"ZZHXzfeK
d>⩯4<}m5 um	y_
U6 OL0fH{Y	(5ĒJNSp+k?NyyF76/=}k9FVbӲC=F!IpD.e:NV`03Fokc`atRlse)s1Ssxh$#9~3Ss6+K"ʨhO>!顰<uM0wPnɩJ<d3FB\5G<B=m϶_wCM)8/Yd7]SpMY{~ic)&hk(t{olpS~A2ޛoPvՄ楥3aC̩H<fu1ȫA>:h<ln%*|``/'pͮ-k\eW`(g@eǚiĊvnJrniA([QxtAe.?TMNz8Cśh=_{s,:tZS|Ѩ!r!`ɵemZѠ<br.N:wz{ḫi!p}o̘c\OIM&ȿtHsThsxƕ'x6Wj>?R<v`YPp|BefX/`no3/읾E-3b[]+CǗ2k4EHcd8@šeXJa-OCKb,8ĺO$ܠ<RK,=]<D'/fw.G:-%~޲ǀH 
B@@S|_Gc_7gE2E1Eʏ^]/nf^HuϘ$)31;ٰ!DK9c-nGl'ML
<[gXZI)2o/U$@̵3:[z,	v%7pt!-֭ڹFXU\ZMb
μU&89n
Ոu:+oln!(NI`if7ʴU\m/		uʕTnbV.c]%{VŦ;8JԍjkwЊW
LU(mF0UG<eФS㚅3h(RdJVwY!I?mM;nA
頨!1u;$
`x
٠()jFfa]ʾc{s<|=&\ei+'t
ͦ~z<5^IǛE-M+!2r7[-jcLeH3.8w=~}S	-p7B^vV~f&WϴstJ6Qy	~aŭQ8վlwk(XXQJj>Ѩz[M|RV!e`S sag,+χC! c_^h{oqmha/&+ŸD`A/xpJ|{w5>U$_D>m%܎
|$\XHSاVFh>\_UC:&A`U!G
7xFJ[6Bړf8U0.6Q?psr3^M J<o0%z'(gt䜒3+z+C9!&'xHe<9b~QxA@:3GLQp/:D?wo:3GD Ixlv/x=^4?LQI#C?aǁ!->p$
X$SH>p Ap Ap A@@@@@@@@@@												OMym8IENDB`PNG


IHDRxԅOtEXtSoftwareAdobe ImageReadyqe<&bIDATxx̖snB($tAAQArPRE(ETҤCRH$Fڦm6@gv1!~o}ݝ93gorΙP&wM484DC
M484DC
M484D
M484DC
Cn8/Gݽ{-[~]v8p/22jY?P|}}׬Y3yyEH5{g1G/Z1&&#=]4;a}i^FI'
:o3}~zC,݅<iʬ#I@Ϯ_!&&4$""wܹsu}/~UV((3q,)")]OeC.rQn0ey(MY<xZf9ĉ>pka^0<Sa 2kf)oQҶEIVEZy [FkғUH,U+fLa[	߿O;vkp4j,/]4WY΁@`ET0]Gȧ
/ڳ<Яrĸ
kr5,)"64<ႯL$^bV"Jfi<%JF	ɀߏw?cƌ^{m_|p8ʉJII+//vbeffDG'YBBV^-s-ڍ*DX+7\*w|(-./,Wo/*g$s \(C
q%
(>Ȕ)SYVӉѵkWllpW;w7mڄ:}
58mFHH澣(lHT^=]YX@sp(ɳ*M/-hu.۫uw62\@2S"Wse2<c"0@D޽ׯ_hѢ3g7nذa6mX,eaE?Fw~'2>EͲHiT`ꏛ1p2qa&=yY [Fkbk64qv :,W$$T`oL,l38jvK/ydee;vlΝ_%Kf͚c'xO>:uU;a
س+>YDbYnd9(Ø=xZ5T r)CeK,$1kGl6beUyWr U Om(z PHbU!>_B𧞺ˋa6ipܿ\QOB0Ռt66O>^^p7n`oR^yalF^!gMyυUw,Ĕ@,yn]?9# h^kkc_mdd$=zhTA+h6fxԌ2GdgLΧX\ts~Ϥ
Y$rbPX,"I,Rޡq9mFUuq0lx722jkKJe"4dիWͱ!ם?,^1]W`Aښ^uC7Lue!tD3I:0HX70
2'b4|>SA|vݝ4gC]@}y;v,ݻ58u*a|Ct [ `TV^q#R6CiqN+M]Q<;u2g9ݷΝ6ߣ_}-Zi&ae;.(/b=ɳjR` *ЧOTvvvVAA}&+7)אN[Kʝ9+
6~tk5IX#
@}}7 ]l`}
fX	Cӱ2Weo
U:rI}eX!a*4g/++O8/^\MORva]Pyӌ:/܎^ݼf.n[vJIIIpiΕ=ェ;?ZId*Xd.X$ z艏Oq}>СCE8KLF<
.ET88aa+6H^{ԸqVkj-U{@f}:=N>|
O>?z4A6212DxuPX԰іaÆ]<xMipZS\lj&)1f|ͨT/Ւ{sO #]dK%
H~njn3E!aa^P/ѣEEEa1Ij_H\WWTtEQ,Kz24:uL+ˆ {kj-YS2"$Q$ݵzOc97PԐ#BWoƩ3g:+syALdѲgNNnval7Ӭ	q^Cfs)0T}jgyYIcSddC!Zu/+W2 &)2LKl߫:+!鐱!6,
ݼy0K.hp~<OH5tLkѼ$6$sL+&2PhCnŶ;ܴ},%ro|dagw.fswyj$6TVe"!NSky$ٳ	/kwӦMqF	#&rt_}*KJ\)"O?nYUݳtX!Jx[6
8|'S8\6VsLZ%>	-kD999ulfip4LpإKǫp,d	[end9at֘&	V+y,ݦk’:qǮf:}!fJ'N#YμyurIWGĥ".qIfɛɜTk.\cӋip~n݊ϝ@R.dSd+8ז@W+	jضJf̝[wVi@,f@uԊEVQ"VȂK	`5*[ZYK5|M\5kT5(--2d>w%T z"gruDI$C&7 :rn/]
2g6KYm?7k/cƌ&UBK?)'C1D_gz냂\hJYsNRd8Z4Cd/Dlٱb33[y~2&2Nt+xي"ĭ%19Xs%&Yⓡ
G$ ^Y
FEE:ˠq6Ac֬YlSV46Zn-MUR$!ER/\GȦ('XNwB,8i6q">	"Vx;mi_?h<-	YOdI)q='׳6l<yrmF
GIQIԄ
>OW8W~H"ԦŚ,ґ>SV݋ǟy_梐$L
b˘B>R\c	'˖{cTu2׏48!00uܲeGBc'cR&0]KzjJ.IUQD\<[۳Y~Nv#Vr$![`EE4˞s5eQ<ܵ%CVP̉']y{{30GwhC06
Ñ@lx!qL#6A+VzxYz̨?(q2/:$)şÑֺ$W/@6]X@'N8իy[ecbOb8ޖPvҔDOlpwj:S\x&%&>&ر>C*,=ky.HVY6PE+sGSRoǜ,̐;v2d~d^\8Μ9135F8<Z$Am$>fƴ
	[r6>T5:Țy#6$m	҃׍"c3	,ȝˣÆ3Çޘ3LƱ0bP5MF#cƌp/
@B
z?f"66_Mj:2&N& r$jA3b;jݿ?5h"sT-xI#!25)/"t{s999nnn$hp4Lmۆ*oFWt gKHlȤasS?/v*#OQwkPпwo[9>ѤSopVn]$n wu
?~\jO>n0d!#"%_~-GpE2%ΆX+Ⰺ6b!#eL


Fn_ju.]M,\DWc!+`|x
O?tϽ,ZWwNߧQ_9)S,ϳx#:A@ӈ`4	d ,8R{4E#
0x2{b#plN&-	"sY{ͨ4i9/WVfY[cԾI| 'NpAOlKaYO|(7HVPlndDdpE
-nyDcVlæ:ذqcp$&&hc{eUHrrСC[ 6@&֡ɐ;eF~ԩEK=1r$2q%9CM\vLj=†<tKKK_Q>KL}KRzHR㸈
H||<[6v^0^$&$:t>1flbPǕ}įI`:͜33W*|01	шv+Cb-D\Uݛ;Om`ٰ0
91fpĪÞ4ǀN(pS!Vg!"9Xګכ\YN{klEiNJ1yWQo_tIY;M{LG48TsZjdE3l˵7 JS}ѐB&SefGxbێ%%u#Ro[Sd±aЬhEu׎z=0
13q["&aJu'>#SpyBwQɡjjq"LKOH|$ѯcGc?:La2NtȬhGul	f.hp4@233G91KL4d/C&MdKfqqwnRRZڦKiC8=5VTsH[E&]b*0h˪ꜚ}_Dbr̙3M}]gIH=/GnnIIňOdfB5={Zo5	i&KjT4no2˗EkȤ)$PvwUw{	Gt|7"LAgnzlnh|*Pqn8x.U8M("spܮ"cfnEFzRιO>}cw[?<<F2jc޽zW
7n3%1^`O(={jΜ9Ӷ}{6B$4Fd.^z	^a`h9_-\~ͩϞZT41w|Cͪ1bDU8vi@:k!$q2ktMF&1Mp0q	rQmF"qIN5랇wذ)2U%[Z__QuU#Gwh$&%H$&A&qQރ9@G Iòf!Ybc H՝0Gg}E-:x/+!^V9^xW.*j^$?\ܼiΞyPLQGIxyٶtڵa//b*NEcDbw#RB]zI/K|>;qؑ%Fǚ矯u`|aԑM1;U^2D?2w	Iu}BFFZܛQPΊE"d# {w2
o@uNY%p*GC*Q`~tQQ>W{Լb:5&t%'7q৑>߳gA
1Y#]1Wⰽ[LxBHBbD#A(L?d &/]_^ꌌ֞osT"b.Cv3$сQQ9x1Y'ǧK##33ݽ:n3t>C:.꿒|ȳcG>#7|,$8dB%h }bJ8M5pew8k<.Qaj7.WF#X(ylݳWgF6mڊ+֭[׬eKN
5^۷oq>8p,=|w	}xŻbϱo޺QIi=
nj~@n$샌Q}Csq7#lC6\
{s:hғwIQ\i15g.48O7^ǐmMF!.sgjN4oݮI
IеDC6_+=+hLS/l‡ʬm$Uxn*OO4iRUSG~~~nŚbuܼm۽7@Sk4o7oۖ^G{3h~uߪ6,['5۶'e$DGP5+b°FLIEC&	G\̦*^h<z+K,Q(>xp]8N@ħ"	rƁSssgFYnmhxx??qӽQQ%` [Uu1j,}RUPPȇ@!1q4R;F_RR߆:9Z՜%`[̟4SPd{_ڍB
nT5,u,,(Kdt%F$ĩ3tȆZ0OLCğSĽ&մׂd1
Ebe1tˏ[+jZ?5q/J19/0ӱ"-񁲸Efu}pTaCh5hSo=s{~bԥL-=5-r\l`pо|'j^=	B%!3!`eBPN9l$u1ELQmiM_ѣGωd99-{XC&sSW_
qF#7dApwukצmN:vҩs/o-<,%OwE$sш
j51KMBX HOpWhΰA8l*omp`g
b$G>֬w~yweJK/D\v
V 
h3$Pp
{\fvfZ-"XdW̷'Ix‘&RnHe-s_^ioDDD9=Ό/DL~5vQM9U!Շًx?=
A&bCj/u^׽C*L (uV2.!TCK:P|LI\fхa0VU/CNjBf	ᜋ&:z^HfqL{(ą8Z7] 	D4n |_+0AB+U]DT⦘T1q:~:˖-jRdޚrJxuDHlUKa
y/Zo:?{,?pc{?|Ǐ>6ZP,2,:\"8vͭy8jݺ5μ|c
H-Ca>v"DBCtt5~p8s:v*IRll%|ftY2@4@0H6'gfNKU!p8Ӡ6#G9Ȟ֮遟QaI7h e':ݡCGX3ٳg>q>b93h|w !֟5lƶSoG!\׿_:s{q/G9b${u֯_ߴvZ

j߮#IS䋒)_5 s+5|N~<s:,?`?ު_R9U%Rޗ&eu;ؕgl·L0ۧO&Q_W^}EVr
tHRE<QW>S\++->q<
9M tWeH:_Ą18VЁ`sZ0EҽHct +0?(w~v͛wo۶m48PT8WA\pIy?΀[4w7r˯]+HI9zȺFAp;bv9[`!tpԘfL[7=Yf-϶'-_+PUj/fizf8Wj\ti6m8jʺu,
^7Bw[ PuJ\0/2\}yUu@,Z{bx"Kbʓe%5ȶoWؘ}9:WRlfY'ӦM۶mۋ/s;7n׮]MG:'gG9Id
̆Daǁ"^xbhOl$ݨ׸yeի#Rwm~_;5Sq"UC
BϠs];zGqqqvvvqqqS?8Ԇ~}ǎNE
%"F'Yo{\se´uvoڛ{ꏜغ1ޝu8禜l̐!2,0"܋$+̬'?jw^p`ժU]tu6a [EOq!H:bR5k8ESpgGz$,RaPcXOqrt>
& ,;=:Hoٖ^י_YKE`4>`YECvrE|M{Cw.X1oCS)gΝ;W^?)qB2:!/pIK𜌆0lOv7){O<۴0aΝ;6Wps|j/wED7бߪuaÆ-\V.//=rȦM/^{M>}ɯM<uʔYYpᚯ۷7,,?(JM484DC
M484DC
M484D
M484DC
M484DC
M484DC
M484?akl¯?IENDB`PNG


IHDRxԅOtEXtSoftwareAdobe ImageReadyqe<,IDATx}	xTy9w}h,;8mlK캍6yҴ}Mq:u[5c`b@MHB;3 ViK R{=;w{~{ιbB*D!BQ8
Q/\Ofr1-I.,sQǴd2ytF*/ϟ?n;;^\RMM1c7~xӖ?zC}-u|~|n~?W8U*я~Vϛ$
$Ew滏|{̆Ʋ>'{E7ܰ_1$6Zо[ܹs
iڋ//e͚ۖ,cA>FVQn{?؝OPVZ}]xg_KMM8o~8x_ZC>6ѥ=ȶt%_&f8g4vgMkk˱c<ٳ_ʂRh*/{6v1,QT׷:j?y:H$}[윹L&N2Kc@3~S(qXok[y}=l4u#A%=lsZf۲{KsL3ƿс[];g"g6]2BQ$&P|k|@ޮU+
^DYOBRF;|??madpp8Y鐡18.p( 0UV>bN{QѬcX(bΤ{*Κf8jH<>:pCQBR4DZa`EcMtbOY>N03Hp40X#('yR

X,Ħ=8àf)<L[ct=밦YQ4=lKU96&L,NgSD7>JKUE	XDq1k2IbӺ9z'@ABW^'6˗y6UUnmxݭ#`pI	n$iL:3`iebFUiHG$ԓC.+Yi8[G8XH"NI<+FI!دet0pj8avp4h	_`Y9)w(Lah!X	[iv#*LpX_ꨱ8R 54rXFBCIV:J]
9Cw`T@4`aUE6a:Yq}ͩiEn'KLQlVŰ#3o˝
y&<۲olS3%l+WGg~3#\8t:VNE0(`Q<&Vܱg+n%H 50	gF
Yy
޾4ƱB3R殷4ص7gϲges5FcchЀ	dѭLa-QE!\ý}dnji[K&7\M

'FDǒG*_4	Tr`kેƷF8b+{kdtA+Y]	ϓfyp:!)dK&g-2M45_wo״zW5JWUpHx:7
(d2&oP"e:lJdCMl93
mCbUL%(J`0xkՕ,ңiS;/*'Up Ar.5:$8$5a䞭~d
EsT<y4U9*<yu#wx#ڢ֦"FOhwGc159@q'6{!Q3,veLLU%hwE/$XRhUؚBͺsWcjRY-Xnm+]rmo>y0}(#"M]+AV.hwd,W+3`5bs[=<r,#08̕d?VyV
>n[NMgX(	]6	mj<Ҵp-G?v'*90GPG#Rً6ީhT 5XrZJ)M{vQ}2e{7m}} ٕ5RarL--F]#"oY~M"}952T@10!5)n0<Xl U!7{2Nepq,K\	OMu[
rgH<N[ϨI9d==F&79#GL=ooڊ\\u_ ɚMt^΋3E{iQX\Id"vZ-<CTsIL:g̫t4H(f}ʂ=Ɓm4$26%-ʎԠ41m)A#b
	6YbԄȰTB&Bi`LЉj!s=905Ƹʬ>H*4ݻ(lο?.yH
8|Vp8SՁ( uqDڜnBbX̘ C,P*PLV"Y1kܭv^Ms3#>B\	QG{G@h| nK6HP`Sp5(#%Ρ3##Y
H#oĢ)+Nz5,(fTg$uVIoX
wrB$Zyre‚"1P@1Sƙё݁m=S9)A1T?PZ0<=Y(FF3Xz0
HKtTߑNW6w3PuL;#i2FWr~M"7&<I~-9p.xv.${%M%TDЖ5Y]eApa1rq"V(9`kҿۘ} 顠4VوP`ǂ39`
NfB!}<JȉzJߠ#ש]9s3X+%
)rMȦ@UT,K`H+`g2$j81sM"PH-Ԉб$X򈷀y21\$q,zYzfȂ	dT63F$tlb20HKLc
ױF0>d+/$5bJ	rԄ\ :-{FbX=#
+#y<,@[=d5ࡍyA)B2/桲Ӯ}$X/g~)n-Xr6$|@
IQ3qLPL!ha&+"@]=M
ۜ&C]6,`LhF+?MTt8Qt8.d^CTirYj!j SE${i4kyyB	&|zTIq>[/P|=Uc2X!RLid"cp>S/dkVqQ'
Q\R̙Xt`Ul(‚VmV"p\7'H%JN/X\κFң(ةaPg)K?٩@ů$Ru{eL<HE
D1ˈ+ئx[)$raic:I^[.B-H83!xZA40m&zFfY-&Shrfy@^)ɻ۴0 Pjf[nEdPbrb$'M#`ĉ-勜Vo)W)eFĘG7/T,Lj
}Dq
rXk]O	[DK+Xd+quװD?A?4Ў:(#Gs,[9FL
,
mYRʐӆlOoq4JY=xֽygHdL~\͡1yok\)z9G+^	š	7^T9拚XaQӪc՞Id={+-)f_*L>b	qg!"F
3!Zp"\,¹0MQB	cQ<z骶!?{/4))Ipߵ,0B!ܔt0C4	>q܂rb'x5+hc8ۂs q6 T{xEI<S䇂mQ%34X=7-gV4bʌ!l{K;&"qOo&m"Ypsҙtb%U	V|ɐÄ|sma1û10I	Vd-d!:>q
"C!FhYj>o hMd:cTոmޮ]#GC';ybh^Pb" rW56f-@M~4vgiƜI%-|=F:X
n-_-ӹ6)c24jg wؐxLK?sJ=Snt1rY/t9
r:\%RtaW-mJ
QdTbKzU1N# Rƀ%n
DNbb׬f6ĠmfB` &
ֲF$*?{[]ڈ>fY^[Sh{≆	mPChmx:-,ձLx0[@ɴ r@cA5W
se&6F9{8M).sw\M٘Tϫ+Ogc%c9/r1$/T5 ybb/:MN;_aXDȉDGtG:RRR}%[Ie(UFt;r}r.(DD4vg~W*CS9#g6=>("gY8F5,J0ۮWg-djX
X0FH)dոn)[')ڏCsqM37YV]GnkUw~p٬5htzSǫ/m{k`_,=s'X[`Gqo1fƹղ0K	s	2ݬծ}fLvk-bt	\6!TpXhQ!Ɗ.B"粚]wtxG$Mg 0K&I!M}FtX"ȥ0Be8kZVwj\
b4:XYYy{mYʹk׭hŴ?Ml?iS};F#Ea"
DLar,oYO٬Qv#Z( Y[3 CLY:
]TղlO.\W3`1qI74`ow샾CctV5UD`e\9 %{AM͠)tE@U/x9$0f
aFV$`ށ@hx(#Y
'~Q6aNB3XBYƊֆʖzL^~뮻n̙vuaun_HD8'&"P2Hɩ!ľf6;uK˼U>W]tZE;$ӕR{Gd2VtՉX1@CuߩꚢIlV*Z8NŬ[Z<4;$Io}I#{`9.F0cq@hN87jʌ38
Hd||</+**K8.8oh"r]4j\F2!IKXez/TJZ&*j$ي]{.w$#o/D7|o7Ql(5S\>e"@Qp8d`L vf$;w.;T*SثfËmeAeTȎmCbNgp,/]5cmc(oKDǾ=%z\^s.M=v;'vi.KQKuk/p^{#v
w0ʌe,"[ˮl
Ku]]k׮
6رcppfii…^'m۶'xb#r뭷~_5?ys	'Bꆮ6a.kNFW]?}t?j;ilܬJ|vȖ$`:Jyq{۟
.1v/PW
BLYe=;3'oҴ{'?ɫ
o-˃>ww%%%0;3MCW޸qEm]l?~&"k
l.؁BUCi-`{󍾗A3`59Sp{RNumels=2JꥃO`?v=+B6VfoSt*2O>d	9
i΂1GN<I{+\J~AymȲ|^Rx<sEqllgdn櫯zzC1^SRɨ*ѩbv\Ȍ/]Sb#!FpwvљQTef*V
"YyfOv<
ac0`Ne8)wKh&^k:D/@dp:EE&2rAxq&HO>7afɒ%<u*++aeH5k֔>x*pe566655xpDSR
n	T[QwuoPr`ӱ{],×ko;蔝I%#:6H
	9jE-	5uHTp7+i/a_tXf˝4ĮmI%DŽ}c۫ܵbZ$koW7!J6
wg3	"
nf(X,'I}PK.}wޝ?βe˾Ft+ *RG-
R	HknwgdR샋|u+GhNAZ媽g_.g+rm+B\Ȗ7SÐ^om-W͸ rʺkx{_TIdՐi{^K.q,C=ξ@Svٿonꅍhfwn喇zte[aӦMׯg`
_yڀٹ8LOp%	Նr<"hJ.@A$Td嬷
w
9
*ryC7kl90
MnNf
^T0՞z }nX3ЧN|$/O!]^O_./C	'i憊
',A֨:^wѢEypP_,sI_򆙋Ln_†6N(-tfH'xc*_|uiM)5	3`vrGeEk<5g""kmN"#
Xo~'ͤ؁#ޜR@li%y'G@j>gR)(j9XzPg<	<`
p.689*{d,dDw`@g5t鮲'&@`ŵ8xĠIt):_`DzTR,@yVznAM*@j v?MYei
.1<'2紭)̓@9ZN6H@Ncdd$rr.aEm>k2?e1W4_|/?"I2 p0=z_YPnVkZe*;Gkd =E=_ʗVp,}Y$
=&t]ָ}ֳQDl\eD@^4m@ٟ+JLS@",5;Zxۋ]OEaDz,߄NU+D8?)Zݢv	*:JWMthΌjz,b/H1
b2-W@(
q`D_Ϊn3m1cƌs>e<8

e2<8`%쌽4okO#jF5CG~#>,N'vS4I)Ih'@EPipr ĀtSi%*GMSg#&`œ{=#AYA~p՜1::
j
\pLLLPՓF&tK$#803xZ/JWM4R468C'z~Rzܱ69<@yG<N)ܜK&ϊ6x>tƎEȆ²<V	Ic	hLV8u@s,q	@\]Qs9j`"_g0xw}7O-+VI馱
䃑?v䆖;{GFF(!c'N3:hTHj:	iDI6&KZ&gp45S"7c?w]#5:۩n:ۨj⹬bY5΁xgYsVwtt<󹹈;&	1	KnU.8Lbwˑ` b邊VCDŽ>nPkmeɡc:'c?p4F>G37xj(Y	eNW*$@S-U)Ĵ
3#,OS%T;vd
9*;¤kGyd׮]nذ;NqΝ;w2l$00Ưƍ'
4i%N?o^OBۇ6ы`Y
p,Zp6Чz]lclgN%gрò",l?KVI[V7,W\(j8AR2	sr=nk(3w\ts,ÀDP^^I=|䭙(/(
<
	_<v1X裏NK_@v;f5ks#` rLe銦\^fV<@!U.6q8yxX;C'/-Ss&	&Xh?$7}cl;+Jd.ɚf(_EUX@eUX	^_ǏepINe#O5ݺt:Z~=6ˁ D[n۶
o}[*NEi/^oYd.&]dɺuj2&i 1F4Ps#Dpb= -'	2|O~H~ª+V_
B4Ȋ$J`ŐA(sVhKd*`Pw+9H>]M>T:y>{ڦ[me@88 x4AD8]rms~/ )@`|Y•L"^jY-ri@ <Qj>89^5\Rk.=[6[Ѓ1h@coC٫Fg3#FSj*g~snL.U,k_о3SͷR~&
q,}'-y8685575\y.l… <!s
;ÇAf5V^:e2ϟo΀xl6馛n/>m6L/j8=N'0GMI\yMͥs
fAm8nT7ϼEG=0UkokO`,~zTKoPwZ!;+]UWCx	ޗ7{u,5$k
@LD6A*S8'@I@IA<xڴJ9s[ #o~q@.
8v|KV.0@j
H;G2pÉAP-AVZfB%JP@B{=/=ZcY^X~K#!:m&_ؼyW{2d
H7mX4E⢶:+K~N<F*|N]_=90hЕn ABt1}Spy,^`s>a%GsVzU"S2Cғ
(XcBS'.*8r%Ğl>ş#|+duLʱSlZݹ&pk~}E~xL>oB6onzLLb&	`0"nNA{Ty2
ntxV Dz$G
%rsn"ǁ//]M`S_iŝ_siðX,ss(-jjjDtS3c8~g]IqLpL)X*BQ8
QG!
(D(pQ8
QG!
(D(pBQ8
QG!
QG!
(D(pBQ8
QG!
(D!
(`	BKgIENDB`PNG


IHDRxԅOtEXtSoftwareAdobe ImageReadyqe<bIDATx\|TUe]\@&3JY",	 U)``iC]EB-L/ϼ|LzDM7y{ws}I(#j! AA	$8Hp  AA	$8Hp  AA	$Hp  AA	$8Hp  A	$8HpxzZMp:dmpx`Rl˻ݺY7 C4ްyu{}AFY&.Ötk:Uq
HcB&#,GtqN.YicF8hc
ϐ=⣵ow56Sp鰫T+7fLQo`H9(<	цX?L0>bHqyzu:IGfk43x̺IVMdǾ'>%]hd
qCeP<	1.).O:8<vcڌ0='Ԙ13qQrA
RjO+pB|0u<SdnA|Ow;vh";Pp-ys|3>&M*_S)<I2O+EkvhrVp\+t/SM
$Lx.HJbʼnQG#H;ݭZ]v;AY!ߴqX,#O 8W/k;EUZ!
$cѢha\%j/xdpocŷκzY;wn5RDqqŋoݺUXXXQ(7n3Lv[	gQaAQd$
^)SHUاd{%ǿ)
TEEVVŷSpX֢"Ѩj5
FPMRijNßpVl6FgdݻsݻwxGTTfbT.-WXagΜiժհar9rgcŊ_t`pp	ЋrZ}m۶};)y#z6X@$$-E5]4lP_: λ1[mbUJ~ueeeM>}ȭ={vҥsݺu{7ܿ_ѣF-X`׮]<:ȭ&L٣G͛7GZZZzzz]I>33%'OD"̟?k֬);B!˥8ҹYpa
`|B
Th߾=GM"륎W:0`@\0|\ P;6EU[74x}3f߿f͢ׯ_ҁ4=zCp&MTTh7##…@UJ;vaFB_IVs=#A
|͚L;ڒx|VZ999%G:D*ƍ)tp8f2N"1FC2U'L.WLj.zpx.UUU!Qn߾


#%%իk1cTT㯾ܟ8qA4:tp,Z+|ݽ[pvn
|Wf?O:tBěe166}Cɲ`	|#GR,;d;n0ˣRvڵc_~EvEѲeK(GrdbȐ!w͛hի@ޗq&H28իuݲerxA)˗/gVzl?Re~bq"G+'3:uK`
S+WyLQQ۷og5+s4dY*O>A60.wo>@>Oڵ`ؐ
M'&&/Xׯ])Ə_~1mk3IRpiZPG20&Dϖo9~Ct/) 0ɭZ|#=>33sڴi˖-[~;ٳwn<:yT07"s_|q8stt4ǃ;(pӏsvEfJ]ehld`>S
0ᥗ^
+:t
Yp,?z({pkB-4)\ߡ&Ibe>t,"kj	VwM7d/2T].jD~~>
ݻu۴iL\OLwJF'z(p5kĩSprXlݺu
f&Ƞ׿?t(s@HH+Z$X޽{3
|ېgϞTblb.]|״aG͚5~m$Oh|<e2H|	Ё *Xď$s.<&r`uu]hU*\6kU
fVI_SJQIP?J!_{PQV@R٩`ׯ_K	:._
+S۶m+Hĕ+Wsa0fϞM؟~]vM
s![k 	ȑ#I/GZif=ÇgJ
&fke1xGN._+!L
bBEH1 W,A$g27qBx!&``q͛7QQ;Nߌ.;wg3ܹsZm9k'od̙ɓ'X\ṗ~xAHQƢ/'%&tRYng8PCYaFu87O RyfT4o92Lp8+oTW*2Pq=h:{Jc/{?|eTɖe6KP"	1d6_h~AI2mEhJ3bqYYJ騜ARB=R}С4:+O2l^r%|5I(J`t0ĤҥK1sgϢ@`?pB}ouy1봻M;xO?TrE'<,lKNfʿ\.vdVV*:
U?_#hP!?RHh&q>c(pu݄9ݞ1?+K5bƍ~&


n
kSa:oSM/Q6bqF4
3۽{w1ѩӏgLڏX'paslZv04W(0L8Sj+w);%D"b&YQV(At(&TCVN}(1(t]FÆuw8^5NKl>}0*vȐ!۶mH,|Ē%;;QUVA"жoeawY%E5‚7kժUl};?#m͙3r
WEg$!1}b8Xj5ߊΖ"U$Ec<e*_GOb
1AZ~o-
cyL`
~{4߿sNX';]PAfΜyqYGԔRE'N\|9ĘѣgL^݀	҂='LPS^:T6o<Љ;r…nW<1?|h,hd{vɦN&lU"(&܍%Kb\ݤ񦟯JrtB'M6mӺ5d
$ѣ!njMNЏct~҅x.(1ZNRÍd!VeR8t}ݻwM/wڵ;v,}|62tP?pA>V}p9QrDg2nȷo}o/Q|N :X	B)VEx MnsVAڣGÆ}'Љp.8R"
{@[QD`BSN;on0H/X8SN]Ӂ34
ѷ契aڵkǜ
I<d֯ZEӰ'GeЀB:`{S/%6>ba=b:9;mCAvGU.\O](
&;gLw+?+
F(hX='DիBݿĂ>x#X|Gk(˸x<:Fh)Sdff0k׮`i8ILT:0.^ܷgOУ#e:rp]޽{JEX]vpl`w8hOACK-(%t 3f0gr
1~WKBCX(/I|!%x0:X̏*H6{a
~@B3K:=5EX,O;w{׮
ףϟ?6m줗5
M*Po\qÆ^.U˖0GG}SrUfӦM!~{
Wkk
hiA6JMW2!u8>ɓͣ[(Ln\&޿W1r,
WP<MU\V'1}111ƍ5k
BaJZjaaa{^^u\6J
PrwߕJ$#M_ЋL]iǁ[E>Rՙ
Y7<~PF/)-%qQ&qHd.!F1rAdqEP7Kt'hr\~|83M
N(
}`̙.?.F-d߷99"HRt!r:+B ZFVV,+
W%s5lHxTLKc!@ȄNo/\ɺxѢCBLST}@O> x֭d
d?,(#CNOd:u*$01tfywҤI	F2cp"f~/p0{fWcݣK\y[xƈפbTqU^z(dPkݻw1bĜ9slrɼ7J%=%fFFBe?K'rɨ<Z`V0PUn֭KMMճ'NX"M[؛DOckB_,
(29VɏPO?2 ,XL!0A	@>ڿG&}+V;vY{O-*&8,`-`#x{[aL$֭r
+8\&_euZ߷]xu"պ!'_!*	89|0kYYY,>9x ,Ͻ{
r^Cf#nGj, uzt991}sT5&i}ߔ$EexOp	bN7͜5yyfDCL3=/
.Wд3SlǤ~yheoo0M/|Ǜ0 Cʗ&1Ƣا0TQ#G9(Af:t萑=J߰aT!#>	NsL!i@N53ʘNV&m5yPd%
dž	2:]+;K,;w.l ٳׯ_
xZAI;.
C#~CpuQCRp]G	F4#%oux$+438
H?R³RvRC48U
'T@,h"zKϝ52[ۡ-,7oZg?Z߱!l}Y@yЧ铅{vo\TZ
]$W;
˲#5@f	}̜! tQ"LF|I`t
k٠W]8]L1:$6T޺tk(<ܳd2X,.^D"xjZerٲeq4}7L<='$(Z*uRxns
9xh4VUBO	8P/Z{d2G麦kZnEo=%,ꕢ\,

d[fp8].zqPœ
ۋ)ܽôxq>5Jtrxq|59-zU(TjA_Tdً\_>`F"˩T5uRc&կYڷKqۂ󪼛jPfheuqWrc3끥4mDl	bQ&7PXhXVk
ӷ'b@מzx4^㱻ٞPzV DA	$8Hp  AA	$8Hp  AA	$8Hp AA	$8Hp  AA3nvAjlIENDB`PNG


IHDRxԅOtEXtSoftwareAdobe ImageReadyqe<IDATxy\UϹo}-tIwN	!aMb$0`pqAgu"jDDőG3		%!+Y:;mz&	s#~]sϽHIUM %ᐒpHI8$R)	CJ!%ᐒpHII8$R)	CJ!%ᐒpHI8$RR)	CJ!%ᐒpHI8$R)	CJ!%ᐒpHI8$R)	CJ!%ᐒpHI8$R	}©O3OO;>}[Xb0GZe+!lowZ!JOd<Qj>6}tO9A|%.Yvߝy1|/w,È*!GhhhɔK/jT5.^O/u畐:T lNglzoO\zGL=$\qٓ|ڇc8i;uor"@8S8HD6L)#F=@[DŽil(4鬛ʸJUp.iyT*۱/zw2U'FU:uVWq8=sK5i۽GÚv٢5N?'|
" |qN6★r[|,YEq?lDP3j[6Ǯ_-\$W?.l0PɸJg7;!Sdp3v)'E5{8h
5Vnqq6+LW&r(5xL8B豷޶dzqAϪx?\{9~ǏvbPҭmqMj g!QE0@լTDb<;VCCޅ#G6lnuVFyQ>,oΫ[׮鄰F*X076V}iOՉ֡Sy'AޝGe{LQͭg5j6ܞʁʇl_~~sCg5<V%m|)v-o}+if]TLDxsO'%E)C`!6n(Bb& N$h
t\K@i&Mg6FQ(0 Xg0QqR$n9u߲ŋ߰r	k~`{;rK:pڈ^u1/59
q02E,?|Dgms+)\>`#F\ xקz}ׯGQ4mlU

|M),X栉Br89|ྔ^C)S:pa$>^i_\PX(j4/=ᚏ-ї.1b/.ggHw+"U)0,2-xM<2BOr|ɼh({d~
eP;I?%sH&sΜ<JtJ3ΌڷM$)-F[H7=!tPjkT _9V
<uG7[`#X'|IX8.@@9@) fY@58}t89\pnA'>>XLm;<s2ҵ3?iC^Z!Atm'\qSHy6È1B/c3=	@ppW_1MQPO[=
q-T~ې
T֭.%;?{`/h5FCFLy%g5<Xy7w'ΓW'ш/\S?=18mdT
+Dv`Ȑ18b|0Z?[HDDF+)qOwvxk/D\aH|TUtV9%@0ҎJ]Z]>	W0`sHY]5=k+\ً>߱qjTPڭk~ӂHX7GT	s<Q)!TuljLK~hGQ՘Qkm[6I(47u`X^u0A@N>r9s@ާy_œ3CGhak#T4/h{{ۡuύF㺻<LVTf3(]vD(
A,
qK/mhQ^W/lA%3b-}bxr3CJC_>PX<x`#8a9 2&LGnpKWP!6</^g_Zu綞ན3a8`'ʺ aOGugǑ:xRK馯Yt#^_'\11EaU睌.do+:<<GW@vP]_[-|*~S3}	]+dl<g^{(̎@-ڂ4-{m|"k_o^H	3PJIKϟ]>m2QE0WgvݿU7\+`W:&sFglã`>~RD	xDzmEg~ppȲwoNxt@AU8.;*k+Z_urSs5]>r kq
LKLWĊZc{z8ji6{T{vl,DRVYWQ	H$h6|7PzB<AІRFV"ޗΧ+^&sfYSѿ*ueAcg#X<=ns(|F4"pL D-5oX/7$;+J<^:)H5M(vdy`m}qwҼ>6_\9+w)#!=26`~Tj*CA: ;sVZ=jLo˿剅BT%mjͫ߷m\7Gh@\u{j=rիϮ킼[XG}wւi'Dl̂{JC)Hk;ybKYy=h"kwpu7N%I{f͈,T	ţt>ui	}};N5ƳŠ/i?Hssց]쎙*8v ҔI$2+Z+>t%srolU"!A-{HwGgԀ^Qfd[ġ#WN;QU86gGWOW}kӖ%gN>b4⡮_}79z!1<!+?7V5Ziʦ" Biao+xwr.9SfϘʽRi}-(
S	{TZ՜(w)|<frAd9\85=UVL)lRy8h\o߬nOH°(+8@ʦ(,9hD`L綷}q84HC)TdUB@
~T,3řV_[
q!8VcݘQ3xj=TM~op(4%9ۗ$ۊ.[z=Mb.Xej1SO Gm3XI
YQQ(@j6-꣭_=S&B0@S.xL6țn$DA)p튏s#
ԍx%ngLiU]^w*6ϙ]IZfuU0
rG\ꋮL (@!^!(7 Rc~2#t^VWcTE&ږA OX#p|jj%Ȼʖ0(`hgͭ}<hٛ}eK)i*(*1dFВ9#z%F	,*{cc+ZZ\R
tٓnܺʆnT88KZn$(f==xGڲy|ZQYBZK<ثesf隙~ʞ r3΂5~p ]ٶ Qi:	8/rϻ=̦ٿbw{zlFԨQmɞ9'zZ၉G*Y^"Mcz3?]Sk:i-kS1#dv_6i8v
YUev`GfuHˑ(LיLAƀK-!(otu\k,P=!}oW0HI8$x.kŎtSY"7{cq3xzɶ='LUK_n&mw&A?3}x%L:%8Px8}1y]o+~?pEj-tyCei$=MxIlV
TB
u!r	7Ԣ5N_\֪d5pȢ3".qD۱naYȘy)ugZFo(dҎ	ADg@[{8jV[_|57{=S@ңL8=|>Oc8{[ַ56uy{1vgf9Z$:tJ};>K~.#w޷97;y(ųFQ5_
 3%3v8ګVHpނu?{'hwj[}}!C_6tv=f~8|"5ằ5OϿGwh!8ޞ';}o)|y%=:r;w-{Gt?;z QsΒ<0;?;{=óЂS?I+3</lo[gx[۽{~}"?N]wE
]K:HM9KsD?F"+>%wSbxTgG`@̞kdbg_wD-VacRcz2;wbj
@"r
aJީZ͐B.Xvgsw\IDl'{{I,gS=ݼq3IָD(zh5dG^z9?gō	᷵:ߴ{[AdI%z<sٺ-+j$ٹ#nmF[AT5G޲tMk+J!cyLJxiZ}nt@f酾x)
zhނ,7&s&+oa1)%C%7NJ2pZk$a86lSy;B_J06dMiͮCeoKCwoO8 E@ݷ,}D/r	ݑ0bN#-ݻUT!}EU)Y 9|+H@x>ϻ!cD`k	2m[d
o	9e2ݠ7`IQ.d܁˹6(Va>'2nt]p	=7a"4UCe/ts3%8L!m"8/<P͔M>C0w<SM%Hv?qeBvOIP88S/D
8y<´J.ZHXxیTM΀e1o(K	+ʞ@.,%8!TEϦK򻶍Fw3g{&lP[|܁}ĤS-n	Q=?ؼ)4q,O͜]Z/uT95ZSn|g's{	U-\hR}ϭ	̞[r
g;x:5dKQ'/RNY"]"-lk&Hq'PimET2<vp%¶ؐ1v_6hCϥdLJ!%ᐒpHI8$R)	CJ!%%ᐒpHI8$R)	CJ!%ᐒpHII8$R)	CJ!%ᐒpHI8$RR)	;mYI?IENDB`PNG


IHDRxԅOtEXtSoftwareAdobe ImageReadyqe<"IDATx]ϫ%uYe!Q/Eff0$-)	<0,l	#!1&IxqvB,/$h]:}Tw{߻#pUէ~է:'	:"prp898N'prp898N'prp898N'
п@]E 6Wl(c_QG( zYlSQxa1CV
DOz6hw}4!
tB+nNqu2gIGh}ᓏ#< Vplb`q~JxtGzuIbB	>2Wo_VgYiպjp?~O4}D1ńV;ƃL̑|@{/1|E '2҇#  Vut<u"޼?/
Ȉ`<lHˀWn
cݡ<T()F;HbUqppvw@$Gq
q&3mG^0xDo|ͯ$_D_DgۿlVeAUIƶY{qQsgϯnmJ
L6{3Df#5pfp,zW'/y۷ŀfMnbu]],[9I_eMA\Lݽ{w{_ц}ivp=p+=H70(
j:mij'=J!iD,`{?^;-/XEGwO~ lڑ0d)#gM''>`!`B~ߑEyy
􊮙C."z7[sl$M/#͋%,d.<aB`'>rՍxx7J=V,Ls_sښThnn^?t%Q." +,]+s,GSodUH%اmB/yLnD-Vf+A:LJcyqj;耉xn~oNN"d17yRe n߾=l<	-u+1_=::PvYkDۻʩh#ĺrpDWvVDTFrTlhul"v:o!]N[Ru7Ycġ|,'W0HR5ne`Ν!Ax?L| @'إ$-*j3؏QK;*B;KVf-@HљlPׄ”2F2NZ#tJZ<t4e#S?ckkiP
plL7X7ncqA
cŸnsܺ	}
[ݽ{wYꎱ޽{:a&rttGmF ɆMߥ>TBI%iV=3~\EpbhK/)ZΟL<*1gyӾt9)hm@ǝD8_}Zf!{'/^8:>O=hZ0y-Ʃ%Y1Gy4D,Cs
p	
M@3^
k&BWkpH9,@ljի<HyM&5>\"L%…W+AP%(A]]׫YJ`^_~Խk3.4ǩU
}qH]Sj`eOI:j98PC348r"25^Je\*4-
t
y̓C5@PD0(Ξ=:*J
A!йsZ&4i64	uK${\5K5I ZM2޳=FG`jA/o*D-ԏa-6֨s`! N2KSKqB0EfLc>#_}:@8dL&3#P㌂c~^3
plZ0b5F ,a\4[/bqHP!#D6hf8%hFp_qe[o]S:8`!f%;-6!'a0e
p
Ѵmn_և e1{k]"8P58x+KԦxh#ҩ!"֍aFA.[R!6 A83U@G&χӤk\n
F8uf*][.	'3FVoB
l
YkL4#ow5zg=i9KP[̼?ZQљn=,s$s20z5QSg9o
~^TŊidŏh^#Z48pҙYSk
gkh"=a[.23c
ElФ.
8mLQp&
8e[sI!Go}t4T[1-NPk3MѤf!YO58W]!h,i0:/i+HgjJ_6p@b^TxB7GkB!bn%0m@r>!AbL@J}kp3pLkiND>F& ŢEӮg9:(~ P0
/n<3!W&ـ, &!=2\+!pFLcr48ՈW.׵\盬s@EB0'L6s_%e!H"k
>F;2*~
a$QMKjACz@hA\
8Fʝr!KWHa/fQ_$iVm2k`!|
	aqӇxahӳ3Ü4yfl2}	)Ӂ[@bI0FEa8'Y0_,Lv/*f>߆2fTp\W=MiPϋm0ƼKUCw`u5OV1\F|mDY\0$ςy^п|EXYg. Q_6aK|mҿ3ZQOW?dQvs~Xzt,+J/%2Q_k3RIQFlMJq6VhOg;w Ьմ|n!b\^}s4
OSXD7է::-7hi{uxbPƼP/ԝ.Hr9<UѠT骞aĨ*b>qPH=NV_Eڰ)"~)n'L^^Ҷt W]+iQCk.`"Љv:E/(^"({Db>\fj3/&2&,d
&Aߖֲ2(u)J
϶	X}7y
o7͢5}e#דuQ."QSqx9'^ⳜHn@ R7[|̝2\u¬!gE/'f}7l9Y_iȲȆ<em'cb(=^L6ń3١r@?r*H4)N\YS]G\.D=E6-{6Z7o1?'!B}NJ&
 PTC(Qb쟰.PP;}#'‹
?7UP+]!샛6qߏgt4y6i62;q{˟o8-
2r3CfC>ДZzKY;͝k4-/͝m;L@'>glKQ\4vP5}NOp2_.~H(YI.}\<6J=),j%#?>wu4kcA,lvGb#/N6Λ?_)5J;!CЎ.LGɿԥ
8g
q#=f0TAODkBn9uـ(
4KD}o9RJLBpMstYR\IK`㼹c+HUܥp';$S5
&
8qJ)pרtRԄ2HfJDTBbp4-Yjǰ&oR!ڞǡ86	1GcH*":K`$dPo9$h_qR%
#(X׭TGhܔ#	JN
B87,ًx^epBJyB	ceFXRTn%>P!>&5]H3&% 1A:tl_JL%,iø+wc8[p98AF1>
Vc^Z	8hNPUw
7VyPHRL3X)錶OLL}Rcb}@t0h{E2ZŰ0V!¹TG0m &qpf!WJ2
T.zGD63Bh`BʢOPiwB'6}(T.kXr=]gUqї͕/vhˑag~WC\X9Kyb!_G;u"4҆jTA3o"|y"Sr6\5%
fJ,Qkh
3M"sX1"mUJ1fF\f%ӟa?on6q?>˽ɞ4C̳Kn#prp898N'prp898N'prp8998N'pzXScQk:IENDB`PNG


IHDRxԅOtEXtSoftwareAdobe ImageReadyqe<IDATx}xeUSQ'b^kT^Y1VP%Oh^6PxQR!EĚjiYQ
J}twylZ;~_^{[
CPr(
%BɡPr(
%BɡPr(
CP(9JCP(9JCP(
%BɡPr(
%BɡPr(
%BP(9Jɓ؁?~\qp…111*bm߾]qV㧟~JKKk֬م^bTZ500𩧞RroGqEU#/^q)?xĉ_~3|ɭz9q7oٲEq"⋜իW̟?駟gjjC?vدZq&MTׯ_AALfLƷEڵk_~W\QnݐH+**"_Qm1W^y_|R
WɁ +W:t(kK.IpbjժժU1cdgg9rGd~9K,aZf42e|P΋5??K.0UR籨g}w^uG}qVի_}A&q`K/߿믿?x?t!N\´9ٴiSXT~{n[<x_~jժtG/>y[>Ζx^O?;M4
vAR3FމTU1hРg}=znժU;t/{);v,֮]<&&f߾}v4iV<6,77מo۬`ڽ{w8`[nɇ5k8۷obX#<r05--[nq˖-CʘmogqxO
Cdrk"EUJ:u9rHFppm`D><mڴ6m89sw}g:gϖB{cҝ̀d2M6u1k&M7@q{_G:d;feeS&fenFI
ԵkW_3:[y;,L6coݺU0x`ٞ؊Nъ@Hi嬄d
 Q{3Dw
7;{?4^zjrґ)|oOpZ|Vb	d"cǎm7tӻt-!jb=j5:u2om7+?rb	ˎB|_w 2O5j0^1c4P
NYfdF_}uȖ7x#t|^bUW]%8Q[b%2ewʒ$ʻD|S{|݁GGGe}]N>X9!#&zA,Jg۲eP1ƍ=vK\}K:u*i	|RZnoؙy$04tߺO'rJb\(6c=A[E3gĖ`̘1>H<?_7apY|jՒعsgfUy'k֬);Ҽyseepw7n,[G5fAAAR9Q;,_DUgz_O>`<

Ν;9%%;ٙGtSJ(8
s='N0h87o.or`Q?<MY֥Xf%Ō[H5(PC'"YlÈMzӦM	ĨrJI80`]$tvy୷޺c%Ab˛Z ƺ5wȾ3`	,"_Fr TUÆ
]y 22ReUZ,Kz2VC…%8ۙ'И+K999
Z.Wp322R^z3**Jv[l</g{M2En9s*`o\"9h|¥$HLBd9y"vv"Ȓ},fhhl4j׮$7A*ĉ/S΂*IIIjDDD޽{'xWCNu\[\<vȑ#$,}0D:rQkhJpTVrW+btSa5&%8mڴIܺu<{1B+[[_R$t~ܸq#;rNYr9\?A[B
H׮]eȈ5k	3aEŨV\=e,/;9qfHhSr'/m.]g$G||Ƶ]Gp	9p9NrXQI>hm%󍻦d2{"zjmǎr̞=M;;WHOO7U 8+pN]6>2FÑ".\slK?aaa$b]t۷ojjٯ`wZH@{Weiԩ?P~M69c<Q-IwyF)#<<\>L^ոwڢEc$GS:TXX(ve%ƍVWbeAx?_ڋ8-Mc4d{2njG@O<4D'ȑ#{yyyWfS]v.)ٲ<l0qx6k,e%HNN3<M0An@^m֬mF^x-JI"رc\ִW2N:Īp2)<4AVVVr`8Fm4
\*޼yu]g,8p<j(cA\rXER
Gwy<kKuN7Pr`8$26F}FhժoHHHhӦ1U?3^{XwX':H 33.i82'NaDOf;Le%#?W^MN9PTT4bĈ+iڵky
(7xg)59?>o<41I&M'0zdp!9ax~u|rÆ
Z\K@@Lw^4h,?/ܕC=$g	 |Mm۶ս{ݻw;iMo<'(aZV`&֯_]*ݻa.d7	KΝq.3υFѶm[7JMqה8(
Qcɒ%)׸%-ttՑ+79,ۍ;&K-_;
X?UZXZ8ppubRf0.a(̙c,.7hЀ6*79X=Ebg1R!zܹ23f̐nO<BA%5rc8dSApp0$`u}rIrٲ7~-!yNڢj
d:ӣ8y<1**J_Lj-%Jr餦zÇથKb{gpyƃ,'NXxKjԨA}W]'!$v>$Xݺu+'x;)0͌Ѿ}w)))Ȍ N5n6/FPP:tenŊ!!!s#""|M_xF9OlV- $L}gGձ2h"I&Η݈#BPb4_^19
&UU'&?[loY>0pr#AHC}UUBވ_fk#++f<DHҢ^VKBsrr<β&>pc'[q>VYbwzXt@ra>蠳
۷o(Va䰜&d̙ݺu#X㲾'/Z(??f}ߺ/(o_	c?O
n+9ńc
6.aO tЁw-8Ts %.ܹ5j<BFa+6?9,Ü<ܵg	m~eYJCP(9
%BɡPr(
%BɡPr(
%BɡPr(JCP(9JCP(9JCPr(
%BɡPr(
%BɡPr(
CP(9JCPu?њIENDB`PNG


IHDRxԅOtEXtSoftwareAdobe ImageReadyqe<TIDATx	XTGh0j%,L'd^dMGi@@EYQQDE!
؂"w5oi;li03|Wu~uTfݥFmc.FFFFFFFFFFFAAAAAAAAAA5
5
5
5
5
5
5
5
5
5
5
5jjjjja8FGFfgGGFGG;wh?RxpX|`v{~lH~d]Jd8*oV(+\TR^~Fy+٥)JjaQJQA|AEZEyryo{q:?g3]Sixj<Ar2e1cFkW>j*Z'xec;BgGL45yhu \%/V5/^_k~cpC#####s||sV-Gaqx,l﬿2KO	+9btkyKG}>eq66mvv]5]f'w8}}VKT> X1F
w7wU54\))(={+VFHFNlNIzIQBQ殆.Yc
u5t1=M9o7/s+;)\?Ή`/a4Mܜ\{1QR/ty\_#:7+II%d8H\b`bSQӿ[v7tnIJ|c,4j	Qdh{}̣n
C3U^V&c
8b&Md+7`gwH!VJ:]APT[{džd&$ԥէXVאTT0[i.mnnԦ&c"]&[w.g?H_>]6/)1I$B^(7y;@k?,
o!k|lzi%E1E0Zf=izϖ$%l[
X)D
.Yds;8w>w\=O<=>@}:lr
U^IDZ-H;j:𹭸mjimWB_Gߍ7
Ov'U5t1
/:_;٧J{$
CwƗQH@]u]4`,1{a}ru{%[KxMߛZz,=ŀzMnCCs[E}@Y|RC;vtVu34N9B
e7[ˊRQda~\_w?8|hӡy-
nN/9ee+wm--fu}Vlpb8%⢫Eqّٷco&BeI}ΆNoP.Nm[et운Ty՘׈ NV^u|ӱ"bR
q$!3e89/ZeǷڌ.Sqc[fC#wS>
>?]6XS_'n
E<\6 APZxڴp&8L_4G2e)W̛\j:s$],\$4^ilKV!37X.<dC;֊qNqǾ=Ԙ`@%.-.-Xlp9K\\13Gc,[(h^vp<;8e‹>=oFm{MM?n^ejUZ!?X_e.ptvωSpx*ޖ–  b6q?G:r
pC^CwxNFHZ'-,Oʸso10A5kYYʼnee&ٌrxh1pY$֒Vx2s,1)ON(|B(|D}p
Vc۽l^>UQ
X[?{֥͢.&_aL3߲
7S*Átuw|VjK֗-,_.Vq*NzzhiQoVb
vƓ+w	其)<iqK9<3vfٴ8[ w]Hd(_s|1P'0269ߵS)_bQ1(?;\PƐ*B7.qwws^<lKi>=8Ŝ2qS|RpO翷>-I*1`Hg]{jz}U..L\,v04V)rzEAB_\b@ŘITֲ͉AD\xNh:]=p<73z^G)@/.&399N4IoO;o.Q.X* ^Pa9puNsxCT}j=8OK88RR=Dahkj#LG?:Ȉ&kL!LV65Za[D&;6`	8NFDSV|WVU+ZP5a#$tHfO&~$ Lw1`پ`i2b3W*f3z)P5dqNd
p<Wr*+Lk<Z".VmW|EڪH*@h3v5k;ށET2{,pbgc
\)uuz׉L#aY̨LBEpQ
W!zDDS55dtu!z K'EUֲV]t&Ґsv琸"}X?%G[/bYF'1M揘0~иs9ou}+ޖ}7iV.C
"vBTYΊs#-.Ԙ+lTY.Gv86brHkjA`8DO*+M8ŤˮA[ɩvHHnpbU
~DGp#|AKȩsp;iρȺ~$/dA]!>ӫI		u8I̶cϯWesw#/5?jpWNȤ!(Wb!ᄄ~xc>9|v>m|KnC(1}Ԕg_G1ޫ˭=+"ϙXX$98)k^RBU!(],"rbr,$0c:3S>La%„"Oy`.z|ꡭ5k8I[[Tzii5!雋m0OM)*p` 1(D"5D~
MdQPd8MdcWKI)0wp#n;Qq!nE_OtxX8yQ9PF8ZlP0V!wDF$&𛜕t"0m}m.
ZKZUq7?g}Sg?ѯ2,Za!5(p"E8,X}v{!>ss#_ЋŜ=	7Мk/+xLl̪/1pxx>1s&Ih06c-cR!(BX|#,Ya3xРqJ r)8e.C<r8LN-5^.>ܹr"eۂm6gFgGF>kl2Ѽ lIk~r IRQV]U\VۆJeM^h)hC',{0[kpd΀!mi홳/I.z֊x&O*l2B6ϡ9<IUt-vBd8lvup0ⴳgB|3@C%[C͸}V4vHWCHbMke ,(@޸,=b=s`A|orGx1q,u#rd4&j^JuYnQͪ5c
fAe2AG::ID ㅱ0Ie8Upي"~;7T;, 0I=6db~O\+{U{6j@uxˡqb
#py'iv%eNdGCV=ŠeOo{w`` 8l)k@x9mXٽlLjG5S6z{1N+jnfY;s9MCCUOaiW=nZhp\֖)(O.`OVǵ#הU'88l	:}ohΆkVVX@P?zW}פ
uwVUu2{(qHVpkuerV|G^Me+o<]p!+L^+8W0ː,[A"V5P!!Z&ӕפyPL8`1iǼy?ӅڼXӞyNui}U7_s$od_ƦU77ڜSgٽbPxaaM/!&!diz$|3?^R+˭kkJ2 cQ	84DݔTx0(3ȱD66I^RWy)	bS|ne$1|8ÐLl+;:21'
p?7olv2RU-,Yڿa#R97a{KzjKhWQQ;$o8B!dHsNg*
Xjۙe@FNKujh-vl17ɛX؆cxe.0-`2Y?n}ݽ;mB+D?:d<9qegl?%vȘT=r&a&9"bOqWB{|w/Nn%wу8Hf45aVdڠcZ3*Ag&LW(3TTrQFQ7+H3:;Cӑdp[Ca]KJ,|9hJ2=$F4p9UzH, :jnAޡ, APIThF^NS.~M3,fv2F`bé24Ziss #@sU|*~Y2<*3OYU;wWKJK̾#-\!d_Sbt11!z8^kmq=9PT'7Fcy|(9*+#L>fMv<-,t(90D"#L":k:]Y[_Uw>/+2+;*{R?Q
.3b+]/i|P@K(k,o9t &F)vP
Zd]]NYg}gGm2|!P6"f_6Xiy>Lnک vP_e?ã`׏ }ʶZLaO[y2`sF'-Эdƛ,79׃VWJ'>G9pt75p0fSzzf/lEcP@98Sig"W+64]*+9SR[Rr&	?~M?n}+fW'6dzєфbg*?MWV]Qv5uy|F:)
pph 1[kFwC|~ɼQ*cw~n׌w{Xe8%(uH^`I<-^\9eko>\uT\qqx!+<K93oU_=x)߻=`D	]
V%WN{cŸ7)֜"Hkak)~)A%p5ʿ!;,\5HHHHHHӖz rx?ƿ:p57jvkmlMByyw%68[CLChn1Ybbp:;i:t5tIgMvv7w~S{g_zy״[8z~|rYcd	);pzy3gl	ge}CCt8cpPpPFFFFFFFFFFF]@AAAAAAAAAA5
5
5
5
5
5
5
_,,#	IENDB`PNG


IHDRxԅOtEXtSoftwareAdobe ImageReadyqe< jIDATxXSvl{Meub_W+Xł+kFk5=7!|(${g>s3s$R#H$	@Bp !8H$	@Bp !8H$	@Bp !8H$	@Bp !!8H$	@Bp !8HCr|!8hM6Bi(s9Ow"	)8p؆_i	ON!qQ
=I0#C_m79$@6晙c(6,YJrh$oZEUmdrѦX;h70dfՠ`9.P*;@uj Eb4J|=~A7sSm(}FlV5p0NUi3L5
sM~VI}z:hQCp0
R;vżkm]yͶ뷻<{Pa[_@:y_I|ͫmI+f	A}wQ5әbQD!ԵIЭo84'ǭ>{M47=дKDSio^	x+kb3xHNOHJLIM9|A^tbǕn	'b"ʪr/У鎦l%FzMN9?H{VAm,YIr&&c8cD6T~_<lN8|VE)Z	(VYH #A
yz9f.}y<0yJ[ky_1a̷@$ӫ4Kٴb=pˊKHxs֓LXʺښT`<-/yzD]΀YPGR6J\wu`)Aǫ>7פʴ6Cz!I+N֒[\e#A|c҄1cEl/+ԛL$;";
& Kc2_=}xvI'n^4qԆֽf-Sςc+:	iع;;cGױe-^$K7iO&AG
[[-uf,^ORz}UI?A#qu᰾oUw}e3K|@71齴jNqPI?CXy"x{۶{/^/^8O@=@[DX+v.~
jkY	rI\YYo|WEarqg⟼IOǔE$Eԗ{.@bGZc7*P'FK^y^6ݴ54ns
*t/RRB"NwSa>`A%jkäU++-s?vכƫ.KLm"*,+}yɿn>S65陁+0.Bm1Nd}N࠸䤸D>ipm:6E2+j5tjg?d`IC=vKIN9V>xꄰxag2\JXS3	41LiL@A<ʘ[ 4Cӹʕ+CBcbxN-*|poj6ccp``:ߴf
i~ir$L!UiYMŮ`'Mfd+BGw-%%Ḫ(+7h[ܐGx~QQaVf(	{y+tw:YXXXPPg"I"ħD|o4Bn=Cƍq2e7ܯ78t/T:llds8K*h())&59!p|~Ql"kE[\`0@MoS>E'd9&gRR.O{TqS2n~a痚Ʃ+`z>`9y$spw:AҔ"1`ZooxTV17~h͠£Yz*63\*447oRۧ.?zf{7/>[LyӠcj\M,5+s$0+OlWidi7[]!yjքF	}K8*ӽV`,F}6Eo$P)oϨNSz){(l^.u8{j56	8*f!A~	gNi1w}JJIa(ʩ
1(6;#3P#j/(L?u^XH2ϟo И0~|FfxKvXX+ۛ{b^,le1kiݾsТ3JEvVkRG^ØWϞ6Rrѽ/)I
3-WݧF
etLUzzťVUV6ݾ;pEu`|&% k4
*fS}
QMF,s}o+K%H_77T7NW2+~B鵠Oa#z'Q11DXX$M2!sg7~1/s6_tb8NM!T&sYM(RBu[_-{?`t񽋇Gׁ	ؼh\u$)Iz%nܲկY:nH$&b՝b1b)lqEżѵOtwW6%"G]ͽ<kl"}ZLH Zp KL4oA\GÔDذ2pQRjAC__c$V0}As [%5x7^nxlG}ZK%;ɾtP0
znk֯)7;ͳYHPr|.::ӥ"&ozӥ!8j5@.w?4y1c]80:=~aȨkGQX^;qDv,_
+z_;qKH[x[ZRpPʹD'?F>?;kPݭۉ#G<~K)u$S=m;A8v恥oȖ(Vj(Bu,vV[e1>jqE]meUr|
jKX"2$[9l8>S2RSE+qnu}\(
-լ)UVuJe&k'
jcԂ]7Ayz4Y_˘#7);ZQ-jhvٖa}XעN{.?~kWݿz_'8<,UP@-WgDCf[vr-jL)@r7x;K9,?;fD6p&cmf:\PN.y|pZǬ(huzȑ<xWIr"Qw׷Ӥ}c73ñ]7#'/y<>eUUUUe";1&ŦZ
{b+{
JoQW}iEEE?V{bgҿM|Jj.?~.PY]P<vhJju]J:~W.pP	
#Tc|R0gFFDP/጑],y;Yb[ʍ͇u\:'+km-D?%_kvJ̆rH|O̫kvpM{ǟ
¾Py"Ia\*oP~C@Bk%K˪7:2fntq~!?[cރ&f󄢉lY?J#mI3@ieZBiu*Z8 W`/K֎_,
Ks]予bO0!cSM]}jT2ڂˈWa
XP	e2o8Ο-_+z%Q<X=xj~w83>AiZ.Y3"K^fSۨ,lʂ6*<0L6}?mx?-S`|l^%<qi,N׮fj#9D[Α,e鶟Nqٷ==jɽu.CȨm,BVRՖt>㥂ތV5۳'S3_ce<-fO"3qT6lm!s9.rL~1n/>|M&OPٲ
ۥrQRe4a`)lK3E::8gNdRe$͎lŬY;`Qa0їSFo}	h0 7P9V<28q`9lfBm4ފQrGUݮNԓ'OF5mqԋO0A*0h;Ospx/!![qxblaraWZ&£,
"3~xaN>k/6Aae6ϡܧ@S1az.i>GVR8dj]\Dσ\Xy,eԻʙ숼{9Q
AWnmIWֺp%SZʙ_>B씞>ȀBo*+QэbNy_p0L7?%NMk+Tݠ4JQaj	GOgׯ f:[[\p-=
$q;! 	N\RլL(oqURYQ?%hTgy<E'8EM[0h/.ND+6}2	r_Wl6ZxOF}*#cݻu;2*K{1!mu#';[mݷ6Q̡ߴL\l+b2d!B$v,~BcGppE.'̹^	Gt*SMz}1]BU屉+gw6c_gNrp8xJgk97h9L%՟jͦy%}7/ҷڦ=gWcv`ʳbbXymlΧĄ׾A|Qeo^a9TA%dGWyH`:
j-W}ĞiRT`rWok"W9˔sf+pW7e;d٠e]8L IjF$G~ʊKɉOLHLJj
mq9ĄёW:uY/y;zo>}V]l9^>']gS&oa"D3zО	?;J:I#1diC+3@]+@z^&
H*p[",Yr3%
<_~@ʣr),,ll[$0eAC^$--1ãq1`C%bHǾ۠
ƹ_6eXLϰT|E,א-tt'ӊ$>SW/ꖒHԅ|DjRTL,)
Ӛ@dM![F$YK܉>#5j u0FPkcdDTLt}u	)S<mtI\\"vttt;{C'C[LJ0%"uhe\~jg?am69pƄ11?*qл.Qh&AAsyE]r'	x%*XԺUX&W,UN~L D`8Arw6bI&o-|zuNNn~AAcF-y,~Dig.sGK#n3eÌ~O8O^&8c.}bv`%cIdXQOF
,|{񁴜FZV7[#fH*@ȷ_#yvK|5Hâ)B"Yy
jwB޶޼}k*3h10\z|1ďzܹV
<G|̢*??Mg@>Ǡ^!5ˢ3@X^<_m	
zJߥڹ:hH{&'"dd>Sz	6Ei'*IBtI&
Ϛ,">{Q3T^#&%Oyhqimt/@g!/BKw@ր0#ITQ@u.$%HG5(;?Wk_	FqI+^CKs?]v?vioYn4v稇'GV!pL@O8Y*z34!myrJg@2}8L>ɩv:)w.[sRy=߮4.+2p\t}faCp|{8{aZ;]%o!ѵs	_pdQ("0sP̘	}Wن<Em<|éɆ(|֔!%QqP@Zvr+01̇H{h5FWhS+K4uXpK{QʃT=r0JcO(0J@Ԕ;k}6T	^<އ,pSoNCžu?U4KK<s]@HyXik.{J|NY۳n5DzX
|		縳ru6vJA/ϡ
GUñx
G$bQSeAO?:D*'6Vm{!dd{]{P._} }[@x!/Oc?
́^W[%f@볗Q	ש]̤IC#\gBr0h&}6"+[UTOqaEz.i$J]0lC{ּ̎Nd9}n$OW
&M</JK^$&wǽoސңRI01 չ⫳S<'O:}ЈhyuߓnɥЯt۶$en8P^L*]OPvoAH[-OP=oVYZZ2}M)hRo/
0hm
R(S2
Gr@-;g\J'sNLIINzVnv)k9Ƿp$;#֍Ayo3ngrg`xȅ#Ǫ_.Q;4vQ_Oݾw_v]߻wy9|c/G'ophGC/I#TQ3fsLVF\Rbde}Ɣo޸،ۍ"8~ł)'z?Q+I؅UJUrR9\";kHLkhB!}ǭi%YX>qיݢ[Cp[{#M99bQ%&$.TEk+zK2F7r"8XwvYm؛JP?sk$	@Bp !8H$		@Bp !8H$	@BBp !8H$	@Bp !8HIqK!IENDB`PNG


IHDRxԅOtEXtSoftwareAdobe ImageReadyqe<IDATx\x[V@H PeC*PF)/P@B$v'Nb'-Y{{o[޲-/,y({uk!َ@9[s;seC5
j(8QpPFA5
j(8QpPFA5
j(8QpPFA5
j(8QpPFA5
j(8QpPFA5
j(8QFA5
j߻i&gnw{<29V埩J{ˆFKceTZ2S>\.hJ誏hfZkFOow힠#iqHq㌶<#rDmLs'H'-mfjh~~q?;ܦXnGゃr\Yd4s?8\t_s,xN5tWUG=!墦lr\4OEÒ-p.qb$mXK#&]Bʠ2QSw`glm?nLJTyy'ZrBY[n/ZkNo_\{n_mD{#E76sl?>t/z-سA&[8*,MHZܬͨg*Z>o%Z]DRܘl9X.hsDjT=LiЍK0-]Z3pɐY_g21>|
uPjV	_K8o}j-$.N~pi[xFB`F~NXj/˶|vznU#j
sy(`X҃E^wɀI5LNLS&1z|Zv
#^/)xoݵg\~%.պTP_dLNF&|waN-;1[%+7%rXqGdZ>_M
zZAsjvNܹ`2_sAP\QwqN8=C)2e('P+/knqYQ]t|hT3bR5>-:uR>zn(C1i@c\'4|jNSXE<_لAܧmtwe5%vU4s'#Fz0H7G?
K96xgWOcux.|`"h]6if$ads;h.')	t_xH.SUJq{,K/8'sNR)|y'Ǒ|9,wɏoءbu#+SmJN1/r#6?tl/C}Ԃ3C-.]8gଘAvC0%D4M̞O_T9~w87vgctPlF3kYОA@Uw|N
 ̧أ3_6,Qh#Ғ%v倬WziKmd)[/ŗ.TB:w"˄FzE=y'fk1tOx>e]}2ҿġPO4M	ɖlݑoC_!m=_ݳWL>Xh9qGq"<494\A{AzZ93˨fħk<S1f:GOoI?uhd(}^`v:|=fG;b~7]&~pZW8W=僫$R~#&g\\
8@czAs6{qoHZp~䝁dqkxYZ5ђލX4n,P1;Ę<Iʑ)njw'"zʇSf.D(
 1bajD4Mb`hxvaz>;g8ZG4 \'4_A$8@]S/tm΍m?v\ q妤.֚V U8an+$D#Lr<0{J*e&.w
@[oYH`u`*psh2Û@1L4gousvIsG%"
kґc-",E\<BGyDKK疑99*/W臈}*2pz\x'"VjB^+$)\1s1\kV&"Aƕ<tf}矩a`ʐN4 
^/IJ!wǼ.$J{x	p}´k^"^z>(xXpIfF5ΰ-I)0y7vG&oҗKf*oȶsX>lx0sccIE/ӠDp DG.>eGDUdz\?U#+~9?Fh?9:?!U\8eC@}Uprq*ҨkW*lү@`bns8z/TR~Wkq=-b׺MM^IwRi#X=a71#nGDR*
z]',%[A8<
X~|-mʯakd)ɶXs>Z3:qb[:#LF=蕰&
מM*u4*d0HS8A[mς$!p`LAG%0uYͪ%ލl9m]Q!	i%Hb+1c΁t,'&scuP`"%)RSLMgfY8,Q@:07̳)k@$@
GF`?A9oq&_vf[2rh&!5+žo%Ϣɬ:TQd`6Uճ)4qĖ7rꃃ_E+T')qe]/_EvM
HiKq"{?HFO.ԫs4&,0^
Ee¦YOic].n<z<z|:\ֹIXYQ/*9B[6vh|qq`Y<.2nv,VHvrmC-
=F`GU$ı[<6eCW	ğ=pz[PI,1q1|
1R@c56ѓ#?jSǠEo1:9ѯC돤e1TU)GԱ_KMEzrj0c
ɲV|/5t 0/$eHfQc}*ϧ7/!BYʙ`A7lY].jfyk{"ȭ:hbsѮ	ׇ#XZ,,\'ߕo|5E>3v7p}80nI˻څ^ޥG..5آpiYv{.|,X=ҵRi!٪HuPRjAN|fqo&z-"fΉjpi/s{*r/#|wSS&NO5wVHl5HJO`[Fv |v)m
cżUqfgc@\u!~Y$"BARYkJb^a@+p])gsߡJҥꥶNޠأVWA: l4}X]^8zKq9*jU&wOȧc:R>2ya
KEGy2Gcb캿Vn>]hdNrhFz"qA3z00pF4l?xT=QݤU`iYgN1nu$<EzBTB::e39IvDV5`!"1E/C:ιNoրWyVd?70",xz&Z-aW[$X%,x"tU/rhڋbRU4GS_qJHʁQcؔԽr]>F<qi<&qqY"GDo[k0C4X>_zbg>$f[bDo$X@EC垬s@8Y=ځ~߬w>yGD%*=!CCЁew$~[y=	BDbz#;$
h]~@ޯQC
'}9ҍ(pq?ǣg`+u@eU	Ipk#l~A*	|/adl ,&D7݇\R;A`XRӗcz+:"?=}"龐3=8>uS>v~ b![3{ϹI
-,\&]F_
p4'c}JIz8b{P?4)QV_((`DF5y"Ԑ2ق?HG@OIJӬR_9|Y"P?Dl%#SHuwy<='߱`wUQN6L؂̛'-^rsIx7qjAV-'ˁ	v-_p$+O.cyq!#S?bɄ&3EM*
JRg.VhT
R>gYQ/4P
^YK#IfEu%
Am,\}3NBt&fX0BB:+q>o$r.&8Jdm9l!!|>ogv!xdUŅ
$h'X@pQL\PI
ґb$ʰ2	\.Z+7Џ2
E}(jGGo?uWM^j/Yoo_F%	^|k<O?W0
#?pOfA :<YFltuz&eu:yGn2w{]ȵKt/2JhV
\雬~䑕[_eƠ18$~[8*E.hrMHB}0Rb{[7pB*IjNncwS6;rh#W65t:`Ojpb)je&.Bß}lugzjF.It@t1Ԣ|/"LHSQ+7<1.clP\4+7$΋>:z˱]_qʅeH0buG䞬dH
z-fYkFǓQ1^l!p.*Ǿv;o)v1FjeR>e_h8xN#ļՓY"ZtPV#_u:r4A1CZk)4#65<2m=iHޯcس[wqVb >$[~3/hEw@KR70:ᛂ3[\n$N,#	zbH5;3m_{G#˼Џ2pk#m)w'،VB6= oZǓ˔7(ٳj[LS,pvc.43!6 }Ԅ"*%
q98~93N\<QɜȔ2Ӥ'ƼQ1`FC|VL{Ӱsc9l%gWe=L%A!+uGUҍQڳU!L3zrzU=b5ܘ/4 GqsC[x9r
DJ	7}p`a>66{6{8.$Cdju`Z7k8' .XTxM)Yl
(:@
~IzlўO6/"7$٬(o
Kw)Wz{')<p)V%L	kEq{$uAeI}xs1?})Dzm~5/C(&[}uјإ`ӊ,9mn|MWKl6
#~F >VmD	YC/@Qg"cĝ':Gcc
nnG~1G'"k۠3˼o9.܌%OI%U!)z&b:!_^mJd0"߱F!bzל3g,wB:x$2,XѨtl(8.*%4?@py8Vݞ4σDȍ>m"D#[۵x
ۙ|yŶ$KV,/cV[_Z	nE!vV
9"[lCϧU
*e/m"H+,'LĐD>筤RaJ!;d
o
@lc̋6ecMiJ@frJ+cwOڞy(2em׋q.X}I)8QpPFA5
j(8QpPF5
j(8QpPFA5j(8QpPFA5
j(8Q;q('c`IENDB`PNG


IHDRxԅOtEXtSoftwareAdobe ImageReadyqe<IDATxLT`F:ѝX+PJ jid
"h%RR)@jeRQFYX$%KH$% &Ǚ^ν޼afw{={g#4IGH $DpA"8H A"8H $Dp3]-%]O"鹇eҀ>מ@ߢp|:mb#,xX['Z/>[,rӞ?ƇApU՘}C{oqQ#lӢbʷu=e+Km4''.pLMiouAg%jssC(8.aZChX	8
p@N+V%d%lO;7B#,n#/ 8æ᠀tiٍM=Apxu"D3
+Wp,	111qر}$'']pիWAd\.Wccb~vy{E,5Njn6}vvNrJ۷ow:!---BUV͛EEE=}T[lѻ7o.R8\ѣGBD֬ҠÇ8yTәá/_,9z͵VTT蝰F徺G߇]?xpޠWYiyyygp8###uV*7>|0pLOko}yAO;k/_s'N;D855Z߽{7>++K$111r8xZ[+x<%vGݹs)jS4[!jpa4رS^VXk֬a-n;w];wT<\ZZkn:rlܸc͛{0Z8?1!F'PWʭ[Cihh`͖/_4 `)=Lǟ`8b^4{X	\@ZZZ*҆~9ڵkY&狌t׬f9r<
ky`9|!#+GyXǶg!39T::Pb>]&3gΠxSEZt8<E2%?Ne!FtJrP*l
`/Bz(##3*_G|@Z+\4???bo+66)++6T^^Κm۶M}XBV3`XěVJʵKW
as@z###UzSH=%8@}az[0d9 t@W#绍л*ɓ'z~64vHȞ!	
+ʗх@yTRYNE6+ҦnoDڴi)8P/>wy~!NáW,	pB|=px5v:f'; 7cnw3/$~(HM~Ic:G\QHmeiiif@&SBdR˖-c'y& 
m8`"-p x'lp醢 D7#|yS
ǧ#M,VV%OeQzYWWg?dGqq19@0Hn5q~\!WM(@EÀDtUк/P榼oq5lNjt|
p|8 -TG
-,
'D,<0AԄ;d#Uxe#xNÊĊe8K6=GuuuHq*&#>I0ZZp			6qu +(AK-!,OO٫Q[[Z&)>>-s@>pYfffS`E8k>8vŮRY}g+|iٳgΌ۷[sm1ƊpDGG:jC8
ݶOMJpw,@ŋO]]]لa(\ϑ#GB'!ѡg&H}`Æ
zeiCթ ύ
H%8===Yzthb2V ,`'cr[ϰ"tp(—bkjjB?ٽp9؝NSb!KO#C$a
>''&ndUo[byK[BcI2^ptvvi<nܸ
gg\jp".@7{uj|_@[[[Q‹800044gH8*tUʮYooo]nϞ=z{*"1[A[T_Gl
6t*H_P$/7*<@BrAZȜ}SBm:\zw7ϷB|shE|0|k_	C߽{-)SJJ
\|`'&K([~GhJ@zUjT`%m@/ig
yzXQQF-ZjwH4dGM477v322|K{ `PLh]]]qqq\.ƟNK
9`sV#1A
f%[O%$$
$D"8H $DpA"8H A"8H $DpA"$DpA"8H $D"8H $DpBVc	ZGIENDB`PNG


IHDRxԅOtEXtSoftwareAdobe ImageReadyqe< IDATxXTEP(vbW{/$,7LFT$"Uzݥ.+l@gu7+R^|sܙs~s_  Ap Ap Ap Ap Ap Ap Ap Ap Ap Ap A@@@@@@@@@@												:A~!A'"{&UPK܋/^\̾r(^Sn|RkEZ㫃^tϛ'߾Mu;K۷T^U]I|Aq|^??ʕkY;~ǽr(&FYR4
%WGs6@qw,^,۵[q2,Ly:VUGj><~yZ&&Fl߰?9kd
ypԩTc^.<OOɒٳ%/H#YTlbjن@yP<8Xeխ[W?صKWySէNIk  ;S`< ؖnjzt%v.Wa׮D]
uxO&>M-_Bf_d|$С5nnmj5dfX4I 7瘚@y֭jb"06mjTH @[ڊ]J{)~;;ds;RU__Lbbx͛Z4l	dB##q˖bAl
j*b	(^V#;SKYMm-Ci.|7ǧxb??9goZm[m9vڝoPpc-8""Lq,s?^R)JսXںUW
JR5W=d9JL455#*0m(sKyp"e0h"q9Q`V0й\_jD
˭h,&g
a8IqZ2`]LfRR/B~|lNURBz4&NoܸIIϮ\rǏ5%޾yK}_JJDP4Z
|HMKR2|͟~
	rE"qjjjgpp/***4pB
[ATD͙-Ē8$X;{n^j
[*J՝;֎>UL[Z>}MqK7}~A3]wqh@;w}VXe2urjݜ0k|ZZ3gǎ-L[vlo='Ѱ
oqw@76Я\F(jpY9ƎniD6<s0V-{vtL^Y[0kթC~VWٿZe&~rڶM߶#T*B˻ttj֪-,}'𯃭%6J4;}B:qjJl,w[P틋x[:4a<X޺B'Ox)6=~h붦вvֶm`=ni<q&WƍٵM;3p07#?>yt`26VmM==}pԋD@U$Y~XjgH˖``im:X:X8Y?zTyE>ոp!Ymoi689H,&sP~x`Vڱr ЙleKX@v@Xڀ{AGRL.5\];w|C@@0[\ݭ/neϺ.vl_~]OΜ:y_,wQ|9_GsUy{,܊֭Y
ksg
:åKǏ9B-&+<^[Ǐ8v3g~cۛ7n36jefFl	8;:iCٜpa`$`9O!	oQqqصkN>y{!a6wq}}*R9oLOP0!	ȑ#3MB&pohص'NG(<q\AQ
ٳg 6͚1-K+ਯӸ\i~f9^>z-~[Eukb*I9Ǽٳké5ր~ '&1d`gaAH:-ۘ8/];:7o܀.`c1ح߫ׯ`%H">=|Zߞ\R>l <
}
͠ #}
j`siƍLMKR+(!lAғR_ӯ?;`1~CFv~&dr?"AO
VJrʇƕϞ;'`LA@oVb>3}B€tY"B^߻S'ķAn	)	ϟ5C@
wΞkɁ&n˜QYYٟ#DRX,6a٘͜65;'4*?zD)p 31&;CdA-P[Wy,
Z#22ă_ ?d۫w!`|wH^!`C30pN8PI l+WYŹ	:p@3		44#̜6g`gS'{
׻CvcF/
NNDdp-3aLn\֧\nlF+d"m5{ƴA1jXdc̝ۘ(&oz葌H?/hLcS W7i\^cÃt&111]:V<(}+E@z{~'RN7O?{tt;
r2&dҲr.}U:w2
mCsg̥˗I~˖pjcY
kjj's-,{ggX6-8&j-S&feeA
obX)Ƿmύ)2*]~=``bn4sdr3~S)B._4N9 ٣28?Cmc6JٳnjUsfbd@c
ڳKgmqkk5zİO_8Ch@{ݻvug#y@MG-`<,`1߷op»/p/(@֥cC|oT(ܱc;ƀ3@
DAB]nP]sF03nx'1vn2>=!>ɰ``J)-Zwwq>w<^Ep8f[t\sP[x`aʇ4L4U2dLPpŽ7{IkCZ< vꚏ/ܸy}P6̰`aէgm[fdJ
rܻ<蟬ځں
ujȮN/^+@Z8Tqq
*AKVxU>ppfτ0rukMVΜ!/h 
>=~y:f57ƂS6	3z惟8umυ&1:` R
@@a;yd)g`^Q&5h_P8̮cHh(cA,
;ykתu`K.riur'i_ZCj΀/
Xֺ)G _<7-=ݐE*;>a$|L>}gee/*2_yǾ;Am>|dxh?|RJpԫT5QQUݺVU:ŝAvvNHsf\`<~b
X*[^??:֧7~
]+Hr];wVH~Q٧,+;"E9IIڳ|}ѓ'
D6c|͛7!k![1<JLJ5d6KHL9l(tp@i	P(:kP[`P!!!x}YF(>{ҾCP)
#3!6Qd1v8(pp?NʓCgnZ6:9BApΆ}	;CөJąŒR2_x&;::} t‡9{FЧӧx!Gaa*vagNZl>|<sfW#m{ϫ2(\B|(%5Pysf<!_ƍP_ppOu;z~{RU!.3m]J gT6o<sfʻX.%%vo)0{5be;0ULzE/~i~ˠ"[Q-Ytɢ`XAXGLkw6m4H؅=,ZHjؒ1F0p׸1@z&O\fsPizݻ{_`x	du
x:
6o(*A_=:(yQVyefeݻ<kB
uaڣ@7^ӟ9$T`A&p818aLL2nKVks3eU^xQzVB'Hp^͡i3CZzg'Z;0cuLJ^ 	RoѦ@0"O^ppbt6L|ѣg*r<͂<`ၯP(  RHH} Z͵~<]@ @(sv~~~zz[5G;H`B%k!̚a;tE3	(h>cKT:cM0u؋K|P
gΝY
,֮171:|[
׭o$wq|ha

/0tJff`ouÇz~d/sSP,1m҄̇=6?^[.[֦Us?8/>7`
1lh
=+0|W7`ϟ?ѡCzT&ڿw)^8;7JCV02d[QnH Anwp=c>l߫0:_;z tPAlݺɓhB%E	nkIo\s97n0m|^7)!uڔI#y:T7{aс\>uJ`'1_Xw0?$Ǐ/u)`ȨqGNRTk4o߽77ɓU4*h/#GаCB{:A{0>f6'j=PoΝ$m&TYE[z8;vLZQ__[ҧ/AĔdLJ^>z
*V(E$rV^㧱c'I%J#GrYYb󐡖W(+/	H?/bndԳDCII+*+m*ٹ-@y}%'F('m6Ʌ_;>!)׮]{/55\R
4cVWW(*5ʪ+
:[BSYY9l+},Ww9?9ͬo|{|6.{INTЯ]/#kjH"IP[ݲڧjq\J"Z$RWWU6[b̏J7o%pT\.\BmZ&W+JRkP(U9fm!bJs+9/$VEH|NS(22YZP Ȕ&'޽>}{sgVhe3#Gݴag?{El__|ssr0<{o.^]TrVN۷s~-a."/]))ҬLynXV^.єB"վ=.¡G䙘(9NK,o)Tj(<BKHGpaCՅ`Z7
>3'2Grg]\؎ccҽ׽,ԽsIao"6P7A֭NN.]}W;;u*o<
yBC<{V*&4T$Cp(
͚y:(hݚrf$C*tQN+Jx8ĉ[ʗUN^1jt}P\\*)Y*]56TTyUoj؛To0vGfoݵ2ItMz*Qper3O(03+	&)?)=q߿kͭG3ή2ivDF=ya`?_fԌia8;{۷l2#cǑ&M*2pOO<e/]9-Ƿt4q"V:³lz^8..ΝՖ5ffƲF\ȸƦϞ:tavDDuvx0(E,O:#<n]lm[XTN5xlFFccFVT*'޽I)S2}}Vnڒ3/r}6.+>!7% =*<Rn~Iaq	T^RRQVN(UT
JcP:W*m*)UJJIiJƼbNnQzfajZ~RrN|Bֻ	<Js7%^pL3EO%E^Pd	s4ƈL77N|BvfaK}¶m;'LmξqC@"+JH?/;pJbtlI8>:,3/;((52*56&ZY:v,pwJM_Ms!~*5-D.bWKe|M[,b俔_|>uu2'1Y**D*OJJI~("f8ْ{0||/ppo!m[ө#sLɓ
MJ;p?IƈhSLIFFZZu>8o5i;/)ަfWTTҙ._ |aHĩ1*6XI),("UO(!#$v(jkd7̙[n}b0
gI d)yZ)s![gwpH4(mM3p#<"p<>[(~utTr9["!0+)v֣njrR!z{g)8͛g::4_Y~r
DpX*C|q\S*R5"!~GQXX[GF#1%UtG^oWŝ8qYV
e2EmZx}!z>2ML2]\'Oy/3H,T$$eΟ>lXgi^^k~wՐ/4T(4Z'DEAVNNZFVJj~vneiJ.e8 Ap Ap Ap Ap Ap Ap Ap Ap Ap Ap Ap A@@@@@@@@@@䫓'P8UIENDB`PNG


IHDR7WIDAT(c` 	a0
LKWP_i 8
Ȃ 9
[
J "Hc)@x|qd^2IENDB`PNG


IHDRrP6tEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:22C7AEFB8C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:22C7AEFA8C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>N
,TIDATxڬTMkAޙt?Ђ=4EPm
$#x"P$7S=V H.Rٞ4Hj>v;M1&P<>"!rZd'XU0|z15g
@OFuuBֳ-NP$~+Ug{L9nZ@I@MFt}8@B򵕌2ӟ>x014-!RK"RP(~̈(Jx#V6wFjP&dŹ_}JĠ^0j
ڍ~U)~wZvQݴWi-WRЍ,AybcX[9Sٝi8^^\\5fucʢTax8
3vQX*=r>jϻǀ,8gu7s^L7oB
<&#*[n"tTe aM#b+[Jo$tI?þz:DՄWoAx'cڕ(~NOKtc&c1IENDB`PNG


IHDRrP6tEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:22C7AEF78C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:22C7AEF68C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>RIDATxڬTKTa?w{Ό(3.l&V2R"b	Dk#|"ZD J"Qs$y8ws_}߄{"p8밙_/fic]m{aF!I<->jwWTS{+fWmi[ƅڷY/Į̶-.lj";qcYQ+rz[YfXwTL-VfQ^R]dbRk>Tk6X5YETϵCX+ 
f̢%fFko_NJbh	"Q#gaYNB#fxBxm[Ҁ؉T@(aFa$M)3=O;]x}~ĉdiB!	I
|ҿbYh޿>3~t|GQRsy[d<i
Bp=/qiZKs;n7쵯i	QSŒ`9zFC:h hԝjui
ե2tiH,2S\9#EsF`p
y:Ãs)).#7WVp^bx$wERG_"/'$q5gaf{&gbt7S=9[j,G6`okӪoϬ{/;ȾY3UYհ)mT}&??/|b)K~IENDB`PNG


IHDRĴl;bKGD	pHYsHHFk>	vpAgXIDAT8ukl?˹^Pz7Ji@Gm#@ҙH!̩^3ɒmɲnK\2]7F7eC"
ipzzۛ.n>ɓ'œ<ϋWxl?k[GGw[[+B!#dzC##oLJz{'dvH-4V'%_woݲjck3$()+.Żᷫ/|)%|#z_ya[mͿ;E\qa.J+55NxժѺ?0hkwiOc?c{n1)q[L=.0k }ZQN xG޺aӺ?O]ZN,egϒ5[бyEBUUn|7¤?&&ץs+z+nJic?XWWզ
zy/"x֯CvgN9=9NiK#1dRmJ]IPP~i۳'{7IcRRͩ/m6m?s~F/4f'ܺEpDV՞>ց5Me?NIUcFoĶ里2 eu&(-kܖ}v/k'զT&՜eb&8Si
t%Kb25N_]2Ξe-x<At̥`ezA,I2zc!'"%DJESIQ@~Bc%E$;֞aGu&sr2k63̴M
@unnҰ2AeS88r&[3q8{KKUC3us4MO=}lzt'g}~n
me~K!w/8"QHYY򨪊!ɏqu3uyطz^-C
i_ug#yR>yM{$•ӵ[2̝A,t]¶R(vRdB?Q_3R5Mq$%\χ0n1ȌC3vTLSP(-q>:jym>5n^0KV
P7N>wy}ra"v
2%d\JL22DL\C+7Y.;]"w΃]dZ)N\@t]'ںZ75[̼mg΁C8%\!h`M?ՅuþXʢT<m_knm5pۗ-0e
F	!))o"oVzWݰ	".S[3':]1іPA
=,<LY(@Q [Hߚ_]SFtӫZȉH3
xP5XWn_	%tEXtcreate-date2010-02-04T12:10:08-08:00%tEXtmodify-date2010-02-04T12:10:08-08:00v tEXtSoftwareAdobe ImageReadyqe<IENDB`PNG


IHDRĴl;bKGD	pHYsHHFk>	vpAgXIDAT8ukl?˹^Pz7Ji@Gm#@ҙH!̩^3ɒmɲnK\2]7F7eC"
ipzzۛ.n>ɓ'œ<ϋWxl?k[GGw[[+B!#dzC##oLJz{'dvH-4V'%_woݲjck3$()+.Żᷫ/|)%|#z_ya[mͿ;E\qa.J+55NxժѺ?0hkwiOc?c{n1)q[L=.0k }ZQN xG޺aӺ?O]ZN,egϒ5[бyEBUUn|7¤?&&ץs+z+nJic?XWWզ
zy/"x֯CvgN9=9NiK#1dRmJ]IPP~i۳'{7IcRRͩ/m6m?s~F/4f'ܺEpDV՞>ց5Me?NIUcFoĶ里2 eu&(-kܖ}v/k'զT&՜eb&8Si
t%Kb25N_]2Ξe-x<At̥`ezA,I2zc!'"%DJESIQ@~Bc%E$;֞aGu&sr2k63̴M
@unnҰ2AeS88r&[3q8{KKUC3us4MO=}lzt'g}~n
me~K!w/8"QHYY򨪊!ɏqu3uyطz^-C
i_ug#yR>yM{$•ӵ[2̝A,t]¶R(vRdB?Q_3R5Mq$%\χ0n1ȌC3vTLSP(-q>:jym>5n^0KV
P7N>wy}ra"v
2%d\JL22DL\C+7Y.;]"w΃]dZ)N\@t]'ںZ75[̼mg΁C8%\!h`M?ՅuþXʢT<m_knm5pۗ-0e
F	!))o"oVzWݰ	".S[3':]1іPA
=,<LY(@Q [Hߚ_]SFtӫZȉH3
xP5XWn_	%tEXtcreate-date2010-02-04T12:10:08-08:00%tEXtmodify-date2010-02-04T12:10:08-08:00v tEXtSoftwareAdobe ImageReadyqe<IENDB`PNG


IHDR[HtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:22A81F358C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:22A81F348C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>yIDATxb?e
!dTMAR5-Qf]γKV28Hl
S$ٹظ~qp	4ʪ[ZdɃԁ3@q%eב5緬߿}{zi5N.&^,Z*|lzko}e@}׏-,l>BuԤ
zZUծgp:Z2߿_gM5AHI+A{0caA|b-")IZXr1! 
ĩX8XC7A yX&*oGY6d
6% >H$RG,	DDV_;0A?O;Xo~n
8o_|@ep[4]&!7n;x(&$g^ˀXן>EpA u #&B!:SV
3NĻIENDB`PNG


IHDR[HtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:352D49FAA31F11DFADD0C38A2D2A53BD" xmpMM:InstanceID="xmp.iid:352D49F9A31F11DFADD0C38A2D2A53BD" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:F77F117407206811B283A9A031B6BF07" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>$	IDATxb?e
!dTM@R5 /S˨Ys0ߡUbaedd緛OnE
Sv	0rUBJ$'g@e횎>c-o?u',?Z*Y|l"2޶\E?~ϯY893-IerzT-ܺ\y?~b#3&V6Κto7k߂ef`ac`aA|b-"gR#"b͓gZ7bbadb?0&
ATLTPW?3+CoC&KcYG
A uY&"+1G@4ɃԁԓmYqA0ձ37y!' >H$RROQ~HI>đꄟx-2R(0P
IlxY`'tN۸IENDB`PNG


IHDR[HtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:22EE11AC8C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:22EE11AB8C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>LbIDATxڼV{HSa߽ntN^L

wHً@`MBJ6J@kHYQfj-#""bom9(wpvq~=  T`|

&Qz{ޙL(ܑldXv4
p`pZVUQQa6q׹\:N??*y|Qϩ?BjHz11OT7a
jl~F&lX549ՅEWvՒ*Ǒ+n1~zb֌Α<2Y4HQJ-Ƨw(t>IiW(221eӦ5T0r%^xXC1汎8ć{ȣ^x^֣.Ab''շ~pωQ3`jeljʩdG>!XKP#Hi`1,͝}0k2Ĭ]-H)9c!.eoE@ <Qzvg4mT;۰yς풐R9aUz1LTh;7Tcb-cy#Nψd/^V7xsXㇶ-_<j1<x12וVI}	Ka܊%J ]/_]71Z݀#!~_7ITiL;\_;x76iğBH}Ȣdݑ,όokkcSRR"6AjdXyy9<8t
ifK	Nv}\.קZVrp
`?߱---Yzt=7fffA^"hk!%&~0OIENDB`PNG


IHDR[HtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:2318BAC88C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:2318BAC78C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>
<IDATxڼV]HSa>;;kb *VuOD^!Q$ttQMEW]t(*XyL

'J9rsՉ68?{=}T,Z-Nyi:lDѭBDD&ٿ`hjV__odbY1eI腅o*$[[[4kiiz}y)[Zh	B̌-8==̊EEE᜜V8˺xD" ZC{{{1lCX,N'y
Ye@>RHuu5z0
1`?:%1 %6Q^
Fyo7Q&VCjkY SB%7(Oc]b(tԘG=4;xm[EI Q]dTͶɦng:#rm))޸|VIoȉ7'tGcT644hЦJY\\mwT(/-n82}`S?P7XEV#W7+]pn;(<OOU&Ǎ4˂"Xvb;˔CiU0HnyIDa/׹c@י(a(r('C=#]
ȃ/4Q,+D+`;j9+:$ҤAn\<i:w=vÏeVp?xuH3h䛗Nf7.vÏ8gʥl
ּe+gU[쮾D3`;CR̸nL]e%X]-IC<sgopjjjew,	gMi=dQ·T?2T$3Y_6…Ĥ>>>k
;Ծl;277Ǩ̕H0d8	6ɜPȖRf=0:;;y_ssVG&ba5JL;6/#(IENDB`PNG


IHDRXt IDATc```bok	"FK]a-IENDB`PNG


IHDRIDAT8˕MNPK)U
"Lڀ!!U1njX#:eLs,-0sۗ|s}禒?qptPB`2hqIfM&z]c±2?w]܃\%a܁cf{]HB㪁jn]r(\Qw:v *pm?qg鈻]ZUUw%Uǡ6Hs]eQl6kAdC+34M\+F{7D8
6f>7D\WdȆ%CGRA{Z auWDQk8hoh¸o6ZxqKAS<o ,$-,Kc;(:o;tGAIzoXEPٿrTC-
VEIENDB`PNG


IHDRIDAT8˝IKQoƉF7qW""(*?[TWuuB!^phF9r4
ëh0^AJi9I)a,H)3N13)>6IlaU{~rfqGgn0.[!2A!}zϒ~|&2&wqʍ~#ĕj.{+2i>Sc\`a-*dVo`.?$SIENDB`PNG


IHDRIDAT8˽1Q@яJ=P؃4a%4b*q17IH?qP&VJ੗r>xDpoG*Q=>
K|U/=5{QG`#%{KȎ|08IENDB`PNG


IHDRIDAT8˥!IVl@g=ZB+aHvPYjƻw'M&O0C_
UƴN$Э⟷C/_|O0M*UoW10bbQ7|17wIENDB`PNG


IHDRVu\IDAT(c?)qTèiL#|IENDB`PNG


IHDR[APLTE5555555555555555~~tRNS2pl^<IDATc`K5d``r///Q`)G3:K;g( T	TT;0mҠVIENDB`PNG


IHDRVu\iIDAT(c?)l
@	r@9i)b=$ZP1ilA
ԠfI!+ GHrȶ` f(Pc

,*G@m5IENDB`PNG


IHDR[A$PLTEC C C C C C C ABC =tRNS9p'LCIDATcdv?s=wHÿUI|o1F:*|1@_*IU``X1KHKIENDB`PNG


IHDR[A-PLTEŴtRNS 08P+DhHIDATcd
/U``dYH{N	@({o[{ҀA(ݻc
j$0eo"G8#IENDB`PNG


IHDR[A-PLTEŴtRNS 08P+DhHIDATc`Pqb`d`ަνIbdy"w^2E{۪ zM# Ve+ ^'S8TIENDB`PNG


IHDR ǍMIDATHA
0$£O$~l#I^p'Tp
S@P@P{l^i9IIENDB`PNG


IHDRIDAT8˝NP%
 IQX$M0q`0U`@Hdr.#=uCb<}=_c*_~	@=nѶbPXeLل"c	&R	'u]&ȱ>0bF7O;q\}<?gs^R8Oq|S fj@L%cd2`?>E׮S"_z=K_ 5NGq/Hf2ulP 5ZY'c|>]4!m8YO\,{EGs-K΁dtr:_9٬8n8p84F`0(˲LzVn?UU$7\3{VXrx˒$IENDB`PNG


IHDRIDAT8˝	
0Ek
Z-"BxdFB8JSx&iy/T'#,iXkxv-o6hg	 
(alXZdEWt*Yx<ʠ	Π%LDdM,`eͻJ=ʆ[pta!
ﲄJvENFvk
wܽ#rɐ.;p~Sp'(zhR;9
z:IENDB`PNG


IHDRRf2(IDATH1 ? mJr\.r\._>VacxIENDB`PNG


IHDR@4=IDATxYkUE?M#j|5Q~%_$)A%Lwל{v.&s93SsW8{DHBR	@(@	D )@l˶2^GCU@v%$	|ʽ8_
e;PnW@>*~?lm՗ܻW.
P!s8~3^3W~7=id+p/31֪#e~1>Q@`22<{—4^G_ƫYGA
|GOȌ@_fHA߹$9㒁hDvn}9k	::_MLZo>)̥;itc4Id!kHi Gj:V 
p#zEKbP`h&QfųB|;R^M]q%uFh2D{DPb+- 6gb5cȠ=-z]{&8ly7ɢP8cYs
ub~D,Egoe`5
	pBqM6TQIȺIv<-rcEi$qL^^1YdifH	h$x?֥P쪏]-S+jbx;
v8tG\#saQc,EPdc
.)BS^MFd1K&,y©^W3ˤ!Ckɼ5JE,l] !rR7Uf<e9G-rVQ;4;!X1HOob'N/";.O-Q:Q!.Vij*
 h_kx1xoiBv'(߭T}[A!lznlX4<4nC…Hs+{ PPDQc{35@AIPfI	8{}dT|
#(u$ʼn\8Ǯg5d]`r>=	mYB<qAX˩G֏	B1ϓ`vj4啍VJfzqBїBVXJa<O^;g}:6;Y[G\vjGm,Z,gVMЖőW䖠yWArq`õʒAaJCblh{lUR!Ғ7xr:JB-ԠT!Y`Sn˾:@O֋H~vw4MQLc3s\lj1>b+_(:̀eo~k+̅}Iz5\dI^5(ɹĉveͬMvZ	Xc0+ZC&.
p0o>q~t89&	`&	`&	`˝&R|z`5N[8?&	piwz`&	`8FnR#M<d`z`Xd8C}5=0LG$1=0<dDMLO:		`&	`8`k&҇iQkIENDB`PNG


IHDR@4={IDATxZv0bBcMi(
%6Zۮd&@9jvvT<̯B·aEu'ejdϦ݀WzL\X+p
&hX!ϔ_C<ȇ?jpX3ԭԲfrVnfsAvP㆖#r+܍2`u|Z~u;0[#<VXQe-ӎ(l@QnU5k()2+[Mj;9DYD5Z1pDzF^Y{[[=+}O#uidlKh`<|iҰxDTRj],+HlYϹz+KEwi/;'VjeKܲ-MҎSO[;EoPzj%?%{%G#9A}DUև0--T;8`w2k_+r˨]@݀=Dvi
^WV+=[]p0Rei?iRy2;,%TyP?8Eo쾢8˗ޠ|QI8`'1+L]zkɝ)Ws$is3|_ln-q7)ܛתTlt$l!V)_z|.PMfSaU+,Dg:m;(4PN&="]C=sS$Pvƀ9Jo):55
JYOIR6y(1R(	-:ReW2.Gbvj5*]`hmRcgHmS79^'D+*4hTf6cWBdHJ1p[,W}JBbΡ8h$Ejھ
|(4b	ɾm
FDgG>mck=kI[)P {\Dp8ppcb~n9@/8Oh2?wb8_p88_p o/88p-~8@~̳IENDB`PNG


IHDR@4=IDATx[oP6vhAlRU۟PKȥBbg9ݓX=3{qG {nWYnVY71K)8Zf
hחˬEłab/s+q)x>eّ
qIlaАó3/)%՜5&BS6
B)M+ 6*nS?4PgH
"۲@k3@Nʓ/Y10Of^&^G@tk6@=``5(1`"7P6;E345Dq#T|͘ǜ!woXjr7Ы?T<s|x41DZM
xTAЍ 
TmO	k
8CjfT_@Q
#;LH3G/A5Z Z4vYLJ[]j$B@B@R2{Hڏ:#-ԫY5gCIՀn8ɆNo-uзP
[93	~ݲhۚtv by-WŸ! !Fw7aLuEF؀g@h AO!&Qm!](&8yW@"K9]2Bqn5)S_`"~g?ZH[-i,5w7q_%	l1IENDB`PNG


IHDR@4=IDATx[S[1rir $hI--B;jf])cJlϞSsjw;5
Oa_5)5ؙ<&fzGvPK`&5<<HC7}6&[VX]_..)A)e
8%$ͯ߶*zA.rp""(pA4A^^,;V3#w
g@JRL>|Ӏ;A@g4 ;lФ7Py	=
cޔ_MX
j@&bBU]<
ܚ4$WzaPRx2 /b5f)!_\ fn`jDZ@ۅ5"!G3vj䆱	{:b-lv  oPy3%nK
Fpz;,!2$~T	4SmzU8m’`B;phuv`@	K)<6'oX\jÐǾ_%vF*RJs Ҏt:VfX(^׎P_
$`>)T@D+U@ oE/XYJ}^o&^7q5yO2IENDB`PNG


IHDRRf2(IDATH1 ? mJr\.r\._>VacxIENDB`PNG


IHDRRf2(IDATH1 ? mJr\.r\._>VacxIENDB`PNG


IHDRRf2(IDATH1 ? mJr\.r\._>VacxIENDB`PNG


IHDR**J^-IDATX1 @Wz^z^/q(IENDB`PNG


IHDR@4=dIDATxYSA_`"@	O		¦ Ѥ@ΜSX5vON>xw_:Q?/]+Gn'jxiKN;c^uth˭vb5<lG
6ۼ3%<<Քbvd#Mճ+^`Rma柏
fnRT%iX
xؘ^k%X5$Xʿcǫ'oi~LǣA@h/JQ1S'`rфɤ1={Kqx&Q@fuK_:4Y`|:r4&qfp)PmbLz?X-PÃèat`|Xj
	FŨb,{aGWbGnA,T7@ґskԋ=rʍU2,LHz0Rn\ܞ8?QzA@Rs2`'$Xۋ5@Ɂäv	@W*@݄Ygåz BLM%i\w/21DCD3PP8k E<00EƂ蚆KPW[,q)g /bk[嘜SNؔ 1K
zKP$ 1[
tNn9I'-Odi_zQ7.D=	-ȗ-F̀#Rf- w`
Qeƥ&}HB>ր57RG[HQEAIiDuw?8$[DQzrT
Q%QlaIENDB`PNG


IHDR@4=IDATxRAoC@hr2qwA񽒊)R9XnnvK韞A̛'h
0cq.aV?4L,g_BboMCuxq*p>|D
0Z>FP.d"[
0P =o9ۂ­䯩LZE6@eeK.	,%b7^oM ޚv[yU构jv
WnL<p92Jdb9=\צxS7/B&%n
Z;hmF+pVLÇreŸ2iieOA>;dt4tPUx>,Z*Z)Y#
k}ڸXR@{UځZڝAZe:)	~lh$܁ƴ#49҆ aI1B5!@EAzGD%D[Rc6 ? sn;tn䛆0ɁZ%w@Ղ7;Ie'c|5uj;  ;u@ݕ2މ;8S(.![wb{@@Oex#Nw~R$BG*07,d@IENDB`PNG


IHDR@4=~IDATx1
0_'NA:hz>sGceCIENDB`PNG


IHDRI6kN
IDATx^PvKI/fL)I
̼%']R(Jyߋvk9vk9vn?_ R[L$,hW2wK\y>h>Yuc=-h=
<?[hWlJw%Ms5 *~6;I^SP+MK)n?S+n"NiK9x
q~a8Q2Pc$dMvUvr*ƌnLs0c3#sT\^(h(O#n1V6곆NSfL)x)->'q̐pqߠ)Kk%tBLba"8Uw'Z*wvuaR27<aDIlǓ/+NI;
^]U)L˥N7X_KǠ؇ޱNQ7AorֳYUaj>_`
ZA"\]on_;DIT;6Ҙv\_$e8F3l<UAވ]fM_~b	,K_K*K%e%٬Q"CY}8@!.e!ou8LqHbje=Y
0vy@yOh6B>Al36UHPnPYjsbD~/3AƉ|LS
8CG"\z>}8NDH$E
GIjjy)ԄTL9XR
ؾS(;	ʧ_UNѕ#GE恓G tSv3e,^p!|4_M>~C~wZP[ӋEr"zPjm!dp!7_~APw{C,)Ra+䢛U$gEFz%]ܡֲۻҍSĮ}_ճ:y'b	F
Rt(] <L*VSMHohB>*usuiRՖfqwE>J#QO]mE6rHoM4!N3.B*7ˉr=S=y&v/Rq #2gJ,(#P~?!q$7I3A"Tƺ]:-xg2 ;
6Nl_~
XE8.RWEgD/kn)nHz8ǃeR^<c,)19Aɦ's$8=C]ۓ˗/_/_!B@*GXfK`?qtd8RtdghuD{J!PioL۞t'5FW|FτG8Pۻ"GPSE^I!#TU`fҳ	pҍƽ_O=NVۥ⮯U(8,9[
G<`$O*ӡ.λq]ϓU
Uʲj9 ʳ]h)O樶t$%~tQ?:NwUŷV-~wQ7S7!h
,V L[ViC;fu{NP8~g
,#jO;4F}GZp8UF%EШǙVyzDټ\_\g*
c
GGgفc_]ݷx܄\؍q&ItfRbP3Qُbޮ__?5"|s%ʅtZ&{KY"mDW^U\"d/$*w|jEI5aXX$'..gEXhlԪK}:=s/
o>A4OkSHi)$Gro ƅAKU$ۅu0X#4B灞;x*,xԧ O.dRh<(x0}=IQM?OFX{WpQh8+4i䈡wgjnt!4neeXRTvCK[1izqcVD,1ԩ@vlj%N)JvuuJW
v[=l$]%`^ƬVC]=Jt8Ԓfsh/+m"ŮzJ.f3j6dtsm'Cc`Gzl?zFsf☞	<qes$C{@524nY'i|d B*5ʪPdH̬|LjU~ig.@_6SCP}*RmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmNmN߼4p=lhIENDB`PNG


IHDRRf2(IDATH1 ? mJr\.r\._>VacxIENDB`PNG


IHDR@WIDATxMhIu!C `!s!sr`0Lvqbǖ-[Rò,ٲlYѾ
5=-ZDH֯ェzj̴Pֽ͏ǕF [(7BN$9D&߯ey(M|UxG9:
F#xkU~S*U5+$z~~$7eAn?4ӹC<ff=xŢRٻ1/ܳ?'F!\£3oU#&<~㙴ýxy*[|g5TCް<#=c`tߵ<6g[f,c{ڹc|y׭>9-lqO??,P4WGySޝoeybRo}FG7xD<2i{~Xyj~ZCoL칖g&Ԇ~wӬ"`u!VNc V7x+[X<f<D9v!o?9#vN
F׳At}D7+K(m"^,P<Sx ޒU.0,QUx^-L9ꮍPtHYoU_"/Ux_‰m=FN+I9c\cw^)woHT"f?i<3R,(
W1O!>*{?oE~5sF޸~y0=_pq~[X@]IfTʨ91~tس[f
ߵwђh_{JVYȯǷ:ӅO
n
ex-B瓹ҤJ;/T7B2Ob[*#G4\@<)3i~/3=f뿠GS?Ǯڈ_GwPY1ff7XN{L~f<քX:~{_7=ڳ?0?fkNӋP%!zk&S2kkeanUqNKp=xȷVJ;/_?Fd7-/?_\K*#GN^kqUx~ŝvxmq>N&ˋ荲<zz*zr?x5^4To5X^U&;uxoSͿЃu_‰[^a~
j9k~F8e'OUm|?bg1}odz[nY~m#<D<,Wp?S;<X4)CAF~%̝M:
?xWlLټ,˳3t³脪?Dv[)~c<!ʼ!vWߴ=?zi-4Ru^nark!
=q]b5nOwU?H+vQ3ȿJ|TӰ{j <BYwSk	S<;*|E_U#6#lu7h>-gg'W}N]Ҋff]5*|$]r=jP_yDu]<YUϤpv"_yRn5UᛌRl=V'"Fh௴Rx-kZX	\
Ʋߩp8e;W8UOJPd
T;jɿi3 d)cE~7MD#ii-8zz|
_9X
@As=ZvmOgi4/_9(詻*?_:zfz0qCi~$
]ZKZBCtUx c9;]>Ŀ`gS?J|0^xִ*Q7/k9\ؚHmV>nO?	ʼyۈI4DqJ_/ޏsth%y݈dG2/p-)-;Gdk(CVcB?y-V8XOV??tmx=,3L-?:"cĦC۲</2ao[?v6xy1~c71~;ϔ,=gEޑ#YSۇ5w\#)[.gJ
T9}!z֘h,/j_EFdWΑW5~K;ȫO}'g7|8Sߨ-\w$?(=KF38n<A[Gn7[yB>y_~8i6d?z4s}6c镍
Y֑A˕Ik~Eˢ
/=v Ze}CFD6h~7Ћ둑pwQ?ݒ_WΡ^Z,ģi0Y~/3ް~3gzuԘYt#1l;՟O6ݪZpg<#3Əߚg7cgo7Zr^ZbG"Yo7?}QvC<U{#GUgׯmL[$ng;gaW=zC"uPx9⟷?þp	ЋY񊼖(_tbB#݀7˟b(TbX)#W7hf=щ==&׌Gg5nGEc{b$O#i!c)?y]7/fX5=];]	Mx~;c{S,_xQVgqfYs9rȚ\rTkT(595o<dؕنdy8U^Knϋ,'xә^,5Ҋo7vE3>K(:rd4婶noV?\3ֺC36Y;|5{STct/FYL_?ncmo/{'I+g3^'[%iɎV֫OȲ`64<~]	˰bgk5z!~*'e
w[_߅sކݧ:\žGE1k``i`+q<[X\#G#gxYY?ďځ5ܳވ`h
3M?I
eqnĤӭX??rǞ?ZQ"E_JR#G1̳tIENDB`PNG


IHDR0s{@cIDATxSGbLb@^ml /B#/VRv%~	sqr\7ӽ۳jv*:_{zzfgwɫ]Z|
вЦu{>m%h)h;C$lE]`|{@2O1+oh։wTk{<;Jo'~/A0f΀AA쟀$~ٟ$_
uZo?vůG큦nwhN(~{j4mhnߧ\$h_հ?K1>`>Nˑ~W@~Cp[n@2?0~}g}\2?uͿ}v]̿lӚp" ??y<λ4矛ֈ_O+ߵe>SU_xo͟w5{ڿ[s˃X?Y
^e=s}jv*},^ퟆ=~4_]ٟg{}z}'z]gZcqߧ61
x;cc߮_g׿Š};Nyq5^:}gg_ja]nY!^|7,ixg><>h~IXƷR6la[-la[-la[6sV3y^]F]4|aBŏM$/qazm
qːmD.nNM>A|V=Vٯ)@^~bm|<;~2%Ym?iwbCǂDh޿,c=/׳oO#w-c;=3E+v2';y?޲oЎ?Ư&OI(q32c<9X~Noe!Wk?Wq?Z'dD^Y.q5W_a?xzswxղOYQOw!YgXCS?_c`Ceه)ۇO+G`]<%O_7;ڍ<3~vW[5[o`z2W#߫W>#׏:Sɫ+|؋yZc<ūl_?/V_7Q;k]?LXfο_`<|zg?⛵y?Xwl!7c_?>e_ n<5y_#t_g?1k²EBG}X1O?ػb}v)+g[~RK:kPZ?w_뿳?zVs:j~\1~}{[O/Ͻ~ZUt֯:gZ_V׿+pOQ
ww_ff̫C>3<;֘y'/8h@zS‡S:WާÂ/Ê
kpV/=vk];*'p4PZ&4o{]_ShELv^0ށu>"tC"|&}=‡)ÈPFngLa[-la[-laŐ1`Q{р )*ž/(IB_b6R$>--~J}^`IAQ>f^6.!LdO|qxW|'"\KhGJS:yzL״?]ohZ~ndr;] =TgGľECb\~ұ迥WqܐVq4lf@οMKh%d!0>X}څN-!㊟^_/-j^bKZ<^d\<}灏Jǔ'_<&mW
bpxB
m/ƇcxxSCD	w0Ƹ3~6X
&9OZ~,"}B
&~_{s(\~b~k>ȑ}d<,K<(|3uGQ]=URz)gƯ=y1~Å||cy&VuD5~ABCY_u"%|=~}G|Nl1:"Ts_=u9m5w\#߿/z~Ѻ~f\_9SW|=O^f^dk_ox~?u_r^
g=5zsj8~i<[΀}5}|kQo_oYsJk[?o߶FQƯ5;÷W/,1x~(4?x]I	]-?WoR"`f_Ϳ~p#'2+h?
'^^v>3gR{>ߥ:,~7\,)!`.~b(%^Cxʿ3D/h_fl|ggO{Nk@޲/J	cY<'^e)'"m>Rػ?M-]|Y?k?{osx{YlOyiԄyN??wa->yXMx؛yU]_Tg|@<*t\:%`[-la[lh/g-
"Z|w:-T9CIUTX#y1/"?vU/?5P9,jP[܃ټ8}>"Vi^}Z(>S(Եn,v'5(=ã4a}5D#k/wxUGJ|Rd~Ų_
i!(̿Gz*>_ݳ8FsT13^%$Iy7m|5	1%z7*ä|!_
~!d,M+9۔(|hF7TׄB|X<؇qfX*?"=񇜏$v?V߃@QcG8F>)>^$89~;9_i?J2O7ΟAnmq^~c4WٷT
@2_xcU̇_q'68~-<>7oǿrWTV<^,p!?V?x}OY|m[<9ƻחwN;X?{[<_I)~OVůl*fݏ~jǿx\?5M*/s?]?X!U+oc#O_e^ׇ;֟Qv??\xj?oʫ+ת+g;|s‡|\gbky՗\U\g%!kkq;pI'1|ik#jtgl(|@AI:<?GğBa/\ͿWG-;}~8oU]Tt|D kϡ'7J?{xFeVzH?oW?rx=%Xg(ṋGGx!sAKSbr\_e|LS$-5_`bxgu!?.߸ 
ߔ
~H/%~nȫ_xIG:~ViyQ~>+wKy<am{UHYTy}Vȧ̀SIr#2iN>`RaX"la[-Oѿ޷w,sJ+ҽWh"aן0&-
<TE!(
pGTTEF7$Ϣ:5zBJ'?N
)u~*+rQs&ߌk5kOik̙
XmJ_yZkڇy:ڋާmB>)֏n=_e_4^3׿B#&Y<BC>ӚwG^Ok	Y 'b_@"LJ_kpa|`I|ZrO	6%_obѩ,ZwZa[8?yOyig/(V;j.ZGq.d"|-Q
c~8	ER>gvǛpחz3'P<_r>~'`W?eh駋T)rfn*UO?jc/%>ec|`Y[IfTq|:Y?QgzQ_QT4U}(H}`U[g|}SٟWPE:d+WwZ+%ه~*^	[댿ŏ?j@UU/W_ߩ*]a
7?:ad;
o	a*.#9<?j?
7*5?
B]`nnN1~xr`&?:ۗ=|Lۏ!x+3~j{='
y1qC^>?a%)O
J'dbi
?ÆGIO!2 ·~!S6!?Ӟ,TbBcBZaa[%=vkNO{N
(N'V=ޡ{'P~?wW/~ND{%kýNl@§Yvl㕤3U(yP}m}?:a9ߩC?`f}}~4>Sen%GK;1_>K|!o,e!?ylWxS)sdeG&<~	%>%oo(oVr&kus8uzux~
6srοg\뿐?t'>Ͽ?P$70+e+_FCU?fmy˾V'u/Ϛ>
T"
}G(*>(">jřxUn)hU7z38*P'>Yw,P/1
Aɀp#GC~ڃs%}?IVEwuG3eOPnUO}ڰ@̻G>V3Qʫϲךr>\Vux=(3Azhc?ROYz2ľ)_=}^?ϟy؃w_Je?9ʿ|
%
hʹz1_*'Udm~U_5)o?)g1_jea^7UVa$5?ao/o?Ǖ(C7
g/K8kiI_O{~yl
	ptM^տջӏa>$%|U%I:CAO-߆/!6[!ic}|+ݳ	KP|
Olf	snb?xSXoj{xZVt‚o(zh*-pXǒ*wK췎3࿌m6[Ͼ6_?!˒nb5[J?%sďog_2!e,Uw//OοˆOs]ާELȾ__5ҿrSB>w\]MCJѯ4}||)	c57m_ǩ#ίa`:a_f{K?qe_zGB%Zh?IO' /
NSԯh-6Vt3תj_B+^Z:MWJ-ĭoU>;|;V%>3|'	ux6AoI7zwL/kzϪӆ|UY(7-2Wi_r>U*~qW|LhƅKU?S/]kǿ]l+3oyi_? mmiah'>gțߢi
ʿ6F͟i6̟ϔCEd~]篰㿰+g>hPsV
߫W9tQ(ȡdYᳬu
^t3wE>M1M@NUCWX;la_$
п8]TIWZQxKŸƢB0,
cG{ˮb0An{U‡ ?U+t?{Gc;n^
҂%VIyx_r~ƌɈ7/"+~ِψo_ZtcdPS
o1|c0Kf3oǔ$)]y`>/a %UݼRBp|ΐ%~Nx{Wo>S]pVLV}xI3UѕV*'MoY_xAvJiJ‡1;QPL16:!@wW?ջc-1XA'{%c;X/eXSQ/x|+AC|+oìs:=Ah_)[
T}?+nFߓg{}ڼ˗cwA*	/C+Ưߐ?c
z󭀍;c89O?Kjt!ٗ-7}qL1ߔo9οFv^CO7o9FG(R/_퟿>Sz@O}W(fG1	P>>Kqi gCO¯	ljc{D&3"B1`(߆-0~np6X<i\8(>!oVxͷ#k/|ԏx[w6x	y hx,Vb?:fvމޚ7,+0GǬpݏu`?Y^Is^ab6/ѐ`gh6?oțڗ
{4~ykUyF)o=&>/q=Km9̄'8xᱥUuO"*)K[g;Ɛ?E[`o`,b;__ZOjY8$I|&+M.޶谟	|qsQ*jHE(ǵH(l\DZd5uۄC
$@B.BX柋^Ca5U#w?'\0~ySV? ^}īƯAWb3s_,4_27o6ľ0yahk80Zo1Ϳo
5+xva=O_9#?41g?*+4~]<Jh	eOY[.ˁߐ
CBNeCJX3:g
y3"ff݀m!j|9/]rA~nכGIO}Kl㕴c?aXv](Uua+_#ke^aS'^0	7x]D/^gR'"~fe__ٗ
@Kl~Fϓ~Cs)ݠ0_sqůg_5߹c_,`28	qfhQO+B18%вP#i!?H_
pn߳myCc!bn
o,Զ
ubaEWPG-l۴S
^K|,u-Jk1\;P-7`"~H&āCP;|+x5C:Rr^DŽ,ُ
)s'-'k?a˗#)O=#d?a
{F_6$fg7;-~D(5_*o~83⇅GG?N;^cO.Æoge_#7'Wװ
m^
S-C@nio!9K~X:;
KX=bYCr1$(_R1i6奿xӀqo+(	e!siœ)Vއ5gQ!?GcʓuQ.ae^v<1Tӆӆxͽ{ǾZ㌟}ah?)?uL͔_mICge_OiP훎??śΟ!?nqogoLy|c{
Rt
Ƈ\@ьRKZvxi'-R-p,cIu DFK*a[
?Z,?;n\;X{K-{2"v'cnaa8	IHaG7%!-0MS¹3MF7dvO7K&LS$%*0ZD,oo9ȿ6^5C`7W)~qYנFFy'~U3'&

$c	V$җ?O?>?;	/}pݐWbȧqY,rHm<K?/%r@B7^vyRo`b~ܿɾHL7W:<-%F.	O0J
-?y3.RZzg>CY	x,1p*n=hΨu#
vpDN|Ï&P@:>~ᔆ{~4DtV<yN䘤VzsWxe\L?0_-,~h6qVm>^[8yF#_0Ur&W$ޱyjR߷O	#nO$eRxҶW5j|`,7O6}!g4Ijk>0yh4h
SS
sܾ)~J?<_%ﱎ+|._	-~n<3c?n_	 	.(>(ڑW-YG,:x-lag^d!%&ϊ}XDV^U8nxpF7R(y'f4}>w	cya?*q">ڪbIx1?B
.ݏ1~0ͣ)E0~&|_)_6ݏIC~p&?i?{)SͿhoØ(c\-0_ Y{!/_dXG%<˟~ˆ'x	y'~%;?f|U	(/sodA"a%|D
Eg3&0s~о$~8oÈB{·
o\guĦ=$֏ >]$)Dp
>#d)XǏV#/AȣYëO$TC4,?>~0.?Xmfʅ@ɟi!waP}H:ydan߶*("fCK%7D" #xoW(21/_zp	ڔ:U}])q%Kk~Ynw?Zy_	(X]3}NZ?}__0K1S`ϟNe_$$+OwsQhپ/?MI݆w7>O5)Z
柔do0~4㿖T5?y,/c%?6/
ڗGxim࿔2pu3ܼ?@h'o
jBo-la[_/zU#w3~ҙ,~j55Z~$}!s/aSt!ѭ7'+gs`h~L2>!$/oMٗ+ys-_ jSaݿƫ?msIÔn.-RvU?H,qQLo/_?I:㓆gzxC]OX&uW7I&+fQ ʓg|QyqPx_'^kT.Mͮ/03gyxW>|-~{|g-O.&x
Boe?-(V<fe{uǛ?[lGXil9Ï}K0]41|I~eoO_-d]{?~-Ym8ϳ䞵C>Qyu
/3n=c?)`Gk4?_'(y|Nl?ϡ?^>o`kh=C.Gk)(\X}7R-~S*+?.OPm߮겯w0}|\`F/UE]Uqְ׋0Y5֏_+~'oLx<?͓g	GU|ʝ<RϬ|Rë꫖+OuOs^PРzdW3T'QIT'Y4%'>4:~}Ili_eOټU=W[} {}IGoܣM,I!!h*1-la[X_<<e`Ea>FF7SGb!"T"Ͼ/%} J ydQo)Dܬ5&Z`OjzRĀߺXj3ѲA߯i?<>\D*N1fo/ۿoEW&X__d<_Jǿ2~9z6Dm:R__?$~^xϟ#?Op=A??+WJ|^s&_pZss`e|qs3?Eb"ŏ꓿Qg~,ǢO#i_r1vx%>i~_{;~# 4MH/!?``k_?_eQaէӞ+֏,ٿyE3/VQtʁ~O+<m?YK"{?rUnYaͿAʭ(yw%ϰo柪V<G[b_cEe$Hw-r$E,"+E0	O$sZy-G>k}[,.R.{i	߮øf?[6?} 1y^?ZT+w__'E&RoYa
ljSa|f2֏J\w0+#<1*fXs,~|-|
uLĮUcgovU]!z>o,Rsaa**0+C_5,y񡕧am.lzV,+~~Y&?I"!Le[ꯛ87:|yW82%?N"PP<[Ui^`>RW^?Wc/sU/5~{W>A ~=&޽Rob{vŗvZ'ݧoa5bbԇ0@cϫgOL?H=4knOP{+^C/r•7~N_`'o1PP{MQ.WAO"y|?֏E
_V'>#4-ISзS?WZgMo_5.œ}]N|3挋Bn'+~ZM]K
axx^g?3<ëOoQ?OJo;&i<{Lu{8la[-la[}Vm,G!XߞW
폘l|*ۈ'WB~
i%qKD>DCDo>I|!Ksv9d{m?9CB^ٿxuB3.3
M`6oާ]i?2[*gšwWG3cc)1oE|1"B~<
f}/Y{l'}ů,|=!ꊠaa֯i?jNVQYSm5N!A~#q7ʱ.oړG4_Ǘ6>驪l԰[go@kXjJxDi}wWUO'p
bsJ~Uy~>
>qr\#".2/_b.;^//(=ُ
X|xȊ\uhٟ@Z[WiY|‡=m7"yD)~9?[HgW	5瑿ݶ*c<o{
rD
**Lm'6dߕīm^y?VWWZ_^,~j-@g^CW|āmէ]</T~f 
R'_ccܱcQV_?;G`6[Wȗ~r?;ǻ+ҿCub5Gi1kzCΑ!&OYm{(G̓2>6ESr>~$B=BZ?=kh{>aC'/{RB??g]e`w<-_{eݷp^Na8M1˼F/w~9[!#+[CS3C?ǹt?:1n~JC|;i󘋿sv<Ú_@KTXx摕6?чؚB;-̾x6ae~w1Kf	O0Eu 9XȨ7B'!>\4⇎}Rx]O-la[-la[Ϫ6^u$ZI_KEɽOJd6?G4um"OQrѭoP*'OȎ3$7㗦֫i,Vִ'~L(exbM'o<9h?:I ~NP@/FswKve]' ~O{Bo2bϹb6?²O‡mgYQR-'\uY[xa)sg퉽jO?Q[4S3>xxۇ=M/uߊǶ#<]7+5rx?;rQ]Q4^e2$A?YWk~\&eۯ^_gq/P?>~/Xq1&/QG}rxW?o[<^<s|ڵ~rlT+fݪ558	+xwϿy᭏J~׏d>Zŏ_Ͼt)~_?+'ȭSS?ԧ~m0]k<V[oCOp~+Z*cXk_#·IQZ?T%m9q")4ڏL{5Żqg@pt,V(~gO~5byv>f.ϿS/wS\&󌏿.:oxS F+ш)6{4~<.?O7aΨcD
	
kڀoi%q=I)~$v?^<Sa=K{`kK[yOzB%oIgӰ7l	ч-lG*"IENDB`PNG


IHDR
pBIDATxx]řlʒlcB]J @bp+†l
KMv	ŁlBYYB`cp@6BQztU9Ͻw(Žg7syߙҬ6Xu{=[
֤~	*a1X
v酵^}@6쏰6X%X'vv6ӪL]C'nu/֧5,l@)kaVkz[]	υݩwφ7)&?M]_)?bnʟsk	/PTN\a_b?K1Rc),؆yqiK,?`1K[-_mOd[_?Ǣ[
}&SN:B
}:%TVj=ݚOh7Z-Q}}vfx%>M~
LSƿv a<l;c`4=X>Ee<M?׏~bz?@SkH=HÙ=]hQcMv'_
aL SjEjݷX]m--tT7I+}PEzgΜ9s̙3gΜ9s̙3gΜ9st-8Bt	,'w$zƂ|
vP[_Rq+zG_j?_yvd?-Wȥ=}`yCrl3=?)//huuubpppt```3QWWN#*޳g755

7G\2Céi,444l|9~LMMoM$ft8xiQxOOO?ߢ`7&U~VDa+#ȨWvC'h46͐B(K1/ill|c/5kqfsIf^
v֤ސ?נݯGM27O?^"{ِ?+{i%5Opߴuuu%~;Qy6Oly߰s;#2?A֣풵)CC0N6䟯>Y,c0,!?]=dozȒq&E)F5LÇ,g~a)oLQ$*4,'49TNoKQI<WR/V?'nz"M/6v?埪៮΂ѱ+Ђ4?ה?ˠs27ςz)^fRu:^oJh_w7?mIQ%i2gS|g߇!O͛18&͆1uttQYY%I&}G'T
---UTTdϱM"
>/6݆=2xds{Azo~
	 
pMCξ+0ʠOnt
ڿ>~fX7L?|\ܬlloo_
:矑݅C~~mN~Z؅z~owuuD>ϗ#\?bui?֟@_GY"vi;-M_o4Y]]MO͞={
Ke/ijEn7I/A4}f3gΜ9s̙3gΜ9s̙3g-{9T_Yz|]%Td,#$ZȲ(//_/ZZQQqמ={6hO3nzT*++˪_Ռ=Hf06ot'Q-|/[gȟUH5Wmhhx?ҿXݰW$~׾vO}%]SQ
yy乵gf?ٽhC/ag}}}ǑIg	M_U}mprq]["w#T	p&D"BHJz*!7$4"H.~;\t8Ssz|V}JEÛ644T422R
VcE>:H(X~Tě( _[phpOFC=
XMOavw*))`w,:)ᚅ^KKU+vEgUۥ>	P7ޔG&K;s|.hwwK?\wעvw*HDN<`bo@bQA*Lg؝fԽZ`r>{1}ſ 0H>+C<	N(gQUךc]XgfPz?=ۺgQQz
8:8/!v,-ko[oY7uׄ6X~vnyӄgޔq</9w#s,s9Л<$jnX&lވ?aƷ%f]þ1	f]ϰ<!NSuO~&߄݌cn<a~#gg$>?s3PA{(ɃGa^"( |4SD*tui_v32O?iOcW0d(]kx|F׌4lcA
a?5A3,\f]oLai{'j୽?:0xn/<k,?׏zsd	_1uA[N	pH$r xn|u0xU=BϹ,=O%!m~02xX̙3gΜ9s̙3gΜ9s悐ZݱAD")07XD[}06Z&c˿gϞeeezx77
"b}PUUz jjjj[[[[ki gW|tvvԈ5(5 #Lxne*N#~"6p4'u7Y'~b3շw{+~;6nO7~_ǁ탃&+8P;$~ů?۸A_y7_={Аivn?7e7n얁iw(Awg0_fet,[y>*O7鴤k<=:guv8e>*ЯBC~IoT~~)r6]3@?t@SO珀^?ϴ1Ȣ?ӣ&
7:|Q#ϼq'Dşh4ߚJzǵz_)6:
y4ׅsp,t"Lt8K,?^xtЩ~Cy̿0=Msq$<90b<Ls7P%i3_F3:6Auo
&;ӫ4DWj?th%~s'ZD٨_܄kw1`Jg(.!G]O"t^Cv{Rou|-^"
?K44~:~ G|VA<UMoǵ?ޫMuP0`?ί7ԛO ~.a\	
		&579?!As_*.)Su2%;x1ק?iOJ?^?M dܬſ9cf-{ZkOȟs4sNơ?#IӬU寡O_C}ZJLϰ֓F0TkSԧ寡ߚfO+0\x"Ukw⯩Ɵ>AR(oom?װNگD"YAH'~b|W
g@F(mvW_1RM?0$<('_c>c|z}fsZZZ1<1'1aKc,={fP_ǜdc%]i?([8юphr̙3gΜ9s̙3gΜS|T~;)
j7cY`9bSUUÆ\yA4UWW絛$3uuu---(獍
76D~/ss!X,ƵྒྷS?~@w


iKDЯwmUVVTk~]Enר5zcWW8SںJc1O}[[QD0zO$~S/_	ǯxw_3_םҋ"KO"'	SIpt+U$Hgg"~^!Я"!љ^(П'$Gc$]?ҿȦ===pWZВJK-/%+,_`E׆Q:`>Jۿ>U7ܗQ4mt'A7it\J|yJ(?ab5;w6wϤݲ
l&''.S%h?_>?;ޅ"|gR2}=&VKu=?׀o<W~Fsa{^Sn㧫I[$}?C-=2I3
YTY)
|]	<h`4_ҏAWl;ԫM@]Rv_e7K 5Hsrv?ߠjP~W:_TG/5kC_K!T\ӼF
3,QQf3^9*.2<9
!M?a?D	M߯2M`|d?dވވވވވ1#!f?ČsҒWZ_h%,_aK+p{7گ]2_Ժ~P_oߧ՘[&/_HIop.{?Fw [@}CCf]Ug_j_agވdWg\YYy<g~\SXޙ3gΜ9s̙3gijjP8z-7x9<B=7y@H٤6N1s~9OӁ"=k$1Ͽv@<GюO
'CF,]bv~uuu-OnllM?$!pEE
ǡ_ŵ:_-ЯUAfW+j^?^SSc?{~O8hY(X>~_,,#8*ae,o82'-˿Ζ~8?%\+OP~_':t5)W~D~݇?Oo8Oxf-~䃧e܏>㴜|;A:/Azf?r8O3
QKPc~=xE__ēo/Q_ǠwkHD"q
#no#2a3n/x=
u꿍/VhQoD[>wѣ`RƯ˵âd:{?3ҳ9jm5M?c-o9hؗܦ˟}l:Íh~50>Cm|&;;?o0l%ݖXҒmou۸d|sN+FKs^%Կ_ߎw~+ƙlsuuu/ק88lϞ=J{[ZQQkPg_%OtzۓC3gΜ9swU(-|9Q6X,OU\niU$`_
[0`H[)87ssibnQzvOSD$`gGGODզ&c=q(uf忊:GCߧ2}[a?ˎt aeD%JS$JߌH@w	
Gy r%'ZϷo;c¿&ZK-*!e^=~U
-WLς~'@ }5l\gMPG,&g<As-1Oϣ}Oimm=mΡ:hgD"S0v'E.qxpCz/G>n8N*=2<<6e&{.Ha';ц\`gCg2z-wF}P__&г(G{ї<Im"7l{B~JB~
H?nΒXȿƒT_;;	c%'Xcuk-!#,Yϵl9?ےeϱkY򧾬k>-O'}?o?et^*xLՖ&K=_&W4
8]__.؟"pf\YYٖN8#wwZީ_\*?3gΜ9s6>,[O9n;D!Ixzz}EK;}XgN71MUUUo=o@#<-!(о$џ	h$ļAÍoyu5ܴFY%*)ߘ$œktppSn~	ǜ?p_X/S~+}O<Ϸ6܃:;c?ϒ%<Kys-Oy(TֵLw


M苔8$XD`:
@z
L =l'ϵ?w-?؂_L/V{,Zc>Fo0=K/M߁%7
ǐ1ϲKjjjL
էvttҒ''OpR&JܹI;
 " 0nRjGl`wɂ6'fvK,lnRX~|$9v`>7gvIN}'гkяOgy'vb8<im/EV YA8Cg݄AW(s8E=xr;bcEB]j7"!!GfZOÏ
?9[_hɿww%ĝ%BKX/lIۦM
?3wg6,B{ppP>TT7SX
y(HS:@+_V"Ro,NK


/¦	֏,8CwϪ`FN~$Μ9s6-ϲ˷賳g@T_TEc|I7`|,s_ZUU%qdrƜ=ZaW1f<g{7L]c~$E`75))FG0foNjP:.*RzΝ_v&xw069;q;-Z/?U\ALTwA?ER|%+b@g
@d@?Sp,
)}%NK;}o{=}?_vA4h^D/7$ٖ9#MO .}6_7Kυ~QwwҎc䎫


]?Yr<<>fd$Tg%;[}ܪ<@J<
^h4:5IXNC[~p|0HJEc"-,\x@?/0	0c"98YЏwaA\ cPzة_s1VbcW9?WەPȿK_'9Z/r33%g1C9dW~Ɔ?6?z`ݙ
;?ݒ%2sW5n>-￙[~H%fA300H-bđ/#7#d#[>fGl:_R{	JְǻLt<T@wཻC}wR;zqCDrCCͬ}?.|뷡!3p
Rn *	 b=;x6	>I:Cx_DDZ7>
=bvH7dɹá6P?-[0[.b>?_ƿݒ0wYߐq~o|nD~X2P5BRUf@<W;8N
:^렟 '
~@/L/)2KK-{-7	yoCm@.	ӟ4z8e``໰|I]
 
bYcG"!H4X]C-0ƽ09s6&AWI^{Za{&ygg o4:3Ͼx1I>T"sp<tvvJa;t<89{pp!~)pXJ2#0`=ߠ	鯇Q!^-)V?>*W*3%Z7*BaQ倶Xs[*נ%)!/}aoV	w(ȿD{/cK?C1
mSoßz3dž?ߝg6k?ϒ?q_}߆?׏lOƆ$?*F_oPb.GodkaYww2V0\"\CW+RK2~]MM/WVVS]]}pퟧ;R#Xs-y`1o4F$
;~B`g	n].Գ>P9MBaw
^=@UUD%wbh4*ѳ-G-Jz<ZgT?:<<\ߐqz\!
|$'mE=Aǫat?(-ow~J8%ZaǿT:~_ePN?ZuzLl1?`%Χ#ж1&KCohsoM[qn0Cߋ7BgB_XkjjF_/!,>z{{'H=htb[[HχNCCC?9s̙\=ߡc	i1|	)	&O2,|3Zx5#Ȭ\I'bv<b@ŝ&IBy__߅GO%Sx*/bpӅ@v ߉yt4ڿa;7b[
?	"\BϹB=pCZ~T:NU(s
k9	TZ_k%:;?̊?̊?leVaVao%'-˿no]?

,_AOm?h@ `̯yc?:!k
!~>0`3`꿀v{
D@7	L㛡yPyAh%̿#UUUkԚ?{U3ߊˢM
vvuuѝb> fT[[;&1q?{WsckOO
~}=zkzC~[oX_lo%-R%',6}c1f9$bm	&~nU>'`.>}?*"A'vW	&}gFH߯_*(_B*wimm݆g |.677ߌ;M#pzvBۛu0%gΜ9s̙?Y4Ѥc):~0HKtKOljjJTq|4R~rD) 9K<fЁhh;\9#)C)r<OQ`.vp7ՏC	sA*C?U_oB?Ksp?%H;rMd~uOOOr7*O蹆\Cg\C%=<
kh\K깆6_%W
{ՖX?ߒq;_iBK+-/ܒ%8al?ϲdL,l1ģOT> Zņ?[+C`wysτRALyh'@勡˟<gϞTVVN,u\QQqOß׼tSSq*^?)mnn.FWUU-D"Vw[ZZZς՚Z=v
8Ԃ.ڶQyE}}_"ٯ_?hO_
]GGG1_2^O$!,C;W_3O1S7ޟ
~T-{;ք\KlWY?<0IwWҿز#?jW/=M|_i~/,Jceܒm;grb*E!dz?La_t\꟢i555O{*4}:X\UUuTM'|:nKwiίr48p7:
fIv!O. m_)uu̙3gΜ9s48qyt.´&qɝ\q\.dI碜s!M566Hc`0/nmm͕W

}cH$n(;?@%QFGG2LQݬNA[]_ߚ$(ЗBMiסBsHMkz;l>7'
cK-3EzW[_c|/Bʒ1w?0c̸ajIK4O)!*!5ݚFnH[4@e0nqRYYAzF3hb?h}sޠs1G?Ѡw;_o*
vVUUוxk
ۉ9k~moo]0c{O2ksF>2>[QF@>5/eusQ.^>{=B.~iBgR~i:g׮W3?릿QOQO>ӟ]=www!m/6H$2Fwi7]&=I߈?+`Ч>i	>n@=ŀJysuu{+3׷P$=!䯣O_G>Ϧ
{o?˒%,KY,g9W.ȿ߆qϯCL<˂Y’vK-IceA~?A²^
X_f/O3-	sl]ܥE?,_qO/8=j n%.A;Mz&'NoOq9P:s̙3gΜ9s̙8	(KxZR4a_NkkkSzѤzq=L: :	~c"k?E~roo
KQ7ixxxJ2MCX"4iԗ#@?	?A~Fww7_=ꪪ\C}1_
NpA7:B{q FFFb/q1ok}}$!_0Ge
Կ0Gc
5S_=T']m'7U'C;|[߆5,>86@>)-[B}Z|@O9a_($>YzY8͂?_NX_r51&h3Г40td,Vi%*iTT
:, "gR/Vqt{))tiU;ET!B՗&hUyB>a"E72xGȟ!}?ҟd__xIȽT?3={\r?\c[BŢ7?{ 86B`~c(ÉgX?444\CI=e}
N0(z]'X$3i<ɧ_wc>ŷ^1Cb]J_se

?
1.zAOsBtkxmLj?ᵅ>#>`ʟmʟv6f&_Y7Oߥ埇?m'т/[~k[/qI/e(O6
q&&&Tobaʟv[1>Ry}\?7ԛMgS?KE!Po߯_"ח{v2S\s/%=}guJ;!0~E7SO<o"ӷ&:X!?ӷrU=/<eRH'MI/%B!W7}2<5a?pHmj:f?k/IoK
uT5Ʀ!o~I?m!z<r/8ӷIq#H6O>H ;pA)Z3gΜ9s̙3gΜ9s̙g\⚐tM
lF%=z-
+//چ;Rn$ ʓcX7'sPySQ><z0]~з`g$zbփ埆dtttAsWGB?sW»nܕm3~3YjW2M+a+&zNxTOI[?Ny
U]߰I$RNiIysWN_ ?衯B P֡~}=}uw$q{Շ>a	dO>{0,OO?TQ|[8_FOgd!jiWf{ߌtm9(G3S񧽅֌tti.ݽ(?>.U-Ͽ_3QFJ?gr$Ն#6_b1g455MgplGYx;ƷA&~w_gg~pOOϔA?ۄ楸H?{qL
ɱp$/%~*F·4|QgMme
UmzLГ+YG>s}3YGW'2ɰ˟^Oh¿؀~?#g/l?G3~\-BC?K	ފ?)O
R-<R<[3o?|1__W_K+&)clяg$7b\@_	%yէ⯣OǟqiƧ}hʟv1K477KxѧI?n|	f?K|s=kO;RdgJ3OH?turRQ?QgoH?ȟcLӮvgHj߳~oA~Li.CпK83pmEi2tz#hɤGи{;̖?5tz!򧝆k35|0:ĐoU$?߰~=ǘs
'7IEc<$H?ϓ06Ŀ Wӳl	%ß~&I#ZZZz<̙3gΜ9s̙3gΜ9s̙&ҍS%KIȔN;kjjzXe1T;;;777OH}wwŒ2pAC%>00p9
?kxxry_4::z`w;
74TOÙ 8*588x)CZ;1+FFFK$75_d7ՃhCCC'ˊ*hoOD4iǪB<O[LڡIh_Rҿm0/*
Ɲ.%TjGPu	NנyYO',up3ǟN:^>;C?N
G:$::a-:}I?wmS>dv&U*.MhLeoR`?G8SPpepE0h#ZXݸ˿K[3)xZ:)woM76HWsҒ-Ͽ7A?`>A?~v~?[ȟe3gfeϮT'%gϔT'%g.>I</wY689~kR3wY_4dazUtKW~]9;^?glgl>UZ_?,?`1K[-W[wL3O66z_WS{^_MC=ͫ-|gl+\O1&*X.(qͺwt+}ү5%eo1~?_06kAYq/?
>+7o}Դ{\s
S.m5o?ʟ=fԤ	Pi>{g͠Y566<t#FOjQ?Mϯ	Ԓ>EA/`N/®OҟԘr!O-~=Oڐ?m>	A	m2#hG|+haQCHH_*/WӦWWW$	IL9a	o||GIxz_"5dc=@]O\/}l"TIENDB`PNG


IHDR[HtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:22AA15808C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:22AA157F8C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>UGaIDATxb?e,$ULXʙXb{oJeY@D?־{22gZW?|tp,m n<IQ|T>0nGQ+ήqZTaF03e+..CqW42W0F:v쥍b?(0}bbdx
?)
+(F #}-GěS`6VFF`bx),,s37N^켂8?`ç/em[)M JR<_&&v`1
Ys{K*R>f梍Wm<x>~G__?l}qT5%L8ISm68d_߀~Z״tjoX}-$ .lJo?srbQ9#Mj@3vSFPFg 'E	P0R;&.d~J+\icSK
@Aq?.uMQe]ʤIENDB`PNG


IHDR[HtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:22EE11B48C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:22EE11B38C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>QB<IDATxڼVmLSW--%MI[>JfL
~ 1qTvbUi4!I51v?&FM0J& BwRm$Oss}{_B5AJxl=~phjVf}ѥDuuu`A |Ma466i5ttNNt~k6K=g\h4<M,.`ȀEqTf2ԤW^v}s'}+ P|wo2&)<~"KjuYr<.Ӹ#mFgk~&Ѻa,%8b,lg0LeH+[:Nz|\\y6~\w<B(	ANHҢ>wMs!Fɳ7hl_⸈yb/S	#G6;sMUW  #l1ܵZPiQt*'J-&!5KB&t/!j=ds%a+R?z~f8)!48x$^zJK˪YLF	؝¥nMtEN&/(&á<;Sy/I?#&K@E-i~sLcI?e~yٖ,#cS,w͍ǜa-HAv '-WItTD iİn,0Q={WIk++JUcri*,_Lľvm߬B15emsgKy+LLfx<c&izATkk+F(߉\pÏEEEHn1*&p|IJ@ĀM.>x?/3v```򷵵z{{KJJjuUUb)@^0δD|a?mL%IENDB`PNG


IHDR[HtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:F77F11740720681188C6EF6CA6C3A639" xmpMM:DocumentID="xmp.did:231BC5F38C5C11DF8467E2A445C43106" xmpMM:InstanceID="xmp.iid:231BC5F28C5C11DF8467E2A445C43106" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FD7F117407206811871FF0D155D83D48" stRef:documentID="xmp.did:F77F11740720681188C6EF6CA6C3A639"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>ٖ
'IDATxڼV[LU32셅[ZB"-KJSML&dY/ҾkV_Lhbb{yeѴiڇDe.;32t[{ogv.7iFݫ'R8T\.^,d@Tp8v~eeYfh޴dUUQ,Ó[Ak@8^YyyyC p$IiŢ*keeN$4 ****NSy^eYBi(
-lKmmfQj
.)Q2.`p&)f#"X 6e*].:3ws/[x
{=eKjQ
S^Nٜ[S%':6}ٱˆdDQ6SG>*rJ5A,ƢՎRگ~:׻XlbbV}<ULiNU^h7Lkkǩ(׎ax5O!
1ax"Xlj3{KU=XV+#<X)d6x/0a
=A_/x=4i$cUsEV	3'0AfzசjKv,ɮhuV_1?_=ơ~mIfMC4>p|$Y
r#Nſǖg
*\#_"2b4P\J^b@K[[TRRdº#ɑ.-$ Dqܕ'`0Սƀh&}䇟-BDs*/T8T)K]ܸ΅C.?{TԌz0e^t5tc>V	UB۷{vc	(e;gr yT^&5!KA@vMoғp8~2;ƹqg/Hܱ1"m]W@>ڭH$BGWCF4773UUUfH"*
h4:FwI:9^
0Hg;JIENDB`PNG


IHDR;mGVIDAT8O1kQvf3d$DE`e(K;FFFZ[j€"duwgg7D<\=$سČ{|;0@(^	u]t]w'ɚ̦
oΠ^Xh`kaCݴ}IX5iϷ{42*K:yr$N[Țw@MLL
v[.,\{ދOQB./IQ@.$Q L`bQ}1\wm3KU@%Tn%TR<.-Ʊ(*BuTv	$1š*攉M&UTj5Ś
t>>':KN0j&.!Xfke cv_F y,EoٛnjkSf2*GX֦1@e`’QO:5`Кl\1c&.z!d/_}aD#tdMX9>i?Z3&ɾ~|uѓw&	ƛۛJlv8}/LR
I`	5`7Ʒ4}IENDB`PNG


IHDR;mG;IDAT8˥?kawwrbK4j@-FBZhc!XYX-SMQ0^͌Ż<3uf^k9ק,``f)a30STf+wC%Kzܟ?ܮu>IJdCU01sOC>Ͳl5wϪ:	17(99'8M*"8aTqe{Uu"巠j*"Bۥ(T59GV"@0TEN"T_
SFl6ә[ M}P Cᙛ_`kb;2lMc|zۑ!CL:+mb"iNorL\B=C=E1#6JfCHFYK;TLd(8"
B0܅}Q̴ܸywv<SEAQ0*9yާ={gZ83s.[[}TIYr'jmU8;DR.]]=zgf)0N8BrkX>vIENDB`PNG


IHDR;mGIDAT8˥kU33f&42V-.&].4P(Vwnu.\(ۍB*]*#H,S-R!4xgy?9.iܸ(xr<<y5=w9c86V'-[
`UUtRba\lZ3=:1e	&@pA9T7{+Brzep%("QT(y^=BPݽ1JIU{ED#*Gf#i.pw}@{0ꬠȨjS2$n^;E|r!RbUT}a^<	G|FMe5<3dIͭi;E`0>qwd
z_U0cE/HWX^M-Sscm+g0gfVĊ("=c*W>֝KXFsmdjAD?DU}m.gkt|AcL)Ud{’c?]??TfJ}#t^o~kD8@}ĸxУ檁(
Tq2!*x?ڛxae1I'IbǡW|0'ͅAL!,U5+7\G֝*
^To:猪@xx{/Ď66pYDIENDB`PNG


IHDRRWIDATc?åbF@	kH$aֱ/ž{5[$'~׫?WgE^Ak@:|$9 q2/A:@o
@^u$^]"vl'ԵPWn qDI}Ab_IENDB`PNG


IHDRRWIDATc?þ >?H$}~|[C@^l
gQ	`K ɟ `>gH'D)9B t4DNkAw5
IENDB`PNG


IHDR;֕JtEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh" xmpMM:InstanceID="xmp.iid:69B31D65A3F711DFAC9FD038E3F1BB0B" xmpMM:DocumentID="xmp.did:69B31D66A3F711DFAC9FD038E3F1BB0B"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:69B31D63A3F711DFAC9FD038E3F1BB0B" stRef:documentID="xmp.did:69B31D64A3F711DFAC9FD038E3F1BB0B"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>]C"IDATxDS=hAfATB@*,,,lTVv6bkM҉`P* DS73o|fnnvwޞYYޤцukY!E{ٙmrD;`8dƸXc5M$
fx7!ʲI>`4B̾D]oalD#3Evr*%pwn]t,?r~JD
;֔M{uUO.ԅtfca'W+2xW7<΃gN	
i.h9~[E(P
H<hg<| ~c*=H}H>;HRqmks˸M^mi$ۆPU%p7ۚ(LD[˘J[VdieXOF<Njlsw_Ep7.U|虗}cJBF5?2f"e݉ӗ>YcGъo|Rf˨J~W
IENDB`PNG


IHDR\.&IDAT8ݕjAv\*ry:J b.\4I@E@a8F=U.j~cf@Ă*==t\K^g^+be)"S<٢"3xD*SmBRg֕n\A'T!6* zXd&Vrܕ(IQEHJө7w͵[?x<ti]=\A@n &[BI棚)YHM)l[Iҏf:UCJI
Ё-3i﬉ta  0`Kғ`"
z2<^O890OKkyzܻ겙T): 냮ݧ1g37)
zHuw)D؀1)Gd2JN>!AIcgg#@QC8_QD:{Ȏ`x[p`TI4tAG"n3?)`3IENDB`PNG


IHDRDDqsRGBgAMAa	pHYsod	IDAThC홉WS֪<O=()
b]q"jN 	;	a	AMXA	ȚDEVIH$M R\HI}=9;3w>fN>#/0g?Ql(Wd3b	h~I&):
3a7*#*+ūx"x,3A`e
CQ~ݵm*X|XRI0o%竾=
|j+Fo
;̪T=XnU`qy]mX/y9\eKWc>E	܎5نy	#m\kt$P)^)C]\<秕gG[Pӧy@T7==ruP- ,ycS/s	[)YZsux^.[&BdG[sst7 8a";40\08Vnl5Zg>?W+['sΆ39cg
,]t[1F
0FLyX]yFqP2:%xazzs4wX)[|Ss-d00c6͝#=csR`PDJ^/f5M#Uaz"WJVY!^h=tT̵0pm(8z򆾵5tGS`drElV7R$ym	Ʀ慄S}+ۂ̲ &rR30"oŒJ,LNqy=&Ffn^Ye횆!1A.0~8<0d֞2'1=5CJAY`~`€0KҐV	’3
Ek;!]Q̉L0$r]bx%M[|S!aWmR1DlAJe䵮JkfbHȭ=eNd`)DM%9bE!eR/;@fx㣞gydpdxaU3(PhB~RΌ>GC/PWSe!%+f
fw'}9.uKۓ
Xk$&xVzB+muDBJ|iFH2'$aT^D~_,H3<)WAES<c~3brA;r$P%t~<iu,]gIJn!ZsT須
)h)V>є@'rKDrf[XCMB$Pi_(T*s˻铥%Qk
3&QzŠ7yǁ0'r!NYqD
!UQ8p&I~k
Z|=(/0ـr,1I;'|2v5(3v	|zא|KW+{^}3r	"$$D|@NmcյHw^e72Hxx|˹Ϥ=QB̈<onjU۽$ەX"aII!Pah
F`t3|	\^uPW)
-&]NUpdD7#qwg?Qe0V]0g76epzvE.6RniE)Oo^*D@Sv4^յ}ز$q%B|!`Eso1~+ytH00521?>|pw/j1&v-xSǸ#ԇlȖjeub̀
%$SA`Xؚĺu$A1qqǀ$id63;iWdaXS'4tս?i)O,ۓ;|];<cv!w\!h[s7˫+$9P&za譊tK!Qߜ:t*&bڕ”VI`aTuˡۨ"gl[$hH'|:;fzrTuwai'X+UZ9{۫˿VC5=46)V;љY.*4&&(xMK=3f.s|'8/Z=
{7̹KsA'q`o/][G$Sw	
+^ZY7dMIDa}:gEe	s۹ҧ9J%R3bYEOrJBNq&4tF/`**l;OPY6DS\%k{NIAmфS8l ӗVH4Yv4'h٦R;^ &8"-Gdg7RlHn璠^|Z`jkX80)z&g$R?hv+:o7WkGoÌ[0-#2z''IENDB`PNG


IHDRDDqsRGBgAMAa	pHYsod#IDAThCoTEM|!1J6H)FE#r`Ҁ[Pzaw[K۽_ZFs̹9y8;͜77-;(m ff`2-``]"aKBb~9RSQ%O
BF7DLRgy,I2!Lim"L`OE>_ٹU &hHs:L:[z/󨵔ΛPbZ:+/<`*zeѩlHT!{& Zj5eIRHfv[1Q&0o		ZʨO6{
B@rYTJx9dER2tS0Ko=HM#P*WSH
a A"|sId^kGTj6/KU2*;$c8ak۵WHDē˖#b:׬Z%6%;̉JbC"@Cdsâ2$<5ǻ8Mh(!v]OIti
31{$ޱJmǷf0r,$Zo-ӗ$$j^QM,<$قy{	=e%1$0|a}z}ɭ>xWNDf.^ၗ\p_q!>`	fz|N_.ZTϣsr*Bq(e5LWOhԼgكG_61!~#%"VVe>fka#](jeRf
gf0̅KFX84xg:
\1&:qlMsl24Մ爫.'x@X_3Z=MB
' Ld|4n?g"s8pb|HYW]'٢Y\?%<,!jy_3f0zBLt0-@Q̡cCF)<WjPqN\%9wu?BXP1{fT1#r(K.M׳(Ǩw#!Qr&8#Xe̗ԟ4ᗐ6zoI56tmP,,>0ぶm>
noF<WX:O4YޘOGUm#<ۿ)mwCh4;W6#ʣ>_H-.lB^^xf
,w`/̶e9^~ďjQIENDB`PNG


IHDRH7 tEXtSoftwareAdobe ImageReadyqe<IDAThzi%u9:ӳ3\F.F-!Ee$
aDl@؊@` V@Y
ɐ7qYzfz_w{9QR(T
lE$Y\\4^kdMw7~7/./,|/qF@Vn,?%lAk|@n<^yE,`zT"iѸxqVp)TpdhxS$Kӏ=>-/{:D@?@*;F,Uk@(`
17vu{*^xPg8'?v~*u\ZZ?)ϷFsCh-X-,pco8ZFMdϜq/whHy>! 0[kf^}ͼގD߁sx}Xk;^o֪x0ml4?Rr&8p%,SJC@Ϟ>jVh$̓8m9S*W&
`n|Cɏ~{v	@@neߒ}9Ík38[7+GeM3?uz$uz]0>Dy?qvvW^|aW6ֻql00+T8qU,w>s@0>vZKWBͭ;Q?-9|ewsKYfO?k`3g/~05\wgkZ~TmIl(~_y+2TOc 
/btTZl@x+v	Ofg;ڴy4'S
 "BVWwh+<w,ѡ˗ݵ5`K_Jqxōgά~XT,bQNJVjתH\=qm.^.7K-/r]XOvd'(!9=Vg^?w1#<cE‡,}K?h^o<q]rb}ȱ|H"vq>NJX*nGG33eȈ~{ӟQn`x-]OZ٭<G
s\pO幉<Iollʕٯh6~ꕫsj{k.hkVOUwx]NVBjX+ĥ!VNݣ-8=~ܾ5\7cnىn+	FɦO.RѫpѓϿV1qFBkӹZ[=)KS'kWWkvᅸ2GLwsRN3
ۛuqI/Z4&&r_}$X,Yh[ɵ`46-ÉKJźMݴyn*y4tg^N<[,+DGxymub?(#_(]x{NՋ$ʳ2*PUz{&&ړw/NNvݔ KUם2رdk+X_rxﲘtݕx-$;h#r"b
]D9h'jsOzȜ%
Y}Ň
Ew̞q/`Njtnz[#WXa@w<UA,$vS3sIN‹jOP|O9lIf7t67ZQFYӈep,

0$Izٵ;y+>{{r	jR[磹3/Z?G"y8
@DT+8.0Af>pӘ߮NA!
ԇ%RucIR0(,MӃl?6gKSK.f!+@DX$?[5H'wG;EݗWɂvZR|ڊQX@jY+{o}Zn9R;hzIB"^Q{:~Xue#FzNL\EY2(faBfC<_|㯦&S{ťW{fJK;+^
#*X`ࡧ	Y$(AtX^4njM̈ʊ MKaXunaיsnlI8V?H,0`rKV
[8E.umvz*W46V6MSqݒCE.*ː8̠dC%E;tf-$yULv2kΡI:薗U"Ţ
XKBƣ7v$S^[<sǫv$ZrG\<s9
2l2FE26K{Ŷ-ÏҥՍͭf[u#2aQtI9a
nE۞0sX+`Er	X"R;aX
KW\kvzaX\!(X0LEt@
!*@e#Z}i~w}x̃,Hz7}׬N,VE3BÌM m$VĈ8bYZf"%qK,J$6/6Ē ,ʜظ~cT[,I\ۙ;'i\[\\t7Ħ։|[x`(#b"J,ba+"p ̒8M=rZ $ԌHV_f4T%fYHdhDyhV.FahNgv)a#Rgoɕ#"
f7O.x@!t"%F(T^10[q^XXv3a͢d2qƈdhI3H3Ɍ#K&8KuP; f	"`!4@Ad!J,cl
@"TIe0$VIJhdЈ؜bL08d)QH4MffDlhJ8Jв2I&qim6f	&Iسnbد@"eZsQPlR0" kDGa1(EE0	2vP*N9:&$aHdU@@Z@L$Dچքl#Y(i݋-A9/Kr6},Mhqɳ‰5.!ւ#b *HbY,
	ecvy2qoֆ*O[x"fȢWEX$vYbf`NvuBϤDrKݐ\1IhZ-;>̚+2vYxwLίBT,*Tax0UAgIZ(&dӶetdtbF	q'N,Ķiݶc._w+K(;1xa[o
WqZL:FXE@a6Q(d0)%%Bˆ(2Mf#|h֧gU/`m'x&z. T8` ""m,6:6]jw;m9YVj':0,M7 M}'а!bqP4"arH@KzxVwztZƷm8/sROypL6 !* D1'l#1t.zD;"tXe-"wk7V3aDl=dD-F5F$Ų@b:ݬRqRGOaֆnY֜xu`_NuX9@
mZ[eөΥRwuw[pLR(W-3VgDzԠksGTP1*BŢT	Q!h`@xƖtW{'_~MTirdwLJĘ*r4iO9k2Im-^mF]'lJCAR<~Ul"oЇ 84:DTKUr{FR(
Y1@7mQZ>?3w6[m$,4dfŝ2au*Yy@JEĢɊk˒At
2) UU6GNq%J_Di+湙D亮U~+fj5;P@By	YHv3\<Qſp.^mkf)lY݋׌W!Ù)Z@7nܤ$-tԪU@w~YpDʎʞqxc8#ط8^>4YֽZ]tʙeM'%"*@$kXp,w>m>OuOxյ=|gdEŽ-	p5$h RZ ~##IzN==%"0FEr}tuW#6uXZD3+P)A`B@P<%
hr/2~_]g.\ۼ)G#-$PBWn
ڌlyF!nVPO_cg<D	`){=tAe@[unGUlÃWPL$cΘ39cI3rƒZIS	sjي$sIjL1p/}7#w;R2)g:Te.TX@9ZkSo?HEDBafqV'0{n%عn:ttؔ		sD%!PpDզF|F=7ylat
Yf1ֲb>U$R

A\.W*D}OTE>BvhJ0"ORBE+ݝڑ`JR`F;	'}>OHi(F|N}/<bNWQG}c, (RQƊ4!ȧ?{Qk8IRx
xZcDT(zLFV6JfzAx[:-B@,KxDjv-z,/]<}ejhvf*+6LsSS*IDI/_PA=.fDZ T6RnpęSmL}U>O`,Q'k\8ۙҝӖTeWۂo$>Cr΀i7>pwy2yjjU/)M\r#AAa$ADE\"lb3[Y-^xn)kƞ\~spk7{6ց3le6I85/2WAA40%5"I8ju62z#n^Ζ/VRk	""D,-
<Zl|׿>\@,.--][m_׿2;'ˇO(/@KʼB*p2w-Pi
cFDRilllti}\)ly|8]#
}`>1 V,!ʺ7&C^@0zݽ#_'|4\ɀcm2kv"1 6[C$#}~o$-׎N6jo3`~"$`l$`A+ D̮SPA.->OlFI@b8E0@4\!D0￳02ߔ+{(svlyj{
"1wYEhs^]]]tm~~w70mDD D01 :?W]ܻٵ)	
`DT,'&&F6Q{u6E&-N>
1*\RHwitmym}gW` D0[>b ).bGZ}Tb۷Cx7<<<;5~xImmۆnZxq!WXb`Q"l./gS˓rn..]G?);	 0EAXIǃ"Ep,(bdmr	m/|1lGGJ㍸<y`!+Ռ&{r}GaCzɑ
Ċ
`sg` f2` %À;7F;2{ޒAڮҶͷ21!#	t 1ݛșЮon/^Z:wv_}Q">E<`Jnec<}F!6rMOOϖ>sH.[sdˉ)sj96fN|-uoN}_>2>ԃ8s髯`Zg00eP/C,EGm^[\ZXX;O.Ff~r+'WClExY\ʆEk`?'?~@Z??d
H7KE
B~EmcZ|`X(&''WoFͺսBez8`8>my;R*?~sHgx$l1<)K2_H2o	xLQesR\.=ΒBbW:Ry%WF0fj>`$WW~ĩ;
_ 3O6$䜇`acP&!JFxsJ(dfoz8~w8 NYm-:Ȱ_-8YDj@_ !qdu@Ab;91/k-':OD *޴TbcedѼ'	-Ogo?F@\T'
g~&crugrf]ہ-E@aJ~}_m7	+HVŖZȗ~;߁ٻ=/:tBVIENDB`PNG


IHDRH7 tEXtSoftwareAdobe ImageReadyqe<IDAThzY%q^9M=fCb'p3EsU@$EA"J!Z^[o2-GH(34)dA2Y{޻oߵ9釺q2񃿬JjX揯롥xGsY7E+䏲sDa)aoda'~ȃ<@;;kff\.+Wz*u<[^Y?va!$2J	5\j>33C*@yN^[7eqC[xPLϢor9CcLP@_	܊Li8WG&F{}R׌`$P =ķ
uFJ)T
D@fa&Bֺe+?շnoE"oCM ߵG\*8Wt\k)OSMc-e",;y2KQLnmfKZcL^/Wʥ0xnοgg~i  ²xM}Vq\Ռ1X#ybN#Ӌ?_:	xޚ]0>X̙(ի/m޺Nì"R:z{;yg\V~;}:ODəVȷbKRrYkK
ӈ )95}iuqew>'d@@賟-LN XYZzyf
`sryXZ*V "8ʲR[بڥ^j}
S>_Mz+iHGO=uBT,1bMKD
Uk+j{ꎓ6FG.ׯ+=p_(I歛z^QE]B*;ToUVgfZ##Ys?Yerrtf$cDzsN'7
Ak[b>44T(~4A!(QQ9*<ꩽ8J\yI>ps+Dq3I~'Kl*.f'WkFR)GqUtK(-//>b9~\
FF	ǽ/` 
ȂqZa6_'
4jY[*XY}}C6I;cc#.e_h/]>w߽*,kjh~
Ճ|36X1.Z6g{:-ޛZ^_9T
]\ۚ.r; o|]Ű.-w/Un8ڳ賯QLz(<y*6;ݿ?J䡡g+r}IeWV5ns18Ο].3g(K={r_~9 0
 jƈ*}pB4lkl

=mU
U}oO<USv0Ʌ>@wxdŗn&kũBP
5h	+#ӉҩS͉Žɓ3l5S=B5f
O7vuپ_Bbq4;pRM@D2H{C3OwvgxW(}pnP
WOC*贁F*(D&ԅ;`\jJ0CC<KKqFe[:cnf6Ҍ HfGN\??<ZYW.MZ{s<8<_
Zo`c*Uш"	2'@И@0fjuc7x;ߩ};P0q\Bĵzm|tr:^ϋ]eώrg_1[VQKPj
Q)
Q!hf9vy2_Ugqn$<tfqo\펱«78J,BCƀֈ ,V{+f77kryTZYJz˛VVV.nm]Ȳ0\TT
a(q}vad<6je^qGaF YX!3S6=Dmj/<w-E
RttlKHA#,EX11Ԁ
Y:4ZuQLh(ڨ}e_(>:&lڨ9Ǒ(ȬIg,+uNj66"gKJK3J=6kקpNsya%,$Йn?ƹsdaѫXjJ

F#,!5HثV+)KY7s}3[SehZOȺGIĬDBƛ++N<56:zwMήnm",B,BJUQC4^9&
0Fm:(4FBq9uF`=@'Q9ԣw|b/_<ťFS{h˲nu{YVY.ٙhc_vKg4"JU"BlugKWNa8  PAP
*@)4
Byu3q@([a{{K΍Ճk>{ͅ΍Ep3TYoԺ=nkwӞ#jeZ2䯒qޣgtժ1x#ĢYX!1+H(`T&iRVW@H!Hh硕R>,@` X% "lY`OQF꣥5khا1^[9%Y2tsuͥͅRtf
vXt#xzb ,LB]&Y*lcDE2cFyT2˖ sb=	1?"N u;uB}N b]a!fg+'_~sleYeiej͕,N9DZ^BfRB(D	Z0g2tRMA+XzL,#*OA$Y^b%]+=,MQ@.Jk}G1O==so+u[GC90ċPBZ^@$"
 K*3'620Jc2
FK0ZI,d2)SƔ&4vn`[˯"r9k=G<g'~"i\֦ۻs-IX<GHXRY<1
Jb53ǐ{4dAz

hP,<fNR+LL=ݲ^\'1YS)ɽ|ZZ,]/#9{ћ>(|솵8l5*B,QJ#Qq:C"Vܩ-]PAIiDȢ=Ih@@$CjE;COJvmuC)U.T"Bܐ0>R<@Ţ:ȫN%ʊY<cԈZ1˲`Jm./]xDqZv7'{fk㊯Mc\Ҁ"NK:Ԡ
xKuȷȵȶF1Y]]%miJM{F8=-D.>kYE,kGgy3ƆF"I)$
0x.EmUPXi2΄c֑YgLPŮKs.67ZM2T
wdWu
䍜W h$)Z_ָv;~c1(Y#D
=+tm:IR?<2>ru=5:~yz./As>p(V:DԠA<eNz-P6{V676B*"Z ]]vHf,*^܎K
`SJX ]TqO'O|fե[nƞJ6(.3Z!ڀ2HNluԾ	ͥBw|Z(W򩣅,R,聑EAaà܌wWwcրQhf@0 fr$ğ;٫˝Cn\%]ؘ,ʚW>S2ơM~j0)vʧCoFmkʺ:b5z:P!/)wеU!A@D{:n`5BKy
]캵M
?/|fc
K#2v%-[5+d"!(-Ȣ)!ظRX 6V#^kS@gϡll[9f(Mp՞`9JBA8֐gl8?yO_yp񐝪]lדdGC>,а
]/5EFq|ntKmd/C*`0?Fģht~],J@E#AfLUyˢQbeY"&
z3^l}vW.;R:d,:蓒X؈0AITAn]
;kʧH^@UZ	8Wޑ4IC>t	H{%=",\J+c(
20	hP[/pl@Ǐ~?y+7V8`hQQ	HHV͋AP
8RGNޱ7)4@X@AAD"T3bb9Ч_B$5Ͳ`>z^cxTv	 
02))E&DctRVt_wޗ2FJ/jˉ9W9X 3#32u5{DLyOpSSSRIaDT`˨QϊVç&Gj嵴}jbI*{Xs6:.r\(G}޻w~<M2y3'EK}[m`^EPD100+pΐTD`wGyB`,3BT<`K  Rj-]PIg;_|qzVKƆZim'q){~C'OK4/?Wt@v1eED,:ѪR_1ǃo) @`.*^}CVMƋ?zG?{CO\:[yY53=i;wu@!2jfr}<pBf"Fʝ
F=.mAɝ.k"V@$=|d,;T/X Tem`tǞbi;Dw*7]S6='?kքx^.K1{@ACTOrmpŨp¬XsXJ35a]cB$B ,(%`Z5DXZ3m#	Cscyoև+~	l}P DL{EgG˃n0 Ak5]2rLܕ3bɄwVqǡ,J"aQqn_~.A
g/^xSǾ/43o(/ySڿe`,vg(m
c|gF\!(b$Cy;K	D)Mq'0VnV?񱇾"6A(b[@/(	LăP>\m~q߯F bG53zxw:[r[P}Q1(`Ta8qmr*/~hˑ@ġ 	H8/`bA\!"~kHVR@͌D@{LT*E	㎭bߗWQJ]osɍ0@׮|~WMDx 
"A<˯<"a'vm8j2#1x88GƶW$X!`k~bxvɪl)
Yr~׉W/A<x$`aB#(8y⪾^i#AMId5!,eM읭q&%+ E.,ɅqFlx9?}ߧ?~"
x>Ap4i۫>Ȃ"KǔMbMW&''KZcvnȋ"A@ WۗNѭsjC<l7.	_~@Hģ8GQ#齫`$f f^:)\d"47<<.0q}3kP>BF%/ItsqN}-
r0M~`J2cq(How&uJWL@D$18;==6ͽyzBJ@1΍هT
t+W#wyXH
mlhC1q`#}wuыz٣tҡ̥据K3&a^5V@I.aqw;l킴}"ԗ<&sQy˔&ȯ޸z!1gίߜmjjjxԵJ'#{؀[JgT*?[<|j>.HLo
:A^4Ȼ{Bfan2UwH1A޹_{ݽP)eJX-
@^0a:0IncۋMH^P'[@,8;bgj`c;HnKGX4bYZ|SСãa&6%QMa8릔AjXr3յ0FȞw q -B;}x]}2[I!Ĭ-'MLHTm8jшe$p\1J.+񧺯]؉D]|-@wI0(y(V7w[ՙ]
yͤs+ߜ?6;;v*=REedYX*ؠjΒ_cO^y0->>O8&WQE ,@(B};rx'x`⊈`'i_*IYD0H['L)'=ݳ߶+mnW΄
IENDB`/*
 * Copyright (C) 2010 Google Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 *     * Redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above
 * copyright notice, this list of conditions and the following disclaimer
 * in the documentation and/or other materials provided with the
 * distribution.
 *     * Neither the name of Google Inc. nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

(function () {

var DebuggerScript = {};
DebuggerScript._breakpoints = {};

DebuggerScript.PauseOnExceptionsState = {
    DontPauseOnExceptions : 0,
    PauseOnAllExceptions : 1,
    PauseOnUncaughtExceptions: 2
};

DebuggerScript.ScriptWorldType = {
    MainWorld : 0,
    ExtensionsWorld : 1
};

DebuggerScript._pauseOnExceptionsState = DebuggerScript.PauseOnExceptionsState.DontPauseOnExceptions;
Debug.clearBreakOnException();
Debug.clearBreakOnUncaughtException();

DebuggerScript.getAfterCompileScript = function(eventData)
{
    return DebuggerScript._formatScript(eventData.script_.script_);
}

DebuggerScript.getScripts = function(contextData)
{
    var result = [];

    if (!contextData)
        return result;
    var comma = contextData.indexOf(",");
    if (comma === -1)
        return result;
    // Context data is a string in the following format:
    // ("page"|"injected")","<page id>
    var idSuffix = contextData.substring(comma); // including the comma

    var scripts = Debug.scripts();
    for (var i = 0; i < scripts.length; ++i) {
        var script = scripts[i];
        if (script.context_data && script.context_data.lastIndexOf(idSuffix) != -1)
            result.push(DebuggerScript._formatScript(script));
    }
    return result;
}

DebuggerScript._formatScript = function(script)
{
    var scriptWorldType = DebuggerScript.ScriptWorldType.MainWorld;
    if (script.context_data && script.context_data.indexOf("injected") == 0)
        scriptWorldType = DebuggerScript.ScriptWorldType.ExtensionsWorld;
    return {
        id: script.id,
        name: script.nameOrSourceURL(),
        source: script.source,
        lineOffset: DebuggerScript._v8ToWebkitLineNumber(script.line_offset),
        lineCount: script.lineCount(),
        scriptWorldType: scriptWorldType
    };
}

DebuggerScript.setBreakpoint = function(execState, args)
{
    args.lineNumber = DebuggerScript._webkitToV8LineNumber(args.lineNumber);
    var breakId = Debug.setScriptBreakPointById(args.scriptId, args.lineNumber, 0 /* column */, args.condition);
    if (!args.enabled)
        Debug.disableScriptBreakPoint(breakId);

    var locations = Debug.findBreakPointActualLocations(breakId);
    var actualLineNumber = locations.length ? locations[0].line : args.lineNumber;

    var key = args.scriptId + ":" + actualLineNumber;
    if (key in DebuggerScript._breakpoints) {
        // Remove old breakpoint.
        Debug.findBreakPoint(DebuggerScript._breakpoints[key], true);
    }
    DebuggerScript._breakpoints[key] = breakId;
    return DebuggerScript._v8ToWebkitLineNumber(actualLineNumber);
}

DebuggerScript.removeBreakpoint = function(execState, args)
{
    args.lineNumber = DebuggerScript._webkitToV8LineNumber(args.lineNumber);
    var key = args.scriptId + ":" + args.lineNumber;
    var breakId = DebuggerScript._breakpoints[key];
    if (breakId)
        Debug.findBreakPoint(breakId, true);
    delete DebuggerScript._breakpoints[key];
}

DebuggerScript.pauseOnExceptionsState = function()
{
    return DebuggerScript._pauseOnExceptionsState;
}

DebuggerScript.setPauseOnExceptionsState = function(newState)
{
    DebuggerScript._pauseOnExceptionsState = newState;

    if (DebuggerScript.PauseOnExceptionsState.PauseOnAllExceptions === newState)
        Debug.setBreakOnException();
    else
        Debug.clearBreakOnException();

    if (DebuggerScript.PauseOnExceptionsState.PauseOnUncaughtExceptions === newState)
        Debug.setBreakOnUncaughtException();
    else
        Debug.clearBreakOnUncaughtException();
}

DebuggerScript.currentCallFrame = function(execState, args)
{
    var frameCount = execState.frameCount();
    if (frameCount === 0)
        return undefined;
    
    var topFrame;
    for (var i = frameCount - 1; i >= 0; i--) {
        var frameMirror = execState.frame(i);
        topFrame = DebuggerScript._frameMirrorToJSCallFrame(frameMirror, topFrame);
    }
    return topFrame;
}

DebuggerScript.stepIntoStatement = function(execState)
{
    execState.prepareStep(Debug.StepAction.StepIn, 1);
}

DebuggerScript.stepOverStatement = function(execState)
{
    execState.prepareStep(Debug.StepAction.StepNext, 1);
}

DebuggerScript.stepOutOfFunction = function(execState)
{
    execState.prepareStep(Debug.StepAction.StepOut, 1);
}

DebuggerScript.editScriptSource = function(scriptId, newSource)
{
    var scripts = Debug.scripts();
    var scriptToEdit = null;
    for (var i = 0; i < scripts.length; i++) {
        if (scripts[i].id == scriptId) {
            scriptToEdit = scripts[i];
            break;
        }
    }
    if (!scriptToEdit)
        throw("Script not found");

    var changeLog = [];
    Debug.LiveEdit.SetScriptSource(scriptToEdit, newSource, false, changeLog);
    return scriptToEdit.source;
}

DebuggerScript.clearBreakpoints = function(execState, args)
{
    for (var key in DebuggerScript._breakpoints) {
        var breakId = DebuggerScript._breakpoints[key];
        Debug.findBreakPoint(breakId, true);
    }
    DebuggerScript._breakpoints = {};
}

DebuggerScript.setBreakpointsActivated = function(execState, args)
{
    Debug.debuggerFlags().breakPointsActive.setValue(args.enabled);
}

DebuggerScript._frameMirrorToJSCallFrame = function(frameMirror, callerFrame)
{
    // Get function name.
    var func;
    try {
        func = frameMirror.func();
    } catch(e) {
    }
    var functionName;
    if (func)
        functionName = func.name() || func.inferredName();
        
    // Get script ID.
    var script = func.script();
    var sourceID = script && script.id();
    
    // Get line number.
    var line = DebuggerScript._v8ToWebkitLineNumber(frameMirror.sourceLine());
    
    // Get this object.
    var thisObject = frameMirror.details_.receiver();

    // Get scope chain array in format: [<scope type>, <scope object>, <scope type>, <scope object>,...]
    var scopeChain = [];
    var scopeType = [];
    for (var i = 0; i < frameMirror.scopeCount(); i++) {
        var scopeMirror = frameMirror.scope(i);
        var scopeObjectMirror = scopeMirror.scopeObject();
        var properties = scopeObjectMirror.properties();
        var scopeObject = {};
        for (var j = 0; j < properties.length; j++)
            scopeObject[properties[j].name()] = properties[j].value_;
        // Reset scope object prototype to null so that the proto properties
        // don't appear in th local scope section.
        scopeObject.__proto__ = null;
        scopeType.push(scopeMirror.scopeType());
        scopeChain.push(scopeObject);
    }
    
    function evaluate(expression) {
        return frameMirror.evaluate(expression, false).value();
    }
    
    return {
        "sourceID": sourceID,
        "line": line,
        "functionName": functionName,
        "type": "function",
        "thisObject": thisObject,
        "scopeChain": scopeChain,
        "scopeType": scopeType,
        "evaluate": evaluate,
        "caller": callerFrame
    };
}

DebuggerScript._webkitToV8LineNumber = function(line)
{
    return line - 1;
};

DebuggerScript._v8ToWebkitLineNumber = function(line)
{
    return line + 1;
};

return DebuggerScript;

})();
/*
 * Copyright (C) 2007 Apple Inc.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1.  Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 * 2.  Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
 *     its contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

var injectedScriptConstructor = (function (InjectedScriptHost, inspectedWindow, injectedScriptId, jsEngine) {

var InjectedScript = function()
{
    this._lastBoundObjectId = 1;
    this._idToWrappedObject = {};
    this._objectGroups = {};
}

InjectedScript.prototype = {
    wrapObjectForConsole: function(object, canAccessInspectedWindow)
    {
        if (canAccessInspectedWindow)
            return this._wrapObject(object, "console");
        var result = {};
        result.type = typeof object;
        result.description = this._toString(object);
        return result;
    },

    _wrapObject: function(object, objectGroupName, abbreviate)
    {
        try {
            var objectId;
            if (typeof object === "object" || typeof object === "function" || this._isHTMLAllCollection(object)) {
                var id = this._lastBoundObjectId++;
                objectId = id;
                this._idToWrappedObject[id] = object;
    
                var group = this._objectGroups[objectGroupName];
                if (!group) {
                    group = [];
                    this._objectGroups[objectGroupName] = group;
                }
                group.push(id);
                objectId = this._serializeObjectId(id, objectGroupName);
            }
            return InjectedScript.RemoteObject.fromObject(object, objectId, abbreviate);
        } catch (e) {
            return InjectedScript.RemoteObject.fromObject("[ Exception: " + e.toString() + " ]");
        }
    },

    _serializeObjectId: function(id, groupName)
    {
        return injectedScriptId + ":" + id + ":" + groupName;
    },

    _parseObjectId: function(objectId)
    {
        var tokens = objectId.split(":");
        var parsedObjectId = {};
        parsedObjectId.id = parseInt(tokens[1]);
        parsedObjectId.groupName = tokens[2];
        return parsedObjectId;
    },

    releaseWrapperObjectGroup: function(objectGroupName)
    {
        var group = this._objectGroups[objectGroupName];
        if (!group)
            return;
        for (var i = 0; i < group.length; i++)
            delete this._idToWrappedObject[group[i]];
        delete this._objectGroups[objectGroupName];
    },

    dispatch: function(methodName, args)
    {
        var argsArray = eval("(" + args + ")");
        var result = this[methodName].apply(this, argsArray);
        if (typeof result === "undefined") {
            inspectedWindow.console.error("Web Inspector error: InjectedScript.%s returns undefined", methodName);
            result = null;
        }
        return result;
    },

    getPrototypes: function(nodeId)
    {
        this.releaseWrapperObjectGroup("prototypes");
        var node = this._nodeForId(nodeId);
        if (!node)
            return false;

        var result = [];
        var prototype = node;
        do {
            result.push(this._wrapObject(prototype, "prototypes"));
            prototype = prototype.__proto__;
        } while (prototype)
        return result;
    },

    getProperties: function(objectId, ignoreHasOwnProperty, abbreviate)
    {
        var parsedObjectId = this._parseObjectId(objectId);
        var object = this._objectForId(parsedObjectId);
        if (!this._isDefined(object))
            return false;
        var properties = [];

        var propertyNames = ignoreHasOwnProperty ? this._getPropertyNames(object) : Object.getOwnPropertyNames(object);
        if (!ignoreHasOwnProperty && object.__proto__)
            propertyNames.push("__proto__");
    
        // Go over properties, prepare results.
        for (var i = 0; i < propertyNames.length; ++i) {
            var propertyName = propertyNames[i];
    
            var property = {};
            property.name = propertyName + "";
            var isGetter = object["__lookupGetter__"] && object.__lookupGetter__(propertyName);
            if (!isGetter) {
                try {
                    property.value = this._wrapObject(object[propertyName], parsedObjectId.groupName, abbreviate);
                } catch(e) {
                    property.value = new InjectedScript.RemoteObject.fromException(e);
                }
            } else {
                // FIXME: this should show something like "getter" (bug 16734).
                property.value = new InjectedScript.RemoteObject.fromObject("\u2014"); // em dash
                property.isGetter = true;
            }
            properties.push(property);
        }
        return properties;
    },

    setPropertyValue: function(objectId, propertyName, expression)
    {
        var parsedObjectId = this._parseObjectId(objectId);
        var object = this._objectForId(parsedObjectId);
        if (!this._isDefined(object))
            return false;
    
        var expressionLength = expression.length;
        if (!expressionLength) {
            delete object[propertyName];
            return !(propertyName in object);
        }
    
        try {
            // Surround the expression in parenthesis so the result of the eval is the result
            // of the whole expression not the last potential sub-expression.
    
            // There is a regression introduced here: eval is now happening against global object,
            // not call frame while on a breakpoint.
            // TODO: bring evaluation against call frame back.
            var result = inspectedWindow.eval("(" + expression + ")");
            // Store the result in the property.
            object[propertyName] = result;
            return true;
        } catch(e) {
            try {
                var result = inspectedWindow.eval("\"" + expression.replace(/"/g, "\\\"") + "\"");
                object[propertyName] = result;
                return true;
            } catch(e) {
                return false;
            }
        }
    },

    _populatePropertyNames: function(object, resultSet)
    {
        for (var o = object; o; o = o.__proto__) {
            try {
                var names = Object.getOwnPropertyNames(o);
                for (var i = 0; i < names.length; ++i)
                    resultSet[names[i]] = true;
            } catch (e) {
            }
        }
    },

    _getPropertyNames: function(object, resultSet)
    {
        var propertyNameSet = {};
        this._populatePropertyNames(object, propertyNameSet);
        return Object.keys(propertyNameSet);
    },

    getCompletions: function(expression, includeInspectorCommandLineAPI, callFrameId)
    {
        var props = {};
        try {
            var expressionResult;
            // Evaluate on call frame if call frame id is available.
            if (typeof callFrameId === "number") {
                var callFrame = this._callFrameForId(callFrameId);
                if (!callFrame)
                    return props;
                if (expression)
                    expressionResult = this._evaluateOn(callFrame.evaluate, callFrame, expression);
                else {
                    // Evaluate into properties in scope of the selected call frame.
                    var scopeChain = callFrame.scopeChain;
                    for (var i = 0; i < scopeChain.length; ++i)
                        this._populatePropertyNames(scopeChain[i], props);
                }
            } else {
                if (!expression)
                    expression = "this";
                expressionResult = this._evaluateOn(inspectedWindow.eval, inspectedWindow, expression);
            }
            if (typeof expressionResult === "object")
                this._populatePropertyNames(expressionResult, props);
    
            if (includeInspectorCommandLineAPI) {
                for (var prop in this._commandLineAPI)
                    props[prop] = true;
            }
        } catch(e) {
        }
        return props;
    },

    evaluate: function(expression, objectGroup)
    {
        return this._evaluateAndWrap(inspectedWindow.eval, inspectedWindow, expression, objectGroup);
    },

    _evaluateAndWrap: function(evalFunction, object, expression, objectGroup)
    {
        try {
            return this._wrapObject(this._evaluateOn(evalFunction, object, expression), objectGroup);
        } catch (e) {
            return InjectedScript.RemoteObject.fromException(e);
        }
    },

    _evaluateOn: function(evalFunction, object, expression)
    {
        // Only install command line api object for the time of evaluation.
        // Surround the expression in with statements to inject our command line API so that
        // the window object properties still take more precedent than our API functions.
        inspectedWindow.console._commandLineAPI = this._commandLineAPI;
    
        expression = "with (window.console._commandLineAPI) { with (window) {\n" + expression + "\n} }";
        var value = evalFunction.call(object, expression);
    
        delete inspectedWindow.console._commandLineAPI;
    
        // When evaluating on call frame error is not thrown, but returned as a value.
        if (this._type(value) === "error")
            throw value.toString();
    
        return value;
    },

    getNodeId: function(node)
    {
        return InjectedScriptHost.pushNodePathToFrontend(node, false, false);
    },

    callFrames: function()
    {
        var callFrame = InjectedScriptHost.currentCallFrame();
        if (!callFrame)
            return false;
    
        injectedScript.releaseWrapperObjectGroup("backtrace");
        var result = [];
        var depth = 0;
        do {
            result.push(new InjectedScript.CallFrameProxy(depth++, callFrame));
            callFrame = callFrame.caller;
        } while (callFrame);
        return result;
    },

    evaluateInCallFrame: function(callFrameId, code, objectGroup)
    {
        var callFrame = this._callFrameForId(callFrameId);
        if (!callFrame)
            return false;
        return this._evaluateAndWrap(callFrame.evaluate, callFrame, code, objectGroup);
    },

    _callFrameForId: function(id)
    {
        var callFrame = InjectedScriptHost.currentCallFrame();
        while (--id >= 0 && callFrame)
            callFrame = callFrame.caller;
        return callFrame;
    },

    _nodeForId: function(nodeId)
    {
        if (!nodeId)
            return null;
        return InjectedScriptHost.nodeForId(nodeId);
    },

    _objectForId: function(parsedObjectId)
    {
        return this._idToWrappedObject[parsedObjectId.id];
    },

    resolveNode: function(nodeId)
    {
        var node = this._nodeForId(nodeId);
        if (!node)
            return false;
        // FIXME: receive the object group from client.
        return this._wrapObject(node, "prototype");
    },

    getNodeProperties: function(nodeId, properties)
    {
        var node = this._nodeForId(nodeId);
        if (!node)
            return false;
        var result = {};
        for (var i = 0; i < properties.length; ++i)
            result[properties[i]] = node[properties[i]];
        return result;
    },

    pushNodeToFrontend: function(objectId)
    {
        var parsedObjectId = this._parseObjectId(objectId);
        var object = this._objectForId(parsedObjectId);
        if (!object || this._type(object) !== "node")
            return false;
        return InjectedScriptHost.pushNodePathToFrontend(object, false, false);
    },

    evaluateOnSelf: function(funcBody, args)
    {
        var func = window.eval("(" + funcBody + ")");
        return func.apply(this, args || []);
    },

    _isDefined: function(object)
    {
        return object || this._isHTMLAllCollection(object);
    },

    _isHTMLAllCollection: function(object)
    {
        // document.all is reported as undefined, but we still want to process it.
        return (typeof object === "undefined") && inspectedWindow.HTMLAllCollection && object instanceof inspectedWindow.HTMLAllCollection;
    },

    _type: function(obj)
    {
        if (obj === null)
            return "null";

        var type = typeof obj;
        if (type !== "object" && type !== "function") {
            // FIXME(33716): typeof document.all is always 'undefined'.
            if (this._isHTMLAllCollection(obj))
                return "array";
            return type;
        }

        // If owning frame has navigated to somewhere else window properties will be undefined.
        // In this case just return result of the typeof.
        if (!inspectedWindow.document)
            return type;

        if (obj instanceof inspectedWindow.Node)
            return (obj.nodeType === undefined ? type : "node");
        if (obj instanceof inspectedWindow.String)
            return "string";
        if (obj instanceof inspectedWindow.Array)
            return "array";
        if (obj instanceof inspectedWindow.Boolean)
            return "boolean";
        if (obj instanceof inspectedWindow.Number)
            return "number";
        if (obj instanceof inspectedWindow.Date)
            return "date";
        if (obj instanceof inspectedWindow.RegExp)
            return "regexp";
        // FireBug's array detection.
        if (isFinite(obj.length) && typeof obj.splice === "function")
            return "array";
        if (isFinite(obj.length) && typeof obj.callee === "function") // arguments.
            return "array";
        if (obj instanceof inspectedWindow.NodeList)
            return "array";
        if (obj instanceof inspectedWindow.HTMLCollection)
            return "array";
        if (obj instanceof inspectedWindow.Error)
            return "error";
        return type;
    },

    _describe: function(obj, abbreviated)
    {
        var type = this._type(obj);

        switch (type) {
        case "object":
        case "node":
            return this._className(obj);
        case "array":
            var className = this._className(obj);
            if (typeof obj.length === "number")
                className += "[" + obj.length + "]";
            return className;
        case "string":
            if (!abbreviated)
                return obj;
            if (obj.length > 100)
                return "\"" + obj.substring(0, 100) + "\u2026\"";
            return "\"" + obj + "\"";
        case "function":
            var objectText = this._toString(obj);
            if (abbreviated)
                objectText = /.*/.exec(objectText)[0].replace(/ +$/g, "");
            return objectText;
        default:
            return this._toString(obj);
        }
    },

    _toString: function(obj)
    {
        // We don't use String(obj) because inspectedWindow.String is undefined if owning frame navigated to another page.
        return "" + obj;
    },

    _className: function(obj)
    {
        // We can't use the same code for fetching class names of the dom bindings prototype chain.
        // Both of the methods below result in "Object" names on the foreign engine bindings.
        // I gave up and am using a check below to distinguish between the egine bingings.

        if (jsEngine == "JSC") {
            var str = inspectedWindow.Object ? inspectedWindow.Object.prototype.toString.call(obj) : this._toString(obj);
            return str.replace(/^\[object (.*)\]$/i, "$1");
        } else {
            // V8
            return obj.constructor && obj.constructor.name || "Object";
        }
    },

    _logEvent: function(event)
    {
        console.log(event.type, event);
    },

    _normalizeEventTypes: function(types)
    {
        if (typeof types === "undefined")
            types = [ "mouse", "key", "load", "unload", "abort", "error", "select", "change", "submit", "reset", "focus", "blur", "resize", "scroll" ];
        else if (typeof types === "string")
            types = [ types ];

        var result = [];
        for (var i = 0; i < types.length; i++) {
            if (types[i] === "mouse")
                result.splice(0, 0, "mousedown", "mouseup", "click", "dblclick", "mousemove", "mouseover", "mouseout");
            else if (types[i] === "key")
                result.splice(0, 0, "keydown", "keyup", "keypress");
            else
                result.push(types[i]);
        }
        return result;
    },

    _inspectedNode: function(num)
    {
        var nodeId = InjectedScriptHost.inspectedNode(num);
        return this._nodeForId(nodeId);
    },

    _bindToScript: function(func)
    {
        var args = Array.prototype.slice.call(arguments, 1);
        function bound()
        {
            return func.apply(injectedScript, args.concat(Array.prototype.slice.call(arguments)));
        }
        bound.toString = function() {
            return "bound: " + func;
        };
        return bound;
    }
}

var injectedScript = new InjectedScript();

InjectedScript.RemoteObject = function(objectId, type, description, hasChildren)
{
    this.objectId = objectId;
    this.type = type;
    this.description = description;
    this.hasChildren = hasChildren;
}

InjectedScript.RemoteObject.fromException = function(e)
{
    return new InjectedScript.RemoteObject(null, "error", e.toString());
}

InjectedScript.RemoteObject.fromObject = function(object, objectId, abbreviate)
{
    var type = injectedScript._type(object);
    var rawType = typeof object;
    var hasChildren = (rawType === "object" && object !== null && (Object.getOwnPropertyNames(object).length || !!object.__proto__)) || rawType === "function";
    var description = "";
    try {
        var description = injectedScript._describe(object, abbreviate);
        return new InjectedScript.RemoteObject(objectId, type, description, hasChildren);
    } catch (e) {
        return InjectedScript.RemoteObject.fromException(e);
    }
}

InjectedScript.CallFrameProxy = function(id, callFrame)
{
    this.id = id;
    this.type = callFrame.type;
    this.functionName = (this.type === "function" ? callFrame.functionName : "");
    this.sourceID = callFrame.sourceID;
    this.line = callFrame.line;
    this.scopeChain = this._wrapScopeChain(callFrame);
    this.worldId = injectedScriptId;
}

InjectedScript.CallFrameProxy.prototype = {
    _wrapScopeChain: function(callFrame)
    {
        const GLOBAL_SCOPE = 0;
        const LOCAL_SCOPE = 1;
        const WITH_SCOPE = 2;
        const CLOSURE_SCOPE = 3;
        const CATCH_SCOPE = 4;
    
        var scopeChain = callFrame.scopeChain;
        var scopeChainProxy = [];
        var foundLocalScope = false;
        for (var i = 0; i < scopeChain.length; i++) {
            var scopeType = callFrame.scopeType(i);
            var scopeObject = scopeChain[i];
            var scopeObjectProxy = injectedScript._wrapObject(scopeObject, "backtrace", true);

            switch(scopeType) {
                case LOCAL_SCOPE: {
                    foundLocalScope = true;
                    scopeObjectProxy.isLocal = true;
                    scopeObjectProxy.thisObject = injectedScript._wrapObject(callFrame.thisObject, "backtrace", true);
                    break;
                }
                case CLOSURE_SCOPE: {
                    scopeObjectProxy.isClosure = true;
                    break;
                }
                case WITH_SCOPE:
                case CATCH_SCOPE: {
                    if (foundLocalScope && scopeObject instanceof inspectedWindow.Element)
                        scopeObjectProxy.isElement = true;
                    else if (foundLocalScope && scopeObject instanceof inspectedWindow.Document)
                        scopeObjectProxy.isDocument = true;
                    else
                        scopeObjectProxy.isWithBlock = true;
                    break;
                }
            }
            scopeChainProxy.push(scopeObjectProxy);
        }
        return scopeChainProxy;
    }
}

function CommandLineAPI()
{
    for (var i = 0; i < 5; ++i)
        this.__defineGetter__("$" + i, injectedScript._bindToScript(injectedScript._inspectedNode, i));
}

CommandLineAPI.prototype = {
    // Only add API functions here, private stuff should go to
    // InjectedScript so that it is not suggested by the completion.
    $: function()
    {
        return document.getElementById.apply(document, arguments)
    },

    $$: function()
    {
        return document.querySelectorAll.apply(document, arguments)
    },

    $x: function(xpath, context)
    {
        var nodes = [];
        try {
            var doc = context || document;
            var results = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
            var node;
            while (node = results.iterateNext())
                nodes.push(node);
        } catch (e) {
        }
        return nodes;
    },

    dir: function()
    {
        return console.dir.apply(console, arguments)
    },

    dirxml: function()
    {
        return console.dirxml.apply(console, arguments)
    },

    keys: function(object)
    {
        return Object.keys(object);
    },

    values: function(object)
    {
        var result = [];
        for (var key in object)
            result.push(object[key]);
        return result;
    },

    profile: function()
    {
        return console.profile.apply(console, arguments)
    },

    profileEnd: function()
    {
        return console.profileEnd.apply(console, arguments)
    },

    monitorEvents: function(object, types)
    {
        if (!object || !object.addEventListener || !object.removeEventListener)
            return;
        types = injectedScript._normalizeEventTypes(types);
        for (var i = 0; i < types.length; ++i) {
            object.removeEventListener(types[i], injectedScript._logEvent, false);
            object.addEventListener(types[i], injectedScript._logEvent, false);
        }
    },

    unmonitorEvents: function(object, types)
    {
        if (!object || !object.addEventListener || !object.removeEventListener)
            return;
        types = injectedScript._normalizeEventTypes(types);
        for (var i = 0; i < types.length; ++i)
            object.removeEventListener(types[i], injectedScript._logEvent, false);
    },

    inspect: function(object)
    {
        if (arguments.length === 0)
            return;

        inspectedWindow.console.log(object);
        if (injectedScript._type(object) === "node")
            InjectedScriptHost.pushNodePathToFrontend(object, false, true);
        else {
            switch (injectedScript._describe(object)) {
                case "Database":
                    InjectedScriptHost.selectDatabase(object);
                    break;
                case "Storage":
                    InjectedScriptHost.selectDOMStorage(object);
                    break;
            }
        }
    },

    copy: function(object)
    {
        if (injectedScript._type(object) === "node") {
            var nodeId = InjectedScriptHost.pushNodePathToFrontend(object, false, false);
            InjectedScriptHost.copyNode(nodeId);
        } else
            InjectedScriptHost.copyText(object);
    },

    clear: function()
    {
        InjectedScriptHost.clearConsoleMessages();
    }
}

injectedScript._commandLineAPI = new CommandLineAPI();
return injectedScript;
});

Youez - 2016 - github.com/yon3zu
LinuXploit