1. C# / Говнокод #17089

    +134

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    91. 91
    92. 92
    93. 93
    94. 94
    95. 95
    96. 96
    class ParametersArray
    {
            ...
            /// <summary>
            /// Копирующей конструктор (создает копию коллекции)
            /// </summary>
            /// <param name="prs">Коллекция на основе, которой будет создаваться копия</param>
            public ParametersArray(ParametersArray prs)
            {
                paParameters = new ArrayList();
                for (int i = 0; i < prs.Count; i++)
                {
                    Parameter p = new Parameter(prs[i]);
                    paParameters.Add(p);
                }
            }
            ...
            #region Внутренние состояния
    
            /// <summary>
            /// Внутреннее поле - массив параметров
            /// </summary>
            private ArrayList paParameters;
    
            /// <summary>
            /// Внутреннее поле – идентификатор операции, к которой относятся параметры
            /// </summary>
            private string paOperationId = "";
    
            #endregion
            /// <summary>
            /// Удаляет параметр из коллекции
            /// </summary>
            /// <param name="parameterId">Идентификатор параметра</param>
            public void Delete(string parameterId)
            {
                ArrayList list = new ArrayList();
    
                foreach (Parameter prt in paParameters)
                {
                    if (prt.Id.Trim() != parameterId.Trim())
                    {
                        list.Add(prt);
                    }
                }
                paParameters = list;
            }
        }
    }
    
    ...
    
      /// <summary>
      /// Класс для поиска и обработки шаблонов в параметрах операций
      /// </summary>
      public class Parser
      {
        ...
        #region Конструкторы
    
        /// <summary>
        /// Конструктор инициализирующей класс
        /// </summary>
        /// <param name="requestUserId">ID пользователя, который используется для обработки шаблона ##USER()</param>
        public Parser(string requestUserId)
        {
          pParameters = null;
          pUserId = requestUserId;
        }
    
        #endregion
    
        #region Внешние методы
    
        /// <summary>
        /// Метод перебирает все параметры операции, ищет там шаблоны и заменяет их значениями
        /// </summary>
        /// <param name="opr">Операция</param>
        /// <returns>Операция с обработанными шаблонами</returns>
        public Operation Parse(Operation opr)
        {
          pParameters = new ParametersArray(opr.Parameters);
    
          for (int i = 0; i < pParameters.Count; i++)
            if (FindTemplate(pParameters[i]))
            {
              ReplaceTemplate(pParameters[i]);
    
              //Удаляет параметр с ошибкой
              if (pParameters[i].Value == "parse err")
                pParameters.Delete(pParameters[i].Id);
            }
    
          opr.Parameters = new ParametersArray(pParameters);
          return opr;
        }

    Внимание привлекает код в строках 81-95

    В строке 81-82 мы создаём временную копию параметров операции opr во внутреннем поле класса Parser. Прекрасно. Ещё раз - в публичном в методе инициализируем внутреннее поле (Классный side effect - поле используется в других методах).

    В строке 91 удаляет элемент из внутренней коллекции, пересоздавая коллекцию целиком, то есть требования к памяти временно удваиваются на выходе из метода Delete (до очистки памяти). В методе Delete. Да. Супер.
    потом инициализируем вновь созданной коллекцией публичное поле Parameters во входящем параметре opr метода Delete.

    P.S.: Диагноз - хроническая форма неизлечимой Java. Во первых, автор этих строк искренне думает, что в природе ничего, кроме коллекции ArrayList, не существует. Во вторых, для удаления элемента коллекции мы пересоздаём всю коллекцию целиком, то есть видимо искренне полагая, что коллекция ArrayList - immutable, как и все поля класса Parser (типа ParametersArray) равно как и поле класса ParametersArray (типа ArrayList). Занавес.

    Говнокодище.

    hack2root, 10 Ноября 2014

    Комментарии (7)
  2. PHP / Говнокод #17088

    +158

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    <?php
    	public function clearCache() {
    		if(method_exists('regedit', 'getControllerHost')) {
    			$host = regedit::getControllerHost(true);
    			if(!is_null($host)){
    				$host->cacheClear();
    			} else {
    				$sDir = rtrim(mainConfiguration::getInstance()->includeParam('system.static-cache'), '/');
    				if(getServer('WINDIR') || getServer('windir')){
    					$arDirs = glob($sDir . '/*');
    					foreach($arDirs as $item){
    						$item = rtrim($item, "\\/ ") . "/";
    						exec("rd /s /q $item");
    					}
    				} else {
    					exec("rm -rf $sDir/*");
    				}
    			}
    		} else {
    			$sDir = rtrim(mainConfiguration::getInstance()->includeParam('system.static-cache'), '/');
    			if(getServer('WINDIR') || getServer('windir')) {
    				$arDirs = glob($sDir . '/*');
    				foreach($arDirs as $item) {
    					$item = rtrim($item, "\\/ ") . "/";
    					exec("rd /s /q $item");
    				}
    			} else {
    				exec("rm -rf $sDir/*");
    			}
    		}
    	}

    Найди два отличия.

    Elfet, 10 Ноября 2014

    Комментарии (22)
  3. Си / Говнокод #17087

    +135

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    main(){    
        
        FILE *filein, *fileout;
        
        char fname1[15], fname2[15];
        int n, m;
        int i, j;
        
        printf("Enter name of input file: "); scanf("%s", &fname1);
        printf("Enter name of output file: "); scanf("%s", &fname2);
        
        filein=fopen(fname1, "r");
        fileout=fopen(fname2, "w");
        if(filein==NULL){
          fprintf(stderr, "\nError: can't open file \"%s\"\n\n", fname1);
          fclose(filein);
          fclose(fileout);
          getch();
          }
        else{
             fscanf(filein, "%d%d", &n, &m);
             char ch[m][n];
             int array[m][n];
             int V[m][n];
             
             for(i=0;i<m;i++){
                for(j=0;j<n;j++){
                   V[i][j]=0;
                   }
                }
             
             for(i=0;i<m;i++){
                for(j=0;j<n;j++){
                   fscanf(filein, "%s", &ch[i][j]);
                   if(ch[i][j]=='+') array[i][j]=1;
                   else if(ch[i][j]=='-') array[i][j]=0;
                   }
                }
             
             int sum;
             for(i=0;i<m;i++){
                sum=0;
                for(j=0;j<n;j++){
                   sum+=array[i][j];
                   }
                   if(sum==1){
                             for(j=0;j<n;j++){
                                V[i][j]=array[i][j];
                                }
                             }
                   else continue;
                }
                
             int mm=0, c;
             for(i=0;i<m;i++){
                for(j=0;j<n;j++){
                   mm+=V[i][j];
                   }
                }
             c = m-mm;
             
             int VoteArray[n];
             
             for(j=0;j<n;j++){
                sum=0;
                for(i=0;i<m;i++){
                   sum+=V[i][j];
                   VoteArray[j]=sum;
                   }
                }
             
             float percent[n];
             float per;
             per = 100/(float)c;
             for(i=0;i<n;i++){
                
                if((percent[i]=per*VoteArray[i])>=7.0) fprintf(fileout, "%d ", i+1);
                }
                
             }
        
        fclose(fileout);
        fclose(filein);
        puts("\nMission comleted\nPress any key...\n");
        getch();
    }

    Фу, блять

    Sushev, 09 Ноября 2014

    Комментарии (25)
  4. PHP / Говнокод #17085

    +157

    1. 1
    2. 2
    3. 3
    4. 4
    foreach ($account->lists as $list) {
    print "LIST Name: " . $list->name; echo '&nbsp'; echo '&nbsp'; echo '&nbsp'; print "LIST Id: " . $list->id;
    echo "<br>";
    }

    Не говоря о том, что особой разницы между print и echo в ПХП нет, стоит отметить, что после «nbsp» пропущены точки с запятыми и всё тело этого фора можно было бы вывести одной строчкой.

    KEKC, 08 Ноября 2014

    Комментарии (44)
  5. PHP / Говнокод #17083

    +158

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    <?php
    /* В настройках кабинета необходимо указать "Проверять md5 на ссылках",
    чтобы нельзя было заплатить сумму отличную от заданной в переменной $summa */
    $summa=50; //Стоимость доступа к платному разделу, в рублях
    $period=60*60*24*2; //Время доступа, в секундах (60 секунд * 60 минут * 24 часа * 2 суток = 172800 секунд). Исчисляется от времени поступления оплаты за код доступа.
    $login='demo1'; //Ваше "Имя пользователя" (логин) в системе Onpay.ru
    $key='a2su3ig8y'; //Ваш "Секретный пароль для API IN" в системе Onpay.ru
    /* Для того, чтобы закрыть доступ к папке, данный код необходимо размещать в индексном файле (index.php) */
    $path='http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']; //Путь к файлу с этим кодом (определяется автоматически), например: http://onpay.ru/dir/index.php
    $access=0; //Запрещаем доступ, по умолчанию (0 = доступ закрыт, 1 = доступ открыт)
    $code='';
    $error='';
    //Функция округления для md5
    function to_float($sum) {
    if (strpos($sum, ".")) {$sum=round($sum,2);}
    else {$sum=$sum.".0";}
    return $sum;
    }
    /* Подключаемся к базе данных, если нажали на кнопку оплатить или ввели код доступа */
    if(isset($_POST['pay']) || isset($_POST['code'])) {
    $db_host='localhost'; //Хост сервера базы данных (домен или IP-адрес)
    $db_user='root'; //Имя пользователя БД
    $db_pass=''; //Пароль БД
    $db_name='pays'; //Название базы данных
    $db_tabl='payments'; //Название таблицы в которой будут храниться платежи
    if(!mysql_connect($db_host, $db_user, $db_pass)) {echo 'Невозможно подключиться к серверу баз данных';exit;} //Подключение к серверу баз данных
    if(!mysql_select_db($db_name)) {echo 'Не получилось выбрать базу данных '.$db_name;exit;} //Выбор базы данных
    }
    /* Разбираем данные, отправленные через форму*/
    if(isset($_POST['pay'])) { //Если нажали на кнопку покупки кода, то генерируем код, сохраняем его в базу данных и выводим форму оплаты:
    if(is_numeric($summa)) { //Если сумма введена корректно
    $sql = "INSERT INTO $db_tabl SET ".
    "path='$path',".
    "sum='$summa',".
    "payed=0,".
    "date=".time().",".
    "ip='".$_SERVER['REMOTE_ADDR']."';"; //Запрос в базу данных на создание новой записи
    $result=mysql_query($sql); //Добавляем новую строку в базу данных
    if($result) { //Если сохранено в базу данных без ошибок
    $id=mysql_insert_id(); //Получаем id записи
    $code=$id.substr(time(),-7); //Создаем секретный код - соединяем уникальный номер строки в базе данных (id) и последние 7 знаков текущего времени в секундах (коды доступа не должны повторяться)
    $sql = "UPDATE $db_tabl SET code='$code' WHERE id='$id';"; //Запрос в базу данных, для добавления кода доступа
    $result=mysql_query($sql); //Сохраняем код в базу данных
    if($result) { //Если сохранено в базу данных без ошибок
    $sum_for_md5=to_float($summa);
    $md5check=md5("fix;$sum_for_md5;RUR;$code;yes;$key"); //Создаем проверочную строку, которая защищает платежную ссылку от изменений
    $url="http://secure.onpay.ru/pay/$login?pay_mode=fix&pay_for=$code&price=$summa&currency=RUR&convert=yes&md5=$md5check&url_success=".$path; //Формируем платежную ссылку
    /*Выводим код*/
    ?><p style="font-size:14pt;color:blue;">Ваш код доступа: <b><?=$code; //Выводим код ?></b> (сохраните его в надежном месте)<?php
    /*Выводим форму оплаты*/
    ?><h1><a target="_blank" href="<?=$url; //Выводим платежную ссылку ?>">Оплатить код доступа:</a></h1>
    <iframe src="<?=$url; //Выводим платежную ссылку ?>" width="195" height="600" frameborder=no scrolling=no></iframe><?php
    } else unset($_POST['pay']); //Удаляем элемент массива (чтобы выводилась кнопка покупки кода)
    } else unset($_POST['pay']);
    } else unset($_POST['pay']); //Конец условия if(is_numeric($summa)) { //Если сумма введена корректно
    } elseif(isset($_POST['code'])) { //Если ввели код, то проверяем его в базе данных и если верный, то сохраняем в COOKIE
    $code=intval($_POST['code']); //Код должен быть целым числом
    $sql = "SELECT * FROM $db_tabl WHERE code='$code' AND path='$path' AND payed>=sum AND date>=".time().";"; //Проверка кода
    $result=mysql_query($sql); //Сохраняем код в базу данных
    if($result) { //Если сохранено в базу данных без ошибок
    if($row=mysql_fetch_assoc($result)) { //Если в базе данных найдена строка с введенным кодом для данной директории и он не просрочен, то сохраняем код
    $access=1; //Разрешаем доступ
    } else $error='Введен неправильный код доступа.';
    }
    } //
    if($access == 0) { //Если доступ запрещен, то выводим форму для покупки или ввода оплаченного кода
    ?><p style="font-size:14pt;font-weight:bold;">Доступ закрыт.<?php
    ?><p style="font-size:14pt;font-weight:bold;color:red;"><?=$error; //Выводим ошибки?><?php
    if(!isset($_POST['pay'])) { //Если не выведена форма оплаты
    ?><form method="POST" action="<?=$path; //Выводим путь на который будет отправлена форма (на текущую страницу) ?>">
    <input style="font-size:16pt;font-weight:bold;color:red;" type="submit" name="pay" value="Купить доступ до <?=date('H:i:s d.m.Y',time()+$period); //Выводим дату ?> всего за <?=$summa; //Выводим сумму ?>&nbsp;руб.">
    </form><?php
    }
    ?><p><form method="POST" action="<?=$path; //Выводим путь на который будет отправлена форма (на текущую страницу) ?>">
    <input style="font-size:14pt;" type="text" name="code" value="<?=$code; //Выводим текущий код доступа, при его наличии ?>">
    <input style="font-size:14pt;" type="submit" value="Ввести оплаченный код доступа">
    </form><?php
    exit; //Прекращаем выполнение скрипта и выходим
    /*Все, что расположено ниже этой строки - не выводится без верного кода доступа. */
    } //Конец условия if($access == 0) { if(isset($_POST['pay'])) {
    ?>
    <h1>Доступ по коду <u><?=$row['code'];?></u> разрешен до <?=date('H:i:s d.m.Y',$row['date']);?></h1>
    <p>Получено: <?=$row['payed'];?>&nbsp;руб.
    <p>Цена продления: <?=$row['sum'];?>&nbsp;руб.
    <p>onpay_id: <?=$row['onpay_id'];?>
    <p><a href=" <?=$row['path'];?>">Секретная ссылка</a>

    Автор задал на тостере вопрос: "я читал про куки но ничего не понял, дайте готовое решение что бы использовать с моим кодом"

    dentelis, 08 Ноября 2014

    Комментарии (32)
  6. PHP / Говнокод #17082

    +160

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    if (isset($_GET['page'])) {
    	include "pages/index.php";
    }
    if (isset($_GET['accounts'])) {
    	include "pages/allacc.php";
    }
    if (isset($_GET['gold'])) {
    	include "pages/gold.php";
    }
    if (isset($_GET['send'])) {
    	include "pages/send.php";
    }
    if (isset($_GET['gm'])) {
    	include "pages/gm.php";
    }
    if (isset($_GET['ban'])) {
    	include "pages/ban.php";
    }
    if (isset($_GET['chat'])) {
    	include "pages/chat.php";
    }
    if (isset($_GET['tw'])) {
    	include "pages/tw.php";
    }
    if (isset($_GET['server'])) {
    	include "pages/server.php";
    }
    if (isset($_GET['logs'])) {
    	include "pages/logs.php";
    }
    if (isset($_GET['live_chat'])) {
    	include "pages/live_chat.php";
    }
    if (isset($_GET['chars'])) {
    	include "pages/chars.php";
    }
    
    
    //Functions
    if (isset($_GET['Acc_Change'])) {
    	
    	if (isset($_POST['SaveChange'])) {
    		$iwp->SaveUserToMysql(strtolower($_POST['name']), strtolower($_POST['pass']), strtolower($_POST['email']), $_POST['PassType']);
    	}
    	if (isset($_POST['DeleteAcc'])) {
    		echo "<script>alert('Вы точно хотите удалить этот аккаунт?');location.href='index.php?Acc_Change&DeleteYes=$_POST[AccID]';</script>";
    	}
    	if (isset($_GET['DeleteYes'])) {
    		mysql_query("DELETE FROM users WHERE ID=$_GET[DeleteYes]");
    		echo "<script>alert('Аккаунт успешно удален');location.href='index.php?accounts';</script>";
    	}
    	include "pages/acc_change.php";
    }
    
    if (isset($_GET['Give_Gold'])) {
    	if(isset($_POST['GiveGold'])) {
    		$iwp->GiveGold($_POST['GoldID'], $_POST['GoldNum'], "user");
    	}
    	if(isset($_POST['GoldWhoOnline'])) {
    		$iwp->GiveGold(null, $_POST['AllGold'], "online");
    	}
    	if(isset($_POST['GoldAll'])) {
    		$iwp->GiveGold(null, $_POST['AllGolds'], "all");
    	}
    }

    http://kn1fe-zone.ru/index.php?threads/iwp-veb-panel-upravlenija-serverom.10/#post-1554
    Автор называет это ООП.
    Полный архив — https://www.dropbox.com/s/gpdge94t0jv9hl9/IWP%2806.08.2014%29pre.rar?dl=0
    Можно просматривать для успокоения души своей перед сном.

    DesmondHume, 07 Ноября 2014

    Комментарии (10)
  7. PHP / Говнокод #17081

    +155

    1. 1
    2. 2
    list($usec, $sec) = explode(' ', microtime());
    $s2_start = ((float)$usec + (float)$sec);

    О первом параметре функции microtime не слыхали?
    http://s2cms.ru/trac/browser/trunk/index.php#L11

    Интересное замечание: hook'и копипастом подключаются

    ($hook = s2_hook('idx_pre_redirect')) ? eval($hook) : null;
    // …
    ($hook = s2_hook('idx_pre_rss')) ? eval($hook) : null;
    // …
    $return = ($hook = s2_hook('idx_get_content')) ? eval($hook) : null;
    // и так еще 4 раза

    Функцию надо.

    volter9, 07 Ноября 2014

    Комментарии (38)
  8. JavaScript / Говнокод #17080

    +161

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    for (var i=0; i<snake.length-25; ++i) {
        if (checkTouch(snake[i], newHead)) {
            state = "gameover";
            return;
        }
    }

    В приступе ностальгии портанул свой старый говнокодец с турбопасцаля на жс.

    Погамать можно тут: http://bormand.tk/snake/

    bormand, 07 Ноября 2014

    Комментарии (337)
  9. C# / Говнокод #17079

    +1

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    int i=1;
    Console.WriteLine((i+null)==null); //True			
    Console.WriteLine(1+null);             //1
    Console.WriteLine(null+1);             //1
    Console.WriteLine((1+null).GetType()); //System.Int32

    http://ideone.com/LomfRC

    3.14159265, 07 Ноября 2014

    Комментарии (12)
  10. Куча / Говнокод #17078

    +136

    1. 1
    2. 2
    -#location=Location
    +location=Localisation

    Прилетел коммит с обновлением французской локализации, а там такое.

    someone, 07 Ноября 2014

    Комментарии (2)