You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

8145 lines
1.5 MiB

  1. var _cartname=[`drip.p8`];
  2. var _cdpos=0; var iii=0; var ciii=0;
  3. var _cartdat=[
  4. 0,0,0,0,0,0,0,0,0,0,0,0,128,136,136,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,0,0,0,0,160,170,0,0,0,10,0,0,112,7,119,7,112,119,0,0,0,6,0,0,0,6,0,0,96,0,0,0,0,0,0,128,136,136,8,128,136,136,8,136,136,136,136,128,136,136,8,128,136,136,0,0,0,0,0,128,136,136,8,170,10,0,0,0,160,160,0,0,0,10,0,112,119,119,103,119,119,119,7,0,0,6,0,0,0,6,0,0,96,0,0,0,0,0,0,136,136,136,136,136,136,136,136,136,248,255,143,136,136,136,136,136,136,136,8,128,136,136,8,136,31,255,129,160,0,0,0,0,160,160,0,0,0,10,0,119,102,102,102,118,103,119,119,0,96,0,0,0,0,6,0,0,96,0,0,0,0,0,0,136,248,255,143,136,248,255,143,136,31,255,129,136,248,255,143,248,255,143,8,136,136,136,136,136,255,255,143,0,0,0,0,0,144,154,0,0,0,10,0,103,119,103,102,103,102,102,119,0,96,0,0,0,0,6,0,0,96,0,0,
  5. 0,0,0,0,136,31,255,129,136,31,255,129,128,255,255,15,136,31,255,129,24,255,241,8,136,248,255,143,136,255,255,143,0,0,0,0,0,0,10,0,0,0,10,0,0,0,0,0,0,0,0,0,0,96,0,0,0,96,0,0,0,0,6,0,0,0,0,0,128,255,255,15,128,255,255,15,0,51,51,0,128,255,255,15,240,255,255,8,136,255,255,143,128,51,51,8,0,0,0,0,0,144,10,0,0,0,10,0,0,0,0,0,0,0,0,0,0,96,0,0,0,96,0,0,0,0,6,0,0,0,0,0,0,51,51,0,0,51,51,0,112,0,0,7,112,51,51,0,0,51,51,7,128,31,255,1,0,51,51,0,0,0,0,0,0,0,10,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,6,0,0,96,0,0,0,0,6,0,0,0,0,0,0,7,112,0,0,7,0,7,0,0,0,0,0,0,112,0,0,0,7,0,112,55,51,7,0,7,112,0,0,0,0,0,0,144,10,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,6,0,0,96,0,0,0,0,6,0,
  6. 85,85,85,85,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,136,0,148,153,153,73,148,153,153,73,148,153,144,73,48,0,11,11,102,86,102,86,48,0,11,11,0,0,0,0,0,0,0,0,7,0,0,0,85,85,85,85,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,136,136,8,25,17,17,145,25,17,20,145,25,65,144,145,0,179,51,0,118,86,118,86,0,179,51,0,0,119,0,0,112,7,112,0,112,0,0,112,85,0,0,85,0,0,0,0,0,0,0,0,0,0,0,0,160,170,170,10,0,0,0,0,128,135,136,8,25,17,17,145,25,17,25,145,148,4,64,145,32,136,136,2,118,7,118,7,32,136,136,2,0,119,7,7,112,119,0,0,0,0,0,0,85,0,0,85,0,7,0,7,64,153,153,4,0,0,0,0,154,137,136,168,17,17,17,17,128,136,136,8,25,17,17,145,73,73,64,145,0,0,0,68,128,137,136,8,112,0,112,0,135,137,136,120,112,119,119,7,112,7,0,0,0,0,0,0,
  7. 85,0,0,85,0,7,0,7,0,5,80,0,0,0,0,0,154,136,136,168,1,0,0,16,128,136,136,8,25,17,17,145,25,65,144,148,73,0,0,0,128,136,152,8,112,0,112,0,135,136,152,120,112,119,119,7,0,0,7,0,0,0,0,0,85,0,0,85,96,119,96,119,0,80,5,0,0,0,0,0,170,170,170,170,17,17,17,17,128,136,136,8,25,17,17,145,25,17,25,145,25,4,64,153,128,152,136,8,0,0,0,0,128,152,136,8,112,119,119,7,0,0,112,7,0,0,0,0,85,85,85,85,101,103,101,103,0,5,80,0,0,0,0,0,154,8,128,168,65,68,68,20,0,136,136,0,25,17,17,145,25,65,17,145,25,4,20,145,32,136,136,2,0,0,0,0,32,136,136,2,112,112,119,0,0,112,112,7,112,0,0,7,85,85,85,85,101,102,101,102,0,80,5,0,64,153,153,4,154,136,136,168,65,68,68,20,0,0,0,0,148,153,153,73,148,153,153,73,68,0,148,73,0,130,40,0,0,0,0,0,0,130,40,0,0,0,0,0,7,0,0,0,0,0,0,0,
  8. 117,119,119,87,117,119,119,119,119,119,119,119,119,119,119,87,119,204,204,204,204,204,204,204,204,204,204,119,117,119,119,87,85,85,85,85,85,85,85,85,85,85,85,85,85,0,0,0,112,119,119,7,0,0,0,0,0,0,0,0,0,0,0,0,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,199,204,204,204,204,204,204,204,204,124,119,119,119,119,119,85,85,85,85,85,85,85,5,80,85,85,85,102,7,0,0,119,119,119,119,0,112,119,119,0,0,0,0,0,0,0,0,119,199,119,119,119,119,204,204,124,119,119,199,204,204,119,119,119,199,204,204,204,204,204,204,204,204,124,119,119,119,119,119,85,85,85,85,85,85,85,0,0,85,85,85,118,119,7,0,119,119,119,119,0,119,102,7,0,0,0,0,0,0,0,0,119,204,204,119,119,199,204,204,204,124,199,204,204,204,124,119,119,119,204,204,204,204,204,204,204,204,119,119,119,199,124,119,85,85,85,85,85,85,5,0,0,80,85,85,102,6,0,0,119,119,51,119,112,118,119,0,0,0,0,0,0,0,0,0,
  9. 119,204,204,119,119,204,204,204,204,204,204,204,204,204,204,119,119,119,204,204,204,204,204,204,204,204,119,119,119,204,204,119,85,85,85,85,85,85,0,0,0,0,85,85,85,0,0,0,119,119,51,119,112,103,6,0,112,119,119,0,0,0,0,0,119,199,124,119,119,204,119,204,204,204,204,204,204,124,204,119,119,199,204,204,204,204,204,204,204,204,124,119,119,204,204,119,85,85,85,85,85,5,0,0,0,0,80,85,102,7,0,0,55,119,51,115,112,119,7,0,112,119,103,7,112,7,0,0,119,119,119,119,119,204,119,204,204,204,204,204,204,204,204,119,119,199,204,204,204,204,204,204,204,204,124,119,119,124,204,119,85,85,85,85,85,0,0,0,0,0,0,85,118,119,7,0,55,51,187,115,0,0,0,0,0,0,0,119,0,119,119,7,117,119,119,87,119,204,204,204,204,204,204,204,204,204,204,119,119,204,204,204,204,204,204,204,204,204,204,119,119,204,204,119,85,85,85,85,5,0,0,0,0,0,0,80,102,6,0,0,48,51,187,3,0,0,0,0,0,0,0,0,0,112,119,119,
  10. 119,204,204,119,119,204,204,204,204,204,204,204,204,204,204,119,117,119,119,119,119,119,119,119,119,119,119,87,119,199,204,119,85,85,85,85,5,0,0,0,0,0,0,80,0,0,96,102,48,51,51,3,0,0,0,0,0,0,0,0,0,0,0,0,119,199,204,119,119,204,204,204,204,204,204,204,204,204,204,119,119,119,119,119,119,119,119,119,119,119,119,119,119,199,124,119,5,85,85,85,85,0,0,0,0,0,0,85,0,112,119,103,48,59,51,3,0,0,0,0,0,238,224,14,0,0,0,0,119,199,204,119,119,204,199,204,204,204,204,204,124,199,204,119,119,119,204,124,119,119,119,119,199,204,119,119,119,199,124,119,85,85,0,85,85,5,0,0,0,0,80,85,0,0,112,102,48,51,51,3,0,0,0,0,0,238,238,14,0,0,0,3,119,204,124,119,119,204,204,204,204,204,204,204,124,199,204,119,119,199,204,204,199,119,119,204,204,204,124,119,119,204,124,119,85,85,0,85,85,85,0,0,0,0,85,85,0,0,0,85,48,51,59,3,0,0,0,0,0,224,232,0,0,0,0,11,
  11. 119,204,124,119,119,199,204,204,204,124,199,204,204,204,124,119,119,199,204,204,204,119,119,124,204,204,124,119,119,204,204,119,85,85,85,85,85,85,5,0,0,80,85,85,0,0,96,102,0,51,51,0,0,0,11,0,0,238,238,14,0,0,176,3,119,199,124,119,119,119,204,204,124,119,119,199,204,204,119,119,119,119,204,124,119,119,119,119,199,204,119,119,119,204,204,119,85,80,85,85,85,85,85,0,0,85,85,85,0,112,119,103,0,64,4,0,0,176,0,0,0,238,227,14,48,0,176,0,119,199,124,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,199,124,119,85,85,85,85,85,85,85,5,80,85,85,85,0,0,112,102,0,64,4,0,48,176,0,3,0,0,11,0,0,11,59,0,119,204,204,119,117,119,119,119,119,119,119,119,119,119,119,87,117,119,119,119,119,119,119,119,119,119,119,87,117,119,119,87,85,85,85,85,85,85,85,85,85,85,85,85,0,0,0,85,0,153,153,0,48,48,3,3,0,0,11,0,0,3,51,0,
  12. 117,119,87,117,119,117,119,87,112,119,119,119,119,119,119,119,119,119,119,7,112,119,119,7,0,0,0,0,46,46,226,0,204,204,204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,119,119,119,119,119,119,119,119,7,0,112,119,0,0,119,7,0,0,119,119,7,0,119,119,0,0,0,0,0,0,0,0,124,199,204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,119,119,204,119,119,204,119,119,7,204,119,199,204,124,119,204,204,124,119,112,7,124,119,112,0,0,0,0,0,0,0,0,124,199,124,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,119,199,204,204,204,204,124,119,7,124,119,204,204,119,199,204,204,119,199,112,7,119,199,112,0,0,0,0,0,0,0,0,204,204,204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,
  13. 119,204,204,204,204,204,204,119,7,119,7,0,112,119,0,0,112,119,0,112,119,119,0,112,0,32,238,238,0,0,0,0,204,204,204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,96,96,0,0,0,0,0,0,0,0,0,0,0,0,0,117,204,119,204,204,124,204,87,119,119,0,0,119,7,0,0,119,7,0,112,119,7,0,112,0,226,238,238,238,238,2,0,204,199,204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,6,0,0,0,0,0,0,0,0,0,0,0,0,117,199,119,204,204,204,124,87,7,0,0,0,0,0,0,0,0,192,0,112,7,0,192,112,0,238,238,238,238,238,46,0,204,204,124,204,0,0,0,0,0,0,0,0,0,0,0,0,208,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,119,199,204,204,204,204,124,119,7,0,0,0,0,0,0,0,0,0,0,112,7,0,0,112,0,46,34,34,238,238,238,0,204,204,204,204,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,
  14. 119,199,204,204,204,204,124,119,7,0,0,0,0,0,0,0,0,0,0,112,7,0,0,112,0,238,238,238,238,238,238,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,0,0,0,192,0,96,0,0,0,0,0,0,0,0,0,0,117,199,204,204,204,204,124,119,7,0,0,192,0,0,0,0,0,0,0,112,7,204,0,112,0,46,226,34,34,46,226,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,0,12,6,13,0,0,0,0,0,0,0,0,0,117,204,199,204,124,199,204,87,7,0,0,0,0,192,12,0,0,0,0,112,7,204,0,112,0,238,238,238,238,238,238,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,0,0,0,0,0,208,0,208,0,0,0,0,0,0,0,0,0,119,204,204,204,124,199,204,119,7,12,0,0,0,192,12,0,0,0,192,112,7,0,192,112,0,238,46,34,46,226,238,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  15. 119,199,204,204,204,204,124,119,7,0,0,0,0,0,0,0,0,0,0,112,7,0,0,112,0,238,238,238,238,238,238,0,85,85,85,85,96,102,102,0,102,102,102,0,102,0,12,0,102,102,102,0,96,102,102,0,102,102,102,0,102,102,102,0,119,119,204,119,119,204,119,119,7,0,0,0,0,0,0,0,0,0,0,112,7,12,0,112,0,238,238,238,238,238,238,0,85,85,85,85,102,102,102,6,102,102,102,6,102,192,0,0,102,102,102,6,102,102,102,6,102,102,102,6,102,102,102,6,119,119,119,119,119,119,119,119,7,0,0,0,12,0,0,0,0,0,0,112,7,0,0,112,0,238,119,238,126,119,231,0,85,85,85,85,102,0,96,6,102,0,0,0,102,0,0,0,102,0,0,0,102,0,0,0,0,102,0,0,102,0,0,0,117,119,87,119,119,85,119,87,7,0,0,0,0,0,0,0,0,0,0,112,7,0,12,112,112,119,119,119,119,119,119,7,85,85,85,85,221,0,0,0,221,221,0,0,221,0,0,0,221,221,0,0,221,221,221,13,0,221,0,0,221,221,0,0,
  16. 0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,112,7,0,0,112,0,119,119,0,5,0,0,0,0,0,0,80,221,0,208,13,221,0,0,0,221,0,0,13,221,0,0,0,0,0,0,13,0,221,0,0,221,0,0,0,0,170,170,170,170,170,170,0,7,0,0,0,0,0,0,0,0,0,0,112,7,192,0,112,112,0,0,7,85,0,0,0,0,0,0,85,221,221,221,13,221,221,221,0,221,221,221,13,221,221,221,0,221,221,221,13,0,221,0,0,221,221,221,0,160,153,153,153,153,153,153,10,7,0,0,0,0,0,12,0,0,0,0,112,7,0,0,112,7,119,0,112,85,5,0,0,0,0,80,85,208,221,221,0,221,221,221,13,221,221,221,13,221,221,221,13,208,221,221,0,0,221,0,0,221,221,221,13,154,169,170,170,170,170,154,169,7,0,0,192,12,0,0,0,0,0,0,112,7,0,204,112,7,119,187,112,85,85,0,0,0,0,85,85,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  17. 154,170,170,170,170,170,170,169,7,0,0,192,12,0,0,0,0,192,0,112,7,0,204,112,7,176,187,112,85,85,85,85,85,85,85,85,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,154,153,153,153,153,153,153,169,7,12,0,0,0,0,0,0,0,0,0,112,7,12,0,112,7,176,187,112,85,85,85,85,85,85,85,85,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,0,0,0,0,0,154,153,153,153,153,153,153,169,7,0,0,0,0,0,0,0,0,0,0,112,7,0,0,112,112,0,0,7,85,85,85,85,85,85,85,85,0,0,0,0,0,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,154,153,153,153,153,153,153,169,112,119,119,119,119,119,119,119,119,119,119,7,112,119,119,7,0,119,119,0,85,85,85,85,85,85,85,85,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,
  18. 170,170,170,170,170,170,170,170,112,119,119,119,119,119,119,119,119,119,119,7,112,119,119,7,0,180,187,0,0,180,0,0,0,4,176,187,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,74,73,73,26,161,148,148,164,7,0,119,7,0,0,119,7,0,0,119,119,7,0,119,119,0,180,187,187,0,180,11,0,0,180,187,187,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,192,0,0,0,74,73,74,26,161,164,148,164,7,124,119,204,204,124,119,204,204,124,119,112,7,124,119,112,64,2,176,187,64,178,187,187,64,178,187,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,12,0,0,74,73,68,170,170,68,148,164,7,119,199,204,204,119,199,204,204,119,199,112,7,119,199,112,64,0,0,0,64,0,187,11,64,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,192,0,0,
  19. 74,153,153,170,170,153,153,164,119,119,0,0,112,119,0,0,112,119,0,112,119,119,0,112,64,0,0,0,64,0,0,0,64,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,74,73,68,153,153,68,148,164,119,7,0,0,119,7,0,0,119,7,0,112,119,7,192,112,36,0,0,0,36,0,0,0,36,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,74,73,74,68,68,164,148,164,7,0,0,0,0,0,0,0,0,0,0,112,7,0,0,112,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74,73,153,153,153,153,148,164,112,119,119,119,119,119,119,119,119,119,119,7,112,119,119,7,4,0,0,0,4,0,0,0,4,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
  20. 0,0,0,0,0,0,0,0,40,36,37,37,37,37,72,37,51,41,0,0,49,50,50,50,37,50,50,50,50,50,37,50,0,0,0,0,0,0,0,0,59,32,0,0,49,50,50,37,37,38,0,42,40,56,36,37,37,50,50,50,50,50,50,50,0,0,0,0,0,0,0,42,16,40,41,0,49,50,50,37,99,99,99,100,82,83,83,83,84,85,0,0,0,85,82,83,37,72,37,37,38,43,0,0,0,0,0,0,36,37,37,37,38,40,40,40,36,37,72,37,37,37,72,37,37,37,37,37,0,0,0,0,0,0,88,104,40,36,72,37,37,37,37,37,27,0,22,0,27,27,27,27,48,27,27,27,27,27,48,27,0,0,0,0,0,0,0,17,17,32,0,0,0,42,40,36,37,51,0,0,0,42,49,50,51,0,0,41,0,0,56,41,0,0,0,0,0,0,17,0,0,42,0,0,0,42,40,49,0,0,0,0,98,99,99,99,100,85,0,0,0,85,82,83,37,37,37,72,38,43,58,0,0,0,0,0,36,37,72,37,38,40,56,40,49,50,50,50,50,50,50,50,37,37,72,37,
  21. 0,0,0,0,0,0,42,16,40,49,50,37,37,72,37,37,0,0,0,0,0,0,0,0,55,0,0,0,0,0,55,0,0,0,0,0,0,0,59,52,53,54,0,20,0,0,16,49,38,43,0,0,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,59,32,43,0,18,0,0,0,0,42,40,0,0,0,0,0,0,0,0,0,101,0,0,0,85,98,99,37,37,37,50,51,43,40,41,0,17,17,32,36,37,37,37,38,16,41,0,40,41,0,0,0,0,42,40,49,37,37,37,0,0,0,0,0,0,0,0,42,40,40,36,37,37,37,72,0,0,0,0,0,0,0,0,27,0,0,0,0,0,27,0,0,0,0,0,0,0,0,0,59,52,53,54,57,0,0,27,38,114,115,115,115,115,115,115,115,115,115,116,17,0,0,22,0,0,0,17,0,0,27,0,59,32,43,0,0,0,22,40,0,0,0,0,0,0,0,0,0,0,0,0,0,101,0,0,37,37,51,40,40,40,40,16,58,33,34,34,37,37,37,37,38,40,0,0,42,0,17,17,17,0,0,40,56,36,37,37,
  22. 0,0,0,0,0,0,0,57,58,40,40,36,37,37,37,37,0,0,22,0,0,17,0,0,0,0,0,17,0,0,0,0,17,0,0,0,0,0,0,0,0,0,0,32,16,40,0,17,37,34,34,34,34,34,34,34,34,34,34,34,35,43,0,0,0,0,59,32,43,0,0,0,0,27,0,0,0,0,0,42,0,0,0,0,0,0,0,0,57,0,0,0,0,0,0,0,72,38,40,40,40,56,40,40,40,49,50,50,37,72,37,37,38,41,0,0,0,17,66,67,68,0,0,42,40,36,37,72,0,0,0,0,0,0,0,42,40,56,40,36,72,37,37,37,0,0,0,0,59,32,43,57,22,0,59,32,43,0,22,0,39,57,58,0,0,0,0,0,0,0,0,27,42,40,57,33,37,72,37,37,37,37,37,50,50,50,50,50,38,43,0,0,0,0,0,27,0,0,0,17,0,0,0,0,0,0,0,0,0,0,0,0,57,0,0,104,40,0,0,58,0,0,0,0,37,38,40,40,16,42,0,42,40,40,41,0,49,50,50,50,38,17,17,17,17,66,83,83,84,0,0,59,33,37,37,37,
  23. 0,0,0,0,0,0,0,0,40,40,40,49,50,50,50,50,40,0,0,58,0,27,58,40,57,0,0,27,0,0,0,0,55,40,56,57,17,0,0,0,0,0,0,17,58,40,40,49,50,50,50,50,37,72,38,40,41,0,42,16,55,43,0,22,0,0,0,0,0,0,59,32,43,0,0,22,0,0,0,0,0,0,58,88,40,40,104,40,40,40,40,40,57,0,0,0,37,38,56,40,41,0,0,0,0,42,0,0,0,0,0,0,37,34,34,34,35,98,99,99,100,0,0,59,36,37,37,37,0,0,0,17,17,17,17,58,40,40,16,27,27,27,27,27,40,57,40,40,57,0,40,40,0,0,0,0,0,0,0,0,27,0,42,40,39,17,0,0,0,0,59,39,40,40,56,27,34,34,34,35,49,50,51,22,0,0,104,41,0,0,0,0,0,1,0,0,0,0,0,27,0,0,0,0,0,0,0,0,104,57,40,40,40,40,16,41,0,0,42,16,40,58,103,104,37,38,40,40,57,0,0,0,0,0,0,0,0,0,0,0,37,37,72,37,37,35,40,56,41,0,0,59,36,72,37,37,
  24. 0,0,104,33,34,34,35,40,56,40,40,57,0,0,0,0,40,40,40,40,40,56,40,41,0,0,0,0,0,0,22,0,17,0,58,40,55,39,0,0,0,0,59,55,42,40,41,17,37,37,72,38,56,40,42,0,0,0,42,0,0,0,0,0,0,32,17,17,17,17,17,17,17,17,17,17,17,17,0,22,40,40,40,42,56,40,40,0,0,0,0,0,40,40,40,40,37,38,40,41,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,37,37,38,16,42,0,0,0,59,36,37,37,37,0,0,16,49,50,37,37,34,53,53,53,54,0,0,0,0,40,56,0,42,40,40,40,16,57,57,0,0,17,0,0,0,39,40,40,41,27,48,57,0,0,0,0,27,0,42,40,33,37,50,37,38,41,0,0,0,0,0,0,58,0,0,0,0,0,52,53,53,53,53,53,53,53,53,53,53,53,54,43,0,40,40,41,0,40,40,41,0,96,97,0,58,40,56,40,42,72,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,72,37,37,37,38,41,0,0,17,17,17,36,37,37,37,
  25. 0,0,42,40,40,49,50,38,27,27,27,27,0,0,0,0,41,0,0,0,0,42,40,40,40,40,57,59,39,43,0,0,55,40,16,0,17,48,40,58,0,0,0,17,0,40,40,49,38,1,49,51,22,0,0,0,0,0,0,40,57,0,0,0,0,32,40,56,40,40,40,32,40,40,40,40,40,39,43,0,56,40,0,0,42,40,61,0,112,113,63,40,40,41,0,0,37,38,0,0,0,0,0,0,57,0,0,0,0,0,0,0,37,37,37,37,72,38,0,0,59,33,34,35,49,37,72,37,0,0,0,40,56,41,59,48,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,40,40,40,40,59,48,43,0,0,27,42,40,56,39,48,40,16,57,0,0,39,58,40,41,27,38,23,0,0,0,0,0,0,57,0,0,56,40,0,0,0,0,27,42,40,40,16,40,27,42,40,56,42,40,55,43,0,40,40,57,0,0,40,33,34,35,33,34,35,40,0,0,58,50,51,0,0,0,0,0,0,40,41,0,0,0,0,0,0,50,50,50,50,50,51,0,0,59,36,37,37,35,49,37,37,
  26. 0,0,0,42,40,0,59,55,0,0,0,0,58,39,0,0,0,1,0,0,0,17,17,17,17,40,56,59,55,43,0,58,0,0,40,40,55,48,41,0,40,56,0,55,40,56,0,17,38,57,0,0,0,0,0,0,40,0,0,40,40,41,0,0,0,0,0,41,22,42,40,0,0,40,22,0,40,40,0,0,16,41,0,0,0,32,49,50,51,36,72,38,40,66,67,67,0,0,0,0,0,0,0,0,40,0,0,88,104,0,0,0,56,40,40,41,0,0,0,0,59,36,37,72,37,35,49,50,0,0,1,0,40,0,0,40,0,0,0,42,40,48,0,0,34,34,35,17,17,33,53,53,54,16,40,40,41,0,0,56,0,0,41,0,27,48,0,0,42,40,0,0,40,40,0,33,38,40,41,0,0,0,0,58,40,41,0,40,40,0,0,0,0,88,104,0,0,40,40,58,40,40,57,0,40,41,22,0,40,0,1,0,0,33,34,34,34,37,37,37,35,82,83,83,0,0,0,63,1,0,0,58,40,0,0,42,16,0,0,0,40,41,0,0,0,0,57,0,59,36,37,37,37,37,34,34,
  27. 64,0,33,34,35,43,0,56,57,18,0,104,56,48,57,0,37,72,37,34,34,38,12,0,42,40,40,40,0,0,58,40,1,0,0,0,58,55,8,0,0,40,57,0,40,41,0,49,38,40,0,0,0,0,0,40,56,0,58,40,16,0,0,0,0,42,40,40,40,41,42,40,40,56,40,40,40,0,0,0,67,67,67,67,68,36,37,72,37,37,37,37,38,82,83,83,0,0,0,33,54,0,0,56,40,57,0,0,40,0,28,0,40,1,61,62,0,58,40,0,59,36,37,37,37,72,37,37,33,35,36,37,38,43,104,40,40,39,40,40,16,48,40,0,37,37,37,37,72,38,0,0,0,40,40,41,0,0,40,40,35,0,0,0,56,40,57,0,0,42,40,16,40,0,0,27,38,56,57,0,0,0,0,40,40,0,40,40,40,57,0,0,0,0,0,56,40,0,0,0,42,40,16,40,0,0,0,0,83,83,83,83,84,36,37,37,37,37,37,72,38,82,83,83,0,0,0,48,66,68,0,40,40,40,0,0,40,57,0,0,34,34,34,35,16,40,56,57,59,36,37,37,37,37,37,37,
  28. 37,37,37,37,37,38,43,27,27,27,49,50,50,37,38,0,72,37,50,50,50,50,50,50,37,37,50,50,50,51,40,40,37,37,37,37,37,37,37,37,37,37,72,37,50,51,43,40,50,50,50,50,50,37,38,40,40,0,0,59,36,37,37,37,37,72,37,37,37,37,37,72,72,37,37,37,38,56,40,36,37,72,37,37,50,51,40,40,41,36,37,50,50,50,37,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,37,72,37,38,43,0,0,0,27,27,27,36,38,0,50,51,40,103,0,0,0,40,36,51,43,42,40,16,40,56,37,37,37,72,37,37,50,50,50,50,37,38,27,27,0,56,41,1,0,58,40,36,38,56,41,0,0,59,36,50,50,50,50,50,50,50,50,50,50,50,50,50,50,37,38,16,40,49,37,37,50,51,27,27,16,40,20,49,51,56,40,40,36,72,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  29. 37,37,37,37,37,38,43,0,0,0,0,0,42,36,38,103,40,40,56,41,0,0,17,42,55,43,0,58,40,39,41,0,37,37,37,37,37,51,27,27,27,27,49,51,0,0,0,40,53,53,53,54,40,36,38,40,20,0,0,59,48,40,42,42,26,40,41,0,42,40,56,40,40,16,40,36,38,0,42,56,37,38,27,27,0,0,56,33,35,43,0,0,8,16,36,37,0,0,0,0,0,0,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,72,37,50,50,51,43,0,0,0,17,0,40,36,38,41,40,16,42,0,0,59,39,0,41,0,0,0,56,48,0,0,50,50,37,37,38,43,0,0,0,0,59,39,0,0,58,40,40,40,56,40,40,36,37,34,35,43,0,59,55,41,8,0,0,16,0,17,0,41,42,40,41,17,42,49,51,0,58,40,37,38,43,0,0,0,42,49,51,43,0,0,104,40,36,37,0,0,0,0,0,0,16,0,0,57,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  30. 37,37,38,33,34,35,43,0,58,103,39,43,42,36,38,56,40,41,0,0,0,59,48,0,0,0,0,58,40,48,0,0,34,35,49,50,51,43,0,0,0,0,59,48,40,57,0,42,56,40,41,16,41,36,72,37,38,43,0,0,0,0,0,0,0,42,59,32,43,58,22,40,59,32,43,0,17,0,0,40,37,38,43,0,0,0,0,27,27,0,0,42,56,42,36,37,0,0,0,0,58,0,40,0,0,56,0,0,0,0,0,0,0,0,0,0,0,73,74,75,76,77,78,79,0,0,0,0,37,37,38,36,72,38,43,0,42,56,48,43,18,36,38,41,56,0,0,0,0,59,48,0,0,0,0,0,42,48,62,20,37,37,34,34,35,43,0,0,0,0,59,48,41,0,0,0,40,41,0,0,0,36,37,37,38,43,0,0,0,0,0,0,0,0,0,27,0,42,40,40,0,27,0,59,32,43,17,42,37,38,43,0,0,0,0,0,0,0,0,0,41,59,36,72,0,0,0,0,40,103,40,0,0,16,0,57,0,0,0,0,0,0,0,0,0,89,90,91,92,93,94,95,0,0,0,0,
  31. 50,50,51,49,50,38,43,18,0,40,48,43,23,49,51,0,40,57,88,104,57,59,48,17,17,17,17,17,17,36,34,34,37,37,72,37,38,43,0,0,17,0,59,48,43,0,0,0,40,17,17,17,17,36,37,72,38,43,0,0,0,0,0,0,0,0,0,0,0,0,17,16,103,88,17,0,27,59,32,22,72,38,17,17,17,17,0,0,0,22,0,0,0,59,49,37,0,0,0,0,40,56,40,118,0,40,103,40,0,0,0,0,0,0,0,0,0,105,106,107,108,109,110,111,0,0,0,0,40,0,0,0,42,48,17,39,0,42,48,43,0,16,16,57,40,40,56,40,52,53,50,53,53,53,53,53,53,37,37,72,37,37,37,37,38,43,0,59,39,0,59,48,43,0,0,0,40,52,53,53,53,50,50,37,38,43,0,0,17,0,0,0,0,0,0,0,0,59,32,40,40,56,39,43,22,0,27,0,37,37,35,33,34,35,43,0,0,0,0,0,0,0,27,36,0,0,0,0,42,40,40,33,35,40,56,41,0,0,0,0,0,0,0,0,0,121,122,123,124,125,126,127,0,0,0,0,
  32. 41,0,17,0,0,49,53,38,43,0,49,53,53,53,53,53,41,0,42,0,0,16,40,40,40,40,41,0,59,36,37,37,50,50,50,50,38,43,22,59,48,0,59,48,0,0,0,0,41,27,27,27,27,27,59,36,38,43,0,59,39,43,0,0,0,17,0,0,0,0,27,42,40,40,55,43,0,0,0,0,50,50,51,49,50,51,43,0,0,17,17,0,0,0,59,36,0,0,0,104,56,40,33,37,37,35,40,57,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,39,43,0,42,56,48,43,0,0,0,42,40,57,59,0,0,0,0,0,0,42,40,56,40,40,103,33,37,37,37,27,27,27,27,55,43,0,59,48,57,59,48,22,0,0,0,0,0,0,0,0,0,59,36,38,43,23,59,48,43,0,0,59,32,43,17,0,0,0,17,0,41,27,0,0,0,0,58,27,27,27,27,27,27,0,17,17,33,35,17,0,0,59,36,0,0,0,42,40,33,37,72,37,37,35,40,56,104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  33. 8,59,48,43,0,0,40,48,17,17,17,17,0,40,56,59,17,17,17,17,17,0,0,40,41,0,41,40,36,37,72,37,0,0,0,58,40,0,0,59,48,40,59,55,0,0,0,0,0,0,0,0,0,0,59,36,38,17,17,17,48,43,0,0,0,27,59,32,43,0,59,39,43,0,0,0,0,0,0,40,43,1,0,0,0,0,59,33,34,37,50,54,43,0,59,49,88,88,104,40,41,36,37,37,37,37,38,16,40,40,104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,55,43,0,0,42,49,53,53,53,54,0,40,41,59,34,34,34,34,35,17,17,32,43,0,0,42,49,50,37,37,0,0,0,16,56,41,0,59,48,40,40,40,0,0,0,0,17,17,17,17,57,0,17,36,37,34,34,34,51,43,0,0,1,0,0,27,0,0,59,48,43,0,0,0,0,88,104,40,43,23,0,0,0,0,59,36,37,51,27,27,0,0,0,27,40,16,40,56,0,49,50,37,37,72,38,41,0,42,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  34. 57,0,27,0,0,0,0,27,27,27,27,27,0,42,0,59,50,50,50,50,50,53,54,27,0,0,0,0,27,27,49,37,0,0,0,0,40,0,0,59,48,40,56,41,0,0,0,0,34,34,34,35,40,56,52,50,50,50,50,51,43,0,0,0,35,57,0,0,0,0,59,55,43,0,0,0,0,42,16,40,17,17,17,17,0,0,59,49,51,27,0,58,0,22,0,0,0,42,40,57,63,33,35,36,37,50,51,32,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,41,0,0,1,0,20,0,0,0,0,0,0,0,0,59,57,1,61,0,0,42,40,0,0,0,0,0,0,0,40,36,0,0,0,104,40,103,0,59,48,0,42,40,103,0,0,0,37,37,37,38,0,40,40,0,58,16,40,42,0,22,0,58,38,40,0,0,0,0,0,27,0,0,0,57,58,40,56,40,34,34,34,35,43,0,0,27,27,0,0,56,0,0,0,104,0,0,33,34,34,37,38,49,51,33,34,35,40,57,40,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  35. 16,103,88,58,33,34,35,17,17,17,17,17,0,18,0,59,34,34,35,57,0,16,40,57,0,0,0,0,8,58,16,49,1,0,58,56,40,41,0,59,55,0,0,56,41,0,0,0,37,72,37,38,0,42,40,40,40,56,41,0,0,0,0,40,38,56,57,18,0,0,0,0,0,0,58,40,40,40,40,16,37,72,37,38,43,22,0,0,57,0,0,40,58,0,58,40,1,0,49,37,37,72,37,34,34,37,37,37,35,16,56,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,56,40,40,36,37,37,34,34,34,34,35,0,23,0,59,37,37,38,40,58,40,56,40,0,0,0,0,0,56,40,40,35,0,16,40,40,0,0,0,56,0,0,40,16,0,0,0,37,37,37,38,23,23,40,56,40,0,0,0,0,0,58,40,38,40,16,39,57,0,0,0,0,42,40,40,56,40,40,40,37,37,72,38,43,0,0,58,56,0,58,40,16,40,56,40,33,34,35,36,37,37,37,37,37,37,72,37,37,34,34,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  36. 35,49,37,37,72,37,37,50,50,50,50,50,51,0,0,36,37,38,36,37,37,38,49,50,50,50,37,38,40,40,40,36,37,37,37,37,37,37,50,51,40,56,40,40,49,37,37,37,50,50,50,50,51,0,0,0,49,50,50,50,50,50,50,50,50,51,0,0,0,36,50,50,50,51,49,50,50,50,37,37,37,37,37,72,37,37,37,37,37,37,37,38,40,40,36,37,37,72,37,37,37,38,40,40,40,40,36,37,72,37,37,37,38,40,40,40,40,49,50,50,50,37,72,37,37,37,37,37,37,35,49,50,50,50,51,41,0,0,40,41,0,0,0,36,37,38,49,50,50,51,40,40,0,40,36,38,42,16,40,36,37,72,37,37,37,38,0,42,40,40,41,40,16,36,72,37,40,40,40,41,0,0,0,0,40,40,41,0,0,0,0,0,40,16,0,0,0,55,40,41,0,0,0,0,42,40,49,72,37,37,37,37,37,72,37,37,50,50,50,51,40,40,36,37,37,37,72,37,50,51,56,40,42,40,49,50,37,37,72,37,38,40,56,40,40,40,42,42,40,49,50,50,50,50,37,37,
  37. 37,37,35,32,16,40,56,0,0,0,42,0,0,0,61,36,37,37,35,32,16,40,41,41,0,40,36,38,0,58,56,36,37,37,37,72,37,51,0,0,41,0,0,42,0,49,37,37,40,56,41,0,0,58,103,104,56,40,0,0,0,0,0,0,56,40,57,62,0,58,40,0,0,0,0,0,0,40,0,36,37,37,50,50,50,50,50,51,33,34,34,35,40,40,36,37,37,37,50,51,40,40,40,41,0,0,42,40,49,50,37,37,38,40,40,40,40,41,0,0,42,40,40,40,56,40,36,72,50,50,51,40,40,40,41,0,0,0,0,0,63,32,32,36,72,37,38,40,40,41,0,0,0,42,36,51,0,0,42,36,37,50,37,37,38,0,0,0,0,0,0,0,0,0,49,37,41,0,0,0,0,33,34,35,40,40,0,0,0,0,0,0,42,40,40,52,53,54,41,0,0,0,0,0,0,40,57,36,37,38,33,34,35,32,33,35,49,50,50,51,40,40,36,37,72,38,43,0,0,0,0,0,0,0,28,0,0,59,36,37,38,40,40,40,0,0,0,0,0,40,40,40,40,40,36,37,
  38. 35,64,40,56,40,41,58,40,57,0,0,0,52,53,34,37,37,72,38,41,0,0,0,0,0,0,48,0,0,0,0,36,51,0,49,37,51,61,63,0,0,0,0,0,0,0,0,49,0,0,28,58,58,49,37,38,32,40,57,0,0,0,0,0,0,16,40,40,40,41,0,0,0,0,17,17,58,40,40,49,50,51,36,37,38,16,49,51,32,40,40,40,40,56,36,37,37,38,43,0,0,0,0,0,0,0,0,0,0,59,36,37,38,42,40,40,103,0,22,0,42,40,40,56,40,40,36,37,38,58,40,40,40,16,40,41,0,0,0,0,0,0,49,37,37,50,51,0,0,0,0,17,0,0,55,0,0,0,62,36,0,0,0,55,33,34,35,0,0,0,0,0,0,0,0,0,57,88,104,40,40,40,36,38,40,41,0,0,0,0,0,0,42,40,40,41,0,0,0,0,0,0,33,35,40,56,40,41,40,40,49,50,51,40,40,41,0,42,0,42,40,40,36,37,37,51,43,12,0,0,0,17,17,0,0,0,12,59,49,72,38,17,40,16,0,0,0,0,104,40,40,40,40,40,36,37,
  39. 37,34,53,53,54,40,40,0,0,0,0,0,0,58,40,36,38,0,61,0,58,57,0,39,0,0,0,0,0,0,33,37,0,26,0,0,36,37,38,17,17,17,17,0,0,0,0,44,40,56,40,40,40,56,49,51,40,0,0,0,23,23,0,0,0,42,0,0,0,0,17,17,0,0,36,38,16,40,41,0,40,40,27,27,27,40,40,0,0,0,0,0,42,33,37,72,38,40,57,0,0,0,59,52,54,43,0,0,0,0,40,36,37,35,40,40,58,103,0,58,40,40,40,41,0,42,49,50,37,51,56,40,40,41,0,0,0,0,0,0,0,40,56,36,37,35,32,32,16,41,0,48,57,0,0,0,0,88,36,72,0,0,0,58,49,50,50,53,53,53,54,103,88,0,0,60,40,40,40,40,16,40,33,35,41,0,0,0,0,0,0,0,0,0,0,0,0,0,52,54,0,58,36,38,40,40,0,0,56,40,57,0,0,0,42,41,0,0,0,0,0,49,50,50,38,16,16,0,0,0,0,40,40,57,0,0,0,0,42,36,37,51,40,40,40,56,0,40,40,40,57,0,0,0,23,0,
  40. 38,0,0,42,40,0,0,0,0,58,40,58,40,40,40,36,37,37,34,35,40,57,0,55,40,88,57,0,104,40,49,50,0,0,0,40,40,40,40,40,32,32,40,40,40,57,33,34,40,41,0,42,40,40,36,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,56,40,40,49,37,35,0,0,0,40,40,40,41,0,0,0,0,0,22,58,103,104,40,40,0,51,56,40,11,0,0,0,16,56,40,0,0,11,0,0,49,51,40,40,40,40,40,104,40,40,40,40,0,0,0,23,0,51,0,0,0,40,103,88,0,0,40,16,40,40,52,34,37,37,37,72,38,40,40,103,32,40,40,40,56,40,40,33,34,0,0,58,40,56,40,16,41,0,0,42,40,56,40,36,37,42,0,0,0,40,56,36,38,0,0,0,23,23,0,0,0,0,0,0,0,0,0,39,40,40,42,40,49,51,57,0,0,40,41,0,0,0,0,0,0,0,0,42,40,40,40,41,0,42,40,57,0,0,0,0,42,40,41,0,0,0,0,0,0,40,40,40,56,40,40,40,40,40,40,41,0,0,0,0,0,
  41. 0,0,0,58,40,40,56,62,58,40,40,40,56,40,36,37,72,37,37,38,0,42,40,39,41,0,42,40,40,52,50,37,0,0,0,42,40,40,40,0,0,0,0,40,16,40,36,37,0,0,0,0,42,40,36,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,55,40,0,0,0,42,40,40,57,0,40,0,0,0,57,40,57,0,0,0,0,0,40,40,0,0,0,40,41,0,0,0,42,40,40,0,0,0,0,0,0,0,42,40,40,40,40,16,40,40,40,40,103,88,0,0,0,0,0,0,0,40,56,40,40,33,35,40,0,0,42,40,36,37,50,50,37,38,0,58,40,48,0,0,0,0,42,40,40,36,0,0,0,0,0,42,40,17,17,17,17,40,40,40,36,72,0,0,0,58,40,40,49,51,0,0,0,0,0,0,23,23,0,1,63,0,0,0,32,41,0,0,0,0,56,40,0,0,40,1,58,40,40,16,40,88,0,0,0,58,40,41,0,0,0,42,40,12,0,0,0,58,56,12,0,0,0,0,0,12,0,0,42,40,40,40,40,40,41,40,40,41,0,0,0,58,
  42. 0,1,58,33,35,40,42,49,51,41,0,17,17,17,36,37,0,40,49,38,58,56,41,48,0,0,0,0,0,0,42,49,0,0,0,0,0,0,40,52,34,34,54,41,42,0,36,37,62,1,58,56,40,41,42,0,0,0,0,0,0,0,0,0,53,53,53,54,0,0,32,0,0,0,0,61,42,40,103,20,34,34,35,40,40,40,40,40,57,0,88,40,56,40,61,0,0,58,41,0,0,0,0,40,40,0,0,0,0,0,0,0,0,0,42,40,40,42,41,0,0,88,16,0,18,0,42,40,34,34,34,37,38,41,0,33,35,17,17,33,34,34,37,37,0,42,56,55,40,41,0,48,17,17,17,0,0,0,58,40,0,1,63,0,0,0,42,40,36,38,41,0,0,0,36,37,34,34,34,35,41,0,0,0,0,0,0,0,23,23,0,0,42,40,32,57,0,58,32,0,0,58,0,52,53,53,53,53,37,37,37,34,34,34,35,40,40,40,40,16,40,40,33,34,11,16,0,0,0,0,11,40,16,0,0,0,11,0,0,0,44,0,0,40,56,0,0,0,0,42,40,57,23,0,0,40,
  43. 37,72,37,37,38,17,17,36,37,34,34,37,37,37,72,37,0,1,42,40,40,103,63,36,34,34,35,0,0,0,56,40,34,34,35,0,0,18,0,42,36,38,0,0,0,18,36,37,37,37,37,38,0,0,0,0,23,23,0,0,0,0,0,0,0,56,32,40,57,40,39,8,0,40,103,104,32,40,40,40,37,72,37,37,37,37,38,42,40,40,33,34,34,34,37,37,58,40,1,61,0,0,0,104,40,57,0,0,0,0,0,0,60,1,104,40,40,0,23,23,23,0,58,40,0,0,58,40,37,37,37,37,37,34,34,37,37,37,37,37,37,37,37,37,34,34,34,34,34,34,34,37,37,72,38,103,88,104,40,40,37,72,38,0,0,39,0,0,36,38,0,0,0,33,37,37,37,37,72,38,23,23,0,0,0,0,0,0,0,0,0,0,0,42,32,40,16,40,48,0,58,40,40,40,32,40,40,40,37,37,37,37,72,37,38,0,0,42,36,37,37,37,72,37,40,33,34,35,0,0,0,40,40,40,0,0,0,0,0,0,34,34,34,35,40,103,0,0,0,0,40,40,57,0,40,56,
  44. 37,50,51,0,0,0,36,50,50,50,50,50,50,50,37,37,37,37,38,40,40,40,40,36,37,50,50,50,50,37,72,37,37,50,50,50,50,50,50,50,37,38,40,40,40,36,72,37,37,37,37,51,0,0,0,0,0,0,0,0,0,0,0,82,37,37,50,50,50,50,51,49,50,50,50,50,51,40,41,0,38,40,41,40,103,0,0,0,0,0,40,40,49,50,50,50,37,37,37,50,51,40,40,0,49,37,37,72,37,37,37,72,37,37,72,38,40,56,40,49,50,50,50,50,50,50,37,72,38,40,40,0,0,0,48,64,42,40,40,40,40,40,36,37,37,72,38,40,56,40,40,49,51,56,40,41,0,49,50,37,38,40,0,0,22,58,40,40,49,51,40,40,56,36,37,37,72,37,38,0,0,0,0,0,0,0,0,0,0,0,0,82,37,38,0,0,22,0,0,0,0,42,16,40,40,56,57,0,38,40,26,56,32,57,61,0,0,0,0,42,56,40,40,40,37,37,38,40,40,40,41,0,59,36,37,50,50,50,50,50,50,50,50,51,40,40,40,40,40,40,16,40,40,32,49,37,
  45. 51,40,57,0,0,0,55,0,0,42,56,40,0,42,36,37,37,37,38,40,40,40,40,32,40,41,42,0,0,0,42,49,51,40,17,17,17,40,40,40,0,0,40,0,42,49,37,37,37,37,38,0,0,0,0,0,0,0,0,0,0,0,0,82,37,38,0,0,0,0,17,17,0,0,0,41,42,40,41,0,38,40,58,40,32,16,32,17,17,17,33,34,35,40,40,16,37,37,38,40,56,40,0,0,59,36,38,43,0,42,42,56,40,40,40,40,40,41,0,42,40,0,40,40,56,40,40,49,40,40,16,41,0,0,0,0,0,0,40,40,57,0,36,72,37,37,38,40,41,0,40,32,103,0,0,0,0,0,0,0,56,16,33,34,35,40,56,41,0,58,16,41,0,42,36,37,50,50,51,103,0,0,0,0,0,0,0,0,0,0,66,0,37,38,57,0,0,0,33,35,0,0,0,0,0,33,34,34,37,34,34,35,33,34,35,33,34,35,36,72,38,40,40,40,50,50,51,40,40,40,0,0,59,49,51,43,0,0,0,40,16,40,41,0,0,0,0,0,41,0,42,40,40,40,41,0,
  46. 40,40,40,0,22,0,0,0,22,42,40,40,40,0,36,37,37,37,38,39,0,0,42,32,41,0,0,0,0,0,0,0,40,52,37,37,51,41,42,0,0,0,42,0,17,17,36,37,34,35,40,40,0,0,44,70,71,44,0,0,0,66,83,83,37,38,40,0,0,58,36,38,0,0,22,0,0,36,37,37,37,37,72,38,49,50,51,49,50,51,36,37,38,32,40,56,34,34,35,40,41,40,103,0,0,40,41,0,0,0,0,0,40,56,0,17,17,0,0,18,0,0,0,40,41,42,22,0,40,56,40,0,0,0,0,0,0,0,58,40,41,0,36,37,72,37,38,55,0,0,0,41,0,0,0,0,0,0,0,58,41,59,36,38,40,57,0,0,0,0,0,59,33,34,37,37,37,38,56,40,103,0,60,86,87,60,66,67,67,83,99,99,50,51,40,57,0,40,36,38,17,17,17,17,17,36,37,37,37,72,37,38,32,27,27,27,27,27,36,37,38,40,40,40,37,37,38,0,0,42,40,20,58,41,0,0,0,0,0,0,40,41,59,33,35,0,0,23,0,0,17,40,103,0,0,0,
  47. 40,40,40,103,88,0,0,0,88,104,40,56,0,0,49,50,50,50,51,32,0,0,0,0,0,0,0,0,0,39,40,40,0,59,36,38,41,0,0,0,0,0,0,59,49,37,72,37,37,51,40,40,40,57,33,34,34,35,82,83,83,100,0,0,41,0,42,40,56,40,49,50,53,53,53,53,34,37,72,37,37,37,37,37,35,0,0,0,0,0,49,50,51,40,16,40,72,37,38,17,17,17,52,53,54,17,17,17,17,0,0,0,0,0,59,49,51,17,17,17,17,17,39,40,41,0,0,59,40,40,40,40,16,41,0,0,0,42,40,40,103,0,0,40,53,53,53,54,17,17,0,0,0,0,0,0,17,48,40,56,0,59,49,51,0,0,0,0,0,0,0,42,40,49,50,37,38,42,40,40,16,40,36,37,37,38,98,99,100,0,0,0,0,22,0,40,40,40,41,0,0,0,0,0,49,50,37,37,37,37,37,37,38,103,88,0,0,0,32,0,0,42,40,40,37,37,50,53,53,53,34,34,34,34,34,53,54,57,0,0,0,0,59,52,53,53,53,53,53,54,48,56,0,0,0,23,
  48. 40,41,0,0,42,0,0,0,0,0,56,42,41,0,58,40,40,40,40,52,54,32,0,0,0,0,0,0,32,48,40,40,0,0,42,41,0,0,17,17,0,0,0,0,40,40,40,49,38,0,41,0,42,40,36,72,37,37,35,0,0,0,0,0,57,0,58,40,41,0,0,0,0,0,0,0,0,40,49,50,37,37,72,37,38,56,41,0,0,0,23,0,0,88,104,40,50,51,16,40,41,59,36,72,37,37,38,40,40,40,0,0,0,0,59,32,27,27,27,27,27,27,48,40,0,0,0,23,40,58,0,0,0,0,0,0,0,0,40,0,0,0,40,40,40,56,16,41,42,0,0,0,0,0,0,0,42,55,16,40,17,17,17,17,17,17,33,54,0,0,0,0,42,40,56,11,38,0,0,0,0,33,37,37,37,37,38,0,28,0,0,0,40,40,40,16,0,0,0,0,0,17,0,0,42,56,40,41,37,37,37,37,38,40,0,0,0,0,23,0,0,42,33,34,40,40,41,8,0,59,36,37,37,72,38,40,40,41,18,0,0,0,0,27,0,0,0,0,0,0,48,41,0,0,0,59,
  49. 56,41,0,0,0,0,0,0,0,58,16,41,0,0,40,56,40,40,40,0,0,0,0,0,0,0,0,0,0,42,40,40,34,53,53,53,53,53,51,0,0,0,0,0,0,40,40,57,51,0,0,0,0,49,50,37,37,37,51,0,0,0,0,0,40,56,40,41,0,0,0,0,59,32,43,0,104,40,40,0,50,50,50,50,51,41,0,0,0,0,0,0,0,0,49,37,40,40,0,0,0,59,49,50,50,37,38,56,40,0,23,0,0,0,0,0,0,0,0,17,0,0,55,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,42,0,0,0,40,41,40,41,42,0,0,0,0,0,0,0,0,0,0,0,40,42,51,40,56,40,40,41,0,0,0,0,0,0,0,16,40,40,0,0,0,0,66,67,68,36,37,38,40,57,0,0,0,0,40,0,42,0,0,17,0,0,0,27,0,42,32,16,41,44,27,27,27,27,0,0,0,0,0,0,0,0,0,0,16,49,40,41,22,0,0,0,27,27,27,49,51,40,16,103,0,0,0,0,0,17,0,0,58,39,0,0,27,0,0,0,0,0,
  50. 0,0,1,0,0,0,17,17,17,0,0,0,0,0,42,58,42,0,0,0,0,0,0,0,0,0,0,0,0,42,40,0,40,40,41,0,42,0,0,0,0,0,0,0,0,40,40,40,0,0,0,0,82,83,84,36,72,38,40,40,0,0,0,0,41,0,0,0,59,32,43,57,0,0,0,0,41,0,0,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,40,40,0,0,0,0,0,0,0,0,27,27,42,40,41,0,0,1,0,0,39,57,0,56,48,0,0,0,0,0,0,0,0,17,17,32,17,17,17,33,34,35,0,0,0,18,18,0,42,0,1,0,0,0,0,0,0,0,0,0,0,0,0,41,0,41,0,0,0,0,0,0,0,0,0,42,103,104,40,41,0,0,63,1,0,82,83,84,36,37,38,40,16,103,58,57,0,1,63,0,0,0,42,56,41,0,17,0,0,0,0,0,33,1,0,0,0,0,0,0,0,58,103,0,0,0,0,42,56,40,103,88,104,0,0,1,0,0,0,0,104,40,0,0,0,33,35,0,55,40,41,40,48,0,0,0,0,0,0,0,0,
  51. 34,34,34,34,34,35,36,72,38,17,17,17,32,32,17,17,0,39,57,0,0,23,23,0,0,0,23,23,0,0,0,0,0,1,0,0,0,0,23,23,0,0,0,40,40,56,57,58,0,33,34,35,82,83,84,36,37,51,40,40,40,56,41,0,34,35,43,0,0,8,40,57,59,39,0,0,0,0,20,36,35,0,0,0,18,0,0,0,40,41,0,0,0,0,0,40,40,40,16,40,103,0,23,23,23,23,23,40,40,57,0,0,49,51,57,39,16,18,40,55,0,0,0,0,0,0,0,0,37,72,37,37,37,38,36,37,38,33,34,34,34,34,34,34,58,48,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,23,0,0,0,0,0,0,0,58,40,40,40,40,40,0,36,37,38,82,83,84,36,38,40,40,40,40,40,40,57,37,38,43,0,0,58,40,16,59,48,0,0,0,33,34,37,38,0,0,0,39,0,0,58,40,0,0,0,0,0,0,40,40,56,40,40,40,57,0,0,0,88,104,40,56,40,0,0,34,35,56,48,40,23,40,39,0,0,0,0,0,0,0,0,
  52. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,3,3,3,3,3,3,3,3,4,4,4,2,2,0,0,0,3,3,3,3,3,3,3,3,4,4,4,2,2,2,2,2,0,0,19,19,19,19,2,2,3,2,2,2,2,2,0,2,0,0,19,19,19,19,2,2,4,2,2,2,2,2,2,2,0,0,19,19,19,19,0,4,4,2,2,2,2,2,2,2,0,0,19,19,19,19,0,0,0,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  53. 149,10,86,68,10,22,12,68,10,22,12,68,10,11,12,68,20,19,18,68,10,22,12,68,10,22,12,68,10,145,18,68,65,66,67,68,65,66,67,68,152,25,26,68,24,25,26,68,28,27,26,68,29,27,26,68,31,33,26,68,31,26,33,68,30,26,34,68,32,154,36,68,65,66,67,68,65,66,67,68,170,39,41,68,42,39,41,68,47,43,41,68,47,43,44,68,47,43,41,68,47,43,44,68,46,45,48,68,52,49,39,68,53,178,39,68,65,66,67,68,189,126,67,68,61,126,67,68,61,74,67,68,61,190,67,68,65,66,67,68,65,66,67,68,65,66,67,68,65,66,67,68,65,66,67,68,65,66,67,68,184,58,60,68,57,187,60,68,65,66,67,68,65,66,67,68,65,66,67,68,65,66,67,68,65,66,67,68,65,66,67,68,65,66,67,68,65,66,67,68,65,66,67,68,65,66,67,68,65,66,67,68,65,66,67,68,65,66,67,68,65,66,67,68,65,66,67,68,65,66,67,68,65,66,67,68,65,66,67,68,65,66,67,68,65,66,67,68,65,66,67,68,65,66,67,68,
  54. 246,14,35,15,239,14,29,15,234,14,23,15,231,14,19,15,227,14,17,15,222,14,14,15,218,12,12,13,214,10,8,9,210,6,5,5,153,1,153,1,153,1,153,1,191,1,191,1,191,1,191,1,191,1,191,1,191,1,191,1,191,1,191,1,0,2,0,0,17,14,19,14,26,14,36,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,13,14,16,14,22,14,34,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,6,5,8,5,9,5,11,5,34,9,42,11,188,11,187,11,187,11,185,11,182,11,178,11,173,11,168,11,164,9,161,9,157,9,154,9,150,7,145,7,142,7,139,5,135,5,133,3,131,3,144,1,
  55. 144,1,128,1,128,1,128,1,128,1,128,1,0,2,0,0,15,14,30,14,18,14,34,14,23,14,38,14,27,12,44,12,33,10,49,10,39,8,54,8,43,6,58,6,48,4,62,4,53,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,201,15,201,15,201,13,201,11,200,9,199,7,198,5,197,83,245,1,244,1,244,1,244,1,244,1,244,1,244,1,245,1,245,1,245,1,245,1,245,1,244,1,244,1,244,1,243,1,243,1,243,1,243,1,192,1,192,1,192,1,192,1,192,1,0,3,0,0,100,14,78,14,109,14,86,14,116,14,96,12,123,12,104,10,127,8,111,4,104,2,93,2,80,2,67,2,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,0,3,0,0,80,2,82,2,84,2,86,2,90,4,96,4,102,6,114,8,114,8,116,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,
  56. 64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,0,2,0,0,7,14,10,14,14,14,16,14,22,14,34,14,47,14,47,12,44,12,44,10,47,10,47,8,44,8,44,6,47,4,47,2,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,69,2,71,6,191,9,191,9,191,7,191,5,191,3,191,83,191,1,191,1,191,1,128,1,128,1,128,1,128,1,128,1,128,1,128,1,128,1,128,1,128,1,128,1,128,1,128,1,128,1,128,1,128,1,128,1,128,1,128,1,128,1,128,1,0,3,0,0,193,95,128,81,193,95,193,81,163,91,193,95,129,81,128,81,193,95,128,81,193,81,135,81,163,91,128,81,193,95,128,81,193,95,193,81,193,95,128,81,163,91,193,95,129,81,128,81,193,95,128,81,165,81,129,81,163,91,165,81,193,95,163,91,1,16,0,32,29,8,29,8,29,6,29,4,24,8,24,8,24,6,24,4,27,6,27,4,
  57. 34,8,34,104,31,86,31,6,22,8,22,8,29,8,29,8,29,32,19,28,24,6,24,6,24,32,31,28,36,10,34,4,22,8,19,4,29,8,27,36,24,8,24,8,0,32,0,0,7,14,7,12,7,10,17,0,7,14,7,12,3,26,15,14,10,14,10,12,10,10,10,0,10,14,10,12,5,10,5,8,3,14,3,12,3,0,3,10,12,14,12,12,17,10,22,14,22,12,15,30,5,10,10,14,5,10,3,26,10,14,10,12,0,16,0,0,76,11,92,13,80,15,99,15,89,15,108,15,97,15,119,15,104,15,123,15,108,15,126,13,113,11,126,9,113,7,126,7,113,5,127,5,113,5,127,5,113,3,127,3,113,3,127,3,113,3,127,3,113,3,127,1,64,1,64,1,64,1,64,1,0,4,0,0,239,9,235,13,230,15,221,15,213,15,213,15,217,15,220,11,215,7,193,1,213,1,192,1,192,1,192,1,192,1,192,1,192,1,192,1,192,1,192,1,192,1,192,1,192,1,192,1,192,1,192,1,192,1,192,1,192,1,192,1,192,1,192,1,0,4,0,0,137,89,142,91,
  58. 134,91,138,91,141,91,133,91,145,91,135,91,140,91,132,91,137,91,145,89,136,87,141,83,128,81,128,81,128,81,128,81,128,81,128,81,128,81,128,81,128,81,128,81,128,81,128,81,128,81,128,81,128,81,128,81,128,81,128,81,0,3,0,0,223,94,216,94,231,94,231,0,231,0,228,0,221,0,230,0,234,0,220,0,217,0,192,0,192,0,192,0,192,0,192,0,192,0,192,0,192,0,192,0,192,0,192,0,192,0,192,0,192,0,192,0,192,0,192,0,192,0,192,0,192,0,192,0,1,16,0,0,105,71,105,75,105,79,93,9,98,15,98,13,88,15,88,15,88,13,88,1,88,15,88,13,64,1,86,15,86,47,86,45,103,67,103,71,103,75,103,79,95,15,95,13,95,1,83,5,91,27,117,7,112,13,100,9,105,15,105,13,98,15,98,13,1,16,0,0,10,14,10,10,15,30,15,10,10,12,10,8,17,14,17,10,7,0,7,0,17,14,17,10,7,12,7,8,0,0,0,0,10,14,10,10,15,14,15,10,10,12,10,8,19,30,19,10,0,0,0,0,19,14,19,10,
  59. 15,14,15,10,0,0,0,0,1,16,0,32,34,8,34,6,34,4,27,18,36,8,36,6,39,10,31,4,43,8,34,4,39,10,34,4,41,8,41,6,41,4,22,2,34,8,34,6,43,8,27,6,36,40,36,38,39,8,24,6,29,8,29,6,31,42,31,40,31,6,29,20,29,8,29,6,0,32,0,0,193,15,193,95,191,85,187,1,188,1,187,1,191,85,177,1,163,11,163,91,188,1,0,0,191,85,0,0,193,95,193,1,193,15,193,95,191,1,191,1,191,85,0,0,191,85,0,0,163,11,163,91,0,0,0,0,191,85,0,0,0,0,0,0,1,8,0,32,74,8,74,6,74,4,81,6,81,4,81,2,91,8,91,6,88,42,88,40,88,38,83,8,83,8,83,6,83,4,83,2,79,8,79,6,79,4,81,6,81,4,81,2,86,40,86,38,83,10,83,8,83,6,83,4,83,2,83,2,83,2,83,0,0,32,0,32,238,11,247,11,238,7,247,7,238,5,247,5,238,3,247,3,226,11,235,11,226,7,235,7,221,11,228,11,221,7,228,7,223,11,231,11,223,7,231,7,
  60. 223,5,231,5,233,11,240,11,233,7,240,7,233,5,240,5,233,3,240,3,233,3,240,3,0,16,0,32,216,15,245,15,245,15,245,13,245,11,245,9,245,7,245,5,245,3,245,1,192,1,192,1,192,1,192,1,192,1,192,1,192,1,192,1,192,1,192,1,192,1,192,1,192,1,192,1,192,1,192,1,192,1,192,1,192,1,192,1,192,1,192,1,0,6,0,0,41,11,245,3,41,9,245,3,41,7,247,3,41,5,247,3,34,11,245,3,34,9,39,11,252,3,39,9,252,3,39,5,46,11,245,3,46,9,245,3,46,7,247,3,46,5,247,3,46,3,36,9,43,11,245,3,41,11,252,3,41,9,252,3,0,24,0,32,69,15,69,15,69,15,69,15,69,15,0,0,69,15,71,15,74,15,74,15,74,15,0,0,74,15,0,0,74,15,67,15,69,15,69,15,69,15,0,0,69,15,69,15,69,15,0,0,74,15,71,15,76,15,76,15,79,15,0,0,74,15,71,15,0,24,0,32,187,87,174,1,187,85,0,0,187,83,0,0,0,0,179,1,179,9,179,7,179,5,179,3,
  61. 179,3,191,1,191,83,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,12,0,16,36,11,240,3,43,11,240,3,36,9,240,1,43,9,247,1,36,5,250,3,43,5,250,3,36,3,245,3,43,3,245,3,29,11,243,3,36,11,252,3,29,9,247,3,36,9,243,1,29,5,245,1,36,5,238,3,29,3,238,3,36,3,247,1,0,12,0,32,76,15,76,13,76,11,0,0,81,15,81,13,81,11,76,1,76,15,76,13,79,31,79,13,83,15,83,13,74,15,74,13,76,15,76,13,76,11,0,0,79,15,79,13,79,11,0,0,74,15,74,13,74,11,79,1,81,15,81,13,74,15,74,13,1,24,0,32,76,15,76,13,76,11,0,0,81,15,81,13,81,11,0,0,76,15,76,13,79,31,79,13,83,15,83,13,79,15,79,13,76,15,76,15,76,13,76,13,76,11,76,7,76,1,76,1,76,1,74,1,74,1,74,1,81,1,81,1,74,1,74,1,0,24,0,32,228,31,228,15,228,45,228,43,
  62. 58,2,58,2,216,43,58,2,53,2,53,2,216,43,53,2,216,11,55,0,55,0,55,0,226,31,226,47,226,45,226,1,223,31,223,47,223,45,228,1,226,31,226,47,226,45,192,1,231,31,231,47,231,45,192,1,0,12,0,32,228,31,228,15,228,45,228,43,58,2,58,2,216,11,58,2,53,2,53,2,216,11,53,2,216,11,216,1,216,1,192,1,223,31,223,15,223,45,223,43,216,1,192,1,216,27,219,1,226,31,226,15,226,45,226,43,55,34,55,34,55,34,55,32,0,12,0,32,228,31,228,15,228,47,228,47,228,45,228,43,228,41,228,39,228,37,228,35,192,1,192,1,192,1,192,1,192,1,192,1,46,0,46,0,46,2,46,2,53,2,53,2,51,18,51,2,43,2,43,2,43,2,43,0,48,2,48,34,48,34,48,34,0,12,0,0,204,38,204,38,204,36,204,36,204,34,204,34,204,34,204,32,204,38,204,38,204,36,204,36,204,34,204,34,204,34,204,32,199,38,199,38,199,36,199,36,199,34,199,34,199,34,199,32,202,38,202,38,202,36,202,36,202,34,202,34,
  63. 202,34,202,32,0,12,0,32,204,6,204,6,204,4,204,4,204,2,204,2,204,2,58,0,204,6,204,6,204,4,204,4,204,2,204,2,204,2,63,0,202,6,202,4,211,6,211,4,199,6,199,4,199,2,209,0,202,6,202,4,202,2,60,0,207,6,207,4,207,2,58,0,0,12,0,0,179,85,154,81,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,4,0,0,204,6,204,6,204,6,204,4,204,4,204,4,204,2,204,2,204,2,204,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,202,0,202,0,202,0,202,0,202,22,202,6,195,20,195,4,0,12,0,0,204,10,204,8,204,6,204,4,207,10,207,8,207,6,207,4,216,10,216,8,211,10,211,8,216,10,211,10,214,8,221,12,226,14,226,14,226,12,226,10,226,8,226,4,
  64. 211,0,211,0,216,0,216,0,211,0,211,0,214,0,214,0,221,0,221,0,0,16,0,0,164,94,171,94,176,94,164,92,171,92,176,92,164,90,171,90,176,90,164,88,171,88,176,88,164,86,171,86,176,86,164,84,171,84,176,84,164,82,171,82,176,82,164,80,171,80,176,80,164,80,171,80,176,80,186,80,174,80,128,80,128,80,128,80,0,12,0,0,175,91,1,94,1,94,191,83,1,94,191,83,175,91,1,94,1,94,191,83,1,94,191,83,175,91,191,83,1,94,191,83,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,16,0,16,150,14,150,14,159,30,159,14,159,14,159,14,152,30,152,14,147,30,147,14,157,30,157,14,150,30,150,14,150,14,150,14,155,30,155,14,155,14,155,14,0,0,155,0,0,0,155,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,100,95,112,95,100,89,112,89,91,93,103,93,95,95,107,95,95,89,107,89,95,87,107,87,95,85,107,85,
  65. 95,83,107,83,91,95,103,95,91,89,103,89,91,87,103,87,93,95,105,95,93,89,105,89,93,87,105,87,95,95,107,95,95,89,107,89,0,8,0,32,140,92,140,92,140,90,140,90,140,88,140,88,140,86,138,22,143,92,143,92,143,90,143,90,143,88,143,88,143,86,150,22,147,92,147,92,147,90,147,90,147,88,147,88,147,86,147,86,147,84,135,8,150,14,147,28,147,10,147,40,143,12,143,10,0,32,0,32,135,94,135,92,135,90,135,88,143,92,143,90,140,94,140,92,140,90,140,88,140,86,140,84,135,94,135,92,135,90,135,88,135,94,135,92,135,90,135,88,140,92,140,90,145,94,145,92,145,90,145,88,147,92,147,90,150,94,150,92,150,90,150,88,0,16,0,0,95,15,107,15,95,9,107,9,88,11,100,11,91,15,103,15,91,9,103,9,88,15,100,15,88,9,100,9,88,7,100,7,91,15,103,15,91,9,103,9,93,7,105,7,93,5,105,5,95,15,107,15,95,9,107,9,95,7,107,7,91,11,103,11,0,8,0,32,145,94,145,92,145,90,145,88,147,92,147,90,
  66. 152,94,152,92,152,90,152,88,157,92,157,90,143,92,152,88,147,94,150,90,143,94,143,92,143,90,143,88,145,92,145,90,150,94,150,92,150,90,150,88,155,92,155,90,162,94,159,88,152,92,147,86,0,16,0,32,1,94,175,91,1,94,191,83,175,91,191,83,1,94,191,83,1,94,191,83,175,91,1,94,175,91,191,83,1,94,191,83,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,16,0,16,1,94,1,94,1,94,191,83,175,91,191,83,191,83,1,94,1,94,191,83,1,94,191,83,175,91,191,83,175,91,191,83,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0,16,0,16,41,8,41,8,41,6,43,22,41,68,43,20,41,66,43,18,51,72,48,24,46,72,46,6,48,72,48,6,43,24,43,6,46,72,46,8,46,6,48,22,46,68,48,20,46,68,48,20,43,72,46,24,43,70,46,20,43,72,43,8,41,22,41,36,
  67. 0,32,0,0,100,83,100,83,100,85,100,85,100,87,100,87,100,89,100,89,100,91,100,91,100,93,100,93,100,95,64,81,100,95,64,81,100,93,64,81,100,93,64,81,100,91,64,81,100,91,64,81,100,89,64,81,100,87,64,81,100,85,64,81,100,83,64,81,0,8,0,32,95,83,95,83,95,85,95,85,95,87,95,87,95,89,95,89,95,91,95,91,95,93,95,93,95,95,0,80,95,95,0,80,95,93,0,80,95,93,0,80,95,91,0,80,95,91,0,80,95,89,0,80,95,87,0,80,95,85,0,80,95,83,0,80,0,8,0,32,195,7,197,23,199,25,204,25,211,27,219,29,228,14,240,30,103,15,110,31,228,14,240,30,103,15,110,31,228,12,240,28,103,13,110,29,228,10,240,26,103,11,110,27,228,8,240,24,103,9,110,25,228,6,240,22,103,5,110,21,228,2,240,18,0,5,0,0,140,94,140,92,140,90,140,88,140,86,138,92,138,90,138,88,143,94,143,92,143,90,143,88,143,86,140,92,140,90,140,88,140,94,140,92,140,90,140,88,140,86,138,92,138,90,138,88,
  68. 143,94,143,92,143,90,143,88,143,86,145,92,145,90,145,88,0,32,0,32,147,94,147,92,147,90,147,88,147,86,145,92,145,90,145,88,150,94,150,92,150,90,150,88,150,86,147,92,147,90,147,88,147,94,147,92,147,90,147,88,147,86,143,92,143,90,143,88,140,10,145,22,150,92,143,88,150,46,150,42,140,14,140,90,0,32,0,0,223,6,235,6,98,7,105,7,223,4,235,4,98,5,105,5,223,2,235,2,98,3,105,3,223,0,235,0,98,1,105,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,233,90,192,0,233,88,240,14,240,12,240,90,211,80,228,0,228,80,192,0,211,80,228,0,228,80,192,0,192,0,228,0,228,80,192,0,192,0,192,0,192,0,192,0,192,0,192,0,192,0,192,0,192,0,192,0,192,0,192,0,192,0,192,0,0,11,0,0,124,95,124,89,124,87,124,85,124,83,124,83,119,91,119,89,122,95,122,91,122,89,122,87,122,85,122,85,122,83,122,83,
  69. 117,95,117,91,117,89,117,89,117,87,117,87,117,85,117,85,117,83,117,83,115,95,115,91,115,89,115,87,115,85,115,83,0,16,0,0,117,95,117,91,117,89,117,87,117,85,117,85,117,83,117,83,119,91,119,87,115,95,115,91,115,89,115,87,115,85,115,85,122,95,122,89,122,87,122,85,122,83,122,83,115,95,115,91,115,89,115,89,115,87,115,87,115,85,115,85,115,83,115,83,0,16,0,0,12,12,12,6,12,10,12,6,12,10,12,6,12,2,12,0,12,12,12,6,12,10,12,6,12,10,12,6,12,2,15,0,17,12,17,6,17,10,17,6,17,2,17,0,10,12,10,6,10,10,10,6,10,10,10,6,10,10,10,6,10,2,0,0,0,16,0,32,5,12,5,6,5,10,5,6,5,2,5,0,7,12,7,6,7,10,7,6,7,2,0,0,15,12,15,6,15,2,0,0,12,12,12,6,12,10,12,6,12,10,12,6,12,10,12,6,12,10,12,6,12,2,0,0,12,12,12,6,12,2,12,0,0,16,0,0,131,85,164,83,128,81,131,83,164,85,155,83,162,85,131,83,
  70. 128,81,131,83,145,85,179,83,162,85,128,81,157,85,138,83,183,85,152,83,174,85,157,83,128,81,183,83,183,85,152,83,174,85,157,83,145,85,131,83,128,81,131,83,164,85,157,83,0,16,0,0,178,3,178,3,178,3,178,3,177,3,177,3,176,3,174,3,170,3,165,3,155,3,147,3,143,3,141,3,140,3,140,3,140,3,140,3,140,3,143,3,148,3,157,3,164,3,170,3,174,3,176,3,177,3,179,3,179,3,180,3,180,3,180,3,0,16,0,32,176,88,176,80,176,86,179,84,171,86,176,80,176,84,176,80,176,80,176,84,176,80,176,80,176,82,176,80,176,80,176,82,171,88,171,80,171,86,167,84,169,86,171,80,171,84,171,80,171,80,171,84,171,80,171,80,171,82,171,80,171,80,171,82,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,
  71. 0,112,120,97,13,201,4,111,235,193,226,221,39,95,127,119,116,246,253,135,71,27,193,229,175,240,0,221,43,156,95,70,105,147,20,209,237,239,144,189,194,27,228,151,156,210,199,65,148,117,143,240,12,213,125,197,91,188,134,25,70,194,240,49,102,70,38,60,191,120,97,232,49,178,210,237,188,234,49,220,113,222,117,126,71,230,135,219,26,191,99,164,85,12,57,112,167,237,119,164,199,51,160,61,162,58,164,77,240,14,123,107,193,74,54,217,110,164,117,48,101,156,189,153,157,166,207,212,6,68,71,218,167,72,246,206,91,186,112,173,216,60,175,221,82,12,255,22,210,137,98,96,69,42,124,3,97,120,160,164,137,194,249,20,200,187,19,86,93,23,42,31,89,77,236,204,240,18,60,147,14,63,220,111,157,129,58,28,138,134,38,38,70,179,234,37,202,206,16,242,232,153,210,67,112,132,254,137,80,240,132,80,248,119,160,80,248,181,160,40,254,12,42,138,159,39,10,133,127,138,226,174,157,125,103,156,231,138,237,42,4,194,125,104,147,150,87,74,132,207,15,42,226,220,82,17,
  72. 95,160,34,254,4,42,226,13,84,4,197,8,21,19,102,210,231,73,53,211,163,64,35,64,235,54,121,41,165,89,215,163,118,61,2,215,99,125,175,216,216,88,153,138,244,12,93,57,180,52,24,108,102,147,89,105,235,46,45,211,181,82,108,208,30,155,157,45,7,119,218,241,161,197,3,157,19,102,105,237,42,225,52,75,61,67,249,16,114,55,130,228,168,70,250,174,177,246,138,245,19,40,193,71,114,252,24,233,39,22,156,61,218,36,229,174,27,53,226,124,14,201,150,52,15,5,203,35,43,190,168,13,132,201,22,98,111,105,135,199,37,162,245,167,198,61,102,135,124,22,181,217,1,182,143,10,250,171,204,40,131,234,169,176,233,119,186,124,40,243,69,150,11,108,136,202,172,47,11,151,42,178,87,98,66,17,93,43,153,124,56,108,31,33,247,103,120,202,154,165,76,171,220,251,39,18,44,160,254,12,94,144,180,242,77,229,228,138,120,228,114,184,168,226,50,181,176,178,51,37,211,46,247,233,240,202,202,255,18,150,255,163,81,162,108,46,121,88,37,172,93,187,8,66,203,146,
  73. 103,32,20,38,255,111,146,8,150,42,255,39,73,254,199,93,130,61,170,30,58,228,63,74,29,242,255,151,64,186,117,200,255,255,83,133,87,146,40,176,31,130,253,80,98,143,134,57,148,20,21,212,95,97,247,87,65,253,211,147,255,171,243,42,200,173,94,126,139,151,255,255,41,192,44,188,254,202,151,255,135,50,125,228,203,255,255,241,161,44,47,222,5,10,114,57,118,209,81,244,16,142,173,192,8,51,11,83,8,32,78,58,8,255,127,138,206,170,228,99,55,90,159,199,151,112,99,134,184,40,38,124,106,255,144,9,209,33,38,157,240,151,93,196,33,88,204,27,226,166,156,16,236,9,255,105,39,162,15,79,25,236,108,77,165,67,187,39,110,116,147,167,214,213,88,48,91,14,21,233,202,214,88,185,100,161,173,133,185,249,116,178,89,169,55,213,194,39,150,164,23,52,108,37,185,160,41,185,240,63,242,103,122,97,82,232,84,25,232,199,101,198,169,104,78,193,114,115,150,192,130,221,54,172,176,96,69,105,28,87,118,83,153,134,248,169,129,14,113,135,185,116,106,64,148,157,
  74. 58,201,10,225,178,254,85,44,228,201,104,179,17,212,167,206,229,59,30,217,79,146,149,54,15,246,204,207,11,116,13,166,134,195,80,219,96,58,220,8,211,212,62,253,64,212,88,111,196,26,70,26,18,63,152,172,170,93,123,171,6,217,194,240,173,242,189,11,28,123,128,214,138,250,136,79,188,48,158,247,225,98,60,27,37,3,42,227,8,189,211,106,4,198,26,225,135,24,169,124,200,142,7,118,124,208,120,97,96,32,79,54,70,180,138,237,21,218,51,176,63,228,131,85,8,75,31,137,143,47,92,180,115,80,216,69,179,84,126,48,122,141,137,90,71,41,118,77,160,33,22,46,5,114,232,144,59,87,17,136,75,108,245,70,217,209,91,143,255,83,249,55,242,255,219,106,165,233,135,255,12,140,164,31,46,161,36,129,204,189,165,50,136,167,154,186,88,89,28,207,86,154,93,189,11,233,135,90,232,33,113,206,180,172,146,238,252,189,168,248,59,53,76,233,225,199,98,222,246,107,189,236,229,106,48,189,101,2,217,141,108,98,171,232,39,3,120,15,3,87,17,149,39,169,16,55,
  75. 12,185,77,243,205,29,75,238,211,161,178,199,84,211,101,59,35,78,25,53,110,154,250,98,38,148,243,135,57,182,138,108,107,112,89,79,100,176,138,71,214,28,177,17,137,213,153,99,175,144,53,115,199,200,96,162,44,154,4,133,4,233,74,33,22,231,154,149,66,195,198,53,27,197,154,182,142,105,38,84,252,163,161,180,185,59,208,15,14,14,14,21,217,172,172,114,212,192,82,192,220,226,114,148,156,90,76,88,79,187,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  76. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  77. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  78. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  79. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  80. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  81. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  82. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  83. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  84. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  85. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  86. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  87. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  88. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  89. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  90. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  91. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  92. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  93. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  94. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  95. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  96. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  97. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  98. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  99. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  100. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  101. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  102. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  103. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  104. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  105. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  106. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  107. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  108. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  109. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  110. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  111. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  112. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  113. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  114. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  115. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  116. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  117. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  118. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  119. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  120. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  121. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  122. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  123. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  124. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  125. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  126. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  127. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  128. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  129. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  130. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  131. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
  132. var Module = typeof Module !== "undefined" ? Module : {};
  133. if (!Module.expectedDataFileDownloads) {
  134. Module.expectedDataFileDownloads = 0;
  135. Module.finishedDataFileDownloads = 0;
  136. }
  137. Module.expectedDataFileDownloads++;
  138. (function() {
  139. var loadPackage = function(metadata) {
  140. function runWithFS() {
  141. var fileData0 = [];
  142. fileData0.push.apply(fileData0, [ 67, 80, 79, 68, 68, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 70, 73, 76, 0, 0, 0, 0, 123, 144, 0, 0, 112, 111, 100, 47, 112, 105, 99, 111, 56, 95, 98, 111, 111, 116, 46, 112, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 1, 0, 0, 242, 16, 112, 105, 99, 111, 45, 56, 32, 99, 97, 114, 116, 114, 105, 100, 103, 101, 32, 47, 47, 32, 104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 31, 0, 255, 13, 46, 99, 111, 109, 10, 118, 101, 114, 115, 105, 111, 110, 32, 56, 10, 95, 95, 108, 117, 97, 95, 95, 10, 10, 45, 45, 62, 56, 6, 0, 25, 159, 95, 95, 103, 102, 120, 95, 95, 10, 48, 1, 0, 108, 15, 129, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 45, 1, 137, 64, 31, 102, 137, 64, 112, 15, 139, 1, 109, 15, 1, 1, 239, 95, 95, 95, 109, 97, 112, 10, 2, 240, 15, 1, 1, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 44, 50, 95, 95, 115, 187, 98, 48, 49, 48, 99, 17, 0, 161, 51, 48, 53, 53, 53, 50, 98, 53, 54, 53, 10, 0, 64, 51, 53, 53, 52, 5, 0, 128, 49, 53, 51, 53, 55, 48, 53, 48, 3, 0, 15, 5, 0, 106, 0, 169, 0, 16, 56, 12, 0, 115, 50, 52, 48, 51, 53, 50, 52, 26, 0, 15, 91, 2, 130, 30, 49, 154, 0, 15, 169, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 238, 113, 95, 95, 109, 117, 115, 105, 99, 114, 74, 50, 32, 52, 49, 2, 0, 15, 12, 0, 255, 255, 224, 80, 49, 52, 49, 10, 10, 99, 70, 73, 76, 0, 0, 0, 0, 27, 189, 12, 0, 112, 111, 100, 47, 103, 102, 120, 49, 46, 112, 111, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 74, 0, 0, 243, 22, 67, 80, 79, 68, 68, 0, 0, 0, 1, 0, 0, 0, 103, 102, 120, 49, 46, 112, 111, 100, 0, 47, 112, 97, 98, 97, 47, 112, 105, 99, 111, 56, 47, 112, 111, 100, 47, 25, 0, 63, 9, 1, 0, 1, 0, 10, 177, 67, 66, 77, 80, 20, 0, 1, 0, 128, 0, 0, 4, 0, 47, 32, 0, 1, 0, 255, 255, 255, 255, 255, 255, 255, 255, 207, 79, 77, 0, 255, 255, 4, 0, 73, 47, 0, 0, 0, 2, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 91, 63, 163, 255, 255, 4, 0, 73, 47, 232, 241, 4, 0, 75, 47, 170, 204, 4, 0, 75, 15, 0, 2, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 155, 79, 39, 236, 255, 255, 4, 0, 73, 47, 232, 241, 4, 0, 255, 12, 47, 168, 119, 4, 0, 75, 15, 0, 2, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 59, 15, 1, 0, 77, 79, 54, 228, 0, 255, 4, 0, 73, 15, 160, 1, 77, 63, 156, 118, 131, 4, 0, 74, 15, 160, 1, 77, 15, 0, 2, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 155, 15, 1, 0, 77, 79, 255, 173, 41, 255, 4, 0, 73, 15, 99, 1, 77, 15, 0, 2, 255, 255, 255, 255, 255, 255,
  143. fileData0.push.apply(fileData0, [ 88, 0, 39, 0, 56, 43, 38, 0, 155, 16, 0, 4, 76, 43, 4, 116, 0, 0, 48, 2, 4, 184, 19, 15, 192, 0, 49, 47, 177, 217, 0, 5, 255, 252, 4, 148, 208, 8, 84, 11, 4, 144, 2, 12, 56, 22, 15, 116, 0, 51, 15, 128, 92, 255, 160, 31, 168, 40, 45, 88, 15, 56, 22, 9, 15, 108, 0, 48, 15, 0, 10, 255, 255, 8, 8, 128, 2, 47, 177, 217, 80, 116, 11, 15, 88, 7, 0, 15, 0, 5, 21, 15, 128, 7, 255, 255, 24, 15, 80, 116, 20, 15, 128, 2, 255, 255, 48, 15, 128, 12, 3, 15, 208, 113, 6, 15, 128, 2, 255, 151, 14, 152, 1, 15, 48, 2, 75, 31, 177, 52, 17, 7, 15, 56, 22, 54, 15, 212, 0, 8, 15, 128, 2, 255, 123, 12, 148, 62, 15, 176, 14, 85, 31, 177, 52, 17, 60, 4, 4, 0, 14, 248, 19, 15, 128, 2, 255, 144, 8, 200, 6, 31, 177, 48, 12, 72, 14, 192, 4, 14, 52, 17, 15, 200, 5, 80, 15, 128, 7, 255, 215, 15, 128, 2, 1, 4, 52, 7, 12, 12, 0, 0, 180, 14, 15, 200, 0, 85, 14, 236, 7, 15, 128, 12, 255, 196, 15, 128, 7, 4, 15, 52, 17, 78, 15, 124, 2, 8, 14, 112, 10, 15, 128, 2, 255, 201, 4, 128, 12, 4, 8, 0, 42, 0, 155, 20, 0, 15, 52, 17, 69, 15, 120, 2, 8, 15, 248, 12, 5, 15, 128, 17, 255, 203, 42, 0, 155, 128, 7, 4, 8, 5, 15, 52, 17, 24, 15, 120, 2, 70, 14, 136, 2, 15, 0, 20, 255, 200, 8, 8, 10, 15, 52, 17, 41, 14, 184, 4, 15, 120, 2, 47, 14, 136, 2, 15, 128, 2, 255, 28, 14, 116, 36, 15, 128, 2, 139, 12, 188, 0, 15, 108, 37, 44, 15, 116, 2, 1, 15, 132, 2, 45, 15, 128, 2, 255, 15, 15, 248, 38, 4, 15, 136, 12, 158, 15, 244, 4, 20, 15, 4, 0, 97, 15, 128, 2, 254, 15, 200, 8, 20, 15, 56, 27, 146, 14, 128, 2, 15, 124, 2, 6, 15, 128, 2, 230, 15, 100, 57, 12, 15, 4, 0, 255, 207, 15, 0, 5, 125, 15, 176, 26, 44, 15, 104, 6, 65, 15, 20, 5, 45, 15, 228, 5, 145, 15, 128, 7, 246, 14, 176, 26, 15, 104, 1, 78, 15, 148, 2, 218, 15, 188, 0, 25, 4, 180, 59, 4, 192, 27, 15, 128, 7, 255, 255, 35, 15, 76, 1, 41, 12, 64, 30, 15, 128, 7, 196, 15, 4, 0, 255, 71, 15, 204, 8, 27, 15, 64, 30, 79, 15, 4, 0, 0, 15, 0, 70, 109, 15, 220, 11, 255, 75, 12, 204, 8, 15, 244, 4, 21, 47, 232, 241, 64, 30, 11, 15, 172, 6, 55, 15, 128, 2, 255, 204, 15, 32, 2, 31, 15, 196, 163, 30, 15, 128, 2, 255, 243, 15, 48, 11, 57, 15, 196, 163, 36, 15, 0, 10, 255, 231, 15, 176, 18, 16, 15, 116, 47, 61, 15, 0, 10, 255, 251, 14, 228, 9, 15, 100, 0, 63, 0, 120, 7, 15, 192, 0, 12, 15, 128, 7, 209, 15, 172, 17, 9, 15, 128, 7, 255, 55, 15, 96, 1, 4, 15, 128, 2, 255, 3, 12, 124, 6, 14, 176, 27, 15, 92, 10, 255, 124, 15, 128, 2, 193, 14, 124, 6, 15, 0, 30, 255, 255, 29, 15, 160, 3, 56, 15, 128, 2, 255, 255, 100, 14, 4, 0, 15, 128, 2, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 169, 63, 255, 155, 63, 4, 0, 255, 235, 15, 128, 2, 255, 94, 4, 176, 20, 15, 128, 2, 255, 255, 99, 12, 48, 28, 15, 128, 2, 255, 255, 99, 8, 48, 28, 15, 128, 2, 255, 255, 31, 14, 60, 7, 15, 128, 7, 255, 204, 8, 40, 13, 15, 248, 0, 61, 14, 92, 0, 15, 60, 7, 255, 0, 14, 128, 1, 15, 0, 5, 255, 12, 12, 44, 1, 14, 56, 1, 15, 56, 0, 22, 15, 60, 7, 13, 15, 8, 2, 101, 15, 0, 5, 255, 91, 15, 160, 1, 25, 14, 72, 2, 15, 56, 0, 30, 15, 60, 7, 21, 15, 32, 3, 61, 15, 0, 10, 255, 199, 14, 52, 4, 15, 56, 0, 30, 15, 32, 3, 77, 15, 128, 2, 255, 187, 12, 220, 1, 14, 72, 2, 15, 56, 0, 30, 15, 32, 3, 81, 15, 0, 5, 255, 191, 15, 8, 10, 56, 15, 32, 3, 61, 15, 128, 2, 255, 227, 15, 144, 4, 89, 14, 44, 12, 15, 232, 2, 79, 8, 32, 62, 15, 32, 0, 8, 15, 80, 0, 34, 15, 4, 0, 20, 15, 128, 2, 186, 14, 212, 0, 15, 80, 19, 14, 15, 0, 20, 154, 14, 8, 10, 15, 0, 30, 255, 255, 89, 14, 4, 0, 15, 128, 2, 255, 255, 255, 250, 15, 32, 38, 0, 15, 0, 5, 255, 255, 255, 133, 15, 168, 3, 0, 15, 128, 2, 255, 135, 15, 84, 5, 20, 15, 8, 3, 255, 54, 15, 128, 12, 255, 255, 111, 15, 128, 2, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 48, 15, 4, 0, 255, 242, 15, 128, 2, 56, 15, 4, 0, 255, 255, 35, 15, 128, 2, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 252, 63, 54, 54, 54, 4, 0, 255, 243, 15, 128, 2, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
  144. fileData0.push.apply(fileData0, [ 51, 1, 15, 151, 11, 21, 15, 237, 11, 20, 47, 0, 255, 210, 19, 24, 15, 14, 7, 15, 47, 255, 0, 88, 1, 22, 5, 177, 5, 15, 145, 8, 17, 5, 196, 12, 15, 10, 5, 4, 15, 35, 16, 4, 0, 43, 0, 95, 55, 0, 0, 0, 7, 208, 18, 15, 15, 1, 0, 1, 15, 63, 0, 10, 15, 2, 0, 15, 15, 63, 0, 11, 9, 132, 0, 8, 197, 8, 4, 70, 3, 15, 63, 0, 9, 7, 136, 18, 7, 68, 22, 3, 246, 19, 15, 63, 0, 15, 5, 91, 6, 2, 57, 0, 15, 14, 0, 1, 15, 126, 0, 10, 4, 152, 6, 24, 255, 131, 12, 5, 161, 1, 15, 63, 0, 16, 5, 55, 0, 27, 255, 253, 16, 3, 28, 0, 15, 252, 0, 12, 47, 0, 255, 56, 0, 4, 3, 155, 0, 15, 126, 0, 19, 5, 113, 1, 4, 124, 1, 14, 126, 0, 15, 189, 0, 7, 7, 245, 0, 7, 126, 0, 31, 255, 252, 0, 24, 6, 255, 3, 7, 65, 9, 15, 248, 1, 21, 27, 255, 248, 1, 31, 0, 248, 1, 19, 43, 255, 255, 39, 2, 5, 181, 1, 15, 244, 2, 17, 8, 232, 0, 6, 7, 2, 9, 16, 1, 15, 181, 2, 26, 7, 0, 25, 15, 244, 2, 17, 7, 54, 3, 31, 0, 248, 1, 33, 15, 37, 4, 4, 6, 1, 0, 15, 189, 0, 20, 7, 122, 0, 3, 219, 16, 15, 189, 0, 29, 7, 135, 1, 25, 255, 74, 19, 15, 248, 1, 12, 10, 238, 0, 10, 10, 1, 15, 55, 2, 20, 10, 189, 0, 15, 122, 1, 22, 5, 221, 2, 4, 229, 5, 25, 255, 53, 22, 15, 63, 0, 19, 9, 135, 16, 2, 227, 16, 15, 122, 1, 26, 11, 82, 21, 15, 244, 2, 26, 15, 14, 0, 2, 15, 232, 5, 23, 15, 7, 0, 2, 15, 232, 5, 16, 14, 177, 1, 22, 255, 69, 22, 2, 12, 0, 15, 169, 5, 16, 6, 92, 4, 7, 109, 13, 47, 0, 255, 122, 1, 16, 5, 156, 3, 3, 155, 5, 8, 186, 3, 14, 236, 4, 15, 181, 2, 4, 27, 255, 197, 0, 6, 232, 10, 31, 0, 252, 0, 15, 25, 255, 237, 6, 6, 152, 25, 31, 255, 244, 2, 15, 8, 69, 23, 6, 114, 22, 11, 217, 25, 15, 110, 4, 10, 12, 123, 1, 24, 255, 230, 6, 15, 181, 2, 14, 3, 253, 0, 7, 241, 4, 3, 80, 1, 14, 228, 6, 15, 251, 22, 7, 8, 120, 0, 9, 128, 14, 15, 189, 0, 19, 8, 4, 14, 4, 163, 25, 15, 110, 4, 26, 29, 255, 77, 14, 15, 169, 5, 16, 15, 7, 0, 2, 15, 55, 2, 33, 7, 61, 1, 4, 59, 1, 15, 126, 0, 17, 7, 27, 30, 28, 255, 189, 0, 15, 161, 7, 17, 7, 245, 0, 6, 71, 0, 5, 64, 0, 15, 252, 0, 16, 7, 67, 0, 40, 255, 255, 3, 1, 15, 110, 4, 16, 8, 52, 1, 43, 255, 255, 18, 1, 31, 0, 232, 5, 19, 13, 127, 1, 5, 140, 2, 15, 63, 0, 20, 9, 160, 5, 15, 181, 2, 21, 11, 184, 0, 31, 255, 118, 2, 28, 5, 135, 8, 5, 59, 1, 8, 133, 2, 15, 189, 0, 15, 6, 44, 3, 4, 237, 4, 7, 246, 4, 31, 0, 169, 5, 14, 43, 0, 255, 46, 6, 7, 187, 13, 5, 187, 12, 15, 126, 0, 10, 11, 244, 16, 6, 63, 27, 14, 248, 1, 15, 118, 2, 4, 7, 216, 5, 40, 0, 255, 41, 5, 47, 0, 255, 244, 2, 16, 5, 116, 20, 11, 14, 0, 15, 106, 5, 13, 24, 255, 96, 4, 12, 110, 4, 15, 51, 3, 19, 15, 191, 3, 0, 6, 252, 6, 47, 0, 255, 90, 9, 18, 43, 255, 255, 77, 29, 5, 59, 2, 15, 98, 7, 12, 12, 203, 11, 27, 0, 192, 30, 15, 27, 9, 21, 28, 255, 179, 6, 6, 138, 15, 15, 78, 12, 9, 29, 0, 118, 4, 6, 244, 3, 15, 11, 13, 17, 11, 56, 2, 7, 144, 1, 15, 51, 3, 16, 15, 25, 8, 0, 7, 146, 13, 31, 255, 39, 6, 19, 29, 255, 14, 0, 31, 255, 236, 4, 17, 4, 142, 7, 8, 120, 1, 6, 183, 1, 47, 255, 0, 177, 3, 17, 41, 0, 0, 193, 12, 10, 51, 7, 15, 70, 14, 21, 13, 196, 0, 14, 161, 7, 15, 102, 6, 6, 10, 6, 2, 15, 244, 2, 22, 11, 147, 7, 9, 229, 5, 15, 106, 5, 25, 11, 245, 2, 47, 255, 255, 185, 1, 18, 40, 0, 255, 203, 14, 9, 16, 10, 7, 104, 17, 15, 126, 0, 30, 14, 55, 2, 15, 236, 4, 26, 15, 157, 8, 23, 24, 0, 29, 7, 41, 255, 255, 171, 5, 14, 70, 14, 15, 252, 0, 3, 9, 53, 4, 6, 68, 2, 15, 122, 1, 2, 15, 201, 13, 7, 11, 47, 7, 15, 7, 14, 21, 15, 250, 2, 5, 15, 70, 14, 21, 9, 102, 4, 6, 191, 15, 15, 63, 0, 26, 7, 253, 0, 15, 66, 15, 26, 7, 192, 2, 28, 255, 80, 1, 15, 126, 0, 13, 44, 255, 255, 185, 15, 15, 240, 3, 23, 10, 216, 9, 47, 255, 0, 51, 3, 38, 13, 119, 0, 15, 196, 14, 17, 11, 209, 9, 5, 202, 0, 6, 238, 6, 15, 114, 3, 19, 8, 242, 1, 7, 145, 11, 31, 255, 252, 0, 25, 14, 14, 0, 15, 149, 10, 20, 12, 209, 10, 47, 255, 0, 43, 5, 29, 5, 187, 22, 14, 244, 2, 15, 55, 2, 21, 9, 7, 0, 15, 122, 1, 5, 15, 146, 11, 14, 31, 0, 35, 7, 21, 7, 93, 8, 9, 79, 11, 5, 211, 10, 15, 189, 0, 28, 8, 100, 7, 14, 70, 14, 15, 248, 1, 18, 15, 15, 12, 27, 8, 34, 4, 15, 189, 0, 35, 5, 38, 4, 28, 255, 190, 0, 15, 172, 20, 18, 14, 81, 13, 15, 173, 4, 19, 8, 153, 29, 15, 189, 0, 32, 7, 93, 5, 15, 126
  145. Module["FS_createDataFile"]("/", "data.pod", fileData0, true, true, false);
  146. }
  147. if (Module["calledRun"]) {
  148. runWithFS();
  149. } else {
  150. if (!Module["preRun"]) Module["preRun"] = [];
  151. Module["preRun"].push(runWithFS);
  152. }
  153. };
  154. loadPackage({
  155. "files": []
  156. });
  157. })();
  158. var moduleOverrides = {};
  159. var key;
  160. for (key in Module) {
  161. if (Module.hasOwnProperty(key)) {
  162. moduleOverrides[key] = Module[key];
  163. }
  164. }
  165. Module["arguments"] = [];
  166. Module["thisProgram"] = "./this.program";
  167. Module["quit"] = function(status, toThrow) {
  168. throw toThrow;
  169. };
  170. Module["preRun"] = [];
  171. Module["postRun"] = [];
  172. var ENVIRONMENT_IS_WEB = false;
  173. var ENVIRONMENT_IS_WORKER = false;
  174. var ENVIRONMENT_IS_NODE = false;
  175. var ENVIRONMENT_IS_SHELL = false;
  176. ENVIRONMENT_IS_WEB = typeof window === "object";
  177. ENVIRONMENT_IS_WORKER = typeof importScripts === "function";
  178. ENVIRONMENT_IS_NODE = typeof process === "object" && typeof require === "function" && !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_WORKER;
  179. ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER;
  180. var scriptDirectory = "";
  181. function locateFile(path) {
  182. if (Module["locateFile"]) {
  183. return Module["locateFile"](path, scriptDirectory);
  184. } else {
  185. return scriptDirectory + path;
  186. }
  187. }
  188. if (ENVIRONMENT_IS_NODE) {
  189. scriptDirectory = __dirname + "/";
  190. var nodeFS;
  191. var nodePath;
  192. Module["read"] = function shell_read(filename, binary) {
  193. var ret;
  194. ret = tryParseAsDataURI(filename);
  195. if (!ret) {
  196. if (!nodeFS) nodeFS = require("fs");
  197. if (!nodePath) nodePath = require("path");
  198. filename = nodePath["normalize"](filename);
  199. ret = nodeFS["readFileSync"](filename);
  200. }
  201. return binary ? ret : ret.toString();
  202. };
  203. Module["readBinary"] = function readBinary(filename) {
  204. var ret = Module["read"](filename, true);
  205. if (!ret.buffer) {
  206. ret = new Uint8Array(ret);
  207. }
  208. assert(ret.buffer);
  209. return ret;
  210. };
  211. if (process["argv"].length > 1) {
  212. Module["thisProgram"] = process["argv"][1].replace(/\\/g, "/");
  213. }
  214. Module["arguments"] = process["argv"].slice(2);
  215. if (typeof module !== "undefined") {
  216. module["exports"] = Module;
  217. }
  218. process["on"]("uncaughtException", function(ex) {
  219. if (!(ex instanceof ExitStatus)) {
  220. throw ex;
  221. }
  222. });
  223. process["on"]("unhandledRejection", abort);
  224. Module["quit"] = function(status) {
  225. process["exit"](status);
  226. };
  227. Module["inspect"] = function() {
  228. return "[Emscripten Module object]";
  229. };
  230. } else if (ENVIRONMENT_IS_SHELL) {
  231. if (typeof read != "undefined") {
  232. Module["read"] = function shell_read(f) {
  233. var data = tryParseAsDataURI(f);
  234. if (data) {
  235. return intArrayToString(data);
  236. }
  237. return read(f);
  238. };
  239. }
  240. Module["readBinary"] = function readBinary(f) {
  241. var data;
  242. data = tryParseAsDataURI(f);
  243. if (data) {
  244. return data;
  245. }
  246. if (typeof readbuffer === "function") {
  247. return new Uint8Array(readbuffer(f));
  248. }
  249. data = read(f, "binary");
  250. assert(typeof data === "object");
  251. return data;
  252. };
  253. if (typeof scriptArgs != "undefined") {
  254. Module["arguments"] = scriptArgs;
  255. } else if (typeof arguments != "undefined") {
  256. Module["arguments"] = arguments;
  257. }
  258. if (typeof quit === "function") {
  259. Module["quit"] = function(status) {
  260. quit(status);
  261. };
  262. }
  263. } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
  264. if (ENVIRONMENT_IS_WORKER) {
  265. scriptDirectory = self.location.href;
  266. } else if (document.currentScript) {
  267. scriptDirectory = document.currentScript.src;
  268. }
  269. if (scriptDirectory.indexOf("blob:") !== 0) {
  270. scriptDirectory = scriptDirectory.substr(0, scriptDirectory.lastIndexOf("/") + 1);
  271. } else {
  272. scriptDirectory = "";
  273. }
  274. Module["read"] = function shell_read(url) {
  275. try {
  276. var xhr = new XMLHttpRequest();
  277. xhr.open("GET", url, false);
  278. xhr.send(null);
  279. return xhr.responseText;
  280. } catch (err) {
  281. var data = tryParseAsDataURI(url);
  282. if (data) {
  283. return intArrayToString(data);
  284. }
  285. throw err;
  286. }
  287. };
  288. if (ENVIRONMENT_IS_WORKER) {
  289. Module["readBinary"] = function readBinary(url) {
  290. try {
  291. var xhr = new XMLHttpRequest();
  292. xhr.open("GET", url, false);
  293. xhr.responseType = "arraybuffer";
  294. xhr.send(null);
  295. return new Uint8Array(xhr.response);
  296. } catch (err) {
  297. var data = tryParseAsDataURI(url);
  298. if (data) {
  299. return data;
  300. }
  301. throw err;
  302. }
  303. };
  304. }
  305. Module["readAsync"] = function readAsync(url, onload, onerror) {
  306. var xhr = new XMLHttpRequest();
  307. xhr.open("GET", url, true);
  308. xhr.responseType = "arraybuffer";
  309. xhr.onload = function xhr_onload() {
  310. if (xhr.status == 200 || xhr.status == 0 && xhr.response) {
  311. onload(xhr.response);
  312. return;
  313. }
  314. var data = tryParseAsDataURI(url);
  315. if (data) {
  316. onload(data.buffer);
  317. return;
  318. }
  319. onerror();
  320. };
  321. xhr.onerror = onerror;
  322. xhr.send(null);
  323. };
  324. Module["setWindowTitle"] = function(title) {
  325. document.title = title;
  326. };
  327. } else {}
  328. var out = Module["print"] || (typeof console !== "undefined" ? console.log.bind(console) : typeof print !== "undefined" ? print : null);
  329. var err = Module["printErr"] || (typeof printErr !== "undefined" ? printErr : typeof console !== "undefined" && console.warn.bind(console) || out);
  330. for (key in moduleOverrides) {
  331. if (moduleOverrides.hasOwnProperty(key)) {
  332. Module[key] = moduleOverrides[key];
  333. }
  334. }
  335. moduleOverrides = undefined;
  336. var STACK_ALIGN = 16;
  337. function dynamicAlloc(size) {
  338. var ret = HEAP32[DYNAMICTOP_PTR >> 2];
  339. var end = ret + size + 15 & -16;
  340. if (end <= _emscripten_get_heap_size()) {
  341. HEAP32[DYNAMICTOP_PTR >> 2] = end;
  342. } else {
  343. return 0;
  344. }
  345. return ret;
  346. }
  347. function getNativeTypeSize(type) {
  348. switch (type) {
  349. case "i1":
  350. case "i8":
  351. return 1;
  352. case "i16":
  353. return 2;
  354. case "i32":
  355. return 4;
  356. case "i64":
  357. return 8;
  358. case "float":
  359. return 4;
  360. case "double":
  361. return 8;
  362. default:
  363. {
  364. if (type[type.length - 1] === "*") {
  365. return 4;
  366. } else if (type[0] === "i") {
  367. var bits = parseInt(type.substr(1));
  368. assert(bits % 8 === 0, "getNativeTypeSize invalid bits " + bits + ", type " + type);
  369. return bits / 8;
  370. } else {
  371. return 0;
  372. }
  373. }
  374. }
  375. }
  376. function warnOnce(text) {
  377. if (!warnOnce.shown) warnOnce.shown = {};
  378. if (!warnOnce.shown[text]) {
  379. warnOnce.shown[text] = 1;
  380. err(text);
  381. }
  382. }
  383. var jsCallStartIndex = 1;
  384. var functionPointers = new Array(0);
  385. var funcWrappers = {};
  386. function dynCall(sig, ptr, args) {
  387. if (args && args.length) {
  388. return Module["dynCall_" + sig].apply(null, [ ptr ].concat(args));
  389. } else {
  390. return Module["dynCall_" + sig].call(null, ptr);
  391. }
  392. }
  393. var tempRet0 = 0;
  394. var setTempRet0 = function(value) {
  395. tempRet0 = value;
  396. };
  397. var getTempRet0 = function() {
  398. return tempRet0;
  399. };
  400. var GLOBAL_BASE = 8;
  401. function getValue(ptr, type, noSafe) {
  402. type = type || "i8";
  403. if (type.charAt(type.length - 1) === "*") type = "i32";
  404. switch (type) {
  405. case "i1":
  406. return HEAP8[ptr >> 0];
  407. case "i8":
  408. return HEAP8[ptr >> 0];
  409. case "i16":
  410. return HEAP16[ptr >> 1];
  411. case "i32":
  412. return HEAP32[ptr >> 2];
  413. case "i64":
  414. return HEAP32[ptr >> 2];
  415. case "float":
  416. return HEAPF32[ptr >> 2];
  417. case "double":
  418. return HEAPF64[ptr >> 3];
  419. default:
  420. abort("invalid type for getValue: " + type);
  421. }
  422. return null;
  423. }
  424. var ABORT = false;
  425. var EXITSTATUS = 0;
  426. function assert(condition, text) {
  427. if (!condition) {
  428. abort("Assertion failed: " + text);
  429. }
  430. }
  431. function getCFunc(ident) {
  432. var func = Module["_" + ident];
  433. assert(func, "Cannot call unknown function " + ident + ", make sure it is exported");
  434. return func;
  435. }
  436. function ccall(ident, returnType, argTypes, args, opts) {
  437. var toC = {
  438. "string": function(str) {
  439. var ret = 0;
  440. if (str !== null && str !== undefined && str !== 0) {
  441. var len = (str.length << 2) + 1;
  442. ret = stackAlloc(len);
  443. stringToUTF8(str, ret, len);
  444. }
  445. return ret;
  446. },
  447. "array": function(arr) {
  448. var ret = stackAlloc(arr.length);
  449. writeArrayToMemory(arr, ret);
  450. return ret;
  451. }
  452. };
  453. function convertReturnValue(ret) {
  454. if (returnType === "string") return UTF8ToString(ret);
  455. if (returnType === "boolean") return Boolean(ret);
  456. return ret;
  457. }
  458. var func = getCFunc(ident);
  459. var cArgs = [];
  460. var stack = 0;
  461. if (args) {
  462. for (var i = 0; i < args.length; i++) {
  463. var converter = toC[argTypes[i]];
  464. if (converter) {
  465. if (stack === 0) stack = stackSave();
  466. cArgs[i] = converter(args[i]);
  467. } else {
  468. cArgs[i] = args[i];
  469. }
  470. }
  471. }
  472. var ret = func.apply(null, cArgs);
  473. ret = convertReturnValue(ret);
  474. if (stack !== 0) stackRestore(stack);
  475. return ret;
  476. }
  477. function setValue(ptr, value, type, noSafe) {
  478. type = type || "i8";
  479. if (type.charAt(type.length - 1) === "*") type = "i32";
  480. switch (type) {
  481. case "i1":
  482. HEAP8[ptr >> 0] = value;
  483. break;
  484. case "i8":
  485. HEAP8[ptr >> 0] = value;
  486. break;
  487. case "i16":
  488. HEAP16[ptr >> 1] = value;
  489. break;
  490. case "i32":
  491. HEAP32[ptr >> 2] = value;
  492. break;
  493. case "i64":
  494. tempI64 = [ value >>> 0, (tempDouble = value, +Math_abs(tempDouble) >= +1 ? tempDouble > +0 ? (Math_min(+Math_floor(tempDouble / +4294967296), +4294967295) | 0) >>> 0 : ~~+Math_ceil((tempDouble - +(~~tempDouble >>> 0)) / +4294967296) >>> 0 : 0) ],
  495. HEAP32[ptr >> 2] = tempI64[0], HEAP32[ptr + 4 >> 2] = tempI64[1];
  496. break;
  497. case "float":
  498. HEAPF32[ptr >> 2] = value;
  499. break;
  500. case "double":
  501. HEAPF64[ptr >> 3] = value;
  502. break;
  503. default:
  504. abort("invalid type for setValue: " + type);
  505. }
  506. }
  507. var ALLOC_NORMAL = 0;
  508. var ALLOC_NONE = 3;
  509. function allocate(slab, types, allocator, ptr) {
  510. var zeroinit, size;
  511. if (typeof slab === "number") {
  512. zeroinit = true;
  513. size = slab;
  514. } else {
  515. zeroinit = false;
  516. size = slab.length;
  517. }
  518. var singleType = typeof types === "string" ? types : null;
  519. var ret;
  520. if (allocator == ALLOC_NONE) {
  521. ret = ptr;
  522. } else {
  523. ret = [ _malloc, stackAlloc, dynamicAlloc ][allocator](Math.max(size, singleType ? 1 : types.length));
  524. }
  525. if (zeroinit) {
  526. var stop;
  527. ptr = ret;
  528. assert((ret & 3) == 0);
  529. stop = ret + (size & ~3);
  530. for (;ptr < stop; ptr += 4) {
  531. HEAP32[ptr >> 2] = 0;
  532. }
  533. stop = ret + size;
  534. while (ptr < stop) {
  535. HEAP8[ptr++ >> 0] = 0;
  536. }
  537. return ret;
  538. }
  539. if (singleType === "i8") {
  540. if (slab.subarray || slab.slice) {
  541. HEAPU8.set(slab, ret);
  542. } else {
  543. HEAPU8.set(new Uint8Array(slab), ret);
  544. }
  545. return ret;
  546. }
  547. var i = 0, type, typeSize, previousType;
  548. while (i < size) {
  549. var curr = slab[i];
  550. type = singleType || types[i];
  551. if (type === 0) {
  552. i++;
  553. continue;
  554. }
  555. if (type == "i64") type = "i32";
  556. setValue(ret + i, curr, type);
  557. if (previousType !== type) {
  558. typeSize = getNativeTypeSize(type);
  559. previousType = type;
  560. }
  561. i += typeSize;
  562. }
  563. return ret;
  564. }
  565. function getMemory(size) {
  566. if (!runtimeInitialized) return dynamicAlloc(size);
  567. return _malloc(size);
  568. }
  569. var UTF8Decoder = typeof TextDecoder !== "undefined" ? new TextDecoder("utf8") : undefined;
  570. function UTF8ArrayToString(u8Array, idx, maxBytesToRead) {
  571. var endIdx = idx + maxBytesToRead;
  572. var endPtr = idx;
  573. while (u8Array[endPtr] && !(endPtr >= endIdx)) ++endPtr;
  574. if (endPtr - idx > 16 && u8Array.subarray && UTF8Decoder) {
  575. return UTF8Decoder.decode(u8Array.subarray(idx, endPtr));
  576. } else {
  577. var str = "";
  578. while (idx < endPtr) {
  579. var u0 = u8Array[idx++];
  580. if (!(u0 & 128)) {
  581. str += String.fromCharCode(u0);
  582. continue;
  583. }
  584. var u1 = u8Array[idx++] & 63;
  585. if ((u0 & 224) == 192) {
  586. str += String.fromCharCode((u0 & 31) << 6 | u1);
  587. continue;
  588. }
  589. var u2 = u8Array[idx++] & 63;
  590. if ((u0 & 240) == 224) {
  591. u0 = (u0 & 15) << 12 | u1 << 6 | u2;
  592. } else {
  593. u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | u8Array[idx++] & 63;
  594. }
  595. if (u0 < 65536) {
  596. str += String.fromCharCode(u0);
  597. } else {
  598. var ch = u0 - 65536;
  599. str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023);
  600. }
  601. }
  602. }
  603. return str;
  604. }
  605. function UTF8ToString(ptr, maxBytesToRead) {
  606. return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : "";
  607. }
  608. function stringToUTF8Array(str, outU8Array, outIdx, maxBytesToWrite) {
  609. if (!(maxBytesToWrite > 0)) return 0;
  610. var startIdx = outIdx;
  611. var endIdx = outIdx + maxBytesToWrite - 1;
  612. for (var i = 0; i < str.length; ++i) {
  613. var u = str.charCodeAt(i);
  614. if (u >= 55296 && u <= 57343) {
  615. var u1 = str.charCodeAt(++i);
  616. u = 65536 + ((u & 1023) << 10) | u1 & 1023;
  617. }
  618. if (u <= 127) {
  619. if (outIdx >= endIdx) break;
  620. outU8Array[outIdx++] = u;
  621. } else if (u <= 2047) {
  622. if (outIdx + 1 >= endIdx) break;
  623. outU8Array[outIdx++] = 192 | u >> 6;
  624. outU8Array[outIdx++] = 128 | u & 63;
  625. } else if (u <= 65535) {
  626. if (outIdx + 2 >= endIdx) break;
  627. outU8Array[outIdx++] = 224 | u >> 12;
  628. outU8Array[outIdx++] = 128 | u >> 6 & 63;
  629. outU8Array[outIdx++] = 128 | u & 63;
  630. } else {
  631. if (outIdx + 3 >= endIdx) break;
  632. outU8Array[outIdx++] = 240 | u >> 18;
  633. outU8Array[outIdx++] = 128 | u >> 12 & 63;
  634. outU8Array[outIdx++] = 128 | u >> 6 & 63;
  635. outU8Array[outIdx++] = 128 | u & 63;
  636. }
  637. }
  638. outU8Array[outIdx] = 0;
  639. return outIdx - startIdx;
  640. }
  641. function stringToUTF8(str, outPtr, maxBytesToWrite) {
  642. return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite);
  643. }
  644. function lengthBytesUTF8(str) {
  645. var len = 0;
  646. for (var i = 0; i < str.length; ++i) {
  647. var u = str.charCodeAt(i);
  648. if (u >= 55296 && u <= 57343) u = 65536 + ((u & 1023) << 10) | str.charCodeAt(++i) & 1023;
  649. if (u <= 127) ++len; else if (u <= 2047) len += 2; else if (u <= 65535) len += 3; else len += 4;
  650. }
  651. return len;
  652. }
  653. var UTF16Decoder = typeof TextDecoder !== "undefined" ? new TextDecoder("utf-16le") : undefined;
  654. function allocateUTF8OnStack(str) {
  655. var size = lengthBytesUTF8(str) + 1;
  656. var ret = stackAlloc(size);
  657. stringToUTF8Array(str, HEAP8, ret, size);
  658. return ret;
  659. }
  660. function writeArrayToMemory(array, buffer) {
  661. HEAP8.set(array, buffer);
  662. }
  663. function writeAsciiToMemory(str, buffer, dontAddNull) {
  664. for (var i = 0; i < str.length; ++i) {
  665. HEAP8[buffer++ >> 0] = str.charCodeAt(i);
  666. }
  667. if (!dontAddNull) HEAP8[buffer >> 0] = 0;
  668. }
  669. function demangle(func) {
  670. return func;
  671. }
  672. function demangleAll(text) {
  673. var regex = /__Z[\w\d_]+/g;
  674. return text.replace(regex, function(x) {
  675. var y = demangle(x);
  676. return x === y ? x : y + " [" + x + "]";
  677. });
  678. }
  679. function jsStackTrace() {
  680. var err = new Error();
  681. if (!err.stack) {
  682. try {
  683. throw new Error(0);
  684. } catch (e) {
  685. err = e;
  686. }
  687. if (!err.stack) {
  688. return "(no stack trace available)";
  689. }
  690. }
  691. return err.stack.toString();
  692. }
  693. function stackTrace() {
  694. var js = jsStackTrace();
  695. if (Module["extraStackTrace"]) js += "\n" + Module["extraStackTrace"]();
  696. return demangleAll(js);
  697. }
  698. var buffer, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64;
  699. function updateGlobalBufferViews() {
  700. Module["HEAP8"] = HEAP8 = new Int8Array(buffer);
  701. Module["HEAP16"] = HEAP16 = new Int16Array(buffer);
  702. Module["HEAP32"] = HEAP32 = new Int32Array(buffer);
  703. Module["HEAPU8"] = HEAPU8 = new Uint8Array(buffer);
  704. Module["HEAPU16"] = HEAPU16 = new Uint16Array(buffer);
  705. Module["HEAPU32"] = HEAPU32 = new Uint32Array(buffer);
  706. Module["HEAPF32"] = HEAPF32 = new Float32Array(buffer);
  707. Module["HEAPF64"] = HEAPF64 = new Float64Array(buffer);
  708. }
  709. var STACK_BASE = 3042736, DYNAMIC_BASE = 8285616, DYNAMICTOP_PTR = 3042480;
  710. var TOTAL_STACK = 5242880;
  711. var TOTAL_MEMORY = Module["TOTAL_MEMORY"] || 134217728;
  712. if (TOTAL_MEMORY < TOTAL_STACK) err("TOTAL_MEMORY should be larger than TOTAL_STACK, was " + TOTAL_MEMORY + "! (TOTAL_STACK=" + TOTAL_STACK + ")");
  713. if (Module["buffer"]) {
  714. buffer = Module["buffer"];
  715. } else {
  716. {
  717. buffer = new ArrayBuffer(TOTAL_MEMORY);
  718. }
  719. Module["buffer"] = buffer;
  720. }
  721. updateGlobalBufferViews();
  722. HEAP32[DYNAMICTOP_PTR >> 2] = DYNAMIC_BASE;
  723. function callRuntimeCallbacks(callbacks) {
  724. while (callbacks.length > 0) {
  725. var callback = callbacks.shift();
  726. if (typeof callback == "function") {
  727. callback();
  728. continue;
  729. }
  730. var func = callback.func;
  731. if (typeof func === "number") {
  732. if (callback.arg === undefined) {
  733. Module["dynCall_v"](func);
  734. } else {
  735. Module["dynCall_vi"](func, callback.arg);
  736. }
  737. } else {
  738. func(callback.arg === undefined ? null : callback.arg);
  739. }
  740. }
  741. }
  742. var __ATPRERUN__ = [];
  743. var __ATINIT__ = [];
  744. var __ATMAIN__ = [];
  745. var __ATEXIT__ = [];
  746. var __ATPOSTRUN__ = [];
  747. var runtimeInitialized = false;
  748. var runtimeExited = false;
  749. function preRun() {
  750. if (Module["preRun"]) {
  751. if (typeof Module["preRun"] == "function") Module["preRun"] = [ Module["preRun"] ];
  752. while (Module["preRun"].length) {
  753. addOnPreRun(Module["preRun"].shift());
  754. }
  755. }
  756. callRuntimeCallbacks(__ATPRERUN__);
  757. }
  758. function ensureInitRuntime() {
  759. if (runtimeInitialized) return;
  760. runtimeInitialized = true;
  761. callRuntimeCallbacks(__ATINIT__);
  762. }
  763. function preMain() {
  764. callRuntimeCallbacks(__ATMAIN__);
  765. }
  766. function exitRuntime() {
  767. callRuntimeCallbacks(__ATEXIT__);
  768. runtimeExited = true;
  769. }
  770. function postRun() {
  771. if (Module["postRun"]) {
  772. if (typeof Module["postRun"] == "function") Module["postRun"] = [ Module["postRun"] ];
  773. while (Module["postRun"].length) {
  774. addOnPostRun(Module["postRun"].shift());
  775. }
  776. }
  777. callRuntimeCallbacks(__ATPOSTRUN__);
  778. }
  779. function addOnPreRun(cb) {
  780. __ATPRERUN__.unshift(cb);
  781. }
  782. function addOnPostRun(cb) {
  783. __ATPOSTRUN__.unshift(cb);
  784. }
  785. var Math_abs = Math.abs;
  786. var Math_ceil = Math.ceil;
  787. var Math_floor = Math.floor;
  788. var Math_min = Math.min;
  789. var runDependencies = 0;
  790. var runDependencyWatcher = null;
  791. var dependenciesFulfilled = null;
  792. function getUniqueRunDependency(id) {
  793. return id;
  794. }
  795. function addRunDependency(id) {
  796. runDependencies++;
  797. if (Module["monitorRunDependencies"]) {
  798. Module["monitorRunDependencies"](runDependencies);
  799. }
  800. }
  801. function removeRunDependency(id) {
  802. runDependencies--;
  803. if (Module["monitorRunDependencies"]) {
  804. Module["monitorRunDependencies"](runDependencies);
  805. }
  806. if (runDependencies == 0) {
  807. if (runDependencyWatcher !== null) {
  808. clearInterval(runDependencyWatcher);
  809. runDependencyWatcher = null;
  810. }
  811. if (dependenciesFulfilled) {
  812. var callback = dependenciesFulfilled;
  813. dependenciesFulfilled = null;
  814. callback();
  815. }
  816. }
  817. }
  818. Module["preloadedImages"] = {};
  819. Module["preloadedAudios"] = {};
  820. var memoryInitializer = null;
  821. var dataURIPrefix = "data:application/octet-stream;base64,";
  822. function isDataURI(filename) {
  823. return String.prototype.startsWith ? filename.startsWith(dataURIPrefix) : filename.indexOf(dataURIPrefix) === 0;
  824. }
  825. var ASM_CONSTS = [ function() {
  826. if (typeof _cartdat !== "undefined") return 1;
  827. return 0;
  828. }, function() {
  829. return _cartdat.length / 32768;
  830. }, function() {
  831. _cdpos = _cdpos + 1;
  832. return _cartdat[_cdpos - 1];
  833. }, function($0) {
  834. ciii = $0;
  835. iii = 0;
  836. }, function() {
  837. iii = iii + 1;
  838. return _cartname[ciii].charCodeAt(iii - 1);
  839. }, function() {
  840. Module.pico8Reset = function() {
  841. codo_command = 1;
  842. };
  843. Module.pico8ToggleSound = function() {
  844. codo_command = 3;
  845. };
  846. Module.pico8TogglePaused = function() {
  847. codo_command = 4;
  848. };
  849. Module.pico8SetPaused = function(p) {
  850. codo_command = 5;
  851. codo_command_p = 0;
  852. if (p) codo_command_p = 1;
  853. };
  854. Module.pico8ToggleControlMenu = function() {
  855. codo_command = 7;
  856. };
  857. Module.pico8DragOver = function() {
  858. codo_command = 10;
  859. };
  860. Module.pico8DragStop = function() {
  861. codo_command = 11;
  862. };
  863. }, function() {
  864. function mkdir_0(d) {
  865. try {
  866. stat = FS.stat(d);
  867. console.log("found directory: " + d);
  868. } catch (e) {
  869. FS.mkdir(d);
  870. console.log("created directory: " + d);
  871. }
  872. }
  873. console.log("mounting /user_data");
  874. mkdir_0("/user_data");
  875. FS.mount(IDBFS, {}, "/user_data");
  876. FS.syncfs(true, function(err) {
  877. if (!err) {
  878. console.log("codo: mounted filesystem.\n");
  879. codo_mounted_filesystem = 1;
  880. mkdir_0("/user_data/cdata");
  881. mkdir_0("/user_data/cstore");
  882. mkdir_0("/user_data/carts");
  883. mkdir_0("/user_data/backup");
  884. mkdir_0("/user_data/plates");
  885. mkdir_0("/user_data/bbs");
  886. mkdir_0("/user_data/bbs/carts");
  887. mkdir_0("/user_data/bbs/labels");
  888. } else {
  889. console.log("** could not mount filesystem\n");
  890. console.log(err);
  891. }
  892. });
  893. }, function() {
  894. var val = 0;
  895. if (window.location.pathname.indexOf("widget.php") >= 0) val = 1;
  896. return val;
  897. }, function() {
  898. var val = 0;
  899. if (window.location.pathname.indexOf("pico-8.php") >= 0) val = 1;
  900. return val;
  901. }, function($0, $1, $2, $3, $4, $5) {
  902. if (typeof pico8_state !== "undefined") {
  903. pico8_state.is_paused = $0;
  904. pico8_state.sound_volume = $1;
  905. pico8_state.frame_number = $2;
  906. pico8_state.has_focus = $3;
  907. pico8_state.show_dpad = $4;
  908. pico8_state.request_pointer_lock = $5;
  909. }
  910. }, function() {
  911. var val = 0;
  912. if (typeof codo_command !== "undefined") {
  913. val = codo_command;
  914. codo_command = 0;
  915. }
  916. return val;
  917. }, function() {
  918. var val = 0;
  919. if (typeof codo_command_p !== "undefined") {
  920. val = codo_command_p;
  921. codo_command_p = 0;
  922. }
  923. return val;
  924. }, function() {
  925. button_i = 0;
  926. }, function() {
  927. var val = -1;
  928. if (typeof pico8_buttons !== "undefined") {
  929. val = pico8_buttons[button_i];
  930. button_i++;
  931. }
  932. return val;
  933. }, function() {
  934. var val = 0;
  935. if (typeof pico8_gamepads !== "undefined") {
  936. val = pico8_gamepads.count;
  937. }
  938. return val;
  939. }, function() {
  940. if (typeof on_module_load !== "undefined") {
  941. if (on_module_load) on_module_load();
  942. }
  943. }, function($0, $1, $2, $3, $4, $5) {
  944. if (typeof p8img !== "undefined") {
  945. p8img.src = "";
  946. }
  947. p8img = document.createElement("img");
  948. p8img.src = UTF8ToString($0, $1);
  949. p8img.style = "width:128px; height:128px; image-rendering: pixelated; -ms-interpolation-mode: nearest-neighbor;";
  950. if (typeof p8imgholder === "undefined" || !p8imgholder) {
  951. p8imgholder = document.createElement("div");
  952. p8imgholder.style.cssText = "min-width:160px; display:table; position:fixed; top:20px; left:20px; padding:12px; background-color:#000; box-shadow: 2px 2px 8px rgba(16, 0, 48, 0.4);";
  953. document.body.appendChild(p8imgholder);
  954. }
  955. if (p8imgholder) {
  956. while (p8imgholder.childElementCount > 0) p8imgholder.removeChild(p8imgholder.firstChild);
  957. var dismiss = document.createElement("div");
  958. dismiss.style.cssText = "display:table; font-size:10pt; color:#fff; padding:4px; cursor:pointer; margin-left:10px; float:right";
  959. dismiss.addEventListener("click", function() {
  960. p8img.src = "";
  961. while (p8imgholder.childElementCount > 0) p8imgholder.removeChild(p8imgholder.firstChild);
  962. p8imgholder.style.display = "none";
  963. }, false);
  964. dismiss.innerHTML = "X";
  965. p8imgholder.appendChild(dismiss);
  966. p8imgholder.appendChild(p8img);
  967. var info = document.createElement("div");
  968. info.innerHTML = '<br> <font style="color:#bbb; font-size:8pt"><center> (right-click to save) </center></font>';
  969. p8imgholder.appendChild(info);
  970. if (p8imgholder.style.display == "none") p8imgholder.style.display = "";
  971. }
  972. }, function() {
  973. jsString = p8_dropped_cart;
  974. if (!jsString) return 0;
  975. var lengthBytes = lengthBytesUTF8(jsString) + 1;
  976. var stringOnWasmHeap = _malloc(lengthBytes);
  977. stringToUTF8(jsString, stringOnWasmHeap, lengthBytes);
  978. return stringOnWasmHeap;
  979. }, function() {
  980. jsString = p8_dropped_cart_name;
  981. if (!jsString) return 0;
  982. var lengthBytes = lengthBytesUTF8(jsString) + 1;
  983. var stringOnWasmHeap2 = _malloc(lengthBytes);
  984. stringToUTF8(jsString, stringOnWasmHeap2, lengthBytes);
  985. return stringOnWasmHeap2;
  986. }, function($0, $1) {
  987. if (typeof pico8_state !== "undefined") {
  988. if (typeof pico8_state.system_messages === "undefined") pico8_state.system_messages = new Array();
  989. pico8_state.system_messages.push(UTF8ToString($0, $1));
  990. }
  991. }, function($0) {
  992. var str = window.location.hostname;
  993. return allocate(intArrayFromString(str), "i8", ALLOC_NORMAL);
  994. }, function($0, $1) {
  995. if (typeof pico8_gpio !== "undefined") pico8_gpio[$0] = $1;
  996. }, function($0) {
  997. var val = 0;
  998. if (typeof pico8_gpio !== "undefined") val = pico8_gpio[$0];
  999. return val;
  1000. }, function() {
  1001. FS.syncfs(false, function(err) {});
  1002. }, function() {
  1003. var val = 0;
  1004. if (typeof codo_mounted_filesystem !== "undefined") val = 1;
  1005. return val;
  1006. }, function() {
  1007. return typeof p8_touch_detected === "undefined" || !p8_touch_detected ? 0 : 1;
  1008. }, function() {
  1009. return document.hidden ? 1 : 0;
  1010. }, function() {
  1011. if (typeof codo_key_buffer === "undefined") codo_key_buffer = [];
  1012. document.addEventListener("keydown", function(e) {
  1013. var val = -1;
  1014. if (e.key.length == 1) {
  1015. val = e.key.charCodeAt(0);
  1016. } else {
  1017. if (e.key == "Tab") val = 9;
  1018. if (e.key == "Enter") val = 13;
  1019. if (e.key == "Backspace") val = 8;
  1020. if (e.key == "Escape") val = 27;
  1021. if (val == -1) {}
  1022. }
  1023. var el = document.getElementById("codo_textarea");
  1024. codo_key_buffer.push(val);
  1025. });
  1026. }, function() {
  1027. }, function() {
  1028. document.addEventListener("wheel", function(e) {
  1029. dx = e.deltaX;
  1030. if (dx < 0) dx = -1;
  1031. if (dx > 0) dx = 1;
  1032. if (e.deltaMode == 2) dx *= 4;
  1033. if (typeof codo_wheel_dx !== "undefined") codo_wheel_dx -= dx;
  1034. dy = e.deltaY;
  1035. if (dy < 0) dy = -1;
  1036. if (dy > 0) dy = 1;
  1037. if (e.deltaMode == 2) dy *= 4;
  1038. if (typeof codo_wheel_dy !== "undefined") codo_wheel_dy -= dy;
  1039. });
  1040. }, function($0) {
  1041. function audio_log(msg) {
  1042. if (window.console && window.console.log) {
  1043. window.console.log("[codo] audio_init_webaudio " + msg);
  1044. }
  1045. }
  1046. audio_log("audio_init");
  1047. var codo_audio_context;
  1048. if (typeof Module === "undefined") audio_log(" *** Module undefined"); else if (typeof Module.ccall === "undefined") audio_log(" **** Module.ccall undefined"); else {
  1049. var webAudioAPI = window.AudioContext || window.webkitAudioContext || window.mozAudioContext || window.oAudioContext || window.msAudioContext;
  1050. if (webAudioAPI) {
  1051. if (typeof pico8_audio_context !== "undefined") {
  1052. codo_audio_context = pico8_audio_context;
  1053. audio_log("found pico8_audio_context");
  1054. } else if (typeof voxatron_audio_context !== "undefined") {
  1055. codo_audio_context = voxatron_audio_context;
  1056. audio_log("found voxatron_audio_context");
  1057. } else {
  1058. codo_audio_context = new webAudioAPI();
  1059. audio_log("creating own audio context");
  1060. }
  1061. if (codo_audio_context) {
  1062. audio_log("Sample Rate: " + codo_audio_context.sampleRate);
  1063. audio_log("Buffer Size: " + $0);
  1064. node = codo_audio_context.createScriptProcessor($0, 1, 1);
  1065. node.onaudioprocess = function(e) {
  1066. var data = e.outputBuffer.getChannelData(0);
  1067. var r = 22050 / codo_audio_context.sampleRate;
  1068. var len0 = Math.floor(data.length * r);
  1069. var len1 = data.length;
  1070. var ptr = Module.ccall("mix_0", "number", [ "number", "number" ], [ len0, len1 ]);
  1071. for (var j = 0; j < data.length; j++) data[j] = Module.getValue(ptr + j * 2, "i16") / 32768;
  1072. };
  1073. node.connect(codo_audio_context.destination);
  1074. } else {
  1075. audio_log("** failed to create codo_audio_context");
  1076. }
  1077. } else {
  1078. audio_log("** webAudioAPI not found");
  1079. }
  1080. }
  1081. }, function() {
  1082. return document.pointerLockElement ? 1 : 0;
  1083. }, function() {
  1084. var ret = 0;
  1085. if (typeof pico8_mouse !== "undefined" && pico8_mouse.length > 0) ret = 1;
  1086. return ret;
  1087. }, function() {
  1088. return pico8_mouse[0];
  1089. }, function() {
  1090. return pico8_mouse[1];
  1091. }, function() {
  1092. if (typeof codo_key_buffer === "undefined") codo_key_buffer = [];
  1093. return codo_key_buffer.length > 0 ? 1 : 0;
  1094. }, function() {
  1095. if (typeof codo_key_buffer === "undefined") codo_key_buffer = [];
  1096. let val = codo_key_buffer.shift() | 0;
  1097. return val;
  1098. }, function() {
  1099. temp = typeof codo_wheel_dx !== "undefined" ? codo_wheel_dx : 0;
  1100. codo_wheel_dx = 0;
  1101. return temp;
  1102. }, function() {
  1103. temp = typeof codo_wheel_dy !== "undefined" ? codo_wheel_dy : 0;
  1104. codo_wheel_dy = 0;
  1105. return temp;
  1106. }, function() {
  1107. if (document.hidden) return 0;
  1108. el = typeof codo_textarea === "undefined" ? document.getElementById("codo_textarea") : codo_textarea;
  1109. if (el) {
  1110. if (el == document.activeElement) return 1;
  1111. }
  1112. el = document.activeElement;
  1113. return !el || el.tagName.toLowerCase() != "input" && el.tagName.toLowerCase() != "textarea";
  1114. }, function() {
  1115. el = typeof codo_textarea === "undefined" ? document.getElementById("codo_textarea") : codo_textarea;
  1116. if (el && el.style.display != "none") {
  1117. el.focus();
  1118. el.select();
  1119. }
  1120. }, function() {
  1121. el = typeof codo_textarea === "undefined" ? document.getElementById("codo_textarea") : codo_textarea;
  1122. if (el && el.style.display != "none") {
  1123. el.select();
  1124. }
  1125. }, function() {
  1126. return pico8_mouse[2];
  1127. }, function() {
  1128. _dir_name = "";
  1129. }, function($0) {
  1130. _dir_name = _dir_name + String.fromCharCode($0);
  1131. }, function() {
  1132. console.log("@@ mkdir directory (nocheck): " + _dir_name);
  1133. FS.createPath("", _dir_name, true, true);
  1134. }, function() {
  1135. Module["canvas"].exitPointerLock();
  1136. }, function() {
  1137. el = typeof codo_textarea === "undefined" ? document.getElementById("codo_textarea") : codo_textarea;
  1138. if (el) {}
  1139. }, function() {
  1140. _codo_str_out = "";
  1141. }, function($0) {
  1142. _codo_str_out = _codo_str_out + String.fromCharCode($0);
  1143. }, function() {
  1144. el = typeof codo_textarea === "undefined" ? document.getElementById("codo_textarea") : codo_textarea;
  1145. if (el) {
  1146. el.value = _codo_str_out;
  1147. return 0;
  1148. } else return 1;
  1149. }, function() {
  1150. el = typeof codo_textarea === "undefined" ? document.getElementById("codo_textarea") : codo_textarea;
  1151. if (el && el.style.display == "none" && (typeof p8_touch_detected === "undefined" || !p8_touch_detected)) {
  1152. console.log("@@ enabling codo_textfield");
  1153. el.style.display = "";
  1154. el.focus();
  1155. el.select();
  1156. }
  1157. }, function() {
  1158. el = typeof codo_textarea === "undefined" ? document.getElementById("codo_textarea") : codo_textarea;
  1159. if (el && el.style.display != "none" && el.value != "") {
  1160. _codo_text_value = el.value;
  1161. return 1;
  1162. }
  1163. return 0;
  1164. }, function() {
  1165. return typeof _codo_text_value === "undefined" ? 1 : 0;
  1166. }, function() {
  1167. iii = 0;
  1168. }, function() {
  1169. iii = iii + 1;
  1170. return _codo_text_value.charCodeAt(iii - 1);
  1171. } ];
  1172. function _emscripten_asm_const_i(code) {
  1173. return ASM_CONSTS[code]();
  1174. }
  1175. function _emscripten_asm_const_ii(code, a0) {
  1176. return ASM_CONSTS[code](a0);
  1177. }
  1178. function _emscripten_asm_const_iiiiiii(code, a0, a1, a2, a3, a4, a5) {
  1179. return ASM_CONSTS[code](a0, a1, a2, a3, a4, a5);
  1180. }
  1181. function _emscripten_asm_const_iii(code, a0, a1) {
  1182. return ASM_CONSTS[code](a0, a1);
  1183. }
  1184. __ATINIT__.push({
  1185. func: function() {
  1186. ___emscripten_environ_constructor();
  1187. }
  1188. });
  1189. memoryInitializer = "data:application/octet-stream;base64,AAAAAAAAAACFsQAAxd0AAI6xAACWsQAAn7EAAKaxAACtsQAAZ90AAJaxAACzsQAAurEAAMCxAAAAAAAAAAAAAAAACAgICAgAAAAAAAAAAAAAAAAAAAAAAAAMBAQEBAQEBAQEBAQEBAQEFhYWFhYWFhYWFgQEBAQEBAQVFRUVFRUFBQUFBQUFBQUFBQUFBQUFBQUFBQQEBAQFBBUVFRUVFQUFBQUFBQUFBQUFBQUFBQUFBQUFBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGBxQVRQUFxsPBA8VGx8fHx8fHx8fHx8fHx8fGB8YGBgYGBgaCK8vLyE5FRUEGJiBGIUUVAXAAAAAAAAAAAAAAAAAQICAwMDAwQEBAQEBAQEBQUFBQUFBQUFBQUFBQUFBQYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlt0AAL/dAACd3QAAgN0AAIXdAABw3QAAs94AAHTdAABn3QAAut0AAHjdAADJ3QAAoN0AAMXdAACS3QAAmt0AAK3dAACm3QAAe90AAK7eAAC03QAAjN0AAHr6AAAjtAAA67UAAO61AADxtQAA9LUAAPe1AACHvgAA+rUAAAO2AAAKtgAAAAAAAAAAAAAAAAAAEBAQEBERERERERQTCAgGBgcHCQkJCQkJCQkJCQUFEREoKCgoKCgPDgMDAwMDAwMDAwMDAwICAQEAAAAAAAAAALa6AAC+ugAAyboAAM66AADVugAA27oAAOC6AADmugAA7LoAAPK6AAD4ugAA/roAAAS7AAAKuwAAD7sAABW7AAAbuwAAIbsAACi7AAAvuwAANrsAADy7AABDuwAASrsAAFK7AABauwAAYLsAAGW7AABquwAAc7sAAAAAAAAAAAAAqt8AAJPfAADA5gAAxOYAAK/fAAC83wAAl98AAMvmAACN3wAAit8AAKDfAACl3wAA1uYAAOTmAADK3wAAz98AAPLmAAD85gAA1t8AAJrfAABf6AAADr0AAM/mAAC23wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBPv///z80NTY3ODk6Ozw9/////v///wABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZ////////GhscHR4fICEiIyQlJicoKSorLC0uLzAxMjO53gAAvt4AAMPeAADI3gAAzd4AANLeAADX3gAA3N4AAOHeAAAAAAAAAAAAAAAAAAAQAQIDBAUGBwgJCgsMDQ4PAAECAwQFBgcICQoLDA0ODwAAgIAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEhISEhISEhAAAAAAAAAAAAAAAAAAAAAAAA/wAAARITJBXWZ0hJmjvcXY7vAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAABAAAABQAAAAEAAAAFAAAABQAAAAUAAAABAAAAAQAAAAEAAAAFAAAAAAAAAAEAAAADAAAABQAAAAQAAAACAAAACwAAAA8AAAAHAAAADAAAAA0AAAAJAAAACAAAAAYAAAAKAAAADgAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBCAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoQ7wAAHO8AACjvAAA07wAAQO8AAEvvAABW7wAAYu8AAG7vAAB67wAAhu8AAJHvAACc7wAAAAAAAAAAAAAAAAAA0e4AANbuAADc7gAA3+4AAOTuAADu7gAA+O4AAPruAAD87gAA/u4AAADvAAAE7wAABu8AAAAAAAAAAAAAAAAAABfzAAAg8wAAJ/MAADPzAAA98wAARfMAAFDzAABa8wAAZPMAAG3zAAB18wAAf/MAAAAAAAAAAAAAAAAAAAAAAACYbC4AiPMAAI7zAACU8wAAmvMAAKDzAACm8wAArPMAAAAAAAAAAAAAAAAAAAAAAACYbC4AsvMAAMHzAADS8wAA4/MAAPLzAAAE9AAAGvQAAJhsLgAp9AAAMfQAADv0AABF9AAAVvQAAGH0AABw9AAAY29kbwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAQKCgAAAAofCh8KHxQfBR8RAgQIEQgUHRINBAQAAAAECAgIBAQCAgIEFQ4fDhUEBB8EBAAAAAgQAAAfAAAAAAAABAECBAgQHxERER8EDAQEHx8BHxAfHwEHAR8RER8BAR8QHwEfEBAfER8fAQEBAR8RHxEfHxEfAQEABAAEAAAEAAQIAwwQDAMADgAOABgGAQYYH
  1190. var tempDoublePtr = 3042720;
  1191. function ___setErrNo(value) {
  1192. if (Module["___errno_location"]) HEAP32[Module["___errno_location"]() >> 2] = value;
  1193. return value;
  1194. }
  1195. var PATH = {
  1196. splitPath: function(filename) {
  1197. var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
  1198. return splitPathRe.exec(filename).slice(1);
  1199. },
  1200. normalizeArray: function(parts, allowAboveRoot) {
  1201. var up = 0;
  1202. for (var i = parts.length - 1; i >= 0; i--) {
  1203. var last = parts[i];
  1204. if (last === ".") {
  1205. parts.splice(i, 1);
  1206. } else if (last === "..") {
  1207. parts.splice(i, 1);
  1208. up++;
  1209. } else if (up) {
  1210. parts.splice(i, 1);
  1211. up--;
  1212. }
  1213. }
  1214. if (allowAboveRoot) {
  1215. for (;up; up--) {
  1216. parts.unshift("..");
  1217. }
  1218. }
  1219. return parts;
  1220. },
  1221. normalize: function(path) {
  1222. var isAbsolute = path.charAt(0) === "/", trailingSlash = path.substr(-1) === "/";
  1223. path = PATH.normalizeArray(path.split("/").filter(function(p) {
  1224. return !!p;
  1225. }), !isAbsolute).join("/");
  1226. if (!path && !isAbsolute) {
  1227. path = ".";
  1228. }
  1229. if (path && trailingSlash) {
  1230. path += "/";
  1231. }
  1232. return (isAbsolute ? "/" : "") + path;
  1233. },
  1234. dirname: function(path) {
  1235. var result = PATH.splitPath(path), root = result[0], dir = result[1];
  1236. if (!root && !dir) {
  1237. return ".";
  1238. }
  1239. if (dir) {
  1240. dir = dir.substr(0, dir.length - 1);
  1241. }
  1242. return root + dir;
  1243. },
  1244. basename: function(path) {
  1245. if (path === "/") return "/";
  1246. var lastSlash = path.lastIndexOf("/");
  1247. if (lastSlash === -1) return path;
  1248. return path.substr(lastSlash + 1);
  1249. },
  1250. extname: function(path) {
  1251. return PATH.splitPath(path)[3];
  1252. },
  1253. join: function() {
  1254. var paths = Array.prototype.slice.call(arguments, 0);
  1255. return PATH.normalize(paths.join("/"));
  1256. },
  1257. join2: function(l, r) {
  1258. return PATH.normalize(l + "/" + r);
  1259. },
  1260. resolve: function() {
  1261. var resolvedPath = "", resolvedAbsolute = false;
  1262. for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
  1263. var path = i >= 0 ? arguments[i] : FS.cwd();
  1264. if (typeof path !== "string") {
  1265. throw new TypeError("Arguments to path.resolve must be strings");
  1266. } else if (!path) {
  1267. return "";
  1268. }
  1269. resolvedPath = path + "/" + resolvedPath;
  1270. resolvedAbsolute = path.charAt(0) === "/";
  1271. }
  1272. resolvedPath = PATH.normalizeArray(resolvedPath.split("/").filter(function(p) {
  1273. return !!p;
  1274. }), !resolvedAbsolute).join("/");
  1275. return (resolvedAbsolute ? "/" : "") + resolvedPath || ".";
  1276. },
  1277. relative: function(from, to) {
  1278. from = PATH.resolve(from).substr(1);
  1279. to = PATH.resolve(to).substr(1);
  1280. function trim(arr) {
  1281. var start = 0;
  1282. for (;start < arr.length; start++) {
  1283. if (arr[start] !== "") break;
  1284. }
  1285. var end = arr.length - 1;
  1286. for (;end >= 0; end--) {
  1287. if (arr[end] !== "") break;
  1288. }
  1289. if (start > end) return [];
  1290. return arr.slice(start, end - start + 1);
  1291. }
  1292. var fromParts = trim(from.split("/"));
  1293. var toParts = trim(to.split("/"));
  1294. var length = Math.min(fromParts.length, toParts.length);
  1295. var samePartsLength = length;
  1296. for (var i = 0; i < length; i++) {
  1297. if (fromParts[i] !== toParts[i]) {
  1298. samePartsLength = i;
  1299. break;
  1300. }
  1301. }
  1302. var outputParts = [];
  1303. for (var i = samePartsLength; i < fromParts.length; i++) {
  1304. outputParts.push("..");
  1305. }
  1306. outputParts = outputParts.concat(toParts.slice(samePartsLength));
  1307. return outputParts.join("/");
  1308. }
  1309. };
  1310. var TTY = {
  1311. ttys: [],
  1312. init: function() {},
  1313. shutdown: function() {},
  1314. register: function(dev, ops) {
  1315. TTY.ttys[dev] = {
  1316. input: [],
  1317. output: [],
  1318. ops: ops
  1319. };
  1320. FS.registerDevice(dev, TTY.stream_ops);
  1321. },
  1322. stream_ops: {
  1323. open: function(stream) {
  1324. var tty = TTY.ttys[stream.node.rdev];
  1325. if (!tty) {
  1326. throw new FS.ErrnoError(ERRNO_CODES.ENODEV);
  1327. }
  1328. stream.tty = tty;
  1329. stream.seekable = false;
  1330. },
  1331. close: function(stream) {
  1332. stream.tty.ops.flush(stream.tty);
  1333. },
  1334. flush: function(stream) {
  1335. stream.tty.ops.flush(stream.tty);
  1336. },
  1337. read: function(stream, buffer, offset, length, pos) {
  1338. if (!stream.tty || !stream.tty.ops.get_char) {
  1339. throw new FS.ErrnoError(ERRNO_CODES.ENXIO);
  1340. }
  1341. var bytesRead = 0;
  1342. for (var i = 0; i < length; i++) {
  1343. var result;
  1344. try {
  1345. result = stream.tty.ops.get_char(stream.tty);
  1346. } catch (e) {
  1347. throw new FS.ErrnoError(ERRNO_CODES.EIO);
  1348. }
  1349. if (result === undefined && bytesRead === 0) {
  1350. throw new FS.ErrnoError(ERRNO_CODES.EAGAIN);
  1351. }
  1352. if (result === null || result === undefined) break;
  1353. bytesRead++;
  1354. buffer[offset + i] = result;
  1355. }
  1356. if (bytesRead) {
  1357. stream.node.timestamp = Date.now();
  1358. }
  1359. return bytesRead;
  1360. },
  1361. write: function(stream, buffer, offset, length, pos) {
  1362. if (!stream.tty || !stream.tty.ops.put_char) {
  1363. throw new FS.ErrnoError(ERRNO_CODES.ENXIO);
  1364. }
  1365. try {
  1366. for (var i = 0; i < length; i++) {
  1367. stream.tty.ops.put_char(stream.tty, buffer[offset + i]);
  1368. }
  1369. } catch (e) {
  1370. throw new FS.ErrnoError(ERRNO_CODES.EIO);
  1371. }
  1372. if (length) {
  1373. stream.node.timestamp = Date.now();
  1374. }
  1375. return i;
  1376. }
  1377. },
  1378. default_tty_ops: {
  1379. get_char: function(tty) {
  1380. if (!tty.input.length) {
  1381. var result = null;
  1382. if (ENVIRONMENT_IS_NODE) {
  1383. var BUFSIZE = 256;
  1384. var buf = new Buffer(BUFSIZE);
  1385. var bytesRead = 0;
  1386. var isPosixPlatform = process.platform != "win32";
  1387. var fd = process.stdin.fd;
  1388. if (isPosixPlatform) {
  1389. var usingDevice = false;
  1390. try {
  1391. fd = fs.openSync("/dev/stdin", "r");
  1392. usingDevice = true;
  1393. } catch (e) {}
  1394. }
  1395. try {
  1396. bytesRead = fs.readSync(fd, buf, 0, BUFSIZE, null);
  1397. } catch (e) {
  1398. if (e.toString().indexOf("EOF") != -1) bytesRead = 0; else throw e;
  1399. }
  1400. if (usingDevice) {
  1401. fs.closeSync(fd);
  1402. }
  1403. if (bytesRead > 0) {
  1404. result = buf.slice(0, bytesRead).toString("utf-8");
  1405. } else {
  1406. result = null;
  1407. }
  1408. } else if (typeof window != "undefined" && typeof window.prompt == "function") {
  1409. result = window.prompt("Input: ");
  1410. if (result !== null) {
  1411. result += "\n";
  1412. }
  1413. } else if (typeof readline == "function") {
  1414. result = readline();
  1415. if (result !== null) {
  1416. result += "\n";
  1417. }
  1418. }
  1419. if (!result) {
  1420. return null;
  1421. }
  1422. tty.input = intArrayFromString(result, true);
  1423. }
  1424. return tty.input.shift();
  1425. },
  1426. put_char: function(tty, val) {
  1427. if (val === null || val === 10) {
  1428. out(UTF8ArrayToString(tty.output, 0));
  1429. tty.output = [];
  1430. } else {
  1431. if (val != 0) tty.output.push(val);
  1432. }
  1433. },
  1434. flush: function(tty) {
  1435. if (tty.output && tty.output.length > 0) {
  1436. out(UTF8ArrayToString(tty.output, 0));
  1437. tty.output = [];
  1438. }
  1439. }
  1440. },
  1441. default_tty1_ops: {
  1442. put_char: function(tty, val) {
  1443. if (val === null || val === 10) {
  1444. err(UTF8ArrayToString(tty.output, 0));
  1445. tty.output = [];
  1446. } else {
  1447. if (val != 0) tty.output.push(val);
  1448. }
  1449. },
  1450. flush: function(tty) {
  1451. if (tty.output && tty.output.length > 0) {
  1452. err(UTF8ArrayToString(tty.output, 0));
  1453. tty.output = [];
  1454. }
  1455. }
  1456. }
  1457. };
  1458. var MEMFS = {
  1459. ops_table: null,
  1460. mount: function(mount) {
  1461. return MEMFS.createNode(null, "/", 16384 | 511, 0);
  1462. },
  1463. createNode: function(parent, name, mode, dev) {
  1464. if (FS.isBlkdev(mode) || FS.isFIFO(mode)) {
  1465. throw new FS.ErrnoError(ERRNO_CODES.EPERM);
  1466. }
  1467. if (!MEMFS.ops_table) {
  1468. MEMFS.ops_table = {
  1469. dir: {
  1470. node: {
  1471. getattr: MEMFS.node_ops.getattr,
  1472. setattr: MEMFS.node_ops.setattr,
  1473. lookup: MEMFS.node_ops.lookup,
  1474. mknod: MEMFS.node_ops.mknod,
  1475. rename: MEMFS.node_ops.rename,
  1476. unlink: MEMFS.node_ops.unlink,
  1477. rmdir: MEMFS.node_ops.rmdir,
  1478. readdir: MEMFS.node_ops.readdir,
  1479. symlink: MEMFS.node_ops.symlink
  1480. },
  1481. stream: {
  1482. llseek: MEMFS.stream_ops.llseek
  1483. }
  1484. },
  1485. file: {
  1486. node: {
  1487. getattr: MEMFS.node_ops.getattr,
  1488. setattr: MEMFS.node_ops.setattr
  1489. },
  1490. stream: {
  1491. llseek: MEMFS.stream_ops.llseek,
  1492. read: MEMFS.stream_ops.read,
  1493. write: MEMFS.stream_ops.write,
  1494. allocate: MEMFS.stream_ops.allocate,
  1495. mmap: MEMFS.stream_ops.mmap,
  1496. msync: MEMFS.stream_ops.msync
  1497. }
  1498. },
  1499. link: {
  1500. node: {
  1501. getattr: MEMFS.node_ops.getattr,
  1502. setattr: MEMFS.node_ops.setattr,
  1503. readlink: MEMFS.node_ops.readlink
  1504. },
  1505. stream: {}
  1506. },
  1507. chrdev: {
  1508. node: {
  1509. getattr: MEMFS.node_ops.getattr,
  1510. setattr: MEMFS.node_ops.setattr
  1511. },
  1512. stream: FS.chrdev_stream_ops
  1513. }
  1514. };
  1515. }
  1516. var node = FS.createNode(parent, name, mode, dev);
  1517. if (FS.isDir(node.mode)) {
  1518. node.node_ops = MEMFS.ops_table.dir.node;
  1519. node.stream_ops = MEMFS.ops_table.dir.stream;
  1520. node.contents = {};
  1521. } else if (FS.isFile(node.mode)) {
  1522. node.node_ops = MEMFS.ops_table.file.node;
  1523. node.stream_ops = MEMFS.ops_table.file.stream;
  1524. node.usedBytes = 0;
  1525. node.contents = null;
  1526. } else if (FS.isLink(node.mode)) {
  1527. node.node_ops = MEMFS.ops_table.link.node;
  1528. node.stream_ops = MEMFS.ops_table.link.stream;
  1529. } else if (FS.isChrdev(node.mode)) {
  1530. node.node_ops = MEMFS.ops_table.chrdev.node;
  1531. node.stream_ops = MEMFS.ops_table.chrdev.stream;
  1532. }
  1533. node.timestamp = Date.now();
  1534. if (parent) {
  1535. parent.contents[name] = node;
  1536. }
  1537. return node;
  1538. },
  1539. getFileDataAsRegularArray: function(node) {
  1540. if (node.contents && node.contents.subarray) {
  1541. var arr = [];
  1542. for (var i = 0; i < node.usedBytes; ++i) arr.push(node.contents[i]);
  1543. return arr;
  1544. }
  1545. return node.contents;
  1546. },
  1547. getFileDataAsTypedArray: function(node) {
  1548. if (!node.contents) return new Uint8Array();
  1549. if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes);
  1550. return new Uint8Array(node.contents);
  1551. },
  1552. expandFileStorage: function(node, newCapacity) {
  1553. var prevCapacity = node.contents ? node.contents.length : 0;
  1554. if (prevCapacity >= newCapacity) return;
  1555. var CAPACITY_DOUBLING_MAX = 1024 * 1024;
  1556. newCapacity = Math.max(newCapacity, prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125) | 0);
  1557. if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256);
  1558. var oldContents = node.contents;
  1559. node.contents = new Uint8Array(newCapacity);
  1560. if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0);
  1561. return;
  1562. },
  1563. resizeFileStorage: function(node, newSize) {
  1564. if (node.usedBytes == newSize) return;
  1565. if (newSize == 0) {
  1566. node.contents = null;
  1567. node.usedBytes = 0;
  1568. return;
  1569. }
  1570. if (!node.contents || node.contents.subarray) {
  1571. var oldContents = node.contents;
  1572. node.contents = new Uint8Array(new ArrayBuffer(newSize));
  1573. if (oldContents) {
  1574. node.contents.set(oldContents.subarray(0, Math.min(newSize, node.usedBytes)));
  1575. }
  1576. node.usedBytes = newSize;
  1577. return;
  1578. }
  1579. if (!node.contents) node.contents = [];
  1580. if (node.contents.length > newSize) node.contents.length = newSize; else while (node.contents.length < newSize) node.contents.push(0);
  1581. node.usedBytes = newSize;
  1582. },
  1583. node_ops: {
  1584. getattr: function(node) {
  1585. var attr = {};
  1586. attr.dev = FS.isChrdev(node.mode) ? node.id : 1;
  1587. attr.ino = node.id;
  1588. attr.mode = node.mode;
  1589. attr.nlink = 1;
  1590. attr.uid = 0;
  1591. attr.gid = 0;
  1592. attr.rdev = node.rdev;
  1593. if (FS.isDir(node.mode)) {
  1594. attr.size = 4096;
  1595. } else if (FS.isFile(node.mode)) {
  1596. attr.size = node.usedBytes;
  1597. } else if (FS.isLink(node.mode)) {
  1598. attr.size = node.link.length;
  1599. } else {
  1600. attr.size = 0;
  1601. }
  1602. attr.atime = new Date(node.timestamp);
  1603. attr.mtime = new Date(node.timestamp);
  1604. attr.ctime = new Date(node.timestamp);
  1605. attr.blksize = 4096;
  1606. attr.blocks = Math.ceil(attr.size / attr.blksize);
  1607. return attr;
  1608. },
  1609. setattr: function(node, attr) {
  1610. if (attr.mode !== undefined) {
  1611. node.mode = attr.mode;
  1612. }
  1613. if (attr.timestamp !== undefined) {
  1614. node.timestamp = attr.timestamp;
  1615. }
  1616. if (attr.size !== undefined) {
  1617. MEMFS.resizeFileStorage(node, attr.size);
  1618. }
  1619. },
  1620. lookup: function(parent, name) {
  1621. throw FS.genericErrors[ERRNO_CODES.ENOENT];
  1622. },
  1623. mknod: function(parent, name, mode, dev) {
  1624. return MEMFS.createNode(parent, name, mode, dev);
  1625. },
  1626. rename: function(old_node, new_dir, new_name) {
  1627. if (FS.isDir(old_node.mode)) {
  1628. var new_node;
  1629. try {
  1630. new_node = FS.lookupNode(new_dir, new_name);
  1631. } catch (e) {}
  1632. if (new_node) {
  1633. for (var i in new_node.contents) {
  1634. throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);
  1635. }
  1636. }
  1637. }
  1638. delete old_node.parent.contents[old_node.name];
  1639. old_node.name = new_name;
  1640. new_dir.contents[new_name] = old_node;
  1641. old_node.parent = new_dir;
  1642. },
  1643. unlink: function(parent, name) {
  1644. delete parent.contents[name];
  1645. },
  1646. rmdir: function(parent, name) {
  1647. var node = FS.lookupNode(parent, name);
  1648. for (var i in node.contents) {
  1649. throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY);
  1650. }
  1651. delete parent.contents[name];
  1652. },
  1653. readdir: function(node) {
  1654. var entries = [ ".", ".." ];
  1655. for (var key in node.contents) {
  1656. if (!node.contents.hasOwnProperty(key)) {
  1657. continue;
  1658. }
  1659. entries.push(key);
  1660. }
  1661. return entries;
  1662. },
  1663. symlink: function(parent, newname, oldpath) {
  1664. var node = MEMFS.createNode(parent, newname, 511 | 40960, 0);
  1665. node.link = oldpath;
  1666. return node;
  1667. },
  1668. readlink: function(node) {
  1669. if (!FS.isLink(node.mode)) {
  1670. throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
  1671. }
  1672. return node.link;
  1673. }
  1674. },
  1675. stream_ops: {
  1676. read: function(stream, buffer, offset, length, position) {
  1677. var contents = stream.node.contents;
  1678. if (position >= stream.node.usedBytes) return 0;
  1679. var size = Math.min(stream.node.usedBytes - position, length);
  1680. assert(size >= 0);
  1681. if (size > 8 && contents.subarray) {
  1682. buffer.set(contents.subarray(position, position + size), offset);
  1683. } else {
  1684. for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i];
  1685. }
  1686. return size;
  1687. },
  1688. write: function(stream, buffer, offset, length, position, canOwn) {
  1689. if (!length) return 0;
  1690. var node = stream.node;
  1691. node.timestamp = Date.now();
  1692. if (buffer.subarray && (!node.contents || node.contents.subarray)) {
  1693. if (canOwn) {
  1694. node.contents = buffer.subarray(offset, offset + length);
  1695. node.usedBytes = length;
  1696. return length;
  1697. } else if (node.usedBytes === 0 && position === 0) {
  1698. node.contents = new Uint8Array(buffer.subarray(offset, offset + length));
  1699. node.usedBytes = length;
  1700. return length;
  1701. } else if (position + length <= node.usedBytes) {
  1702. node.contents.set(buffer.subarray(offset, offset + length), position);
  1703. return length;
  1704. }
  1705. }
  1706. MEMFS.expandFileStorage(node, position + length);
  1707. if (node.contents.subarray && buffer.subarray) node.contents.set(buffer.subarray(offset, offset + length), position); else {
  1708. for (var i = 0; i < length; i++) {
  1709. node.contents[position + i] = buffer[offset + i];
  1710. }
  1711. }
  1712. node.usedBytes = Math.max(node.usedBytes, position + length);
  1713. return length;
  1714. },
  1715. llseek: function(stream, offset, whence) {
  1716. var position = offset;
  1717. if (whence === 1) {
  1718. position += stream.position;
  1719. } else if (whence === 2) {
  1720. if (FS.isFile(stream.node.mode)) {
  1721. position += stream.node.usedBytes;
  1722. }
  1723. }
  1724. if (position < 0) {
  1725. throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
  1726. }
  1727. return position;
  1728. },
  1729. allocate: function(stream, offset, length) {
  1730. MEMFS.expandFileStorage(stream.node, offset + length);
  1731. stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length);
  1732. },
  1733. mmap: function(stream, buffer, offset, length, position, prot, flags) {
  1734. if (!FS.isFile(stream.node.mode)) {
  1735. throw new FS.ErrnoError(ERRNO_CODES.ENODEV);
  1736. }
  1737. var ptr;
  1738. var allocated;
  1739. var contents = stream.node.contents;
  1740. if (!(flags & 2) && (contents.buffer === buffer || contents.buffer === buffer.buffer)) {
  1741. allocated = false;
  1742. ptr = contents.byteOffset;
  1743. } else {
  1744. if (position > 0 || position + length < stream.node.usedBytes) {
  1745. if (contents.subarray) {
  1746. contents = contents.subarray(position, position + length);
  1747. } else {
  1748. contents = Array.prototype.slice.call(contents, position, position + length);
  1749. }
  1750. }
  1751. allocated = true;
  1752. ptr = _malloc(length);
  1753. if (!ptr) {
  1754. throw new FS.ErrnoError(ERRNO_CODES.ENOMEM);
  1755. }
  1756. buffer.set(contents, ptr);
  1757. }
  1758. return {
  1759. ptr: ptr,
  1760. allocated: allocated
  1761. };
  1762. },
  1763. msync: function(stream, buffer, offset, length, mmapFlags) {
  1764. if (!FS.isFile(stream.node.mode)) {
  1765. throw new FS.ErrnoError(ERRNO_CODES.ENODEV);
  1766. }
  1767. if (mmapFlags & 2) {
  1768. return 0;
  1769. }
  1770. var bytesWritten = MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false);
  1771. return 0;
  1772. }
  1773. }
  1774. };
  1775. var IDBFS = {
  1776. dbs: {},
  1777. indexedDB: function() {
  1778. if (typeof indexedDB !== "undefined") return indexedDB;
  1779. var ret = null;
  1780. if (typeof window === "object") ret = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
  1781. assert(ret, "IDBFS used, but indexedDB not supported");
  1782. return ret;
  1783. },
  1784. DB_VERSION: 21,
  1785. DB_STORE_NAME: "FILE_DATA",
  1786. mount: function(mount) {
  1787. return MEMFS.mount.apply(null, arguments);
  1788. },
  1789. syncfs: function(mount, populate, callback) {
  1790. IDBFS.getLocalSet(mount, function(err, local) {
  1791. if (err) return callback(err);
  1792. IDBFS.getRemoteSet(mount, function(err, remote) {
  1793. if (err) return callback(err);
  1794. var src = populate ? remote : local;
  1795. var dst = populate ? local : remote;
  1796. IDBFS.reconcile(src, dst, callback);
  1797. });
  1798. });
  1799. },
  1800. getDB: function(name, callback) {
  1801. var db = IDBFS.dbs[name];
  1802. if (db) {
  1803. return callback(null, db);
  1804. }
  1805. var req;
  1806. try {
  1807. req = IDBFS.indexedDB().open(name, IDBFS.DB_VERSION);
  1808. } catch (e) {
  1809. return callback(e);
  1810. }
  1811. if (!req) {
  1812. return callback("Unable to connect to IndexedDB");
  1813. }
  1814. req.onupgradeneeded = function(e) {
  1815. var db = e.target.result;
  1816. var transaction = e.target.transaction;
  1817. var fileStore;
  1818. if (db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)) {
  1819. fileStore = transaction.objectStore(IDBFS.DB_STORE_NAME);
  1820. } else {
  1821. fileStore = db.createObjectStore(IDBFS.DB_STORE_NAME);
  1822. }
  1823. if (!fileStore.indexNames.contains("timestamp")) {
  1824. fileStore.createIndex("timestamp", "timestamp", {
  1825. unique: false
  1826. });
  1827. }
  1828. };
  1829. req.onsuccess = function() {
  1830. db = req.result;
  1831. IDBFS.dbs[name] = db;
  1832. callback(null, db);
  1833. };
  1834. req.onerror = function(e) {
  1835. callback(this.error);
  1836. e.preventDefault();
  1837. };
  1838. },
  1839. getLocalSet: function(mount, callback) {
  1840. var entries = {};
  1841. function isRealDir(p) {
  1842. return p !== "." && p !== "..";
  1843. }
  1844. function toAbsolute(root) {
  1845. return function(p) {
  1846. return PATH.join2(root, p);
  1847. };
  1848. }
  1849. var check = FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint));
  1850. while (check.length) {
  1851. var path = check.pop();
  1852. var stat;
  1853. try {
  1854. stat = FS.stat(path);
  1855. } catch (e) {
  1856. return callback(e);
  1857. }
  1858. if (FS.isDir(stat.mode)) {
  1859. check.push.apply(check, FS.readdir(path).filter(isRealDir).map(toAbsolute(path)));
  1860. }
  1861. entries[path] = {
  1862. timestamp: stat.mtime
  1863. };
  1864. }
  1865. return callback(null, {
  1866. type: "local",
  1867. entries: entries
  1868. });
  1869. },
  1870. getRemoteSet: function(mount, callback) {
  1871. var entries = {};
  1872. IDBFS.getDB(mount.mountpoint, function(err, db) {
  1873. if (err) return callback(err);
  1874. try {
  1875. var transaction = db.transaction([ IDBFS.DB_STORE_NAME ], "readonly");
  1876. transaction.onerror = function(e) {
  1877. callback(this.error);
  1878. e.preventDefault();
  1879. };
  1880. var store = transaction.objectStore(IDBFS.DB_STORE_NAME);
  1881. var index = store.index("timestamp");
  1882. index.openKeyCursor().onsuccess = function(event) {
  1883. var cursor = event.target.result;
  1884. if (!cursor) {
  1885. return callback(null, {
  1886. type: "remote",
  1887. db: db,
  1888. entries: entries
  1889. });
  1890. }
  1891. entries[cursor.primaryKey] = {
  1892. timestamp: cursor.key
  1893. };
  1894. cursor.continue();
  1895. };
  1896. } catch (e) {
  1897. return callback(e);
  1898. }
  1899. });
  1900. },
  1901. loadLocalEntry: function(path, callback) {
  1902. var stat, node;
  1903. try {
  1904. var lookup = FS.lookupPath(path);
  1905. node = lookup.node;
  1906. stat = FS.stat(path);
  1907. } catch (e) {
  1908. return callback(e);
  1909. }
  1910. if (FS.isDir(stat.mode)) {
  1911. return callback(null, {
  1912. timestamp: stat.mtime,
  1913. mode: stat.mode
  1914. });
  1915. } else if (FS.isFile(stat.mode)) {
  1916. node.contents = MEMFS.getFileDataAsTypedArray(node);
  1917. return callback(null, {
  1918. timestamp: stat.mtime,
  1919. mode: stat.mode,
  1920. contents: node.contents
  1921. });
  1922. } else {
  1923. return callback(new Error("node type not supported"));
  1924. }
  1925. },
  1926. storeLocalEntry: function(path, entry, callback) {
  1927. try {
  1928. if (FS.isDir(entry.mode)) {
  1929. FS.mkdir(path, entry.mode);
  1930. } else if (FS.isFile(entry.mode)) {
  1931. FS.writeFile(path, entry.contents, {
  1932. canOwn: true
  1933. });
  1934. } else {
  1935. return callback(new Error("node type not supported"));
  1936. }
  1937. FS.chmod(path, entry.mode);
  1938. FS.utime(path, entry.timestamp, entry.timestamp);
  1939. } catch (e) {
  1940. return callback(e);
  1941. }
  1942. callback(null);
  1943. },
  1944. removeLocalEntry: function(path, callback) {
  1945. try {
  1946. var lookup = FS.lookupPath(path);
  1947. var stat = FS.stat(path);
  1948. if (FS.isDir(stat.mode)) {
  1949. FS.rmdir(path);
  1950. } else if (FS.isFile(stat.mode)) {
  1951. FS.unlink(path);
  1952. }
  1953. } catch (e) {
  1954. return callback(e);
  1955. }
  1956. callback(null);
  1957. },
  1958. loadRemoteEntry: function(store, path, callback) {
  1959. var req = store.get(path);
  1960. req.onsuccess = function(event) {
  1961. callback(null, event.target.result);
  1962. };
  1963. req.onerror = function(e) {
  1964. callback(this.error);
  1965. e.preventDefault();
  1966. };
  1967. },
  1968. storeRemoteEntry: function(store, path, entry, callback) {
  1969. var req = store.put(entry, path);
  1970. req.onsuccess = function() {
  1971. callback(null);
  1972. };
  1973. req.onerror = function(e) {
  1974. callback(this.error);
  1975. e.preventDefault();
  1976. };
  1977. },
  1978. removeRemoteEntry: function(store, path, callback) {
  1979. var req = store.delete(path);
  1980. req.onsuccess = function() {
  1981. callback(null);
  1982. };
  1983. req.onerror = function(e) {
  1984. callback(this.error);
  1985. e.preventDefault();
  1986. };
  1987. },
  1988. reconcile: function(src, dst, callback) {
  1989. var total = 0;
  1990. var create = [];
  1991. Object.keys(src.entries).forEach(function(key) {
  1992. var e = src.entries[key];
  1993. var e2 = dst.entries[key];
  1994. if (!e2 || e.timestamp > e2.timestamp) {
  1995. create.push(key);
  1996. total++;
  1997. }
  1998. });
  1999. var remove = [];
  2000. Object.keys(dst.entries).forEach(function(key) {
  2001. var e = dst.entries[key];
  2002. var e2 = src.entries[key];
  2003. if (!e2) {
  2004. remove.push(key);
  2005. total++;
  2006. }
  2007. });
  2008. if (!total) {
  2009. return callback(null);
  2010. }
  2011. var errored = false;
  2012. var completed = 0;
  2013. var db = src.type === "remote" ? src.db : dst.db;
  2014. var transaction = db.transaction([ IDBFS.DB_STORE_NAME ], "readwrite");
  2015. var store = transaction.objectStore(IDBFS.DB_STORE_NAME);
  2016. function done(err) {
  2017. if (err) {
  2018. if (!done.errored) {
  2019. done.errored = true;
  2020. return callback(err);
  2021. }
  2022. return;
  2023. }
  2024. if (++completed >= total) {
  2025. return callback(null);
  2026. }
  2027. }
  2028. transaction.onerror = function(e) {
  2029. done(this.error);
  2030. e.preventDefault();
  2031. };
  2032. create.sort().forEach(function(path) {
  2033. if (dst.type === "local") {
  2034. IDBFS.loadRemoteEntry(store, path, function(err, entry) {
  2035. if (err) return done(err);
  2036. IDBFS.storeLocalEntry(path, entry, done);
  2037. });
  2038. } else {
  2039. IDBFS.loadLocalEntry(path, function(err, entry) {
  2040. if (err) return done(err);
  2041. IDBFS.storeRemoteEntry(store, path, entry, done);
  2042. });
  2043. }
  2044. });
  2045. remove.sort().reverse().forEach(function(path) {
  2046. if (dst.type === "local") {
  2047. IDBFS.removeLocalEntry(path, done);
  2048. } else {
  2049. IDBFS.removeRemoteEntry(store, path, done);
  2050. }
  2051. });
  2052. }
  2053. };
  2054. var NODEFS = {
  2055. isWindows: false,
  2056. staticInit: function() {
  2057. NODEFS.isWindows = !!process.platform.match(/^win/);
  2058. var flags = process["binding"]("constants");
  2059. if (flags["fs"]) {
  2060. flags = flags["fs"];
  2061. }
  2062. NODEFS.flagsForNodeMap = {
  2063. 1024: flags["O_APPEND"],
  2064. 64: flags["O_CREAT"],
  2065. 128: flags["O_EXCL"],
  2066. 0: flags["O_RDONLY"],
  2067. 2: flags["O_RDWR"],
  2068. 4096: flags["O_SYNC"],
  2069. 512: flags["O_TRUNC"],
  2070. 1: flags["O_WRONLY"]
  2071. };
  2072. },
  2073. bufferFrom: function(arrayBuffer) {
  2074. return Buffer.alloc ? Buffer.from(arrayBuffer) : new Buffer(arrayBuffer);
  2075. },
  2076. mount: function(mount) {
  2077. assert(ENVIRONMENT_IS_NODE);
  2078. return NODEFS.createNode(null, "/", NODEFS.getMode(mount.opts.root), 0);
  2079. },
  2080. createNode: function(parent, name, mode, dev) {
  2081. if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) {
  2082. throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
  2083. }
  2084. var node = FS.createNode(parent, name, mode);
  2085. node.node_ops = NODEFS.node_ops;
  2086. node.stream_ops = NODEFS.stream_ops;
  2087. return node;
  2088. },
  2089. getMode: function(path) {
  2090. var stat;
  2091. try {
  2092. stat = fs.lstatSync(path);
  2093. if (NODEFS.isWindows) {
  2094. stat.mode = stat.mode | (stat.mode & 292) >> 2;
  2095. }
  2096. } catch (e) {
  2097. if (!e.code) throw e;
  2098. throw new FS.ErrnoError(ERRNO_CODES[e.code]);
  2099. }
  2100. return stat.mode;
  2101. },
  2102. realPath: function(node) {
  2103. var parts = [];
  2104. while (node.parent !== node) {
  2105. parts.push(node.name);
  2106. node = node.parent;
  2107. }
  2108. parts.push(node.mount.opts.root);
  2109. parts.reverse();
  2110. return PATH.join.apply(null, parts);
  2111. },
  2112. flagsForNode: function(flags) {
  2113. flags &= ~2097152;
  2114. flags &= ~2048;
  2115. flags &= ~32768;
  2116. flags &= ~524288;
  2117. var newFlags = 0;
  2118. for (var k in NODEFS.flagsForNodeMap) {
  2119. if (flags & k) {
  2120. newFlags |= NODEFS.flagsForNodeMap[k];
  2121. flags ^= k;
  2122. }
  2123. }
  2124. if (!flags) {
  2125. return newFlags;
  2126. } else {
  2127. throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
  2128. }
  2129. },
  2130. node_ops: {
  2131. getattr: function(node) {
  2132. var path = NODEFS.realPath(node);
  2133. var stat;
  2134. try {
  2135. stat = fs.lstatSync(path);
  2136. } catch (e) {
  2137. if (!e.code) throw e;
  2138. throw new FS.ErrnoError(ERRNO_CODES[e.code]);
  2139. }
  2140. if (NODEFS.isWindows && !stat.blksize) {
  2141. stat.blksize = 4096;
  2142. }
  2143. if (NODEFS.isWindows && !stat.blocks) {
  2144. stat.blocks = (stat.size + stat.blksize - 1) / stat.blksize | 0;
  2145. }
  2146. return {
  2147. dev: stat.dev,
  2148. ino: stat.ino,
  2149. mode: stat.mode,
  2150. nlink: stat.nlink,
  2151. uid: stat.uid,
  2152. gid: stat.gid,
  2153. rdev: stat.rdev,
  2154. size: stat.size,
  2155. atime: stat.atime,
  2156. mtime: stat.mtime,
  2157. ctime: stat.ctime,
  2158. blksize: stat.blksize,
  2159. blocks: stat.blocks
  2160. };
  2161. },
  2162. setattr: function(node, attr) {
  2163. var path = NODEFS.realPath(node);
  2164. try {
  2165. if (attr.mode !== undefined) {
  2166. fs.chmodSync(path, attr.mode);
  2167. node.mode = attr.mode;
  2168. }
  2169. if (attr.timestamp !== undefined) {
  2170. var date = new Date(attr.timestamp);
  2171. fs.utimesSync(path, date, date);
  2172. }
  2173. if (attr.size !== undefined) {
  2174. fs.truncateSync(path, attr.size);
  2175. }
  2176. } catch (e) {
  2177. if (!e.code) throw e;
  2178. throw new FS.ErrnoError(ERRNO_CODES[e.code]);
  2179. }
  2180. },
  2181. lookup: function(parent, name) {
  2182. var path = PATH.join2(NODEFS.realPath(parent), name);
  2183. var mode = NODEFS.getMode(path);
  2184. return NODEFS.createNode(parent, name, mode);
  2185. },
  2186. mknod: function(parent, name, mode, dev) {
  2187. var node = NODEFS.createNode(parent, name, mode, dev);
  2188. var path = NODEFS.realPath(node);
  2189. try {
  2190. if (FS.isDir(node.mode)) {
  2191. fs.mkdirSync(path, node.mode);
  2192. } else {
  2193. fs.writeFileSync(path, "", {
  2194. mode: node.mode
  2195. });
  2196. }
  2197. } catch (e) {
  2198. if (!e.code) throw e;
  2199. throw new FS.ErrnoError(ERRNO_CODES[e.code]);
  2200. }
  2201. return node;
  2202. },
  2203. rename: function(oldNode, newDir, newName) {
  2204. var oldPath = NODEFS.realPath(oldNode);
  2205. var newPath = PATH.join2(NODEFS.realPath(newDir), newName);
  2206. try {
  2207. fs.renameSync(oldPath, newPath);
  2208. } catch (e) {
  2209. if (!e.code) throw e;
  2210. throw new FS.ErrnoError(ERRNO_CODES[e.code]);
  2211. }
  2212. },
  2213. unlink: function(parent, name) {
  2214. var path = PATH.join2(NODEFS.realPath(parent), name);
  2215. try {
  2216. fs.unlinkSync(path);
  2217. } catch (e) {
  2218. if (!e.code) throw e;
  2219. throw new FS.ErrnoError(ERRNO_CODES[e.code]);
  2220. }
  2221. },
  2222. rmdir: function(parent, name) {
  2223. var path = PATH.join2(NODEFS.realPath(parent), name);
  2224. try {
  2225. fs.rmdirSync(path);
  2226. } catch (e) {
  2227. if (!e.code) throw e;
  2228. throw new FS.ErrnoError(ERRNO_CODES[e.code]);
  2229. }
  2230. },
  2231. readdir: function(node) {
  2232. var path = NODEFS.realPath(node);
  2233. try {
  2234. return fs.readdirSync(path);
  2235. } catch (e) {
  2236. if (!e.code) throw e;
  2237. throw new FS.ErrnoError(ERRNO_CODES[e.code]);
  2238. }
  2239. },
  2240. symlink: function(parent, newName, oldPath) {
  2241. var newPath = PATH.join2(NODEFS.realPath(parent), newName);
  2242. try {
  2243. fs.symlinkSync(oldPath, newPath);
  2244. } catch (e) {
  2245. if (!e.code) throw e;
  2246. throw new FS.ErrnoError(ERRNO_CODES[e.code]);
  2247. }
  2248. },
  2249. readlink: function(node) {
  2250. var path = NODEFS.realPath(node);
  2251. try {
  2252. path = fs.readlinkSync(path);
  2253. path = NODEJS_PATH.relative(NODEJS_PATH.resolve(node.mount.opts.root), path);
  2254. return path;
  2255. } catch (e) {
  2256. if (!e.code) throw e;
  2257. throw new FS.ErrnoError(ERRNO_CODES[e.code]);
  2258. }
  2259. }
  2260. },
  2261. stream_ops: {
  2262. open: function(stream) {
  2263. var path = NODEFS.realPath(stream.node);
  2264. try {
  2265. if (FS.isFile(stream.node.mode)) {
  2266. stream.nfd = fs.openSync(path, NODEFS.flagsForNode(stream.flags));
  2267. }
  2268. } catch (e) {
  2269. if (!e.code) throw e;
  2270. throw new FS.ErrnoError(ERRNO_CODES[e.code]);
  2271. }
  2272. },
  2273. close: function(stream) {
  2274. try {
  2275. if (FS.isFile(stream.node.mode) && stream.nfd) {
  2276. fs.closeSync(stream.nfd);
  2277. }
  2278. } catch (e) {
  2279. if (!e.code) throw e;
  2280. throw new FS.ErrnoError(ERRNO_CODES[e.code]);
  2281. }
  2282. },
  2283. read: function(stream, buffer, offset, length, position) {
  2284. if (length === 0) return 0;
  2285. try {
  2286. return fs.readSync(stream.nfd, NODEFS.bufferFrom(buffer.buffer), offset, length, position);
  2287. } catch (e) {
  2288. throw new FS.ErrnoError(ERRNO_CODES[e.code]);
  2289. }
  2290. },
  2291. write: function(stream, buffer, offset, length, position) {
  2292. try {
  2293. return fs.writeSync(stream.nfd, NODEFS.bufferFrom(buffer.buffer), offset, length, position);
  2294. } catch (e) {
  2295. throw new FS.ErrnoError(ERRNO_CODES[e.code]);
  2296. }
  2297. },
  2298. llseek: function(stream, offset, whence) {
  2299. var position = offset;
  2300. if (whence === 1) {
  2301. position += stream.position;
  2302. } else if (whence === 2) {
  2303. if (FS.isFile(stream.node.mode)) {
  2304. try {
  2305. var stat = fs.fstatSync(stream.nfd);
  2306. position += stat.size;
  2307. } catch (e) {
  2308. throw new FS.ErrnoError(ERRNO_CODES[e.code]);
  2309. }
  2310. }
  2311. }
  2312. if (position < 0) {
  2313. throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
  2314. }
  2315. return position;
  2316. }
  2317. }
  2318. };
  2319. var WORKERFS = {
  2320. DIR_MODE: 16895,
  2321. FILE_MODE: 33279,
  2322. reader: null,
  2323. mount: function(mount) {
  2324. assert(ENVIRONMENT_IS_WORKER);
  2325. if (!WORKERFS.reader) WORKERFS.reader = new FileReaderSync();
  2326. var root = WORKERFS.createNode(null, "/", WORKERFS.DIR_MODE, 0);
  2327. var createdParents = {};
  2328. function ensureParent(path) {
  2329. var parts = path.split("/");
  2330. var parent = root;
  2331. for (var i = 0; i < parts.length - 1; i++) {
  2332. var curr = parts.slice(0, i + 1).join("/");
  2333. if (!createdParents[curr]) {
  2334. createdParents[curr] = WORKERFS.createNode(parent, parts[i], WORKERFS.DIR_MODE, 0);
  2335. }
  2336. parent = createdParents[curr];
  2337. }
  2338. return parent;
  2339. }
  2340. function base(path) {
  2341. var parts = path.split("/");
  2342. return parts[parts.length - 1];
  2343. }
  2344. Array.prototype.forEach.call(mount.opts["files"] || [], function(file) {
  2345. WORKERFS.createNode(ensureParent(file.name), base(file.name), WORKERFS.FILE_MODE, 0, file, file.lastModifiedDate);
  2346. });
  2347. (mount.opts["blobs"] || []).forEach(function(obj) {
  2348. WORKERFS.createNode(ensureParent(obj["name"]), base(obj["name"]), WORKERFS.FILE_MODE, 0, obj["data"]);
  2349. });
  2350. (mount.opts["packages"] || []).forEach(function(pack) {
  2351. pack["metadata"].files.forEach(function(file) {
  2352. var name = file.filename.substr(1);
  2353. WORKERFS.createNode(ensureParent(name), base(name), WORKERFS.FILE_MODE, 0, pack["blob"].slice(file.start, file.end));
  2354. });
  2355. });
  2356. return root;
  2357. },
  2358. createNode: function(parent, name, mode, dev, contents, mtime) {
  2359. var node = FS.createNode(parent, name, mode);
  2360. node.mode = mode;
  2361. node.node_ops = WORKERFS.node_ops;
  2362. node.stream_ops = WORKERFS.stream_ops;
  2363. node.timestamp = (mtime || new Date()).getTime();
  2364. assert(WORKERFS.FILE_MODE !== WORKERFS.DIR_MODE);
  2365. if (mode === WORKERFS.FILE_MODE) {
  2366. node.size = contents.size;
  2367. node.contents = contents;
  2368. } else {
  2369. node.size = 4096;
  2370. node.contents = {};
  2371. }
  2372. if (parent) {
  2373. parent.contents[name] = node;
  2374. }
  2375. return node;
  2376. },
  2377. node_ops: {
  2378. getattr: function(node) {
  2379. return {
  2380. dev: 1,
  2381. ino: undefined,
  2382. mode: node.mode,
  2383. nlink: 1,
  2384. uid: 0,
  2385. gid: 0,
  2386. rdev: undefined,
  2387. size: node.size,
  2388. atime: new Date(node.timestamp),
  2389. mtime: new Date(node.timestamp),
  2390. ctime: new Date(node.timestamp),
  2391. blksize: 4096,
  2392. blocks: Math.ceil(node.size / 4096)
  2393. };
  2394. },
  2395. setattr: function(node, attr) {
  2396. if (attr.mode !== undefined) {
  2397. node.mode = attr.mode;
  2398. }
  2399. if (attr.timestamp !== undefined) {
  2400. node.timestamp = attr.timestamp;
  2401. }
  2402. },
  2403. lookup: function(parent, name) {
  2404. throw new FS.ErrnoError(ERRNO_CODES.ENOENT);
  2405. },
  2406. mknod: function(parent, name, mode, dev) {
  2407. throw new FS.ErrnoError(ERRNO_CODES.EPERM);
  2408. },
  2409. rename: function(oldNode, newDir, newName) {
  2410. throw new FS.ErrnoError(ERRNO_CODES.EPERM);
  2411. },
  2412. unlink: function(parent, name) {
  2413. throw new FS.ErrnoError(ERRNO_CODES.EPERM);
  2414. },
  2415. rmdir: function(parent, name) {
  2416. throw new FS.ErrnoError(ERRNO_CODES.EPERM);
  2417. },
  2418. readdir: function(node) {
  2419. var entries = [ ".", ".." ];
  2420. for (var key in node.contents) {
  2421. if (!node.contents.hasOwnProperty(key)) {
  2422. continue;
  2423. }
  2424. entries.push(key);
  2425. }
  2426. return entries;
  2427. },
  2428. symlink: function(parent, newName, oldPath) {
  2429. throw new FS.ErrnoError(ERRNO_CODES.EPERM);
  2430. },
  2431. readlink: function(node) {
  2432. throw new FS.ErrnoError(ERRNO_CODES.EPERM);
  2433. }
  2434. },
  2435. stream_ops: {
  2436. read: function(stream, buffer, offset, length, position) {
  2437. if (position >= stream.node.size) return 0;
  2438. var chunk = stream.node.contents.slice(position, position + length);
  2439. var ab = WORKERFS.reader.readAsArrayBuffer(chunk);
  2440. buffer.set(new Uint8Array(ab), offset);
  2441. return chunk.size;
  2442. },
  2443. write: function(stream, buffer, offset, length, position) {
  2444. throw new FS.ErrnoError(ERRNO_CODES.EIO);
  2445. },
  2446. llseek: function(stream, offset, whence) {
  2447. var position = offset;
  2448. if (whence === 1) {
  2449. position += stream.position;
  2450. } else if (whence === 2) {
  2451. if (FS.isFile(stream.node.mode)) {
  2452. position += stream.node.size;
  2453. }
  2454. }
  2455. if (position < 0) {
  2456. throw new FS.ErrnoError(ERRNO_CODES.EINVAL);
  2457. }
  2458. return position;
  2459. }
  2460. }
  2461. };
  2462. var FS = {
  2463. root: null,
  2464. mounts: [],
  2465. devices: {},
  2466. streams: [],
  2467. nextInode: 1,
  2468. nameTable: null,
  2469. currentPath: "/",
  2470. initialized: false,
  2471. ignorePermissions: true,
  2472. trackingDelegate: {},
  2473. tracking: {
  2474. openFlags: {
  2475. READ: 1,
  2476. WRITE: 2
  2477. }
  2478. },
  2479. ErrnoError: null,
  2480. genericErrors: {},
  2481. filesystems: null,
  2482. syncFSRequests: 0,
  2483. handleFSError: function(e) {
  2484. if (!(e instanceof FS.ErrnoError)) throw e + " : " + stackTrace();
  2485. return ___setErrNo(e.errno);
  2486. },
  2487. lookupPath: function(path, opts) {
  2488. path = PATH.resolve(FS.cwd(), path);
  2489. opts = opts || {};
  2490. if (!path) return {
  2491. path: "",
  2492. node: null
  2493. };
  2494. var defaults = {
  2495. follow_mount: true,
  2496. recurse_count: 0
  2497. };
  2498. for (var key in defaults) {
  2499. if (opts[key] === undefined) {
  2500. opts[key] = defaults[key];
  2501. }
  2502. }
  2503. if (opts.recurse_count > 8) {
  2504. throw new FS.ErrnoError(40);
  2505. }
  2506. var parts = PATH.normalizeArray(path.split("/").filter(function(p) {
  2507. return !!p;
  2508. }), false);
  2509. var current = FS.root;
  2510. var current_path = "/";
  2511. for (var i = 0; i < parts.length; i++) {
  2512. var islast = i === parts.length - 1;
  2513. if (islast && opts.parent) {
  2514. break;
  2515. }
  2516. current = FS.lookupNode(current, parts[i]);
  2517. current_path = PATH.join2(current_path, parts[i]);
  2518. if (FS.isMountpoint(current)) {
  2519. if (!islast || islast && opts.follow_mount) {
  2520. current = current.mounted.root;
  2521. }
  2522. }
  2523. if (!islast || opts.follow) {
  2524. var count = 0;
  2525. while (FS.isLink(current.mode)) {
  2526. var link = FS.readlink(current_path);
  2527. current_path = PATH.resolve(PATH.dirname(current_path), link);
  2528. var lookup = FS.lookupPath(current_path, {
  2529. recurse_count: opts.recurse_count
  2530. });
  2531. current = lookup.node;
  2532. if (count++ > 40) {
  2533. throw new FS.ErrnoError(40);
  2534. }
  2535. }
  2536. }
  2537. }
  2538. return {
  2539. path: current_path,
  2540. node: current
  2541. };
  2542. },
  2543. getPath: function(node) {
  2544. var path;
  2545. while (true) {
  2546. if (FS.isRoot(node)) {
  2547. var mount = node.mount.mountpoint;
  2548. if (!path) return mount;
  2549. return mount[mount.length - 1] !== "/" ? mount + "/" + path : mount + path;
  2550. }
  2551. path = path ? node.name + "/" + path : node.name;
  2552. node = node.parent;
  2553. }
  2554. },
  2555. hashName: function(parentid, name) {
  2556. var hash = 0;
  2557. for (var i = 0; i < name.length; i++) {
  2558. hash = (hash << 5) - hash + name.charCodeAt(i) | 0;
  2559. }
  2560. return (parentid + hash >>> 0) % FS.nameTable.length;
  2561. },
  2562. hashAddNode: function(node) {
  2563. var hash = FS.hashName(node.parent.id, node.name);
  2564. node.name_next = FS.nameTable[hash];
  2565. FS.nameTable[hash] = node;
  2566. },
  2567. hashRemoveNode: function(node) {
  2568. var hash = FS.hashName(node.parent.id, node.name);
  2569. if (FS.nameTable[hash] === node) {
  2570. FS.nameTable[hash] = node.name_next;
  2571. } else {
  2572. var current = FS.nameTable[hash];
  2573. while (current) {
  2574. if (current.name_next === node) {
  2575. current.name_next = node.name_next;
  2576. break;
  2577. }
  2578. current = current.name_next;
  2579. }
  2580. }
  2581. },
  2582. lookupNode: function(parent, name) {
  2583. var err = FS.mayLookup(parent);
  2584. if (err) {
  2585. throw new FS.ErrnoError(err, parent);
  2586. }
  2587. var hash = FS.hashName(parent.id, name);
  2588. for (var node = FS.nameTable[hash]; node; node = node.name_next) {
  2589. var nodeName = node.name;
  2590. if (node.parent.id === parent.id && nodeName === name) {
  2591. return node;
  2592. }
  2593. }
  2594. return FS.lookup(parent, name);
  2595. },
  2596. createNode: function(parent, name, mode, rdev) {
  2597. if (!FS.FSNode) {
  2598. FS.FSNode = function(parent, name, mode, rdev) {
  2599. if (!parent) {
  2600. parent = this;
  2601. }
  2602. this.parent = parent;
  2603. this.mount = parent.mount;
  2604. this.mounted = null;
  2605. this.id = FS.nextInode++;
  2606. this.name = name;
  2607. this.mode = mode;
  2608. this.node_ops = {};
  2609. this.stream_ops = {};
  2610. this.rdev = rdev;
  2611. };
  2612. FS.FSNode.prototype = {};
  2613. var readMode = 292 | 73;
  2614. var writeMode = 146;
  2615. Object.defineProperties(FS.FSNode.prototype, {
  2616. read: {
  2617. get: function() {
  2618. return (this.mode & readMode) === readMode;
  2619. },
  2620. set: function(val) {
  2621. val ? this.mode |= readMode : this.mode &= ~readMode;
  2622. }
  2623. },
  2624. write: {
  2625. get: function() {
  2626. return (this.mode & writeMode) === writeMode;
  2627. },
  2628. set: function(val) {
  2629. val ? this.mode |= writeMode : this.mode &= ~writeMode;
  2630. }
  2631. },
  2632. isFolder: {
  2633. get: function() {
  2634. return FS.isDir(this.mode);
  2635. }
  2636. },
  2637. isDevice: {
  2638. get: function() {
  2639. return FS.isChrdev(this.mode);
  2640. }
  2641. }
  2642. });
  2643. }
  2644. var node = new FS.FSNode(parent, name, mode, rdev);
  2645. FS.hashAddNode(node);
  2646. return node;
  2647. },
  2648. destroyNode: function(node) {
  2649. FS.hashRemoveNode(node);
  2650. },
  2651. isRoot: function(node) {
  2652. return node === node.parent;
  2653. },
  2654. isMountpoint: function(node) {
  2655. return !!node.mounted;
  2656. },
  2657. isFile: function(mode) {
  2658. return (mode & 61440) === 32768;
  2659. },
  2660. isDir: function(mode) {
  2661. return (mode & 61440) === 16384;
  2662. },
  2663. isLink: function(mode) {
  2664. return (mode & 61440) === 40960;
  2665. },
  2666. isChrdev: function(mode) {
  2667. return (mode & 61440) === 8192;
  2668. },
  2669. isBlkdev: function(mode) {
  2670. return (mode & 61440) === 24576;
  2671. },
  2672. isFIFO: function(mode) {
  2673. return (mode & 61440) === 4096;
  2674. },
  2675. isSocket: function(mode) {
  2676. return (mode & 49152) === 49152;
  2677. },
  2678. flagModes: {
  2679. "r": 0,
  2680. "rs": 1052672,
  2681. "r+": 2,
  2682. "w": 577,
  2683. "wx": 705,
  2684. "xw": 705,
  2685. "w+": 578,
  2686. "wx+": 706,
  2687. "xw+": 706,
  2688. "a": 1089,
  2689. "ax": 1217,
  2690. "xa": 1217,
  2691. "a+": 1090,
  2692. "ax+": 1218,
  2693. "xa+": 1218
  2694. },
  2695. modeStringToFlags: function(str) {
  2696. var flags = FS.flagModes[str];
  2697. if (typeof flags === "undefined") {
  2698. throw new Error("Unknown file open mode: " + str);
  2699. }
  2700. return flags;
  2701. },
  2702. flagsToPermissionString: function(flag) {
  2703. var perms = [ "r", "w", "rw" ][flag & 3];
  2704. if (flag & 512) {
  2705. perms += "w";
  2706. }
  2707. return perms;
  2708. },
  2709. nodePermissions: function(node, perms) {
  2710. if (FS.ignorePermissions) {
  2711. return 0;
  2712. }
  2713. if (perms.indexOf("r") !== -1 && !(node.mode & 292)) {
  2714. return 13;
  2715. } else if (perms.indexOf("w") !== -1 && !(node.mode & 146)) {
  2716. return 13;
  2717. } else if (perms.indexOf("x") !== -1 && !(node.mode & 73)) {
  2718. return 13;
  2719. }
  2720. return 0;
  2721. },
  2722. mayLookup: function(dir) {
  2723. var err = FS.nodePermissions(dir, "x");
  2724. if (err) return err;
  2725. if (!dir.node_ops.lookup) return 13;
  2726. return 0;
  2727. },
  2728. mayCreate: function(dir, name) {
  2729. try {
  2730. var node = FS.lookupNode(dir, name);
  2731. return 17;
  2732. } catch (e) {}
  2733. return FS.nodePermissions(dir, "wx");
  2734. },
  2735. mayDelete: function(dir, name, isdir) {
  2736. var node;
  2737. try {
  2738. node = FS.lookupNode(dir, name);
  2739. } catch (e) {
  2740. return e.errno;
  2741. }
  2742. var err = FS.nodePermissions(dir, "wx");
  2743. if (err) {
  2744. return err;
  2745. }
  2746. if (isdir) {
  2747. if (!FS.isDir(node.mode)) {
  2748. return 20;
  2749. }
  2750. if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) {
  2751. return 16;
  2752. }
  2753. } else {
  2754. if (FS.isDir(node.mode)) {
  2755. return 21;
  2756. }
  2757. }
  2758. return 0;
  2759. },
  2760. mayOpen: function(node, flags) {
  2761. if (!node) {
  2762. return 2;
  2763. }
  2764. if (FS.isLink(node.mode)) {
  2765. return 40;
  2766. } else if (FS.isDir(node.mode)) {
  2767. if (FS.flagsToPermissionString(flags) !== "r" || flags & 512) {
  2768. return 21;
  2769. }
  2770. }
  2771. return FS.nodePermissions(node, FS.flagsToPermissionString(flags));
  2772. },
  2773. MAX_OPEN_FDS: 4096,
  2774. nextfd: function(fd_start, fd_end) {
  2775. fd_start = fd_start || 0;
  2776. fd_end = fd_end || FS.MAX_OPEN_FDS;
  2777. for (var fd = fd_start; fd <= fd_end; fd++) {
  2778. if (!FS.streams[fd]) {
  2779. return fd;
  2780. }
  2781. }
  2782. throw new FS.ErrnoError(24);
  2783. },
  2784. getStream: function(fd) {
  2785. return FS.streams[fd];
  2786. },
  2787. createStream: function(stream, fd_start, fd_end) {
  2788. if (!FS.FSStream) {
  2789. FS.FSStream = function() {};
  2790. FS.FSStream.prototype = {};
  2791. Object.defineProperties(FS.FSStream.prototype, {
  2792. object: {
  2793. get: function() {
  2794. return this.node;
  2795. },
  2796. set: function(val) {
  2797. this.node = val;
  2798. }
  2799. },
  2800. isRead: {
  2801. get: function() {
  2802. return (this.flags & 2097155) !== 1;
  2803. }
  2804. },
  2805. isWrite: {
  2806. get: function() {
  2807. return (this.flags & 2097155) !== 0;
  2808. }
  2809. },
  2810. isAppend: {
  2811. get: function() {
  2812. return this.flags & 1024;
  2813. }
  2814. }
  2815. });
  2816. }
  2817. var newStream = new FS.FSStream();
  2818. for (var p in stream) {
  2819. newStream[p] = stream[p];
  2820. }
  2821. stream = newStream;
  2822. var fd = FS.nextfd(fd_start, fd_end);
  2823. stream.fd = fd;
  2824. FS.streams[fd] = stream;
  2825. return stream;
  2826. },
  2827. closeStream: function(fd) {
  2828. FS.streams[fd] = null;
  2829. },
  2830. chrdev_stream_ops: {
  2831. open: function(stream) {
  2832. var device = FS.getDevice(stream.node.rdev);
  2833. stream.stream_ops = device.stream_ops;
  2834. if (stream.stream_ops.open) {
  2835. stream.stream_ops.open(stream);
  2836. }
  2837. },
  2838. llseek: function() {
  2839. throw new FS.ErrnoError(29);
  2840. }
  2841. },
  2842. major: function(dev) {
  2843. return dev >> 8;
  2844. },
  2845. minor: function(dev) {
  2846. return dev & 255;
  2847. },
  2848. makedev: function(ma, mi) {
  2849. return ma << 8 | mi;
  2850. },
  2851. registerDevice: function(dev, ops) {
  2852. FS.devices[dev] = {
  2853. stream_ops: ops
  2854. };
  2855. },
  2856. getDevice: function(dev) {
  2857. return FS.devices[dev];
  2858. },
  2859. getMounts: function(mount) {
  2860. var mounts = [];
  2861. var check = [ mount ];
  2862. while (check.length) {
  2863. var m = check.pop();
  2864. mounts.push(m);
  2865. check.push.apply(check, m.mounts);
  2866. }
  2867. return mounts;
  2868. },
  2869. syncfs: function(populate, callback) {
  2870. if (typeof populate === "function") {
  2871. callback = populate;
  2872. populate = false;
  2873. }
  2874. FS.syncFSRequests++;
  2875. if (FS.syncFSRequests > 1) {
  2876. console.log("warning: " + FS.syncFSRequests + " FS.syncfs operations in flight at once, probably just doing extra work");
  2877. }
  2878. var mounts = FS.getMounts(FS.root.mount);
  2879. var completed = 0;
  2880. function doCallback(err) {
  2881. assert(FS.syncFSRequests > 0);
  2882. FS.syncFSRequests--;
  2883. return callback(err);
  2884. }
  2885. function done(err) {
  2886. if (err) {
  2887. if (!done.errored) {
  2888. done.errored = true;
  2889. return doCallback(err);
  2890. }
  2891. return;
  2892. }
  2893. if (++completed >= mounts.length) {
  2894. doCallback(null);
  2895. }
  2896. }
  2897. mounts.forEach(function(mount) {
  2898. if (!mount.type.syncfs) {
  2899. return done(null);
  2900. }
  2901. mount.type.syncfs(mount, populate, done);
  2902. });
  2903. },
  2904. mount: function(type, opts, mountpoint) {
  2905. var root = mountpoint === "/";
  2906. var pseudo = !mountpoint;
  2907. var node;
  2908. if (root && FS.root) {
  2909. throw new FS.ErrnoError(16);
  2910. } else if (!root && !pseudo) {
  2911. var lookup = FS.lookupPath(mountpoint, {
  2912. follow_mount: false
  2913. });
  2914. mountpoint = lookup.path;
  2915. node = lookup.node;
  2916. if (FS.isMountpoint(node)) {
  2917. throw new FS.ErrnoError(16);
  2918. }
  2919. if (!FS.isDir(node.mode)) {
  2920. throw new FS.ErrnoError(20);
  2921. }
  2922. }
  2923. var mount = {
  2924. type: type,
  2925. opts: opts,
  2926. mountpoint: mountpoint,
  2927. mounts: []
  2928. };
  2929. var mountRoot = type.mount(mount);
  2930. mountRoot.mount = mount;
  2931. mount.root = mountRoot;
  2932. if (root) {
  2933. FS.root = mountRoot;
  2934. } else if (node) {
  2935. node.mounted = mount;
  2936. if (node.mount) {
  2937. node.mount.mounts.push(mount);
  2938. }
  2939. }
  2940. return mountRoot;
  2941. },
  2942. unmount: function(mountpoint) {
  2943. var lookup = FS.lookupPath(mountpoint, {
  2944. follow_mount: false
  2945. });
  2946. if (!FS.isMountpoint(lookup.node)) {
  2947. throw new FS.ErrnoError(22);
  2948. }
  2949. var node = lookup.node;
  2950. var mount = node.mounted;
  2951. var mounts = FS.getMounts(mount);
  2952. Object.keys(FS.nameTable).forEach(function(hash) {
  2953. var current = FS.nameTable[hash];
  2954. while (current) {
  2955. var next = current.name_next;
  2956. if (mounts.indexOf(current.mount) !== -1) {
  2957. FS.destroyNode(current);
  2958. }
  2959. current = next;
  2960. }
  2961. });
  2962. node.mounted = null;
  2963. var idx = node.mount.mounts.indexOf(mount);
  2964. assert(idx !== -1);
  2965. node.mount.mounts.splice(idx, 1);
  2966. },
  2967. lookup: function(parent, name) {
  2968. return parent.node_ops.lookup(parent, name);
  2969. },
  2970. mknod: function(path, mode, dev) {
  2971. var lookup = FS.lookupPath(path, {
  2972. parent: true
  2973. });
  2974. var parent = lookup.node;
  2975. var name = PATH.basename(path);
  2976. if (!name || name === "." || name === "..") {
  2977. throw new FS.ErrnoError(22);
  2978. }
  2979. var err = FS.mayCreate(parent, name);
  2980. if (err) {
  2981. throw new FS.ErrnoError(err);
  2982. }
  2983. if (!parent.node_ops.mknod) {
  2984. throw new FS.ErrnoError(1);
  2985. }
  2986. return parent.node_ops.mknod(parent, name, mode, dev);
  2987. },
  2988. create: function(path, mode) {
  2989. mode = mode !== undefined ? mode : 438;
  2990. mode &= 4095;
  2991. mode |= 32768;
  2992. return FS.mknod(path, mode, 0);
  2993. },
  2994. mkdir: function(path, mode) {
  2995. mode = mode !== undefined ? mode : 511;
  2996. mode &= 511 | 512;
  2997. mode |= 16384;
  2998. return FS.mknod(path, mode, 0);
  2999. },
  3000. mkdirTree: function(path, mode) {
  3001. var dirs = path.split("/");
  3002. var d = "";
  3003. for (var i = 0; i < dirs.length; ++i) {
  3004. if (!dirs[i]) continue;
  3005. d += "/" + dirs[i];
  3006. try {
  3007. FS.mkdir(d, mode);
  3008. } catch (e) {
  3009. if (e.errno != 17) throw e;
  3010. }
  3011. }
  3012. },
  3013. mkdev: function(path, mode, dev) {
  3014. if (typeof dev === "undefined") {
  3015. dev = mode;
  3016. mode = 438;
  3017. }
  3018. mode |= 8192;
  3019. return FS.mknod(path, mode, dev);
  3020. },
  3021. symlink: function(oldpath, newpath) {
  3022. if (!PATH.resolve(oldpath)) {
  3023. throw new FS.ErrnoError(2);
  3024. }
  3025. var lookup = FS.lookupPath(newpath, {
  3026. parent: true
  3027. });
  3028. var parent = lookup.node;
  3029. if (!parent) {
  3030. throw new FS.ErrnoError(2);
  3031. }
  3032. var newname = PATH.basename(newpath);
  3033. var err = FS.mayCreate(parent, newname);
  3034. if (err) {
  3035. throw new FS.ErrnoError(err);
  3036. }
  3037. if (!parent.node_ops.symlink) {
  3038. throw new FS.ErrnoError(1);
  3039. }
  3040. return parent.node_ops.symlink(parent, newname, oldpath);
  3041. },
  3042. rename: function(old_path, new_path) {
  3043. var old_dirname = PATH.dirname(old_path);
  3044. var new_dirname = PATH.dirname(new_path);
  3045. var old_name = PATH.basename(old_path);
  3046. var new_name = PATH.basename(new_path);
  3047. var lookup, old_dir, new_dir;
  3048. try {
  3049. lookup = FS.lookupPath(old_path, {
  3050. parent: true
  3051. });
  3052. old_dir = lookup.node;
  3053. lookup = FS.lookupPath(new_path, {
  3054. parent: true
  3055. });
  3056. new_dir = lookup.node;
  3057. } catch (e) {
  3058. throw new FS.ErrnoError(16);
  3059. }
  3060. if (!old_dir || !new_dir) throw new FS.ErrnoError(2);
  3061. if (old_dir.mount !== new_dir.mount) {
  3062. throw new FS.ErrnoError(18);
  3063. }
  3064. var old_node = FS.lookupNode(old_dir, old_name);
  3065. var relative = PATH.relative(old_path, new_dirname);
  3066. if (relative.charAt(0) !== ".") {
  3067. throw new FS.ErrnoError(22);
  3068. }
  3069. relative = PATH.relative(new_path, old_dirname);
  3070. if (relative.charAt(0) !== ".") {
  3071. throw new FS.ErrnoError(39);
  3072. }
  3073. var new_node;
  3074. try {
  3075. new_node = FS.lookupNode(new_dir, new_name);
  3076. } catch (e) {}
  3077. if (old_node === new_node) {
  3078. return;
  3079. }
  3080. var isdir = FS.isDir(old_node.mode);
  3081. var err = FS.mayDelete(old_dir, old_name, isdir);
  3082. if (err) {
  3083. throw new FS.ErrnoError(err);
  3084. }
  3085. err = new_node ? FS.mayDelete(new_dir, new_name, isdir) : FS.mayCreate(new_dir, new_name);
  3086. if (err) {
  3087. throw new FS.ErrnoError(err);
  3088. }
  3089. if (!old_dir.node_ops.rename) {
  3090. throw new FS.ErrnoError(1);
  3091. }
  3092. if (FS.isMountpoint(old_node) || new_node && FS.isMountpoint(new_node)) {
  3093. throw new FS.ErrnoError(16);
  3094. }
  3095. if (new_dir !== old_dir) {
  3096. err = FS.nodePermissions(old_dir, "w");
  3097. if (err) {
  3098. throw new FS.ErrnoError(err);
  3099. }
  3100. }
  3101. try {
  3102. if (FS.trackingDelegate["willMovePath"]) {
  3103. FS.trackingDelegate["willMovePath"](old_path, new_path);
  3104. }
  3105. } catch (e) {
  3106. console.log("FS.trackingDelegate['willMovePath']('" + old_path + "', '" + new_path + "') threw an exception: " + e.message);
  3107. }
  3108. FS.hashRemoveNode(old_node);
  3109. try {
  3110. old_dir.node_ops.rename(old_node, new_dir, new_name);
  3111. } catch (e) {
  3112. throw e;
  3113. } finally {
  3114. FS.hashAddNode(old_node);
  3115. }
  3116. try {
  3117. if (FS.trackingDelegate["onMovePath"]) FS.trackingDelegate["onMovePath"](old_path, new_path);
  3118. } catch (e) {
  3119. console.log("FS.trackingDelegate['onMovePath']('" + old_path + "', '" + new_path + "') threw an exception: " + e.message);
  3120. }
  3121. },
  3122. rmdir: function(path) {
  3123. var lookup = FS.lookupPath(path, {
  3124. parent: true
  3125. });
  3126. var parent = lookup.node;
  3127. var name = PATH.basename(path);
  3128. var node = FS.lookupNode(parent, name);
  3129. var err = FS.mayDelete(parent, name, true);
  3130. if (err) {
  3131. throw new FS.ErrnoError(err);
  3132. }
  3133. if (!parent.node_ops.rmdir) {
  3134. throw new FS.ErrnoError(1);
  3135. }
  3136. if (FS.isMountpoint(node)) {
  3137. throw new FS.ErrnoError(16);
  3138. }
  3139. try {
  3140. if (FS.trackingDelegate["willDeletePath"]) {
  3141. FS.trackingDelegate["willDeletePath"](path);
  3142. }
  3143. } catch (e) {
  3144. console.log("FS.trackingDelegate['willDeletePath']('" + path + "') threw an exception: " + e.message);
  3145. }
  3146. parent.node_ops.rmdir(parent, name);
  3147. FS.destroyNode(node);
  3148. try {
  3149. if (FS.trackingDelegate["onDeletePath"]) FS.trackingDelegate["onDeletePath"](path);
  3150. } catch (e) {
  3151. console.log("FS.trackingDelegate['onDeletePath']('" + path + "') threw an exception: " + e.message);
  3152. }
  3153. },
  3154. readdir: function(path) {
  3155. var lookup = FS.lookupPath(path, {
  3156. follow: true
  3157. });
  3158. var node = lookup.node;
  3159. if (!node.node_ops.readdir) {
  3160. throw new FS.ErrnoError(20);
  3161. }
  3162. return node.node_ops.readdir(node);
  3163. },
  3164. unlink: function(path) {
  3165. var lookup = FS.lookupPath(path, {
  3166. parent: true
  3167. });
  3168. var parent = lookup.node;
  3169. var name = PATH.basename(path);
  3170. var node = FS.lookupNode(parent, name);
  3171. var err = FS.mayDelete(parent, name, false);
  3172. if (err) {
  3173. throw new FS.ErrnoError(err);
  3174. }
  3175. if (!parent.node_ops.unlink) {
  3176. throw new FS.ErrnoError(1);
  3177. }
  3178. if (FS.isMountpoint(node)) {
  3179. throw new FS.ErrnoError(16);
  3180. }
  3181. try {
  3182. if (FS.trackingDelegate["willDeletePath"]) {
  3183. FS.trackingDelegate["willDeletePath"](path);
  3184. }
  3185. } catch (e) {
  3186. console.log("FS.trackingDelegate['willDeletePath']('" + path + "') threw an exception: " + e.message);
  3187. }
  3188. parent.node_ops.unlink(parent, name);
  3189. FS.destroyNode(node);
  3190. try {
  3191. if (FS.trackingDelegate["onDeletePath"]) FS.trackingDelegate["onDeletePath"](path);
  3192. } catch (e) {
  3193. console.log("FS.trackingDelegate['onDeletePath']('" + path + "') threw an exception: " + e.message);
  3194. }
  3195. },
  3196. readlink: function(path) {
  3197. var lookup = FS.lookupPath(path);
  3198. var link = lookup.node;
  3199. if (!link) {
  3200. throw new FS.ErrnoError(2);
  3201. }
  3202. if (!link.node_ops.readlink) {
  3203. throw new FS.ErrnoError(22);
  3204. }
  3205. return PATH.resolve(FS.getPath(link.parent), link.node_ops.readlink(link));
  3206. },
  3207. stat: function(path, dontFollow) {
  3208. var lookup = FS.lookupPath(path, {
  3209. follow: !dontFollow
  3210. });
  3211. var node = lookup.node;
  3212. if (!node) {
  3213. throw new FS.ErrnoError(2);
  3214. }
  3215. if (!node.node_ops.getattr) {
  3216. throw new FS.ErrnoError(1);
  3217. }
  3218. return node.node_ops.getattr(node);
  3219. },
  3220. lstat: function(path) {
  3221. return FS.stat(path, true);
  3222. },
  3223. chmod: function(path, mode, dontFollow) {
  3224. var node;
  3225. if (typeof path === "string") {
  3226. var lookup = FS.lookupPath(path, {
  3227. follow: !dontFollow
  3228. });
  3229. node = lookup.node;
  3230. } else {
  3231. node = path;
  3232. }
  3233. if (!node.node_ops.setattr) {
  3234. throw new FS.ErrnoError(1);
  3235. }
  3236. node.node_ops.setattr(node, {
  3237. mode: mode & 4095 | node.mode & ~4095,
  3238. timestamp: Date.now()
  3239. });
  3240. },
  3241. lchmod: function(path, mode) {
  3242. FS.chmod(path, mode, true);
  3243. },
  3244. fchmod: function(fd, mode) {
  3245. var stream = FS.getStream(fd);
  3246. if (!stream) {
  3247. throw new FS.ErrnoError(9);
  3248. }
  3249. FS.chmod(stream.node, mode);
  3250. },
  3251. chown: function(path, uid, gid, dontFollow) {
  3252. var node;
  3253. if (typeof path === "string") {
  3254. var lookup = FS.lookupPath(path, {
  3255. follow: !dontFollow
  3256. });
  3257. node = lookup.node;
  3258. } else {
  3259. node = path;
  3260. }
  3261. if (!node.node_ops.setattr) {
  3262. throw new FS.ErrnoError(1);
  3263. }
  3264. node.node_ops.setattr(node, {
  3265. timestamp: Date.now()
  3266. });
  3267. },
  3268. lchown: function(path, uid, gid) {
  3269. FS.chown(path, uid, gid, true);
  3270. },
  3271. fchown: function(fd, uid, gid) {
  3272. var stream = FS.getStream(fd);
  3273. if (!stream) {
  3274. throw new FS.ErrnoError(9);
  3275. }
  3276. FS.chown(stream.node, uid, gid);
  3277. },
  3278. truncate: function(path, len) {
  3279. if (len < 0) {
  3280. throw new FS.ErrnoError(22);
  3281. }
  3282. var node;
  3283. if (typeof path === "string") {
  3284. var lookup = FS.lookupPath(path, {
  3285. follow: true
  3286. });
  3287. node = lookup.node;
  3288. } else {
  3289. node = path;
  3290. }
  3291. if (!node.node_ops.setattr) {
  3292. throw new FS.ErrnoError(1);
  3293. }
  3294. if (FS.isDir(node.mode)) {
  3295. throw new FS.ErrnoError(21);
  3296. }
  3297. if (!FS.isFile(node.mode)) {
  3298. throw new FS.ErrnoError(22);
  3299. }
  3300. var err = FS.nodePermissions(node, "w");
  3301. if (err) {
  3302. throw new FS.ErrnoError(err);
  3303. }
  3304. node.node_ops.setattr(node, {
  3305. size: len,
  3306. timestamp: Date.now()
  3307. });
  3308. },
  3309. ftruncate: function(fd, len) {
  3310. var stream = FS.getStream(fd);
  3311. if (!stream) {
  3312. throw new FS.ErrnoError(9);
  3313. }
  3314. if ((stream.flags & 2097155) === 0) {
  3315. throw new FS.ErrnoError(22);
  3316. }
  3317. FS.truncate(stream.node, len);
  3318. },
  3319. utime: function(path, atime, mtime) {
  3320. var lookup = FS.lookupPath(path, {
  3321. follow: true
  3322. });
  3323. var node = lookup.node;
  3324. node.node_ops.setattr(node, {
  3325. timestamp: Math.max(atime, mtime)
  3326. });
  3327. },
  3328. open: function(path, flags, mode, fd_start, fd_end) {
  3329. if (path === "") {
  3330. throw new FS.ErrnoError(2);
  3331. }
  3332. flags = typeof flags === "string" ? FS.modeStringToFlags(flags) : flags;
  3333. mode = typeof mode === "undefined" ? 438 : mode;
  3334. if (flags & 64) {
  3335. mode = mode & 4095 | 32768;
  3336. } else {
  3337. mode = 0;
  3338. }
  3339. var node;
  3340. if (typeof path === "object") {
  3341. node = path;
  3342. } else {
  3343. path = PATH.normalize(path);
  3344. try {
  3345. var lookup = FS.lookupPath(path, {
  3346. follow: !(flags & 131072)
  3347. });
  3348. node = lookup.node;
  3349. } catch (e) {}
  3350. }
  3351. var created = false;
  3352. if (flags & 64) {
  3353. if (node) {
  3354. if (flags & 128) {
  3355. throw new FS.ErrnoError(17);
  3356. }
  3357. } else {
  3358. node = FS.mknod(path, mode, 0);
  3359. created = true;
  3360. }
  3361. }
  3362. if (!node) {
  3363. throw new FS.ErrnoError(2);
  3364. }
  3365. if (FS.isChrdev(node.mode)) {
  3366. flags &= ~512;
  3367. }
  3368. if (flags & 65536 && !FS.isDir(node.mode)) {
  3369. throw new FS.ErrnoError(20);
  3370. }
  3371. if (!created) {
  3372. var err = FS.mayOpen(node, flags);
  3373. if (err) {
  3374. throw new FS.ErrnoError(err);
  3375. }
  3376. }
  3377. if (flags & 512) {
  3378. FS.truncate(node, 0);
  3379. }
  3380. flags &= ~(128 | 512);
  3381. var stream = FS.createStream({
  3382. node: node,
  3383. path: FS.getPath(node),
  3384. flags: flags,
  3385. seekable: true,
  3386. position: 0,
  3387. stream_ops: node.stream_ops,
  3388. ungotten: [],
  3389. error: false
  3390. }, fd_start, fd_end);
  3391. if (stream.stream_ops.open) {
  3392. stream.stream_ops.open(stream);
  3393. }
  3394. if (Module["logReadFiles"] && !(flags & 1)) {
  3395. if (!FS.readFiles) FS.readFiles = {};
  3396. if (!(path in FS.readFiles)) {
  3397. FS.readFiles[path] = 1;
  3398. console.log("FS.trackingDelegate error on read file: " + path);
  3399. }
  3400. }
  3401. try {
  3402. if (FS.trackingDelegate["onOpenFile"]) {
  3403. var trackingFlags = 0;
  3404. if ((flags & 2097155) !== 1) {
  3405. trackingFlags |= FS.tracking.openFlags.READ;
  3406. }
  3407. if ((flags & 2097155) !== 0) {
  3408. trackingFlags |= FS.tracking.openFlags.WRITE;
  3409. }
  3410. FS.trackingDelegate["onOpenFile"](path, trackingFlags);
  3411. }
  3412. } catch (e) {
  3413. console.log("FS.trackingDelegate['onOpenFile']('" + path + "', flags) threw an exception: " + e.message);
  3414. }
  3415. return stream;
  3416. },
  3417. close: function(stream) {
  3418. if (FS.isClosed(stream)) {
  3419. throw new FS.ErrnoError(9);
  3420. }
  3421. if (stream.getdents) stream.getdents = null;
  3422. try {
  3423. if (stream.stream_ops.close) {
  3424. stream.stream_ops.close(stream);
  3425. }
  3426. } catch (e) {
  3427. throw e;
  3428. } finally {
  3429. FS.closeStream(stream.fd);
  3430. }
  3431. stream.fd = null;
  3432. },
  3433. isClosed: function(stream) {
  3434. return stream.fd === null;
  3435. },
  3436. llseek: function(stream, offset, whence) {
  3437. if (FS.isClosed(stream)) {
  3438. throw new FS.ErrnoError(9);
  3439. }
  3440. if (!stream.seekable || !stream.stream_ops.llseek) {
  3441. throw new FS.ErrnoError(29);
  3442. }
  3443. if (whence != 0 && whence != 1 && whence != 2) {
  3444. throw new FS.ErrnoError(22);
  3445. }
  3446. stream.position = stream.stream_ops.llseek(stream, offset, whence);
  3447. stream.ungotten = [];
  3448. return stream.position;
  3449. },
  3450. read: function(stream, buffer, offset, length, position) {
  3451. if (length < 0 || position < 0) {
  3452. throw new FS.ErrnoError(22);
  3453. }
  3454. if (FS.isClosed(stream)) {
  3455. throw new FS.ErrnoError(9);
  3456. }
  3457. if ((stream.flags & 2097155) === 1) {
  3458. throw new FS.ErrnoError(9);
  3459. }
  3460. if (FS.isDir(stream.node.mode)) {
  3461. throw new FS.ErrnoError(21);
  3462. }
  3463. if (!stream.stream_ops.read) {
  3464. throw new FS.ErrnoError(22);
  3465. }
  3466. var seeking = typeof position !== "undefined";
  3467. if (!seeking) {
  3468. position = stream.position;
  3469. } else if (!stream.seekable) {
  3470. throw new FS.ErrnoError(29);
  3471. }
  3472. var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position);
  3473. if (!seeking) stream.position += bytesRead;
  3474. return bytesRead;
  3475. },
  3476. write: function(stream, buffer, offset, length, position, canOwn) {
  3477. if (length < 0 || position < 0) {
  3478. throw new FS.ErrnoError(22);
  3479. }
  3480. if (FS.isClosed(stream)) {
  3481. throw new FS.ErrnoError(9);
  3482. }
  3483. if ((stream.flags & 2097155) === 0) {
  3484. throw new FS.ErrnoError(9);
  3485. }
  3486. if (FS.isDir(stream.node.mode)) {
  3487. throw new FS.ErrnoError(21);
  3488. }
  3489. if (!stream.stream_ops.write) {
  3490. throw new FS.ErrnoError(22);
  3491. }
  3492. if (stream.flags & 1024) {
  3493. FS.llseek(stream, 0, 2);
  3494. }
  3495. var seeking = typeof position !== "undefined";
  3496. if (!seeking) {
  3497. position = stream.position;
  3498. } else if (!stream.seekable) {
  3499. throw new FS.ErrnoError(29);
  3500. }
  3501. var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn);
  3502. if (!seeking) stream.position += bytesWritten;
  3503. try {
  3504. if (stream.path && FS.trackingDelegate["onWriteToFile"]) FS.trackingDelegate["onWriteToFile"](stream.path);
  3505. } catch (e) {
  3506. console.log("FS.trackingDelegate['onWriteToFile']('" + stream.path + "') threw an exception: " + e.message);
  3507. }
  3508. return bytesWritten;
  3509. },
  3510. allocate: function(stream, offset, length) {
  3511. if (FS.isClosed(stream)) {
  3512. throw new FS.ErrnoError(9);
  3513. }
  3514. if (offset < 0 || length <= 0) {
  3515. throw new FS.ErrnoError(22);
  3516. }
  3517. if ((stream.flags & 2097155) === 0) {
  3518. throw new FS.ErrnoError(9);
  3519. }
  3520. if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) {
  3521. throw new FS.ErrnoError(19);
  3522. }
  3523. if (!stream.stream_ops.allocate) {
  3524. throw new FS.ErrnoError(95);
  3525. }
  3526. stream.stream_ops.allocate(stream, offset, length);
  3527. },
  3528. mmap: function(stream, buffer, offset, length, position, prot, flags) {
  3529. if ((stream.flags & 2097155) === 1) {
  3530. throw new FS.ErrnoError(13);
  3531. }
  3532. if (!stream.stream_ops.mmap) {
  3533. throw new FS.ErrnoError(19);
  3534. }
  3535. return stream.stream_ops.mmap(stream, buffer, offset, length, position, prot, flags);
  3536. },
  3537. msync: function(stream, buffer, offset, length, mmapFlags) {
  3538. if (!stream || !stream.stream_ops.msync) {
  3539. return 0;
  3540. }
  3541. return stream.stream_ops.msync(stream, buffer, offset, length, mmapFlags);
  3542. },
  3543. munmap: function(stream) {
  3544. return 0;
  3545. },
  3546. ioctl: function(stream, cmd, arg) {
  3547. if (!stream.stream_ops.ioctl) {
  3548. throw new FS.ErrnoError(25);
  3549. }
  3550. return stream.stream_ops.ioctl(stream, cmd, arg);
  3551. },
  3552. readFile: function(path, opts) {
  3553. opts = opts || {};
  3554. opts.flags = opts.flags || "r";
  3555. opts.encoding = opts.encoding || "binary";
  3556. if (opts.encoding !== "utf8" && opts.encoding !== "binary") {
  3557. throw new Error('Invalid encoding type "' + opts.encoding + '"');
  3558. }
  3559. var ret;
  3560. var stream = FS.open(path, opts.flags);
  3561. var stat = FS.stat(path);
  3562. var length = stat.size;
  3563. var buf = new Uint8Array(length);
  3564. FS.read(stream, buf, 0, length, 0);
  3565. if (opts.encoding === "utf8") {
  3566. ret = UTF8ArrayToString(buf, 0);
  3567. } else if (opts.encoding === "binary") {
  3568. ret = buf;
  3569. }
  3570. FS.close(stream);
  3571. return ret;
  3572. },
  3573. writeFile: function(path, data, opts) {
  3574. opts = opts || {};
  3575. opts.flags = opts.flags || "w";
  3576. var stream = FS.open(path, opts.flags, opts.mode);
  3577. if (typeof data === "string") {
  3578. var buf = new Uint8Array(lengthBytesUTF8(data) + 1);
  3579. var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length);
  3580. FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn);
  3581. } else if (ArrayBuffer.isView(data)) {
  3582. FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn);
  3583. } else {
  3584. throw new Error("Unsupported data type");
  3585. }
  3586. FS.close(stream);
  3587. },
  3588. cwd: function() {
  3589. return FS.currentPath;
  3590. },
  3591. chdir: function(path) {
  3592. var lookup = FS.lookupPath(path, {
  3593. follow: true
  3594. });
  3595. if (lookup.node === null) {
  3596. throw new FS.ErrnoError(2);
  3597. }
  3598. if (!FS.isDir(lookup.node.mode)) {
  3599. throw new FS.ErrnoError(20);
  3600. }
  3601. var err = FS.nodePermissions(lookup.node, "x");
  3602. if (err) {
  3603. throw new FS.ErrnoError(err);
  3604. }
  3605. FS.currentPath = lookup.path;
  3606. },
  3607. createDefaultDirectories: function() {
  3608. FS.mkdir("/tmp");
  3609. FS.mkdir("/home");
  3610. FS.mkdir("/home/web_user");
  3611. },
  3612. createDefaultDevices: function() {
  3613. FS.mkdir("/dev");
  3614. FS.registerDevice(FS.makedev(1, 3), {
  3615. read: function() {
  3616. return 0;
  3617. },
  3618. write: function(stream, buffer, offset, length, pos) {
  3619. return length;
  3620. }
  3621. });
  3622. FS.mkdev("/dev/null", FS.makedev(1, 3));
  3623. TTY.register(FS.makedev(5, 0), TTY.default_tty_ops);
  3624. TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops);
  3625. FS.mkdev("/dev/tty", FS.makedev(5, 0));
  3626. FS.mkdev("/dev/tty1", FS.makedev(6, 0));
  3627. var random_device;
  3628. if (typeof crypto === "object" && typeof crypto["getRandomValues"] === "function") {
  3629. var randomBuffer = new Uint8Array(1);
  3630. random_device = function() {
  3631. crypto.getRandomValues(randomBuffer);
  3632. return randomBuffer[0];
  3633. };
  3634. } else if (ENVIRONMENT_IS_NODE) {
  3635. try {
  3636. var crypto_module = require("crypto");
  3637. random_device = function() {
  3638. return crypto_module["randomBytes"](1)[0];
  3639. };
  3640. } catch (e) {
  3641. random_device = function() {
  3642. return Math.random() * 256 | 0;
  3643. };
  3644. }
  3645. } else {
  3646. random_device = function() {
  3647. abort("random_device");
  3648. };
  3649. }
  3650. FS.createDevice("/dev", "random", random_device);
  3651. FS.createDevice("/dev", "urandom", random_device);
  3652. FS.mkdir("/dev/shm");
  3653. FS.mkdir("/dev/shm/tmp");
  3654. },
  3655. createSpecialDirectories: function() {
  3656. FS.mkdir("/proc");
  3657. FS.mkdir("/proc/self");
  3658. FS.mkdir("/proc/self/fd");
  3659. FS.mount({
  3660. mount: function() {
  3661. var node = FS.createNode("/proc/self", "fd", 16384 | 511, 73);
  3662. node.node_ops = {
  3663. lookup: function(parent, name) {
  3664. var fd = +name;
  3665. var stream = FS.getStream(fd);
  3666. if (!stream) throw new FS.ErrnoError(9);
  3667. var ret = {
  3668. parent: null,
  3669. mount: {
  3670. mountpoint: "fake"
  3671. },
  3672. node_ops: {
  3673. readlink: function() {
  3674. return stream.path;
  3675. }
  3676. }
  3677. };
  3678. ret.parent = ret;
  3679. return ret;
  3680. }
  3681. };
  3682. return node;
  3683. }
  3684. }, {}, "/proc/self/fd");
  3685. },
  3686. createStandardStreams: function() {
  3687. if (Module["stdin"]) {
  3688. FS.createDevice("/dev", "stdin", Module["stdin"]);
  3689. } else {
  3690. FS.symlink("/dev/tty", "/dev/stdin");
  3691. }
  3692. if (Module["stdout"]) {
  3693. FS.createDevice("/dev", "stdout", null, Module["stdout"]);
  3694. } else {
  3695. FS.symlink("/dev/tty", "/dev/stdout");
  3696. }
  3697. if (Module["stderr"]) {
  3698. FS.createDevice("/dev", "stderr", null, Module["stderr"]);
  3699. } else {
  3700. FS.symlink("/dev/tty1", "/dev/stderr");
  3701. }
  3702. var stdin = FS.open("/dev/stdin", "r");
  3703. assert(stdin.fd === 0, "invalid handle for stdin (" + stdin.fd + ")");
  3704. var stdout = FS.open("/dev/stdout", "w");
  3705. assert(stdout.fd === 1, "invalid handle for stdout (" + stdout.fd + ")");
  3706. var stderr = FS.open("/dev/stderr", "w");
  3707. assert(stderr.fd === 2, "invalid handle for stderr (" + stderr.fd + ")");
  3708. },
  3709. ensureErrnoError: function() {
  3710. if (FS.ErrnoError) return;
  3711. FS.ErrnoError = function ErrnoError(errno, node) {
  3712. this.node = node;
  3713. this.setErrno = function(errno) {
  3714. this.errno = errno;
  3715. };
  3716. this.setErrno(errno);
  3717. this.message = "FS error";
  3718. if (this.stack) Object.defineProperty(this, "stack", {
  3719. value: new Error().stack,
  3720. writable: true
  3721. });
  3722. };
  3723. FS.ErrnoError.prototype = new Error();
  3724. FS.ErrnoError.prototype.constructor = FS.ErrnoError;
  3725. [ 2 ].forEach(function(code) {
  3726. FS.genericErrors[code] = new FS.ErrnoError(code);
  3727. FS.genericErrors[code].stack = "<generic error, no stack>";
  3728. });
  3729. },
  3730. staticInit: function() {
  3731. FS.ensureErrnoError();
  3732. FS.nameTable = new Array(4096);
  3733. FS.mount(MEMFS, {}, "/");
  3734. FS.createDefaultDirectories();
  3735. FS.createDefaultDevices();
  3736. FS.createSpecialDirectories();
  3737. FS.filesystems = {
  3738. "MEMFS": MEMFS,
  3739. "IDBFS": IDBFS,
  3740. "NODEFS": NODEFS,
  3741. "WORKERFS": WORKERFS
  3742. };
  3743. },
  3744. init: function(input, output, error) {
  3745. assert(!FS.init.initialized, "FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)");
  3746. FS.init.initialized = true;
  3747. FS.ensureErrnoError();
  3748. Module["stdin"] = input || Module["stdin"];
  3749. Module["stdout"] = output || Module["stdout"];
  3750. Module["stderr"] = error || Module["stderr"];
  3751. FS.createStandardStreams();
  3752. },
  3753. quit: function() {
  3754. FS.init.initialized = false;
  3755. var fflush = Module["_fflush"];
  3756. if (fflush) fflush(0);
  3757. for (var i = 0; i < FS.streams.length; i++) {
  3758. var stream = FS.streams[i];
  3759. if (!stream) {
  3760. continue;
  3761. }
  3762. FS.close(stream);
  3763. }
  3764. },
  3765. getMode: function(canRead, canWrite) {
  3766. var mode = 0;
  3767. if (canRead) mode |= 292 | 73;
  3768. if (canWrite) mode |= 146;
  3769. return mode;
  3770. },
  3771. joinPath: function(parts, forceRelative) {
  3772. var path = PATH.join.apply(null, parts);
  3773. if (forceRelative && path[0] == "/") path = path.substr(1);
  3774. return path;
  3775. },
  3776. absolutePath: function(relative, base) {
  3777. return PATH.resolve(base, relative);
  3778. },
  3779. standardizePath: function(path) {
  3780. return PATH.normalize(path);
  3781. },
  3782. findObject: function(path, dontResolveLastLink) {
  3783. var ret = FS.analyzePath(path, dontResolveLastLink);
  3784. if (ret.exists) {
  3785. return ret.object;
  3786. } else {
  3787. ___setErrNo(ret.error);
  3788. return null;
  3789. }
  3790. },
  3791. analyzePath: function(path, dontResolveLastLink) {
  3792. try {
  3793. var lookup = FS.lookupPath(path, {
  3794. follow: !dontResolveLastLink
  3795. });
  3796. path = lookup.path;
  3797. } catch (e) {}
  3798. var ret = {
  3799. isRoot: false,
  3800. exists: false,
  3801. error: 0,
  3802. name: null,
  3803. path: null,
  3804. object: null,
  3805. parentExists: false,
  3806. parentPath: null,
  3807. parentObject: null
  3808. };
  3809. try {
  3810. var lookup = FS.lookupPath(path, {
  3811. parent: true
  3812. });
  3813. ret.parentExists = true;
  3814. ret.parentPath = lookup.path;
  3815. ret.parentObject = lookup.node;
  3816. ret.name = PATH.basename(path);
  3817. lookup = FS.lookupPath(path, {
  3818. follow: !dontResolveLastLink
  3819. });
  3820. ret.exists = true;
  3821. ret.path = lookup.path;
  3822. ret.object = lookup.node;
  3823. ret.name = lookup.node.name;
  3824. ret.isRoot = lookup.path === "/";
  3825. } catch (e) {
  3826. ret.error = e.errno;
  3827. }
  3828. return ret;
  3829. },
  3830. createFolder: function(parent, name, canRead, canWrite) {
  3831. var path = PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name);
  3832. var mode = FS.getMode(canRead, canWrite);
  3833. return FS.mkdir(path, mode);
  3834. },
  3835. createPath: function(parent, path, canRead, canWrite) {
  3836. parent = typeof parent === "string" ? parent : FS.getPath(parent);
  3837. var parts = path.split("/").reverse();
  3838. while (parts.length) {
  3839. var part = parts.pop();
  3840. if (!part) continue;
  3841. var current = PATH.join2(parent, part);
  3842. try {
  3843. FS.mkdir(current);
  3844. } catch (e) {}
  3845. parent = current;
  3846. }
  3847. return current;
  3848. },
  3849. createFile: function(parent, name, properties, canRead, canWrite) {
  3850. var path = PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name);
  3851. var mode = FS.getMode(canRead, canWrite);
  3852. return FS.create(path, mode);
  3853. },
  3854. createDataFile: function(parent, name, data, canRead, canWrite, canOwn) {
  3855. var path = name ? PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name) : parent;
  3856. var mode = FS.getMode(canRead, canWrite);
  3857. var node = FS.create(path, mode);
  3858. if (data) {
  3859. if (typeof data === "string") {
  3860. var arr = new Array(data.length);
  3861. for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i);
  3862. data = arr;
  3863. }
  3864. FS.chmod(node, mode | 146);
  3865. var stream = FS.open(node, "w");
  3866. FS.write(stream, data, 0, data.length, 0, canOwn);
  3867. FS.close(stream);
  3868. FS.chmod(node, mode);
  3869. }
  3870. return node;
  3871. },
  3872. createDevice: function(parent, name, input, output) {
  3873. var path = PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name);
  3874. var mode = FS.getMode(!!input, !!output);
  3875. if (!FS.createDevice.major) FS.createDevice.major = 64;
  3876. var dev = FS.makedev(FS.createDevice.major++, 0);
  3877. FS.registerDevice(dev, {
  3878. open: function(stream) {
  3879. stream.seekable = false;
  3880. },
  3881. close: function(stream) {
  3882. if (output && output.buffer && output.buffer.length) {
  3883. output(10);
  3884. }
  3885. },
  3886. read: function(stream, buffer, offset, length, pos) {
  3887. var bytesRead = 0;
  3888. for (var i = 0; i < length; i++) {
  3889. var result;
  3890. try {
  3891. result = input();
  3892. } catch (e) {
  3893. throw new FS.ErrnoError(5);
  3894. }
  3895. if (result === undefined && bytesRead === 0) {
  3896. throw new FS.ErrnoError(11);
  3897. }
  3898. if (result === null || result === undefined) break;
  3899. bytesRead++;
  3900. buffer[offset + i] = result;
  3901. }
  3902. if (bytesRead) {
  3903. stream.node.timestamp = Date.now();
  3904. }
  3905. return bytesRead;
  3906. },
  3907. write: function(stream, buffer, offset, length, pos) {
  3908. for (var i = 0; i < length; i++) {
  3909. try {
  3910. output(buffer[offset + i]);
  3911. } catch (e) {
  3912. throw new FS.ErrnoError(5);
  3913. }
  3914. }
  3915. if (length) {
  3916. stream.node.timestamp = Date.now();
  3917. }
  3918. return i;
  3919. }
  3920. });
  3921. return FS.mkdev(path, mode, dev);
  3922. },
  3923. createLink: function(parent, name, target, canRead, canWrite) {
  3924. var path = PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name);
  3925. return FS.symlink(target, path);
  3926. },
  3927. forceLoadFile: function(obj) {
  3928. if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true;
  3929. var success = true;
  3930. if (typeof XMLHttpRequest !== "undefined") {
  3931. throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.");
  3932. } else if (Module["read"]) {
  3933. try {
  3934. obj.contents = intArrayFromString(Module["read"](obj.url), true);
  3935. obj.usedBytes = obj.contents.length;
  3936. } catch (e) {
  3937. success = false;
  3938. }
  3939. } else {
  3940. throw new Error("Cannot load without read() or XMLHttpRequest.");
  3941. }
  3942. if (!success) ___setErrNo(5);
  3943. return success;
  3944. },
  3945. createLazyFile: function(parent, name, url, canRead, canWrite) {
  3946. function LazyUint8Array() {
  3947. this.lengthKnown = false;
  3948. this.chunks = [];
  3949. }
  3950. LazyUint8Array.prototype.get = function LazyUint8Array_get(idx) {
  3951. if (idx > this.length - 1 || idx < 0) {
  3952. return undefined;
  3953. }
  3954. var chunkOffset = idx % this.chunkSize;
  3955. var chunkNum = idx / this.chunkSize | 0;
  3956. return this.getter(chunkNum)[chunkOffset];
  3957. };
  3958. LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) {
  3959. this.getter = getter;
  3960. };
  3961. LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() {
  3962. var xhr = new XMLHttpRequest();
  3963. xhr.open("HEAD", url, false);
  3964. xhr.send(null);
  3965. if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status);
  3966. var datalength = Number(xhr.getResponseHeader("Content-length"));
  3967. var header;
  3968. var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes";
  3969. var usesGzip = (header = xhr.getResponseHeader("Content-Encoding")) && header === "gzip";
  3970. var chunkSize = 1024 * 1024;
  3971. if (!hasByteServing) chunkSize = datalength;
  3972. var doXHR = function(from, to) {
  3973. if (from > to) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!");
  3974. if (to > datalength - 1) throw new Error("only " + datalength + " bytes available! programmer error!");
  3975. var xhr = new XMLHttpRequest();
  3976. xhr.open("GET", url, false);
  3977. if (datalength !== chunkSize) xhr.setRequestHeader("Range", "bytes=" + from + "-" + to);
  3978. if (typeof Uint8Array != "undefined") xhr.responseType = "arraybuffer";
  3979. if (xhr.overrideMimeType) {
  3980. xhr.overrideMimeType("text/plain; charset=x-user-defined");
  3981. }
  3982. xhr.send(null);
  3983. if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status);
  3984. if (xhr.response !== undefined) {
  3985. return new Uint8Array(xhr.response || []);
  3986. } else {
  3987. return intArrayFromString(xhr.responseText || "", true);
  3988. }
  3989. };
  3990. var lazyArray = this;
  3991. lazyArray.setDataGetter(function(chunkNum) {
  3992. var start = chunkNum * chunkSize;
  3993. var end = (chunkNum + 1) * chunkSize - 1;
  3994. end = Math.min(end, datalength - 1);
  3995. if (typeof lazyArray.chunks[chunkNum] === "undefined") {
  3996. lazyArray.chunks[chunkNum] = doXHR(start, end);
  3997. }
  3998. if (typeof lazyArray.chunks[chunkNum] === "undefined") throw new Error("doXHR failed!");
  3999. return lazyArray.chunks[chunkNum];
  4000. });
  4001. if (usesGzip || !datalength) {
  4002. chunkSize = datalength = 1;
  4003. datalength = this.getter(0).length;
  4004. chunkSize = datalength;
  4005. console.log("LazyFiles on gzip forces download of the whole file when length is accessed");
  4006. }
  4007. this._length = datalength;
  4008. this._chunkSize = chunkSize;
  4009. this.lengthKnown = true;
  4010. };
  4011. if (typeof XMLHttpRequest !== "undefined") {
  4012. if (!ENVIRONMENT_IS_WORKER) throw "Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";
  4013. var lazyArray = new LazyUint8Array();
  4014. Object.defineProperties(lazyArray, {
  4015. length: {
  4016. get: function() {
  4017. if (!this.lengthKnown) {
  4018. this.cacheLength();
  4019. }
  4020. return this._length;
  4021. }
  4022. },
  4023. chunkSize: {
  4024. get: function() {
  4025. if (!this.lengthKnown) {
  4026. this.cacheLength();
  4027. }
  4028. return this._chunkSize;
  4029. }
  4030. }
  4031. });
  4032. var properties = {
  4033. isDevice: false,
  4034. contents: lazyArray
  4035. };
  4036. } else {
  4037. var properties = {
  4038. isDevice: false,
  4039. url: url
  4040. };
  4041. }
  4042. var node = FS.createFile(parent, name, properties, canRead, canWrite);
  4043. if (properties.contents) {
  4044. node.contents = properties.contents;
  4045. } else if (properties.url) {
  4046. node.contents = null;
  4047. node.url = properties.url;
  4048. }
  4049. Object.defineProperties(node, {
  4050. usedBytes: {
  4051. get: function() {
  4052. return this.contents.length;
  4053. }
  4054. }
  4055. });
  4056. var stream_ops = {};
  4057. var keys = Object.keys(node.stream_ops);
  4058. keys.forEach(function(key) {
  4059. var fn = node.stream_ops[key];
  4060. stream_ops[key] = function forceLoadLazyFile() {
  4061. if (!FS.forceLoadFile(node)) {
  4062. throw new FS.ErrnoError(5);
  4063. }
  4064. return fn.apply(null, arguments);
  4065. };
  4066. });
  4067. stream_ops.read = function stream_ops_read(stream, buffer, offset, length, position) {
  4068. if (!FS.forceLoadFile(node)) {
  4069. throw new FS.ErrnoError(5);
  4070. }
  4071. var contents = stream.node.contents;
  4072. if (position >= contents.length) return 0;
  4073. var size = Math.min(contents.length - position, length);
  4074. assert(size >= 0);
  4075. if (contents.slice) {
  4076. for (var i = 0; i < size; i++) {
  4077. buffer[offset + i] = contents[position + i];
  4078. }
  4079. } else {
  4080. for (var i = 0; i < size; i++) {
  4081. buffer[offset + i] = contents.get(position + i);
  4082. }
  4083. }
  4084. return size;
  4085. };
  4086. node.stream_ops = stream_ops;
  4087. return node;
  4088. },
  4089. createPreloadedFile: function(parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) {
  4090. Browser.init();
  4091. var fullname = name ? PATH.resolve(PATH.join2(parent, name)) : parent;
  4092. var dep = getUniqueRunDependency("cp " + fullname);
  4093. function processData(byteArray) {
  4094. function finish(byteArray) {
  4095. if (preFinish) preFinish();
  4096. if (!dontCreateFile) {
  4097. FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn);
  4098. }
  4099. if (onload) onload();
  4100. removeRunDependency(dep);
  4101. }
  4102. var handled = false;
  4103. Module["preloadPlugins"].forEach(function(plugin) {
  4104. if (handled) return;
  4105. if (plugin["canHandle"](fullname)) {
  4106. plugin["handle"](byteArray, fullname, finish, function() {
  4107. if (onerror) onerror();
  4108. removeRunDependency(dep);
  4109. });
  4110. handled = true;
  4111. }
  4112. });
  4113. if (!handled) finish(byteArray);
  4114. }
  4115. addRunDependency(dep);
  4116. if (typeof url == "string") {
  4117. Browser.asyncLoad(url, function(byteArray) {
  4118. processData(byteArray);
  4119. }, onerror);
  4120. } else {
  4121. processData(url);
  4122. }
  4123. },
  4124. indexedDB: function() {
  4125. return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
  4126. },
  4127. DB_NAME: function() {
  4128. return "EM_FS_" + window.location.pathname;
  4129. },
  4130. DB_VERSION: 20,
  4131. DB_STORE_NAME: "FILE_DATA",
  4132. saveFilesToDB: function(paths, onload, onerror) {
  4133. onload = onload || function() {};
  4134. onerror = onerror || function() {};
  4135. var indexedDB = FS.indexedDB();
  4136. try {
  4137. var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);
  4138. } catch (e) {
  4139. return onerror(e);
  4140. }
  4141. openRequest.onupgradeneeded = function openRequest_onupgradeneeded() {
  4142. console.log("creating db");
  4143. var db = openRequest.result;
  4144. db.createObjectStore(FS.DB_STORE_NAME);
  4145. };
  4146. openRequest.onsuccess = function openRequest_onsuccess() {
  4147. var db = openRequest.result;
  4148. var transaction = db.transaction([ FS.DB_STORE_NAME ], "readwrite");
  4149. var files = transaction.objectStore(FS.DB_STORE_NAME);
  4150. var ok = 0, fail = 0, total = paths.length;
  4151. function finish() {
  4152. if (fail == 0) onload(); else onerror();
  4153. }
  4154. paths.forEach(function(path) {
  4155. var putRequest = files.put(FS.analyzePath(path).object.contents, path);
  4156. putRequest.onsuccess = function putRequest_onsuccess() {
  4157. ok++;
  4158. if (ok + fail == total) finish();
  4159. };
  4160. putRequest.onerror = function putRequest_onerror() {
  4161. fail++;
  4162. if (ok + fail == total) finish();
  4163. };
  4164. });
  4165. transaction.onerror = onerror;
  4166. };
  4167. openRequest.onerror = onerror;
  4168. },
  4169. loadFilesFromDB: function(paths, onload, onerror) {
  4170. onload = onload || function() {};
  4171. onerror = onerror || function() {};
  4172. var indexedDB = FS.indexedDB();
  4173. try {
  4174. var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);
  4175. } catch (e) {
  4176. return onerror(e);
  4177. }
  4178. openRequest.onupgradeneeded = onerror;
  4179. openRequest.onsuccess = function openRequest_onsuccess() {
  4180. var db = openRequest.result;
  4181. try {
  4182. var transaction = db.transaction([ FS.DB_STORE_NAME ], "readonly");
  4183. } catch (e) {
  4184. onerror(e);
  4185. return;
  4186. }
  4187. var files = transaction.objectStore(FS.DB_STORE_NAME);
  4188. var ok = 0, fail = 0, total = paths.length;
  4189. function finish() {
  4190. if (fail == 0) onload(); else onerror();
  4191. }
  4192. paths.forEach(function(path) {
  4193. var getRequest = files.get(path);
  4194. getRequest.onsuccess = function getRequest_onsuccess() {
  4195. if (FS.analyzePath(path).exists) {
  4196. FS.unlink(path);
  4197. }
  4198. FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true);
  4199. ok++;
  4200. if (ok + fail == total) finish();
  4201. };
  4202. getRequest.onerror = function getRequest_onerror() {
  4203. fail++;
  4204. if (ok + fail == total) finish();
  4205. };
  4206. });
  4207. transaction.onerror = onerror;
  4208. };
  4209. openRequest.onerror = onerror;
  4210. }
  4211. };
  4212. function _emscripten_set_main_loop_timing(mode, value) {
  4213. Browser.mainLoop.timingMode = mode;
  4214. Browser.mainLoop.timingValue = value;
  4215. if (!Browser.mainLoop.func) {
  4216. return 1;
  4217. }
  4218. if (mode == 0) {
  4219. Browser.mainLoop.scheduler = function Browser_mainLoop_scheduler_setTimeout() {
  4220. var timeUntilNextTick = Math.max(0, Browser.mainLoop.tickStartTime + value - _emscripten_get_now()) | 0;
  4221. setTimeout(Browser.mainLoop.runner, timeUntilNextTick);
  4222. };
  4223. Browser.mainLoop.method = "timeout";
  4224. } else if (mode == 1) {
  4225. Browser.mainLoop.scheduler = function Browser_mainLoop_scheduler_rAF() {
  4226. Browser.requestAnimationFrame(Browser.mainLoop.runner);
  4227. };
  4228. Browser.mainLoop.method = "rAF";
  4229. } else if (mode == 2) {
  4230. if (typeof setImmediate === "undefined") {
  4231. var setImmediates = [];
  4232. var emscriptenMainLoopMessageId = "setimmediate";
  4233. var Browser_setImmediate_messageHandler = function(event) {
  4234. if (event.data === emscriptenMainLoopMessageId || event.data.target === emscriptenMainLoopMessageId) {
  4235. event.stopPropagation();
  4236. setImmediates.shift()();
  4237. }
  4238. };
  4239. addEventListener("message", Browser_setImmediate_messageHandler, true);
  4240. setImmediate = function Browser_emulated_setImmediate(func) {
  4241. setImmediates.push(func);
  4242. if (ENVIRONMENT_IS_WORKER) {
  4243. if (Module["setImmediates"] === undefined) Module["setImmediates"] = [];
  4244. Module["setImmediates"].push(func);
  4245. postMessage({
  4246. target: emscriptenMainLoopMessageId
  4247. });
  4248. } else postMessage(emscriptenMainLoopMessageId, "*");
  4249. };
  4250. }
  4251. Browser.mainLoop.scheduler = function Browser_mainLoop_scheduler_setImmediate() {
  4252. setImmediate(Browser.mainLoop.runner);
  4253. };
  4254. Browser.mainLoop.method = "immediate";
  4255. }
  4256. return 0;
  4257. }
  4258. function _emscripten_get_now() {
  4259. abort();
  4260. }
  4261. function _emscripten_set_main_loop(func, fps, simulateInfiniteLoop, arg, noSetTiming) {
  4262. Module["noExitRuntime"] = true;
  4263. assert(!Browser.mainLoop.func, "emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters.");
  4264. Browser.mainLoop.func = func;
  4265. Browser.mainLoop.arg = arg;
  4266. var browserIterationFunc;
  4267. if (typeof arg !== "undefined") {
  4268. browserIterationFunc = function() {
  4269. Module["dynCall_vi"](func, arg);
  4270. };
  4271. } else {
  4272. browserIterationFunc = function() {
  4273. Module["dynCall_v"](func);
  4274. };
  4275. }
  4276. var thisMainLoopId = Browser.mainLoop.currentlyRunningMainloop;
  4277. Browser.mainLoop.runner = function Browser_mainLoop_runner() {
  4278. if (ABORT) return;
  4279. if (Browser.mainLoop.queue.length > 0) {
  4280. var start = Date.now();
  4281. var blocker = Browser.mainLoop.queue.shift();
  4282. blocker.func(blocker.arg);
  4283. if (Browser.mainLoop.remainingBlockers) {
  4284. var remaining = Browser.mainLoop.remainingBlockers;
  4285. var next = remaining % 1 == 0 ? remaining - 1 : Math.floor(remaining);
  4286. if (blocker.counted) {
  4287. Browser.mainLoop.remainingBlockers = next;
  4288. } else {
  4289. next = next + .5;
  4290. Browser.mainLoop.remainingBlockers = (8 * remaining + next) / 9;
  4291. }
  4292. }
  4293. console.log('main loop blocker "' + blocker.name + '" took ' + (Date.now() - start) + " ms");
  4294. Browser.mainLoop.updateStatus();
  4295. if (thisMainLoopId < Browser.mainLoop.currentlyRunningMainloop) return;
  4296. setTimeout(Browser.mainLoop.runner, 0);
  4297. return;
  4298. }
  4299. if (thisMainLoopId < Browser.mainLoop.currentlyRunningMainloop) return;
  4300. Browser.mainLoop.currentFrameNumber = Browser.mainLoop.currentFrameNumber + 1 | 0;
  4301. if (Browser.mainLoop.timingMode == 1 && Browser.mainLoop.timingValue > 1 && Browser.mainLoop.currentFrameNumber % Browser.mainLoop.timingValue != 0) {
  4302. Browser.mainLoop.scheduler();
  4303. return;
  4304. } else if (Browser.mainLoop.timingMode == 0) {
  4305. Browser.mainLoop.tickStartTime = _emscripten_get_now();
  4306. }
  4307. if (Browser.mainLoop.method === "timeout" && Module.ctx) {
  4308. err("Looks like you are rendering without using requestAnimationFrame for the main loop. You should use 0 for the frame rate in emscripten_set_main_loop in order to use requestAnimationFrame, as that can greatly improve your frame rates!");
  4309. Browser.mainLoop.method = "";
  4310. }
  4311. Browser.mainLoop.runIter(browserIterationFunc);
  4312. if (thisMainLoopId < Browser.mainLoop.currentlyRunningMainloop) return;
  4313. if (typeof SDL === "object" && SDL.audio && SDL.audio.queueNewAudioData) SDL.audio.queueNewAudioData();
  4314. Browser.mainLoop.scheduler();
  4315. };
  4316. if (!noSetTiming) {
  4317. if (fps && fps > 0) _emscripten_set_main_loop_timing(0, 1e3 / fps); else _emscripten_set_main_loop_timing(1, 1);
  4318. Browser.mainLoop.scheduler();
  4319. }
  4320. if (simulateInfiniteLoop) {
  4321. throw "SimulateInfiniteLoop";
  4322. }
  4323. }
  4324. var Browser = {
  4325. mainLoop: {
  4326. scheduler: null,
  4327. method: "",
  4328. currentlyRunningMainloop: 0,
  4329. func: null,
  4330. arg: 0,
  4331. timingMode: 0,
  4332. timingValue: 0,
  4333. currentFrameNumber: 0,
  4334. queue: [],
  4335. pause: function() {
  4336. Browser.mainLoop.scheduler = null;
  4337. Browser.mainLoop.currentlyRunningMainloop++;
  4338. },
  4339. resume: function() {
  4340. Browser.mainLoop.currentlyRunningMainloop++;
  4341. var timingMode = Browser.mainLoop.timingMode;
  4342. var timingValue = Browser.mainLoop.timingValue;
  4343. var func = Browser.mainLoop.func;
  4344. Browser.mainLoop.func = null;
  4345. _emscripten_set_main_loop(func, 0, false, Browser.mainLoop.arg, true);
  4346. _emscripten_set_main_loop_timing(timingMode, timingValue);
  4347. Browser.mainLoop.scheduler();
  4348. },
  4349. updateStatus: function() {
  4350. if (Module["setStatus"]) {
  4351. var message = Module["statusMessage"] || "Please wait...";
  4352. var remaining = Browser.mainLoop.remainingBlockers;
  4353. var expected = Browser.mainLoop.expectedBlockers;
  4354. if (remaining) {
  4355. if (remaining < expected) {
  4356. Module["setStatus"](message + " (" + (expected - remaining) + "/" + expected + ")");
  4357. } else {
  4358. Module["setStatus"](message);
  4359. }
  4360. } else {
  4361. Module["setStatus"]("");
  4362. }
  4363. }
  4364. },
  4365. runIter: function(func) {
  4366. if (ABORT) return;
  4367. if (Module["preMainLoop"]) {
  4368. var preRet = Module["preMainLoop"]();
  4369. if (preRet === false) {
  4370. return;
  4371. }
  4372. }
  4373. try {
  4374. func();
  4375. } catch (e) {
  4376. if (e instanceof ExitStatus) {
  4377. return;
  4378. } else {
  4379. if (e && typeof e === "object" && e.stack) err("exception thrown: " + [ e, e.stack ]);
  4380. throw e;
  4381. }
  4382. }
  4383. if (Module["postMainLoop"]) Module["postMainLoop"]();
  4384. }
  4385. },
  4386. isFullscreen: false,
  4387. pointerLock: false,
  4388. moduleContextCreatedCallbacks: [],
  4389. workers: [],
  4390. init: function() {
  4391. if (!Module["preloadPlugins"]) Module["preloadPlugins"] = [];
  4392. if (Browser.initted) return;
  4393. Browser.initted = true;
  4394. try {
  4395. new Blob();
  4396. Browser.hasBlobConstructor = true;
  4397. } catch (e) {
  4398. Browser.hasBlobConstructor = false;
  4399. console.log("warning: no blob constructor, cannot create blobs with mimetypes");
  4400. }
  4401. Browser.BlobBuilder = typeof MozBlobBuilder != "undefined" ? MozBlobBuilder : typeof WebKitBlobBuilder != "undefined" ? WebKitBlobBuilder : !Browser.hasBlobConstructor ? console.log("warning: no BlobBuilder") : null;
  4402. Browser.URLObject = typeof window != "undefined" ? window.URL ? window.URL : window.webkitURL : undefined;
  4403. if (!Module.noImageDecoding && typeof Browser.URLObject === "undefined") {
  4404. console.log("warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available.");
  4405. Module.noImageDecoding = true;
  4406. }
  4407. var imagePlugin = {};
  4408. imagePlugin["canHandle"] = function imagePlugin_canHandle(name) {
  4409. return !Module.noImageDecoding && /\.(jpg|jpeg|png|bmp)$/i.test(name);
  4410. };
  4411. imagePlugin["handle"] = function imagePlugin_handle(byteArray, name, onload, onerror) {
  4412. var b = null;
  4413. if (Browser.hasBlobConstructor) {
  4414. try {
  4415. b = new Blob([ byteArray ], {
  4416. type: Browser.getMimetype(name)
  4417. });
  4418. if (b.size !== byteArray.length) {
  4419. b = new Blob([ new Uint8Array(byteArray).buffer ], {
  4420. type: Browser.getMimetype(name)
  4421. });
  4422. }
  4423. } catch (e) {
  4424. warnOnce("Blob constructor present but fails: " + e + "; falling back to blob builder");
  4425. }
  4426. }
  4427. if (!b) {
  4428. var bb = new Browser.BlobBuilder();
  4429. bb.append(new Uint8Array(byteArray).buffer);
  4430. b = bb.getBlob();
  4431. }
  4432. var url = Browser.URLObject.createObjectURL(b);
  4433. var img = new Image();
  4434. img.onload = function img_onload() {
  4435. assert(img.complete, "Image " + name + " could not be decoded");
  4436. var canvas = document.createElement("canvas");
  4437. canvas.width = img.width;
  4438. canvas.height = img.height;
  4439. var ctx = canvas.getContext("2d");
  4440. ctx.drawImage(img, 0, 0);
  4441. Module["preloadedImages"][name] = canvas;
  4442. Browser.URLObject.revokeObjectURL(url);
  4443. if (onload) onload(byteArray);
  4444. };
  4445. img.onerror = function img_onerror(event) {
  4446. console.log("Image " + url + " could not be decoded");
  4447. if (onerror) onerror();
  4448. };
  4449. img.src = url;
  4450. };
  4451. Module["preloadPlugins"].push(imagePlugin);
  4452. var audioPlugin = {};
  4453. audioPlugin["canHandle"] = function audioPlugin_canHandle(name) {
  4454. return !Module.noAudioDecoding && name.substr(-4) in {
  4455. ".ogg": 1,
  4456. ".wav": 1,
  4457. ".mp3": 1
  4458. };
  4459. };
  4460. audioPlugin["handle"] = function audioPlugin_handle(byteArray, name, onload, onerror) {
  4461. var done = false;
  4462. function finish(audio) {
  4463. if (done) return;
  4464. done = true;
  4465. Module["preloadedAudios"][name] = audio;
  4466. if (onload) onload(byteArray);
  4467. }
  4468. function fail() {
  4469. if (done) return;
  4470. done = true;
  4471. Module["preloadedAudios"][name] = new Audio();
  4472. if (onerror) onerror();
  4473. }
  4474. if (Browser.hasBlobConstructor) {
  4475. try {
  4476. var b = new Blob([ byteArray ], {
  4477. type: Browser.getMimetype(name)
  4478. });
  4479. } catch (e) {
  4480. return fail();
  4481. }
  4482. var url = Browser.URLObject.createObjectURL(b);
  4483. var audio = new Audio();
  4484. audio.addEventListener("canplaythrough", function() {
  4485. finish(audio);
  4486. }, false);
  4487. audio.onerror = function audio_onerror(event) {
  4488. if (done) return;
  4489. console.log("warning: browser could not fully decode audio " + name + ", trying slower base64 approach");
  4490. function encode64(data) {
  4491. var BASE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  4492. var PAD = "=";
  4493. var ret = "";
  4494. var leftchar = 0;
  4495. var leftbits = 0;
  4496. for (var i = 0; i < data.length; i++) {
  4497. leftchar = leftchar << 8 | data[i];
  4498. leftbits += 8;
  4499. while (leftbits >= 6) {
  4500. var curr = leftchar >> leftbits - 6 & 63;
  4501. leftbits -= 6;
  4502. ret += BASE[curr];
  4503. }
  4504. }
  4505. if (leftbits == 2) {
  4506. ret += BASE[(leftchar & 3) << 4];
  4507. ret += PAD + PAD;
  4508. } else if (leftbits == 4) {
  4509. ret += BASE[(leftchar & 15) << 2];
  4510. ret += PAD;
  4511. }
  4512. return ret;
  4513. }
  4514. audio.src = "data:audio/x-" + name.substr(-3) + ";base64," + encode64(byteArray);
  4515. finish(audio);
  4516. };
  4517. audio.src = url;
  4518. Browser.safeSetTimeout(function() {
  4519. finish(audio);
  4520. }, 1e4);
  4521. } else {
  4522. return fail();
  4523. }
  4524. };
  4525. Module["preloadPlugins"].push(audioPlugin);
  4526. function pointerLockChange() {
  4527. Browser.pointerLock = document["pointerLockElement"] === Module["canvas"] || document["mozPointerLockElement"] === Module["canvas"] || document["webkitPointerLockElement"] === Module["canvas"] || document["msPointerLockElement"] === Module["canvas"];
  4528. }
  4529. var canvas = Module["canvas"];
  4530. if (canvas) {
  4531. canvas.requestPointerLock = canvas["requestPointerLock"] || canvas["mozRequestPointerLock"] || canvas["webkitRequestPointerLock"] || canvas["msRequestPointerLock"] || function() {};
  4532. canvas.exitPointerLock = document["exitPointerLock"] || document["mozExitPointerLock"] || document["webkitExitPointerLock"] || document["msExitPointerLock"] || function() {};
  4533. canvas.exitPointerLock = canvas.exitPointerLock.bind(document);
  4534. document.addEventListener("pointerlockchange", pointerLockChange, false);
  4535. document.addEventListener("mozpointerlockchange", pointerLockChange, false);
  4536. document.addEventListener("webkitpointerlockchange", pointerLockChange, false);
  4537. document.addEventListener("mspointerlockchange", pointerLockChange, false);
  4538. if (Module["elementPointerLock"]) {
  4539. canvas.addEventListener("click", function(ev) {
  4540. if (!Browser.pointerLock && Module["canvas"].requestPointerLock) {
  4541. Module["canvas"].requestPointerLock();
  4542. ev.preventDefault();
  4543. }
  4544. }, false);
  4545. }
  4546. }
  4547. },
  4548. createContext: function(canvas, useWebGL, setInModule, webGLContextAttributes) {
  4549. if (useWebGL && Module.ctx && canvas == Module.canvas) return Module.ctx;
  4550. var ctx;
  4551. var contextHandle;
  4552. if (useWebGL) {
  4553. var contextAttributes = {
  4554. antialias: false,
  4555. alpha: false,
  4556. majorVersion: 1
  4557. };
  4558. if (webGLContextAttributes) {
  4559. for (var attribute in webGLContextAttributes) {
  4560. contextAttributes[attribute] = webGLContextAttributes[attribute];
  4561. }
  4562. }
  4563. if (typeof GL !== "undefined") {
  4564. contextHandle = GL.createContext(canvas, contextAttributes);
  4565. if (contextHandle) {
  4566. ctx = GL.getContext(contextHandle).GLctx;
  4567. }
  4568. }
  4569. } else {
  4570. ctx = canvas.getContext("2d");
  4571. }
  4572. if (!ctx) return null;
  4573. if (setInModule) {
  4574. if (!useWebGL) assert(typeof GLctx === "undefined", "cannot set in module if GLctx is used, but we are a non-GL context that would replace it");
  4575. Module.ctx = ctx;
  4576. if (useWebGL) GL.makeContextCurrent(contextHandle);
  4577. Module.useWebGL = useWebGL;
  4578. Browser.moduleContextCreatedCallbacks.forEach(function(callback) {
  4579. callback();
  4580. });
  4581. Browser.init();
  4582. }
  4583. return ctx;
  4584. },
  4585. destroyContext: function(canvas, useWebGL, setInModule) {},
  4586. fullscreenHandlersInstalled: false,
  4587. lockPointer: undefined,
  4588. resizeCanvas: undefined,
  4589. requestFullscreen: function(lockPointer, resizeCanvas, vrDevice) {
  4590. lockPointer = false;
  4591. console.log("forcing lockPointer to false");
  4592. Browser.lockPointer = lockPointer;
  4593. Browser.resizeCanvas = resizeCanvas;
  4594. Browser.vrDevice = vrDevice;
  4595. if (typeof Browser.lockPointer === "undefined") Browser.lockPointer = false;
  4596. if (typeof Browser.resizeCanvas === "undefined") Browser.resizeCanvas = false;
  4597. if (typeof Browser.vrDevice === "undefined") Browser.vrDevice = null;
  4598. var canvas = Module["canvas"];
  4599. function fullscreenChange() {
  4600. Browser.isFullscreen = false;
  4601. var canvasContainer = canvas.parentNode;
  4602. if ((document["fullscreenElement"] || document["mozFullScreenElement"] || document["msFullscreenElement"] || document["webkitFullscreenElement"] || document["webkitCurrentFullScreenElement"]) === canvasContainer) {
  4603. canvas.exitFullscreen = document["exitFullscreen"] || document["cancelFullScreen"] || document["mozCancelFullScreen"] || document["msExitFullscreen"] || document["webkitCancelFullScreen"] || function() {};
  4604. canvas.exitFullscreen = canvas.exitFullscreen.bind(document);
  4605. Browser.isFullscreen = true;
  4606. if (Browser.resizeCanvas) {
  4607. Browser.setFullscreenCanvasSize();
  4608. } else {
  4609. Browser.updateCanvasDimensions(canvas);
  4610. }
  4611. } else {
  4612. canvasContainer.parentNode.insertBefore(canvas, canvasContainer);
  4613. canvasContainer.parentNode.removeChild(canvasContainer);
  4614. if (Browser.resizeCanvas) {
  4615. Browser.setWindowedCanvasSize();
  4616. } else {
  4617. Browser.updateCanvasDimensions(canvas);
  4618. }
  4619. }
  4620. if (Module["onFullScreen"]) Module["onFullScreen"](Browser.isFullscreen);
  4621. if (Module["onFullscreen"]) Module["onFullscreen"](Browser.isFullscreen);
  4622. }
  4623. if (!Browser.fullscreenHandlersInstalled) {
  4624. Browser.fullscreenHandlersInstalled = true;
  4625. document.addEventListener("fullscreenchange", fullscreenChange, false);
  4626. document.addEventListener("mozfullscreenchange", fullscreenChange, false);
  4627. document.addEventListener("webkitfullscreenchange", fullscreenChange, false);
  4628. document.addEventListener("MSFullscreenChange", fullscreenChange, false);
  4629. }
  4630. var canvasContainer = document.createElement("div");
  4631. canvas.parentNode.insertBefore(canvasContainer, canvas);
  4632. canvasContainer.appendChild(canvas);
  4633. canvasContainer.requestFullscreen = canvasContainer["requestFullscreen"] || canvasContainer["mozRequestFullScreen"] || canvasContainer["msRequestFullscreen"] || (canvasContainer["webkitRequestFullscreen"] ? function() {
  4634. canvasContainer["webkitRequestFullscreen"](Element["ALLOW_KEYBOARD_INPUT"]);
  4635. } : null) || (canvasContainer["webkitRequestFullScreen"] ? function() {
  4636. canvasContainer["webkitRequestFullScreen"](Element["ALLOW_KEYBOARD_INPUT"]);
  4637. } : null);
  4638. if (vrDevice) {
  4639. canvasContainer.requestFullscreen({
  4640. vrDisplay: vrDevice
  4641. });
  4642. } else {
  4643. canvasContainer.requestFullscreen();
  4644. }
  4645. },
  4646. requestFullScreen: function(lockPointer, resizeCanvas, vrDevice) {
  4647. err("Browser.requestFullScreen() is deprecated. Please call Browser.requestFullscreen instead.");
  4648. Browser.requestFullScreen = function(lockPointer, resizeCanvas, vrDevice) {
  4649. return Browser.requestFullscreen(lockPointer, resizeCanvas, vrDevice);
  4650. };
  4651. return Browser.requestFullscreen(lockPointer, resizeCanvas, vrDevice);
  4652. },
  4653. nextRAF: 0,
  4654. fakeRequestAnimationFrame: function(func) {
  4655. var now = Date.now();
  4656. if (Browser.nextRAF === 0) {
  4657. Browser.nextRAF = now + 1e3 / 60;
  4658. } else {
  4659. while (now + 2 >= Browser.nextRAF) {
  4660. Browser.nextRAF += 1e3 / 60;
  4661. }
  4662. }
  4663. var delay = Math.max(Browser.nextRAF - now, 0);
  4664. setTimeout(func, delay);
  4665. },
  4666. requestAnimationFrame: function requestAnimationFrame(func) {
  4667. if (typeof window === "undefined") {
  4668. Browser.fakeRequestAnimationFrame(func);
  4669. } else {
  4670. if (!window.requestAnimationFrame) {
  4671. window.requestAnimationFrame = window["requestAnimationFrame"] || window["mozRequestAnimationFrame"] || window["webkitRequestAnimationFrame"] || window["msRequestAnimationFrame"] || window["oRequestAnimationFrame"] || Browser.fakeRequestAnimationFrame;
  4672. }
  4673. window.requestAnimationFrame(func);
  4674. }
  4675. },
  4676. safeCallback: function(func) {
  4677. return function() {
  4678. if (!ABORT) return func.apply(null, arguments);
  4679. };
  4680. },
  4681. allowAsyncCallbacks: true,
  4682. queuedAsyncCallbacks: [],
  4683. pauseAsyncCallbacks: function() {
  4684. Browser.allowAsyncCallbacks = false;
  4685. },
  4686. resumeAsyncCallbacks: function() {
  4687. Browser.allowAsyncCallbacks = true;
  4688. if (Browser.queuedAsyncCallbacks.length > 0) {
  4689. var callbacks = Browser.queuedAsyncCallbacks;
  4690. Browser.queuedAsyncCallbacks = [];
  4691. callbacks.forEach(function(func) {
  4692. func();
  4693. });
  4694. }
  4695. },
  4696. safeRequestAnimationFrame: function(func) {
  4697. return Browser.requestAnimationFrame(function() {
  4698. if (ABORT) return;
  4699. if (Browser.allowAsyncCallbacks) {
  4700. func();
  4701. } else {
  4702. Browser.queuedAsyncCallbacks.push(func);
  4703. }
  4704. });
  4705. },
  4706. safeSetTimeout: function(func, timeout) {
  4707. Module["noExitRuntime"] = true;
  4708. return setTimeout(function() {
  4709. if (ABORT) return;
  4710. if (Browser.allowAsyncCallbacks) {
  4711. func();
  4712. } else {
  4713. Browser.queuedAsyncCallbacks.push(func);
  4714. }
  4715. }, timeout);
  4716. },
  4717. safeSetInterval: function(func, timeout) {
  4718. Module["noExitRuntime"] = true;
  4719. return setInterval(function() {
  4720. if (ABORT) return;
  4721. if (Browser.allowAsyncCallbacks) {
  4722. func();
  4723. }
  4724. }, timeout);
  4725. },
  4726. getMimetype: function(name) {
  4727. return {
  4728. "jpg": "image/jpeg",
  4729. "jpeg": "image/jpeg",
  4730. "png": "image/png",
  4731. "bmp": "image/bmp",
  4732. "ogg": "audio/ogg",
  4733. "wav": "audio/wav",
  4734. "mp3": "audio/mpeg"
  4735. }[name.substr(name.lastIndexOf(".") + 1)];
  4736. },
  4737. getUserMedia: function(func) {
  4738. if (!window.getUserMedia) {
  4739. window.getUserMedia = navigator["getUserMedia"] || navigator["mozGetUserMedia"];
  4740. }
  4741. window.getUserMedia(func);
  4742. },
  4743. getMovementX: function(event) {
  4744. return event["movementX"] || event["mozMovementX"] || event["webkitMovementX"] || 0;
  4745. },
  4746. getMovementY: function(event) {
  4747. return event["movementY"] || event["mozMovementY"] || event["webkitMovementY"] || 0;
  4748. },
  4749. getMouseWheelDelta: function(event) {
  4750. var delta = 0;
  4751. switch (event.type) {
  4752. case "DOMMouseScroll":
  4753. delta = event.detail;
  4754. break;
  4755. case "mousewheel":
  4756. delta = event.wheelDelta;
  4757. break;
  4758. case "wheel":
  4759. delta = event["deltaY"];
  4760. break;
  4761. default:
  4762. throw "unrecognized mouse wheel event: " + event.type;
  4763. }
  4764. return delta;
  4765. },
  4766. mouseX: 0,
  4767. mouseY: 0,
  4768. mouseMovementX: 0,
  4769. mouseMovementY: 0,
  4770. touches: {},
  4771. lastTouches: {},
  4772. calculateMouseEvent: function(event) {
  4773. if (Browser.pointerLock) {
  4774. if (event.type != "mousemove" && "mozMovementX" in event) {
  4775. Browser.mouseMovementX = Browser.mouseMovementY = 0;
  4776. } else {
  4777. Browser.mouseMovementX = Browser.getMovementX(event);
  4778. Browser.mouseMovementY = Browser.getMovementY(event);
  4779. }
  4780. if (typeof SDL != "undefined") {
  4781. Browser.mouseX = SDL.mouseX + Browser.mouseMovementX;
  4782. Browser.mouseY = SDL.mouseY + Browser.mouseMovementY;
  4783. } else {
  4784. Browser.mouseX += Browser.mouseMovementX;
  4785. Browser.mouseY += Browser.mouseMovementY;
  4786. }
  4787. } else {
  4788. var rect = Module["canvas"].getBoundingClientRect();
  4789. var cw = Module["canvas"].width;
  4790. var ch = Module["canvas"].height;
  4791. var scrollX = typeof window.scrollX !== "undefined" ? window.scrollX : window.pageXOffset;
  4792. var scrollY = typeof window.scrollY !== "undefined" ? window.scrollY : window.pageYOffset;
  4793. if (event.type === "touchstart" || event.type === "touchend" || event.type === "touchmove") {
  4794. var touch = event.touch;
  4795. if (touch === undefined) {
  4796. return;
  4797. }
  4798. var adjustedX = touch.pageX - (scrollX + rect.left);
  4799. var adjustedY = touch.pageY - (scrollY + rect.top);
  4800. adjustedX = adjustedX * (cw / rect.width);
  4801. adjustedY = adjustedY * (ch / rect.height);
  4802. var coords = {
  4803. x: adjustedX,
  4804. y: adjustedY
  4805. };
  4806. if (event.type === "touchstart") {
  4807. Browser.lastTouches[touch.identifier] = coords;
  4808. Browser.touches[touch.identifier] = coords;
  4809. } else if (event.type === "touchend" || event.type === "touchmove") {
  4810. var last = Browser.touches[touch.identifier];
  4811. if (!last) last = coords;
  4812. Browser.lastTouches[touch.identifier] = last;
  4813. Browser.touches[touch.identifier] = coords;
  4814. }
  4815. return;
  4816. }
  4817. var x = event.pageX - (scrollX + rect.left);
  4818. var y = event.pageY - (scrollY + rect.top);
  4819. x = x * (cw / rect.width);
  4820. y = y * (ch / rect.height);
  4821. Browser.mouseMovementX = x - Browser.mouseX;
  4822. Browser.mouseMovementY = y - Browser.mouseY;
  4823. Browser.mouseX = x;
  4824. Browser.mouseY = y;
  4825. }
  4826. },
  4827. asyncLoad: function(url, onload, onerror, noRunDep) {
  4828. var dep = !noRunDep ? getUniqueRunDependency("al " + url) : "";
  4829. Module["readAsync"](url, function(arrayBuffer) {
  4830. assert(arrayBuffer, 'Loading data file "' + url + '" failed (no arrayBuffer).');
  4831. onload(new Uint8Array(arrayBuffer));
  4832. if (dep) removeRunDependency(dep);
  4833. }, function(event) {
  4834. if (onerror) {
  4835. onerror();
  4836. } else {
  4837. throw 'Loading data file "' + url + '" failed.';
  4838. }
  4839. });
  4840. if (dep) addRunDependency(dep);
  4841. },
  4842. resizeListeners: [],
  4843. updateResizeListeners: function() {
  4844. var canvas = Module["canvas"];
  4845. Browser.resizeListeners.forEach(function(listener) {
  4846. listener(canvas.width, canvas.height);
  4847. });
  4848. },
  4849. setCanvasSize: function(width, height, noUpdates) {
  4850. var canvas = Module["canvas"];
  4851. Browser.updateCanvasDimensions(canvas, width, height);
  4852. if (!noUpdates) Browser.updateResizeListeners();
  4853. },
  4854. windowedWidth: 0,
  4855. windowedHeight: 0,
  4856. setFullscreenCanvasSize: function() {
  4857. if (typeof SDL != "undefined") {
  4858. var flags = HEAPU32[SDL.screen >> 2];
  4859. flags = flags | 8388608;
  4860. HEAP32[SDL.screen >> 2] = flags;
  4861. }
  4862. Browser.updateCanvasDimensions(Module["canvas"]);
  4863. Browser.updateResizeListeners();
  4864. },
  4865. setWindowedCanvasSize: function() {
  4866. if (typeof SDL != "undefined") {
  4867. var flags = HEAPU32[SDL.screen >> 2];
  4868. flags = flags & ~8388608;
  4869. HEAP32[SDL.screen >> 2] = flags;
  4870. }
  4871. Browser.updateCanvasDimensions(Module["canvas"]);
  4872. Browser.updateResizeListeners();
  4873. },
  4874. updateCanvasDimensions: function(canvas, wNative, hNative) {
  4875. if (wNative && hNative) {
  4876. canvas.widthNative = wNative;
  4877. canvas.heightNative = hNative;
  4878. } else {
  4879. wNative = canvas.widthNative;
  4880. hNative = canvas.heightNative;
  4881. }
  4882. var w = wNative;
  4883. var h = hNative;
  4884. if (Module["forcedAspectRatio"] && Module["forcedAspectRatio"] > 0) {
  4885. if (w / h < Module["forcedAspectRatio"]) {
  4886. w = Math.round(h * Module["forcedAspectRatio"]);
  4887. } else {
  4888. h = Math.round(w / Module["forcedAspectRatio"]);
  4889. }
  4890. }
  4891. if ((document["fullscreenElement"] || document["mozFullScreenElement"] || document["msFullscreenElement"] || document["webkitFullscreenElement"] || document["webkitCurrentFullScreenElement"]) === canvas.parentNode && typeof screen != "undefined") {
  4892. var factor = Math.min(screen.width / w, screen.height / h);
  4893. w = Math.round(w * factor);
  4894. h = Math.round(h * factor);
  4895. }
  4896. if (Browser.resizeCanvas) {
  4897. if (canvas.width != w) canvas.width = w;
  4898. if (canvas.height != h) canvas.height = h;
  4899. if (typeof canvas.style != "undefined") {
  4900. canvas.style.removeProperty("width");
  4901. canvas.style.removeProperty("height");
  4902. }
  4903. } else {
  4904. if (canvas.width != wNative) canvas.width = wNative;
  4905. if (canvas.height != hNative) canvas.height = hNative;
  4906. if (typeof canvas.style != "undefined") {
  4907. if (w != wNative || h != hNative) {
  4908. canvas.style.setProperty("width", w + "px", "important");
  4909. canvas.style.setProperty("height", h + "px", "important");
  4910. } else {
  4911. canvas.style.removeProperty("width");
  4912. canvas.style.removeProperty("height");
  4913. }
  4914. }
  4915. }
  4916. },
  4917. wgetRequests: {},
  4918. nextWgetRequestHandle: 0,
  4919. getNextWgetRequestHandle: function() {
  4920. var handle = Browser.nextWgetRequestHandle;
  4921. Browser.nextWgetRequestHandle++;
  4922. return handle;
  4923. }
  4924. };
  4925. function _SDL_GetTicks() {
  4926. return Date.now() - SDL.startTime | 0;
  4927. }
  4928. function _SDL_LockSurface(surf) {
  4929. var surfData = SDL.surfaces[surf];
  4930. surfData.locked++;
  4931. if (surfData.locked > 1) return 0;
  4932. if (!surfData.buffer) {
  4933. surfData.buffer = _malloc(surfData.width * surfData.height * 4);
  4934. HEAP32[surf + 20 >> 2] = surfData.buffer;
  4935. }
  4936. HEAP32[surf + 20 >> 2] = surfData.buffer;
  4937. if (surf == SDL.screen && Module.screenIsReadOnly && surfData.image) return 0;
  4938. if (SDL.defaults.discardOnLock) {
  4939. if (!surfData.image) {
  4940. surfData.image = surfData.ctx.createImageData(surfData.width, surfData.height);
  4941. }
  4942. if (!SDL.defaults.opaqueFrontBuffer) return;
  4943. } else {
  4944. surfData.image = surfData.ctx.getImageData(0, 0, surfData.width, surfData.height);
  4945. }
  4946. if (surf == SDL.screen && SDL.defaults.opaqueFrontBuffer) {
  4947. var data = surfData.image.data;
  4948. var num = data.length;
  4949. for (var i = 0; i < num / 4; i++) {
  4950. data[i * 4 + 3] = 255;
  4951. }
  4952. }
  4953. if (SDL.defaults.copyOnLock && !SDL.defaults.discardOnLock) {
  4954. if (surfData.isFlagSet(2097152)) {
  4955. throw "CopyOnLock is not supported for SDL_LockSurface with SDL_HWPALETTE flag set" + new Error().stack;
  4956. } else {
  4957. HEAPU8.set(surfData.image.data, surfData.buffer);
  4958. }
  4959. }
  4960. return 0;
  4961. }
  4962. var SDL = {
  4963. defaults: {
  4964. width: 320,
  4965. height: 200,
  4966. copyOnLock: false,
  4967. discardOnLock: true,
  4968. opaqueFrontBuffer: false
  4969. },
  4970. version: null,
  4971. surfaces: {},
  4972. canvasPool: [],
  4973. events: [],
  4974. fonts: [ null ],
  4975. audios: [ null ],
  4976. rwops: [ null ],
  4977. music: {
  4978. audio: null,
  4979. volume: 1
  4980. },
  4981. mixerFrequency: 22050,
  4982. mixerFormat: 32784,
  4983. mixerNumChannels: 2,
  4984. mixerChunkSize: 1024,
  4985. channelMinimumNumber: 0,
  4986. GL: false,
  4987. glAttributes: {
  4988. 0: 3,
  4989. 1: 3,
  4990. 2: 2,
  4991. 3: 0,
  4992. 4: 0,
  4993. 5: 1,
  4994. 6: 16,
  4995. 7: 0,
  4996. 8: 0,
  4997. 9: 0,
  4998. 10: 0,
  4999. 11: 0,
  5000. 12: 0,
  5001. 13: 0,
  5002. 14: 0,
  5003. 15: 1,
  5004. 16: 0,
  5005. 17: 0,
  5006. 18: 0
  5007. },
  5008. keyboardState: null,
  5009. keyboardMap: {},
  5010. canRequestFullscreen: false,
  5011. isRequestingFullscreen: false,
  5012. textInput: false,
  5013. startTime: null,
  5014. initFlags: 0,
  5015. buttonState: 0,
  5016. modState: 0,
  5017. DOMButtons: [ 0, 0, 0 ],
  5018. DOMEventToSDLEvent: {},
  5019. TOUCH_DEFAULT_ID: 0,
  5020. eventHandler: null,
  5021. eventHandlerContext: null,
  5022. eventHandlerTemp: 0,
  5023. keyCodes: {
  5024. 16: 1249,
  5025. 17: 1248,
  5026. 18: 1250,
  5027. 20: 1081,
  5028. 33: 1099,
  5029. 34: 1102,
  5030. 35: 1101,
  5031. 36: 1098,
  5032. 37: 1104,
  5033. 38: 1106,
  5034. 39: 1103,
  5035. 40: 1105,
  5036. 44: 316,
  5037. 45: 1097,
  5038. 46: 127,
  5039. 91: 1251,
  5040. 93: 1125,
  5041. 96: 1122,
  5042. 97: 1113,
  5043. 98: 1114,
  5044. 99: 1115,
  5045. 100: 1116,
  5046. 101: 1117,
  5047. 102: 1118,
  5048. 103: 1119,
  5049. 104: 1120,
  5050. 105: 1121,
  5051. 106: 1109,
  5052. 107: 1111,
  5053. 109: 1110,
  5054. 110: 1123,
  5055. 111: 1108,
  5056. 112: 1082,
  5057. 113: 1083,
  5058. 114: 1084,
  5059. 115: 1085,
  5060. 116: 1086,
  5061. 117: 1087,
  5062. 118: 1088,
  5063. 119: 1089,
  5064. 120: 1090,
  5065. 121: 1091,
  5066. 122: 1092,
  5067. 123: 1093,
  5068. 124: 1128,
  5069. 125: 1129,
  5070. 126: 1130,
  5071. 127: 1131,
  5072. 128: 1132,
  5073. 129: 1133,
  5074. 130: 1134,
  5075. 131: 1135,
  5076. 132: 1136,
  5077. 133: 1137,
  5078. 134: 1138,
  5079. 135: 1139,
  5080. 144: 1107,
  5081. 160: 94,
  5082. 161: 33,
  5083. 162: 34,
  5084. 163: 35,
  5085. 164: 36,
  5086. 165: 37,
  5087. 166: 38,
  5088. 167: 95,
  5089. 168: 40,
  5090. 169: 41,
  5091. 170: 42,
  5092. 171: 43,
  5093. 172: 124,
  5094. 173: 45,
  5095. 174: 123,
  5096. 175: 125,
  5097. 176: 126,
  5098. 181: 127,
  5099. 182: 129,
  5100. 183: 128,
  5101. 188: 44,
  5102. 190: 46,
  5103. 191: 47,
  5104. 192: 96,
  5105. 219: 91,
  5106. 220: 92,
  5107. 221: 93,
  5108. 222: 39,
  5109. 224: 1251
  5110. },
  5111. scanCodes: {
  5112. 8: 42,
  5113. 9: 43,
  5114. 13: 40,
  5115. 27: 41,
  5116. 32: 44,
  5117. 35: 204,
  5118. 39: 53,
  5119. 44: 54,
  5120. 46: 55,
  5121. 47: 56,
  5122. 48: 39,
  5123. 49: 30,
  5124. 50: 31,
  5125. 51: 32,
  5126. 52: 33,
  5127. 53: 34,
  5128. 54: 35,
  5129. 55: 36,
  5130. 56: 37,
  5131. 57: 38,
  5132. 58: 203,
  5133. 59: 51,
  5134. 61: 46,
  5135. 91: 47,
  5136. 92: 49,
  5137. 93: 48,
  5138. 96: 52,
  5139. 97: 4,
  5140. 98: 5,
  5141. 99: 6,
  5142. 100: 7,
  5143. 101: 8,
  5144. 102: 9,
  5145. 103: 10,
  5146. 104: 11,
  5147. 105: 12,
  5148. 106: 13,
  5149. 107: 14,
  5150. 108: 15,
  5151. 109: 16,
  5152. 110: 17,
  5153. 111: 18,
  5154. 112: 19,
  5155. 113: 20,
  5156. 114: 21,
  5157. 115: 22,
  5158. 116: 23,
  5159. 117: 24,
  5160. 118: 25,
  5161. 119: 26,
  5162. 120: 27,
  5163. 121: 28,
  5164. 122: 29,
  5165. 127: 76,
  5166. 305: 224,
  5167. 308: 226,
  5168. 316: 70
  5169. },
  5170. loadRect: function(rect) {
  5171. return {
  5172. x: HEAP32[rect + 0 >> 2],
  5173. y: HEAP32[rect + 4 >> 2],
  5174. w: HEAP32[rect + 8 >> 2],
  5175. h: HEAP32[rect + 12 >> 2]
  5176. };
  5177. },
  5178. updateRect: function(rect, r) {
  5179. HEAP32[rect >> 2] = r.x;
  5180. HEAP32[rect + 4 >> 2] = r.y;
  5181. HEAP32[rect + 8 >> 2] = r.w;
  5182. HEAP32[rect + 12 >> 2] = r.h;
  5183. },
  5184. intersectionOfRects: function(first, second) {
  5185. var leftX = Math.max(first.x, second.x);
  5186. var leftY = Math.max(first.y, second.y);
  5187. var rightX = Math.min(first.x + first.w, second.x + second.w);
  5188. var rightY = Math.min(first.y + first.h, second.y + second.h);
  5189. return {
  5190. x: leftX,
  5191. y: leftY,
  5192. w: Math.max(leftX, rightX) - leftX,
  5193. h: Math.max(leftY, rightY) - leftY
  5194. };
  5195. },
  5196. checkPixelFormat: function(fmt) {},
  5197. loadColorToCSSRGB: function(color) {
  5198. var rgba = HEAP32[color >> 2];
  5199. return "rgb(" + (rgba & 255) + "," + (rgba >> 8 & 255) + "," + (rgba >> 16 & 255) + ")";
  5200. },
  5201. loadColorToCSSRGBA: function(color) {
  5202. var rgba = HEAP32[color >> 2];
  5203. return "rgba(" + (rgba & 255) + "," + (rgba >> 8 & 255) + "," + (rgba >> 16 & 255) + "," + (rgba >> 24 & 255) / 255 + ")";
  5204. },
  5205. translateColorToCSSRGBA: function(rgba) {
  5206. return "rgba(" + (rgba & 255) + "," + (rgba >> 8 & 255) + "," + (rgba >> 16 & 255) + "," + (rgba >>> 24) / 255 + ")";
  5207. },
  5208. translateRGBAToCSSRGBA: function(r, g, b, a) {
  5209. return "rgba(" + (r & 255) + "," + (g & 255) + "," + (b & 255) + "," + (a & 255) / 255 + ")";
  5210. },
  5211. translateRGBAToColor: function(r, g, b, a) {
  5212. return r | g << 8 | b << 16 | a << 24;
  5213. },
  5214. makeSurface: function(width, height, flags, usePageCanvas, source, rmask, gmask, bmask, amask) {
  5215. flags = flags || 0;
  5216. var is_SDL_HWSURFACE = flags & 1;
  5217. var is_SDL_HWPALETTE = flags & 2097152;
  5218. var is_SDL_OPENGL = flags & 67108864;
  5219. var surf = _malloc(60);
  5220. var pixelFormat = _malloc(44);
  5221. var bpp = is_SDL_HWPALETTE ? 1 : 4;
  5222. var buffer = 0;
  5223. if (!is_SDL_HWSURFACE && !is_SDL_OPENGL) {
  5224. buffer = _malloc(width * height * 4);
  5225. }
  5226. HEAP32[surf >> 2] = flags;
  5227. HEAP32[surf + 4 >> 2] = pixelFormat;
  5228. HEAP32[surf + 8 >> 2] = width;
  5229. HEAP32[surf + 12 >> 2] = height;
  5230. HEAP32[surf + 16 >> 2] = width * bpp;
  5231. HEAP32[surf + 20 >> 2] = buffer;
  5232. HEAP32[surf + 36 >> 2] = 0;
  5233. HEAP32[surf + 40 >> 2] = 0;
  5234. HEAP32[surf + 44 >> 2] = Module["canvas"].width;
  5235. HEAP32[surf + 48 >> 2] = Module["canvas"].height;
  5236. HEAP32[surf + 56 >> 2] = 1;
  5237. HEAP32[pixelFormat >> 2] = -2042224636;
  5238. HEAP32[pixelFormat + 4 >> 2] = 0;
  5239. HEAP8[pixelFormat + 8 >> 0] = bpp * 8;
  5240. HEAP8[pixelFormat + 9 >> 0] = bpp;
  5241. HEAP32[pixelFormat + 12 >> 2] = rmask || 255;
  5242. HEAP32[pixelFormat + 16 >> 2] = gmask || 65280;
  5243. HEAP32[pixelFormat + 20 >> 2] = bmask || 16711680;
  5244. HEAP32[pixelFormat + 24 >> 2] = amask || 4278190080;
  5245. SDL.GL = SDL.GL || is_SDL_OPENGL;
  5246. var canvas;
  5247. if (!usePageCanvas) {
  5248. if (SDL.canvasPool.length > 0) {
  5249. canvas = SDL.canvasPool.pop();
  5250. } else {
  5251. canvas = document.createElement("canvas");
  5252. }
  5253. canvas.width = width;
  5254. canvas.height = height;
  5255. } else {
  5256. canvas = Module["canvas"];
  5257. }
  5258. var webGLContextAttributes = {
  5259. antialias: SDL.glAttributes[13] != 0 && SDL.glAttributes[14] > 1,
  5260. depth: SDL.glAttributes[6] > 0,
  5261. stencil: SDL.glAttributes[7] > 0,
  5262. alpha: SDL.glAttributes[3] > 0
  5263. };
  5264. var ctx = Browser.createContext(canvas, is_SDL_OPENGL, usePageCanvas, webGLContextAttributes);
  5265. SDL.surfaces[surf] = {
  5266. width: width,
  5267. height: height,
  5268. canvas: canvas,
  5269. ctx: ctx,
  5270. surf: surf,
  5271. buffer: buffer,
  5272. pixelFormat: pixelFormat,
  5273. alpha: 255,
  5274. flags: flags,
  5275. locked: 0,
  5276. usePageCanvas: usePageCanvas,
  5277. source: source,
  5278. isFlagSet: function(flag) {
  5279. return flags & flag;
  5280. }
  5281. };
  5282. return surf;
  5283. },
  5284. copyIndexedColorData: function(surfData, rX, rY, rW, rH) {
  5285. if (!surfData.colors) {
  5286. return;
  5287. }
  5288. var fullWidth = Module["canvas"].width;
  5289. var fullHeight = Module["canvas"].height;
  5290. var startX = rX || 0;
  5291. var startY = rY || 0;
  5292. var endX = (rW || fullWidth - startX) + startX;
  5293. var endY = (rH || fullHeight - startY) + startY;
  5294. var buffer = surfData.buffer;
  5295. if (!surfData.image.data32) {
  5296. surfData.image.data32 = new Uint32Array(surfData.image.data.buffer);
  5297. }
  5298. var data32 = surfData.image.data32;
  5299. var colors32 = surfData.colors32;
  5300. for (var y = startY; y < endY; ++y) {
  5301. var base = y * fullWidth;
  5302. for (var x = startX; x < endX; ++x) {
  5303. data32[base + x] = colors32[HEAPU8[buffer + base + x >> 0]];
  5304. }
  5305. }
  5306. },
  5307. freeSurface: function(surf) {
  5308. var refcountPointer = surf + 56;
  5309. var refcount = HEAP32[refcountPointer >> 2];
  5310. if (refcount > 1) {
  5311. HEAP32[refcountPointer >> 2] = refcount - 1;
  5312. return;
  5313. }
  5314. var info = SDL.surfaces[surf];
  5315. if (!info.usePageCanvas && info.canvas) SDL.canvasPool.push(info.canvas);
  5316. if (info.buffer) _free(info.buffer);
  5317. _free(info.pixelFormat);
  5318. _free(surf);
  5319. SDL.surfaces[surf] = null;
  5320. if (surf === SDL.screen) {
  5321. SDL.screen = null;
  5322. }
  5323. },
  5324. blitSurface: function(src, srcrect, dst, dstrect, scale) {
  5325. var srcData = SDL.surfaces[src];
  5326. var dstData = SDL.surfaces[dst];
  5327. var sr, dr;
  5328. if (srcrect) {
  5329. sr = SDL.loadRect(srcrect);
  5330. } else {
  5331. sr = {
  5332. x: 0,
  5333. y: 0,
  5334. w: srcData.width,
  5335. h: srcData.height
  5336. };
  5337. }
  5338. if (dstrect) {
  5339. dr = SDL.loadRect(dstrect);
  5340. } else {
  5341. dr = {
  5342. x: 0,
  5343. y: 0,
  5344. w: srcData.width,
  5345. h: srcData.height
  5346. };
  5347. }
  5348. if (dstData.clipRect) {
  5349. var widthScale = !scale || sr.w === 0 ? 1 : sr.w / dr.w;
  5350. var heightScale = !scale || sr.h === 0 ? 1 : sr.h / dr.h;
  5351. dr = SDL.intersectionOfRects(dstData.clipRect, dr);
  5352. sr.w = dr.w * widthScale;
  5353. sr.h = dr.h * heightScale;
  5354. if (dstrect) {
  5355. SDL.updateRect(dstrect, dr);
  5356. }
  5357. }
  5358. var blitw, blith;
  5359. if (scale) {
  5360. blitw = dr.w;
  5361. blith = dr.h;
  5362. } else {
  5363. blitw = sr.w;
  5364. blith = sr.h;
  5365. }
  5366. if (sr.w === 0 || sr.h === 0 || blitw === 0 || blith === 0) {
  5367. return 0;
  5368. }
  5369. var oldAlpha = dstData.ctx.globalAlpha;
  5370. dstData.ctx.globalAlpha = srcData.alpha / 255;
  5371. dstData.ctx.drawImage(srcData.canvas, sr.x, sr.y, sr.w, sr.h, dr.x, dr.y, blitw, blith);
  5372. dstData.ctx.globalAlpha = oldAlpha;
  5373. if (dst != SDL.screen) {
  5374. warnOnce("WARNING: copying canvas data to memory for compatibility");
  5375. _SDL_LockSurface(dst);
  5376. dstData.locked--;
  5377. }
  5378. return 0;
  5379. },
  5380. downFingers: {},
  5381. savedKeydown: null,
  5382. receiveEvent: function(event) {
  5383. function unpressAllPressedKeys() {
  5384. for (var code in SDL.keyboardMap) {
  5385. SDL.events.push({
  5386. type: "keyup",
  5387. keyCode: SDL.keyboardMap[code]
  5388. });
  5389. }
  5390. }
  5391. switch (event.type) {
  5392. case "touchstart":
  5393. case "touchmove":
  5394. {
  5395. event.preventDefault();
  5396. var touches = [];
  5397. if (event.type === "touchstart") {
  5398. for (var i = 0; i < event.touches.length; i++) {
  5399. var touch = event.touches[i];
  5400. if (SDL.downFingers[touch.identifier] != true) {
  5401. SDL.downFingers[touch.identifier] = true;
  5402. touches.push(touch);
  5403. }
  5404. }
  5405. } else {
  5406. touches = event.touches;
  5407. }
  5408. var firstTouch = touches[0];
  5409. if (firstTouch) {
  5410. if (event.type == "touchstart") {
  5411. SDL.DOMButtons[0] = 1;
  5412. }
  5413. var mouseEventType;
  5414. switch (event.type) {
  5415. case "touchstart":
  5416. mouseEventType = "mousedown";
  5417. break;
  5418. case "touchmove":
  5419. mouseEventType = "mousemove";
  5420. break;
  5421. }
  5422. var mouseEvent = {
  5423. type: mouseEventType,
  5424. button: 0,
  5425. pageX: firstTouch.clientX,
  5426. pageY: firstTouch.clientY
  5427. };
  5428. SDL.events.push(mouseEvent);
  5429. }
  5430. for (var i = 0; i < touches.length; i++) {
  5431. var touch = touches[i];
  5432. SDL.events.push({
  5433. type: event.type,
  5434. touch: touch
  5435. });
  5436. }
  5437. break;
  5438. }
  5439. case "touchend":
  5440. {
  5441. event.preventDefault();
  5442. for (var i = 0; i < event.changedTouches.length; i++) {
  5443. var touch = event.changedTouches[i];
  5444. if (SDL.downFingers[touch.identifier] === true) {
  5445. delete SDL.downFingers[touch.identifier];
  5446. }
  5447. }
  5448. var mouseEvent = {
  5449. type: "mouseup",
  5450. button: 0,
  5451. pageX: event.changedTouches[0].clientX,
  5452. pageY: event.changedTouches[0].clientY
  5453. };
  5454. SDL.DOMButtons[0] = 0;
  5455. SDL.events.push(mouseEvent);
  5456. for (var i = 0; i < event.changedTouches.length; i++) {
  5457. var touch = event.changedTouches[i];
  5458. SDL.events.push({
  5459. type: "touchend",
  5460. touch: touch
  5461. });
  5462. }
  5463. break;
  5464. }
  5465. case "DOMMouseScroll":
  5466. case "mousewheel":
  5467. case "wheel":
  5468. var delta = -Browser.getMouseWheelDelta(event);
  5469. delta = delta == 0 ? 0 : delta > 0 ? Math.max(delta, 1) : Math.min(delta, -1);
  5470. var button = delta > 0 ? 3 : 4;
  5471. SDL.events.push({
  5472. type: "mousedown",
  5473. button: button,
  5474. pageX: event.pageX,
  5475. pageY: event.pageY
  5476. });
  5477. SDL.events.push({
  5478. type: "mouseup",
  5479. button: button,
  5480. pageX: event.pageX,
  5481. pageY: event.pageY
  5482. });
  5483. SDL.events.push({
  5484. type: "wheel",
  5485. deltaX: 0,
  5486. deltaY: delta
  5487. });
  5488. event.preventDefault();
  5489. break;
  5490. case "mousemove":
  5491. if (SDL.DOMButtons[0] === 1) {
  5492. SDL.events.push({
  5493. type: "touchmove",
  5494. touch: {
  5495. identifier: 0,
  5496. deviceID: -1,
  5497. pageX: event.pageX,
  5498. pageY: event.pageY
  5499. }
  5500. });
  5501. }
  5502. if (Browser.pointerLock) {
  5503. if ("mozMovementX" in event) {
  5504. event["movementX"] = event["mozMovementX"];
  5505. event["movementY"] = event["mozMovementY"];
  5506. }
  5507. if (event["movementX"] == 0 && event["movementY"] == 0) {
  5508. event.preventDefault();
  5509. return;
  5510. }
  5511. }
  5512. case "keydown":
  5513. case "keyup":
  5514. case "keypress":
  5515. case "mousedown":
  5516. case "mouseup":
  5517. if (event.type !== "keydown" || !SDL.unicode && !SDL.textInput || (event.keyCode === 8 || event.keyCode === 9)) {}
  5518. if (event.type == "mousedown") {
  5519. SDL.DOMButtons[event.button] = 1;
  5520. SDL.events.push({
  5521. type: "touchstart",
  5522. touch: {
  5523. identifier: 0,
  5524. deviceID: -1,
  5525. pageX: event.pageX,
  5526. pageY: event.pageY
  5527. }
  5528. });
  5529. } else if (event.type == "mouseup") {
  5530. if (!SDL.DOMButtons[event.button]) {
  5531. return;
  5532. }
  5533. SDL.events.push({
  5534. type: "touchend",
  5535. touch: {
  5536. identifier: 0,
  5537. deviceID: -1,
  5538. pageX: event.pageX,
  5539. pageY: event.pageY
  5540. }
  5541. });
  5542. SDL.DOMButtons[event.button] = 0;
  5543. }
  5544. if (event.type === "keydown" || event.type === "mousedown") {
  5545. SDL.canRequestFullscreen = true;
  5546. } else if (event.type === "keyup" || event.type === "mouseup") {
  5547. if (SDL.isRequestingFullscreen) {
  5548. Module["requestFullscreen"](false, true);
  5549. SDL.isRequestingFullscreen = false;
  5550. }
  5551. SDL.canRequestFullscreen = false;
  5552. }
  5553. if (event.type === "keypress" && SDL.savedKeydown) {
  5554. SDL.savedKeydown.keypressCharCode = event.charCode;
  5555. SDL.savedKeydown = null;
  5556. } else if (event.type === "keydown") {
  5557. SDL.savedKeydown = event;
  5558. }
  5559. if (event.type !== "keypress" || SDL.textInput) {
  5560. SDL.events.push(event);
  5561. }
  5562. break;
  5563. case "mouseout":
  5564. for (var i = 0; i < 3; i++) {
  5565. if (SDL.DOMButtons[i]) {
  5566. SDL.events.push({
  5567. type: "mouseup",
  5568. button: i,
  5569. pageX: event.pageX,
  5570. pageY: event.pageY
  5571. });
  5572. SDL.DOMButtons[i] = 0;
  5573. }
  5574. }
  5575. event.preventDefault();
  5576. break;
  5577. case "focus":
  5578. SDL.events.push(event);
  5579. event.preventDefault();
  5580. break;
  5581. case "blur":
  5582. SDL.events.push(event);
  5583. unpressAllPressedKeys();
  5584. event.preventDefault();
  5585. break;
  5586. case "visibilitychange":
  5587. SDL.events.push({
  5588. type: "visibilitychange",
  5589. visible: !document.hidden
  5590. });
  5591. unpressAllPressedKeys();
  5592. event.preventDefault();
  5593. break;
  5594. case "unload":
  5595. if (Browser.mainLoop.runner) {
  5596. SDL.events.push(event);
  5597. Browser.mainLoop.runner();
  5598. }
  5599. return;
  5600. case "resize":
  5601. SDL.events.push(event);
  5602. if (event.preventDefault) {
  5603. event.preventDefault();
  5604. }
  5605. break;
  5606. }
  5607. if (SDL.events.length >= 1e4) {
  5608. err("SDL event queue full, dropping events");
  5609. SDL.events = SDL.events.slice(0, 1e4);
  5610. }
  5611. SDL.flushEventsToHandler();
  5612. return;
  5613. },
  5614. lookupKeyCodeForEvent: function(event) {
  5615. var code = event.keyCode;
  5616. if (code >= 65 && code <= 90) {
  5617. code += 32;
  5618. } else {
  5619. code = SDL.keyCodes[event.keyCode] || event.keyCode;
  5620. if (event.location === KeyboardEvent.DOM_KEY_LOCATION_RIGHT && code >= (224 | 1 << 10) && code <= (227 | 1 << 10)) {
  5621. code += 4;
  5622. }
  5623. }
  5624. return code;
  5625. },
  5626. handleEvent: function(event) {
  5627. if (event.handled) return;
  5628. event.handled = true;
  5629. switch (event.type) {
  5630. case "touchstart":
  5631. case "touchend":
  5632. case "touchmove":
  5633. {
  5634. Browser.calculateMouseEvent(event);
  5635. break;
  5636. }
  5637. case "keydown":
  5638. case "keyup":
  5639. {
  5640. var down = event.type === "keydown";
  5641. var code = SDL.lookupKeyCodeForEvent(event);
  5642. HEAP8[SDL.keyboardState + code >> 0] = down;
  5643. SDL.modState = (HEAP8[SDL.keyboardState + 1248 >> 0] ? 64 : 0) | (HEAP8[SDL.keyboardState + 1249 >> 0] ? 1 : 0) | (HEAP8[SDL.keyboardState + 1250 >> 0] ? 256 : 0) | (HEAP8[SDL.keyboardState + 1252 >> 0] ? 128 : 0) | (HEAP8[SDL.keyboardState + 1253 >> 0] ? 2 : 0) | (HEAP8[SDL.keyboardState + 1254 >> 0] ? 512 : 0);
  5644. if (down) {
  5645. SDL.keyboardMap[code] = event.keyCode;
  5646. } else {
  5647. delete SDL.keyboardMap[code];
  5648. }
  5649. break;
  5650. }
  5651. case "mousedown":
  5652. case "mouseup":
  5653. if (event.type == "mousedown") {
  5654. SDL.buttonState |= 1 << event.button;
  5655. } else if (event.type == "mouseup") {
  5656. SDL.buttonState &= ~(1 << event.button);
  5657. }
  5658. case "mousemove":
  5659. {
  5660. Browser.calculateMouseEvent(event);
  5661. break;
  5662. }
  5663. }
  5664. },
  5665. flushEventsToHandler: function() {
  5666. if (!SDL.eventHandler) return;
  5667. while (SDL.pollEvent(SDL.eventHandlerTemp)) {
  5668. Module["dynCall_iii"](SDL.eventHandler, SDL.eventHandlerContext, SDL.eventHandlerTemp);
  5669. }
  5670. },
  5671. pollEvent: function(ptr) {
  5672. if (SDL.initFlags & 512 && SDL.joystickEventState) {
  5673. SDL.queryJoysticks();
  5674. }
  5675. if (ptr) {
  5676. while (SDL.events.length > 0) {
  5677. if (SDL.makeCEvent(SDL.events.shift(), ptr) !== false) return 1;
  5678. }
  5679. return 0;
  5680. } else {
  5681. return SDL.events.length > 0;
  5682. }
  5683. },
  5684. makeCEvent: function(event, ptr) {
  5685. if (typeof event === "number") {
  5686. _memcpy(ptr, event, 28);
  5687. _free(event);
  5688. return;
  5689. }
  5690. SDL.handleEvent(event);
  5691. switch (event.type) {
  5692. case "keydown":
  5693. case "keyup":
  5694. {
  5695. var down = event.type === "keydown";
  5696. var key = SDL.lookupKeyCodeForEvent(event);
  5697. var scan;
  5698. if (key >= 1024) {
  5699. scan = key - 1024;
  5700. } else {
  5701. scan = SDL.scanCodes[key] || key;
  5702. }
  5703. HEAP32[ptr >> 2] = SDL.DOMEventToSDLEvent[event.type];
  5704. HEAP8[ptr + 8 >> 0] = down ? 1 : 0;
  5705. HEAP8[ptr + 9 >> 0] = 0;
  5706. HEAP32[ptr + 12 >> 2] = scan;
  5707. HEAP32[ptr + 16 >> 2] = key;
  5708. HEAP16[ptr + 20 >> 1] = SDL.modState;
  5709. HEAP32[ptr + 24 >> 2] = event.keypressCharCode || key;
  5710. break;
  5711. }
  5712. case "keypress":
  5713. {
  5714. HEAP32[ptr >> 2] = SDL.DOMEventToSDLEvent[event.type];
  5715. var cStr = intArrayFromString(String.fromCharCode(event.charCode));
  5716. for (var i = 0; i < cStr.length; ++i) {
  5717. HEAP8[ptr + (8 + i) >> 0] = cStr[i];
  5718. }
  5719. break;
  5720. }
  5721. case "mousedown":
  5722. case "mouseup":
  5723. case "mousemove":
  5724. {
  5725. if (event.type != "mousemove") {
  5726. var down = event.type === "mousedown";
  5727. HEAP32[ptr >> 2] = SDL.DOMEventToSDLEvent[event.type];
  5728. HEAP32[ptr + 4 >> 2] = 0;
  5729. HEAP32[ptr + 8 >> 2] = 0;
  5730. HEAP32[ptr + 12 >> 2] = 0;
  5731. HEAP8[ptr + 16 >> 0] = event.button + 1;
  5732. HEAP8[ptr + 17 >> 0] = down ? 1 : 0;
  5733. HEAP32[ptr + 20 >> 2] = Browser.mouseX;
  5734. HEAP32[ptr + 24 >> 2] = Browser.mouseY;
  5735. } else {
  5736. HEAP32[ptr >> 2] = SDL.DOMEventToSDLEvent[event.type];
  5737. HEAP32[ptr + 4 >> 2] = 0;
  5738. HEAP32[ptr + 8 >> 2] = 0;
  5739. HEAP32[ptr + 12 >> 2] = 0;
  5740. HEAP32[ptr + 16 >> 2] = SDL.buttonState;
  5741. HEAP32[ptr + 20 >> 2] = Browser.mouseX;
  5742. HEAP32[ptr + 24 >> 2] = Browser.mouseY;
  5743. HEAP32[ptr + 28 >> 2] = Browser.mouseMovementX;
  5744. HEAP32[ptr + 32 >> 2] = Browser.mouseMovementY;
  5745. }
  5746. break;
  5747. }
  5748. case "wheel":
  5749. {
  5750. HEAP32[ptr >> 2] = SDL.DOMEventToSDLEvent[event.type];
  5751. HEAP32[ptr + 16 >> 2] = event.deltaX;
  5752. HEAP32[ptr + 20 >> 2] = event.deltaY;
  5753. break;
  5754. }
  5755. case "touchstart":
  5756. case "touchend":
  5757. case "touchmove":
  5758. {
  5759. var touch = event.touch;
  5760. if (!Browser.touches[touch.identifier]) break;
  5761. var w = Module["canvas"].width;
  5762. var h = Module["canvas"].height;
  5763. var x = Browser.touches[touch.identifier].x / w;
  5764. var y = Browser.touches[touch.identifier].y / h;
  5765. var lx = Browser.lastTouches[touch.identifier].x / w;
  5766. var ly = Browser.lastTouches[touch.identifier].y / h;
  5767. var dx = x - lx;
  5768. var dy = y - ly;
  5769. if (touch["deviceID"] === undefined) touch.deviceID = SDL.TOUCH_DEFAULT_ID;
  5770. if (dx === 0 && dy === 0 && event.type === "touchmove") return false;
  5771. HEAP32[ptr >> 2] = SDL.DOMEventToSDLEvent[event.type];
  5772. HEAP32[ptr + 4 >> 2] = _SDL_GetTicks();
  5773. tempI64 = [ touch.deviceID >>> 0, (tempDouble = touch.deviceID, +Math_abs(tempDouble) >= +1 ? tempDouble > +0 ? (Math_min(+Math_floor(tempDouble / +4294967296), +4294967295) | 0) >>> 0 : ~~+Math_ceil((tempDouble - +(~~tempDouble >>> 0)) / +4294967296) >>> 0 : 0) ],
  5774. HEAP32[ptr + 8 >> 2] = tempI64[0], HEAP32[ptr + 12 >> 2] = tempI64[1];
  5775. tempI64 = [ touch.identifier >>> 0, (tempDouble = touch.identifier, +Math_abs(tempDouble) >= +1 ? tempDouble > +0 ? (Math_min(+Math_floor(tempDouble / +4294967296), +4294967295) | 0) >>> 0 : ~~+Math_ceil((tempDouble - +(~~tempDouble >>> 0)) / +4294967296) >>> 0 : 0) ],
  5776. HEAP32[ptr + 16 >> 2] = tempI64[0], HEAP32[ptr + 20 >> 2] = tempI64[1];
  5777. HEAPF32[ptr + 24 >> 2] = x;
  5778. HEAPF32[ptr + 28 >> 2] = y;
  5779. HEAPF32[ptr + 32 >> 2] = dx;
  5780. HEAPF32[ptr + 36 >> 2] = dy;
  5781. if (touch.force !== undefined) {
  5782. HEAPF32[ptr + 40 >> 2] = touch.force;
  5783. } else {
  5784. HEAPF32[ptr + 40 >> 2] = event.type == "touchend" ? 0 : 1;
  5785. }
  5786. break;
  5787. }
  5788. case "unload":
  5789. {
  5790. HEAP32[ptr >> 2] = SDL.DOMEventToSDLEvent[event.type];
  5791. break;
  5792. }
  5793. case "resize":
  5794. {
  5795. HEAP32[ptr >> 2] = SDL.DOMEventToSDLEvent[event.type];
  5796. HEAP32[ptr + 4 >> 2] = event.w;
  5797. HEAP32[ptr + 8 >> 2] = event.h;
  5798. break;
  5799. }
  5800. case "joystick_button_up":
  5801. case "joystick_button_down":
  5802. {
  5803. var state = event.type === "joystick_button_up" ? 0 : 1;
  5804. HEAP32[ptr >> 2] = SDL.DOMEventToSDLEvent[event.type];
  5805. HEAP8[ptr + 4 >> 0] = event.index;
  5806. HEAP8[ptr + 5 >> 0] = event.button;
  5807. HEAP8[ptr + 6 >> 0] = state;
  5808. break;
  5809. }
  5810. case "joystick_axis_motion":
  5811. {
  5812. HEAP32[ptr >> 2] = SDL.DOMEventToSDLEvent[event.type];
  5813. HEAP8[ptr + 4 >> 0] = event.index;
  5814. HEAP8[ptr + 5 >> 0] = event.axis;
  5815. HEAP32[ptr + 8 >> 2] = SDL.joystickAxisValueConversion(event.value);
  5816. break;
  5817. }
  5818. case "focus":
  5819. {
  5820. var SDL_WINDOWEVENT_FOCUS_GAINED = 12;
  5821. HEAP32[ptr >> 2] = SDL.DOMEventToSDLEvent[event.type];
  5822. HEAP32[ptr + 4 >> 2] = 0;
  5823. HEAP8[ptr + 8 >> 0] = SDL_WINDOWEVENT_FOCUS_GAINED;
  5824. break;
  5825. }
  5826. case "blur":
  5827. {
  5828. var SDL_WINDOWEVENT_FOCUS_LOST = 13;
  5829. HEAP32[ptr >> 2] = SDL.DOMEventToSDLEvent[event.type];
  5830. HEAP32[ptr + 4 >> 2] = 0;
  5831. HEAP8[ptr + 8 >> 0] = SDL_WINDOWEVENT_FOCUS_LOST;
  5832. break;
  5833. }
  5834. case "visibilitychange":
  5835. {
  5836. var SDL_WINDOWEVENT_SHOWN = 1;
  5837. var SDL_WINDOWEVENT_HIDDEN = 2;
  5838. var visibilityEventID = event.visible ? SDL_WINDOWEVENT_SHOWN : SDL_WINDOWEVENT_HIDDEN;
  5839. HEAP32[ptr >> 2] = SDL.DOMEventToSDLEvent[event.type];
  5840. HEAP32[ptr + 4 >> 2] = 0;
  5841. HEAP8[ptr + 8 >> 0] = visibilityEventID;
  5842. break;
  5843. }
  5844. default:
  5845. throw "Unhandled SDL event: " + event.type;
  5846. }
  5847. },
  5848. makeFontString: function(height, fontName) {
  5849. if (fontName.charAt(0) != "'" && fontName.charAt(0) != '"') {
  5850. fontName = '"' + fontName + '"';
  5851. }
  5852. return height + "px " + fontName + ", serif";
  5853. },
  5854. estimateTextWidth: function(fontData, text) {
  5855. var h = fontData.size;
  5856. var fontString = SDL.makeFontString(h, fontData.name);
  5857. var tempCtx = SDL.ttfContext;
  5858. tempCtx.save();
  5859. tempCtx.font = fontString;
  5860. var ret = tempCtx.measureText(text).width | 0;
  5861. tempCtx.restore();
  5862. return ret;
  5863. },
  5864. allocateChannels: function(num) {
  5865. if (SDL.numChannels && SDL.numChannels >= num && num != 0) return;
  5866. SDL.numChannels = num;
  5867. SDL.channels = [];
  5868. for (var i = 0; i < num; i++) {
  5869. SDL.channels[i] = {
  5870. audio: null,
  5871. volume: 1
  5872. };
  5873. }
  5874. },
  5875. setGetVolume: function(info, volume) {
  5876. if (!info) return 0;
  5877. var ret = info.volume * 128;
  5878. if (volume != -1) {
  5879. info.volume = Math.min(Math.max(volume, 0), 128) / 128;
  5880. if (info.audio) {
  5881. try {
  5882. info.audio.volume = info.volume;
  5883. if (info.audio.webAudioGainNode) info.audio.webAudioGainNode["gain"]["value"] = info.volume;
  5884. } catch (e) {
  5885. err("setGetVolume failed to set audio volume: " + e);
  5886. }
  5887. }
  5888. }
  5889. return ret;
  5890. },
  5891. setPannerPosition: function(info, x, y, z) {
  5892. if (!info) return;
  5893. if (info.audio) {
  5894. if (info.audio.webAudioPannerNode) {
  5895. info.audio.webAudioPannerNode["setPosition"](x, y, z);
  5896. }
  5897. }
  5898. },
  5899. playWebAudio: function(audio) {
  5900. if (!audio) return;
  5901. if (audio.webAudioNode) return;
  5902. if (!SDL.webAudioAvailable()) return;
  5903. try {
  5904. var webAudio = audio.resource.webAudio;
  5905. audio.paused = false;
  5906. if (!webAudio.decodedBuffer) {
  5907. if (webAudio.onDecodeComplete === undefined) abort("Cannot play back audio object that was not loaded");
  5908. webAudio.onDecodeComplete.push(function() {
  5909. if (!audio.paused) SDL.playWebAudio(audio);
  5910. });
  5911. return;
  5912. }
  5913. audio.webAudioNode = SDL.audioContext["createBufferSource"]();
  5914. audio.webAudioNode["buffer"] = webAudio.decodedBuffer;
  5915. audio.webAudioNode["loop"] = audio.loop;
  5916. audio.webAudioNode["onended"] = function() {
  5917. audio["onended"]();
  5918. };
  5919. audio.webAudioPannerNode = SDL.audioContext["createPanner"]();
  5920. audio.webAudioPannerNode["setPosition"](0, 0, -.5);
  5921. audio.webAudioPannerNode["panningModel"] = "equalpower";
  5922. audio.webAudioGainNode = SDL.audioContext["createGain"]();
  5923. audio.webAudioGainNode["gain"]["value"] = audio.volume;
  5924. audio.webAudioNode["connect"](audio.webAudioPannerNode);
  5925. audio.webAudioPannerNode["connect"](audio.webAudioGainNode);
  5926. audio.webAudioGainNode["connect"](SDL.audioContext["destination"]);
  5927. audio.webAudioNode["start"](0, audio.currentPosition);
  5928. audio.startTime = SDL.audioContext["currentTime"] - audio.currentPosition;
  5929. } catch (e) {
  5930. err("playWebAudio failed: " + e);
  5931. }
  5932. },
  5933. pauseWebAudio: function(audio) {
  5934. if (!audio) return;
  5935. if (audio.webAudioNode) {
  5936. try {
  5937. audio.currentPosition = (SDL.audioContext["currentTime"] - audio.startTime) % audio.resource.webAudio.decodedBuffer.duration;
  5938. audio.webAudioNode["onended"] = undefined;
  5939. audio.webAudioNode.stop(0);
  5940. audio.webAudioNode = undefined;
  5941. } catch (e) {
  5942. err("pauseWebAudio failed: " + e);
  5943. }
  5944. }
  5945. audio.paused = true;
  5946. },
  5947. openAudioContext: function() {
  5948. if (!SDL.audioContext) {
  5949. if (typeof AudioContext !== "undefined") SDL.audioContext = new AudioContext(); else if (typeof webkitAudioContext !== "undefined") SDL.audioContext = new webkitAudioContext();
  5950. }
  5951. },
  5952. webAudioAvailable: function() {
  5953. return !!SDL.audioContext;
  5954. },
  5955. fillWebAudioBufferFromHeap: function(heapPtr, sizeSamplesPerChannel, dstAudioBuffer) {
  5956. var numChannels = SDL.audio.channels;
  5957. for (var c = 0; c < numChannels; ++c) {
  5958. var channelData = dstAudioBuffer["getChannelData"](c);
  5959. if (channelData.length != sizeSamplesPerChannel) {
  5960. throw "Web Audio output buffer length mismatch! Destination size: " + channelData.length + " samples vs expected " + sizeSamplesPerChannel + " samples!";
  5961. }
  5962. if (SDL.audio.format == 32784) {
  5963. for (var j = 0; j < sizeSamplesPerChannel; ++j) {
  5964. channelData[j] = HEAP16[heapPtr + (j * numChannels + c) * 2 >> 1] / 32768;
  5965. }
  5966. } else if (SDL.audio.format == 8) {
  5967. for (var j = 0; j < sizeSamplesPerChannel; ++j) {
  5968. var v = HEAP8[heapPtr + (j * numChannels + c) >> 0];
  5969. channelData[j] = (v >= 0 ? v - 128 : v + 128) / 128;
  5970. }
  5971. } else if (SDL.audio.format == 33056) {
  5972. for (var j = 0; j < sizeSamplesPerChannel; ++j) {
  5973. channelData[j] = HEAPF32[heapPtr + (j * numChannels + c) * 4 >> 2];
  5974. }
  5975. } else {
  5976. throw "Invalid SDL audio format " + SDL.audio.format + "!";
  5977. }
  5978. }
  5979. },
  5980. debugSurface: function(surfData) {
  5981. console.log("dumping surface " + [ surfData.surf, surfData.source, surfData.width, surfData.height ]);
  5982. var image = surfData.ctx.getImageData(0, 0, surfData.width, surfData.height);
  5983. var data = image.data;
  5984. var num = Math.min(surfData.width, surfData.height);
  5985. for (var i = 0; i < num; i++) {
  5986. console.log(" diagonal " + i + ":" + [ data[i * surfData.width * 4 + i * 4 + 0], data[i * surfData.width * 4 + i * 4 + 1], data[i * surfData.width * 4 + i * 4 + 2], data[i * surfData.width * 4 + i * 4 + 3] ]);
  5987. }
  5988. },
  5989. joystickEventState: 1,
  5990. lastJoystickState: {},
  5991. joystickNamePool: {},
  5992. recordJoystickState: function(joystick, state) {
  5993. var buttons = new Array(state.buttons.length);
  5994. for (var i = 0; i < state.buttons.length; i++) {
  5995. buttons[i] = SDL.getJoystickButtonState(state.buttons[i]);
  5996. }
  5997. SDL.lastJoystickState[joystick] = {
  5998. buttons: buttons,
  5999. axes: state.axes.slice(0),
  6000. timestamp: state.timestamp,
  6001. index: state.index,
  6002. id: state.id
  6003. };
  6004. },
  6005. getJoystickButtonState: function(button) {
  6006. if (typeof button === "object") {
  6007. return button["pressed"];
  6008. } else {
  6009. return button > 0;
  6010. }
  6011. },
  6012. queryJoysticks: function() {
  6013. for (var joystick in SDL.lastJoystickState) {
  6014. var state = SDL.getGamepad(joystick - 1);
  6015. var prevState = SDL.lastJoystickState[joystick];
  6016. if (typeof state === "undefined") return;
  6017. if (state === null) return;
  6018. if (typeof state.timestamp !== "number" || state.timestamp !== prevState.timestamp || !state.timestamp) {
  6019. var i;
  6020. for (i = 0; i < state.buttons.length; i++) {
  6021. var buttonState = SDL.getJoystickButtonState(state.buttons[i]);
  6022. if (buttonState !== prevState.buttons[i]) {
  6023. SDL.events.push({
  6024. type: buttonState ? "joystick_button_down" : "joystick_button_up",
  6025. joystick: joystick,
  6026. index: joystick - 1,
  6027. button: i
  6028. });
  6029. }
  6030. }
  6031. for (i = 0; i < state.axes.length; i++) {
  6032. if (state.axes[i] !== prevState.axes[i]) {
  6033. SDL.events.push({
  6034. type: "joystick_axis_motion",
  6035. joystick: joystick,
  6036. index: joystick - 1,
  6037. axis: i,
  6038. value: state.axes[i]
  6039. });
  6040. }
  6041. }
  6042. SDL.recordJoystickState(joystick, state);
  6043. }
  6044. }
  6045. },
  6046. joystickAxisValueConversion: function(value) {
  6047. value = Math.min(1, Math.max(value, -1));
  6048. return Math.ceil((value + 1) * 32767.5 - 32768);
  6049. },
  6050. getGamepads: function() {
  6051. var fcn = navigator.getGamepads || navigator.webkitGamepads || navigator.mozGamepads || navigator.gamepads || navigator.webkitGetGamepads;
  6052. if (fcn !== undefined) {
  6053. return fcn.apply(navigator);
  6054. } else {
  6055. return [];
  6056. }
  6057. },
  6058. getGamepad: function(deviceIndex) {
  6059. var gamepads = SDL.getGamepads();
  6060. if (gamepads.length > deviceIndex && deviceIndex >= 0) {
  6061. return gamepads[deviceIndex];
  6062. }
  6063. return null;
  6064. }
  6065. };
  6066. function _SDL_ClearError() {}
  6067. function _SDL_GetError() {
  6068. if (!SDL.errorMessage) {
  6069. SDL.errorMessage = allocate(intArrayFromString("unknown SDL-emscripten error"), "i8", ALLOC_NORMAL);
  6070. }
  6071. return SDL.errorMessage;
  6072. }
  6073. function _SDL_GetModState() {
  6074. return SDL.modState;
  6075. }
  6076. function _SDL_GetMouseState(x, y) {
  6077. if (x) HEAP32[x >> 2] = Browser.mouseX;
  6078. if (y) HEAP32[y >> 2] = Browser.mouseY;
  6079. return SDL.buttonState;
  6080. }
  6081. function _SDL_GetWindowSize(window, width, height) {
  6082. var w = Module["canvas"].width;
  6083. var h = Module["canvas"].height;
  6084. if (width) HEAP32[width >> 2] = w;
  6085. if (height) HEAP32[height >> 2] = h;
  6086. }
  6087. function _SDL_Init(initFlags) {
  6088. SDL.startTime = Date.now();
  6089. SDL.initFlags = initFlags;
  6090. if (!Module["doNotCaptureKeyboard"]) {
  6091. var keyboardListeningElement = Module["keyboardListeningElement"] || document;
  6092. keyboardListeningElement.addEventListener("keydown", SDL.receiveEvent);
  6093. keyboardListeningElement.addEventListener("keyup", SDL.receiveEvent);
  6094. keyboardListeningElement.addEventListener("keypress", SDL.receiveEvent);
  6095. window.addEventListener("focus", SDL.receiveEvent);
  6096. window.addEventListener("blur", SDL.receiveEvent);
  6097. document.addEventListener("visibilitychange", SDL.receiveEvent);
  6098. }
  6099. window.addEventListener("unload", SDL.receiveEvent);
  6100. SDL.keyboardState = _malloc(65536);
  6101. _memset(SDL.keyboardState, 0, 65536);
  6102. SDL.DOMEventToSDLEvent["keydown"] = 768;
  6103. SDL.DOMEventToSDLEvent["keyup"] = 769;
  6104. SDL.DOMEventToSDLEvent["keypress"] = 771;
  6105. SDL.DOMEventToSDLEvent["mousedown"] = 1025;
  6106. SDL.DOMEventToSDLEvent["mouseup"] = 1026;
  6107. SDL.DOMEventToSDLEvent["mousemove"] = 1024;
  6108. SDL.DOMEventToSDLEvent["wheel"] = 1027;
  6109. SDL.DOMEventToSDLEvent["touchstart"] = 1792;
  6110. SDL.DOMEventToSDLEvent["touchend"] = 1793;
  6111. SDL.DOMEventToSDLEvent["touchmove"] = 1794;
  6112. SDL.DOMEventToSDLEvent["unload"] = 256;
  6113. SDL.DOMEventToSDLEvent["resize"] = 28673;
  6114. SDL.DOMEventToSDLEvent["visibilitychange"] = 512;
  6115. SDL.DOMEventToSDLEvent["focus"] = 512;
  6116. SDL.DOMEventToSDLEvent["blur"] = 512;
  6117. SDL.DOMEventToSDLEvent["joystick_axis_motion"] = 1536;
  6118. SDL.DOMEventToSDLEvent["joystick_button_down"] = 1539;
  6119. SDL.DOMEventToSDLEvent["joystick_button_up"] = 1540;
  6120. return 0;
  6121. }
  6122. function _SDL_LockAudio() {}
  6123. function _SDL_PollEvent(ptr) {
  6124. return SDL.pollEvent(ptr);
  6125. }
  6126. var GL = {
  6127. counter: 1,
  6128. lastError: 0,
  6129. buffers: [],
  6130. mappedBuffers: {},
  6131. programs: [],
  6132. framebuffers: [],
  6133. renderbuffers: [],
  6134. textures: [],
  6135. uniforms: [],
  6136. shaders: [],
  6137. vaos: [],
  6138. contexts: {},
  6139. currentContext: null,
  6140. offscreenCanvases: {},
  6141. timerQueriesEXT: [],
  6142. programInfos: {},
  6143. stringCache: {},
  6144. unpackAlignment: 4,
  6145. init: function() {
  6146. GL.miniTempBuffer = new Float32Array(GL.MINI_TEMP_BUFFER_SIZE);
  6147. for (var i = 0; i < GL.MINI_TEMP_BUFFER_SIZE; i++) {
  6148. GL.miniTempBufferViews[i] = GL.miniTempBuffer.subarray(0, i + 1);
  6149. }
  6150. },
  6151. recordError: function recordError(errorCode) {
  6152. if (!GL.lastError) {
  6153. GL.lastError = errorCode;
  6154. }
  6155. },
  6156. getNewId: function(table) {
  6157. var ret = GL.counter++;
  6158. for (var i = table.length; i < ret; i++) {
  6159. table[i] = null;
  6160. }
  6161. return ret;
  6162. },
  6163. MINI_TEMP_BUFFER_SIZE: 256,
  6164. miniTempBuffer: null,
  6165. miniTempBufferViews: [ 0 ],
  6166. getSource: function(shader, count, string, length) {
  6167. var source = "";
  6168. for (var i = 0; i < count; ++i) {
  6169. var len = length ? HEAP32[length + i * 4 >> 2] : -1;
  6170. source += UTF8ToString(HEAP32[string + i * 4 >> 2], len < 0 ? undefined : len);
  6171. }
  6172. return source;
  6173. },
  6174. createContext: function(canvas, webGLContextAttributes) {
  6175. var ctx = canvas.getContext("webgl", webGLContextAttributes) || canvas.getContext("experimental-webgl", webGLContextAttributes);
  6176. return ctx && GL.registerContext(ctx, webGLContextAttributes);
  6177. },
  6178. registerContext: function(ctx, webGLContextAttributes) {
  6179. var handle = _malloc(8);
  6180. var context = {
  6181. handle: handle,
  6182. attributes: webGLContextAttributes,
  6183. version: webGLContextAttributes.majorVersion,
  6184. GLctx: ctx
  6185. };
  6186. if (ctx.canvas) ctx.canvas.GLctxObject = context;
  6187. GL.contexts[handle] = context;
  6188. if (typeof webGLContextAttributes.enableExtensionsByDefault === "undefined" || webGLContextAttributes.enableExtensionsByDefault) {
  6189. GL.initExtensions(context);
  6190. }
  6191. return handle;
  6192. },
  6193. makeContextCurrent: function(contextHandle) {
  6194. GL.currentContext = GL.contexts[contextHandle];
  6195. Module.ctx = GLctx = GL.currentContext && GL.currentContext.GLctx;
  6196. return !(contextHandle && !GLctx);
  6197. },
  6198. getContext: function(contextHandle) {
  6199. return GL.contexts[contextHandle];
  6200. },
  6201. deleteContext: function(contextHandle) {
  6202. if (GL.currentContext === GL.contexts[contextHandle]) GL.currentContext = null;
  6203. if (typeof JSEvents === "object") JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas);
  6204. if (GL.contexts[contextHandle] && GL.contexts[contextHandle].GLctx.canvas) GL.contexts[contextHandle].GLctx.canvas.GLctxObject = undefined;
  6205. _free(GL.contexts[contextHandle]);
  6206. GL.contexts[contextHandle] = null;
  6207. },
  6208. initExtensions: function(context) {
  6209. if (!context) context = GL.currentContext;
  6210. if (context.initExtensionsDone) return;
  6211. context.initExtensionsDone = true;
  6212. var GLctx = context.GLctx;
  6213. if (context.version < 2) {
  6214. var instancedArraysExt = GLctx.getExtension("ANGLE_instanced_arrays");
  6215. if (instancedArraysExt) {
  6216. GLctx["vertexAttribDivisor"] = function(index, divisor) {
  6217. instancedArraysExt["vertexAttribDivisorANGLE"](index, divisor);
  6218. };
  6219. GLctx["drawArraysInstanced"] = function(mode, first, count, primcount) {
  6220. instancedArraysExt["drawArraysInstancedANGLE"](mode, first, count, primcount);
  6221. };
  6222. GLctx["drawElementsInstanced"] = function(mode, count, type, indices, primcount) {
  6223. instancedArraysExt["drawElementsInstancedANGLE"](mode, count, type, indices, primcount);
  6224. };
  6225. }
  6226. var vaoExt = GLctx.getExtension("OES_vertex_array_object");
  6227. if (vaoExt) {
  6228. GLctx["createVertexArray"] = function() {
  6229. return vaoExt["createVertexArrayOES"]();
  6230. };
  6231. GLctx["deleteVertexArray"] = function(vao) {
  6232. vaoExt["deleteVertexArrayOES"](vao);
  6233. };
  6234. GLctx["bindVertexArray"] = function(vao) {
  6235. vaoExt["bindVertexArrayOES"](vao);
  6236. };
  6237. GLctx["isVertexArray"] = function(vao) {
  6238. return vaoExt["isVertexArrayOES"](vao);
  6239. };
  6240. }
  6241. var drawBuffersExt = GLctx.getExtension("WEBGL_draw_buffers");
  6242. if (drawBuffersExt) {
  6243. GLctx["drawBuffers"] = function(n, bufs) {
  6244. drawBuffersExt["drawBuffersWEBGL"](n, bufs);
  6245. };
  6246. }
  6247. }
  6248. GLctx.disjointTimerQueryExt = GLctx.getExtension("EXT_disjoint_timer_query");
  6249. var automaticallyEnabledExtensions = [ "OES_texture_float", "OES_texture_half_float", "OES_standard_derivatives", "OES_vertex_array_object", "WEBGL_compressed_texture_s3tc", "WEBGL_depth_texture", "OES_element_index_uint", "EXT_texture_filter_anisotropic", "EXT_frag_depth", "WEBGL_draw_buffers", "ANGLE_instanced_arrays", "OES_texture_float_linear", "OES_texture_half_float_linear", "EXT_blend_minmax", "EXT_shader_texture_lod", "WEBGL_compressed_texture_pvrtc", "EXT_color_buffer_half_float", "WEBGL_color_buffer_float", "EXT_sRGB", "WEBGL_compressed_texture_etc1", "EXT_disjoint_timer_query", "WEBGL_compressed_texture_etc", "WEBGL_compressed_texture_astc", "EXT_color_buffer_float", "WEBGL_compressed_texture_s3tc_srgb", "EXT_disjoint_timer_query_webgl2" ];
  6250. var exts = GLctx.getSupportedExtensions();
  6251. if (exts && exts.length > 0) {
  6252. GLctx.getSupportedExtensions().forEach(function(ext) {
  6253. if (automaticallyEnabledExtensions.indexOf(ext) != -1) {
  6254. GLctx.getExtension(ext);
  6255. }
  6256. });
  6257. }
  6258. },
  6259. populateUniformTable: function(program) {
  6260. var p = GL.programs[program];
  6261. var ptable = GL.programInfos[program] = {
  6262. uniforms: {},
  6263. maxUniformLength: 0,
  6264. maxAttributeLength: -1,
  6265. maxUniformBlockNameLength: -1
  6266. };
  6267. var utable = ptable.uniforms;
  6268. var numUniforms = GLctx.getProgramParameter(p, 35718);
  6269. for (var i = 0; i < numUniforms; ++i) {
  6270. var u = GLctx.getActiveUniform(p, i);
  6271. var name = u.name;
  6272. ptable.maxUniformLength = Math.max(ptable.maxUniformLength, name.length + 1);
  6273. var ls = name.lastIndexOf("[");
  6274. if (ls > 0) {
  6275. name = name.slice(0, ls);
  6276. }
  6277. var loc = GLctx.getUniformLocation(p, name);
  6278. if (loc) {
  6279. var id = GL.getNewId(GL.uniforms);
  6280. utable[name] = [ u.size, id ];
  6281. GL.uniforms[id] = loc;
  6282. for (var j = 1; j < u.size; ++j) {
  6283. var n = name + "[" + j + "]";
  6284. loc = GLctx.getUniformLocation(p, n);
  6285. id = GL.getNewId(GL.uniforms);
  6286. GL.uniforms[id] = loc;
  6287. }
  6288. }
  6289. }
  6290. }
  6291. };
  6292. function _SDL_SetVideoMode(width, height, depth, flags) {
  6293. [ "touchstart", "touchend", "touchmove", "mousedown", "mouseup", "mousemove", "DOMMouseScroll", "mousewheel", "wheel", "mouseout" ].forEach(function(event) {
  6294. Module["canvas"].addEventListener(event, SDL.receiveEvent, true);
  6295. });
  6296. var canvas = Module["canvas"];
  6297. if (width == 0 && height == 0) {
  6298. width = canvas.width;
  6299. height = canvas.height;
  6300. }
  6301. if (!SDL.addedResizeListener) {
  6302. SDL.addedResizeListener = true;
  6303. Browser.resizeListeners.push(function(w, h) {
  6304. if (!SDL.settingVideoMode) {
  6305. SDL.receiveEvent({
  6306. type: "resize",
  6307. w: w,
  6308. h: h
  6309. });
  6310. }
  6311. });
  6312. }
  6313. SDL.settingVideoMode = true;
  6314. Browser.setCanvasSize(width, height);
  6315. SDL.settingVideoMode = false;
  6316. if (SDL.screen) {
  6317. SDL.freeSurface(SDL.screen);
  6318. assert(!SDL.screen);
  6319. }
  6320. if (SDL.GL) flags = flags | 67108864;
  6321. SDL.screen = SDL.makeSurface(width, height, flags, true, "screen");
  6322. return SDL.screen;
  6323. }
  6324. function _SDL_UnlockAudio() {}
  6325. function _SDL_UnlockSurface(surf) {
  6326. assert(!SDL.GL);
  6327. var surfData = SDL.surfaces[surf];
  6328. if (!surfData.locked || --surfData.locked > 0) {
  6329. return;
  6330. }
  6331. if (surfData.isFlagSet(2097152)) {
  6332. SDL.copyIndexedColorData(surfData);
  6333. } else if (!surfData.colors) {
  6334. var data = surfData.image.data;
  6335. var buffer = surfData.buffer;
  6336. assert(buffer % 4 == 0, "Invalid buffer offset: " + buffer);
  6337. var src = buffer >> 2;
  6338. var dst = 0;
  6339. var isScreen = surf == SDL.screen;
  6340. var num;
  6341. if (typeof CanvasPixelArray !== "undefined" && data instanceof CanvasPixelArray) {
  6342. num = data.length;
  6343. while (dst < num) {
  6344. var val = HEAP32[src];
  6345. data[dst] = val & 255;
  6346. data[dst + 1] = val >> 8 & 255;
  6347. data[dst + 2] = val >> 16 & 255;
  6348. data[dst + 3] = isScreen ? 255 : val >> 24 & 255;
  6349. src++;
  6350. dst += 4;
  6351. }
  6352. } else {
  6353. var data32 = new Uint32Array(data.buffer);
  6354. if (isScreen && SDL.defaults.opaqueFrontBuffer) {
  6355. num = data32.length;
  6356. data32.set(HEAP32.subarray(src, src + num));
  6357. var data8 = new Uint8Array(data.buffer);
  6358. var i = 3;
  6359. var j = i + 4 * num;
  6360. if (num % 8 == 0) {
  6361. while (i < j) {
  6362. data8[i] = 255;
  6363. i = i + 4 | 0;
  6364. data8[i] = 255;
  6365. i = i + 4 | 0;
  6366. data8[i] = 255;
  6367. i = i + 4 | 0;
  6368. data8[i] = 255;
  6369. i = i + 4 | 0;
  6370. data8[i] = 255;
  6371. i = i + 4 | 0;
  6372. data8[i] = 255;
  6373. i = i + 4 | 0;
  6374. data8[i] = 255;
  6375. i = i + 4 | 0;
  6376. data8[i] = 255;
  6377. i = i + 4 | 0;
  6378. }
  6379. } else {
  6380. while (i < j) {
  6381. data8[i] = 255;
  6382. i = i + 4 | 0;
  6383. }
  6384. }
  6385. } else {
  6386. data32.set(HEAP32.subarray(src, src + data32.length));
  6387. }
  6388. }
  6389. } else {
  6390. var width = Module["canvas"].width;
  6391. var height = Module["canvas"].height;
  6392. var s = surfData.buffer;
  6393. var data = surfData.image.data;
  6394. var colors = surfData.colors;
  6395. for (var y = 0; y < height; y++) {
  6396. var base = y * width * 4;
  6397. for (var x = 0; x < width; x++) {
  6398. var val = HEAPU8[s++ >> 0] * 4;
  6399. var start = base + x * 4;
  6400. data[start] = colors[val];
  6401. data[start + 1] = colors[val + 1];
  6402. data[start + 2] = colors[val + 2];
  6403. }
  6404. s += width * 3;
  6405. }
  6406. }
  6407. surfData.ctx.putImageData(surfData.image, 0, 0);
  6408. }
  6409. var ENV = {};
  6410. function ___buildEnvironment(environ) {
  6411. var MAX_ENV_VALUES = 64;
  6412. var TOTAL_ENV_SIZE = 1024;
  6413. var poolPtr;
  6414. var envPtr;
  6415. if (!___buildEnvironment.called) {
  6416. ___buildEnvironment.called = true;
  6417. ENV["USER"] = ENV["LOGNAME"] = "web_user";
  6418. ENV["PATH"] = "/";
  6419. ENV["PWD"] = "/";
  6420. ENV["HOME"] = "/home/web_user";
  6421. ENV["LANG"] = "C.UTF-8";
  6422. ENV["_"] = Module["thisProgram"];
  6423. poolPtr = getMemory(TOTAL_ENV_SIZE);
  6424. envPtr = getMemory(MAX_ENV_VALUES * 4);
  6425. HEAP32[envPtr >> 2] = poolPtr;
  6426. HEAP32[environ >> 2] = envPtr;
  6427. } else {
  6428. envPtr = HEAP32[environ >> 2];
  6429. poolPtr = HEAP32[envPtr >> 2];
  6430. }
  6431. var strings = [];
  6432. var totalSize = 0;
  6433. for (var key in ENV) {
  6434. if (typeof ENV[key] === "string") {
  6435. var line = key + "=" + ENV[key];
  6436. strings.push(line);
  6437. totalSize += line.length;
  6438. }
  6439. }
  6440. if (totalSize > TOTAL_ENV_SIZE) {
  6441. throw new Error("Environment size exceeded TOTAL_ENV_SIZE!");
  6442. }
  6443. var ptrSize = 4;
  6444. for (var i = 0; i < strings.length; i++) {
  6445. var line = strings[i];
  6446. writeAsciiToMemory(line, poolPtr);
  6447. HEAP32[envPtr + i * ptrSize >> 2] = poolPtr;
  6448. poolPtr += line.length + 1;
  6449. }
  6450. HEAP32[envPtr + strings.length * ptrSize >> 2] = 0;
  6451. }
  6452. function ___lock() {}
  6453. var ERRNO_CODES = {
  6454. EPERM: 1,
  6455. ENOENT: 2,
  6456. ESRCH: 3,
  6457. EINTR: 4,
  6458. EIO: 5,
  6459. ENXIO: 6,
  6460. E2BIG: 7,
  6461. ENOEXEC: 8,
  6462. EBADF: 9,
  6463. ECHILD: 10,
  6464. EAGAIN: 11,
  6465. EWOULDBLOCK: 11,
  6466. ENOMEM: 12,
  6467. EACCES: 13,
  6468. EFAULT: 14,
  6469. ENOTBLK: 15,
  6470. EBUSY: 16,
  6471. EEXIST: 17,
  6472. EXDEV: 18,
  6473. ENODEV: 19,
  6474. ENOTDIR: 20,
  6475. EISDIR: 21,
  6476. EINVAL: 22,
  6477. ENFILE: 23,
  6478. EMFILE: 24,
  6479. ENOTTY: 25,
  6480. ETXTBSY: 26,
  6481. EFBIG: 27,
  6482. ENOSPC: 28,
  6483. ESPIPE: 29,
  6484. EROFS: 30,
  6485. EMLINK: 31,
  6486. EPIPE: 32,
  6487. EDOM: 33,
  6488. ERANGE: 34,
  6489. ENOMSG: 42,
  6490. EIDRM: 43,
  6491. ECHRNG: 44,
  6492. EL2NSYNC: 45,
  6493. EL3HLT: 46,
  6494. EL3RST: 47,
  6495. ELNRNG: 48,
  6496. EUNATCH: 49,
  6497. ENOCSI: 50,
  6498. EL2HLT: 51,
  6499. EDEADLK: 35,
  6500. ENOLCK: 37,
  6501. EBADE: 52,
  6502. EBADR: 53,
  6503. EXFULL: 54,
  6504. ENOANO: 55,
  6505. EBADRQC: 56,
  6506. EBADSLT: 57,
  6507. EDEADLOCK: 35,
  6508. EBFONT: 59,
  6509. ENOSTR: 60,
  6510. ENODATA: 61,
  6511. ETIME: 62,
  6512. ENOSR: 63,
  6513. ENONET: 64,
  6514. ENOPKG: 65,
  6515. EREMOTE: 66,
  6516. ENOLINK: 67,
  6517. EADV: 68,
  6518. ESRMNT: 69,
  6519. ECOMM: 70,
  6520. EPROTO: 71,
  6521. EMULTIHOP: 72,
  6522. EDOTDOT: 73,
  6523. EBADMSG: 74,
  6524. ENOTUNIQ: 76,
  6525. EBADFD: 77,
  6526. EREMCHG: 78,
  6527. ELIBACC: 79,
  6528. ELIBBAD: 80,
  6529. ELIBSCN: 81,
  6530. ELIBMAX: 82,
  6531. ELIBEXEC: 83,
  6532. ENOSYS: 38,
  6533. ENOTEMPTY: 39,
  6534. ENAMETOOLONG: 36,
  6535. ELOOP: 40,
  6536. EOPNOTSUPP: 95,
  6537. EPFNOSUPPORT: 96,
  6538. ECONNRESET: 104,
  6539. ENOBUFS: 105,
  6540. EAFNOSUPPORT: 97,
  6541. EPROTOTYPE: 91,
  6542. ENOTSOCK: 88,
  6543. ENOPROTOOPT: 92,
  6544. ESHUTDOWN: 108,
  6545. ECONNREFUSED: 111,
  6546. EADDRINUSE: 98,
  6547. ECONNABORTED: 103,
  6548. ENETUNREACH: 101,
  6549. ENETDOWN: 100,
  6550. ETIMEDOUT: 110,
  6551. EHOSTDOWN: 112,
  6552. EHOSTUNREACH: 113,
  6553. EINPROGRESS: 115,
  6554. EALREADY: 114,
  6555. EDESTADDRREQ: 89,
  6556. EMSGSIZE: 90,
  6557. EPROTONOSUPPORT: 93,
  6558. ESOCKTNOSUPPORT: 94,
  6559. EADDRNOTAVAIL: 99,
  6560. ENETRESET: 102,
  6561. EISCONN: 106,
  6562. ENOTCONN: 107,
  6563. ETOOMANYREFS: 109,
  6564. EUSERS: 87,
  6565. EDQUOT: 122,
  6566. ESTALE: 116,
  6567. ENOTSUP: 95,
  6568. ENOMEDIUM: 123,
  6569. EILSEQ: 84,
  6570. EOVERFLOW: 75,
  6571. ECANCELED: 125,
  6572. ENOTRECOVERABLE: 131,
  6573. EOWNERDEAD: 130,
  6574. ESTRPIPE: 86
  6575. };
  6576. var SYSCALLS = {
  6577. DEFAULT_POLLMASK: 5,
  6578. mappings: {},
  6579. umask: 511,
  6580. calculateAt: function(dirfd, path) {
  6581. if (path[0] !== "/") {
  6582. var dir;
  6583. if (dirfd === -100) {
  6584. dir = FS.cwd();
  6585. } else {
  6586. var dirstream = FS.getStream(dirfd);
  6587. if (!dirstream) throw new FS.ErrnoError(ERRNO_CODES.EBADF);
  6588. dir = dirstream.path;
  6589. }
  6590. path = PATH.join2(dir, path);
  6591. }
  6592. return path;
  6593. },
  6594. doStat: function(func, path, buf) {
  6595. try {
  6596. var stat = func(path);
  6597. } catch (e) {
  6598. if (e && e.node && PATH.normalize(path) !== PATH.normalize(FS.getPath(e.node))) {
  6599. return -ERRNO_CODES.ENOTDIR;
  6600. }
  6601. throw e;
  6602. }
  6603. HEAP32[buf >> 2] = stat.dev;
  6604. HEAP32[buf + 4 >> 2] = 0;
  6605. HEAP32[buf + 8 >> 2] = stat.ino;
  6606. HEAP32[buf + 12 >> 2] = stat.mode;
  6607. HEAP32[buf + 16 >> 2] = stat.nlink;
  6608. HEAP32[buf + 20 >> 2] = stat.uid;
  6609. HEAP32[buf + 24 >> 2] = stat.gid;
  6610. HEAP32[buf + 28 >> 2] = stat.rdev;
  6611. HEAP32[buf + 32 >> 2] = 0;
  6612. HEAP32[buf + 36 >> 2] = stat.size;
  6613. HEAP32[buf + 40 >> 2] = 4096;
  6614. HEAP32[buf + 44 >> 2] = stat.blocks;
  6615. HEAP32[buf + 48 >> 2] = stat.atime.getTime() / 1e3 | 0;
  6616. HEAP32[buf + 52 >> 2] = 0;
  6617. HEAP32[buf + 56 >> 2] = stat.mtime.getTime() / 1e3 | 0;
  6618. HEAP32[buf + 60 >> 2] = 0;
  6619. HEAP32[buf + 64 >> 2] = stat.ctime.getTime() / 1e3 | 0;
  6620. HEAP32[buf + 68 >> 2] = 0;
  6621. HEAP32[buf + 72 >> 2] = stat.ino;
  6622. return 0;
  6623. },
  6624. doMsync: function(addr, stream, len, flags) {
  6625. var buffer = new Uint8Array(HEAPU8.subarray(addr, addr + len));
  6626. FS.msync(stream, buffer, 0, len, flags);
  6627. },
  6628. doMkdir: function(path, mode) {
  6629. path = PATH.normalize(path);
  6630. if (path[path.length - 1] === "/") path = path.substr(0, path.length - 1);
  6631. FS.mkdir(path, mode, 0);
  6632. return 0;
  6633. },
  6634. doMknod: function(path, mode, dev) {
  6635. switch (mode & 61440) {
  6636. case 32768:
  6637. case 8192:
  6638. case 24576:
  6639. case 4096:
  6640. case 49152:
  6641. break;
  6642. default:
  6643. return -ERRNO_CODES.EINVAL;
  6644. }
  6645. FS.mknod(path, mode, dev);
  6646. return 0;
  6647. },
  6648. doReadlink: function(path, buf, bufsize) {
  6649. if (bufsize <= 0) return -ERRNO_CODES.EINVAL;
  6650. var ret = FS.readlink(path);
  6651. var len = Math.min(bufsize, lengthBytesUTF8(ret));
  6652. var endChar = HEAP8[buf + len];
  6653. stringToUTF8(ret, buf, bufsize + 1);
  6654. HEAP8[buf + len] = endChar;
  6655. return len;
  6656. },
  6657. doAccess: function(path, amode) {
  6658. if (amode & ~7) {
  6659. return -ERRNO_CODES.EINVAL;
  6660. }
  6661. var node;
  6662. var lookup = FS.lookupPath(path, {
  6663. follow: true
  6664. });
  6665. node = lookup.node;
  6666. var perms = "";
  6667. if (amode & 4) perms += "r";
  6668. if (amode & 2) perms += "w";
  6669. if (amode & 1) perms += "x";
  6670. if (perms && FS.nodePermissions(node, perms)) {
  6671. return -ERRNO_CODES.EACCES;
  6672. }
  6673. return 0;
  6674. },
  6675. doDup: function(path, flags, suggestFD) {
  6676. var suggest = FS.getStream(suggestFD);
  6677. if (suggest) FS.close(suggest);
  6678. return FS.open(path, flags, 0, suggestFD, suggestFD).fd;
  6679. },
  6680. doReadv: function(stream, iov, iovcnt, offset) {
  6681. var ret = 0;
  6682. for (var i = 0; i < iovcnt; i++) {
  6683. var ptr = HEAP32[iov + i * 8 >> 2];
  6684. var len = HEAP32[iov + (i * 8 + 4) >> 2];
  6685. var curr = FS.read(stream, HEAP8, ptr, len, offset);
  6686. if (curr < 0) return -1;
  6687. ret += curr;
  6688. if (curr < len) break;
  6689. }
  6690. return ret;
  6691. },
  6692. doWritev: function(stream, iov, iovcnt, offset) {
  6693. var ret = 0;
  6694. for (var i = 0; i < iovcnt; i++) {
  6695. var ptr = HEAP32[iov + i * 8 >> 2];
  6696. var len = HEAP32[iov + (i * 8 + 4) >> 2];
  6697. var curr = FS.write(stream, HEAP8, ptr, len, offset);
  6698. if (curr < 0) return -1;
  6699. ret += curr;
  6700. }
  6701. return ret;
  6702. },
  6703. varargs: 0,
  6704. get: function(varargs) {
  6705. SYSCALLS.varargs += 4;
  6706. var ret = HEAP32[SYSCALLS.varargs - 4 >> 2];
  6707. return ret;
  6708. },
  6709. getStr: function() {
  6710. var ret = UTF8ToString(SYSCALLS.get());
  6711. return ret;
  6712. },
  6713. getStreamFromFD: function() {
  6714. var stream = FS.getStream(SYSCALLS.get());
  6715. if (!stream) throw new FS.ErrnoError(ERRNO_CODES.EBADF);
  6716. return stream;
  6717. },
  6718. getSocketFromFD: function() {
  6719. var socket = SOCKFS.getSocket(SYSCALLS.get());
  6720. if (!socket) throw new FS.ErrnoError(ERRNO_CODES.EBADF);
  6721. return socket;
  6722. },
  6723. getSocketAddress: function(allowNull) {
  6724. var addrp = SYSCALLS.get(), addrlen = SYSCALLS.get();
  6725. if (allowNull && addrp === 0) return null;
  6726. var info = __read_sockaddr(addrp, addrlen);
  6727. if (info.errno) throw new FS.ErrnoError(info.errno);
  6728. info.addr = DNS.lookup_addr(info.addr) || info.addr;
  6729. return info;
  6730. },
  6731. get64: function() {
  6732. var low = SYSCALLS.get(), high = SYSCALLS.get();
  6733. return low;
  6734. },
  6735. getZero: function() {
  6736. SYSCALLS.get();
  6737. }
  6738. };
  6739. function ___syscall140(which, varargs) {
  6740. SYSCALLS.varargs = varargs;
  6741. try {
  6742. var stream = SYSCALLS.getStreamFromFD(), offset_high = SYSCALLS.get(), offset_low = SYSCALLS.get(), result = SYSCALLS.get(), whence = SYSCALLS.get();
  6743. var offset = offset_low;
  6744. FS.llseek(stream, offset, whence);
  6745. HEAP32[result >> 2] = stream.position;
  6746. if (stream.getdents && offset === 0 && whence === 0) stream.getdents = null;
  6747. return 0;
  6748. } catch (e) {
  6749. if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) abort(e);
  6750. return -e.errno;
  6751. }
  6752. }
  6753. function ___syscall145(which, varargs) {
  6754. SYSCALLS.varargs = varargs;
  6755. try {
  6756. var stream = SYSCALLS.getStreamFromFD(), iov = SYSCALLS.get(), iovcnt = SYSCALLS.get();
  6757. return SYSCALLS.doReadv(stream, iov, iovcnt);
  6758. } catch (e) {
  6759. if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) abort(e);
  6760. return -e.errno;
  6761. }
  6762. }
  6763. function ___syscall146(which, varargs) {
  6764. SYSCALLS.varargs = varargs;
  6765. try {
  6766. var stream = SYSCALLS.getStreamFromFD(), iov = SYSCALLS.get(), iovcnt = SYSCALLS.get();
  6767. return SYSCALLS.doWritev(stream, iov, iovcnt);
  6768. } catch (e) {
  6769. if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) abort(e);
  6770. return -e.errno;
  6771. }
  6772. }
  6773. function ___syscall195(which, varargs) {
  6774. SYSCALLS.varargs = varargs;
  6775. try {
  6776. var path = SYSCALLS.getStr(), buf = SYSCALLS.get();
  6777. return SYSCALLS.doStat(FS.stat, path, buf);
  6778. } catch (e) {
  6779. if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) abort(e);
  6780. return -e.errno;
  6781. }
  6782. }
  6783. function ___syscall220(which, varargs) {
  6784. SYSCALLS.varargs = varargs;
  6785. try {
  6786. var stream = SYSCALLS.getStreamFromFD(), dirp = SYSCALLS.get(), count = SYSCALLS.get();
  6787. if (!stream.getdents) {
  6788. stream.getdents = FS.readdir(stream.path);
  6789. }
  6790. var pos = 0;
  6791. while (stream.getdents.length > 0 && pos + 268 <= count) {
  6792. var id;
  6793. var type;
  6794. var name = stream.getdents.pop();
  6795. if (name[0] === ".") {
  6796. id = 1;
  6797. type = 4;
  6798. } else {
  6799. var child = FS.lookupNode(stream.node, name);
  6800. id = child.id;
  6801. type = FS.isChrdev(child.mode) ? 2 : FS.isDir(child.mode) ? 4 : FS.isLink(child.mode) ? 10 : 8;
  6802. }
  6803. HEAP32[dirp + pos >> 2] = id;
  6804. HEAP32[dirp + pos + 4 >> 2] = stream.position;
  6805. HEAP16[dirp + pos + 8 >> 1] = 268;
  6806. HEAP8[dirp + pos + 10 >> 0] = type;
  6807. stringToUTF8(name, dirp + pos + 11, 256);
  6808. pos += 268;
  6809. }
  6810. return pos;
  6811. } catch (e) {
  6812. if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) abort(e);
  6813. return -e.errno;
  6814. }
  6815. }
  6816. function ___syscall221(which, varargs) {
  6817. SYSCALLS.varargs = varargs;
  6818. try {
  6819. var stream = SYSCALLS.getStreamFromFD(), cmd = SYSCALLS.get();
  6820. switch (cmd) {
  6821. case 0:
  6822. {
  6823. var arg = SYSCALLS.get();
  6824. if (arg < 0) {
  6825. return -ERRNO_CODES.EINVAL;
  6826. }
  6827. var newStream;
  6828. newStream = FS.open(stream.path, stream.flags, 0, arg);
  6829. return newStream.fd;
  6830. }
  6831. case 1:
  6832. case 2:
  6833. return 0;
  6834. case 3:
  6835. return stream.flags;
  6836. case 4:
  6837. {
  6838. var arg = SYSCALLS.get();
  6839. stream.flags |= arg;
  6840. return 0;
  6841. }
  6842. case 12:
  6843. {
  6844. var arg = SYSCALLS.get();
  6845. var offset = 0;
  6846. HEAP16[arg + offset >> 1] = 2;
  6847. return 0;
  6848. }
  6849. case 13:
  6850. case 14:
  6851. return 0;
  6852. case 16:
  6853. case 8:
  6854. return -ERRNO_CODES.EINVAL;
  6855. case 9:
  6856. ___setErrNo(ERRNO_CODES.EINVAL);
  6857. return -1;
  6858. default:
  6859. {
  6860. return -ERRNO_CODES.EINVAL;
  6861. }
  6862. }
  6863. } catch (e) {
  6864. if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) abort(e);
  6865. return -e.errno;
  6866. }
  6867. }
  6868. function ___syscall5(which, varargs) {
  6869. SYSCALLS.varargs = varargs;
  6870. try {
  6871. var pathname = SYSCALLS.getStr(), flags = SYSCALLS.get(), mode = SYSCALLS.get();
  6872. var stream = FS.open(pathname, flags, mode);
  6873. return stream.fd;
  6874. } catch (e) {
  6875. if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) abort(e);
  6876. return -e.errno;
  6877. }
  6878. }
  6879. function ___syscall54(which, varargs) {
  6880. SYSCALLS.varargs = varargs;
  6881. try {
  6882. var stream = SYSCALLS.getStreamFromFD(), op = SYSCALLS.get();
  6883. switch (op) {
  6884. case 21509:
  6885. case 21505:
  6886. {
  6887. if (!stream.tty) return -ERRNO_CODES.ENOTTY;
  6888. return 0;
  6889. }
  6890. case 21510:
  6891. case 21511:
  6892. case 21512:
  6893. case 21506:
  6894. case 21507:
  6895. case 21508:
  6896. {
  6897. if (!stream.tty) return -ERRNO_CODES.ENOTTY;
  6898. return 0;
  6899. }
  6900. case 21519:
  6901. {
  6902. if (!stream.tty) return -ERRNO_CODES.ENOTTY;
  6903. var argp = SYSCALLS.get();
  6904. HEAP32[argp >> 2] = 0;
  6905. return 0;
  6906. }
  6907. case 21520:
  6908. {
  6909. if (!stream.tty) return -ERRNO_CODES.ENOTTY;
  6910. return -ERRNO_CODES.EINVAL;
  6911. }
  6912. case 21531:
  6913. {
  6914. var argp = SYSCALLS.get();
  6915. return FS.ioctl(stream, op, argp);
  6916. }
  6917. case 21523:
  6918. {
  6919. if (!stream.tty) return -ERRNO_CODES.ENOTTY;
  6920. return 0;
  6921. }
  6922. case 21524:
  6923. {
  6924. if (!stream.tty) return -ERRNO_CODES.ENOTTY;
  6925. return 0;
  6926. }
  6927. default:
  6928. abort("bad ioctl syscall " + op);
  6929. }
  6930. } catch (e) {
  6931. if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) abort(e);
  6932. return -e.errno;
  6933. }
  6934. }
  6935. function ___syscall6(which, varargs) {
  6936. SYSCALLS.varargs = varargs;
  6937. try {
  6938. var stream = SYSCALLS.getStreamFromFD();
  6939. FS.close(stream);
  6940. return 0;
  6941. } catch (e) {
  6942. if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) abort(e);
  6943. return -e.errno;
  6944. }
  6945. }
  6946. function ___unlock() {}
  6947. function _abort() {
  6948. Module["abort"]();
  6949. }
  6950. function _emscripten_async_wget_data(url, arg, onload, onerror) {
  6951. Browser.asyncLoad(UTF8ToString(url), function(byteArray) {
  6952. var buffer = _malloc(byteArray.length);
  6953. HEAPU8.set(byteArray, buffer);
  6954. dynCall_viii(onload, arg, buffer, byteArray.length);
  6955. _free(buffer);
  6956. }, function() {
  6957. if (onerror) dynCall_vi(onerror, arg);
  6958. }, true);
  6959. }
  6960. function _emscripten_get_heap_size() {
  6961. return TOTAL_MEMORY;
  6962. }
  6963. function abortOnCannotGrowMemory(requestedSize) {
  6964. abort("Cannot enlarge memory arrays to size " + requestedSize + " bytes. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value " + TOTAL_MEMORY + ", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or (4) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ");
  6965. }
  6966. function _emscripten_resize_heap(requestedSize) {
  6967. abortOnCannotGrowMemory(requestedSize);
  6968. }
  6969. function _exit(status) {
  6970. exit(status);
  6971. }
  6972. var ___tm_current = 3042576;
  6973. var ___tm_timezone = (stringToUTF8("GMT", 3042624, 4), 3042624);
  6974. function _gmtime_r(time, tmPtr) {
  6975. var date = new Date(HEAP32[time >> 2] * 1e3);
  6976. HEAP32[tmPtr >> 2] = date.getUTCSeconds();
  6977. HEAP32[tmPtr + 4 >> 2] = date.getUTCMinutes();
  6978. HEAP32[tmPtr + 8 >> 2] = date.getUTCHours();
  6979. HEAP32[tmPtr + 12 >> 2] = date.getUTCDate();
  6980. HEAP32[tmPtr + 16 >> 2] = date.getUTCMonth();
  6981. HEAP32[tmPtr + 20 >> 2] = date.getUTCFullYear() - 1900;
  6982. HEAP32[tmPtr + 24 >> 2] = date.getUTCDay();
  6983. HEAP32[tmPtr + 36 >> 2] = 0;
  6984. HEAP32[tmPtr + 32 >> 2] = 0;
  6985. var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0);
  6986. var yday = (date.getTime() - start) / (1e3 * 60 * 60 * 24) | 0;
  6987. HEAP32[tmPtr + 28 >> 2] = yday;
  6988. HEAP32[tmPtr + 40 >> 2] = ___tm_timezone;
  6989. return tmPtr;
  6990. }
  6991. function _gmtime(time) {
  6992. return _gmtime_r(time, ___tm_current);
  6993. }
  6994. function _tzset() {
  6995. if (_tzset.called) return;
  6996. _tzset.called = true;
  6997. HEAP32[__get_timezone() >> 2] = new Date().getTimezoneOffset() * 60;
  6998. var winter = new Date(2e3, 0, 1);
  6999. var summer = new Date(2e3, 6, 1);
  7000. HEAP32[__get_daylight() >> 2] = Number(winter.getTimezoneOffset() != summer.getTimezoneOffset());
  7001. function extractZone(date) {
  7002. var match = date.toTimeString().match(/\(([A-Za-z ]+)\)$/);
  7003. return match ? match[1] : "GMT";
  7004. }
  7005. var winterName = extractZone(winter);
  7006. var summerName = extractZone(summer);
  7007. var winterNamePtr = allocate(intArrayFromString(winterName), "i8", ALLOC_NORMAL);
  7008. var summerNamePtr = allocate(intArrayFromString(summerName), "i8", ALLOC_NORMAL);
  7009. if (summer.getTimezoneOffset() < winter.getTimezoneOffset()) {
  7010. HEAP32[__get_tzname() >> 2] = winterNamePtr;
  7011. HEAP32[__get_tzname() + 4 >> 2] = summerNamePtr;
  7012. } else {
  7013. HEAP32[__get_tzname() >> 2] = summerNamePtr;
  7014. HEAP32[__get_tzname() + 4 >> 2] = winterNamePtr;
  7015. }
  7016. }
  7017. function _localtime_r(time, tmPtr) {
  7018. _tzset();
  7019. var date = new Date(HEAP32[time >> 2] * 1e3);
  7020. HEAP32[tmPtr >> 2] = date.getSeconds();
  7021. HEAP32[tmPtr + 4 >> 2] = date.getMinutes();
  7022. HEAP32[tmPtr + 8 >> 2] = date.getHours();
  7023. HEAP32[tmPtr + 12 >> 2] = date.getDate();
  7024. HEAP32[tmPtr + 16 >> 2] = date.getMonth();
  7025. HEAP32[tmPtr + 20 >> 2] = date.getFullYear() - 1900;
  7026. HEAP32[tmPtr + 24 >> 2] = date.getDay();
  7027. var start = new Date(date.getFullYear(), 0, 1);
  7028. var yday = (date.getTime() - start.getTime()) / (1e3 * 60 * 60 * 24) | 0;
  7029. HEAP32[tmPtr + 28 >> 2] = yday;
  7030. HEAP32[tmPtr + 36 >> 2] = -(date.getTimezoneOffset() * 60);
  7031. var summerOffset = new Date(2e3, 6, 1).getTimezoneOffset();
  7032. var winterOffset = start.getTimezoneOffset();
  7033. var dst = (summerOffset != winterOffset && date.getTimezoneOffset() == Math.min(winterOffset, summerOffset)) | 0;
  7034. HEAP32[tmPtr + 32 >> 2] = dst;
  7035. var zonePtr = HEAP32[__get_tzname() + (dst ? 4 : 0) >> 2];
  7036. HEAP32[tmPtr + 40 >> 2] = zonePtr;
  7037. return tmPtr;
  7038. }
  7039. function _localtime(time) {
  7040. return _localtime_r(time, ___tm_current);
  7041. }
  7042. function _longjmp(env, value) {
  7043. _setThrew(env, value || 1);
  7044. throw "longjmp";
  7045. }
  7046. function _emscripten_memcpy_big(dest, src, num) {
  7047. HEAPU8.set(HEAPU8.subarray(src, src + num), dest);
  7048. }
  7049. function __isLeapYear(year) {
  7050. return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
  7051. }
  7052. function __arraySum(array, index) {
  7053. var sum = 0;
  7054. for (var i = 0; i <= index; sum += array[i++]) ;
  7055. return sum;
  7056. }
  7057. var __MONTH_DAYS_LEAP = [ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];
  7058. var __MONTH_DAYS_REGULAR = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];
  7059. function __addDays(date, days) {
  7060. var newDate = new Date(date.getTime());
  7061. while (days > 0) {
  7062. var leap = __isLeapYear(newDate.getFullYear());
  7063. var currentMonth = newDate.getMonth();
  7064. var daysInCurrentMonth = (leap ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR)[currentMonth];
  7065. if (days > daysInCurrentMonth - newDate.getDate()) {
  7066. days -= daysInCurrentMonth - newDate.getDate() + 1;
  7067. newDate.setDate(1);
  7068. if (currentMonth < 11) {
  7069. newDate.setMonth(currentMonth + 1);
  7070. } else {
  7071. newDate.setMonth(0);
  7072. newDate.setFullYear(newDate.getFullYear() + 1);
  7073. }
  7074. } else {
  7075. newDate.setDate(newDate.getDate() + days);
  7076. return newDate;
  7077. }
  7078. }
  7079. return newDate;
  7080. }
  7081. function _strftime(s, maxsize, format, tm) {
  7082. var tm_zone = HEAP32[tm + 40 >> 2];
  7083. var date = {
  7084. tm_sec: HEAP32[tm >> 2],
  7085. tm_min: HEAP32[tm + 4 >> 2],
  7086. tm_hour: HEAP32[tm + 8 >> 2],
  7087. tm_mday: HEAP32[tm + 12 >> 2],
  7088. tm_mon: HEAP32[tm + 16 >> 2],
  7089. tm_year: HEAP32[tm + 20 >> 2],
  7090. tm_wday: HEAP32[tm + 24 >> 2],
  7091. tm_yday: HEAP32[tm + 28 >> 2],
  7092. tm_isdst: HEAP32[tm + 32 >> 2],
  7093. tm_gmtoff: HEAP32[tm + 36 >> 2],
  7094. tm_zone: tm_zone ? UTF8ToString(tm_zone) : ""
  7095. };
  7096. var pattern = UTF8ToString(format);
  7097. var EXPANSION_RULES_1 = {
  7098. "%c": "%a %b %d %H:%M:%S %Y",
  7099. "%D": "%m/%d/%y",
  7100. "%F": "%Y-%m-%d",
  7101. "%h": "%b",
  7102. "%r": "%I:%M:%S %p",
  7103. "%R": "%H:%M",
  7104. "%T": "%H:%M:%S",
  7105. "%x": "%m/%d/%y",
  7106. "%X": "%H:%M:%S"
  7107. };
  7108. for (var rule in EXPANSION_RULES_1) {
  7109. pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_1[rule]);
  7110. }
  7111. var WEEKDAYS = [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ];
  7112. var MONTHS = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ];
  7113. function leadingSomething(value, digits, character) {
  7114. var str = typeof value === "number" ? value.toString() : value || "";
  7115. while (str.length < digits) {
  7116. str = character[0] + str;
  7117. }
  7118. return str;
  7119. }
  7120. function leadingNulls(value, digits) {
  7121. return leadingSomething(value, digits, "0");
  7122. }
  7123. function compareByDay(date1, date2) {
  7124. function sgn(value) {
  7125. return value < 0 ? -1 : value > 0 ? 1 : 0;
  7126. }
  7127. var compare;
  7128. if ((compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0) {
  7129. if ((compare = sgn(date1.getMonth() - date2.getMonth())) === 0) {
  7130. compare = sgn(date1.getDate() - date2.getDate());
  7131. }
  7132. }
  7133. return compare;
  7134. }
  7135. function getFirstWeekStartDate(janFourth) {
  7136. switch (janFourth.getDay()) {
  7137. case 0:
  7138. return new Date(janFourth.getFullYear() - 1, 11, 29);
  7139. case 1:
  7140. return janFourth;
  7141. case 2:
  7142. return new Date(janFourth.getFullYear(), 0, 3);
  7143. case 3:
  7144. return new Date(janFourth.getFullYear(), 0, 2);
  7145. case 4:
  7146. return new Date(janFourth.getFullYear(), 0, 1);
  7147. case 5:
  7148. return new Date(janFourth.getFullYear() - 1, 11, 31);
  7149. case 6:
  7150. return new Date(janFourth.getFullYear() - 1, 11, 30);
  7151. }
  7152. }
  7153. function getWeekBasedYear(date) {
  7154. var thisDate = __addDays(new Date(date.tm_year + 1900, 0, 1), date.tm_yday);
  7155. var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4);
  7156. var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4);
  7157. var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear);
  7158. var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear);
  7159. if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) {
  7160. if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) {
  7161. return thisDate.getFullYear() + 1;
  7162. } else {
  7163. return thisDate.getFullYear();
  7164. }
  7165. } else {
  7166. return thisDate.getFullYear() - 1;
  7167. }
  7168. }
  7169. var EXPANSION_RULES_2 = {
  7170. "%a": function(date) {
  7171. return WEEKDAYS[date.tm_wday].substring(0, 3);
  7172. },
  7173. "%A": function(date) {
  7174. return WEEKDAYS[date.tm_wday];
  7175. },
  7176. "%b": function(date) {
  7177. return MONTHS[date.tm_mon].substring(0, 3);
  7178. },
  7179. "%B": function(date) {
  7180. return MONTHS[date.tm_mon];
  7181. },
  7182. "%C": function(date) {
  7183. var year = date.tm_year + 1900;
  7184. return leadingNulls(year / 100 | 0, 2);
  7185. },
  7186. "%d": function(date) {
  7187. return leadingNulls(date.tm_mday, 2);
  7188. },
  7189. "%e": function(date) {
  7190. return leadingSomething(date.tm_mday, 2, " ");
  7191. },
  7192. "%g": function(date) {
  7193. return getWeekBasedYear(date).toString().substring(2);
  7194. },
  7195. "%G": function(date) {
  7196. return getWeekBasedYear(date);
  7197. },
  7198. "%H": function(date) {
  7199. return leadingNulls(date.tm_hour, 2);
  7200. },
  7201. "%I": function(date) {
  7202. var twelveHour = date.tm_hour;
  7203. if (twelveHour == 0) twelveHour = 12; else if (twelveHour > 12) twelveHour -= 12;
  7204. return leadingNulls(twelveHour, 2);
  7205. },
  7206. "%j": function(date) {
  7207. return leadingNulls(date.tm_mday + __arraySum(__isLeapYear(date.tm_year + 1900) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, date.tm_mon - 1), 3);
  7208. },
  7209. "%m": function(date) {
  7210. return leadingNulls(date.tm_mon + 1, 2);
  7211. },
  7212. "%M": function(date) {
  7213. return leadingNulls(date.tm_min, 2);
  7214. },
  7215. "%n": function() {
  7216. return "\n";
  7217. },
  7218. "%p": function(date) {
  7219. if (date.tm_hour >= 0 && date.tm_hour < 12) {
  7220. return "AM";
  7221. } else {
  7222. return "PM";
  7223. }
  7224. },
  7225. "%S": function(date) {
  7226. return leadingNulls(date.tm_sec, 2);
  7227. },
  7228. "%t": function() {
  7229. return "\t";
  7230. },
  7231. "%u": function(date) {
  7232. var day = new Date(date.tm_year + 1900, date.tm_mon + 1, date.tm_mday, 0, 0, 0, 0);
  7233. return day.getDay() || 7;
  7234. },
  7235. "%U": function(date) {
  7236. var janFirst = new Date(date.tm_year + 1900, 0, 1);
  7237. var firstSunday = janFirst.getDay() === 0 ? janFirst : __addDays(janFirst, 7 - janFirst.getDay());
  7238. var endDate = new Date(date.tm_year + 1900, date.tm_mon, date.tm_mday);
  7239. if (compareByDay(firstSunday, endDate) < 0) {
  7240. var februaryFirstUntilEndMonth = __arraySum(__isLeapYear(endDate.getFullYear()) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, endDate.getMonth() - 1) - 31;
  7241. var firstSundayUntilEndJanuary = 31 - firstSunday.getDate();
  7242. var days = firstSundayUntilEndJanuary + februaryFirstUntilEndMonth + endDate.getDate();
  7243. return leadingNulls(Math.ceil(days / 7), 2);
  7244. }
  7245. return compareByDay(firstSunday, janFirst) === 0 ? "01" : "00";
  7246. },
  7247. "%V": function(date) {
  7248. var janFourthThisYear = new Date(date.tm_year + 1900, 0, 4);
  7249. var janFourthNextYear = new Date(date.tm_year + 1901, 0, 4);
  7250. var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear);
  7251. var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear);
  7252. var endDate = __addDays(new Date(date.tm_year + 1900, 0, 1), date.tm_yday);
  7253. if (compareByDay(endDate, firstWeekStartThisYear) < 0) {
  7254. return "53";
  7255. }
  7256. if (compareByDay(firstWeekStartNextYear, endDate) <= 0) {
  7257. return "01";
  7258. }
  7259. var daysDifference;
  7260. if (firstWeekStartThisYear.getFullYear() < date.tm_year + 1900) {
  7261. daysDifference = date.tm_yday + 32 - firstWeekStartThisYear.getDate();
  7262. } else {
  7263. daysDifference = date.tm_yday + 1 - firstWeekStartThisYear.getDate();
  7264. }
  7265. return leadingNulls(Math.ceil(daysDifference / 7), 2);
  7266. },
  7267. "%w": function(date) {
  7268. var day = new Date(date.tm_year + 1900, date.tm_mon + 1, date.tm_mday, 0, 0, 0, 0);
  7269. return day.getDay();
  7270. },
  7271. "%W": function(date) {
  7272. var janFirst = new Date(date.tm_year, 0, 1);
  7273. var firstMonday = janFirst.getDay() === 1 ? janFirst : __addDays(janFirst, janFirst.getDay() === 0 ? 1 : 7 - janFirst.getDay() + 1);
  7274. var endDate = new Date(date.tm_year + 1900, date.tm_mon, date.tm_mday);
  7275. if (compareByDay(firstMonday, endDate) < 0) {
  7276. var februaryFirstUntilEndMonth = __arraySum(__isLeapYear(endDate.getFullYear()) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, endDate.getMonth() - 1) - 31;
  7277. var firstMondayUntilEndJanuary = 31 - firstMonday.getDate();
  7278. var days = firstMondayUntilEndJanuary + februaryFirstUntilEndMonth + endDate.getDate();
  7279. return leadingNulls(Math.ceil(days / 7), 2);
  7280. }
  7281. return compareByDay(firstMonday, janFirst) === 0 ? "01" : "00";
  7282. },
  7283. "%y": function(date) {
  7284. return (date.tm_year + 1900).toString().substring(2);
  7285. },
  7286. "%Y": function(date) {
  7287. return date.tm_year + 1900;
  7288. },
  7289. "%z": function(date) {
  7290. var off = date.tm_gmtoff;
  7291. var ahead = off >= 0;
  7292. off = Math.abs(off) / 60;
  7293. off = off / 60 * 100 + off % 60;
  7294. return (ahead ? "+" : "-") + String("0000" + off).slice(-4);
  7295. },
  7296. "%Z": function(date) {
  7297. return date.tm_zone;
  7298. },
  7299. "%%": function() {
  7300. return "%";
  7301. }
  7302. };
  7303. for (var rule in EXPANSION_RULES_2) {
  7304. if (pattern.indexOf(rule) >= 0) {
  7305. pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_2[rule](date));
  7306. }
  7307. }
  7308. var bytes = intArrayFromString(pattern, false);
  7309. if (bytes.length > maxsize) {
  7310. return 0;
  7311. }
  7312. writeArrayToMemory(bytes, s);
  7313. return bytes.length - 1;
  7314. }
  7315. function _time(ptr) {
  7316. var ret = Date.now() / 1e3 | 0;
  7317. if (ptr) {
  7318. HEAP32[ptr >> 2] = ret;
  7319. }
  7320. return ret;
  7321. }
  7322. FS.staticInit();
  7323. __ATINIT__.unshift(function() {
  7324. if (!Module["noFSInit"] && !FS.init.initialized) FS.init();
  7325. });
  7326. __ATMAIN__.push(function() {
  7327. FS.ignorePermissions = false;
  7328. });
  7329. __ATEXIT__.push(function() {
  7330. FS.quit();
  7331. });
  7332. Module["FS_createFolder"] = FS.createFolder;
  7333. Module["FS_createPath"] = FS.createPath;
  7334. Module["FS_createDataFile"] = FS.createDataFile;
  7335. Module["FS_createPreloadedFile"] = FS.createPreloadedFile;
  7336. Module["FS_createLazyFile"] = FS.createLazyFile;
  7337. Module["FS_createLink"] = FS.createLink;
  7338. Module["FS_createDevice"] = FS.createDevice;
  7339. Module["FS_unlink"] = FS.unlink;
  7340. __ATINIT__.unshift(function() {
  7341. TTY.init();
  7342. });
  7343. __ATEXIT__.push(function() {
  7344. TTY.shutdown();
  7345. });
  7346. if (ENVIRONMENT_IS_NODE) {
  7347. var fs = require("fs");
  7348. var NODEJS_PATH = require("path");
  7349. NODEFS.staticInit();
  7350. }
  7351. Module["requestFullScreen"] = function Module_requestFullScreen(lockPointer, resizeCanvas, vrDevice) {
  7352. err("Module.requestFullScreen is deprecated. Please call Module.requestFullscreen instead.");
  7353. Module["requestFullScreen"] = Module["requestFullscreen"];
  7354. Browser.requestFullScreen(lockPointer, resizeCanvas, vrDevice);
  7355. };
  7356. Module["requestFullscreen"] = function Module_requestFullscreen(lockPointer, resizeCanvas, vrDevice) {
  7357. Browser.requestFullscreen(lockPointer, resizeCanvas, vrDevice);
  7358. };
  7359. Module["requestAnimationFrame"] = function Module_requestAnimationFrame(func) {
  7360. Browser.requestAnimationFrame(func);
  7361. };
  7362. Module["setCanvasSize"] = function Module_setCanvasSize(width, height, noUpdates) {
  7363. Browser.setCanvasSize(width, height, noUpdates);
  7364. };
  7365. Module["pauseMainLoop"] = function Module_pauseMainLoop() {
  7366. Browser.mainLoop.pause();
  7367. };
  7368. Module["resumeMainLoop"] = function Module_resumeMainLoop() {
  7369. Browser.mainLoop.resume();
  7370. };
  7371. Module["getUserMedia"] = function Module_getUserMedia() {
  7372. Browser.getUserMedia();
  7373. };
  7374. Module["createContext"] = function Module_createContext(canvas, useWebGL, setInModule, webGLContextAttributes) {
  7375. return Browser.createContext(canvas, useWebGL, setInModule, webGLContextAttributes);
  7376. };
  7377. if (ENVIRONMENT_IS_NODE) {
  7378. _emscripten_get_now = function _emscripten_get_now_actual() {
  7379. var t = process["hrtime"]();
  7380. return t[0] * 1e3 + t[1] / 1e6;
  7381. };
  7382. } else if (typeof dateNow !== "undefined") {
  7383. _emscripten_get_now = dateNow;
  7384. } else if (typeof self === "object" && self["performance"] && typeof self["performance"]["now"] === "function") {
  7385. _emscripten_get_now = function() {
  7386. return self["performance"]["now"]();
  7387. };
  7388. } else if (typeof performance === "object" && typeof performance["now"] === "function") {
  7389. _emscripten_get_now = function() {
  7390. return performance["now"]();
  7391. };
  7392. } else {
  7393. _emscripten_get_now = Date.now;
  7394. }
  7395. var GLctx;
  7396. GL.init();
  7397. var ASSERTIONS = false;
  7398. function intArrayFromString(stringy, dontAddNull, length) {
  7399. var len = length > 0 ? length : lengthBytesUTF8(stringy) + 1;
  7400. var u8array = new Array(len);
  7401. var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length);
  7402. if (dontAddNull) u8array.length = numBytesWritten;
  7403. return u8array;
  7404. }
  7405. function intArrayToString(array) {
  7406. var ret = [];
  7407. for (var i = 0; i < array.length; i++) {
  7408. var chr = array[i];
  7409. if (chr > 255) {
  7410. if (ASSERTIONS) {
  7411. assert(false, "Character code " + chr + " (" + String.fromCharCode(chr) + ") at offset " + i + " not in 0x00-0xFF.");
  7412. }
  7413. chr &= 255;
  7414. }
  7415. ret.push(String.fromCharCode(chr));
  7416. }
  7417. return ret.join("");
  7418. }
  7419. var decodeBase64 = typeof atob === "function" ? atob : function(input) {
  7420. var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
  7421. var output = "";
  7422. var chr1, chr2, chr3;
  7423. var enc1, enc2, enc3, enc4;
  7424. var i = 0;
  7425. input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
  7426. do {
  7427. enc1 = keyStr.indexOf(input.charAt(i++));
  7428. enc2 = keyStr.indexOf(input.charAt(i++));
  7429. enc3 = keyStr.indexOf(input.charAt(i++));
  7430. enc4 = keyStr.indexOf(input.charAt(i++));
  7431. chr1 = enc1 << 2 | enc2 >> 4;
  7432. chr2 = (enc2 & 15) << 4 | enc3 >> 2;
  7433. chr3 = (enc3 & 3) << 6 | enc4;
  7434. output = output + String.fromCharCode(chr1);
  7435. if (enc3 !== 64) {
  7436. output = output + String.fromCharCode(chr2);
  7437. }
  7438. if (enc4 !== 64) {
  7439. output = output + String.fromCharCode(chr3);
  7440. }
  7441. } while (i < input.length);
  7442. return output;
  7443. };
  7444. function intArrayFromBase64(s) {
  7445. if (typeof ENVIRONMENT_IS_NODE === "boolean" && ENVIRONMENT_IS_NODE) {
  7446. var buf;
  7447. try {
  7448. buf = Buffer.from(s, "base64");
  7449. } catch (_) {
  7450. buf = new Buffer(s, "base64");
  7451. }
  7452. return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);
  7453. }
  7454. try {
  7455. var decoded = decodeBase64(s);
  7456. var bytes = new Uint8Array(decoded.length);
  7457. for (var i = 0; i < decoded.length; ++i) {
  7458. bytes[i] = decoded.charCodeAt(i);
  7459. }
  7460. return bytes;
  7461. } catch (_) {
  7462. throw new Error("Converting base64 string to bytes failed.");
  7463. }
  7464. }
  7465. function tryParseAsDataURI(filename) {
  7466. if (!isDataURI(filename)) {
  7467. return;
  7468. }
  7469. return intArrayFromBase64(filename.slice(dataURIPrefix.length));
  7470. }
  7471. function invoke_vii(index, a1, a2) {
  7472. var sp = stackSave();
  7473. try {
  7474. dynCall_vii(index, a1, a2);
  7475. } catch (e) {
  7476. stackRestore(sp);
  7477. if (e !== e + 0 && e !== "longjmp") throw e;
  7478. _setThrew(1, 0);
  7479. }
  7480. }
  7481. var asmGlobalArg = {
  7482. "Math": Math,
  7483. "Int8Array": Int8Array,
  7484. "Int16Array": Int16Array,
  7485. "Int32Array": Int32Array,
  7486. "Uint8Array": Uint8Array,
  7487. "Uint16Array": Uint16Array,
  7488. "Float32Array": Float32Array,
  7489. "Float64Array": Float64Array,
  7490. "NaN": NaN,
  7491. Infinity: Infinity
  7492. };
  7493. var asmLibraryArg = {
  7494. "a": abort,
  7495. "b": setTempRet0,
  7496. "c": getTempRet0,
  7497. "d": invoke_vii,
  7498. "e": _SDL_ClearError,
  7499. "f": _SDL_GetError,
  7500. "g": _SDL_GetModState,
  7501. "h": _SDL_GetMouseState,
  7502. "i": _SDL_GetTicks,
  7503. "j": _SDL_GetWindowSize,
  7504. "k": _SDL_Init,
  7505. "l": _SDL_LockAudio,
  7506. "m": _SDL_LockSurface,
  7507. "n": _SDL_PollEvent,
  7508. "o": _SDL_SetVideoMode,
  7509. "p": _SDL_UnlockAudio,
  7510. "q": _SDL_UnlockSurface,
  7511. "r": ___buildEnvironment,
  7512. "s": ___lock,
  7513. "t": ___setErrNo,
  7514. "u": ___syscall140,
  7515. "v": ___syscall145,
  7516. "w": ___syscall146,
  7517. "x": ___syscall195,
  7518. "y": ___syscall220,
  7519. "z": ___syscall221,
  7520. "A": ___syscall5,
  7521. "B": ___syscall54,
  7522. "C": ___syscall6,
  7523. "D": ___unlock,
  7524. "E": __addDays,
  7525. "F": __arraySum,
  7526. "G": __isLeapYear,
  7527. "H": _abort,
  7528. "I": _emscripten_asm_const_i,
  7529. "J": _emscripten_asm_const_ii,
  7530. "K": _emscripten_asm_const_iii,
  7531. "L": _emscripten_asm_const_iiiiiii,
  7532. "M": _emscripten_async_wget_data,
  7533. "N": _emscripten_get_heap_size,
  7534. "O": _emscripten_get_now,
  7535. "P": _emscripten_memcpy_big,
  7536. "Q": _emscripten_resize_heap,
  7537. "R": _emscripten_set_main_loop,
  7538. "S": _emscripten_set_main_loop_timing,
  7539. "T": _exit,
  7540. "U": _gmtime,
  7541. "V": _gmtime_r,
  7542. "W": _localtime,
  7543. "X": _localtime_r,
  7544. "Y": _longjmp,
  7545. "Z": _strftime,
  7546. "_": _time,
  7547. "$": _tzset,
  7548. "aa": abortOnCannotGrowMemory,
  7549. "ab": tempDoublePtr,
  7550. "ac": DYNAMICTOP_PTR
  7551. };
  7552. // EMSCRIPTEN_START_ASM
  7553. var asm = (/** @suppress {uselessCode} */ function(global,env,buffer) {
  7554. "use asm";var a=new global.Int8Array(buffer),b=new global.Int16Array(buffer),c=new global.Int32Array(buffer),d=new global.Uint8Array(buffer),e=new global.Uint16Array(buffer),f=new global.Float32Array(buffer),g=new global.Float64Array(buffer),h=env.ab|0,i=env.ac|0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=global.NaN,s=global.Infinity,t=global.Math.floor,u=global.Math.abs,v=global.Math.sqrt,w=global.Math.cos,x=global.Math.sin,y=global.Math.atan,z=global.Math.atan2,A=global.Math.ceil,B=global.Math.imul,C=global.Math.min,D=global.Math.clz32,E=env.a,F=env.b,G=env.c,H=env.d,I=env.e,J=env.f,K=env.g,L=env.h,M=env.i,N=env.j,O=env.k,P=env.l,Q=env.m,R=env.n,S=env.o,T=env.p,U=env.q,V=env.r,W=env.s,X=env.t,Y=env.u,Z=env.v,_=env.w,$=env.x,aa=env.y,ba=env.z,ca=env.A,da=env.B,ea=env.C,fa=env.D,ga=env.E,ha=env.F,ia=env.G,ja=env.H,ka=env.I,la=env.J,ma=env.K,na=env.L,oa=env.M,pa=env.N,qa=env.O,ra=env.P,sa=env.Q,ta=env.R,ua=env.S,va=env.T,wa=env.U,xa=env.V,ya=env.W,za=env.X,Aa=env.Y,Ba=env.Z,Ca=env._,Da=env.$,Ea=env.aa,Fa=3042736,Ga=8285616,Ha=0.0;
  7555. // EMSCRIPTEN_START_FUNCS
  7556. function zf(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;b=Fa;Fa=Fa+16|0;d=b+8|0;e=b;f=a+16|0;g=c[c[f>>2]>>2]|0;h=g+16|0;i=a+8|0;j=c[i>>2]|0;if(h>>>0>=j>>>0|(h|0)==2099900)k=-1;else k=c[g+20>>2]&15;h=g+8|0;if(!(h>>>0>=j>>>0|(h|0)==2099900)){h=c[g+12>>2]&15;if((h|0)!=5){l=h+1|0;m=6}}else{l=0;m=6}if((m|0)==6){m=c[16+(l<<2)>>2]|0;c[e>>2]=45485;c[e+4>>2]=m;jf(a,1,Dd(a,47715,e)|0)|0}switch(k|0){case 0:case 5:break;default:jf(a,2,48006)|0}if(rf(a,1,47994)|0)kf(a,48028,d)|0;d=c[c[f>>2]>>2]|0;f=c[i>>2]|0;k=d+24|0;if(f>>>0>=k>>>0){c[i>>2]=k;Ld(a,1)|0;Fa=b;return 1}e=(d+20+(3-f)|0)>>>3;d=f;do{c[d+4>>2]=0;d=d+8|0}while(d>>>0<k>>>0);c[i>>2]=f+(e+1<<3);c[i>>2]=k;Ld(a,1)|0;Fa=b;return 1}function Af(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;b=a+16|0;d=c[c[b>>2]>>2]|0;e=d+8|0;f=a+8|0;g=c[f>>2]|0;if(e>>>0>=g>>>0|(e|0)==2099900){jf(a,1,47735)|0;h=c[c[b>>2]>>2]|0;i=c[f>>2]|0}else{h=d;i=g}g=h+16|0;if(g>>>0>=i>>>0|(g|0)==2099900){jf(a,2,47735)|0;a=c[c[b>>2]>>2]|0;j=a+16|0;k=a;l=c[f>>2]|0}else{j=g;k=h;l=i}i=k+8|0;k=i>>>0<l>>>0?i:2099900;i=j>>>0<l>>>0?j:2099900;if((k|0)!=2099900&(i|0)!=2099900?(c[k+4>>2]|0)==(c[i+4>>2]|0):0){j=(Ec(0,k,i)|0)!=0&1;m=j;n=c[f>>2]|0}else{m=0;n=l}c[n>>2]=m;c[n+4>>2]=1;c[f>>2]=(c[f>>2]|0)+8;return 1}function Bf(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;b=a+16|0;d=c[c[b>>2]>>2]|0;e=d+8|0;f=a+8|0;g=c[f>>2]|0;if(!(e>>>0>=g>>>0|(e|0)==2099900)?(c[d+12>>2]&14|1|0)==5:0){h=e;i=g}else{jf(a,1,48064)|0;h=(c[c[b>>2]>>2]|0)+8|0;i=c[f>>2]|0}b=h>>>0<i>>>0?h:2099900;switch(c[b+4>>2]&15){case 4:{j=c[(c[b>>2]|0)+12>>2]|0;break}case 7:{j=c[(c[b>>2]|0)+16>>2]|0;break}case 5:{j=cd(c[b>>2]|0)|0;break}default:j=0}c[i>>2]=j<<16;c[i+4>>2]=3;c[f>>2]=(c[f>>2]|0)+8;return 1}function Cf(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;b=Fa;Fa=Fa+16|0;d=b;e=a+16|0;f=c[c[e>>2]>>2]|0;g=f+8|0;h=a+8|0;i=c[h>>2]|0;if(!(g>>>0>=i>>>0|(g|0)==2099900)){g=c[f+12>>2]&15;if((g|0)==5){j=f;k=i}else{l=g+1|0;m=4}}else{l=0;m=4}if((m|0)==4){m=c[16+(l<<2)>>2]|0;c[d>>2]=45485;c[d+4>>2]=m;jf(a,1,Dd(a,47715,d)|0)|0;j=c[c[e>>2]>>2]|0;k=c[h>>2]|0}d=j+16|0;if(d>>>0>=k>>>0|(d|0)==2099900){jf(a,2,47735)|0;n=c[c[e>>2]>>2]|0;o=c[h>>2]|0}else{n=j;o=k}k=n+8|0;j=n+24|0;if(o>>>0>=j>>>0){c[h>>2]=j;p=c[k>>2]|0;q=n+16|0;r=xc(p,q)|0;s=c[h>>2]|0;t=s+-8|0;u=c[r>>2]|0;c[t>>2]=u;v=r+4|0;w=c[v>>2]|0;x=s+-4|0;c[x>>2]=w;Fa=b;return 1}e=(n+20+(3-o)|0)>>>3;a=o;do{c[a+4>>2]=0;a=a+8|0}while(a>>>0<j>>>0);c[h>>2]=o+(e+1<<3);c[h>>2]=j;p=c[k>>2]|0;q=n+16|0;r=xc(p,q)|0;s=c[h>>2]|0;t=s+-8|0;u=c[r>>2]|0;c[t>>2]=u;v=r+4|0;w=c[v>>2]|0;x=s+-4|0;c[x>>2]=w;Fa=b;return 1}function Df(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;d=Fa;Fa=Fa+16|0;e=d;f=b+16|0;g=c[c[f>>2]>>2]|0;h=g+8|0;i=b+8|0;j=c[i>>2]|0;if(!(h>>>0>=j>>>0|(h|0)==2099900)){h=c[g+12>>2]&15;if((h|0)==5){k=g;l=j}else{m=h+1|0;n=4}}else{m=0;n=4}if((n|0)==4){n=c[16+(m<<2)>>2]|0;c[e>>2]=45485;c[e+4>>2]=n;jf(b,1,Dd(b,47715,e)|0)|0;k=c[c[f>>2]>>2]|0;l=c[i>>2]|0}e=k+16|0;if(e>>>0>=l>>>0|(e|0)==2099900){jf(b,2,47735)|0;o=c[c[f>>2]>>2]|0;p=c[i>>2]|0}else{o=k;p=l}l=o+24|0;if(l>>>0>=p>>>0|(l|0)==2099900){jf(b,3,47735)|0;q=c[c[f>>2]>>2]|0;r=c[i>>2]|0}else{q=o;r=p}p=q+8|0;o=q+32|0;if(r>>>0<o>>>0){f=(q+28+(3-r)|0)>>>3;l=r;do{c[l+4>>2]=0;l=l+8|0}while(l>>>0<o>>>0);c[i>>2]=r+(f+1<<3)}c[i>>2]=o;o=c[p>>2]|0;f=q+16|0;r=xc(o,f)|0;if((r|0)==2099900)s=yc(b,o,f)|0;else s=r;c[s>>2]=c[q+24>>2];c[s+4>>2]=c[q+28>>2];a[(c[p>>2]|0)+6>>0]=0;q=c[i>>2]|0;if(!(c[q+-4>>2]&64)){t=q;u=t+-16|0;c[i>>2]=u;Fa=d;return 1}if(!(a[(c[q+-8>>2]|0)+5>>0]&3)){t=q;u=t+-16|0;c[i>>2]=u;Fa=d;return 1}s=c[p>>2]|0;p=s+5|0;r=a[p>>0]|0;if(!(r&4)){t=q;u=t+-16|0;c[i>>2]=u;Fa=d;return 1}q=c[b+12>>2]|0;a[p>>0]=r&-5;r=q+76|0;c[s+24>>2]=c[r>>2];c[r>>2]=s;t=c[i>>2]|0;u=t+-16|0;c[i>>2]=u;Fa=d;return 1}function Ef(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;b=a+16|0;d=c[c[b>>2]>>2]|0;e=d+8|0;f=a+8|0;g=c[f>>2]|0;if(e>>>0>=g>>>0|(e|0)==2099900){jf(a,1,47735)|0;h=c[c[b>>2]>>2]|0;i=h+8|0;j=c[f>>2]|0;k=h}else{i=e;j=g;k=d}if(i>>>0>=j>>>0|(i|0)==2099900){l=0;m=16+(l<<2)|0;n=
  7557. function Sa(a){a=a|0;var b=0;b=Fa;Fa=Fa+a|0;Fa=Fa+15&-16;return b|0}function Ta(){return Fa|0}function Ua(a){a=a|0;Fa=a}function Va(a,b){a=a|0;b=b|0;Fa=a;Ga=b}function Wa(){return c[(c[(c[c[704870]>>2]|0)+16>>2]|0)+12>>2]|0}function Xa(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;c[742551]=(c[742551]|0)-a;b=128-a|0;d=c[704852]|0;if((b|0)>0){e=0;f=d;while(1){Oo(f,f,0,e+a|0,0,e,128,1);e=e+1|0;g=c[704852]|0;if((e|0)==(b|0)){h=b;i=g;break}else f=g}}else{h=0;i=d}$m(i,0,h,127,127,0);Vg(65536);return}function Ya(){var a=0,b=0;a=(c[742551]|0)+(c[742555]|0)|0;c[742551]=a;if((a|0)<=122)return;c[742551]=a+-6;a=0;b=c[704852]|0;do{Oo(b,b,0,a+6|0,0,a,128,1);a=a+1|0;b=c[704852]|0}while((a|0)!=122);$m(b,0,122,127,127,0);Vg(65536);return}function Za(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;b=Fa;Fa=Fa+224|0;d=b+208|0;e=b+200|0;f=b+192|0;g=b+184|0;h=b+176|0;i=b+168|0;j=b+160|0;k=b+152|0;l=b+144|0;m=b+136|0;n=b+128|0;o=b+120|0;p=b+112|0;q=b+104|0;r=b+96|0;s=b+88|0;t=b+80|0;u=b+72|0;v=b+64|0;w=b+8|0;x=b;y=b+212|0;if(!(ts(a,35736,9)|0))bo(a+10|0,2960076)|0;if(!(ts(a,35746,10)|0))bo(a+11|0,2962124)|0;if(!(ts(a,35757,14)|0)){c[x>>2]=1662220;Vt(a+14|0,35772,x)|0}if(!(ts(a,35776,11)|0)){c[w>>2]=1662256;c[w+4>>2]=1662260;c[w+8>>2]=1662264;c[w+12>>2]=1662268;c[w+16>>2]=1662272;c[w+20>>2]=1662276;c[w+24>>2]=1662280;c[w+28>>2]=1662284;c[w+32>>2]=1662288;c[w+36>>2]=1662292;c[w+40>>2]=1662296;c[w+44>>2]=1662300;c[w+48>>2]=1662304;Vt(a+11|0,35788,w)|0}if(!(ts(a,35828,10)|0)){c[v>>2]=1662384;Vt(a+10|0,35772,v)|0}if(!(ts(a,35839,11)|0)){c[u>>2]=1662412;Vt(a+11|0,35772,u)|0}if(!(ts(a,49212,7)|0)){c[t>>2]=1662416;Vt(a+7|0,35772,t)|0}if((ts(a,61771,6)|0)==0?(c[s>>2]=2062524,Vt(a+6|0,35772,s)|0,c[525853]|0):0)c[525853]=c[515631];if(!(ts(a,35851,9)|0)){c[r>>2]=1662428;Vt(a+9|0,35772,r)|0}if(!(ts(a,49599,16)|0)){c[q>>2]=1662400;Vt(a+16|0,35772,q)|0}if(!(ts(a,49500,9)|0)){c[p>>2]=1662404;Vt(a+9|0,35772,p)|0}if(!(ts(a,35861,12)|0)){c[o>>2]=1662444;Vt(a+12|0,35772,o)|0}if(!(ts(a,35874,20)|0)){c[n>>2]=2061964;Vt(a+20|0,35772,n)|0}if(!(ts(a,35895,22)|0)){c[m>>2]=2061968;Vt(a+22|0,35772,m)|0}if(!(ts(a,35918,14)|0)){c[l>>2]=y;Vt(a+14|0,35772,l)|0;c[415613]=(c[y>>2]|0)==2&1}if(!(ts(a,48923,13)|0)){c[k>>2]=1662452;Vt(a+13|0,35772,k)|0}if(!(ts(a,49705,9)|0)){c[j>>2]=1662388;Vt(a+9|0,35772,j)|0}if(!(ts(a,35933,9)|0)){c[i>>2]=1662392;Vt(a+9|0,35772,i)|0}if(!(ts(a,35943,19)|0)){c[h>>2]=1662244;Vt(a+19|0,35772,h)|0}if(!(ts(a,35963,19)|0)){c[g>>2]=1662240;Vt(a+19|0,35772,g)|0}if(!(ts(a,35983,22)|0)){c[f>>2]=1662248;Vt(a+22|0,35772,f)|0}if(!(ts(a,36006,11)|0)){c[e>>2]=1662436;Vt(a+11|0,35772,e)|0}if(ts(a,36018,14)|0){Fa=b;return 0}c[d>>2]=1662396;Vt(a+14|0,35772,d)|0;Fa=b;return 0}function _a(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;b=Fa;Fa=Fa+256|0;d=b+248|0;e=b+240|0;f=b+232|0;g=b+224|0;h=b+216|0;i=b+208|0;j=b+200|0;k=b+192|0;l=b+184|0;m=b+176|0;n=b+168|0;o=b+160|0;p=b+152|0;q=b+144|0;r=b+136|0;s=b+128|0;t=b+120|0;u=b+112|0;v=b+104|0;w=b+96|0;x=b+88|0;y=b+80|0;z=b+72|0;A=b+64|0;B=b+56|0;C=b+48|0;D=b+40|0;E=b+32|0;F=b+24|0;G=b+16|0;H=b+8|0;I=b;J=a+8|0;a=c[J>>2]|0;c[I>>2]=36046;bu(a,36033,I)|0;ku(36053,25,1,c[J>>2]|0)|0;I=c[J>>2]|0;c[H>>2]=c[515631];bu(I,36079,H)|0;ku(36091,37,1,c[J>>2]|0)|0;H=c[J>>2]|0;c[G>>2]=2960076;bu(H,36129,G)|0;ku(36144,36,1,c[J>>2]|0)|0;G=c[J>>2]|0;c[F>>2]=2962124;bu(G,36181,F)|0;ku(36197,65,1,c[J>>2]|0)|0;F=c[J>>2]|0;c[E>>2]=c[415555];bu(F,36263,E)|0;ku(36283,70,1,c[J>>2]|0)|0;ku(36354,12,1,c[J>>2]|0)|0;E=c[J>>2]|0;c[D>>2]=c[415564];bu(E,36367,D)|0;D=c[J>>2]|0;c[C>>2]=c[415565];bu(D,36367,C)|0;C=c[J>>2]|0;c[B>>2]=c[415566];bu(C,36367,B)|0;B=c[J>>2]|0;c[A>>2]=c[415567];bu(B,36367,A)|0;A=c[J>>2]|0;c[z>>2]=c[415568];bu(A,36367,z)|0;z=c[J>>2]|0;c[y>>2]=c[415569];bu(z,36367,y)|0;y=c[J>>2]|0;c[x>>2]=c[415570];bu(y,36367,x)|0;x=c[J>>2]|0;c[w>>2]=c[415571];bu(x,36367,w)|0;w=c[J>>2]|0;c[v>>2]=c[415572];bu(w,36367,v)|0;v=c[J>>2]|0;c[u>>2]=c[415573];bu(v,36367,u)|0;u=c[J>>2]|0;c[t>>2]=c[415574];b
  7558. function _d(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;d=c[a>>2]|0;e=a+28|0;f=c[e>>2]|0;g=a+20|0;h=c[g>>2]|0;do if((f|0)!=-1){i=c[d+12>>2]|0;j=f;while(1){k=i+(j<<2)|0;l=c[k>>2]|0;m=(l>>>14)+-131071|0;n=j;j=(m|0)==-1?-1:j+1+m|0;if((n|0)>0?(m=k+-4|0,o=c[m>>2]|0,((o&63)+-37|0)>>>0<5):0){p=m;q=o}else{p=k;q=l}if((q&63|0)==41){c[p>>2]=q&8372224|q>>>23<<6|40;o=h+~n|0;if((((o|0)>-1?o:0-o|0)|0)>131071){r=8;break}s=c[k>>2]&16383;t=(o<<14)+2147467264|0}else{o=h+~n|0;if((((o|0)>-1?o:0-o|0)|0)>131071){r=11;break}s=(o<<14)+2147467264|0;t=l&16383}c[k>>2]=s|t;if((j|0)==-1){r=14;break}}if((r|0)==8)be(c[a+12>>2]|0,46263);else if((r|0)==11)be(c[a+12>>2]|0,46263);else if((r|0)==14){u=c[g>>2]|0;break}}else u=h;while(0);c[e>>2]=-1;e=d+48|0;if((u|0)<(c[e>>2]|0)){v=c[d+12>>2]|0;w=u}else{u=d+12|0;h=ce(c[(c[a+12>>2]|0)+32>>2]|0,c[u>>2]|0,e,4,2147483645,46611)|0;c[u>>2]=h;v=h;w=c[g>>2]|0}c[v+(w<<2)>>2]=b;b=c[g>>2]|0;w=d+52|0;v=a+12|0;if((b|0)<(c[w>>2]|0)){x=d+20|0;y=b;z=c[v>>2]|0;A=z+8|0;B=c[A>>2]|0;C=c[x>>2]|0;D=C+(y<<2)|0;c[D>>2]=B;E=c[g>>2]|0;F=E+1|0;c[g>>2]=F;return E|0}else{b=d+20|0;c[b>>2]=ce(c[(c[v>>2]|0)+32>>2]|0,c[b>>2]|0,w,4,2147483645,46611)|0;x=b;y=c[g>>2]|0;z=c[v>>2]|0;A=z+8|0;B=c[A>>2]|0;C=c[x>>2]|0;D=C+(y<<2)|0;c[D>>2]=B;E=c[g>>2]|0;F=E+1|0;c[g>>2]=F;return E|0}return 0}function $d(e){e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;f=e+16|0;g=c[f>>2]|0;h=e+12|0;i=c[h>>2]|0;do if(c[g>>2]|0?a[g+9>>0]|0:0){j=e+28|0;k=c[j>>2]|0;c[j>>2]=-1;l=_d(e,2147450916)|0;do if((k|0)!=-1){if((l|0)==-1){m=k;n=d[g+8>>0]|0;break}o=c[(c[e>>2]|0)+12>>2]|0;p=l;while(1){q=o+(p<<2)|0;r=c[q>>2]|0;s=(r>>>14)+-131071|0;t=(s|0)==-1?-1:p+1+s|0;if((t|0)==-1)break;else p=t}o=k+~p|0;if((((o|0)>-1?o:0-o|0)|0)>131071)be(c[h>>2]|0,46263);else{c[q>>2]=(o<<14)+2147467264|r&16383;u=11;break}}else u=11;while(0);if((u|0)==11){k=d[g+8>>0]|0;if((l|0)==-1){c[e+24>>2]=c[e+20>>2];break}else{m=l;n=k}}k=c[(c[e>>2]|0)+12>>2]|0;o=(n<<6)+64&16320;t=m;do{s=k+(t<<2)|0;v=c[s>>2]|0;w=(v>>>14)+-131071|0;c[s>>2]=v&-16321|o;t=(w|0)==-1?-1:t+1+w|0}while((t|0)!=-1);c[e+24>>2]=c[e+20>>2];t=c[j>>2]|0;if((t|0)==-1){c[j>>2]=m;break}o=t;while(1){x=k+(o<<2)|0;y=c[x>>2]|0;t=(y>>>14)+-131071|0;l=(t|0)==-1?-1:o+1+t|0;if((l|0)==-1)break;else o=l}k=m+~o|0;if((((k|0)>-1?k:0-k|0)|0)>131071)be(c[h>>2]|0,46263);else{c[x>>2]=(k<<14)+2147467264|y&16383;break}}while(0);if(a[g+10>>0]|0){y=i+32|0;x=Oc(c[y>>2]|0,56767,5)|0;m=i+44|0;n=c[m>>2]|0;r=n+24|0;q=i+28|0;k=c[q>>2]|0;j=c[k+20>>2]|0;l=n+28|0;t=c[l>>2]|0;w=n+32|0;if((t|0)<(c[w>>2]|0)){z=k;A=t;B=n;C=c[r>>2]|0}else{n=ce(c[y>>2]|0,c[r>>2]|0,w,16,32767,46290)|0;c[r>>2]=n;z=c[q>>2]|0;A=c[l>>2]|0;B=c[m>>2]|0;C=n}c[C+(t<<4)>>2]=x;c[C+(t<<4)+8>>2]=0;a[C+(t<<4)+12>>0]=a[z+46>>0]|0;c[C+(t<<4)+4>>2]=j;c[l>>2]=A+1;A=(c[B+24>>2]|0)+(t<<4)|0;t=b[(c[z+16>>2]|0)+6>>1]|0;z=B+16|0;l=c[z>>2]|0;if((l|0)>(t|0)){j=B+12|0;B=t;t=l;while(1){l=c[(c[j>>2]|0)+(B<<4)>>2]|0;C=c[A>>2]|0;x=a[l+4>>0]|0;do if(x<<24>>24==(a[C+4>>0]|0)){if(x<<24>>24==4){if((l|0)!=(C|0)){u=35;break}}else{n=c[l+12>>2]|0;if((l|0)!=(C|0)){if((n|0)!=(c[C+12>>2]|0)){u=35;break}if(ss(l+16|0,C+16|0,n)|0){u=35;break}}}de(i,B,A);D=B;E=c[z>>2]|0}else u=35;while(0);if((u|0)==35){u=0;D=B+1|0;E=t}if((D|0)<(E|0)){B=D;t=E}else break}}}E=c[g>>2]|0;c[f>>2]=E;f=g+8|0;t=a[f>>0]|0;D=e+46|0;B=a[D>>0]|0;u=B&255;z=c[(c[h>>2]|0)+44>>2]|0;A=z+4|0;c[A>>2]=(t&255)-u+(c[A>>2]|0);if((t&255)<(B&255)){A=c[e+20>>2]|0;j=c[e+40>>2]|0;C=c[(c[e>>2]|0)+24>>2]|0;l=c[z>>2]|0;x=u;while(1){u=(x&255)+-1<<24>>24;c[C+((b[l+(j+(u&255)<<1)>>1]|0)*12|0)+8>>2]=A;if((u&255)>(t&255))x=x+-1|0;else break}a[D>>0]=t;F=t}else F=B;a[e+48>>0]=F;F=c[i+44>>2]|0;c[F+28>>2]=b[g+4>>1];B=b[g+6>>1]|0;if(!E)if((c[F+16>>2]|0)>(B|0))fe(i,(c[F+12>>2]|0)+(B<<4)|0);else return;F=z+16|0;if((c[F>>2]|0)<=(B|0))return;i=z+12|0;z=g+9|0;g=B;B=t;while(1){t=c[i>>2]|0;E=t+(g<<4)+12|0;D=B&255;if((d[E>>0]|0)>(B&255)){if(a[z>>0]|0?(x=c[t+(g<<4)+4>>2]|0,(x|0)!=-1):0){t=c[(c[e>>2]|0)+12>>2]|0;A=(D<<6)+64&16320;D=x;do{x=t+(D<<2)|0;j
  7559. function bl(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0,xc=0,yc=0,zc=0,Ac=0,Bc=0,Cc=0,Dc=0,Ec=0,Fc=0,Gc=0,Hc=0,Ic=0,Jc=0,Kc=0,Lc=0,Mc=0,Nc=0,Oc=0,Pc=0,Qc=0,Rc=0,Sc=0,Tc=0,Uc=0,Vc=0,Wc=0,Xc=0,Yc=0,Zc=0,_c=0,$c=0,ad=0,bd=0,cd=0,dd=0,ed=0,fd=0,gd=0,hd=0,id=0,jd=0,kd=0,ld=0,md=0,nd=0,od=0,pd=0,qd=0,rd=0,sd=0,td=0,ud=0,vd=0,wd=0,xd=0,yd=0,zd=0,Ad=0,Bd=0,Cd=0,Dd=0,Ed=0,Fd=0,Gd=0,Hd=0,Id=0,Jd=0,Kd=0,Ld=0,Md=0,Nd=0,Od=0,Pd=0,Qd=0,Rd=0,Sd=0,Td=0,Ud=0,Vd=0,Wd=0,Xd=0,Yd=0,Zd=0,_d=0,$d=0,ae=0,be=0,ce=0,de=0,ee=0,fe=0,ge=0,he=0,ie=0,je=0,ke=0,le=0,me=0,ne=0,oe=0,pe=0,qe=0,re=0,se=0,te=0,ue=0,ve=0,we=0,xe=0,ye=0,ze=0,Ae=0,Be=0,Ce=0,De=0,Ee=0,Fe=0,Ge=0,He=0,Ie=0,Je=0,Ke=0,Le=0,Me=0,Ne=0,Oe=0,Pe=0,Qe=0,Re=0,Se=0,Te=0,Ue=0,Ve=0,We=0,Xe=0,Ye=0,Ze=0,_e=0,$e=0,af=0,bf=0,cf=0,df=0,ef=0,ff=0,gf=0,hf=0,jf=0,kf=0,lf=0,mf=0,nf=0,of=0,pf=0,qf=0,rf=0,sf=0,tf=0,uf=0,vf=0,wf=0,xf=0,yf=0,zf=0,Af=0,Bf=0,Cf=0,Df=0,Ef=0,Ff=0,Gf=0,Hf=0,If=0,Jf=0,Kf=0,Lf=0,Mf=0,Nf=0,Of=0,Pf=0,Qf=0,Rf=0,Sf=0,Tf=0,Uf=0,Vf=0,Wf=0,Xf=0,Yf=0,Zf=0,_f=0,$f=0,ag=0,bg=0,cg=0,dg=0,eg=0,fg=0,gg=0,hg=0,ig=0,jg=0,kg=0,lg=0,mg=0,ng=0,og=0,pg=0,qg=0,rg=0,sg=0,tg=0,ug=0,vg=0,wg=0,xg=0,yg=0,zg=0,Ag=0,Bg=0,Cg=0,Dg=0,Eg=0,Fg=0,Gg=0,Hg=0,Ig=0,Jg=0,Kg=0,Lg=0,Mg=0,Ng=0,Og=0,Pg=0,Qg=0,Rg=0,Sg=0,Tg=0,Ug=0,Vg=0,Wg=0,Xg=0,Yg=0,Zg=0,_g=0,$g=0,ah=0,bh=0,ch=0,dh=0,eh=0,fh=0,gh=0,hh=0,ih=0,jh=0,kh=0,lh=0,mh=0,nh=0,oh=0,ph=0,qh=0,rh=0,sh=0,th=0,uh=0,vh=0,wh=0,xh=0,yh=0,zh=0,Ah=0,Bh=0,Ch=0,Dh=0,Eh=0,Fh=0,Gh=0,Hh=0,Ih=0,Jh=0,Kh=0,Lh=0,Mh=0,Nh=0,Oh=0,Ph=0,Qh=0,Rh=0,Sh=0;g=Fa;Fa=Fa+4112|0;h=g+4108|0;i=g+4104|0;j=g+3072|0;k=g+2048|0;l=g+1024|0;m=g;n=g+4100|0;o=g+4096|0;p=0;do{c[j+(p<<2)>>2]=p;p=p+1|0}while((p|0)!=256);p=0;do{c[k+(c[j+(p<<2)>>2]<<2)>>2]=p;p=p+1|0}while((p|0)!=256);al(b,f);c[8783]=1;c[525045]=0;c[525043]=e;c[525044]=0;if(!f){q=0;Fa=g;return q|0}p=Fp(f)|0;Xu(p|0,b|0,f|0)|0;r=c[525043]|0;s=c[8783]|0;t=c[525044]|0;u=r+t|0;v=(s^255)&(d[u>>0]|0);a[u>>0]=v;w=s<<1;x=t+1|0;if((w|0)!=256){y=(w^255)&v;a[u>>0]=y;v=s<<2;if((v|0)==256){s=r+x|0;c[525044]=x;w=d[s>>0]|0;c[525045]=w;z=w&254;a[s>>0]=z;A=2;B=s;C=x;D=z;E=314}else{F=x;G=u;H=y;I=v;J=t;E=312}}else{v=r+x|0;c[525044]=x;y=d[v>>0]|0;c[525045]=y;u=y&254;a[v>>0]=u;F=t+2|0;G=v;H=u;I=2;J=x;E=312}do if((E|0)==312){x=(I^255)&(H&255);a[G>>0]=x;u=I<<1;if((u|0)==256){v=r+F|0;c[525044]=F;t=d[v>>0]|0;c[525045]=t;A=1;B=v;C=F;D=t;E=314;break}t=(u^255)&x;a[G>>0]=t;x=I<<2;if((x|0)==256){u=r+F|0;c[525044]=F;v=d[u>>0]|0;c[525045]=v;y=v&254;a[u>>0]=y;K=2;L=u;M=F;N=y;E=319}else{O=G;P=F;Q=t;R=x;S=J;E=317}}while(0);if((E|0)==314){J=(A^255)&D;a[B>>0]=J;O=B;P=C+1|0;Q=J;R=A<<1;S=C;E=317}do if((E|0)==317){C=(R^255)&(Q&255);a[O>>0]=C;A=R<<1;if((A|0)==256){J=r+P|0;c[525044]=P;B=d[J>>0]|0;c[525045]=B;K=1;L=J;M=P;N=B;E=319;break}B=(A^255)&C;a[O>>0]=B;C=R<<2;if((C|0)==256){A=r+P|0;c[525044]=P;J=d[A>>0]|0;c[525045]=J;D=J&254;a[A>>0]=D;T=2;U=A;V=P;W=D;E=324}else{X=O;Y=P;Z=B;_=C;$=S;E=322}}while(0);if((E|0)==319){S=(K^255)&N;a[L>>0]=S;X=L;Y=M+1|0;Z=S;_=K<<1;$=M;E=322}do if((E|0)==322){M=(_^255)&(Z&255);a[X>>0]=M;K=_<<1;if((K|0)==256){S=r+Y|0;c[525044]=Y;L=d[S>>0]|0;c[525045]=L;T=1;U=S;V=Y;W=L;E=324;break}L=(K^255)&M;a[X>>0]=L;M=_<<2;if((M|0)==256){K=r+Y|0;c[525044]=Y;S=d[K>>0]|0;c[525045]=S;aa=Y;ba=K;ca=Y+1|0;da=S;ea=1}else{fa=X;ga=Y;ha=L;ia=M;ja=$;E=326}}while(0);if((E|0)
  7560. function Dc(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;f=b+12|0;g=c[f>>2]|0;h=b+56|0;b=c[h>>2]|0;if(!b)return;i=g+48|0;j=g+56|0;k=g+50|0;l=g+49|0;m=b;while(1){b=m+8|0;n=c[b>>2]|0;if(n>>>0<e>>>0){o=16;break}c[h>>2]=c[m>>2];p=m+12|0;do if(((a[i>>0]^3)&(a[m+5>>0]^3))<<24>>24){q=m+16|0;c[(c[q>>2]|0)+12>>2]=c[p>>2];c[(c[p>>2]|0)+16>>2]=c[q>>2];r=c[b>>2]|0;c[p>>2]=c[r>>2];s=c[r+4>>2]|0;c[q>>2]=s;c[b>>2]=p;c[m>>2]=c[j>>2];c[j>>2]=m;q=m+5|0;r=a[q>>0]|0;t=r&255;if(!(t&7)){if((a[k>>0]|0)!=2?(d[l>>0]|0)>=2:0){a[q>>0]=t&184|a[i>>0]&3;break}a[q>>0]=r&-69|4;if(s&64|0?(s=c[p>>2]|0,a[s+5>>0]&3):0)uc(g,s)}}else{if((n|0)!=(p|0)){s=m+16|0;c[(c[s>>2]|0)+12>>2]=c[p>>2];c[(c[p>>2]|0)+16>>2]=c[s>>2]}s=c[f>>2]|0;Ma[c[s>>2]&1](c[s+4>>2]|0,m,20,0)|0;r=s+12|0;c[r>>2]=(c[r>>2]|0)+-20}while(0);m=c[h>>2]|0;if(!m){o=16;break}}if((o|0)==16)return}function Ec(e,f,g){e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;h=Fa;Fa=Fa+16|0;i=h;j=f+4|0;a:do switch(c[j>>2]&63){case 0:{k=1;break}case 3:{k=(c[f>>2]|0)==(c[g>>2]|0);break}case 1:{k=(c[f>>2]|0)==(c[g>>2]|0);break}case 2:{k=(c[f>>2]|0)==(c[g>>2]|0);break}case 54:case 22:{k=(c[f>>2]|0)==(c[g>>2]|0);break}case 4:{k=(c[f>>2]|0)==(c[g>>2]|0);break}case 20:{l=c[f>>2]|0;m=c[g>>2]|0;n=c[l+12>>2]|0;if((l|0)!=(m|0))if((n|0)==(c[m+12>>2]|0))k=(ss(l+16|0,m+16|0,n)|0)==0;else k=0;else k=1;break}case 7:{n=c[f>>2]|0;m=c[g>>2]|0;if((n|0)!=(m|0))if(((e|0)!=0?(l=c[n+8>>2]|0,n=c[m+8>>2]|0,(l|0)!=0):0)?(m=l+6|0,o=a[m>>0]|0,(o&32)==0):0){p=c[(c[e+12>>2]|0)+176>>2]|0;q=c[p+8>>2]|0;r=(c[l+16>>2]|0)+(((1<<(d[l+7>>0]|0))+-1&q)*20|0)|0;while(1){if((c[r+12>>2]|0)==68?(c[r+8>>2]|0)==(p|0):0){s=17;break}t=c[r+16>>2]|0;if(!t){u=2099900;break}else r=t}if((s|0)==17)u=r;t=u+4|0;v=c[t>>2]|0;if(!v){a[m>>0]=o|32;k=0;break a}if(u)if((l|0)!=(n|0))if((n|0)!=0?(w=n+6|0,x=a[w>>0]|0,(x&32)==0):0){y=(c[n+16>>2]|0)+(((1<<(d[n+7>>0]|0))+-1&q)*20|0)|0;while(1){if((c[y+12>>2]|0)==68?(c[y+8>>2]|0)==(p|0):0){s=28;break}z=c[y+16>>2]|0;if(!z){A=2099900;break}else y=z}if((s|0)==28)A=y;p=c[A+4>>2]|0;if(!p){a[w>>0]=x|32;k=0;break a}if((A|0)!=0&(v|0)==(p|0)?(Ec(0,u,A)|0)!=0:0){B=u;C=t;s=59}else k=0}else k=0;else{B=u;C=t;s=59}else k=0}else k=0;else k=1;break}case 5:{p=c[f>>2]|0;q=c[g>>2]|0;if((p|0)!=(q|0))if(((e|0)!=0?(n=c[p+8>>2]|0,p=c[q+8>>2]|0,(n|0)!=0):0)?(q=n+6|0,l=a[q>>0]|0,(l&32)==0):0){o=c[(c[e+12>>2]|0)+176>>2]|0;m=c[o+8>>2]|0;r=(c[n+16>>2]|0)+(((1<<(d[n+7>>0]|0))+-1&m)*20|0)|0;while(1){if((c[r+12>>2]|0)==68?(c[r+8>>2]|0)==(o|0):0){s=41;break}z=c[r+16>>2]|0;if(!z){D=2099900;break}else r=z}if((s|0)==41)D=r;t=D+4|0;v=c[t>>2]|0;if(!v){a[q>>0]=l|32;k=0;break a}if(D)if((n|0)!=(p|0))if((p|0)!=0?(x=p+6|0,w=a[x>>0]|0,(w&32)==0):0){y=(c[p+16>>2]|0)+(((1<<(d[p+7>>0]|0))+-1&m)*20|0)|0;while(1){if((c[y+12>>2]|0)==68?(c[y+8>>2]|0)==(o|0):0){s=52;break}z=c[y+16>>2]|0;if(!z){E=2099900;break}else y=z}if((s|0)==52)E=y;o=c[E+4>>2]|0;if(!o){a[x>>0]=w|32;k=0;break a}if((E|0)!=0&(v|0)==(o|0)?(Ec(0,D,E)|0)!=0:0){B=D;C=t;s=59}else k=0}else k=0;else{B=D;C=t;s=59}else k=0}else k=0;else k=1;break}default:k=(c[f>>2]|0)==(c[g>>2]|0)}while(0);b:do if((s|0)==59){D=e+8|0;E=c[D>>2]|0;u=e+28|0;A=E-(c[u>>2]|0)|0;c[D>>2]=E+8;c[E>>2]=c[B>>2];c[E+4>>2]=c[C>>2];E=c[D>>2]|0;c[D>>2]=E+8;c[E>>2]=c[f>>2];c[E+4>>2]=c[j>>2];E=c[D>>2]|0;c[D>>2]=E+8;c[E>>2]=c[g>>2];c[E+4>>2]=c[g+4>>2];E=(c[D>>2]|0)+-24|0;o=a[(c[e+16>>2]|0)+18>>0]&1;m=e+38|0;p=(b[m>>1]|0)+1<<16>>16;b[m>>1]=p;if((p&65535)>199){if(p<<16>>16==200)lc(e,45525,i);if((p&65535)>224)jc(e,6)}p=o<<24>>24!=0;if(!p){o=e+36|0;b[o>>1]=(b[o>>1]|0)+1<<16>>16}if(!(pc(e,E,1)|0))qc(e);if(!p){p=e+36|0;b[p>>1]=(b[p>>1]|0)+-1<<16>>16}b[m>>1]=(b[m>>1]|0)+-1<<16>>16;m=(c[u>>2]|0)+A|0;A=c[D>>2]|0;u=A+-8|0;c[D>>2]=u;c[m>>2]=c[u>>2];c[m+4>>2]=c[A+-4>>2];A=c[D>>2]|0;switch(c[A+4>>2]|0){case 0:{k=0;break b;break}case 1:{k=(c[A>>2]|0)!=0;break b;break}default:{k=1;break b}}}while(0);Fa=h;return k&1|0}function Fc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;e=c[b+4>>2]|0;if((e|0)==3){if((c[d+4>>2]|0)==3){f=(c[b>>2]|0)<
  7561. function Bp(b,e,f,g,h,i){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0;j=Fa;Fa=Fa+64|0;k=j;switch(h|0){case 3:case 0:{l=1;break}case 2:{l=3;break}case 4:{l=2;break}case 6:{l=4;break}default:l=0}m=B(l,i)|0;l=((B(m,f)|0)+7|0)>>>3;f=(m+7|0)>>>3;if(!m){n=31;Fa=j;return n|0}if((h|0)==3|i>>>0<8){if(!g){n=0;Fa=j;return n|0}i=l+1|0;if(!l){h=0;do{a[b+(B(h,i)|0)>>0]=0;h=h+1|0}while((h|0)!=(g|0));n=0;Fa=j;return n|0}h=0;do{m=B(h,i)|0;o=B(h,l)|0;a[b+m>>0]=0;p=b+(m+1)|0;m=e+o|0;o=0;do{a[p+o>>0]=a[m+o>>0]|0;o=o+1|0}while((o|0)!=(l|0));h=h+1|0}while((h|0)!=(g|0));n=0;Fa=j;return n|0}h=k;i=h+60|0;do{c[h>>2]=0;h=h+4|0}while((h|0)<(i|0));h=l<<1;i=k+8|0;do if(!l){c[k+4>>2]=l;c[k+16>>2]=l;c[k+28>>2]=l;c[k+40>>2]=l;q=k+56|0;r=k+44|0;s=k+32|0;t=k+20|0;u=0;v=0;w=0;x=0;y=0;z=89}else{o=Gp(0,h)|0;if(o){c[i>>2]=h;c[k>>2]=o;c[k+4>>2]=l;m=k+20|0;p=Gp(0,h)|0;if(p){c[m>>2]=h;c[k+12>>2]=p;c[k+16>>2]=l;A=k+32|0;C=Gp(0,h)|0;if(C){c[A>>2]=h;c[k+24>>2]=C;c[k+28>>2]=l;D=k+44|0;E=Gp(0,h)|0;if(E){c[D>>2]=h;c[k+36>>2]=E;c[k+40>>2]=l;F=k+56|0;G=Gp(0,h)|0;if(!G){H=m;I=E;J=C;K=p;L=o}else{c[F>>2]=h;c[k+48>>2]=G;q=F;r=D;s=A;t=m;u=E;v=p;w=o;x=C;y=G;z=89;break}}else{H=m;I=0;J=C;K=p;L=o}}else{H=m;I=0;J=0;K=p;L=o}}else{H=m;I=0;J=0;K=0;L=o}}else{H=k+20|0;I=0;J=0;K=0;L=0}M=9949;N=k+32|0;O=k+44|0;P=k+56|0;Q=H;R=L;S=K;T=J;U=I;V=0}while(0);if((z|0)==89){c[k+52>>2]=l;if(!g){M=0;N=s;O=r;P=q;Q=t;R=w;S=v;T=x;U=u;V=y}else{y=(l|0)==0;u=(f|0)!=0;x=(l|0)!=0;v=f>>>0<l>>>0;w=l+1|0;z=0;I=0;J=0;K=0;while(1){L=J;J=e+(B(K,l)|0)|0;H=(L|0)==0;h=z;i=I;o=0;do{m=c[k+(o*12|0)>>2]|0;a:do switch((o&255)<<24>>24){case 0:{if(!y){p=0;do{a[m+p>>0]=a[J+p>>0]|0;p=p+1|0}while((p|0)!=(l|0))}break}case 1:{if(H){if(u){p=0;do{a[m+p>>0]=a[J+p>>0]|0;p=p+1|0}while((p|0)!=(f|0))}if(!v)break a;p=f;do{a[m+p>>0]=(d[J+p>>0]|0)-(d[J+(p-f)>>0]|0);p=p+1|0}while((p|0)!=(l|0))}else{if(u){p=0;do{a[m+p>>0]=a[J+p>>0]|0;p=p+1|0}while((p|0)!=(f|0))}if(!v)break a;p=f;do{a[m+p>>0]=(d[J+p>>0]|0)-(d[J+(p-f)>>0]|0);p=p+1|0}while((p|0)!=(l|0))}break}case 2:{if(H){if(!x)break a;p=0;do{a[m+p>>0]=a[J+p>>0]|0;p=p+1|0}while((p|0)!=(l|0))}else{if(!x)break a;p=0;do{a[m+p>>0]=(d[J+p>>0]|0)-(d[L+p>>0]|0);p=p+1|0}while((p|0)!=(l|0))}break}case 3:{if(H){if(u){p=0;do{a[m+p>>0]=a[J+p>>0]|0;p=p+1|0}while((p|0)!=(f|0))}if(!v)break a;p=f;do{a[m+p>>0]=(d[J+p>>0]|0)-((d[J+(p-f)>>0]|0)>>>1&255);p=p+1|0}while((p|0)!=(l|0))}else{if(u){p=0;do{a[m+p>>0]=(d[J+p>>0]|0)-((d[L+p>>0]|0)>>>1&255);p=p+1|0}while((p|0)!=(f|0))}if(!v)break a;p=f;do{a[m+p>>0]=(d[J+p>>0]|0)-(((d[L+p>>0]|0)+(d[J+(p-f)>>0]|0)|0)>>>1);p=p+1|0}while((p|0)!=(l|0))}break}case 4:{if(H){if(u){p=0;do{a[m+p>>0]=a[J+p>>0]|0;p=p+1|0}while((p|0)!=(f|0))}if(!v)break a;p=f;do{a[m+p>>0]=(d[J+p>>0]|0)-(d[J+(p-f)>>0]|0);p=p+1|0}while((p|0)!=(l|0))}else{if(u){p=0;do{a[m+p>>0]=(d[J+p>>0]|0)-(d[L+p>>0]|0);p=p+1|0}while((p|0)!=(f|0))}if(!v)break a;p=f;do{C=p-f|0;G=a[J+C>>0]|0;E=a[L+p>>0]|0;A=a[L+C>>0]|0;C=E&255;D=A&255;F=C-D|0;W=(F|0)>-1?F:0-F|0;F=G&255;X=F-D|0;Y=(X|0)>-1?X:0-X|0;X=C+F+(B(D,-2)|0)|0;D=(X|0)>-1?X:0-X|0;a[m+p>>0]=(d[J+p>>0]|0)-(((W|0)>(Y|0)|(W|0)>(D|0)?((Y|0)>(D|0)?A:E):G)&255);p=p+1|0}while((p|0)!=(l|0))}break}default:{}}while(0);p=c[k+(o*12|0)+4>>2]|0;if(!p)Z=0;else{G=0;E=0;while(1){A=E+(d[m+G>>0]|0)|0;G=G+3|0;if(G>>>0>=p>>>0){Z=A;break}else E=A}}E=(o|0)==0|Z>>>0<h>>>0;h=E?Z:h;i=E?o:i;o=o+1|0}while((o|0)!=5);o=B(K,w)|0;a[b+o>>0]=i;if(!y){L=c[k+(i*12|0)>>2]|0;H=0;do{E=H;H=H+1|0;a[b+(H+o)>>0]=a[L+E>>0]|0}while((H|0)!=(l|0))}K=K+1|0;if((K|0)==(g|0))break;else{z=h;I=i}}M=0;N=s;O=r;P=q;Q=t;R=c[k>>2]|0;S=c[k+12>>2]|0;T=c[k+24>>2]|0;U=c[k+36>>2]|0;V=c[k+48>>2]|0}}Hp(R);c[Q>>2]=0;Hp(S);c[N>>2]=0;Hp(T);c[O>>2]=0;Hp(U);c[P>>2]=0;Hp(V);n=M;Fa=j;return n|0}function Cp(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0;i=Fa;Fa=Fa+240|0;j=i+8|0;k=i+4|0;l=i;c[j>>2]=2;c[j+4>>2]=1;c[j+8>>2]=2048;c[j+12>>2]=1;c[j+16>>2]=0;c[j+20>>2]=1;c[j+24>>2]=0;c[j+32>>2]=0;c[j+28>>2]=0;m=j+64|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=
  7562. function bp(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0,xc=0,yc=0,zc=0,Ac=0,Bc=0,Cc=0,Dc=0,Ec=0,Fc=0,Gc=0,Hc=0,Ic=0,Jc=0,Kc=0,Lc=0,Mc=0,Nc=0,Oc=0,Pc=0,Qc=0,Rc=0,Sc=0,Tc=0,Uc=0,Vc=0,Wc=0,Xc=0,Yc=0,Zc=0,_c=0,$c=0,ad=0,bd=0,cd=0,dd=0,ed=0,fd=0,gd=0,hd=0,id=0,jd=0,kd=0,ld=0,md=0,nd=0,od=0,pd=0,qd=0,rd=0,sd=0,td=0,ud=0,vd=0,wd=0,xd=0,yd=0,zd=0,Ad=0,Bd=0,Cd=0,Dd=0,Ed=0,Fd=0,Gd=0,Hd=0,Id=0,Jd=0,Kd=0,Ld=0,Md=0,Nd=0,Od=0,Pd=0,Qd=0,Rd=0,Sd=0,Td=0,Ud=0,Vd=0,Wd=0,Xd=0,Yd=0,Zd=0,_d=0,$d=0,ae=0,be=0,ce=0,de=0,ee=0,fe=0,ge=0,he=0,ie=0,je=0,ke=0,le=0,me=0,ne=0,oe=0,pe=0,qe=0,re=0,se=0,te=0,ue=0,ve=0,we=0,xe=0,ye=0,ze=0,Ae=0,Be=0,Ce=0,De=0,Ee=0,Fe=0,Ge=0,He=0,Ie=0,Je=0,Ke=0,Le=0,Me=0,Ne=0,Oe=0,Pe=0,Qe=0,Re=0,Se=0,Te=0,Ue=0,Ve=0,We=0,Xe=0,Ye=0,Ze=0,_e=0,$e=0,af=0,bf=0,cf=0,df=0,ef=0,ff=0,gf=0,hf=0,jf=0,kf=0,lf=0,mf=0,nf=0,of=0,pf=0,qf=0,rf=0,sf=0,tf=0,uf=0,vf=0,wf=0,xf=0,yf=0,zf=0,Af=0,Bf=0,Cf=0,Df=0,Ef=0,Ff=0,Gf=0,Hf=0,If=0,Jf=0,Kf=0,Lf=0,Mf=0,Nf=0,Of=0,Pf=0,Qf=0,Rf=0,Sf=0,Tf=0,Uf=0,Vf=0,Wf=0,Xf=0,Yf=0,Zf=0,_f=0,$f=0,ag=0,bg=0,cg=0,dg=0,eg=0,fg=0,gg=0,hg=0,ig=0,jg=0,kg=0,lg=0,mg=0,ng=0,og=0,pg=0,qg=0,rg=0,sg=0,tg=0,ug=0,vg=0,wg=0,xg=0,yg=0,zg=0,Ag=0,Bg=0,Cg=0,Dg=0,Eg=0,Fg=0,Gg=0,Hg=0,Ig=0,Jg=0,Kg=0,Lg=0,Mg=0,Ng=0,Og=0,Pg=0,Qg=0,Rg=0,Sg=0,Tg=0,Ug=0,Vg=0,Wg=0,Xg=0,Yg=0,Zg=0,_g=0,$g=0,ah=0,bh=0,ch=0,dh=0,eh=0,fh=0,gh=0,hh=0,ih=0,jh=0,kh=0,lh=0,mh=0,nh=0,oh=0,ph=0,qh=0,rh=0,sh=0,th=0,uh=0,vh=0,wh=0,xh=0,yh=0,zh=0,Ah=0,Bh=0,Ch=0,Dh=0,Eh=0,Fh=0,Gh=0,Hh=0,Ih=0,Jh=0;h=Fa;Fa=Fa+192|0;i=h+136|0;j=h+92|0;k=h+48|0;l=h+4|0;m=h;switch(c[g>>2]|0){case 0:{n=f>>>16;o=b+4|0;p=b+8|0;q=0;r=0;while(1){s=(q|0)==(n|0);t=s&1;u=c[o>>2]|0;v=u+1|0;if((c[p>>2]|0)>>>0<v>>>0){w=v<<1;x=Gp(c[b>>2]|0,w)|0;if(x|0){c[p>>2]=w;c[b>>2]=x;y=x;z=7}}else{y=c[b>>2]|0;z=7}if((z|0)==7){z=0;c[o>>2]=v;a[y+u>>0]=t}t=f-r|0;u=t>>>0<65535?t:65535;t=u^65535;v=u&255;x=c[o>>2]|0;w=x+1|0;if((c[p>>2]|0)>>>0<w>>>0){A=w<<1;B=Gp(c[b>>2]|0,A)|0;if(B|0){c[p>>2]=A;c[b>>2]=B;C=B;z=12}}else{C=c[b>>2]|0;z=12}if((z|0)==12){z=0;c[o>>2]=w;a[C+x>>0]=v}v=u>>>8&255;u=c[o>>2]|0;x=u+1|0;if((c[p>>2]|0)>>>0<x>>>0){w=x<<1;B=Gp(c[b>>2]|0,w)|0;if(B|0){c[p>>2]=w;c[b>>2]=B;D=B;z=17}}else{D=c[b>>2]|0;z=17}if((z|0)==17){z=0;c[o>>2]=x;a[D+u>>0]=v}v=t&255;u=c[o>>2]|0;x=u+1|0;if((c[p>>2]|0)>>>0<x>>>0){B=x<<1;w=Gp(c[b>>2]|0,B)|0;if(w|0){c[p>>2]=B;c[b>>2]=w;E=w;z=22}}else{E=c[b>>2]|0;z=22}if((z|0)==22){z=0;c[o>>2]=x;a[E+u>>0]=v}v=t>>>8&255;t=c[o>>2]|0;u=t+1|0;if((c[p>>2]|0)>>>0<u>>>0){x=u<<1;w=Gp(c[b>>2]|0,x)|0;if(w|0){c[p>>2]=x;c[b>>2]=w;F=w;z=27}}else{F=c[b>>2]|0;z=27}if((z|0)==27){z=0;c[o>>2]=u;a[F+t>>0]=v}if(r>>>0<f>>>0){v=0;t=r;while(1){u=t+1|0;w=a[e+t>>0]|0;x=c[o>>2]|0;B=x+1|0;if((c[p>>2]|0)>>>0<B>>>0){A=B<<1;G=Gp(c[b>>2]|0,A)|0;if(G|0){c[p>>2]=A;c[b>>2]=G;H=G;z=34}}else{H=c[b>>2]|0;z=34}if((z|0)==34){z=0;c[o>>2]=B;a[H+x>>0]=w}v=v+1|0;if(!(v>>>0<65535&u>>>0<f>>>0)){I=u;break}else t=u}}else I=r;if(s){J=0;break}else{q=q+1|0;r=I}}Fa=h;return J|0}case 1:{c[k>>2]=0;K=i;L=K+36|0;do{c[K>>2]=0;K=K+4|0}while((K|0)<(L|0));K=j;L=K+36|0;do{c[K>>2]=0;K=K+4|0}while((K|0)<(L|0));Zo(i);_o(j);I=b+4|0;r=c[I>>2]|0;q=r+1|0;H=b+8|0;if((c[H>>2]|0)>>>0<q>>>0){o=q<<1;p=Gp(c[b>>2]|0,o)|0;if(!p)M=b;else{c[H>>2]=o;c[b>>2]=p;N=b;O=p;z=41}}else{N=b;O=c[b>>2]|0;z=41}if((z|0)==41){c[I>>2]=q;a[O+r>>0]=0;M=N}N=(c[M>>2]|0)+((c[I>>2]|
  7563. function tj(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;d=b+112|0;e=c[d>>2]|0;if((e|0)>0){f=c[b+8>>2]|0;g=0-e|0;h=f+(g<<3)|0;if((c[f+(g<<3)+4>>2]|0)==3){i=c[h>>2]|0;j=e}else{g=qd(h)|0;i=g;j=c[d>>2]|0}g=i>>16;if((j|0)>1){c[524978]=(c[524978]|0)+-2;k=g;l=j}else{k=g;l=j}}else{k=0;l=e}e=b+8|0;b=0;j=l;do{l=b;b=b+1|0;do if((j|0)>(b|0)){g=(c[e>>2]|0)+(0-j<<3)+(b<<3)|0;if((c[g+4>>2]|0)==3){m=c[g>>2]|0;break}else{m=qd(g)|0;break}}else m=0;while(0);g=(l<<2)+k|0;if((g+-24576|0)>>>0<8189){i=(c[(c[704852]|0)+12>>2]|0)+((g<<1)+-49152)|0;a[i>>0]=m&15;h=i+1|0;a[h>>0]=m>>>4&15;i=h+1|0;a[i>>0]=m>>>8&15;h=i+1|0;a[h>>0]=m>>>12&15;i=h+1|0;a[i>>0]=m>>>16&15;h=i+1|0;a[h>>0]=m>>>20&15;i=h+1|0;a[i>>0]=m>>>24&15;a[i+1>>0]=m>>>28}else{uk(2819376,c[743521]|0,g,m&255);uk(2819376,c[743521]|0,g+1|0,m>>>8&255);uk(2819376,c[743521]|0,g+2|0,m>>>16&255);uk(2819376,c[743521]|0,g+3|0,m>>>24)}j=c[d>>2]|0;g=(j|0)<8193?j+-1|0:8192}while(b>>>0<((g|0)>1?g:1)>>>0);return 0}function uj(a){a=a|0;var b=0,d=0;b=c[704845]|0;d=Su(b|0,((b|0)<0)<<31>>31|0,16)|0;b=Nu(d|0,G()|0,60,0)|0;G()|0;yd(a,b);return 1}function vj(a){a=a|0;xd(a);return 1}function wj(a){a=a|0;if(!(c[525002]|0))cb(60104,2e3);c[525002]=1;xd(a);return 1}function xj(a){a=a|0;if(!(c[525001]|0))cb(60073,2e3);c[525001]=1;xd(a);yd(a,0);return 2}function yj(a){a=a|0;xd(a);yd(a,0);return 2}function zj(a){a=a|0;return 0}function Aj(a){a=a|0;c[759980]=1;Uj(a,0);return 1}function Bj(a){a=a|0;c[759980]=1;Uj(a,1);return 1}function Cj(b){b=b|0;var c=0,d=0,e=0;c=pd(b,1,0)|0;d=c>>16;e=td(b,2,0)|0;if(!e){a[2973694+(d<<6)>>0]=0;return 0}if((c+-65536|0)>>>0>327679)return 0;nu(2973694+(d<<6)|0,e,16)|0;return 0}function Dj(a){a=a|0;var b=0,d=0,e=0,f=0;b=Fa;Fa=Fa+16|0;d=b;c[d>>2]=255;if((jd(a)|0)>0?(e=td(a,1,d)|0,(e|0)!=0):0){Fd(a,(vl(e)|0)==0&1);f=1}else f=0;Fa=b;return f|0}function Ej(b){b=b|0;var d=0,e=0;d=pd(b,1,0)|0;if(!(a[2964308]|0)){yb(60043)|0;e=0;return e|0}if(d>>>0>4194303){yd(b,0);e=1;return e|0}else{yd(b,c[2965332+(d>>16<<2)>>2]|0);e=1;return e|0}return 0}function Fj(b){b=b|0;var d=0,e=0;d=pd(b,1,0)|0;e=pd(b,2,0)|0;if(!(a[2964308]|0)){yb(60013)|0;return 0}if(d>>>0>4194303)return 0;b=2965332+(d>>16<<2)|0;if((c[b>>2]|0)!=(e|0))c[759981]=1;c[b>>2]=e;return 0}function Gj(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;d=Fa;Fa=Fa+112|0;e=d+64|0;f=d+108|0;g=d+104|0;h=d+100|0;i=d+72|0;j=d;Vg(16);a:do if((jd(b)|0)>0){k=(pd(b,1,0)|0)>>16;switch(k|0){case 1:{l=4;break a;break}case 0:{$e(c[524986]|0,2,0)|0;m=(c[759908]|0)+(c[742570]|0)|0;n=((m|0)<2097152?m:2097152)<<6;o=0;p=(n|0)>0?n:0;l=15;break a;break}case 2:{q=2;r=Hg(Bg(1)|0)|0;l=93;break a;break}default:{n=(k|0)==3?c[760447]<<16:0;switch(k|0){case 5:{q=k;r=2097152;l=93;break a;break}case 4:{tr();m=c[416461]|0;if(!m){zd(b,3042456,0)|0;Fa=d;return 1}else{s=Fp((ft(m)|0)+16|0)|0;Hr(c[416461]|0,s)|0;zd(b,s,ft(s)|0)|0;Hp(s);Fa=d;return 1}break}case 6:{s=ft(2971644)|0;zd(b,2971644,s>>>0<1024?s:1024)|0;Fa=d;return 1}case 7:{q=7;r=c[759972]<<16;l=93;break a;break}case 9:{q=9;r=(Gq()|0)<<16;l=93;break a;break}case 11:{q=11;r=(jk()|0)<<16;l=93;break a;break}case 13:{rb();q=13;r=4128768-((((c[416457]<<3)+8|0)/2|0)<<16)|0;l=93;break a;break}default:{o=k;p=n;l=15;break a}}}}}else l=4;while(0);if((l|0)==4){o=1;p=Hg(Bg(0)|0)|0;l=15}b:do if((l|0)==15)switch(o|0){case 12:{q=o;r=1507328;l=93;break b;break}case 14:{q=o;r=6815744;l=93;break b;break}case 15:{rb();t=((((c[416457]<<3)+8|0)/2|0)<<16)+4194304|0;break b;break}default:{n=(o|0)==10?c[759910]<<16:(o|0)==8?c[759973]<<16:p;k=o&-4;if((k|0)==16){s=kq(o+-16|0)|0;m=c[743521]|0;u=0;v=-65536;do{v=(s|0)==(m+12+(u*660|0)|0)?u<<16:v;u=u+1|0}while((u|0)!=64);if((v|0)==-65536){u=kq(o+-12|0)|0;m=c[743521]|0;s=0;w=-65536;while(1){x=(u|0)==(m+12+(s*660|0)|0)?s<<16:w;s=s+1|0;if((s|0)==64){y=x;break}else w=x}}else y=v}else y=n;do if((k|0)==20){w=kq(o+-20|0)|0;if(!w){s=kq(o+-16|0)|0;if(!s){z=-65536;break}else A=s}else A=w;z=(jq(A)|0)<<16}else z=y;while(0);switch(o|0){case 24:{k=c[525578]<<16;n=(vq()|0)==0;t=n?-65536:k;break b;break}case 25:{k=c[525577]<<16;n=(vq()
  7564. function Fn(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,C=0,D=0,E=0,F=0,G=0,H=0;a=Fa;Fa=Fa+16|0;b=a+8|0;d=a+4|0;e=a;f=c[526415]|0;if(!f){Fa=a;return}if(!(c[f+16>>2]|0)){Fa=a;return}fr(b,d,e);f=(c[b>>2]|0)-(c[526416]|0)|0;g=B(f,f)|0;f=(c[d>>2]|0)-(c[526417]|0)|0;h=(B(f,f)|0)+g|0;Zp();g=c[526415]|0;f=c[g+16>>2]|0;i=(f|0)>0;a:do if(i){j=c[b>>2]|0;k=c[d>>2]|0;l=c[g>>2]|0;m=c[g+8>>2]|0;n=c[l+(c[m>>2]<<2)>>2]|0;o=c[n+4>>2]|0;if(((j|0)>=(o|0)?(j|0)<((c[n+12>>2]|0)+o|0):0)?(o=c[n+8>>2]|0,(k|0)>=(o|0)):0)p=(k|0)<((c[n+16>>2]|0)+o|0)?n:0;else p=0;if((f|0)>1){n=1;o=p;while(1){q=c[l+(c[m+(n<<2)>>2]<<2)>>2]|0;r=c[q+4>>2]|0;do if((((j|0)>=(r|0)?(j|0)<((c[q+12>>2]|0)+r|0):0)?(s=c[q+8>>2]|0,(k|0)>=(s|0)):0)?(k|0)<((c[q+16>>2]|0)+s|0):0){if(o|0?c[o+20>>2]&32|0:0){t=o;break}t=q}else t=o;while(0);n=n+1|0;if((n|0)>=(f|0))break;else o=t}if(i)u=t;else break}else u=p;o=u+20|0;n=u+28|0;k=u+28|0;j=u+28|0;m=u+28|0;l=u+24|0;q=u+24|0;r=h;s=f;v=g;while(1){w=s+-1|0;x=c[(c[v>>2]|0)+(c[(c[v+8>>2]|0)+(w<<2)>>2]<<2)>>2]|0;if((x|0)==(u|0)){y=c[e>>2]|0;z=c[o>>2]|0;A=z&2;if(!y){if(!A)Ra[c[n>>2]&0](u,c[b>>2]|0,c[d>>2]|0,0,3)}else if(!(c[526418]|A)){c[o>>2]=z|2;Ra[c[j>>2]&0](u,c[b>>2]|0,c[d>>2]|0,y,4);y=_q()|0;if((y-(c[526419]|0)|0)<400?(y=(c[c[l>>2]>>2]|0)/64|0,(r|0)<(B(y,y)|0)):0)Ra[c[j>>2]&0](u,c[b>>2]|0,c[d>>2]|0,c[e>>2]|0,18);y=_q()|0;if((y-(c[526420]|0)|0)<400?(y=(c[c[q>>2]>>2]|0)/64|0,(r|0)<(B(y,y)|0)):0){Ra[c[j>>2]&0](u,c[b>>2]|0,c[d>>2]|0,c[e>>2]|0,11);c[526419]=_q()|0}c[526420]=_q()|0;c[526416]=c[b>>2];c[526417]=c[d>>2]}y=c[o>>2]|0;if(!(y&1)){c[o>>2]=y|1;Ra[c[k>>2]&0](u,c[b>>2]|0,c[d>>2]|0,c[e>>2]|0,1)}y=c[525558]|0;z=c[525559]|0;if(z|y|0){Ra[c[m>>2]&0](u,y,z,c[e>>2]|0,16);c[525558]=0;c[525559]=0}}else{z=x+20|0;y=c[z>>2]|0;if(!(y&1))C=y;else{c[z>>2]=y&-2;Ra[c[x+28>>2]&0](x,c[b>>2]|0,c[d>>2]|0,c[e>>2]|0,2);C=c[z>>2]|0}c[z>>2]=C&-33}z=x+20|0;y=c[z>>2]|0;if((y&2|0)==0|(c[e>>2]|0)!=0)if((y&1|0)!=0&(c[525566]|0)!=0?(A=_q()|0,(A|0)<((c[525567]|0)+500|0)):0){A=c[525566]|0;c[526418]=A;D=x+28|0;Ra[c[D>>2]&0](x,c[b>>2]|0,c[d>>2]|0,A,12);A=(c[b>>2]|0)-(c[526421]|0)|0;E=B(A,A)|0;A=(c[d>>2]|0)-(c[526422]|0)|0;F=(B(A,A)|0)+E|0;E=_q()|0;if((E-(c[526423]|0)|0)<400&F>>>0<400)Ra[c[D>>2]&0](x,c[b>>2]|0,c[d>>2]|0,c[526418]|0,15);c[526423]=_q()|0;c[526421]=c[b>>2];c[526422]=c[d>>2];G=F}else G=r;else{c[z>>2]=y&-3;y=x+28|0;Ra[c[y>>2]&0](x,c[b>>2]|0,c[d>>2]|0,0,6);F=_q()|0;if((r|0)<400&(F-(c[526420]|0)|0)<400)Ra[c[y>>2]&0](x,c[b>>2]|0,c[d>>2]|0,c[526418]|0,12);F=(c[b>>2]|0)-(c[526421]|0)|0;D=B(F,F)|0;F=(c[d>>2]|0)-(c[526422]|0)|0;E=(B(F,F)|0)+D|0;D=_q()|0;if((D-(c[526423]|0)|0)<400&E>>>0<400)Ra[c[y>>2]&0](x,c[b>>2]|0,c[d>>2]|0,c[526418]|0,15);c[526423]=_q()|0;c[526421]=c[b>>2];c[526422]=c[d>>2];G=E}E=c[z>>2]|0;y=c[e>>2]|0;if((E&2|0)!=0&(y|0)!=0){Ra[c[x+28>>2]&0](x,c[b>>2]|0,c[d>>2]|0,y,5);H=c[z>>2]|0}else H=E;if(H&1|0?!((c[526424]|0)==0|(c[e>>2]|0)!=0):0)Ra[c[x+28>>2]&0](x,c[b>>2]|0,c[d>>2]|0,0,17);if((s|0)<=1)break a;r=G;s=w;v=c[526415]|0}}while(0);c[525566]=0;G=c[e>>2]|0;c[526418]=G;c[526424]=G;_p();Fa=a;return}function Gn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=Fa;Fa=Fa+16|0;e=d+8|0;f=d+4|0;g=d;if(!(c[526415]|0)){Fa=d;return}fr(e,f,g);h=c[526415]|0;if((c[h+16>>2]|0)<=0){Fa=d;return}if(!b){i=0;j=h;do{k=c[(c[j>>2]|0)+(c[(c[j+8>>2]|0)+(i<<2)>>2]<<2)>>2]|0;Ra[c[k+28>>2]&0](k,c[e>>2]|0,c[f>>2]|0,c[g>>2]|0,a);i=i+1|0;j=c[526415]|0}while((i|0)<(c[j+16>>2]|0));Fa=d;return}j=0;i=h;while(1){h=c[(c[i>>2]|0)+(c[(c[i+8>>2]|0)+(j<<2)>>2]<<2)>>2]|0;if((c[h>>2]|0)==(b|0)){Ra[c[h+28>>2]&0](h,c[e>>2]|0,c[f>>2]|0,c[g>>2]|0,a);l=c[526415]|0}else l=i;j=j+1|0;if((j|0)>=(c[l+16>>2]|0))break;else i=l}Fa=d;return}function Hn(a){a=a|0;var b=0,d=0;b=c[526415]|0;if((a|0)<0|(b|0)==0){d=0;return d|0}if((c[b+20>>2]|0)<=(a|0)){d=0;return d|0}d=c[(c[b>>2]|0)+(a<<2)>>2]|0;return d|0}function In(){var a=0,b=0,d=0,e=0,f=0;a=c[526415]|0;b=c[a+16>>2]|0;if((b|0)<=0){d=-1;return d|0}e=c[a>>2]|0;a=b;while(1){b=a;a=a+-1|0;if(c[(c[e+(a<<2)>>2]|0)+20>>2]&1|0){d=a;f=5;break}if((b|0)<=1){d=-1;f=5;break}}if((f|0)==5)return d|0;retu
  7565. function $r(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;d=a+b|0;e=c[a+4>>2]|0;do if(!(e&1)){f=c[a>>2]|0;if(!(e&3))return;g=a+(0-f)|0;h=f+b|0;if((c[760469]|0)==(g|0)){i=d+4|0;j=c[i>>2]|0;if((j&3|0)!=3){k=g;l=h;break}c[760466]=h;c[i>>2]=j&-2;c[g+4>>2]=h|1;c[d>>2]=h;return}j=f>>>3;if(f>>>0<256){f=c[g+8>>2]|0;i=c[g+12>>2]|0;if((i|0)==(f|0)){c[760464]=c[760464]&~(1<<j);k=g;l=h;break}else{c[f+12>>2]=i;c[i+8>>2]=f;k=g;l=h;break}}f=c[g+24>>2]|0;i=c[g+12>>2]|0;do if((i|0)==(g|0)){j=g+16|0;m=j+4|0;n=c[m>>2]|0;if(!n){o=c[j>>2]|0;if(!o){p=0;break}else{q=o;r=j}}else{q=n;r=m}m=q;n=r;while(1){j=m+20|0;o=c[j>>2]|0;if(!o){s=m+16|0;t=c[s>>2]|0;if(!t)break;else{u=t;v=s}}else{u=o;v=j}m=u;n=v}c[n>>2]=0;p=m}else{j=c[g+8>>2]|0;c[j+12>>2]=i;c[i+8>>2]=j;p=i}while(0);if(f){i=c[g+28>>2]|0;j=3042160+(i<<2)|0;if((c[j>>2]|0)==(g|0)){c[j>>2]=p;if(!p){c[760465]=c[760465]&~(1<<i);k=g;l=h;break}}else{i=f+16|0;c[((c[i>>2]|0)==(g|0)?i:f+20|0)>>2]=p;if(!p){k=g;l=h;break}}c[p+24>>2]=f;i=g+16|0;j=c[i>>2]|0;if(j|0){c[p+16>>2]=j;c[j+24>>2]=p}j=c[i+4>>2]|0;if(j){c[p+20>>2]=j;c[j+24>>2]=p;k=g;l=h}else{k=g;l=h}}else{k=g;l=h}}else{k=a;l=b}while(0);b=d+4|0;a=c[b>>2]|0;if(!(a&2)){if((c[760470]|0)==(d|0)){p=(c[760467]|0)+l|0;c[760467]=p;c[760470]=k;c[k+4>>2]=p|1;if((k|0)!=(c[760469]|0))return;c[760469]=0;c[760466]=0;return}if((c[760469]|0)==(d|0)){p=(c[760466]|0)+l|0;c[760466]=p;c[760469]=k;c[k+4>>2]=p|1;c[k+p>>2]=p;return}p=(a&-8)+l|0;v=a>>>3;do if(a>>>0<256){u=c[d+8>>2]|0;r=c[d+12>>2]|0;if((r|0)==(u|0)){c[760464]=c[760464]&~(1<<v);break}else{c[u+12>>2]=r;c[r+8>>2]=u;break}}else{u=c[d+24>>2]|0;r=c[d+12>>2]|0;do if((r|0)==(d|0)){q=d+16|0;e=q+4|0;j=c[e>>2]|0;if(!j){i=c[q>>2]|0;if(!i){w=0;break}else{x=i;y=q}}else{x=j;y=e}e=x;j=y;while(1){q=e+20|0;i=c[q>>2]|0;if(!i){o=e+16|0;s=c[o>>2]|0;if(!s)break;else{z=s;A=o}}else{z=i;A=q}e=z;j=A}c[j>>2]=0;w=e}else{m=c[d+8>>2]|0;c[m+12>>2]=r;c[r+8>>2]=m;w=r}while(0);if(u|0){r=c[d+28>>2]|0;h=3042160+(r<<2)|0;if((c[h>>2]|0)==(d|0)){c[h>>2]=w;if(!w){c[760465]=c[760465]&~(1<<r);break}}else{r=u+16|0;c[((c[r>>2]|0)==(d|0)?r:u+20|0)>>2]=w;if(!w)break}c[w+24>>2]=u;r=d+16|0;h=c[r>>2]|0;if(h|0){c[w+16>>2]=h;c[h+24>>2]=w}h=c[r+4>>2]|0;if(h|0){c[w+20>>2]=h;c[h+24>>2]=w}}}while(0);c[k+4>>2]=p|1;c[k+p>>2]=p;if((k|0)==(c[760469]|0)){c[760466]=p;return}else B=p}else{c[b>>2]=a&-2;c[k+4>>2]=l|1;c[k+l>>2]=l;B=l}l=B>>>3;if(B>>>0<256){a=3041896+(l<<1<<2)|0;b=c[760464]|0;p=1<<l;if(!(b&p)){c[760464]=b|p;C=a;D=a+8|0}else{p=a+8|0;C=c[p>>2]|0;D=p}c[D>>2]=k;c[C+12>>2]=k;c[k+8>>2]=C;c[k+12>>2]=a;return}a=B>>>8;if(a)if(B>>>0>16777215)E=31;else{C=(a+1048320|0)>>>16&8;D=a<<C;a=(D+520192|0)>>>16&4;p=D<<a;D=(p+245760|0)>>>16&2;b=14-(a|C|D)+(p<<D>>>15)|0;E=B>>>(b+7|0)&1|b<<1}else E=0;b=3042160+(E<<2)|0;c[k+28>>2]=E;c[k+20>>2]=0;c[k+16>>2]=0;D=c[760465]|0;p=1<<E;if(!(D&p)){c[760465]=D|p;c[b>>2]=k;c[k+24>>2]=b;c[k+12>>2]=k;c[k+8>>2]=k;return}p=c[b>>2]|0;a:do if((c[p+4>>2]&-8|0)==(B|0))F=p;else{b=B<<((E|0)==31?0:25-(E>>>1)|0);D=p;while(1){G=D+16+(b>>>31<<2)|0;C=c[G>>2]|0;if(!C)break;if((c[C+4>>2]&-8|0)==(B|0)){F=C;break a}else{b=b<<1;D=C}}c[G>>2]=k;c[k+24>>2]=D;c[k+12>>2]=k;c[k+8>>2]=k;return}while(0);G=F+8|0;B=c[G>>2]|0;c[B+12>>2]=k;c[G>>2]=k;c[k+8>>2]=B;c[k+12>>2]=F;c[k+24>>2]=0;return}function as(a){a=a|0;var b=0,d=0;b=Fa;Fa=Fa+16|0;d=b;c[d>>2]=fs(c[a+60>>2]|0)|0;a=ds(ea(6,d|0)|0)|0;Fa=b;return a|0}function bs(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;f=Fa;Fa=Fa+32|0;g=f+16|0;h=f;c[h>>2]=d;i=h+4|0;j=b+48|0;k=c[j>>2]|0;c[i>>2]=e-((k|0)!=0&1);l=b+44|0;c[h+8>>2]=c[l>>2];c[h+12>>2]=k;c[g>>2]=c[b+60>>2];c[g+4>>2]=h;c[g+8>>2]=2;h=ds(Z(145,g|0)|0)|0;if((h|0)>=1){g=c[i>>2]|0;if(h>>>0>g>>>0){i=c[l>>2]|0;l=b+4|0;c[l>>2]=i;k=i;c[b+8>>2]=k+(h-g);if(!(c[j>>2]|0))m=e;else{c[l>>2]=k+1;a[d+(e+-1)>>0]=a[k>>0]|0;m=e}}else m=h}else{c[b>>2]=c[b>>2]|h&48^16;m=h}Fa=f;return m|0}function cs(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=Fa;Fa=Fa+32|0;f=e;g=e+20|0;c[f>>2]=c[a+60>>2];c[f+4>>2]=0;c[f+8>>2]=b;c[f+12>>2]=g;c[f+16>>2]=d;if((ds(Y(140,f|0)|0)|0)<0){c[g>>2]=-1;h=-1}el
  7566. // EMSCRIPTEN_END_FUNCS
  7567. var Ia=[iv,ei];var Ja=[jv,as,Za,_a,Ff,Jf,Jh,Gf,If,Kh,Gh,Lh,Mh,Nh,Oh,Mf,Ef,Lf,Ph,Qh,Rh,Sh,Th,Uh,Vh,Wh,Xh,Yh,Zh,_h,$h,ai,bi,$f,_f,ag,bg,di,fi,gi,hi,ii,ji,ki,li,mi,ni,oi,pi,qi,ri,si,ti,ui,vi,wi,xi,yi,zi,Ai,Bi,Ci,Di,Ei,Fi,Gi,Hi,Ii,Ji,Ki,Li,Mi,Ni,Oi,Pi,Qi,Ri,Si,Ti,Ui,Vi,Wi,Xi,Yi,Zi,_i,$i,aj,bj,cj,dj,ej,fj,gj,hj,ij,jj,kj,lj,mj,nj,oj,pj,qj,rj,sj,tj,uj,vj,wj,xj,yj,zj,Aj,Bj,Cj,Dj,Ej,Fj,Gj,Zf,Hj,Ij,Jj,Kj,zf,yf,Af,Bf,Cf,Df,Kf,Uf,Lj,Wf,dg,cg,Xf,Mj,Nj,Oj,Pj,Qj,Rj,Sj,Tj,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv,jv];var Ka=[kv,uf,_l,kv];var La=[lv,gs,cs,_s,pf,hs,bs,Xt];var Ma=[mv,sk];var Na=[nv,Tm];var Oa=[ov,bb,Ul,Vl,or,ov,ov,ov];var Pa=[pv,zm,hc,Od,Sd,vf,Qf,Rf];var Qa=[qv,$a,nr,qv];var Ra=[rv];return{___divdi3:Nu,___emscripten_environ_constructor:Eu,___errno_location:es,___muldi3:Pu,___udivdi3:Qu,__get_daylight:Gu,__get_environ:Iu,__get_timezone:Hu,__get_tzname:Fu,_bitshift64Lshr:Ru,_bitshift64Shl:Su,_codo_mixer_callback:Qp,_free:Xr,_i64Add:Ju,_i64Subtract:Ku,_llvm_bswap_i32:Tu,_main:Db,_malloc:Wr,_memcpy:Xu,_memset:Yu,_mix_0:Mq,_realloc:Zr,_saveSetjmp:Uu,_sbrk:Zu,_setThrew:Wu,_testSetjmp:Vu,dynCall_i:_u,dynCall_ii:$u,dynCall_iii:av,dynCall_iiii:bv,dynCall_iiiii:cv,dynCall_v:dv,dynCall_vi:ev,dynCall_vii:fv,dynCall_viii:gv,dynCall_viiiii:hv,establishStackSpace:Va,stackAlloc:Sa,stackRestore:Ua,stackSave:Ta}})
  7568. // EMSCRIPTEN_END_ASM
  7569. (asmGlobalArg, asmLibraryArg, buffer);
  7570. var ___divdi3 = Module["___divdi3"] = asm["___divdi3"];
  7571. var ___emscripten_environ_constructor = Module["___emscripten_environ_constructor"] = asm["___emscripten_environ_constructor"];
  7572. var ___errno_location = Module["___errno_location"] = asm["___errno_location"];
  7573. var ___muldi3 = Module["___muldi3"] = asm["___muldi3"];
  7574. var ___udivdi3 = Module["___udivdi3"] = asm["___udivdi3"];
  7575. var __get_daylight = Module["__get_daylight"] = asm["__get_daylight"];
  7576. var __get_environ = Module["__get_environ"] = asm["__get_environ"];
  7577. var __get_timezone = Module["__get_timezone"] = asm["__get_timezone"];
  7578. var __get_tzname = Module["__get_tzname"] = asm["__get_tzname"];
  7579. var _bitshift64Lshr = Module["_bitshift64Lshr"] = asm["_bitshift64Lshr"];
  7580. var _bitshift64Shl = Module["_bitshift64Shl"] = asm["_bitshift64Shl"];
  7581. var _codo_mixer_callback = Module["_codo_mixer_callback"] = asm["_codo_mixer_callback"];
  7582. var _free = Module["_free"] = asm["_free"];
  7583. var _i64Add = Module["_i64Add"] = asm["_i64Add"];
  7584. var _i64Subtract = Module["_i64Subtract"] = asm["_i64Subtract"];
  7585. var _llvm_bswap_i32 = Module["_llvm_bswap_i32"] = asm["_llvm_bswap_i32"];
  7586. var _main = Module["_main"] = asm["_main"];
  7587. var _malloc = Module["_malloc"] = asm["_malloc"];
  7588. var _memcpy = Module["_memcpy"] = asm["_memcpy"];
  7589. var _memset = Module["_memset"] = asm["_memset"];
  7590. var _mix_0 = Module["_mix_0"] = asm["_mix_0"];
  7591. var _realloc = Module["_realloc"] = asm["_realloc"];
  7592. var _saveSetjmp = Module["_saveSetjmp"] = asm["_saveSetjmp"];
  7593. var _sbrk = Module["_sbrk"] = asm["_sbrk"];
  7594. var _setThrew = Module["_setThrew"] = asm["_setThrew"];
  7595. var _testSetjmp = Module["_testSetjmp"] = asm["_testSetjmp"];
  7596. var establishStackSpace = Module["establishStackSpace"] = asm["establishStackSpace"];
  7597. var stackAlloc = Module["stackAlloc"] = asm["stackAlloc"];
  7598. var stackRestore = Module["stackRestore"] = asm["stackRestore"];
  7599. var stackSave = Module["stackSave"] = asm["stackSave"];
  7600. var dynCall_i = Module["dynCall_i"] = asm["dynCall_i"];
  7601. var dynCall_ii = Module["dynCall_ii"] = asm["dynCall_ii"];
  7602. var dynCall_iii = Module["dynCall_iii"] = asm["dynCall_iii"];
  7603. var dynCall_iiii = Module["dynCall_iiii"] = asm["dynCall_iiii"];
  7604. var dynCall_iiiii = Module["dynCall_iiiii"] = asm["dynCall_iiiii"];
  7605. var dynCall_v = Module["dynCall_v"] = asm["dynCall_v"];
  7606. var dynCall_vi = Module["dynCall_vi"] = asm["dynCall_vi"];
  7607. var dynCall_vii = Module["dynCall_vii"] = asm["dynCall_vii"];
  7608. var dynCall_viii = Module["dynCall_viii"] = asm["dynCall_viii"];
  7609. var dynCall_viiiii = Module["dynCall_viiiii"] = asm["dynCall_viiiii"];
  7610. Module["asm"] = asm;
  7611. Module["ccall"] = ccall;
  7612. Module["getValue"] = getValue;
  7613. Module["getMemory"] = getMemory;
  7614. Module["addRunDependency"] = addRunDependency;
  7615. Module["removeRunDependency"] = removeRunDependency;
  7616. Module["FS_createFolder"] = FS.createFolder;
  7617. Module["FS_createPath"] = FS.createPath;
  7618. Module["FS_createDataFile"] = FS.createDataFile;
  7619. Module["FS_createPreloadedFile"] = FS.createPreloadedFile;
  7620. Module["FS_createLazyFile"] = FS.createLazyFile;
  7621. Module["FS_createLink"] = FS.createLink;
  7622. Module["FS_createDevice"] = FS.createDevice;
  7623. Module["FS_unlink"] = FS.unlink;
  7624. if (memoryInitializer) {
  7625. if (!isDataURI(memoryInitializer)) {
  7626. memoryInitializer = locateFile(memoryInitializer);
  7627. }
  7628. if (ENVIRONMENT_IS_NODE || ENVIRONMENT_IS_SHELL) {
  7629. var data = Module["readBinary"](memoryInitializer);
  7630. HEAPU8.set(data, GLOBAL_BASE);
  7631. } else {
  7632. addRunDependency("memory initializer");
  7633. var applyMemoryInitializer = function(data) {
  7634. if (data.byteLength) data = new Uint8Array(data);
  7635. HEAPU8.set(data, GLOBAL_BASE);
  7636. if (Module["memoryInitializerRequest"]) delete Module["memoryInitializerRequest"].response;
  7637. removeRunDependency("memory initializer");
  7638. };
  7639. var doBrowserLoad = function() {
  7640. Module["readAsync"](memoryInitializer, applyMemoryInitializer, function() {
  7641. throw "could not load memory initializer " + memoryInitializer;
  7642. });
  7643. };
  7644. var memoryInitializerBytes = tryParseAsDataURI(memoryInitializer);
  7645. if (memoryInitializerBytes) {
  7646. applyMemoryInitializer(memoryInitializerBytes.buffer);
  7647. } else if (Module["memoryInitializerRequest"]) {
  7648. var useRequest = function() {
  7649. var request = Module["memoryInitializerRequest"];
  7650. var response = request.response;
  7651. if (request.status !== 200 && request.status !== 0) {
  7652. var data = tryParseAsDataURI(Module["memoryInitializerRequestURL"]);
  7653. if (data) {
  7654. response = data.buffer;
  7655. } else {
  7656. console.warn("a problem seems to have happened with Module.memoryInitializerRequest, status: " + request.status + ", retrying " + memoryInitializer);
  7657. doBrowserLoad();
  7658. return;
  7659. }
  7660. }
  7661. applyMemoryInitializer(response);
  7662. };
  7663. if (Module["memoryInitializerRequest"].response) {
  7664. setTimeout(useRequest, 0);
  7665. } else {
  7666. Module["memoryInitializerRequest"].addEventListener("load", useRequest);
  7667. }
  7668. } else {
  7669. doBrowserLoad();
  7670. }
  7671. }
  7672. }
  7673. function ExitStatus(status) {
  7674. this.name = "ExitStatus";
  7675. this.message = "Program terminated with exit(" + status + ")";
  7676. this.status = status;
  7677. }
  7678. ExitStatus.prototype = new Error();
  7679. ExitStatus.prototype.constructor = ExitStatus;
  7680. var calledMain = false;
  7681. dependenciesFulfilled = function runCaller() {
  7682. if (!Module["calledRun"]) run();
  7683. if (!Module["calledRun"]) dependenciesFulfilled = runCaller;
  7684. };
  7685. Module["callMain"] = function callMain(args) {
  7686. args = args || [];
  7687. ensureInitRuntime();
  7688. var argc = args.length + 1;
  7689. var argv = stackAlloc((argc + 1) * 4);
  7690. HEAP32[argv >> 2] = allocateUTF8OnStack(Module["thisProgram"]);
  7691. for (var i = 1; i < argc; i++) {
  7692. HEAP32[(argv >> 2) + i] = allocateUTF8OnStack(args[i - 1]);
  7693. }
  7694. HEAP32[(argv >> 2) + argc] = 0;
  7695. try {
  7696. var ret = Module["_main"](argc, argv, 0);
  7697. exit(ret, true);
  7698. } catch (e) {
  7699. if (e instanceof ExitStatus) {
  7700. return;
  7701. } else if (e == "SimulateInfiniteLoop") {
  7702. Module["noExitRuntime"] = true;
  7703. return;
  7704. } else {
  7705. var toLog = e;
  7706. if (e && typeof e === "object" && e.stack) {
  7707. toLog = [ e, e.stack ];
  7708. }
  7709. err("exception thrown: " + toLog);
  7710. Module["quit"](1, e);
  7711. }
  7712. } finally {
  7713. calledMain = true;
  7714. }
  7715. };
  7716. function run(args) {
  7717. args = args || Module["arguments"];
  7718. if (runDependencies > 0) {
  7719. return;
  7720. }
  7721. preRun();
  7722. if (runDependencies > 0) return;
  7723. if (Module["calledRun"]) return;
  7724. function doRun() {
  7725. if (Module["calledRun"]) return;
  7726. Module["calledRun"] = true;
  7727. if (ABORT) return;
  7728. ensureInitRuntime();
  7729. preMain();
  7730. if (Module["onRuntimeInitialized"]) Module["onRuntimeInitialized"]();
  7731. if (Module["_main"] && shouldRunNow) Module["callMain"](args);
  7732. postRun();
  7733. }
  7734. if (Module["setStatus"]) {
  7735. Module["setStatus"]("Running...");
  7736. setTimeout(function() {
  7737. setTimeout(function() {
  7738. Module["setStatus"]("");
  7739. }, 1);
  7740. doRun();
  7741. }, 1);
  7742. } else {
  7743. doRun();
  7744. }
  7745. }
  7746. Module["run"] = run;
  7747. function exit(status, implicit) {
  7748. if (implicit && Module["noExitRuntime"] && status === 0) {
  7749. return;
  7750. }
  7751. if (Module["noExitRuntime"]) {} else {
  7752. ABORT = true;
  7753. EXITSTATUS = status;
  7754. exitRuntime();
  7755. if (Module["onExit"]) Module["onExit"](status);
  7756. }
  7757. Module["quit"](status, new ExitStatus(status));
  7758. }
  7759. function abort(what) {
  7760. if (Module["onAbort"]) {
  7761. Module["onAbort"](what);
  7762. }
  7763. if (what !== undefined) {
  7764. out(what);
  7765. err(what);
  7766. what = JSON.stringify(what);
  7767. } else {
  7768. what = "";
  7769. }
  7770. ABORT = true;
  7771. EXITSTATUS = 1;
  7772. throw "abort(" + what + "). Build with -s ASSERTIONS=1 for more info.";
  7773. }
  7774. Module["abort"] = abort;
  7775. if (Module["preInit"]) {
  7776. if (typeof Module["preInit"] == "function") Module["preInit"] = [ Module["preInit"] ];
  7777. while (Module["preInit"].length > 0) {
  7778. Module["preInit"].pop()();
  7779. }
  7780. }
  7781. var shouldRunNow = true;
  7782. if (Module["noInitialRun"]) {
  7783. shouldRunNow = false;
  7784. }
  7785. Module["noExitRuntime"] = true;
  7786. run();