text: "use strict";
  
  var zlib = require('zlib');
  
  var crc32 = require('./crc32');
  
  var PNG_HEAD = Buffer.from([137,80,78,71,13,10,26,10]);
  var PNG_IHDR = Buffer.from([0,0,0,13,73,72,68,82,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0]);
  var PNG_IDAT = Buffer.from([0,0,0,0,73,68,65,84]);
  var PNG_IEND = Buffer.from([0,0,0,0,73,69,78,68,174,66,96,130]);
  
  function png(bitmap, stream) {
      stream.push(PNG_HEAD);
  
      var IHDR = Buffer.concat([PNG_IHDR]);
      IHDR.writeUInt32BE(bitmap.size, 8);
      IHDR.writeUInt32BE(bitmap.size, 12);
      IHDR.writeUInt32BE(crc32(IHDR.slice(4, -4)), 21);
      stream.push(IHDR);
  
      var IDAT = Buffer.concat([
          PNG_IDAT,
          zlib.deflateSync(bitmap.data, { level: 9 }),
          Buffer.alloc(4)
      ]);
      IDAT.writeUInt32BE(IDAT.length - 12, 0);
      IDAT.writeUInt32BE(crc32(IDAT.slice(4, -4)), IDAT.length - 4);
      stream.push(IDAT);
  
      stream.push(PNG_IEND);
      stream.push(null);
  }
  
  function bitmap(matrix, size, margin) {
      var N = matrix.length;
      var X = (N + 2 * margin) * size;
      var data = Buffer.alloc((X + 1) * X);
      data.fill(255);
      for (var i = 0; i < X; i++) {
          data[i * (X + 1)] = 0;
      }
  
      for (var i = 0; i < N; i++) {
          for (var j = 0; j < N; j++) {
              if (matrix[i][j]) {
                  var offset = ((margin + i) * (X + 1) + (margin + j)) * size + 1;
                  data.fill(0, offset, offset + size);
                  for (var c = 1; c < size; c++) {
                      data.copy(data, offset + c * (X + 1), offset, offset + size);
                  }
              }
          }
      }
  
      return {
          data: data,
          size: X
      }
  }
  
  module.exports = {
      bitmap: bitmap,
      png: png
  }
  