mirror of https://github.com/BOINC/boinc.git
*** empty log message ***
svn path=/trunk/boinc/; revision=11038
This commit is contained in:
parent
c10d6e08a7
commit
886604d12c
|
@ -9468,3 +9468,16 @@ David 29 Aug 2006
|
|||
net_stats.C,h
|
||||
lib/
|
||||
util.C,h
|
||||
|
||||
David 29 Aug 2006
|
||||
core client:
|
||||
- replace have_tentative_project variable with a function
|
||||
- log message for project shortfall in no-result case
|
||||
|
||||
client/
|
||||
client_state.C,h
|
||||
client_types.C
|
||||
cpu_sched.C
|
||||
cs_account.C
|
||||
cs_scheduler.C
|
||||
scheduler_op.C
|
||||
|
|
|
@ -105,7 +105,6 @@ CLIENT_STATE::CLIENT_STATE() {
|
|||
must_schedule_cpus = true;
|
||||
must_enforce_cpu_schedule = true;
|
||||
no_gui_rpc = false;
|
||||
have_tentative_project = false;
|
||||
new_version_check_time = 0;
|
||||
detach_console = false;
|
||||
#ifdef SANDBOX
|
||||
|
@ -1410,6 +1409,15 @@ double calculate_exponential_backoff( int n, double MIN, double MAX) {
|
|||
return rand_range(MIN, rmax);
|
||||
}
|
||||
|
||||
bool CLIENT_STATE::have_tentative_project() {
|
||||
unsigned int i;
|
||||
for (i=0; i<projects.size(); i++) {
|
||||
PROJECT* p = projects[i];
|
||||
if (p->tentative) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CLIENT_STATE::have_nontentative_project() {
|
||||
unsigned int i;
|
||||
for (i=0; i<projects.size(); i++) {
|
||||
|
|
|
@ -230,6 +230,7 @@ public:
|
|||
int detach_project(PROJECT*);
|
||||
int report_result_error(RESULT&, const char *format, ...);
|
||||
int reset_project(PROJECT*);
|
||||
bool have_tentative_project();
|
||||
bool have_nontentative_project();
|
||||
bool no_gui_rpc;
|
||||
private:
|
||||
|
@ -285,7 +286,6 @@ public:
|
|||
|
||||
// --------------- cs_account.C:
|
||||
public:
|
||||
bool have_tentative_project;
|
||||
int add_project(
|
||||
const char* master_url, const char* authenticator,
|
||||
bool attached_via_acct_mgr=false
|
||||
|
|
|
@ -1648,8 +1648,9 @@ void PROJECT::update_duration_correction_factor(RESULT* rp) {
|
|||
duration_correction_factor = duration_correction_factor*0.9 + 0.1*ratio;
|
||||
}
|
||||
}
|
||||
if (log_flags.cpu_sched_debug) {
|
||||
msg_printf(this, MSG_INFO, "duration correction factor: %f => %f, ratio %f",
|
||||
if (log_flags.cpu_sched_debug || log_flags.work_fetch_debug) {
|
||||
msg_printf(this, MSG_INFO,
|
||||
"duration correction factor: %f => %f, ratio %f",
|
||||
old_dcf, duration_correction_factor, ratio
|
||||
);
|
||||
}
|
||||
|
|
|
@ -804,11 +804,18 @@ bool CLIENT_STATE::rr_simulation() {
|
|||
for (i=0; i<projects.size(); i++) {
|
||||
p = projects[i];
|
||||
p->set_rrsim_proc_rate(rrs);
|
||||
// if there are no results for a project, the shortfall is its entire share.
|
||||
// if there are no results for a project,
|
||||
// the shortfall is its entire share.
|
||||
//
|
||||
if (!p->active.size()) {
|
||||
double rsf = rrs ? p->resource_share/rrs : 1;
|
||||
p->cpu_shortfall = work_buf_min() * overall_cpu_frac() * ncpus * rsf;
|
||||
if (log_flags.rr_simulation) {
|
||||
msg_printf(NULL, MSG_INFO,
|
||||
"no results for %s; shortfall %f wbm %f ocf %f rsf %f",
|
||||
p->cpu_shortfall, work_buf_min(), overall_cpu_frac(), rsf
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -430,7 +430,6 @@ int CLIENT_STATE::add_project(
|
|||
project->attached_via_acct_mgr = attached_via_acct_mgr;
|
||||
|
||||
project->tentative = true;
|
||||
gstate.have_tentative_project = true;
|
||||
retval = project->write_account_file();
|
||||
if (retval) return retval;
|
||||
|
||||
|
@ -463,7 +462,6 @@ int CLIENT_STATE::add_project(
|
|||
//
|
||||
void PROJECT::attach_failed(int error_num) {
|
||||
gstate.project_attach.error_num = error_num;
|
||||
gstate.have_tentative_project = false;
|
||||
switch(error_num){
|
||||
case ERR_ATTACH_FAIL_INIT:
|
||||
msg_printf(this, MSG_ERROR,
|
||||
|
|
|
@ -740,7 +740,7 @@ bool CLIENT_STATE::scheduler_rpc_poll() {
|
|||
|
||||
// check only every 5 sec, unless there's a tentative (new) project
|
||||
//
|
||||
if (!have_tentative_project && gstate.now - last_time < 5.0) return false;
|
||||
if (!have_tentative_project() && gstate.now - last_time < 5.0) return false;
|
||||
last_time = gstate.now;
|
||||
|
||||
switch(scheduler_op->state) {
|
||||
|
|
|
@ -491,7 +491,6 @@ bool SCHEDULER_OP::poll() {
|
|||
cur_proj->attach_failed(ERR_ATTACH_FAIL_SERVER_ERROR);
|
||||
} else {
|
||||
cur_proj->tentative = false;
|
||||
gstate.have_tentative_project = false;
|
||||
retval = cur_proj->write_account_file();
|
||||
if (retval) {
|
||||
cur_proj->attach_failed(ERR_ATTACH_FAIL_FILE_WRITE);
|
||||
|
|
|
@ -3,17 +3,96 @@ require_once("docutil.php");
|
|||
|
||||
page_head("Account managers");
|
||||
|
||||
$acct_mgrs = array(
|
||||
array(
|
||||
"The BOINCStats Account Manager",
|
||||
"http://bam.boincstats.com",
|
||||
"(BAM!)"
|
||||
),
|
||||
array(
|
||||
"GridRepublic",
|
||||
"http://gridrepublic.org",
|
||||
""
|
||||
),
|
||||
);
|
||||
|
||||
echo "
|
||||
An <b>account manager</b> is a web site that
|
||||
makes it easy to find and join BOINC projects.
|
||||
The way this works is described <a href=acct_mgt.php>here</a>.
|
||||
<p>
|
||||
Available account managers:
|
||||
An <b>account manager</b> is a web site that simplifies
|
||||
participating in BOINC, especially if you are new to BOINC,
|
||||
or if you have several computers,
|
||||
participate in several projects, or like to learn about new projects.
|
||||
The account manager concept was conceived by
|
||||
<a href=http://gridrepublic.org>GridRepublic</a>,
|
||||
and developed jointly by GridRepublic and BOINC.
|
||||
The following account managers are available:
|
||||
<ul>
|
||||
<li> The <a href=http://bam.boincstats.com>BOINCStats Account Manager</a>
|
||||
(BAM!)
|
||||
";
|
||||
shuffle($acct_mgrs);
|
||||
foreach($acct_mgrs as $am) {
|
||||
$name = $am[0];
|
||||
$url = $am[1];
|
||||
$text = $am[2];
|
||||
|
||||
echo "<li> <a href=$url>$name</a> $text\n";
|
||||
}
|
||||
echo "
|
||||
</ul>
|
||||
Other account managers are currently under development,
|
||||
<p>
|
||||
<h3>Why use an account manager?</h3>
|
||||
<table cellpadding=4 border=1>
|
||||
<tr><th class=heading>With account manager</td>
|
||||
<th class=heading>Without account manager</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign=top>
|
||||
See all BOINC projects, old and new,
|
||||
listed and described at the account manager.
|
||||
</td>
|
||||
<td valign=top>
|
||||
Find BOINC projects by word-of-mouth
|
||||
or using a search engine.
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign=top>
|
||||
Attach to a project with a mouse click.
|
||||
If you have multiple computers,
|
||||
all of them will be attached.
|
||||
</td>
|
||||
<td valign=top>
|
||||
Attach to a project by bringing up the 'Attach Project Wizard'
|
||||
in the BOINC Manager, and entering the URL and
|
||||
your email address and password.
|
||||
You must do this separately at each or your computers.
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign=top>
|
||||
Change your account details (name, email address, password)
|
||||
in one web page, at the account manager.
|
||||
</td>
|
||||
<td valign=top>
|
||||
Change your account details on each project web site, separately.
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign=top>
|
||||
Set resource shares for all projects in one web page,
|
||||
at the account manager.
|
||||
</td>
|
||||
<td valign=top>
|
||||
Set resource shares at each project web site, separately.
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign=top>
|
||||
Create/join/quit teams in one web page, at the account manager.
|
||||
</td>
|
||||
<td valign=top>
|
||||
Create/join/quit teams at each project web site, separately.
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
";
|
||||
page_tail();
|
||||
?>
|
||||
|
|
|
@ -1,6 +1,11 @@
|
|||
<?
|
||||
|
||||
$project_news = array(
|
||||
array("August 24, 2006",
|
||||
"<a href=http://gridrepublic.org>GridRepublic</a>,
|
||||
a BOINC account manager, recently moved into beta test.
|
||||
It was written up by <a href=http://news.com.com/2061-12572_3-6108804.html>CNET</a>."
|
||||
),
|
||||
array("August 20, 2006",
|
||||
"BOINC and SETI@home are featured in
|
||||
<a href=http://www.be.asahi.com/20060819/W16/20060803TBEH0006A.html>an
|
||||
|
@ -17,7 +22,7 @@ array("August 15, 2006",
|
|||
"A BBC Radio program on 'Citizen Science' - including
|
||||
a segment on volunteer computing and BOINC -
|
||||
will air tomorrow, 16 Aug 2006, 9 PM British Time.
|
||||
It will also be avalable
|
||||
It will also be available
|
||||
<a href=http://www.bbc.co.uk/radio4/science/citizenscience.shtml>online</a>.
|
||||
"
|
||||
),
|
||||
|
@ -151,7 +156,7 @@ array("June 14, 2006",
|
|||
"
|
||||
),
|
||||
array("June 10, 2006",
|
||||
"The <a href=http://www.boincuk.com/newsletter_reg.php>BOINC UK Newsletter Circuler</a> (bunc) has released its June 2006 edition,
|
||||
"The <a href=http://www.boincuk.com/newsletter_reg.php>BOINC UK Newsletter Circular</a> (bunc) has released its June 2006 edition,
|
||||
featuring an interview with David Anderson."
|
||||
),
|
||||
array("June 7, 2006",
|
||||
|
|
|
@ -10,7 +10,7 @@ This file has the following format:
|
|||
<cc_config>
|
||||
<options>
|
||||
[ <save_stats_days>N</save_stats_days> ]
|
||||
[ <dont_check_file_size>0|1</dont_check_file_size> ]
|
||||
[ <dont_check_file_sizes>0|1</dont_check_file_sizes> ]
|
||||
[ <ncpus>N</ncpus> ]
|
||||
</options>
|
||||
<log_flags>
|
||||
|
|
|
@ -8,9 +8,9 @@ The BOINC project is based at the
|
|||
at the University of California, Berkeley.
|
||||
Project staff are:
|
||||
<dl>
|
||||
<dt> <b>Dr. David P. Anderson</b>
|
||||
<dt> <a href=http://boinc.berkeley.edu/anderson/>Dr. David P. Anderson</a>
|
||||
<dd>
|
||||
Director, architect and developer. Contact him at davea at ssl.berkeley.edu.
|
||||
Director and architect. Contact him at davea at ssl.berkeley.edu.
|
||||
|
||||
<dt><a href=\"http://www.romwnet.org/\"><b>Rom Walton</b></a>
|
||||
<dd>
|
||||
|
|
|
@ -1,7 +1,29 @@
|
|||
<?php
|
||||
require_once("docutil.php");
|
||||
page_head("Energy considerations");
|
||||
page_head("Heat and Energy considerations");
|
||||
echo "
|
||||
<h2>CPU heat</h2>
|
||||
|
||||
<p>
|
||||
When BOINC applications are running on a computer,
|
||||
its CPU chip produces more heat than when it is idle.
|
||||
The computer's heat sinks and fans are normally able to
|
||||
dissipate this heat sufficiently.
|
||||
However, if the fans become clogged with dust,
|
||||
they may not be able to cool the CPU adequately,
|
||||
and this can lead to premature failure of the CPU or motherboard.
|
||||
|
||||
<p>
|
||||
To deal with this problem, we recommend that you:
|
||||
<ul>
|
||||
<li> Clean your computer's fans and heat sinks periodically.
|
||||
<li> Install a utility that monitors CPU temperature,
|
||||
such as <a href=http://www.pcworld.com/downloads/file/fid,7309-order,1-page,1-c,alldownloads/description.html>Motherboard Monitor</a> or
|
||||
<a href=http://www.diefer.de/i8kfan/index.html>i8kfan</a>
|
||||
(for Dell laptops).
|
||||
<li> If needed,
|
||||
set your <a href=prefs.php>general preferences</a> to throttle CPU usage.
|
||||
</ul>
|
||||
<h2>The energy cost and environmental impact of running BOINC</h2>
|
||||
<p>
|
||||
A computer running BOINC uses more energy than an idle computer.
|
||||
|
@ -31,8 +53,8 @@ list_item_array(array("Active", "150 watts", "110 kWh", "$8.80"));
|
|||
list_end();
|
||||
echo "
|
||||
Under these assumptions, running BOINC costs about $3/month
|
||||
relative to leaving your computer on but idle,
|
||||
and about $8.80/month relative to leaving it off all the time.
|
||||
more than leaving your computer on but idle,
|
||||
and about $8.80/month more than leaving it off all the time.
|
||||
|
||||
<p>
|
||||
There may also be an environmental cost.
|
||||
|
|
|
@ -6,9 +6,12 @@ function show_participant() {
|
|||
$i = rand(0, 99);
|
||||
$j = $i+1;
|
||||
echo "
|
||||
<tr><td bgcolor=$light_blue>
|
||||
<font size=4> Featured volunteer</font>
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
<center>
|
||||
<table border=2 cellpadding=6><tr><td>
|
||||
<table border=0 cellpadding=6><tr><td>
|
||||
";
|
||||
include("piecharts/$i.html");
|
||||
echo "
|
||||
|
@ -65,6 +68,11 @@ function show_participate() {
|
|||
<li> <a href=download.php><font size=+1>Download</font></a> and run BOINC software
|
||||
<li> <font size=+1>Enter</font> the project URLs, your email address, and password.
|
||||
</ol>
|
||||
<p>
|
||||
Or, for simplicity and convenience,
|
||||
use an <a href=acct_mgrs.php>account manager</a>
|
||||
such as <a href=http://gridrepublic.org>GridRepublic</a>
|
||||
or <a href=http://bam.boincstats.com/>BAM!</a>.
|
||||
<center>
|
||||
<a href=participate.php><b><nobr>Details</nobr></b></a>
|
||||
| <a href=download.php><b>Download</b></a>
|
||||
|
@ -153,8 +161,9 @@ echo "
|
|||
<h1>
|
||||
Berkeley Open Infrastructure for Network Computing
|
||||
</h1>
|
||||
<font size=+1>
|
||||
Open-source software for
|
||||
<a href=volunteer.php>volunteer computing</a> and <a href=dg.php>desktop grid computing</a>.
|
||||
<a href=volunteer.php>volunteer computing</a> and <a href=dg.php>desktop grid computing</a>.</font>
|
||||
<p>
|
||||
";
|
||||
search_form();
|
||||
|
|
|
@ -5,9 +5,13 @@ echo "
|
|||
<ul>
|
||||
<li> If your browser has not already done so,
|
||||
expand the zip archive by double-clicking on it in the Finder.
|
||||
<li> Double-click on <b>BOINC.pkg</b> to run the installer, then follow the prompts.
|
||||
<li> Close the installer when it is finished. This will automatically launch the BOINC Manager.
|
||||
<li> If you want BOINC to be your screen saver, open <b>System Preferences</b> from the Apple menu. Select <b>Desktop & Screen Saver</b> and select <b>BOINCSaver</b>.
|
||||
<li> Double-click on <b>BOINC.pkg</b> to run the installer,
|
||||
then follow the prompts.
|
||||
<li> Close the installer when it is finished.
|
||||
This will automatically launch the BOINC Manager.
|
||||
<li> If you want BOINC to be your screen saver,
|
||||
open <b>System Preferences</b> from the Apple menu.
|
||||
Select <b>Desktop & Screen Saver</b> and select <b>BOINCSaver</b>.
|
||||
<p>
|
||||
<li> The installer does the following:
|
||||
<ul>
|
||||
|
|
|
@ -23,7 +23,7 @@ echo "
|
|||
</ul>
|
||||
|
||||
<li> <a href=prefs.php>Preferences</a>
|
||||
<li> <a href=energy.php>Energy considerations</a>
|
||||
<li> <a href=energy.php>Heat and energy considerations</a>
|
||||
<li> <a href=host_id.php>Host identification and merging</a>
|
||||
<li> <a href=multiple_projects.php>Participating in multiple projects</a>
|
||||
<li> <a href=credit.php>Computation credit</a>
|
||||
|
|
|
@ -53,13 +53,13 @@ function other_link($sums, $other_name, $link_text, $ntotal) {
|
|||
$y = "";
|
||||
$n = count($sums[$other_name]);
|
||||
if ($n) {
|
||||
$fname = "poll_$other_name.txt";
|
||||
$fname = "poll_$other_name.html";
|
||||
$b = bar($n, $ntotal);
|
||||
$y .= "$b <a href=$fname>$link_text</a>";
|
||||
$f = fopen($fname, "w");
|
||||
foreach ($sums[$other_name] as $text) {
|
||||
fwrite($f, $text);
|
||||
fwrite($f, "\n-----------------\n");
|
||||
fwrite($f, "\n<hr>\n");
|
||||
}
|
||||
fclose($f);
|
||||
} else {
|
||||
|
|
|
@ -79,9 +79,9 @@ They include:
|
|||
|
||||
list_start();
|
||||
|
||||
list_bar("Computing preferences");
|
||||
list_bar("Processor usage");
|
||||
list_item("When to work",
|
||||
"You can specify whether work (computation and network transfer) should be done
|
||||
"You can specify whether computation should be done
|
||||
1) if the computer is in use (i.e. during keyboard and mouse input);
|
||||
2) if the computer is being powered by batteries (for laptop users).
|
||||
You can also specify a range of hours when work should be done.
|
||||
|
@ -97,12 +97,16 @@ list_item("Leave applications in memory while preempted",
|
|||
list_item("Switch between applications every X minutes",
|
||||
"This determines how often BOINC switches between projects."
|
||||
);
|
||||
|
||||
list_item("Virtual memory",
|
||||
"Limit the virtual memory used by BOINC"
|
||||
list_item("Maximum number of processors to use",
|
||||
"On a multiprocessor, this limits the number of processors
|
||||
that BOINC will use."
|
||||
);
|
||||
list_item("Use at most X% of CPU time",
|
||||
"It you specify 50%, BOINC will compute only every other second.
|
||||
This reduces the heat output and energy usage of your CPU chip."
|
||||
);
|
||||
|
||||
list_bar("Disk preferences");
|
||||
list_bar("Disk and memory usage");
|
||||
|
||||
list_item("Usage limits",
|
||||
"You can limit the disk space used by BOINC in any of three ways:
|
||||
|
@ -117,7 +121,14 @@ list_item("Access interval",
|
|||
"
|
||||
);
|
||||
|
||||
list_bar("Network preferences");
|
||||
list_item("Virtual memory",
|
||||
"Limit the virtual memory used by BOINC"
|
||||
);
|
||||
|
||||
list_bar("Network usage");
|
||||
list_item("Time of day limits",
|
||||
"Limit the hours during which BOINC will do network communication."
|
||||
);
|
||||
list_item("Bandwidth limits",
|
||||
"Limit the number of bytes per second uploaded or downloaded by BOINC."
|
||||
);
|
||||
|
|
|
@ -4,7 +4,10 @@ require_once("projects.inc");
|
|||
page_head("Choosing BOINC projects");
|
||||
|
||||
echo "
|
||||
A partial list of current projects (mouse over for details):
|
||||
A partial list of current projects is below;
|
||||
you can find others using <a href=http://google.com>Google</a>.
|
||||
<p>
|
||||
Mouse over a project for details.
|
||||
<ul>
|
||||
";
|
||||
shuffle($areas);
|
||||
|
|
|
@ -49,6 +49,26 @@ echo "
|
|||
".tr(RLN_MSWIN_INSTALL_WINSERVICE_DESC)."
|
||||
</ul>
|
||||
|
||||
<h3>Mac OS X</h3>
|
||||
<ul>
|
||||
<li> If your browser has not already done so,
|
||||
expand the zip archive by double-clicking on it in the Finder.
|
||||
<li> Double-click on <b>BOINC.pkg</b> to run the installer,
|
||||
then follow the prompts.
|
||||
<li> Close the installer when it is finished.
|
||||
This will automatically launch the BOINC Manager.
|
||||
<li> If you want BOINC to be your screen saver,
|
||||
open <b>System Preferences</b> from the Apple menu.
|
||||
Select <b>Desktop & Screen Saver</b> and select <b>BOINCSaver</b>.
|
||||
</ul>
|
||||
<p>
|
||||
Several <a href=mac_admin_tools.php>tools</a> for Macintosh system administrators are available to:
|
||||
<ul>
|
||||
<li> automatically run BOINC as a daemon or system service at boot time
|
||||
<li> improve security for stand-alone clients
|
||||
<li> prevent BOINC Manager from launching automatically when selected users log in.
|
||||
</ul>
|
||||
|
||||
<h3>".tr(RLN_LINUX)."</h3>
|
||||
".tr(RLN_LINUX_INSTALL_SEA_DESC)."
|
||||
<p>"
|
||||
|
@ -75,6 +95,19 @@ run_manager
|
|||
<h2>".tr(RLN_UNINSTALLING)."</h2>
|
||||
<h3>".tr(RLN_MSWIN)."</h3>
|
||||
".tr(RLN_MSWIN_UNINSTALL_DESC)."
|
||||
<h3>Mac OS X</h3>
|
||||
To completely remove (<b>uninstall</b>) BOINC from your Macintosh:
|
||||
<ul>
|
||||
<li> Move the following files to the trash:
|
||||
<ul>
|
||||
<li> BOINCManager.app (from your <b>/Applications/</b> folder)
|
||||
<li> BOINCSaver.saver (from your <b>/Library/Screen Savers/</b> folder)
|
||||
<li> the <b>BOINC Data/</b> folder (from your<b>/Library/Applications Support/</b> folder.)
|
||||
<li> BOINC.pkg (from your <b>/Library/Receipts/</b> folder)
|
||||
</ul>
|
||||
<li> Open the <b>Accounts</b> pane in the <b>System Preferences</b> (accessible from the Apple menu), and remove BOINCManager from your list of <b>Login Items</b> (or <b>Startup Items</b> under OS 10.3.)
|
||||
<li> Open <b>System Preferences</b> from the Apple menu. Select <b>Desktop & Screen Saver</b> and select a different screen saver.
|
||||
</ul>
|
||||
|
||||
<a name=issues></a>
|
||||
<h2>".tr(RLN_KNOWN_ISSUES)."</h2>
|
||||
|
|
|
@ -232,7 +232,7 @@ function update_1_13_2005() {
|
|||
}
|
||||
|
||||
function update_1_18_2005() {
|
||||
do_query("ALTER TABLE forum_preferences CHANGE special_user special_user CHAR( 8 ) DEFAULT '0' NOT NULL");
|
||||
do_query("ALTER TABLE forum_preferences CHANGE special_user special_user CHAR(12) DEFAULT '0' NOT NULL");
|
||||
}
|
||||
|
||||
function update_1_19_2005() {
|
||||
|
|
Loading…
Reference in New Issue