@Override
  public void run() {
    while (Ztintor_zadaca_2.listaKlubova.size() > 2) {
      pocetak = new Date().getTime();
      listaBrojeva = new ArrayList();
      listaKolo = new ArrayList();
      listaSve = new ArrayList();
      listaSort = new ArrayList();
      System.out.println("Kolo " + brojac);

      // RANDOM parovi
      while (listaBrojeva.size() != Ztintor_zadaca_2.listaKlubova.size()) {
        broj = rnd.nextInt(Ztintor_zadaca_2.listaKlubova.size()) + 1;
        if (!listaBrojeva.contains(broj)) {
          listaBrojeva.add(broj);
          if (listaBrojeva.size() % 2 == 1
              && listaBrojeva.size() == Ztintor_zadaca_2.listaKlubova.size()) {
            try {
              domaci = (Klub) ((Klub) Ztintor_zadaca_2.listaKlubova.get(broj - 1)).clone();
              ((Klub) Ztintor_zadaca_2.listaKlubova.get(domaci.getRedniBroj() - 1))
                  .setPrethodnaEfikasnost(
                      ((Klub) Ztintor_zadaca_2.listaKlubova.get(domaci.getRedniBroj() - 1))
                          .getEfikasnost());
              domaci.setPrethodnaEfikasnost(domaci.getEfikasnost());
              listaSort.add(domaci);
              gosti = null;
              rezultat = 3;
              par = new Par(domaci, gosti, rezultat);
              listaSve.add(par);
            } catch (CloneNotSupportedException ex) {
              Logger.getLogger(Dretva.class.getName()).log(Level.SEVERE, null, ex);
            }
          } else if (listaBrojeva.size() % 2 == 1) {
            try {
              domaci = (Klub) ((Klub) Ztintor_zadaca_2.listaKlubova.get(broj - 1)).clone();
            } catch (CloneNotSupportedException ex) {
              Logger.getLogger(Dretva.class.getName()).log(Level.SEVERE, null, ex);
            }
          } else {
            try {
              gosti = (Klub) ((Klub) Ztintor_zadaca_2.listaKlubova.get(broj - 1)).clone();
            } catch (CloneNotSupportedException ex) {
              Logger.getLogger(Dretva.class.getName()).log(Level.SEVERE, null, ex);
            }
            rezultat = rnd.nextInt(3);
            par = new Par(domaci, gosti, rezultat);
            listaKolo.add(par);
          }
        }
      }

      for (int i = 0; i < listaKolo.size(); i++) {
        par = (Par) listaKolo.get(i);
        rezultat = par.getRezultat();
        domaci = par.getDomaci();
        gosti = par.getGosti();
        ((Klub) Ztintor_zadaca_2.listaKlubova.get(domaci.getRedniBroj() - 1))
            .setPrethodnaEfikasnost(
                ((Klub) Ztintor_zadaca_2.listaKlubova.get(domaci.getRedniBroj() - 1))
                    .getEfikasnost());
        ((Klub) Ztintor_zadaca_2.listaKlubova.get(gosti.getRedniBroj() - 1))
            .setPrethodnaEfikasnost(
                ((Klub) Ztintor_zadaca_2.listaKlubova.get(gosti.getRedniBroj() - 1))
                    .getEfikasnost());
        domaci.setPrethodnaEfikasnost(domaci.getEfikasnost());
        gosti.setPrethodnaEfikasnost(gosti.getEfikasnost());
        switch (rezultat) {
          case 0:
            ((Klub) Ztintor_zadaca_2.listaKlubova.get(domaci.getRedniBroj() - 1))
                .setBodovi(
                    ((Klub) Ztintor_zadaca_2.listaKlubova.get(domaci.getRedniBroj() - 1))
                            .getBodovi()
                        + 1);
            ((Klub) Ztintor_zadaca_2.listaKlubova.get(gosti.getRedniBroj() - 1))
                .setBodovi(
                    ((Klub) Ztintor_zadaca_2.listaKlubova.get(gosti.getRedniBroj() - 1)).getBodovi()
                        + 1);
            domaci.setBodovi(domaci.getBodovi() + 1);
            gosti.setBodovi(gosti.getBodovi() + 1);
            break;
          case 1:
            ((Klub) Ztintor_zadaca_2.listaKlubova.get(domaci.getRedniBroj() - 1))
                .setBodovi(
                    ((Klub) Ztintor_zadaca_2.listaKlubova.get(domaci.getRedniBroj() - 1))
                            .getBodovi()
                        + 3);
            domaci.setBodovi(domaci.getBodovi() + 3);
            break;
          case 2:
            ((Klub) Ztintor_zadaca_2.listaKlubova.get(gosti.getRedniBroj() - 1))
                .setBodovi(
                    ((Klub) Ztintor_zadaca_2.listaKlubova.get(gosti.getRedniBroj() - 1)).getBodovi()
                        + 3);
            gosti.setBodovi(gosti.getBodovi() + 3);
            break;
        }
        ((Klub) Ztintor_zadaca_2.listaKlubova.get(domaci.getRedniBroj() - 1))
            .setBrojUtakmica(
                ((Klub) Ztintor_zadaca_2.listaKlubova.get(domaci.getRedniBroj() - 1))
                        .getBrojUtakmica()
                    + 1);
        domaci.setBrojUtakmica(domaci.getBrojUtakmica() + 1);
        ((Klub) Ztintor_zadaca_2.listaKlubova.get(gosti.getRedniBroj() - 1))
            .setBrojUtakmica(
                ((Klub) Ztintor_zadaca_2.listaKlubova.get(gosti.getRedniBroj() - 1))
                        .getBrojUtakmica()
                    + 1);
        gosti.setBrojUtakmica(gosti.getBrojUtakmica() + 1);
        ((Klub) Ztintor_zadaca_2.listaKlubova.get(domaci.getRedniBroj() - 1))
            .setEfikasnost(
                ((double)
                        ((Klub) Ztintor_zadaca_2.listaKlubova.get(domaci.getRedniBroj() - 1))
                            .getBodovi())
                    / ((double)
                        ((Klub) Ztintor_zadaca_2.listaKlubova.get(domaci.getRedniBroj() - 1))
                            .getBrojUtakmica()));
        ((Klub) Ztintor_zadaca_2.listaKlubova.get(gosti.getRedniBroj() - 1))
            .setEfikasnost(
                ((double)
                        ((Klub) Ztintor_zadaca_2.listaKlubova.get(gosti.getRedniBroj() - 1))
                            .getBodovi())
                    / ((double)
                        ((Klub) Ztintor_zadaca_2.listaKlubova.get(gosti.getRedniBroj() - 1))
                            .getBrojUtakmica()));
        domaci.setEfikasnost((double) domaci.getBodovi() / (double) domaci.getBrojUtakmica());
        gosti.setEfikasnost((double) gosti.getBodovi() / (double) gosti.getBrojUtakmica());
        listaSort.add(domaci);
        listaSort.add(gosti);
        par = new Par(domaci, gosti, rezultat);
        listaSve.add(par);
      }
      s.setState(null);

      // Sortiranje liste klubova prema bodovima
      Collections.sort(
          listaSort,
          new Comparator<Klub>() {
            public int compare(Klub o1, Klub o2) {
              if (o1.getBodovi() >= o2.getBodovi()) {
                return -1;
              } else {
                return 1;
              }
            }
          });

      // Postavljanje mjesta klubova
      listaPrethodnogKola = new ArrayList<>();
      for (Klub k : listaSort) {
        try {
          listaPrethodnogKola.add((Klub) k.clone());
        } catch (CloneNotSupportedException ex) {
          Logger.getLogger(Dretva.class.getName()).log(Level.SEVERE, null, ex);
        }
      }

      // Ažururanje liste klubova
      listaSort.get(0).setMjesto(1);
      for (int i = 1; i < listaSort.size(); i++) {
        if (listaSort.get(i).getBodovi() == listaSort.get(i - 1).getBodovi()) {
          listaSort.get(i).setMjesto(listaSort.get(i - 1).getMjesto());
        } else {
          listaSort.get(i).setMjesto(i + 1);
        }
      }

      // Ažururanje liste klubova prethodnog kola
      for (int i = 0; i < listaSort.size(); i++) {
        for (int j = 0; j < listaSort.size(); j++) {
          if (listaSort
              .get(i)
              .getNaziv()
              .equals(((Klub) Ztintor_zadaca_2.listaKlubova.get(j)).getNaziv())) {
            ((Klub) Ztintor_zadaca_2.listaKlubova.get(j)).setMjesto(listaSort.get(i).getMjesto());
          }
        }
      }

      // Provjera prethodnog i novog redosljeda
      promjenaRedosljeda = false;
      for (int i = 0; i < listaSort.size(); i++) {
        for (int j = 0; j < listaPrethodnogKola.size(); j++) {
          if (listaSort.get(i).getNaziv().equals(listaPrethodnogKola.get(j).getNaziv())) {
            if (listaSort.get(i).getMjesto() != listaPrethodnogKola.get(j).getMjesto()) {
              promjenaRedosljeda = true;
              j = listaPrethodnogKola.size();
              i = listaSort.size();
            }
          }
        }
      }

      // MEMENTO
      originator.set((ArrayList) listaSort);
      originator1.set(listaSve);
      originator2.set(listaSve);
      caretaker2.addMemento(originator2.saveToMemento());

      // Spremanje arhive
      if (promjenaRedosljeda) {
        caretaker.addMemento(originator.saveToMemento());
        caretaker1.addMemento(originator1.saveToMemento());
        brojacArhive++;
        System.out.println("arhiva: *******   " + brojacArhive);
      }

      // ----------------------------ISPISI VRAĆAJU TOČNE VRIJEDNOSTI------------------//
      //            if (brojac == 3) {
      //                originator.restoreFromMementoRedosljed(caretaker.getMemento(0));
      //                originator1.restoreFromMementoRezultatiKola(caretaker1.getMemento(0));
      //                System.out.println("--- Rezultati "+ "DINAMO"+" -----");
      //                for (int i = 0; i < brojac; i++) {
      //                    originator2.restoreFromMementoRezultatiKluba(caretaker2.getMemento(i),
      // "DINAMO");
      //                }
      //            }

      // provjera stanja
      if (brojac % kontrola == 0) {
        for (int i = 0; i < Ztintor_zadaca_2.listaKlubova.size(); i++) {
          ((Klub) Ztintor_zadaca_2.listaKlubova.get(i)).postaviStanje(prag);
        }
        for (int i = 0; i < Ztintor_zadaca_2.listaKlubova.size(); i++) {
          Klub kl = new Klub();
          kl = (Klub) Ztintor_zadaca_2.listaKlubova.get(i);
          if (kl.isProvjera()) {

            Ztintor_zadaca_2.s.removeObserver((Klub) Ztintor_zadaca_2.listaKlubova.get(i));
            Ztintor_zadaca_2.listaKlubova.remove((Klub) Ztintor_zadaca_2.listaKlubova.get(i));
          }
        }

        for (int i = 0; i < Ztintor_zadaca_2.listaKlubova.size(); i++) {
          ((Klub) Ztintor_zadaca_2.listaKlubova.get(i))
              .setPrethodnoMjesto(((Klub) Ztintor_zadaca_2.listaKlubova.get(i)).getMjesto());
          ((Klub) Ztintor_zadaca_2.listaKlubova.get(i)).setRedniBroj(i + 1);
        }
      }

      brojac++;
      // Interval dretve
      try {
        razlika = new Date().getTime() - pocetak;
        sleep(interval * 1000 - razlika);
      } catch (InterruptedException ex) {
        Logger.getLogger(Dretva.class.getName()).log(Level.SEVERE, null, ex);
      }
    }
  }