แจแแกแแแแแ
แกแแแแแ.
แแ แช แแกแ แแแแ แฎแแแก แฌแแ, แ แแแแกแแช แฃแแแแแ แกแแขแแขแจแ แแกแฌแแแแแแแ, แแงแ แแฃแ แกแ แแแกแชแแแแแแแจแ "แแแคแแ แแแชแแฃแแ แฃแกแแคแ แแฎแแแแแก แแ แแแ แแแฃแแ แแแแแแแแ". แแแแแแแแ แแแแแแแฎแแแแ แจแแแแแฅแแแ แแ แแแ แแแ, แ แแแแแแช แแแแแแแก GIF แคแแแแแแจแ แฉแแแแแก. แแแแแแฌแงแแแขแ แแแแก แแแแแแแแ แฏแแแแจแ.
แแ แกแขแแขแแแจแ แแ แแฆแแฌแแ แ แแแแแแแแ แแแแ แแฃแ แแฃแแฅแขแก, แแกแแแ แ แแแแ แจแแแฅแแแ แแก แแแขแแ แ แแ แแแ แแแ.
แแแแ แแฃแแ แแแฌแแแ
GIF แคแแ แแแขแ
GIF (Graphics Interchange Format - แแแแแกแแฎแฃแแแแแก แแแชแแแแก แคแแ แแแขแ) แแ แแก แแ แแคแแแฃแแ แกแฃแ แแแแแแก แจแแกแแแแฎแ แคแแ แแแขแ, แ แแแแแกแแช แจแแฃแซแแแ แจแแแแแฎแแก แจแแแฃแแจแฃแแ แแแแแชแแแแแ แฎแแ แแกแฎแแก แแแแแ แแแแก แแแ แแจแ 256 แคแแ แแแแ แคแแ แแแขแจแ. แแก แคแแ แแแขแ แจแแแฅแแแ 1987 แฌแแแก (GIF87a) CompuServe-แแก แแแแ แฅแกแแแแแจแ แ แแกแขแ แฃแแ แกแฃแ แแแแแแก แแแแแกแแชแแแแ. 1989 แฌแแแก แคแแ แแแขแ แจแแแชแแแแ (GIF89a), แแแแแแขแ แแแแญแแแ แแแแแแแกแ แแ แแแแแแชแแแก แแฎแแ แแแญแแ แ.
GIF แคแแแแแแก แแฅแแ แแแแแแก แกแขแ แฃแฅแขแฃแ แ. แแ แแแแแแแก แงแแแแแแแแก แแฅแแ แคแแฅแกแแ แแแฃแแ แกแแแ แซแ (แแ แแก แแแแแแแแแแฃแแแ แแแแแแ แ แแ แแจแแแ), แแแแขแแ แแแแฅแแแก แจแแฃแซแแแแแแแ แจแแชแแแแแก แแแจแแแแ แแแแก แจแแกแแฎแแ, แแฃ แกแแ แแแแแแ แแแแก แแแแแแฃแแ แแแแแ. แฃแแแ แขแแแแกแ แแ แแแแแแแชแแฃแ แ GIF แกแฃแ แแแแก แกแขแ แฃแฅแขแฃแ แ GIF89a แคแแ แแแขแจแ:
แกแขแ แฃแฅแขแฃแ แแก แงแแแแ แแแแแแแแ, แแ แจแแแแฎแแแแแจแ แฉแแแ แแแแแแขแแ แแกแแแแแ แแแแแแแฃแ แ แแแแแขแ แแก แแแแแแ แแ แแแแแขแ แแแ แแแกแฃแฎแแกแแแแแแแ แแแ แแแแขแ แแแแ:
CT
- แแแแแแแฃแ แ แแแแแขแ แแก แแ แกแแแแแ. แแฃ แแก แแ แแจแ แแแงแแแแแฃแแแ, แแแแแแแฃแ แ แแแแแขแ แ แฃแแแ แแแแฌแงแแก แแแฃแงแแแแแแแแ แแแแแแฃแ แ แแแ แแแแก แกแแฎแแแฃแ แแก แจแแแแแ.Size
- แแแแแขแ แแก แแแแ แแ แคแแ แแแแก แ แแแแแแแแ แกแฃแ แแแแ. แแแแจแแแแแแแแแ แแ แแแ แแแแขแ แแกแแแแก:
แแแแ
แคแแ แแแแก แ แแแแแแแแ
แแแแแขแ แแก แแแแ, แแแแขแ
7
256
768
6
128
384
5
64
192
4
32
96
3
16
48
2
8
24
1
4
12
0
2
6
แแแจแแคแแ แแก แแแแแแแแ
แแแแแกแแฎแฃแแแแแก แคแแแแแแจแ แจแแขแงแแแแแแแแแแก แแแจแแคแแ แแกแแแแก แแแแแงแแแแแฃแแ แแฅแแแแ แจแแแแแแ แแแแแแแแ:
- LSB (แแแแแแแแ แแแแจแแแแแแแแแ แแแขแ) แแแแแแ
- แแแแแขแ แแก แแแแแขแแแแก แแแแแแ
LSB แแแแแแ - แกแขแแแแแแแ แแคแแแก แแแแ แชแแแแแฃแแ แแแแแแ. แแแ แจแแแแแแ แแแแขแแแแแ แแก แแแแ แแแแจแแแแแแแแแ แแแขแแแแก แฉแแแแชแแแแแแกแแแ (แฉแแแแก แจแแแแฎแแแแแจแ, แแแแแแแฃแ แ แแแแแขแ แแก แแแแขแแแ) แคแแ แฃแแ แจแแขแงแแแแแแแแก แแแขแแ.
แแ แแแ แแแ แแแแแแงแแแแแก แแแแ แแ แแแขแก แแแแแแแฃแ แ แแแแแขแ แแก แแแแขแแแจแ, แ แแแแ แช แแ แแแแแแแก แแแฌแแแ. แแก แแแจแแแแก, แ แแ 24-แแแขแแแแ แกแฃแ แแแแกแแแแก, แกแแแแช แคแแ แแแแก แแแแแขแ แ แแ แแก แกแแแ แแแแขแ แฌแแแแแ, แแฃแ แฏแ แแ แแฌแแแแ, แแแกแจแ แจแแขแงแแแแแแแแก แฉแแกแแแก แจแแแแแ, แแแแแแฃแแ แคแแ แแก แแแแแแแแแขแ แจแแแชแแแแแ แแแฅแกแแแฃแ 3/255 แแ แแแแชแแแก แแแฎแแแแแ. แแกแแแ แชแแแแแแแ, แฏแแ แแ แแ, แแฅแแแแ แฃแฎแแแแแ แแ แซแแแแแ แจแแกแแแฉแแแแ แแแแแแแแแก แแแแแแกแแแแก แแ แแแแ แแช, แแ แแฅแแแแ แฎแแแฃแแ แแแแแแ แฎแแ แแกแฎแแก แแแคแแ แแแชแแแก แแแแแแแแแ แแแฌแงแแแแแแแแแแ.
แแแคแแ แแแชแแแก แ แแแแแแแแ แแแ แแแแแ แแฅแแแแ แแแแแแแแแแฃแแ แกแฃแ แแแแก แแแแแขแ แแก แแแแแแ. แแแแแแแแ แแแแแขแ แแก แแแฅแกแแแแแฃแ แ แแแแแ 256 แคแแ แ แแ แแฃ แแแแแแฃแแ แคแแ แแก แแแแแแแแแขแจแ แฉแแฌแแ แแแแ แจแแขแงแแแแแแแแก แแ แ แแแขแ, แแแจแแ แจแแขแงแแแแแแแแก แแแฅแกแแแแแฃแ แ แกแแแ แซแ (แกแฃแ แแแแ แแแฅแกแแแแแฃแ แ แแแแแขแ แแ) แแ แแก 192 แแแแขแ. แแแก แจแแแแแ, แ แแช แจแแขแงแแแแแแแ แฉแแกแแฃแแแ แกแฃแ แแแจแ, แคแแแแแก แแแแ แแ แแชแแแแแ.
แแแแแขแ แแก แแแคแแ แแแแแแก แแแแแแ, แ แแแแแแช แแฃแจแแแแก แแฎแแแแ GIF แกแขแ แฃแฅแขแฃแ แแกแแแแก. แแก แงแแแแแแ แแคแแฅแขแฃแ แ แแฅแแแแ แแชแแ แ แแแแแขแ แแก แแฅแแแ แกแฃแ แแแแแแ. แแแกแ แแ แกแ แแแแจแ แแแแแแแ แแแแก, แ แแ แแก แแ แแแก แแแแแขแ แแก แแแแแก, แ แแแแช แฃแแ แฃแแแแแงแแคแก แแแแแขแแแแ แแแแแแก แคแแ แแแ แแแแขแแแแก แแแชแแแแ แกแแญแแ แ แแแแขแแแแก แฉแแกแแฌแแ แแ. แแฃ แแแแแแแแแแกแฌแแแแแ, แ แแ แแแแแขแ แแก แแแแแแแแฃแ แ แแแแแ 2 แคแแ แ (6 แแแแขแ), แแแจแแ แฉแแจแแแแแฃแแ แจแแขแงแแแแแแแแก แแแฅแกแแแแแฃแ แ แแแแ แจแแแซแแแแ แแงแแก 256 ร 3โ6 = 762 แแแแขแ. แแแแฃแกแ แแ แแก แแแแแแ แแ แแแขแแแ แแคแแฃแแ แฃแกแแคแ แแฎแแแแ; แฉแแจแแแแแฃแแ แจแแขแงแแแแแแแแก แฌแแแแแฎแแ แจแแกแแซแแแแแแแ แแแแแกแแแแ แ แขแแฅแกแขแฃแ แ แ แแแแฅแขแแ แแก แแแแแงแแแแแแ, แแฃ แจแแขแงแแแแแแแ แแ แแแแฅแแแแแแแแ แ แแแแแขแแแแ แแแจแแคแแ แแก.
แแ แแฅแขแแแฃแแ แแแฌแแแ
แแ แแแ แแแแก แแแแแแแ
แแแจแแคแแ แแกแ แแ แแแจแแคแแ แแก แแแแแ แแแแแแแก แแแแกแแฎแแ แชแแแแแแแแ แงแแแแ แกแแญแแ แ แแแกแขแ แฃแแแแขแ แจแแแแก แแแแแขแจแ com.tsarik.steganography
. แแก แแแแแขแ แแแแชแแแก แแแขแแ แคแแแกแก Encryptor
แแแแแแแแแ encrypt
ะธ decrypt
, แฒแแแกแ Binary
, แ แแแแแแช แแซแแแแ แแแขแแก แแแกแแแแแแแ แแฃแจแแแแแก แจแแกแแซแแแแแแแแก, แแกแแแ แแแแแแแแแแก แแแแกแแแก UnableToEncryptException
ะธ UnableToDecryptException
, แ แแแแแแช แฃแแแ แแฅแแแก แแแแแงแแแแแฃแแ แแแขแแ แคแแแกแแก แแแแแแแแจแ Encryptor
แจแแกแแแแแแกแแ แแแแแ แแแแก แแ แแแแแแแ แแแแก แจแแชแแแแแแแก แจแแแแฎแแแแแจแ.
แซแแ แแแแแ แแ แแแ แแแแก แแแแแขแ com.tsarik.programs.gifed
แแแแชแแแก แแแจแแแแแ แแ แแแ แแแแก แแแแกแก แกแขแแขแแแฃแ แ แแแแแแแ main
, แกแแจแฃแแแแแแก แแแซแแแแ แแแฃแจแแแ แแ แแแ แแแ; แแแแกแ, แ แแแแแแช แแแแฎแแแก แแ แแแ แแแแก แแแ แแแแขแ แแแก; แแ แแแแแขแแแ แกแฎแแ แแแแกแแแแแ.
แแแแแ แแแแแ แแแแแแแก แแแแฎแแ แชแแแแแแ แฌแแ แแแแแแแแแ แแฅแแแแ แแแแแขแจแ com.tsarik.programs.gifed.gif
แแแแกแแแ GIFEncryptorByLSBMethod
ะธ GIFEncryptorByPaletteExtensionMethod
. แแ แแแ แแก แแแแกแ แแแแแฎแแ แชแแแแแแก แแแขแแ แคแแแกแก Encryptor
.
GIF แคแแ แแแขแแก แกแขแ แฃแฅแขแฃแ แแแแ แแแแแแแแแแ แ, แจแแแแซแแแแ แจแแฅแแแแ แแแแแแ แแแแแ แแแแ แกแฃแ แแแแก แแแแแขแ แแจแ แจแแขแงแแแแแแแแก แจแแกแแขแแแแ:
แแแแแกแแฎแฃแแแแแแ แจแแขแงแแแแแแแแก แแ แกแแแแแแก แแแกแแแแแแแ, แกแแญแแ แแ แจแแขแงแแแแแแแแก แแแกแแฌแงแแกแจแ แแแแแแขแแก แแแขแแแแก แแแ แแแแฃแแ แแแแแแแแแแ แแแ, แ แแแแแกแแช แแแแแแแ แ แฏแแ แแแแฎแฃแแแแก แแ แแแแฌแแแแก แกแแกแฌแแ แแก. แแฃ แแก แแ แแแแฎแแแแ, แแแจแแ แแแแแแแ, แ แแ แกแฃแ แแแแ แคแแ แฃแแ แจแแขแงแแแแแแแ แแ แแ แแก. แจแแแแแแ, แแฅแแแ แฃแแแ แแแฃแแแแแ แจแแขแงแแแแแแแแก แฎแแแแ แซแแแแแแ. แจแแแแแ แแแแแ แจแแขแงแแแแแแแแก แขแแฅแกแขแ.
แแแแแ แแแแแชแฎแแแแก แแแแกแแก แแแแแ แแแ:
แแ แแแ แแแแก แแแแฎแแ แชแแแแแแ
แแแแแ แแ แแแ แแแแก แแแแฎแแ แชแแแแแแ แจแแแซแแแแ แแแแงแแก แแ แแแแแแแแแขแแ: แแแขแแ แคแแแกแแก แแแจแแคแแ แแก แแ แแแจแแคแแ แแก แแแแแแแแแก แแแแฎแแ แชแแแแแแ Encryptor
, แแแแกแแแจแ GIFEncryptorByLSBMethod
ะธ GIFEncryptorByPaletteExtensionMethod
แแ แแแแฎแแแ แแแแแก แแแขแแ แคแแแกแแก แแแแแ แแแ.
แแแแแฎแแแแ แแแแกแ GIFEncryptorByLSBMethod
.
แกแคแแ แแจแ firstLSBit
ะธ secondLSBit
แจแแแชแแแแแก แแแแแกแแฎแฃแแแแแก แแแแแแฃแแ แแแแขแแก แแแขแแแแก แ แแแแแแแแแก, แ แแแแแจแแช แฃแแแ แจแแแขแแแแก แจแแขแงแแแแแแแ แแ แกแแแแแแแช แฃแแแ แฌแแแแแแฎแแก แจแแขแงแแแแแแแ. แแแแ checkSequence
แแแแฎแแแก แจแแแแฌแแแแแก แแแขแแแแก แแแแแแแแแแ แแแแก, แ แแแ แฃแแ แฃแแแแแงแแก แฉแแจแแแแแฃแแ แจแแขแงแแแแแแแแก แแแแชแแแแ. แกแขแแขแแแฃแ แ แแแแแแ getEncryptingFileParameters
แแแ แฃแแแแก แแแแแแแแฃแแ แคแแแแแก แแแ แแแแขแ แแแก แแ แแแขแแแชแแฃแ แ แจแแขแงแแแแแแแแก แแแฎแแกแแแแแแแแแก.
แแแแแแแก แแแแแ แแแแ encrypt
แแแแกแ GIFEncryptorByLSBMethod
:
แแ แแแกแ แแแแ:
@Override
public void encrypt(File in, File out, String text) throws UnableToEncodeException, NullPointerException, IOException {
if (in == null) {
throw new NullPointerException("Input file is null");
}
if (out == null) {
throw new NullPointerException("Output file is null");
}
if (text == null) {
throw new NullPointerException("Text is null");
}
// read bytes from input file
byte[] bytes = new byte[(int)in.length()];
InputStream is = new FileInputStream(in);
is.read(bytes);
is.close();
// check format
if (!(new String(bytes, 0, 6)).equals("GIF89a")) {
throw new UnableToEncodeException("Input file has wrong GIF format");
}
// read palette size property from first three bits in the 10-th byte from the file
byte[] b10 = Binary.toBitArray(bytes[10]);
byte bsize = Binary.toByte(new byte[] {b10[0], b10[1], b10[2]});
// calculate color count and possible message length
int bOrigColorCount = (int)Math.pow(2, bsize+1);
int possibleMessageLength = bOrigColorCount*3/4;
int possibleTextLength = possibleMessageLength-2;// one byte for check and one byte for message length
if (possibleTextLength < text.length()) {
throw new UnableToEncodeException("Text is too big");
}
int n = 13;
// write check sequence
for (int i = 0; i < checkSequence.length/2; i++) {
byte[] ba = Binary.toBitArray(bytes[n]);
ba[firstLSBit] = checkSequence[2*i];
ba[secondLSBit] = checkSequence[2*i+1];
bytes[n] = Binary.toByte(ba);
n++;
}
// write text length
byte[] cl = Binary.toBitArray((byte)text.length());
for (int i = 0; i < cl.length/2; i++) {
byte[] ba = Binary.toBitArray(bytes[n]);
ba[firstLSBit] = cl[2*i];
ba[secondLSBit] = cl[2*i+1];
bytes[n] = Binary.toByte(ba);
n++;
}
// write message
byte[] textBytes = text.getBytes();
for (int i = 0; i < textBytes.length; i++) {
byte[] c = Binary.toBitArray(textBytes[i]);
for (int ci = 0; ci < c.length/2; ci++) {
byte[] ba = Binary.toBitArray(bytes[n]);
ba[firstLSBit] = c[2*ci];
ba[secondLSBit] = c[2*ci+1];
bytes[n] = Binary.toByte(ba);
n++;
}
}
// write output file
OutputStream os = new FileOutputStream(out);
os.write(bytes);
os.close();
}
แแแแแแแก แแแแแ แแแแ แแ แฌแงแแ แแก แแแแ decrypt
แแแแกแ GIFEncryptorByLSBMethod
:
@Override
public String decrypt(File in) throws UnableToDecodeException, NullPointerException, IOException {
if (in == null) {
throw new NullPointerException("Input file is null");
}
// read bytes from input file
byte[] bytes = new byte[(int)in.length()];
InputStream is = new FileInputStream(in);
is.read(bytes);
is.close();
// check format
if (!(new String(bytes, 0, 6)).equals("GIF89a")) {
throw new UnableToDecodeException("Input file has wrong GIF format");
}
// read palette size property from first three bits in the 10-th byte from the file
byte[] b10 = Binary.toBitArray(bytes[10]);
byte bsize = Binary.toByte(new byte[] {b10[0], b10[1], b10[2]});
// calculate color count and possible message length
int bOrigColorCount = (int)Math.pow(2, bsize+1);
int possibleMessageLength = bOrigColorCount*3/4;
int possibleTextLength = possibleMessageLength-2; // one byte for check and one byte for message length
int n = 13;
// read check sequence
byte[] csBits = new byte[checkSequence.length];
for (int i = 0; i < 4; i++) {
byte[] ba = Binary.toBitArray(bytes[n]);
csBits[2*i] = ba[firstLSBit];
csBits[2*i+1] = ba[secondLSBit];
n++;
}
byte cs = Binary.toByte(csBits);
if (cs != Binary.toByte(checkSequence)) {
throw new UnableToDecodeException("There is no encrypted message in the image (Check sequence is incorrect)");
}
// read text length
byte[] cl = new byte[8];
for (int i = 0; i < 4; i++) {
byte[] ba = Binary.toBitArray(bytes[n]);
cl[2*i] = ba[firstLSBit];
cl[2*i+1] = ba[secondLSBit];
n++;
}
byte textLength = Binary.toByte(cl);
if (textLength < 0) {
throw new UnableToDecodeException("Decoded text length is less than 0");
}
if (possibleTextLength < textLength) {
throw new UnableToDecodeException("There is no messages (Decoded message length (" + textLength + ") is less than Possible message length (" + possibleTextLength + "))");
}
// read text bits and make text bytes
byte[] bt = new byte[textLength];
for (int i = 0; i < bt.length; i++) {
byte[] bc = new byte[8];
for (int bci = 0; bci < bc.length/2; bci++) {
byte[] ba = Binary.toBitArray(bytes[n]);
bc[2*bci] = ba[firstLSBit];
bc[2*bci+1] = ba[secondLSBit];
n++;
}
bt[i] = Binary.toByte(bc);
}
return new String(bt);
}
แแแแกแแก แแแแฎแแ แชแแแแแแ GIFEncryptorByPaletteExtensionMethod
แแกแแแแกแ แแฅแแแแ, แแฎแแแแ แแแคแแ แแแชแแแก แจแแแแฎแแแก/แฌแแแแแฎแแแก แแแแแแแ แแแแกแฎแแแแแแฃแแ.
แฒแแแกแจแ MainFrame
แจแแคแฃแแแแก แแแแแแแแ แแฆแฌแแ แแแแ: encryptImage(Encryptor encryptor)
ะธ decryptImage(Encryptor encryptor)
แแแขแแ แคแแแกแแก แแแแแแแแแก แจแแแแแแแแก แแแแฃแจแแแแแ Encryptor
แแ แแแแฎแแแ แแแแแแแ แแแขแแ แแฅแชแแ, แแแฃ แคแแแแแก แจแแ แฉแแแแก แแแแแแแแก แแแฎแกแแ, แจแแชแแแแแก แจแแขแงแแแแแแแแแแก แฉแแแแแแ แแ แ.แจ.; แแกแแแ แ แแแแ แช แกแฎแแ แแแแแแแแ: openImage()
, แ แแแแแแช แกแแจแฃแแแแแแก แแซแแแแก แแแแฎแแแ แแแแแก แแแ แฉแแแก แกแฃแ แแแ, exit()
, แ แแแแแแช แแแแแแแก แแแแแแแชแแแแแ. แแ แแแแแแแแก แแซแแฎแแแ Action
แแแแแฃแก แจแแกแแแแแแกแ แแแแแแแขแแแ. แแก แแแแกแ แแแแแขแแแแ แแฎแแ แชแแแแแแก แแแแฎแแแ แ แแแแแแแแก: createComponents()
- แคแแ แแแก แแแแแแแแแขแแแแก แจแแฅแแแ, loadImageFile(File f)
- แกแฃแ แแแแก แฉแแขแแแ แแแ แคแแแแแแแ แกแแแชแแแแฃแ แแแแแแแแแขแจแ. แแแแกแแก แแแแฎแแ แชแแแแแแ GIFEncryptorByPaletteExtensionMethod
แแแแกแแก แแแแฎแแ แชแแแแแแแก แแกแแแแกแ GIFEncryptorByLSBMethod
, แแแแแแ แ แแแแกแฎแแแแแแ แแแแแแแ แแแแก แแแแจแ, แแฃ แ แแแแ แแฌแแ แแแ แแ แแแแแฎแแแ แแแแแขแ แแแแ แจแแขแงแแแแแแแ แแแแขแ.
แแ แแแ แแแแก แแแแ แแชแแ
LBS แแแแแแ
แแแฅแแแ, แแ แแก แแกแแแ แกแฃแ แแแ:
แแ แกแฃแ แแแแ แแแแแขแ แ แจแแแแแแ 256 แคแแ แแกแแแ (แ แแแแ แช Paint แแแแฎแแแก). แแแ แแแแ แแแฎแ แคแแ แแ: แแแแ แ, แจแแแ, แฌแแแแแ, แแฌแแแแ. แกแฎแแ แคแแ แแแ แจแแแแ. แแแแแแแฃแ แ แแแแแขแ แแก แแแขแแแแก แแแแแแแแแแ แแแ แแฅแแแแ แจแแแแแแ:
11111111 11111111 11111111 00000000 00000000 00000000 11111111 00000000 00000000 00000000 11111111 00000000...
แจแแขแงแแแแแแแแก แฉแแจแแแแแแก แจแแแแแ, แฎแแแแแกแแฃแแ แแแขแแแ แจแแแชแแแแแ แจแแขแงแแแแแแแแก แแแขแแ. แจแแแแแแ แแแฆแแแฃแแ แกแฃแ แแแ แแแแฅแแแก แแ แแแแกแฎแแแแแแแ แแ แแแแแแแแกแแแ.
Original
แกแฃแ แแแ แฉแแจแแแแแฃแแ แจแแขแงแแแแแแแแ
แแแแแขแ แแก แแแคแแ แแแแแแก แแแแแแ
แ แแแแกแแช แแ แแแแแแแ แฎแกแแแ แกแฃแ แแแก, แ แแแแแแช แจแแแชแแแก แจแแขแงแแแแแแแแก, แแแฎแแแ แจแแแแแ แกแฃแ แแแก:
แแแแแแแ, แ แแ แแก แแแแแแ แแ แแแฃแจแแแแแก แกแ แฃแแคแแกแแแแแ แฏแแจแฃแจแฃแ แ แกแแฅแแแแแแแแกแแแแก แแ แจแแกแแซแแแ แกแแญแแ แ แแแฎแแแก แจแแขแงแแแแแแแแก แแแแแขแแแแแ แแแจแแคแแ แ.
แแแจแแคแแ แ/แแแจแแคแแ แ แแแแแแชแแฃแ แกแฃแ แแแแแจแ แแฃแจแแแแก แแกแแแ, แ แแแแ แช แฉแแแฃแแแแ แแ แกแขแแขแแแฃแ แกแฃแ แแแแแจแ, แแแแ แแ แแแแแแชแแ แแ แแ แแก แแแขแแฎแแแ.
แแแแแงแแแแแฃแแ แฌแงแแ แแแแ:
http://ru.wikipedia.org/wiki/Gif http://ru.wikipedia.org/wiki/ะกัะตะณะฐะฝะพะณัะฐัะธั http://home.onego.ru/~chiezo/gif.htm
แฉแแแแขแแแ แแแ:
แฌแงแแ แ: www.habr.com