Перейти к публикации
  • Сейчас на странице   Всего пользователей: 3   (1 пользователь, 2 гостя)

Rooster

Программирование[11]

var  

286 пользователей проголосовало

У вас нет прав на голосование в этом опросе, или на просмотр результатов опроса. Пожалуйста, войдите или зарегистрируйтесь для голосования в опросе.

Рекомендованные сообщения

 

Zellar написал 14 часов назад:

"Даже конченный дебил который по кд сидит в топике обсуждение хохлов, стал фуллстек тимлидом" и там ебало рустера. По моему ахуенная рекламная компания говнокурсов

iMbanana написал 22 часа назад:

ну кстати в сити у меня было пиздатое рабочее место
даже пианино разрешили привезти

  p

p.jpg.b80d816232c43961b58cc5e0017397b9.jpg

 

Реально пиздатое место. Монитор какой то дешманский, где даже подставка по высоте не настраивается что приходится книгу подкладывать, разьебанный стул и сидишь почти впритык к другому челу.  Зато макпук, плейстейшон и пианино. Я думаю ты выглядишь как примерно такой чел:

image.png.172e60b918d861c62a091318fce25d60.png

чел тебе бы прокапаться или мб кофе не попить недельку


[14:22:31] Сиэль: oh uj eti imbanani

Поделиться сообщением


Ссылка на сообщение

Ну он по факту в целом написал

Пианино есть, но заместо кронштейна с монитором мониторо заменитель, еще и один. А заместо компуктера, мак.


ward написал 04.01.2022 в 02:54:

Hades для стада долбоебичей которые прокликивали Дэш и думали ебать они в артхаузнвй рогалик играют, не такие как все.

mazt3r написал 20.09.2019 в 11:27:

ласт оф ас - хуета для лисят и прочих мальчиков с вагиной между ног.

 

Поделиться сообщением


Ссылка на сообщение
besteady написал 13.07.2023 в 15:29:

Москоу сити вообще хуйня как офис неудобная

так башенки красивые, плюс в шаговой доступности все топ сервисы и блага цивилизации, заебись же
ночью вид ахуенный

Поделиться сообщением


Ссылка на сообщение
an7th3r написал 1 час назад:

плюс в шаговой доступности все топ сервисы

мне казалось там спускаться с этажа + идти до ближайших территорий (например парка) минут 15-20

MacJei и iMbanana понравилось это

 

очень крутые котейки

RqvSzvr.png


Кому-то пизды дал - нужно сделать скрин обязательно. (с) Solo

Поделиться сообщением


Ссылка на сообщение

три дня в офис гоняю на неделе

имею два 2к ипс моника, м1 про, логитековские беспроводные клаво-мыши и подставка под запястье:avtoradolf:


ASCFR.gif

Поделиться сообщением


Ссылка на сообщение
sol1tary написал 1 час назад:

подставка под запястье

ебать

вот это уровенть

не ну вы видели?

даже подставка за 10$ у него есть. ахуеть


 

очень крутые котейки

RqvSzvr.png


Кому-то пизды дал - нужно сделать скрин обязательно. (с) Solo

Поделиться сообщением


Ссылка на сообщение

У нас ещё плед был, чтобы можно было вот так смотреть на компиляцию: :teplolampovo:


 

9Aa4jVY.jpeg

IFVau8G.png

AohP0ps.png

Поделиться сообщением


Ссылка на сообщение
Rilay написал 06.07.2023 в 20:30:

мне намного легче решать задачу с 0, а не доделывать/продолжать за кем то, мне чет оч тяжко дается вникнуть в чужое 

участь быдлокодера это 90% времени читать чужой говнокод, это основной навык (умение жрать собачье дерьмо)

CriErr понравилось это

:zatrolka_tupostu::zatrolka_tupostu::zatrolka_tupostu::zatrolka_tupostu::zatrolka_tupostu::zatrolka_tupostu::zatrolka_tupostu::zatrolka_tupostu::zatrolka_tupostu::zatrolka_tupostu::zatrolka_tupostu::zatrolka_tupostu::zatrolka_tupostu::zatrolka_tupostu::zatrolka_tupostu:

:zatrolka_tupostu::zatrolka_tupostu::zatrolka_tupostu:    всё что пишу -- шизофренический бред     :zatrolka_tupostu::zatrolka_tupostu::zatrolka_tupostu:

:zatrolka_tupostu::zatrolka_tupostu::zatrolka_tupostu::zatrolka_tupostu::zatrolka_tupostu::zatrolka_tupostu::zatrolka_tupostu::zatrolka_tupostu::zatrolka_tupostu::zatrolka_tupostu::zatrolka_tupostu::zatrolka_tupostu::zatrolka_tupostu::zatrolka_tupostu::zatrolka_tupostu:

Поделиться сообщением


Ссылка на сообщение
E1azor said 1 hour ago:
Rilay said On 7/6/2023 at 6:30 AM:

мне намного легче решать задачу с 0, а не доделывать/продолжать за кем то, мне чет оч тяжко дается вникнуть в чужое 

участь быдлокодера это 90% времени читать чужой говнокод, это основной навык (умение жрать собачье дерьмо)

Я тут недавно открыл кодовую базу одного из проектов, охуел и закрыл. 


Saying that Java is nice because it works on all OS's is like saying that anal sex is nice because it works on all genders.
 

Поделиться сообщением


Ссылка на сообщение
besteady написал 23 часа назад:

У нас ещё плед был, чтобы можно было вот так смотреть на компиляцию: :teplolampovo:

а кто за химчисткой следил?

Поделиться сообщением


Ссылка на сообщение
(изменено)

 

Поцы, помогите по JavaScript пожалуйста!
Есть короче код, это упрощённая версия из тестового задания, которая на хх.ру там какая-то компания предлагает выполнить, уже 2 года подряд натыкаюсь на неё, мб даже кто-то сталкивался.

 

Я чисто для себя по приколу хочу подразобраться, там короче чё-то потоки/очереди я в этом нихуя не понимаю.

 

Короче нужно реализовать функцию executor, там перебирать таски и выполнять их в нескольких потоках:

  Code
const sleep = async (ms = 0) => new Promise(r => setTimeout(r, ms))

const tasks = [
  { id: 1, time: 300 },
  { id: 2, time: 100 },
  { id: 3, time: 500 },
  { id: 4, time: 100 },
]

const iteratorTasks = {
  [Symbol.asyncIterator]() {
    let index = 0
    let done = false
    return {
      async next() {
        await sleep(100)
        const task = tasks[index++]
        done = task === undefined
        return {
          value: task,
          done: done
        }
      }
    }
  }
}


const executeTask = async (task) => {
  await sleep(task.time)
  return task.id
}


const executor = async (tasks, threads = 0) => {

  // Реализация...
  
};



const start = performance.now()

executor(iteratorTasks).then((result) => {
  console.log('Result: ', result)
  const end = performance.now() - start
  console.log('Executing time: ', +end.toFixed(0))
  console.log('Expected time: ~ ', 600)
})
  Подробней

 

Функция executor принимает tasks, threads

tasks - это не массив,  это Async Iterable хуетень, работает почти как обычные итераторы, ток задачи могут поступать асинхронно.

  Пример использования - 1
const executor = async (tasks, threads = 0) => {
  
  // Итерация происходит раз в 100ms (в данном случае)
  // но суть в том что это не простой перебор массива,
  // а перебор который подразумевает задержки на неопределённое время между итерациями
  
  for await (const task of tasks) { 
    console.log(task)
  }
  
};

 

  Пример использования - 2
const executor = async (tasks, threads = 0) => {

  // Использование как итератор
  // В интернетах где я смотрел используют только for await ... of, но так тоже работает
  const iterator = tasks[Symbol.asyncIterator]()
  const result = await iterator.next()
  result.value // task
  result.done  // true || false


  // Можно перебирать в цикле как обычный итератор
  while (true) {
    const { value: task, done } = await iterator.next()

    if (done) {
      break
    }

    console.log(task)
  }
};

 

 

 

threads - кол-во потоков соответственно, в которых нужно выполнять задачи максимально быстро! Как только какой-либо освободился, туда хуячим новую задачу.

  Пример того, что нужно

Допустим есть 2 потока и 4 задачи

 

const threads = 2

 

const tasks = [

  { id: 1, time: 300 },

  { id: 2, time: 100 },

  { id: 3, time: 500 },

  { id: 4, time: 100 },

]

 

Пришла 1-ая, хуйнули в первый поток 300ms

Пришла 2-ая, хуйнули во второй поток 100ms

Пришла 3-ья, ждём пока какой-нить поток освободится быстрее (в данном случае 2-ой) и хуячим туда.

Ну и по такому принципу все остальные. Это вроде очереди называется в программировании))

 

 

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

 

Основная мысль в чём:

Функция постепенно получает задачи (перебирает tasks)  и параллельно с этим выполняет их в скольких-то потоках.

 

  Пример реализации в синхронном порядке без потоков.
const executor = async (tasks, threads = 0) => {

    for await(const task of tasks) { // Ждём пока придёт задача
      await executeTask(task) // Задача пришла, ждём пока выполнится
    }
    // Цикл будет крутиться пока все задачи не будут выполнены.
    
    // Функция завершается, после того как все задачи были получены и выполнены.
    return;
};

 

 
  Или так
const executor = async (tasks, threads = 0) => {
    const promises = []
  
    for await (const task of tasks) { // Ждём пока придёт задача
      const executingTask = executeTask(task) // Отравляем задачу на выполнение, не ждём пока выполнится
      promises.push(executingTask)
    }
    
    // Тут ждём пока выполнятся все задачи
    await Promise.all(promises)
    return;
};

 

 



 

 

 

 

 


 

 

 

 

 


Изменено пользователем By sees
---

Поделиться сообщением


Ссылка на сообщение
By sees said 43 minutes ago:

 

Поцы, помогите по JavaScript пожалуйста!
Есть короче код, это упрощённая версия из тестового задания, которая на хх.ру там какая-то компания предлагает выполнить, уже 2 года подряд натыкаюсь на неё, мб даже кто-то сталкивался.

 

Я чисто для себя по приколу хочу подразобраться, там короче чё-то потоки/очереди я в этом нихуя не понимаю.

 

Короче нужно реализовать функцию executor, там перебирать таски и выполнять их в нескольких потоках:

  Code

const sleep = async (ms = 0) => new Promise(r => setTimeout(r, ms))

const tasks = [
  { id: 1, time: 300 },
  { id: 2, time: 100 },
  { id: 3, time: 500 },
  { id: 4, time: 100 },
]

const iteratorTasks = {
  [Symbol.asyncIterator]() {
    let index = 0
    let done = false
    return {
      async next() {
        await sleep(100)
        const task = tasks[index++]
        done = task === undefined
        return {
          value: task,
          done: done
        }
      }
    }
  }
}


const executeTask = async (task) => {
  await sleep(task.time)
  return task.id
}


const executor = async (tasks, threads = 0) => {

  // Реализация...
  
};



const start = performance.now()

executor(iteratorTasks).then((result) => {
  console.log('Result: ', result)
  const end = performance.now() - start
  console.log('Executing time: ', +end.toFixed(0))
  console.log('Expected time: ~ ', 600)
})
  Подробней

 

Функция executor принимает tasks, threads

tasks - это не массив,  это Async Iterable хуетень, работает почти как обычные итераторы, ток задачи могут поступать асинхронно.

  Пример использования - 1

const executor = async (tasks, threads = 0) => {
  
  // Итерация происходит раз в 100ms (в данном случае)
  // но суть в том что это не простой перебор массива,
  // а перебор который подразумевает задержки на неопределённое время между итерациями
  
  for await (const task of tasks) { 
    console.log(task)
  }
  
};

 

  Пример использования - 2

const executor = async (tasks, threads = 0) => {

  // Использование как итератор
  // В интернетах где я смотрел используют только for await ... of, но так тоже работает
  const iterator = tasks[Symbol.asyncIterator]()
  const result = await iterator.next()
  result.value // task
  result.done  // true || false


  // Можно перебирать в цикле как обычный итератор
  while (true) {
    const { value: task, done } = await iterator.next()

    if (done) {
      break
    }

    console.log(task)
  }
};

 

 

 

threads - кол-во потоков соответственно, в которых нужно выполнять задачи максимально быстро! Как только какой-либо освободился, туда хуячим новую задачу.

  Пример того, что нужно

Допустим есть 2 потока и 4 задачи

 

const threads = 2

 

const tasks = [

  { id: 1, time: 300 },

  { id: 2, time: 100 },

  { id: 3, time: 500 },

  { id: 4, time: 100 },

]

 

Пришла 1-ая, хуйнули в первый поток 300ms

Пришла 2-ая, хуйнули во второй поток 100ms

Пришла 3-ья, ждём пока какой-нить поток освободится быстрее (в данном случае 2-ой) и хуячим туда.

Ну и по такому принципу все остальные. Это вроде очереди называется в программировании))

 

 

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

 

Основная мысль в чём:

Функция постепенно получает задачи (перебирает tasks)  и параллельно с этим выполняет их в скольких-то потоках.

 

  Пример реализации в синхронном порядке без потоков.

const executor = async (tasks, threads = 0) => {

    for await(const task of tasks) { // Ждём пока придёт задача
      await executeTask(task) // Задача пришла, ждём пока выполнится
    }
    // Цикл будет крутиться пока все задачи не будут выполнены.
    
    // Функция завершается, после того как все задачи были получены и выполнены.
    return;
};

 

 
  Или так

const executor = async (tasks, threads = 0) => {
    const promises = []
  
    for await (const task of tasks) { // Ждём пока придёт задача
      const executingTask = executeTask(task) // Отравляем задачу на выполнение, не ждём пока выполнится
      promises.push(executingTask)
    }
    
    // Тут ждём пока выполнятся все задачи
    await Promise.all(promises)
    return;
};

 

 



 

 

 

 

 


 

 

 

 

 

 

скока платят ?


Saying that Java is nice because it works on all OS's is like saying that anal sex is nice because it works on all genders.
 

Поделиться сообщением


Ссылка на сообщение
By sees написал 6 часов назад:

 

Поцы, помогите по JavaScript пожалуйста!
Есть короче код, это упрощённая версия из тестового задания, которая на хх.ру там какая-то компания предлагает выполнить, уже 2 года подряд натыкаюсь на неё, мб даже кто-то сталкивался.

 

Я чисто для себя по приколу хочу подразобраться, там короче чё-то потоки/очереди я в этом нихуя не понимаю.

 

Короче нужно реализовать функцию executor, там перебирать таски и выполнять их в нескольких потоках:

  Code

const sleep = async (ms = 0) => new Promise(r => setTimeout(r, ms))

const tasks = [
  { id: 1, time: 300 },
  { id: 2, time: 100 },
  { id: 3, time: 500 },
  { id: 4, time: 100 },
]

const iteratorTasks = {
  [Symbol.asyncIterator]() {
    let index = 0
    let done = false
    return {
      async next() {
        await sleep(100)
        const task = tasks[index++]
        done = task === undefined
        return {
          value: task,
          done: done
        }
      }
    }
  }
}


const executeTask = async (task) => {
  await sleep(task.time)
  return task.id
}


const executor = async (tasks, threads = 0) => {

  // Реализация...
  
};



const start = performance.now()

executor(iteratorTasks).then((result) => {
  console.log('Result: ', result)
  const end = performance.now() - start
  console.log('Executing time: ', +end.toFixed(0))
  console.log('Expected time: ~ ', 600)
})
  Подробней

 

Функция executor принимает tasks, threads

tasks - это не массив,  это Async Iterable хуетень, работает почти как обычные итераторы, ток задачи могут поступать асинхронно.

  Пример использования - 1

const executor = async (tasks, threads = 0) => {
  
  // Итерация происходит раз в 100ms (в данном случае)
  // но суть в том что это не простой перебор массива,
  // а перебор который подразумевает задержки на неопределённое время между итерациями
  
  for await (const task of tasks) { 
    console.log(task)
  }
  
};

 

  Пример использования - 2

const executor = async (tasks, threads = 0) => {

  // Использование как итератор
  // В интернетах где я смотрел используют только for await ... of, но так тоже работает
  const iterator = tasks[Symbol.asyncIterator]()
  const result = await iterator.next()
  result.value // task
  result.done  // true || false


  // Можно перебирать в цикле как обычный итератор
  while (true) {
    const { value: task, done } = await iterator.next()

    if (done) {
      break
    }

    console.log(task)
  }
};

 

 

 

threads - кол-во потоков соответственно, в которых нужно выполнять задачи максимально быстро! Как только какой-либо освободился, туда хуячим новую задачу.

  Пример того, что нужно

Допустим есть 2 потока и 4 задачи

 

const threads = 2

 

const tasks = [

  { id: 1, time: 300 },

  { id: 2, time: 100 },

  { id: 3, time: 500 },

  { id: 4, time: 100 },

]

 

Пришла 1-ая, хуйнули в первый поток 300ms

Пришла 2-ая, хуйнули во второй поток 100ms

Пришла 3-ья, ждём пока какой-нить поток освободится быстрее (в данном случае 2-ой) и хуячим туда.

Ну и по такому принципу все остальные. Это вроде очереди называется в программировании))

 

 

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

 

Основная мысль в чём:

Функция постепенно получает задачи (перебирает tasks)  и параллельно с этим выполняет их в скольких-то потоках.

 

  Пример реализации в синхронном порядке без потоков.

const executor = async (tasks, threads = 0) => {

    for await(const task of tasks) { // Ждём пока придёт задача
      await executeTask(task) // Задача пришла, ждём пока выполнится
    }
    // Цикл будет крутиться пока все задачи не будут выполнены.
    
    // Функция завершается, после того как все задачи были получены и выполнены.
    return;
};

 

 
  Или так

const executor = async (tasks, threads = 0) => {
    const promises = []
  
    for await (const task of tasks) { // Ждём пока придёт задача
      const executingTask = executeTask(task) // Отравляем задачу на выполнение, не ждём пока выполнится
      promises.push(executingTask)
    }
    
    // Тут ждём пока выполнятся все задачи
    await Promise.all(promises)
    return;
};

 

 



 

 

 

 

 


 

 

 

 

 

 

Спроси у чатжипити, тебе по сути нужно сделать аналог ворк-стилинг пула.

Она высрала что-то в духе

async function workStealing(workItems, concurrencyLevel) {
  const results = [];
  const queue = [];

  // Enqueue all items from the async iterator asynchronously
  async function enqueueItems() {
    for await (const workItem of workItems) {
      queue.push(workItem);
    }
  }

  // Start enqueuing the items asynchronously
  const enqueuePromise = enqueueItems();

  // Create an array to track the active promises
  const activePromises = Array(concurrencyLevel).fill(null);

  // Function to process a work item
  async function processWorkItem(workItem, index) {
    try {
      const result = await workItem(); // Execute the work item
      results[index] = result; // Store the result at the corresponding index
    } catch (error) {
      results[index] = error; // Store the error at the corresponding index
    }

    // If there are more items in the queue, process the next one
    if (queue.length > 0) {
      const nextIndex = queue.length - 1;
      const nextWorkItem = queue.pop();
      processWorkItem(nextWorkItem, nextIndex);
    } else {
      activePromises[index] = null; // Mark the promise as completed
    }
  }

  // Wait for enqueuing to finish
  await enqueuePromise;

  // Start processing the initial work items
  for (let i = 0; i < concurrencyLevel; i++) {
    const workItem = queue.pop();
    if (workItem) {
      activePromises[i] = processWorkItem(workItem, i);
    }
  }

  // Wait for all promises to complete
  await Promise.all(activePromises.filter(Boolean));

  return results;
}

естественно попахивает нерабочим но смысл понятен.

Поделиться сообщением


Ссылка на сообщение
JuJeu написал 9 часов назад:

скока платят ?

800$ ))
Это типо на джуна

 

Index написал 3 часа назад:

Спроси у чатжипити, тебе по сути нужно сделать аналог ворк-стилинг пула.

Она высрала что-то в духе


async function workStealing(workItems, concurrencyLevel) {
  const results = [];
  const queue = [];

  // Enqueue all items from the async iterator asynchronously
  async function enqueueItems() {
    for await (const workItem of workItems) {
      queue.push(workItem);
    }
  }

  // Start enqueuing the items asynchronously
  const enqueuePromise = enqueueItems();

  // Create an array to track the active promises
  const activePromises = Array(concurrencyLevel).fill(null);

  // Function to process a work item
  async function processWorkItem(workItem, index) {
    try {
      const result = await workItem(); // Execute the work item
      results[index] = result; // Store the result at the corresponding index
    } catch (error) {
      results[index] = error; // Store the error at the corresponding index
    }

    // If there are more items in the queue, process the next one
    if (queue.length > 0) {
      const nextIndex = queue.length - 1;
      const nextWorkItem = queue.pop();
      processWorkItem(nextWorkItem, nextIndex);
    } else {
      activePromises[index] = null; // Mark the promise as completed
    }
  }

  // Wait for enqueuing to finish
  await enqueuePromise;

  // Start processing the initial work items
  for (let i = 0; i < concurrencyLevel; i++) {
    const workItem = queue.pop();
    if (workItem) {
      activePromises[i] = processWorkItem(workItem, i);
    }
  }

  // Wait for all promises to complete
  await Promise.all(activePromises.filter(Boolean));

  return results;
}

естественно попахивает нерабочим но смысл понятен.

Чат гпт я уже заебался спрашивать, я один раз спрашиваю, он мне выдаёт простыню, я сижу бля вникаю в неё как могу, говорю ему чё-то тут не то, он мне выдаёт другую простыню с калом и так каждый раз, я просто устал нахуй. Ощущение что я блять в упор какой-то хуйни понять не могу и не понимаю чего мне не понятно.

 

Но вот эта простыня выглядит читаемой на первый взгляд + вроде близко к правде! Так что спс!

Про воркстилинг чекну!


 

Поделиться сообщением


Ссылка на сообщение

На заводе выдали ноут с сенсорным экраном. жесть как мешает если надо пальцем потыкать в монитор, начинают страницы дрочиться

а так главное глотки рвать за моник с регулировкой по высоте. ну и понятное дело удобный стул. благо у нас где-то 70% офиса сократили к хуям и много свободных девайсов раскидано по этажу - лутай что хочешь

остальную периферию можно с собой приносить. я кидаю просто наушники беспроводные и кружку в рюкзак перед уходом на работу. коврик свой старый с7 тоже там расстелил чтоб мышка не скребла по столу


image.png.dedda6c5d04a07ad35710ee55d78775d.png 

Поделиться сообщением


Ссылка на сообщение
Baza_KAiF написал 29 минут назад:

я кидаю просто наушники беспроводные и кружку в рюкзак перед уходом на работу

У вас зп по пол ляма-ляму, а вы жлобитесь кружку для работы отдельную купить :chel:


ward написал 04.01.2022 в 02:54:

Hades для стада долбоебичей которые прокликивали Дэш и думали ебать они в артхаузнвй рогалик играют, не такие как все.

mazt3r написал 20.09.2019 в 11:27:

ласт оф ас - хуета для лисят и прочих мальчиков с вагиной между ног.

 

Поделиться сообщением


Ссылка на сообщение
(изменено)
GoldRobot написал 4 минуты назад:
Baza_KAiF написал 35 минут назад:

я кидаю просто наушники беспроводные и кружку в рюкзак перед уходом на работу

У вас зп по пол ляма-ляму, а вы жлобитесь кружку для работы отдельную купить :chel:

так у меня термокружка с матча зенит-урал 7-1. где я такую вторую возьму? она всегда со мной


Изменено пользователем Baza_KAiF

image.png.dedda6c5d04a07ad35710ee55d78775d.png 

Поделиться сообщением


Ссылка на сообщение
GoldRobot написал 9 минут назад:
Baza_KAiF написал 40 минут назад:

я кидаю просто наушники беспроводные и кружку в рюкзак перед уходом на работу

У вас зп по пол ляма-ляму, а вы жлобитесь кружку для работы отдельную купить :chel:

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

Поделиться сообщением


Ссылка на сообщение

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Восстановить форматирование

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Загрузка...

×
×
  • Создать...