thieumao

Chuẩn Malware

Sep 17th, 2013
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 20.60 KB | None | 0 0
  1. /*
  2.  * To change this template, choose Tools | Templates
  3.  * and open the template in the editor.
  4.  */
  5. package FileToHash;
  6.  
  7. import java.awt.FileDialog;
  8. import java.io.File;
  9. import java.io.FileInputStream;
  10. import java.security.MessageDigest;
  11. import java.util.logging.Level;
  12. import java.util.logging.Logger;
  13. import javax.swing.JOptionPane;
  14.  
  15. /**
  16.  *
  17.  * @author leo
  18.  */
  19. public class Malware extends javax.swing.JFrame {
  20.  
  21.     private File file;
  22.  
  23.     /**
  24.      * Creates new form Malware
  25.      */
  26.     public Malware() {
  27.         initComponents();
  28.     }
  29.  
  30.     /**
  31.      * This method is called from within the constructor to initialize the form.
  32.      * WARNING: Do NOT modify this code. The content of this method is always
  33.      * regenerated by the Form Editor.
  34.      */
  35.     @SuppressWarnings("unchecked")
  36.     // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
  37.     private void initComponents() {
  38.  
  39.         jLabel1 = new javax.swing.JLabel();
  40.         jLabel2 = new javax.swing.JLabel();
  41.         jLabel3 = new javax.swing.JLabel();
  42.         jLabel4 = new javax.swing.JLabel();
  43.         jLabel5 = new javax.swing.JLabel();
  44.         jLabel6 = new javax.swing.JLabel();
  45.         jLabel7 = new javax.swing.JLabel();
  46.         jLabel8 = new javax.swing.JLabel();
  47.         jLabel9 = new javax.swing.JLabel();
  48.         tfPath = new javax.swing.JTextField();
  49.         tfMD5 = new javax.swing.JTextField();
  50.         tfSHA1 = new javax.swing.JTextField();
  51.         tfSHA256 = new javax.swing.JTextField();
  52.         tfSHA384 = new javax.swing.JTextField();
  53.         tfSHA512 = new javax.swing.JTextField();
  54.         tfName = new javax.swing.JTextField();
  55.         tfSize = new javax.swing.JTextField();
  56.         tfType = new javax.swing.JTextField();
  57.         btPath = new javax.swing.JButton();
  58.         btRun = new javax.swing.JButton();
  59.         btClear = new javax.swing.JButton();
  60.         btAbout = new javax.swing.JButton();
  61.         btExit = new javax.swing.JButton();
  62.  
  63.         setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
  64.         setTitle("Malware");
  65.  
  66.         jLabel1.setText("Path");
  67.  
  68.         jLabel2.setText("MD5");
  69.  
  70.         jLabel3.setText("SHA1");
  71.  
  72.         jLabel4.setText("SHA256");
  73.  
  74.         jLabel5.setText("SHA384");
  75.  
  76.         jLabel6.setText("SHA512");
  77.  
  78.         jLabel7.setText("Name");
  79.  
  80.         jLabel8.setText("Size");
  81.  
  82.         jLabel9.setText("Type");
  83.  
  84.         tfPath.setColumns(60);
  85.         tfPath.setFont(new java.awt.Font("Times New Roman", 0, 11)); // NOI18N
  86.  
  87.         tfMD5.setColumns(60);
  88.         tfMD5.setFont(new java.awt.Font("Times New Roman", 0, 11)); // NOI18N
  89.  
  90.         tfSHA1.setColumns(60);
  91.         tfSHA1.setFont(new java.awt.Font("Times New Roman", 0, 11)); // NOI18N
  92.  
  93.         tfSHA256.setColumns(60);
  94.         tfSHA256.setFont(new java.awt.Font("Times New Roman", 0, 11)); // NOI18N
  95.  
  96.         tfSHA384.setColumns(60);
  97.         tfSHA384.setFont(new java.awt.Font("Times New Roman", 0, 11)); // NOI18N
  98.  
  99.         tfSHA512.setColumns(60);
  100.         tfSHA512.setFont(new java.awt.Font("Times New Roman", 0, 11)); // NOI18N
  101.  
  102.         tfName.setColumns(60);
  103.         tfName.setFont(new java.awt.Font("Times New Roman", 0, 11)); // NOI18N
  104.  
  105.         tfSize.setColumns(60);
  106.         tfSize.setFont(new java.awt.Font("Times New Roman", 0, 11)); // NOI18N
  107.  
  108.         tfType.setColumns(60);
  109.         tfType.setFont(new java.awt.Font("Times New Roman", 0, 11)); // NOI18N
  110.  
  111.         btPath.setText("...");
  112.         btPath.addActionListener(new java.awt.event.ActionListener() {
  113.             public void actionPerformed(java.awt.event.ActionEvent evt) {
  114.                 btPathActionPerformed(evt);
  115.             }
  116.         });
  117.  
  118.         btRun.setText("Run");
  119.         btRun.addActionListener(new java.awt.event.ActionListener() {
  120.             public void actionPerformed(java.awt.event.ActionEvent evt) {
  121.                 btRunActionPerformed(evt);
  122.             }
  123.         });
  124.  
  125.         btClear.setText("Clear");
  126.         btClear.addActionListener(new java.awt.event.ActionListener() {
  127.             public void actionPerformed(java.awt.event.ActionEvent evt) {
  128.                 btClearActionPerformed(evt);
  129.             }
  130.         });
  131.  
  132.         btAbout.setText("About");
  133.         btAbout.addActionListener(new java.awt.event.ActionListener() {
  134.             public void actionPerformed(java.awt.event.ActionEvent evt) {
  135.                 btAboutActionPerformed(evt);
  136.             }
  137.         });
  138.  
  139.         btExit.setText("Exit");
  140.         btExit.addActionListener(new java.awt.event.ActionListener() {
  141.             public void actionPerformed(java.awt.event.ActionEvent evt) {
  142.                 btExitActionPerformed(evt);
  143.             }
  144.         });
  145.  
  146.         javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
  147.         getContentPane().setLayout(layout);
  148.         layout.setHorizontalGroup(
  149.             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
  150.             .addGroup(layout.createSequentialGroup()
  151.                 .addGap(18, 18, 18)
  152.                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
  153.                     .addComponent(jLabel1)
  154.                     .addComponent(jLabel2)
  155.                     .addComponent(jLabel3)
  156.                     .addComponent(jLabel4)
  157.                     .addComponent(jLabel5)
  158.                     .addComponent(jLabel6)
  159.                     .addComponent(jLabel7)
  160.                     .addComponent(jLabel8)
  161.                     .addComponent(jLabel9))
  162.                 .addGap(18, 18, 18)
  163.                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
  164.                     .addGroup(layout.createSequentialGroup()
  165.                         .addComponent(btRun)
  166.                         .addGap(18, 18, 18)
  167.                         .addComponent(btClear)
  168.                         .addGap(18, 18, 18)
  169.                         .addComponent(btAbout)
  170.                         .addGap(18, 18, 18)
  171.                         .addComponent(btExit))
  172.                     .addGroup(layout.createSequentialGroup()
  173.                         .addComponent(tfPath, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
  174.                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
  175.                         .addComponent(btPath))
  176.                     .addComponent(tfMD5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
  177.                     .addComponent(tfSHA1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
  178.                     .addComponent(tfSHA256, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
  179.                     .addComponent(tfSHA384, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
  180.                     .addComponent(tfSHA512, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
  181.                     .addComponent(tfName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
  182.                     .addComponent(tfSize, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
  183.                     .addComponent(tfType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
  184.                 .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
  185.         );
  186.         layout.setVerticalGroup(
  187.             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
  188.             .addGroup(layout.createSequentialGroup()
  189.                 .addGap(26, 26, 26)
  190.                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
  191.                     .addComponent(jLabel1)
  192.                     .addComponent(tfPath, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
  193.                     .addComponent(btPath))
  194.                 .addGap(18, 18, 18)
  195.                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
  196.                     .addComponent(jLabel2)
  197.                     .addComponent(tfMD5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
  198.                 .addGap(18, 18, 18)
  199.                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
  200.                     .addComponent(jLabel3)
  201.                     .addComponent(tfSHA1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
  202.                 .addGap(18, 18, 18)
  203.                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
  204.                     .addComponent(jLabel4)
  205.                     .addComponent(tfSHA256, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
  206.                 .addGap(18, 18, 18)
  207.                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
  208.                     .addComponent(jLabel5)
  209.                     .addComponent(tfSHA384, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
  210.                 .addGap(18, 18, 18)
  211.                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
  212.                     .addComponent(jLabel6)
  213.                     .addComponent(tfSHA512, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
  214.                 .addGap(18, 18, 18)
  215.                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
  216.                     .addComponent(jLabel7)
  217.                     .addComponent(tfName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
  218.                 .addGap(18, 18, 18)
  219.                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
  220.                     .addComponent(jLabel8)
  221.                     .addComponent(tfSize, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
  222.                 .addGap(18, 18, 18)
  223.                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
  224.                     .addComponent(jLabel9)
  225.                     .addComponent(tfType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
  226.                 .addGap(18, 18, 18)
  227.                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
  228.                     .addComponent(btRun)
  229.                     .addComponent(btClear)
  230.                     .addComponent(btAbout)
  231.                     .addComponent(btExit))
  232.                 .addContainerGap(16, Short.MAX_VALUE))
  233.         );
  234.  
  235.         pack();
  236.     }// </editor-fold>                        
  237.  
  238.     private void btPathActionPerformed(java.awt.event.ActionEvent evt) {                                      
  239.         // TODO add your handling code here:
  240.         tfMD5.setText("");
  241.         tfSHA1.setText("");
  242.         tfSHA256.setText("");
  243.         tfSHA384.setText("");
  244.         tfSHA512.setText("");
  245.         tfName.setText("");
  246.         tfSize.setText("");
  247.         tfType.setText("");
  248.  
  249.         file = getFileDialogOpen("*.*");
  250.         if (file == null) {
  251.             return;
  252.         }
  253.         tfPath.setText(file.getAbsolutePath());
  254.     }                                      
  255.  
  256.     private void btRunActionPerformed(java.awt.event.ActionEvent evt) {                                      
  257.         // TODO add your handling code here:
  258.         try {
  259.             tfMD5.setText(ToMD5(file.getAbsolutePath()));
  260.             tfSHA1.setText(ToSHA1(file.getAbsolutePath()));
  261.             tfSHA256.setText(ToSHA256(file.getAbsolutePath()));
  262.             tfSHA384.setText(ToSHA384(file.getAbsolutePath()));
  263.             tfSHA512.setText(ToSHA512(file.getAbsolutePath()));
  264.         } catch (Exception ex) {
  265.             Logger.getLogger(FileToHash.class.getName()).log(Level.SEVERE, null, ex);
  266.         }
  267.  
  268.         tfName.setText(file.getName());
  269.         tfSize.setText(String.valueOf(file.length() + " byte"));
  270.  
  271.         int dot = file.getName().lastIndexOf(".");
  272.         if (dot < 0) {
  273.             tfType.setText("NULL");
  274.         } else {
  275.             tfType.setText(file.getName().substring(dot + 1).toUpperCase());
  276.         }
  277.     }                                    
  278.  
  279.     private void btClearActionPerformed(java.awt.event.ActionEvent evt) {                                        
  280.         // TODO add your handling code here:
  281.         tfPath.setText("");
  282.         tfMD5.setText("");
  283.         tfSHA1.setText("");
  284.         tfSHA256.setText("");
  285.         tfSHA384.setText("");
  286.         tfSHA512.setText("");
  287.         tfName.setText("");
  288.         tfSize.setText("");
  289.         tfType.setText("");
  290.     }                                      
  291.  
  292.     private void btAboutActionPerformed(java.awt.event.ActionEvent evt) {                                        
  293.         // TODO add your handling code here:
  294.         JOptionPane.showMessageDialog(null, "Author: Thieu Mao - KSEC");
  295.     }                                      
  296.  
  297.     private void btExitActionPerformed(java.awt.event.ActionEvent evt) {                                      
  298.         // TODO add your handling code here:
  299.         System.exit(0);
  300.     }                                      
  301.  
  302.     /**
  303.      * @param args the command line arguments
  304.      */
  305.     public static void main(String args[]) {
  306.         /* Set the Nimbus look and feel */
  307.         //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
  308.         /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
  309.          * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
  310.          */
  311.         try {
  312.             for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
  313.                 if ("Nimbus".equals(info.getName())) {
  314.                     javax.swing.UIManager.setLookAndFeel(info.getClassName());
  315.                     break;
  316.                 }
  317.             }
  318.         } catch (ClassNotFoundException ex) {
  319.             java.util.logging.Logger.getLogger(Malware.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
  320.         } catch (InstantiationException ex) {
  321.             java.util.logging.Logger.getLogger(Malware.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
  322.         } catch (IllegalAccessException ex) {
  323.             java.util.logging.Logger.getLogger(Malware.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
  324.         } catch (javax.swing.UnsupportedLookAndFeelException ex) {
  325.             java.util.logging.Logger.getLogger(Malware.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
  326.         }
  327.         //</editor-fold>
  328.  
  329.         /* Create and display the form */
  330.         java.awt.EventQueue.invokeLater(new Runnable() {
  331.             public void run() {
  332.                 new Malware().setVisible(true);
  333.             }
  334.         });
  335.     }
  336.     // Variables declaration - do not modify                    
  337.     private javax.swing.JButton btAbout;
  338.     private javax.swing.JButton btClear;
  339.     private javax.swing.JButton btExit;
  340.     private javax.swing.JButton btPath;
  341.     private javax.swing.JButton btRun;
  342.     private javax.swing.JLabel jLabel1;
  343.     private javax.swing.JLabel jLabel2;
  344.     private javax.swing.JLabel jLabel3;
  345.     private javax.swing.JLabel jLabel4;
  346.     private javax.swing.JLabel jLabel5;
  347.     private javax.swing.JLabel jLabel6;
  348.     private javax.swing.JLabel jLabel7;
  349.     private javax.swing.JLabel jLabel8;
  350.     private javax.swing.JLabel jLabel9;
  351.     private javax.swing.JTextField tfMD5;
  352.     private javax.swing.JTextField tfName;
  353.     private javax.swing.JTextField tfPath;
  354.     private javax.swing.JTextField tfSHA1;
  355.     private javax.swing.JTextField tfSHA256;
  356.     private javax.swing.JTextField tfSHA384;
  357.     private javax.swing.JTextField tfSHA512;
  358.     private javax.swing.JTextField tfSize;
  359.     private javax.swing.JTextField tfType;
  360.     // End of variables declaration                  
  361.  
  362.     private File getFileDialogOpen(String string) {
  363.         FileDialog fd = new FileDialog(this, "Chọn file", FileDialog.LOAD);
  364.         fd.setFile(string);
  365.         fd.setVisible(true);
  366.         if (fd.getFile() == null) {
  367.             return null;
  368.         }
  369.         File file = new File(fd.getDirectory() + fd.getFile());
  370.         if (!file.canRead()) {
  371.             JOptionPane.showMessageDialog(null, "File bạn chọn không thể đọc.",
  372.                     "Error", JOptionPane.ERROR_MESSAGE);
  373.             return null;
  374.         }
  375.         return file;
  376.     }
  377.  
  378.     private static String ToMD5(String FilePath) throws Exception {
  379.         MessageDigest md = MessageDigest.getInstance("MD5");
  380.         FileInputStream fis = new FileInputStream(FilePath);
  381.         byte[] dataBytes = new byte[1024];
  382.         int nread = 0;
  383.         while ((nread = fis.read(dataBytes)) != -1) {
  384.             md.update(dataBytes, 0, nread);
  385.         };
  386.         byte[] mdbytes = md.digest();
  387.         //convert the byte to hex
  388.         StringBuffer sb = new StringBuffer();
  389.         for (int i = 0; i < mdbytes.length; i++) {
  390.             sb.append(Integer.toString((mdbytes[i] & 0xff) + 0x100, 16).substring(1));
  391.         }
  392.         return sb.toString();
  393.     }
  394.  
  395.     private static String ToSHA1(String FilePath) throws Exception {
  396.         MessageDigest md = MessageDigest.getInstance("SHA1");
  397.         FileInputStream fis = new FileInputStream(FilePath);
  398.         byte[] dataBytes = new byte[1024];
  399.         int nread = 0;
  400.         while ((nread = fis.read(dataBytes)) != -1) {
  401.             md.update(dataBytes, 0, nread);
  402.         };
  403.         byte[] mdbytes = md.digest();
  404.         //convert the byte to hex
  405.         StringBuffer sb = new StringBuffer();
  406.         for (int i = 0; i < mdbytes.length; i++) {
  407.             sb.append(Integer.toString((mdbytes[i] & 0xff) + 0x100, 16).substring(1));
  408.         }
  409.         return sb.toString();
  410.     }
  411.  
  412.     private static String ToSHA256(String FilePath) throws Exception {
  413.         MessageDigest md = MessageDigest.getInstance("SHA-256");
  414.         FileInputStream fis = new FileInputStream(FilePath);
  415.         byte[] dataBytes = new byte[1024];
  416.         int nread = 0;
  417.         while ((nread = fis.read(dataBytes)) != -1) {
  418.             md.update(dataBytes, 0, nread);
  419.         };
  420.         byte[] mdbytes = md.digest();
  421.         //convert the byte to hex
  422.         StringBuffer sb = new StringBuffer();
  423.         for (int i = 0; i < mdbytes.length; i++) {
  424.             sb.append(Integer.toString((mdbytes[i] & 0xff) + 0x100, 16).substring(1));
  425.         }
  426.         return sb.toString();
  427.     }
  428.  
  429.     private static String ToSHA384(String FilePath) throws Exception {
  430.         MessageDigest md = MessageDigest.getInstance("SHA-384");
  431.         FileInputStream fis = new FileInputStream(FilePath);
  432.         byte[] dataBytes = new byte[1024];
  433.         int nread = 0;
  434.         while ((nread = fis.read(dataBytes)) != -1) {
  435.             md.update(dataBytes, 0, nread);
  436.         };
  437.         byte[] mdbytes = md.digest();
  438.         //convert the byte to hex
  439.         StringBuffer sb = new StringBuffer();
  440.         for (int i = 0; i < mdbytes.length; i++) {
  441.             sb.append(Integer.toString((mdbytes[i] & 0xff) + 0x100, 16).substring(1));
  442.         }
  443.         return sb.toString();
  444.     }
  445.  
  446.     private static String ToSHA512(String FilePath) throws Exception {
  447.         MessageDigest md = MessageDigest.getInstance("SHA-512");
  448.         FileInputStream fis = new FileInputStream(FilePath);
  449.         byte[] dataBytes = new byte[1024];
  450.         int nread = 0;
  451.         while ((nread = fis.read(dataBytes)) != -1) {
  452.             md.update(dataBytes, 0, nread);
  453.         };
  454.         byte[] mdbytes = md.digest();
  455.         //convert the byte to hex
  456.         StringBuffer sb = new StringBuffer();
  457.         for (int i = 0; i < mdbytes.length; i++) {
  458.             sb.append(Integer.toString((mdbytes[i] & 0xff) + 0x100, 16).substring(1));
  459.         }
  460.         return sb.toString();
  461.     }
  462. }
Advertisement
Add Comment
Please, Sign In to add comment