Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

include/require функции [обсуждение] (Rumata)
Author Message
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 83
   поощрить/наказать


PostPosted: Wed Jun 10, 2009 8:44 am ()
   Post subject:
Reply with quote


М

Выделено из темы «function loadScript(path)»,
расположенной в форуме Склад готовых решений :: JavaScript (10 Июня 2009, 15:48).
Back to top
View user's profile Send private message Send e-mail
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Wed Jun 10, 2009 8:44 am (спустя 1 секунду; написано за 8 минут 40 секунд)
   Post subject:
Reply with quote

Александр Михалицын wrote:
Мой вариант
Я вот удивляюсь, почему надо так сложно загружать скрипты через DOM? Вот это реальный пример как сделать простое простым способом. Загрузить скрипт и выполнить его. Все! Мне кажется спорным наличие двух функций include и require. В любом случае - если скрипт не загрузился, весь зависимый от него код летит к чертям. Хотя include и require смотрятся красиво и заложена предусмотрено логирование. Вот тут есть замечание
Code (JavaScript): скопировать код в буфер обмена
        require = function(url)
        {
                var scriptCode = createRequest(url);
                eval(scriptCode);
        }

        include = function(url)
        {
                try
                {
                        require(url);
1. Скрипт не загрузился
require бросит исключение из createRequest
include промолчит, но вызовет функцию логирования

2. Скрипт загрузился, но в нем содержатся ошибки
require бросит исключение из eval
include опять промолчит.

Мне кажется второе не корректно, то есть даже include должен бросить исключение из-за ошибок в скрипте.

В getXMLHttpRequest лучше сделать первой проверку на существование XMLHttpRequest, а потом остальное.
Back to top
View user's profile Send private message
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 83
   поощрить/наказать


PostPosted: Wed Jun 10, 2009 9:10 am (спустя 26 минут; написано за 2 минуты 42 секунды)
   Post subject:
Reply with quote

Rumata,
да, действительно!
Решается добавлением проверки на принадлежность исключения к конструктору ScriptLoadError.
Тоесть если оно принадлежит -- то в лог, а если нет -- то это постороннее исключение... его ловить не надо.

Архив прикрепил.

Существенным достоинством данного подхода, явяется то, что интерпритатор не идет дальше, до тех пор пока скипт
не загрузился (используется синхронный запрос). А недостатком, то, что скажем если пытаться испытывать скрипт, просто запуская двумя
кликами броузер -- работать не будет... Необходим HTTP-сервер.


include.zip
 Description:
v.1.1

Download
 Filename:  include.zip
 Filesize:  1.27 KB
 Downloaded:  300 Time(s)

Back to top
View user's profile Send private message Send e-mail
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 268
   поощрить/наказать

Location: Питер

PostPosted: Wed Jun 10, 2009 12:38 pm (спустя 3 часа 28 минут; написано за 57 секунд)
   Post subject:
Reply with quote

Rumata
Евал - зло, туда брякпоинт не воткнуть.
И вообще, JS - асинхронен по своей сути, зачем извращения с синхронной загрузкой к нему прикручивать?
Back to top
View user's profile Send private message
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 83
   поощрить/наказать


PostPosted: Wed Jun 10, 2009 12:47 pm (спустя 8 минут; написано за 4 минуты 42 секунды)
   Post subject:
Reply with quote

WingedFox,
Quote:
зачем извращения с синхронной загрузкой к нему прикручивать?
В каком месте там извращение? XMLHttpRequest? (-:
Quote:
зачем
Чтобы после вызова include/require, как в php, можно было быть уверенным в том, что скрипт уже загружен и подключен. (-;
Quote:
Евал - зло, туда брякпоинт не воткнуть.
Несовсем понял, всмысле потому что код "выражен" строкой?

Last edited by Александр Михалицын on Wed Jun 10, 2009 1:00 pm; edited 2 times in total
Back to top
View user's profile Send private message Send e-mail
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Wed Jun 10, 2009 12:59 pm (спустя 11 минут; написано за 44 секунды)
   Post subject:
Reply with quote

WingedFox
невозможность вставить брейкпойнты в eval - это единственное зло?
Back to top
View user's profile Send private message
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 268
   поощрить/наказать

Location: Питер

PostPosted: Wed Jun 10, 2009 1:11 pm (спустя 11 минут; написано за 2 минуты 35 секунд)
   Post subject:
Reply with quote

Rumata
Нет, ещё есть наличие замыкания "поверх" eval, что тоже не слишком способствует здоровью.

Имхо, это есть бесполезное извращение.

Александр Михалицын
Такая уверенность совершенно не обязательна. Особенно по причине того, что JS управляет UI, а UI должен иметь минимально возможное время реакции на действия юзера (а не подвешивать тред).
Back to top
View user's profile Send private message
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 83
   поощрить/наказать


PostPosted: Wed Jun 10, 2009 1:47 pm (спустя 35 минут; написано за 2 минуты 38 секунд)
   Post subject:
Reply with quote

WingedFox,
Quote:
Такая уверенность совершенно не обязательна. Особенно по причине того, что JS управляет UI, а UI должен иметь минимально возможное время реакции на действия юзера (а не подвешивать тред).
Согласен. Но не настолько уже это и критично. Тем более, представь себе, что скажем
для этого самого "управления" нужно обязательно подгрузить определенный JS код...
В этом случае что реализовать через таймауты и интервалы (ожидание загрузки), что реализовать "подтормаживанием" потока -- разницы нет...
В любом случае придется "на время" не управлять UI.
Back to top
View user's profile Send private message Send e-mail
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Wed Jun 10, 2009 2:56 pm (спустя 1 час 9 минут; написано за 30 секунд)
   Post subject:
Reply with quote

WingedFox wrote:
наличие замыкания "поверх" eval
Можно просветиться в этом вопросе? Примеры с ходу придумать не могу.
Back to top
View user's profile Send private message
dimagolov
Участник форума



Joined: 04 Feb 2007
Posts: 1664
Карма: 96
   поощрить/наказать

Location: Christ Church, Barbados

PostPosted: Wed Jun 10, 2009 3:33 pm (спустя 36 минут; написано за 56 секунд)
   Post subject:
Reply with quote

Quote:
В этом случае что реализовать через таймауты и интервалы (ожидание загрузки), что реализовать "подтормаживанием" потока -- разницы нет...
Разве нету? Разве "подтормаживание" потока не приводит к подвисанию браузера вообще, когда он ни на что не реагирует?
Back to top
View user's profile Send private message
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 268
   поощрить/наказать

Location: Питер

PostPosted: Wed Jun 10, 2009 3:36 pm (спустя 3 минуты; написано за 1 минуту 18 секунд)
   Post subject:
Reply with quote

Rumata
Как-то так.
Code (JavaScript): скопировать код в буфер обмена
var res = "a*b";

(function(){
    var a = 10
       ,b = 20;
    alert(eval(res));
})();
Back to top
View user's profile Send private message
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Wed Jun 10, 2009 3:59 pm (спустя 22 минуты; написано за 2 минуты 13 секунд)
   Post subject:
Reply with quote

WingedFox
Идею понял. Все гораздо хуже.
Code (JavaScript): скопировать код в буфер обмена
var s = 'function sign(a, b) { return a == 0 ? 0 : a > 0 ? +1 : -1; }';

(function()
{
        eval(s);
})();

var x = sign(100);
Back to top
View user's profile Send private message
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 83
   поощрить/наказать


PostPosted: Wed Jun 10, 2009 4:09 pm (спустя 10 минут; написано за 1 минуту 3 секунды)
   Post subject:
Reply with quote

Quote:
Разве "подтормаживание" потока
Насколько мне известно, тормозится только поток выполнения JavaScript кода...
Quote:
Все гораздо хуже.
Гм, да, eval выполняет код в контексте функции из которой он был вызван...
Тогда:
Code (JavaScript): скопировать код в буфер обмена
function my_eval(source_code)
{
        var script = document.createElement('script');
        script.language = 'JavaScript';
        type = 'text/javascript';
        script.appendChild(document.createTextNode(source_code));
        document.documentElement.childNodes[0].appendChild(script); //append child to "head" tag
}
Back to top
View user's profile Send private message Send e-mail
Guest






Карма: 388
   поощрить/наказать


PostPosted: Thu Jun 11, 2009 12:48 pm (спустя 20 часов 38 минут; написано за 47 секунд)
   Post subject:
Reply with quote

eval(scriptCode)

и как ты будешь узнавать по ошибкам в консоли в каком файле они произошли?
Back to top
Guest






Карма: 388
   поощрить/наказать


PostPosted: Thu Jun 11, 2009 12:55 pm (спустя 7 минут; написано за 1 минуту 47 секунд)
   Post subject:
Reply with quote

да, и останавливать весь яваскрипт на странице пока не загрузится скрипт для какого-то виджета - маразм.
ну и резолвить инклуды лучше на стороне сервера, чтобы не качать по десять мелких файлов...
Back to top
dimagolov
Участник форума



Joined: 04 Feb 2007
Posts: 1664
Карма: 96
   поощрить/наказать

Location: Christ Church, Barbados

PostPosted: Thu Jun 11, 2009 3:26 pm (спустя 2 часа 30 минут; написано за 3 минуты 11 секунд)
   Post subject:
Reply with quote

Quote:
резолвить инклуды лучше на стороне сервера, чтобы не качать по десять мелких файлов
кстати да. если говорить об оптимизации, то кеширование скриптов на стороне браузера рулит, особенно когда речь о "тяжелых" JS интерфейсах. а в случае динамической подгрузки кеширование однозначно пойдет лесом.

я бы подумал о фоновой загрузке скриптов но не прямо текстом, а через установку нужных src тегам script или через подгрузку iframe, в котором будет включение этих script.
Back to top
View user's profile Send private message
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 83
   поощрить/наказать


PostPosted: Fri Jun 12, 2009 1:06 pm (спустя 21 час 40 минут; написано за 32 секунды)
   Post subject:
Reply with quote

Гость,

М

У нас на форуме принято общение на "вы".
Прошу ознакомиться с правилами форума.
Back to top
View user's profile Send private message Send e-mail
69
Guest





Карма: 388
   поощрить/наказать


PostPosted: Wed Jun 17, 2009 9:50 pm (спустя 5 дней 8 часов 43 минуты; написано за 8 минут 22 секунды)
   Post subject:
Reply with quote

Александру Михалицыну - по поводу ыложенного скрипта

Следующее:
1) По поводу полноценной эмуляции - ну есть одно существенное разница. В PHP соотв. функции выполняются в текущем контексте подобно нашему eval(). У Вас же в локальном контексте функций. Не уверен что можно это подправить, но акцентировать полезно.

2) Выполнение оператора typeof XMLHttpRequest потенциально чревато выбросом исключения - попробуйте в 8-м осле убрав ActiveX ветку (сам не могу - сижу под Линухом)

3) Статус ответа далеко необязательно будет 200. В частности при file: равен 0 (Обычно 200..299,304 + еще какой-то начали боавлять проф-библиотеки)

4) В require так и просится проверка на instanceof обїекта ошибки.
Back to top
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 83
   поощрить/наказать


PostPosted: Thu Jun 18, 2009 8:01 am (спустя 10 часов 10 минут; написано за 1 минуту 52 секунды)
   Post subject:
Reply with quote

Quote:
Не уверен что можно это подправить, но акцентировать полезно.
Вы тему выше читали? Я написал решение этой проблемы...
Quote:
3) Статус ответа далеко необязательно будет 200. В частности при file: равен 0 (Обычно 200..299,304 + еще какой-то начали боавлять проф-библиотеки)
Ну почему же... любой вебсервер отдавая странику кидает 200...
Quote:
4) В require так и просится проверка на instanceof обїекта ошибки.
Это противоречит принцыпу require... Она кидает ошибку всегда при неудаче...
Back to top
View user's profile Send private message Send e-mail
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 268
   поощрить/наказать

Location: Питер

PostPosted: Thu Jun 18, 2009 8:24 am (спустя 23 минуты; написано за 32 секунды)
   Post subject:
Reply with quote

Александр Михалицын wrote:
Ну почему же... любой вебсервер отдавая странику кидает 200...
C какой радости? Учи матчасть (www.w3.org/Protocols/rfc2616/rfc2616-sec6.html#sec6.1.1).
Back to top
View user's profile Send private message
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 83
   поощрить/наказать


PostPosted: Thu Jun 18, 2009 10:50 am (спустя 2 часа 25 минут; написано за 24 секунды)
   Post subject:
Reply with quote

Илья,
я знаю что есть другие, но они говорят уже не об успешной загрузке страницы...
Back to top
View user's profile Send private message Send e-mail
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 268
   поощрить/наказать

Location: Питер

PostPosted: Thu Jun 18, 2009 11:05 am (спустя 15 минут; написано за 33 секунды)
   Post subject:
Reply with quote

Александр Михалицын
Ну когда ты перестанешь препираться, а? =)
304, например: www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.5
Back to top
View user's profile Send private message
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 83
   поощрить/наказать


PostPosted: Thu Jun 18, 2009 11:26 am (спустя 20 минут; написано за 1 минуту 58 секунд)
   Post subject:
Reply with quote

WingedFox,
Quote:
Ну когда ты перестанешь препираться, а? =)
Илья, я не припираюсь а отстаиваю свою точку зрания, как мне кажется верную. :D
Quote:
304, например: www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.5
Ну 304 (Not modified) посылается в случае, если страница не была модифицирована с тех пор как на не заглянули последний раз, для этого
нужно отправить заголовок If-Modified-Since с датой последнего просмотра, не так ли? =) Если я все говорю не так, пожалуйста покажи и объясни как исправить. =)
Back to top
View user's profile Send private message Send e-mail
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 268
   поощрить/наказать

Location: Питер

PostPosted: Thu Jun 18, 2009 11:37 am (спустя 11 минут; написано за 2 минуты 38 секунд)
   Post subject:
Reply with quote

Александр Михалицын
То что ты не подставляешь такой заголовок вручную никак не означает, что его не подставляет браузер.
Кроме If-(Not)Modified есть ещё и ETag, и Expires.
А ещё есть вполне легальный 206.

Читай доку, в общем =)
Проверять _только_ на 200 - нет никакого смысла, если только бэкенд не будет возвращать именно этот код со 100% гарантией.
Back to top
View user's profile Send private message
69
Guest





Карма: 388
   поощрить/наказать


PostPosted: Thu Jun 18, 2009 5:42 pm (спустя 6 часов 5 минут; написано за 7 минут 21 секунду)
   Post subject:
Reply with quote

Александр Михалицын wrote:
Это противоречит принцыпу require... Она кидает ошибку всегда при неудаче...
Sorry я имел в виду include

Кроме того я не видел версию программы 1.1 где проверка в include есть (скачал 1.0 из готовых решений)

Но и этого мне кажется мало.
Вы словили ошибку include - а фактически не 200 и вывели в лог - это хорошо.
Но вместе с тем Вы проглотили и все ошибки времени выполнения - на самом деле загружаемы код может быть как раз построен с учетом выбрасывания ошибки - а она прогочена.
Ошибку отличную от ошибки загрузки хотелось бы выбросить наверх - иначе пострадает логика приложения.
Back to top
69
Guest





Карма: 388
   поощрить/наказать


PostPosted: Thu Jun 18, 2009 5:46 pm (спустя 4 минуты; написано за 1 минуту 26 секунд)
   Post subject:
Reply with quote

Кстати из Ваших реплик я понял что Вы полааете, что ловите только ошибку загрузки - это не так.
Надо явно throw e
Back to top
69
Guest





Карма: 388
   поощрить/наказать


PostPosted: Thu Jun 18, 2009 5:52 pm (спустя 5 минут; написано за 3 минуты 27 секунд)
   Post subject:
Reply with quote

Наконец понял что Вы имели в виду под решением проблемы выполнения eval в контексте include.
Это имелось в виду про загрузки элементами SCRIPT динамически формируемыми.
Кроме отсутсвтия синхронности этот код не выполняет в текущем, но в глобальном контексте.
Того же достигается при window.eval()/execScript()
Выполнения точно в текущем контексте скорее всего не получить.
Back to top
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 83
   поощрить/наказать


PostPosted: Thu Jun 18, 2009 5:55 pm (спустя 2 минуты; написано за 9 секунд)
   Post subject:
Reply with quote

Quote:
То что ты не подставляешь такой заголовок вручную никак не означает, что его не подставляет браузер.
Кроме If-(Not)Modified есть ещё и ETag, и Expires.
А ещё есть вполне легальный 206.

Читай доку, в общем =)
Проверять _только_ на 200 - нет никакого смысла, если только бэкенд не будет возвращать именно этот код со 100% гарантией.
Мне кажется это все надумано, проверка на status == 200 пишется в 99% AJAX скриптов, а уже другие ситуации библиотека не обрабатывает, если действительно у кого-то возникнет проблема с этим, я что нибудь придумаю...
Quote:
Выполнения точно в текущем контексте скорее всего не получить.
Да.
Back to top
View user's profile Send private message Send e-mail
Cr@ZyBoY
Guest





Карма: 388
   поощрить/наказать


PostPosted: Thu Jun 18, 2009 6:28 pm (спустя 33 минуты; написано за 1 минуту 34 секунды)
   Post subject:
Reply with quote

Я может чего-то не понимаю, но у меня пример из архива не работает вообще - браузеры ругаются на строку 62:
Code (JavaScript): скопировать код в буфер обмена
throw new ScriptLoadError("Can't load script on url: " + url, xmlhttprequest.status, xmlhttprequest.statusText);
И к тому же, там сразу идёт проверка status, а где же проверка readyState == 4?
Такое ощущение, что какого-то куска кода просто нет...
Back to top
Cr@ZyBoY
Guest





Карма: 388
   поощрить/наказать


PostPosted: Thu Jun 18, 2009 6:43 pm (спустя 15 минут; написано за 31 секунду)
   Post subject:
Reply with quote

Пардон, перепутал с асинхронным запросом :(
Back to top
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 83
   поощрить/наказать


PostPosted: Fri Jun 19, 2009 7:59 am (спустя 13 часов 15 минут; написано за 29 секунд)
   Post subject:
Reply with quote

Cr@ZyBoY wrote:
но у меня пример из архива не работает вообще
Дим, залей его на сервер и запусти.. Просто кликнув по ХТМЛ файлу работать не будет (веб-сервера то нет!).
Back to top
View user's profile Send private message Send e-mail
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 268
   поощрить/наказать

Location: Питер

PostPosted: Fri Jun 19, 2009 10:38 am (спустя 2 часа 39 минут; написано за 1 минуту 15 секунд)
   Post subject:
Reply with quote

Александр Михалицын
Как скажешь. Но ведь главная проблема это именно в том, что 99% разработчиков равняются на 99% существующих решений.
И только 1% делает что-то уникальное и реально полезное.
Back to top
View user's profile Send private message
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 83
   поощрить/наказать


PostPosted: Fri Jun 19, 2009 12:12 pm (спустя 1 час 33 минуты; написано за 1 минуту 33 секунды)
   Post subject:
Reply with quote

Илья,
ты предлагаешь сейчас из небольшого несложного скрипта сделать монстра. =)
Я ведь говорю, что если подобный функционал будет нужен -- я сделаю,
но зачем нагружать лишним (пока) кодом? Если еще никому это не пригодилось. Если пригодится, отпишите.
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Fri Jun 19, 2009 12:56 pm (спустя 44 минуты; написано за 44 секунды)
   Post subject:
Reply with quote

Александр Михалицын wrote:
но зачем нагружать лишним (пока) кодом? Если еще никому это не пригодилось.
Понимаешь, иногда заранее известно, какие ситуации могут произойти и лучше их сразу учесть в коде, а не ждать, пока кто-нибудь начнет жаловаться. Особенно, если ты позиционируешь это как готовое решение.
Back to top
View user's profile Send private message Send e-mail
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 268
   поощрить/наказать

Location: Питер

PostPosted: Fri Jun 19, 2009 1:13 pm (спустя 17 минут; написано за 1 минуту 1 секунду)
   Post subject:
Reply with quote

Александр Михалицын
Вся штука в том, что никто ничего писать тебе не будет. Не заработает - прежде всего начнут испытывать другие либы и только потом общаться с автором. Если уж очень-очень-очень надо...
Back to top
View user's profile Send private message
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 83
   поощрить/наказать


PostPosted: Fri Jun 19, 2009 1:36 pm (спустя 22 минуты; написано за 45 секунд)
   Post subject:
Reply with quote

Quote:
Понимаешь, иногда заранее известно, какие ситуации могут произойти и лучше их сразу учесть в коде, а не ждать, пока кто-нибудь начнет жаловаться.
Ребят. Вы че накинулись. (-: Блин, проверка на status == 200 даже в JsHttpRequest сделана и все ок у людей робит, а у меня вдруг неверно стало. :D
Back to top
View user's profile Send private message Send e-mail
69
Guest





Карма: 388
   поощрить/наказать


PostPosted: Fri Jun 19, 2009 5:52 pm (спустя 4 часа 16 минут; написано за 1 минуту 40 секунд)
   Post subject:
Reply with quote

Позанудствую все же.
Это существенно
Code (JavaScript): скопировать код в буфер обмена
        include = function(url)        {
                try {
                        require(url);
                } catch(e) {
                        if (e instanceof ScriptLoadError)
                                log(e.toString());
                        else
                                throw e;
                }
        }
Back to top
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 83
   поощрить/наказать


PostPosted: Fri Jun 19, 2009 6:10 pm (спустя 17 минут; написано за 1 минуту 31 секунду)
   Post subject:
Reply with quote

69,
да, это баг.
Версия v.1.2

З.Ы. Почему вы не регестрируетесь?


include.zip
 Description:

Download
 Filename:  include.zip
 Filesize:  1.28 KB
 Downloaded:  231 Time(s)

Back to top
View user's profile Send private message Send e-mail
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML