fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <cstdint>
  4. #include <algorithm>
  5. #include <random>
  6. #include <tuple>
  7.  
  8. #include <limits>
  9. #include <fstream>
  10. #include <iterator>
  11.  
  12. typedef std::vector<std::uint8_t> LData;
  13. typedef std::uint16_t LWord;
  14. typedef std::vector<LWord> LDType;
  15. typedef std::vector<LData> LDatas;
  16.  
  17. typedef std::uint8_t BWord;
  18. typedef std::vector<BWord> BDType;
  19. typedef std::vector<BDType> BDTypes;
  20. typedef std::tuple<BDType, std::size_t> BData;
  21.  
  22. BData BlockSort_Enc(const BDType& In) {
  23. std::vector<std::tuple<BWord, std::size_t>> D;
  24.  
  25. for (std::size_t i = 0; i < In.size(); i++) {
  26. D.push_back({ In[i],i });
  27. }
  28.  
  29. auto DD = D;
  30. auto A = D;
  31. auto B = D;
  32. auto& X = D;
  33.  
  34. std::stable_sort(D.begin(), D.end(), [&](auto& AA, auto& BB) {
  35. std::rotate(A.begin(), A.begin() + (std::get<1>(AA) % A.size()), A.end());
  36. std::rotate(B.begin(), B.begin() + (std::get<1>(BB) % B.size()), B.end());
  37.  
  38. for (std::size_t i = 0; i < X.size(); i++) {
  39. if (std::get<0>(A[i]) != std::get<0>(B[i])) {
  40. auto AR = std::get<0>(A[i]);
  41. auto BR = std::get<0>(B[i]);
  42. A = B = DD;
  43. return std::isless(AR, BR);
  44. }
  45. }
  46. A = B = DD;
  47. return false;
  48. });
  49.  
  50. BDType R;
  51. std::size_t L = 0;
  52.  
  53. for (std::size_t i = 0; i < D.size(); i++) {
  54. //R.push_back(std::get<0>(D[i]));
  55. R.push_back(In[(std::get<1>(D[i]) + In.size() - 1) % In.size()]);
  56. if (std::get<1>(D[i]) == 0) { L = i; }
  57. }
  58.  
  59. return { R,L };
  60.  
  61. }
  62.  
  63.  
  64. BDType BlockSort_Dec(const BDType& D, std::size_t N) {///,const DType& O,const Data& A) {
  65. std::vector<std::tuple<BWord, std::size_t>> V;
  66. BDType R;
  67.  
  68. for (std::size_t i = 0; i < D.size(); i++) {
  69. V.push_back({ D[i], i });
  70. }
  71.  
  72. std::stable_sort(V.begin(), V.end(), [](auto& A, auto& B) {return std::isless(std::get<0>(A), std::get<0>(B)); });
  73.  
  74. for (std::size_t i = 0; i < V.size(); i++) {
  75. N = std::get<1>(V[N]);
  76. R.push_back(D[N]);
  77.  
  78. }
  79. //std::rotate(R.begin(), R.begin()+1, R.end());
  80. //std::rotate(R.begin(), R.end()-N, R.end());
  81. //std::reverse(R.begin(), R.end());
  82.  
  83. return R;
  84. }
  85.  
  86. BDType MakeCacao() {
  87. BDType R = { 'c','a','c','a','o' };
  88.  
  89. return R;
  90. }
  91.  
  92. BDType Make_cdebaaaa() {
  93. BDType R = { 'c','d','e','b','a','a','a','a' };
  94.  
  95. return R;
  96. }
  97. BDType MakePapaya() {
  98. BDType R = { 'p','a','p','a','y','a', };
  99.  
  100. return R;
  101. }
  102. BDType MakeBanana() {
  103. BDType R = { 'b','a','n','a','n','a', };
  104.  
  105. return R;
  106. }
  107. BDType MakeVecor(std::size_t L, unsigned int S = 0) {
  108. BDType R;
  109. std::mt19937 mt(S);
  110. std::uniform_int_distribution<int> ui(0, 255);
  111. for (std::size_t i = 0; i < L; i++) {
  112. R.push_back(ui(mt));
  113. }
  114.  
  115. return R;
  116. }
  117. BDType MakeVecor2(std::size_t L, unsigned int S = 0) {
  118. BDType R;
  119. std::mt19937 mt(S);
  120. std::uniform_int_distribution<int> ui('A', 'z');
  121. for (std::size_t i = 0; i < L; i++) {
  122. R.push_back(ui(mt));
  123. }
  124.  
  125. return R;
  126. }
  127.  
  128. bool ShowB(const BDType& In) {
  129. for (auto& o : In) {
  130. std::cout << o << ',';
  131. }
  132.  
  133. std::cout << std::endl;
  134.  
  135. return true;
  136. }
  137. int BlockSort_main() {
  138. //auto D = MakeCacao();
  139. //auto D = Make_cdebaaaa();
  140. //auto D = MakePapaya();
  141. //auto D = MakeBanana();
  142. //auto D = MakeVecor2(8);
  143. // auto D = MakeVecor2(128);
  144.  
  145. auto D = MakeVecor2(1280);
  146.  
  147. ShowB(D);
  148. std::cout << std::endl;
  149.  
  150. auto A = BlockSort_Enc(D);
  151.  
  152. ShowB(std::get<0>(A));
  153. std::cout << std::endl;
  154.  
  155. auto B = BlockSort_Dec(std::get<0>(A), std::get<1>(A));// , D, A);
  156.  
  157. ShowB(B);
  158. std::cout << std::endl;
  159. if (D == B) {
  160. std::cout << std::endl << "good" << std::endl;
  161. }
  162. else {
  163. std::cout << std::endl << "Bad" << std::endl;
  164. }
  165.  
  166. return 0;
  167.  
  168.  
  169.  
  170. }
  171.  
  172. LData LoadFromFile(const std::string& Name) {
  173. std::ifstream ifs(Name, std::ios::binary);
  174.  
  175. if (!ifs.is_open()) { return {}; }
  176.  
  177. std::istreambuf_iterator<std::ifstream::char_type> it(ifs);
  178. std::istreambuf_iterator<std::ifstream::char_type> End;
  179.  
  180. return { it,End };
  181. }
  182.  
  183.  
  184. LData MakeVector(std::size_t N, std::uint32_t Seed = 0) {
  185. std::mt19937 mt(Seed);
  186. //std::uniform_int_distribution<std::intmax_t> UI(0, std::numeric_limits<Data::value_type>::max());
  187. std::uniform_int_distribution<std::intmax_t> UI(0, 1);
  188. LData R;
  189.  
  190. for (std::size_t i = 0; i < N; i++) {
  191. R.push_back(UI(mt));
  192. }
  193.  
  194. return R;
  195. }
  196. LData MakeVector2(std::size_t N, std::uint32_t Seed = 0) {
  197. std::mt19937 mt(Seed);
  198. std::uniform_int_distribution<std::intmax_t> UI(0, std::numeric_limits<LData::value_type>::max());
  199. //std::uniform_int_distribution<std::intmax_t> UI(0, 1);
  200. LData R;
  201.  
  202. for (std::size_t i = 0; i < N; i++) {
  203. R.push_back(UI(mt));
  204. }
  205.  
  206. return R;
  207. }
  208. LData MakeVector3(std::size_t N, std::intmax_t Min, std::intmax_t Max, std::uint32_t Seed = 0) {
  209. std::mt19937 mt(Seed);
  210. std::uniform_int_distribution<std::intmax_t> UI(Min, Max);
  211. //std::uniform_int_distribution<std::intmax_t> UI(0, 1);
  212. LData R;
  213.  
  214. for (std::size_t i = 0; i < N; i++) {
  215. R.push_back(UI(mt));
  216. }
  217.  
  218. return R;
  219. }
  220. LDType Lzw_Enc(const LData& D) {
  221.  
  222. LDatas Di;
  223. LData V;
  224. LDType R;
  225.  
  226. for (std::size_t i = 0; i <= std::numeric_limits<LData::value_type>::max(); i++) {
  227. V.push_back(i);
  228. Di.push_back(V);
  229. V.pop_back();
  230. }
  231. //R.push_back(0xfffe);//clear code.
  232. //R.push_back(0xffff);//stop code.
  233.  
  234. for (std::size_t i = 0; i < D.size(); i++) {
  235. V.push_back(D[i]);
  236.  
  237. auto it = std::find(Di.begin(), Di.end(), V);
  238. if (it != Di.end()) continue;
  239.  
  240. auto A = V;
  241. A.pop_back();
  242. auto it2 = std::find(Di.begin(), Di.end(), A);
  243.  
  244. if (it == Di.end()) {
  245. auto L = std::distance(Di.begin(), it2);
  246. R.push_back(L);
  247.  
  248. Di.push_back(V);
  249. V.clear();
  250. if (i != 0) { i--; }
  251. }
  252. }
  253. if (V.size()) {
  254. auto It = std::find(Di.begin(), Di.end(), V);
  255. if (It == Di.end()) {
  256. R.push_back(Di.size());
  257. }
  258. else {
  259. R.push_back(std::distance(Di.begin(), It));
  260. }
  261. }
  262.  
  263. return R;
  264. }
  265.  
  266. LData Lzw_Dec(const LDType& D) {// , const Data& In) {
  267.  
  268. LData V;
  269. LDatas Di;
  270. LData R;
  271.  
  272. for (std::size_t i = 0; i <= std::numeric_limits<LData::value_type>::max(); i++) {
  273. V.push_back(i);
  274. Di.push_back({ V });
  275. V.pop_back();
  276. }
  277.  
  278. std::size_t i = 0;
  279. for (i = 0; i < D.size() - 1; i++) {
  280. V = Di[D[i]];
  281. Di.push_back(V);
  282. Di.back().push_back(Di[D[i + 1]].front());
  283.  
  284. R.insert(R.end(), V.begin(), V.end());
  285. }
  286. //dirty. need the patch.
  287. V = Di[D[i]];
  288. Di.push_back(V);
  289. R.insert(R.end(), V.begin(), V.end());
  290. return R;
  291. }
  292.  
  293. bool ShowE(const LDType& In) {
  294. std::cout.flush();
  295. for (auto& o : In) {
  296. std::cout << (int)o << ',';
  297. }
  298. std::cout << std::endl;
  299. std::cout << std::endl;
  300.  
  301. return true;
  302. }
  303. bool ShowD(const LData& In) {
  304. std::cout.flush();
  305. for (auto& o : In) {
  306. std::cout << (int)o << ',';
  307. }
  308. std::cout << std::endl;
  309. std::cout << std::endl;
  310.  
  311. return true;
  312. }
  313. /**/
  314. LData WordToByte(const LDType& In) {
  315. LData R;
  316.  
  317. for (auto& o : In) {
  318. R.push_back(o / 256);
  319. R.push_back(o % 256);
  320.  
  321. }
  322.  
  323. return R;
  324. }
  325. LDType ByteToWord(const LData& In) {
  326. LDType R;
  327. for (std::size_t i = 0; i < In.size(); i += 2) {
  328. LWord W = In[i + 1] + In[i] * 256;
  329. R.push_back(W);
  330. }
  331.  
  332. return R;
  333. }
  334. /**/
  335. /** /
  336. Data WordToByte(const DType& In) {
  337. Data R;
  338.  
  339. for (auto& o : In) {
  340. R.push_back(o % 256);
  341. R.push_back(o / 256);
  342. }
  343.  
  344. return R;
  345. }
  346. DType ByteToWord(const Data& In) {
  347. DType R;
  348. for (std::size_t i = 0; i < In.size(); i += 2) {
  349. Word W = In[i] + In[i + 1] * 256;
  350. R.push_back(W);
  351. }
  352.  
  353. return R;
  354. }
  355. /**/
  356.  
  357. /** /
  358. int main() {
  359. for (std::size_t i = 0; i < 65536; i++) {
  360. auto A = i / 256;
  361. auto B = i % 256;
  362.  
  363. auto C = B + A * 256;
  364.  
  365. if (C == i) {
  366. std::cout.flush();
  367. std::cout << i << ": valid."<<std::endl;
  368. }
  369. else {
  370. break;
  371. }
  372.  
  373. }
  374.  
  375. return 0;
  376.  
  377. }
  378. /**/
  379. /**/
  380. int Lzw_main() {
  381.  
  382. std::size_t L = 10240;
  383.  
  384. std::size_t C = 1;
  385. bool IsFile = false;
  386. LData D;
  387. if (IsFile)
  388. {
  389. D = LoadFromFile("A.bmp");
  390. }
  391. else {
  392. D = MakeVector3(L, 0, 255, 0);
  393. }
  394. //ShowD(D);
  395.  
  396. LData T = D;
  397. LDType RA;
  398. for (std::size_t i = 0; i < C; i++) {
  399. RA = Lzw_Enc(D);
  400. ShowE(RA);
  401. std::cout << "Comp:" << RA.size() << ':' << RA.size() / (double)T.size() << std::endl;
  402. D = WordToByte(RA);
  403. }
  404.  
  405. std::cout << std::endl << "----EncEnd---" << std::endl;
  406. LData RB;
  407. for (std::size_t i = 0; i < C; i++) {
  408. RB = Lzw_Dec(RA);
  409. RA = ByteToWord(RB);
  410. if (i + 1 != C) {
  411. ShowE(RA);
  412. }
  413. else {
  414. ShowD(RB);
  415. }
  416. }
  417.  
  418.  
  419. if (T == RB) {
  420. std::cout << "Good!" << std::endl;
  421. }
  422. else {
  423. std::cout << "Odd!" << std::endl;
  424. }
  425. return 0;
  426. }
  427. /** /
  428. int main() {
  429.  
  430. std::size_t L = 10240;
  431.  
  432. auto D = MakeVector3(L,0,255,0);
  433. ShowD(D);
  434. DType RA = Lzw_Enc(D);
  435. ShowE(RA);
  436.  
  437. Data RB=Lzw_Dec(RA,D);
  438. ShowD(RB);
  439.  
  440. //D.pop_back();
  441.  
  442. if (D == RB) {
  443. std::cout << "Good!" << std::endl;
  444. }
  445. else {
  446. std::cout << "Odd!" << std::endl;
  447. }
  448. return 0;
  449. }
  450. /**/
  451.  
  452. typedef std::vector<std::uint8_t> Dtype;
  453.  
  454. Dtype MakeVector8(std::size_t N, unsigned int S = 0) {
  455. std::mt19937 mt(S);
  456. std::uniform_int_distribution<int> ui(0, 255);
  457.  
  458. Dtype R;
  459.  
  460. for (std::size_t i = 0; i < N; i++) {
  461. R.push_back(ui(mt));
  462. }
  463.  
  464. return R;
  465. }
  466.  
  467. Dtype MakeVectorChar(std::size_t N, unsigned int S = 0) {
  468. std::mt19937 mt(S);
  469. std::uniform_int_distribution<int> ui('A', 'Z');
  470.  
  471. Dtype R;
  472.  
  473. for (std::size_t i = 0; i < N; i++) {
  474. R.push_back(ui(mt));
  475. }
  476.  
  477. return R;
  478. }
  479. template <class T>
  480. bool Show(const std::vector<T>& In) {
  481.  
  482. for (auto& o : In) {
  483. std::cout << (int)o << ',';
  484. }
  485. std::cout << std::endl;
  486. std::cout << std::endl;
  487. std::cout << In.size() << std::endl;
  488.  
  489. std::cout << std::endl;
  490. std::cout << std::endl;
  491. return true;
  492. }
  493. bool Show(const Dtype& In) {
  494.  
  495. bool F = true;
  496.  
  497. if (F) {
  498. for (auto& o : In) {
  499. std::cout << o << ',';
  500. }
  501. }
  502. std::cout << std::endl;
  503. std::cout << std::endl;
  504. std::cout << In.size() << std::endl;
  505.  
  506. std::cout << std::endl;
  507. std::cout << std::endl;
  508. return true;
  509. }
  510. int TestA() {
  511. //auto D = MakeVector8(512);
  512. auto D = MakeVectorChar(10240);
  513. Show(D);
  514.  
  515. std::cout << "--Enc--" << std::endl;
  516.  
  517. auto BE = BlockSort_Enc(D);
  518. Show(std::get<0>(BE));
  519. auto LE = Lzw_Enc(std::get<0>(BE));
  520. Show(LE);
  521.  
  522. auto WBE=WordToByte(LE);
  523. Show(WBE);
  524. auto BE2 = BlockSort_Enc(WBE);
  525. Show(std::get<0>(BE2));
  526. auto LE2 = Lzw_Enc(std::get<0>(BE2));
  527. Show(LE2);
  528.  
  529. std::cout << "--Dec--" << std::endl;
  530.  
  531. auto LD = Lzw_Dec(LE2);
  532. Show(LD);
  533. auto BD = BlockSort_Dec(LD,std::get<1>(BE2));
  534. Show(BD);
  535. auto BWD = ByteToWord(BD);
  536. Show(BWD);
  537. auto LD2 = Lzw_Dec(BWD);
  538. Show(LD2);
  539. auto BD2 = BlockSort_Dec(LD2, std::get<1>(BE));
  540. Show(BD2);
  541.  
  542. if (D == BD2) {
  543. std::cout << "good" << std::endl;
  544. }
  545. else {
  546. std::cout << "bad" << std::endl;
  547. }
  548.  
  549. return 0;
  550.  
  551. }
  552. typedef std::vector<BData> VStack;
  553. int main() {
  554. //auto D = MakeVector8(512);
  555. auto D = MakeVectorChar(2500);
  556. Show(D);
  557.  
  558. std::size_t L = 2;
  559.  
  560. VStack St;
  561.  
  562. auto BE = BlockSort_Enc(D);
  563. St.push_back(BE);
  564. for (std::size_t i = 0; i < L; i++) {
  565. BE = BlockSort_Enc(std::get<0>(BE));
  566. St.push_back(BE);
  567. }
  568.  
  569. std::cout << "--Enc--" << std::endl;
  570. auto LE = Lzw_Enc(std::get<0>(BE));
  571. Show(LE);
  572.  
  573. auto LD = Lzw_Dec(LE);
  574.  
  575. auto BD = BlockSort_Dec(LD, std::get<1>(St.back()));
  576. St.pop_back();
  577.  
  578. while (St.size()) {
  579. BD = BlockSort_Dec(BD, std::get<1>(St.back()));
  580. St.pop_back();
  581. }
  582. std::cout << "--End--" << std::endl<< std::endl;
  583. /**/
  584. if (D == BD) {
  585. std::cout << "good" << std::endl;
  586. }
  587. else {
  588. std::cout << "bad" << std::endl;
  589. }
  590. /**/
  591. return 0;
  592.  
  593. }
Success #stdin #stdout 1.15s 5432KB
stdin
Standard input is empty
stdout
O,P,S,V,P,W,O,W,L,Q,Q,J,L,H,X,B,Z,H,J,M,U,V,N,M,O,K,Y,V,B,I,C,Q,A,J,V,Y,U,D,W,W,Z,M,U,U,L,N,U,R,D,S,Q,P,D,N,Y,T,N,C,K,M,G,E,U,T,L,F,O,D,A,I,Q,D,P,F,Q,K,Y,X,R,L,J,P,L,X,S,C,B,Z,R,Q,R,E,F,J,D,T,I,P,J,I,O,A,L,Q,Z,Y,C,Q,F,Q,E,Z,Q,P,G,K,M,M,G,Q,E,I,C,R,R,I,D,U,F,Y,J,R,V,A,C,Q,V,R,C,Z,Z,W,M,N,Z,B,P,L,T,A,B,L,H,Z,D,J,H,M,D,R,I,W,K,X,B,F,S,O,O,W,G,N,N,X,C,X,O,C,Y,H,I,A,R,V,D,Q,S,V,H,G,E,K,P,O,A,E,V,J,A,D,R,O,H,S,T,H,Z,L,G,T,O,K,P,X,O,Q,F,X,Y,R,L,L,W,Z,S,D,H,T,V,K,K,R,W,G,P,I,W,Z,S,P,S,R,N,N,Y,F,Q,K,L,Q,P,M,A,M,H,S,R,H,H,J,Q,T,L,W,D,C,H,C,O,J,P,O,O,A,Q,Z,Q,I,L,F,X,D,J,C,L,Z,X,G,U,N,S,L,C,C,X,J,S,M,Z,V,D,X,W,A,E,N,Q,E,D,U,W,W,U,K,O,D,K,A,B,Z,S,J,L,K,S,B,W,J,Z,A,W,F,A,T,J,Y,S,T,E,I,N,M,B,I,F,E,A,E,U,M,F,W,I,Y,Y,P,S,P,A,U,E,N,Q,B,P,S,G,Z,Y,G,P,R,N,W,P,T,S,Z,I,O,K,F,F,F,E,F,Y,O,T,L,M,Z,F,R,G,C,B,B,L,M,I,W,S,Z,J,Q,E,O,A,W,B,T,R,M,L,R,N,P,X,S,Z,M,F,L,R,X,G,D,A,F,T,W,I,X,J,Q,P,I,V,N,Q,A,W,I,H,L,U,X,E,R,Y,L,R,M,F,U,Y,F,T,W,G,I,F,Y,N,M,A,S,F,D,L,S,J,Q,M,F,H,E,P,U,W,T,D,R,N,H,D,E,S,S,K,M,O,V,E,F,D,E,M,D,J,S,Y,A,T,T,T,C,X,F,C,T,O,T,P,B,Z,F,H,H,G,R,C,B,A,O,Y,A,R,V,U,Z,H,S,P,E,B,N,M,P,Z,U,W,P,I,F,Z,L,G,W,Y,M,Y,S,U,M,Q,S,W,M,H,V,W,F,Q,U,A,Z,J,W,D,U,Z,Z,M,T,M,A,Q,H,J,K,D,L,V,H,E,K,N,D,F,Z,C,K,W,O,Z,I,Y,U,X,K,U,J,I,K,C,H,K,U,G,Y,D,I,B,Y,S,A,A,N,U,H,D,W,C,G,C,R,R,V,G,L,K,T,O,V,W,J,S,C,H,G,D,P,B,M,H,M,G,L,L,N,R,L,S,W,H,L,J,V,E,N,U,C,B,R,S,F,U,W,U,R,G,E,J,B,P,A,H,X,J,D,F,U,L,Y,B,S,U,M,C,M,N,W,H,M,P,K,Y,E,Q,M,A,U,L,O,N,E,N,D,R,Q,H,O,D,I,K,D,Y,E,E,D,X,P,O,C,L,X,W,C,L,U,S,W,K,C,X,L,R,M,S,P,I,S,T,A,Q,T,G,T,E,A,U,I,Y,G,L,N,P,Y,W,O,L,C,Y,Q,O,W,V,E,X,Z,V,C,E,C,Q,Q,K,Y,B,Y,L,L,G,S,W,T,A,H,Y,D,J,L,J,K,A,N,E,V,K,N,Y,R,C,P,Y,C,W,C,L,B,I,C,G,G,P,V,A,N,A,N,L,Q,B,O,G,A,F,P,G,U,D,J,A,M,D,Z,Q,G,Z,J,Z,B,K,I,E,V,Q,U,M,Q,Z,J,B,I,U,U,H,B,G,R,R,J,G,Q,R,Y,N,W,L,M,O,L,H,V,S,T,K,L,J,Z,V,J,Y,K,B,T,G,L,J,Y,V,G,Z,J,Z,S,X,X,H,D,Z,G,G,F,C,M,Y,X,G,J,R,K,B,X,S,C,W,Q,H,D,J,J,J,I,T,R,G,U,E,N,L,H,H,X,V,J,G,T,N,O,Y,F,Q,O,W,N,Y,J,T,A,S,D,Z,D,Z,S,L,S,B,P,H,R,D,L,K,S,D,J,P,C,J,Y,X,B,Z,A,O,Z,H,D,P,G,X,F,K,P,O,Z,H,H,L,Z,K,A,G,X,N,S,I,H,J,X,N,A,T,Q,I,I,Y,Z,W,E,B,X,G,I,L,X,C,N,J,N,T,K,R,N,Q,Y,S,X,F,R,I,Q,R,O,W,H,O,D,H,W,A,Q,S,H,A,L,J,A,N,O,X,J,C,N,K,D,A,L,I,X,Q,A,H,Z,F,R,D,C,P,H,S,O,R,S,Y,K,A,F,Q,L,P,Z,P,V,Z,X,A,R,S,L,V,R,N,Q,I,A,U,X,C,O,L,Z,N,J,S,U,C,L,F,V,K,O,Q,X,X,W,Q,I,D,K,Z,O,W,Q,N,J,X,O,O,D,Y,R,V,H,Z,B,X,D,A,C,E,I,K,G,Y,O,H,X,E,P,X,P,L,G,X,P,E,D,R,I,L,Q,B,J,S,X,G,W,B,L,B,N,B,M,X,E,T,L,X,E,R,S,N,N,H,I,Z,A,J,P,M,Q,J,A,Z,Z,E,R,I,H,R,F,B,Y,P,I,M,K,H,Q,G,X,N,L,J,Y,L,P,I,L,Z,P,D,J,C,R,I,Q,P,V,R,K,K,A,Z,Z,J,L,S,Y,Q,R,V,G,Z,O,X,Y,T,C,S,H,I,C,D,T,B,A,G,D,L,G,N,W,U,E,Y,L,D,I,C,P,P,Y,T,Y,W,B,Y,P,Z,X,K,U,J,F,D,T,R,E,R,X,W,A,C,C,M,Q,P,J,G,C,E,Z,W,X,B,H,M,M,D,M,L,N,Z,Z,L,C,W,B,D,M,H,L,K,G,K,B,R,D,I,W,S,K,Q,J,K,A,L,J,P,R,B,Q,V,X,Q,R,S,I,N,I,C,V,K,U,K,H,I,S,A,O,T,K,C,N,P,C,S,R,Q,A,Y,X,C,R,W,X,A,A,N,Y,K,Y,N,U,J,Z,E,J,A,W,N,U,V,S,J,Q,F,H,C,N,C,H,F,A,C,A,G,D,B,N,B,F,W,J,E,B,O,X,U,X,L,X,D,I,F,S,L,L,N,H,J,B,U,K,T,K,Y,E,A,J,X,C,K,W,W,R,R,F,Z,X,T,P,J,L,N,Q,J,G,J,O,G,D,M,F,R,N,H,C,N,W,D,K,E,G,B,P,Z,T,A,P,E,P,P,E,C,R,W,Z,S,P,Z,I,N,U,H,V,O,K,Y,K,N,Y,G,S,W,A,J,L,A,C,G,Z,I,O,W,Q,L,J,L,R,I,O,W,U,Y,X,Z,K,J,X,Z,B,U,R,R,G,G,O,F,U,E,T,X,S,H,M,L,F,M,F,U,N,V,L,D,Z,L,H,V,C,V,S,C,Z,E,U,H,G,B,A,L,K,C,W,O,L,G,H,P,Y,D,U,Z,P,Y,A,K,Y,G,R,G,F,M,A,B,A,Q,Y,K,S,J,S,V,P,S,N,Y,L,J,P,X,R,U,J,J,R,Q,L,H,C,W,G,C,C,F,I,E,P,K,J,T,S,N,R,M,D,A,E,L,B,B,G,F,J,Y,C,F,P,W,S,U,E,E,I,P,S,D,R,S,W,Q,O,V,A,M,B,X,C,B,N,H,T,S,A,K,L,E,V,C,R,V,O,M,P,W,X,T,O,K,K,J,S,N,J,X,Z,T,W,A,E,S,R,X,A,S,X,E,V,M,N,D,D,J,Q,Y,G,Y,Q,H,S,I,C,P,M,Z,P,D,G,G,F,W,Q,M,T,X,J,E,S,N,P,I,V,I,F,L,U,L,G,J,H,X,Z,T,B,S,E,H,N,P,J,U,G,U,R,I,R,U,Z,T,W,D,Z,W,J,L,B,M,I,L,M,O,E,Q,C,M,L,W,Y,Q,T,K,I,K,X,V,S,J,M,F,G,B,O,W,F,X,T,D,Y,I,R,E,S,D,E,X,T,B,M,Z,C,C,K,W,S,O,P,J,H,I,Z,T,O,I,Y,R,O,N,O,M,B,X,C,O,P,V,T,S,G,B,Z,U,T,F,G,X,Q,B,I,I,S,C,P,M,T,V,G,H,Y,D,Z,I,E,V,N,D,W,F,J,B,G,S,T,K,Z,I,N,S,K,I,K,S,U,V,S,F,I,Z,Z,E,X,H,S,E,L,I,F,M,R,N,T,W,P,X,M,F,D,Q,U,C,M,L,W,I,D,I,Z,M,M,S,B,B,H,W,X,T,I,E,Z,Y,L,N,J,Z,U,F,M,N,B,H,V,H,U,P,N,X,A,U,D,S,S,O,P,X,S,M,J,W,Q,V,L,F,K,U,K,A,A,I,B,F,W,N,S,T,F,C,D,N,B,Y,M,F,P,R,X,P,X,A,J,M,Y,S,O,B,O,W,E,N,D,A,G,F,D,Y,F,P,O,C,W,H,U,L,A,A,S,K,B,M,Z,G,U,P,G,T,M,G,T,Q,V,Q,F,Y,D,U,Y,W,R,M,W,E,G,Z,D,D,J,M,G,B,B,Y,Q,Z,G,S,L,J,H,G,X,G,L,D,W,N,B,D,N,I,L,Q,I,S,H,A,G,L,F,Q,M,W,I,M,I,Z,B,G,A,A,X,M,K,G,R,V,L,G,F,I,Y,U,D,S,M,O,C,S,F,K,R,A,N,A,O,N,V,C,B,B,X,Z,Q,W,Q,D,A,A,X,Y,A,H,E,E,X,R,D,C,K,G,T,Z,O,Q,S,N,F,K,K,U,M,D,G,Z,Z,W,R,Q,W,B,K,S,Y,X,G,N,E,J,U,D,Z,T,B,X,C,C,I,T,N,A,S,Z,Y,P,D,O,J,H,G,Y,U,G,E,V,W,Z,U,U,W,N,Z,B,O,M,L,L,M,F,X,L,F,J,J,E,Q,L,S,G,B,N,Z,A,I,X,F,V,H,O,Z,W,R,Z,G,C,F,Q,B,Z,J,Z,V,P,H,D,J,P,T,A,S,F,K,Y,E,I,X,Q,O,H,G,Y,G,S,L,I,K,U,B,C,Y,K,U,F,M,R,I,C,E,K,E,H,G,N,F,J,S,S,U,A,J,Q,E,F,Q,G,I,U,Y,Y,U,I,Z,V,X,C,A,Q,B,T,X,E,D,L,P,X,J,C,A,A,C,P,T,L,V,U,J,Y,G,H,M,K,D,M,Q,P,T,Z,S,S,Y,K,P,G,P,Y,T,D,S,S,H,Y,U,R,X,K,U,F,W,J,W,S,G,Q,V,Y,S,W,I,V,R,X,R,H,U,J,A,J,Q,O,R,R,P,H,U,A,D,K,H,I,T,Y,I,X,P,W,Q,Q,H,I,L,O,R,V,U,C,Q,U,K,B,A,V,X,U,A,B,C,Q,U,N,B,E,X,D,X,U,B,O,Y,Z,N,Z,A,Z,N,D,J,Y,Z,G,G,L,L,T,C,F,W,O,A,E,U,C,H,D,D,J,S,A,Q,L,A,R,K,K,O,C,J,B,Q,H,M,E,Q,Z,P,D,F,U,I,P,H,O,Z,N,G,Z,F,J,B,

2500


--Enc--
82,76,68,86,80,71,66,71,65,83,88,78,80,86,73,90,89,65,65,89,70,79,70,78,81,73,78,71,70,88,270,66,81,76,90,69,65,288,87,84,77,71,88,77,66,83,70,65,263,90,75,73,67,74,90,86,66,66,306,89,80,89,299,284,66,79,75,76,73,77,74,73,280,70,86,82,72,294,89,71,271,85,73,74,67,65,67,82,65,90,81,67,83,82,70,67,71,268,69,78,79,68,83,74,77,88,72,85,68,72,73,71,77,65,80,80,82,84,68,68,80,79,86,84,76,70,89,89,377,76,87,66,382,71,82,74,75,84,80,68,349,85,72,88,87,351,355,88,287,341,83,67,75,80,83,81,84,67,374,69,85,80,78,67,87,370,75,416,69,89,74,88,357,317,79,79,65,72,78,65,70,69,68,79,84,90,79,296,88,69,440,83,264,74,80,69,80,84,72,89,83,79,74,84,75,87,75,66,87,85,66,65,76,67,73,435,72,90,71,89,73,83,68,275,87,72,74,365,65,322,288,350,73,86,362,76,77,79,76,412,72,346,346,447,77,68,87,275,88,71,277,78,83,332,65,437,82,442,272,79,85,74,83,78,88,460,77,87,81,290,82,78,66,82,268,80,85,257,86,508,71,81,75,406,507,66,88,81,87,73,258,81,80,262,73,87,90,300,83,66,90,83,73,85,84,87,311,268,307,504,433,283,89,532,442,84,74,89,438,430,545,81,71,470,76,344,75,75,88,76,343,82,88,90,305,391,81,496,74,65,88,82,81,89,76,548,77,69,79,78,73,76,415,76,75,70,72,86,85,302,308,464,577,78,86,67,79,66,67,489,331,90,72,351,537,69,76,455,518,73,509,88,80,81,493,71,67,80,77,72,322,76,620,365,83,75,326,517,80,361,302,84,303,360,69,82,75,419,66,72,600,551,86,382,83,452,258,90,292,71,650,78,440,350,375,85,87,76,536,424,321,552,88,361,88,344,79,631,288,627,90,307,68,66,326,81,661,559,75,90,78,82,275,69,67,555,78,519,552,67,706,77,659,82,259,260,371,447,70,83,71,87,477,78,75,81,86,90,88,477,717,90,84,272,68,291,66,712,622,73,79,403,66,86,87,65,339,434,87,298,82,83,696,326,334,588,705,523,83,77,559,418,85,77,89,290,322,89,67,524,87,626,717,738,83,650,733,599,88,85,81,77,406,335,639,620,75,751,76,74,544,90,77,526,417,275,382,550,351,76,418,712,77,476,274,72,66,69,699,434,478,795,87,71,75,82,798,524,467,482,647,66,80,473,532,85,78,72,650,72,394,262,461,290,65,551,504,346,276,74,86,71,76,692,621,607,650,89,78,334,400,85,642,66,787,77,609,276,571,620,68,298,604,714,613,83,334,363,84,66,681,670,431,751,345,646,452,699,623,832,87,78,74,74,501,71,335,447,407,410,857,664,74,261,80,73,262,600,72,611,73,82,69,456,79,72,299,394,83,416,359,473,795,84,537,430,644,65,635,434,332,73,270,598,358,383,482,785,364,543,688,417,292,88,458,68,73,828,270,521,89,306,358,78,257,484,68,77,81,74,465,898,90,394,279,348,805,89,907,256,912,321,544,87,74,256,554,288,84,298,301,75,297,84,550,82,68,65,785,285,85,726,768,334,478,80,754,79,981,65,356,322,415,757,279,828,79,726,688,949,542,90,844,70,70,502,914,831,80,351,558,80,70,73,84,741,668,740,68,639,701,71,645,439,87,551,74,76,811,606,727,82,473,554,394,986,337,949,425,706,734,821,74,887,835,1033,85,939,527,398,72,1003,606,75,272,83,76,794,588,256,65,953,81,674,378,746,635,68,1048,373,82,389,73,315,407,76,528,871,556,83,603,65,395,449,458,664,537,317,1061,89,69,70,982,85,90,1037,80,580,643,65,349,1095,385,68,70,391,939,955,290,305,982,707,74,312,69,733,904,491,425,518,88,272,416,85,65,84,71,397,786,79,531,765,339,70,792,305,673,781,321,571,854,298,289,84,1131,325,750,313,397,261,340,573,1139,72,1109,67,1129,606,81,410,724,395,846,359,88,746,80,572,69,818,662,794,90,561,594,373,86,1109,1033,578,400,958,89,84,82,818,358,403,86,611,835,285,733,1181,82,768,311,393,683,327,819,442,754,361,87,68,571,911,67,70,524,607,279,86,78,436,69,644,1052,434,449,675,1131,291,90,1099,424,88,1110,742,787,1020,1018,919,265,79,725,578,412,69,809,432,907,848,532,599,594,572,475,66,76,411,282,675,475,389,641,941,455,76,83,551,1027,531,776,582,292,983,557,717,1222,981,556,712,69,547,692,85,1200,1265,517,600,440,424,582,468,382,1230,1010,78,500,551,439,665,454,87,604,710,276,698,731,360,381,769,953,68,805,67,419,80,481,550,68,71,78,90,67,298,1215,515,664,65,1320,378,89,784,68,583,457,81,262,496,283,67,425,475,873,1081,1210,295,86,309,1052,309,81,70,769,89,1068,1085,350,605,597,70,82,351,1142,1164,1059,958,1215,403,462,1219,729,675,1170,78,87,69,1346,1161,558,344,812,67,380,79,958,380,1321,435,1353,974,303,88,378,289,619,331,82,343,560,341,427,1030,68,418,493,662,1120,706,1030,699,86,81,399,465,556,1358,80,369,524,77,259,1375,277,551,366,70,459,358,86,69,398,906,78,501,455,1161,69,939,792,740,955,628,675,452,389,305,1298,1319,338,1265,773,74,1010,919,1172,584,1085,583,331,650,73,75,377,614,643,86,1130,79,1164,66,357,432,1301,270,305,88,379,399,524,71,1032,614,1100,1375,688,349,265,532,280,1330,1219,805,66,901,573,726,853,76,85,788,1211,910,493,417,437,85,730,1007,1097,1090,1484,1085,367,1359,298,682,355,412,572,847,939,72,349,1410,1019,307,875,67,602,1092,84,1498,730,367,466,468,623,1266,729,507,1190,529,524,82,281,79,87,798,1222,1432,323,846,638,1033,72,751,308,642,888,73,1475,81,701,754,66,379,622,1419,390,364,1546,654,981,908,70,699,477,407,846,748,68,1527,631,409,1330,70,389,1102,75,832,269,1321,682,89,1301,979,484,547,468,75,665,347,727,299,550,786,1062,1076,554,889,361,466,888,277,673,637,631,709,888,273,287,730,605,364,78,709,733,397,906,1222,500,888,970,86,580,1194,1322,432,871,818,510,488,516,85,382,1429,724,283,927,1189,784,954,1120,1078,430,952,1120,462,1585,1359,330,1010,349,1521,1096,1588,451,1095,515,550,281,891,1245,72,1436,1318,380,480,397,705,409,1402,369,642,650,67,958,1467,1505,472,1505,1315,1381,993,508,543,320,1068,587,768,516,861,1087,1498,555,600,1451,90,68,290,531,373,69,891,1425,821,84,70,705,707,1220,545,831,1465,390,76,427,1081,736,937,602,818,827,1174,1451,792,363,408,1479,340,1219,82,300,983,831,1396,624,437,393,780,477,1066,1301,265,1182,598,969,632,532,600,1460,1321,795,1313,1311,322,1160,954,1101,71,1245,1353,597,80,322,1010,1024,472,71,374,1073,645,465,1072,447,1321,866,614,372,1126,688,273,1624,941,756,305,561,1024,71,

1543


--End--

good